IOT:ラズベリーパイ パーティクルセンサー

どーもご無沙汰しております、Keita_Nakamori(´・ω・`)です。

先日、パーティクルセンサーが届きましたので、使ってみようと思います。

Particle Sensor Model PPD42NS

ヒーターで空気を温めて上昇気流を作り、光学式センサーを通過させることによって、粒子数をカウントするとのことです。なので、向きが大事です。

スペック

スペック的にPM2.5なんてのも取れそうです。

安定するまでに1分間必要と書いてあるので、スクリプトの中で”現在立ち上げ中です。”とか”カウントダウン”とかを入れてあげると良いと思います。

  • 検出可能な粒子サイズ: 1μm (minimum.)
  • 検出濃度範囲: 0~28,000 pcs/L (0~8,000pcs/0.01 CF=283mL)
  • 供給電圧: DC5V ±10% (CN1コネクタ:ピン1=GND , ピン3=+5V)
  • 作動温度範囲: 0~45°C
  • 作動湿度範囲: 相対湿度95% 以下 (結露なきこと)
  • 電力消費: 90mA
  • 周囲温度: -30~60°C
  • 安定するまでの立上時間:1分
  • 電源ONから安定に必要な時間:1分
  • 寸法: 59(W) × 45(H) × 22(D) [mm]
  • 出力方式:負論理、デジタル出力 ← ここは後で解説します。
  • Hi :  4.0V以上  Low :  0.7V以下

コネクタ

右から 黒 赤 黄 のケーブルがついた脱着可能なコネクタがついていました

しかし、これ、ブレッドボードに刺さるわけでも、ブレッドボード用のケーブルがささるわけでもないので、取っ払ってしまいました。

コネクタケーブルを引き抜くと、ちょうどラズパイのGPIOと同じサイズのピンが出てきますので黒 赤 黄の3本のメス型ケーブルに差し替えました。

説明書によると 右から

CN : S5B-EH(JST)
1 : COMMON(GND)
2 : OUTPUT(P2)
3 : INPUT(5VDC 90mA)
4 : OUTPUT(P1)
5 : INPUT(T1)・・・FOR THRESHOLD FOR [P2]

となっていますので、使用するのは、黒:GND 赤:5V 黄:出力P1 の3つになります。

ラズパイ側のGPIO

事前に必要な知識として、ラズパイGPIOピンの指定方法には2種類の表現があります。

1.BOARD番号で指定する場合

PythonではGPIO.setmode(GPIO.BOARD)と書きます。

ラズパイのボード(基盤)の配置順に番号が振られていて、たとえばpin=40とした場合はGPIO21のことを指します

2.BCM番号で指定する場合

こちらはGPIO.setmode(GPIO.BCM)と書きます。
GPIO21を指定したいときは、そのままpin=21と書きます。

こちらのほうがわかりやすいので私はこちらを使っています。どっちでもOKです。

出力データと処理の話

  • 出力はパルスで出力されます。
  • 低パルスの状態が30秒間に占める割合(LPO:Low Plulse Occupancy time)を粒子数として換算するようです。

「1μm以上の粒子が283mLの中に何個入っているか」と「低パルス占有率」の関係を測定したサンプルデータです。(メーカーHPより)

 

スクリプト

では、センサーから出力されたLowパルスの占有率を算出しましょう。

まずは、うまく行かなかった例です。

改良

動かないので、改良ついでにクラス化してみました。

なおかつ30秒ごとに出力される粒子濃度のデータをconsentration.txtに随時書き出すようにしました。

 

出力:consentration.txt

中身は下記のような感じです。

データ処理

データを処理するためにpandasで読み込んで、整えましょう。

文字パターン抽出 ” .str.extract() ” で文字列を 年月日 時間 濃度 に切り分けます。

すると、こんな感じで切れました

ymd hms ms consentration
0 2019-05-30 19:16:40.318976 0.07213182909293626
1 2019-05-30 19:17:10.434010 0.0951778309901365
2 2019-05-30 19:17:40.536987 0.07830632987722516
3 2019-05-30 19:18:10.660109 0.05319190541036891
4 2019-05-30 19:18:40.774304 0.030014825256954498
5 2019-05-30 19:19:10.876265 0.01660005851583172
6 2019-05-30 19:19:40.980323 0.019892370764988204

可視化

ざっくりとグラフを書いてみます。

なんじゃこりゃ(*´﹃`*)

でもとりあえず、なんかおかしいことは分かりました。なんで階段状なんだろう。

 

もっと研究が必要ですね。

 

IOT:ラズベリーパイでサーボドライバPCA9685を使ってみる

Keita_Nakamoriです。

前回はサーボモータSG92Rをラズパイに直結して動かしてみました。

今回はサーボモータを16個同時に動かすことができるサーボドライバPCA9685を使って、SG90とSG92Rを同時に動かしてみようと思います。

 

動画

基本スペック

  • I2C周波数範囲:24-1526Hz
  • 動作電圧:2.3-5.5V
  • 入出力の許容電圧:5.5V
  • 最大62個のPCA9685が接続できます¥。よって992個のサーボモータを同時に動かせます。

余談:I2Cはアイ スクウエア シーと呼ぶそうです。

ピン

左端のピン

は、上から

  • GND:ラズパイGIPIOのグランドに接続する
  • DE:??? どこにも繋げない
  • SCL:シリアル通信のクロック ラズパイGIPIOのSCL1に繋ぐ
  • SDA:シリアル通信のデータ   ラズパイGPIOのSDA1に繋ぐ
  • VCC:プラス電圧 ラズパイGPIOの+5Vに繋ぐ
  • V+:??? どこにも繋げない

下端のピン

はサーボモータを接続します、左から0~15番が振られてあり合計16個のサーボモータと接続できます。

上から、

  • PWM:サーボモータのPWM=オレンジ
  • V+:サーボモータの赤
  • GND:サーボモータの茶

上端のコネクタ

は、電源供給です。

  • 左はV+:ラズパイの5Vに繋ぎます
  • 右はGND:ラズパイのGNDに繋ぎます
  • 今回はラズパイのGPIOに繋ぎましたが、16個サーボモータを繋げるときは、別途電源を取らなくてはならないと思います。

制御の話

  • PCA9685はPWMで動きます。
  • パルス幅によってサーボモータの回転角が0~180degが決定されます。
    • 例えば 0.5ms幅のとき0deg、1.5ms幅のとき90deg、2.5ms幅のとき180degになったりします。(周波数で変更できます。周波数が高いほうが高速で制御できます。)
  • アナログサーボの周波数範囲は30~60Hzのものがほとんどです。
  • 例えば、周波数f=60Hzのとき周期はT=1/f=17ms です。(早い方がいいので60Hzで考えましょう。)
  • 周期Tの分解能は12bitなので、周期Tを2^12=4096分割できます。1分割分を1ステップと呼ぶことにしましょう。
  • 周期17msを4096分割できるので、1ステップあたり0.004150390625ms になります。
  • パルス幅を0.5msにしたければ、ステップは0.5/(17/4096)=120.47058823529412ステップになります。
  • サーボモータ角度をodegにしたいときは0.5msですから、120ステップをONして、残りの(4096-120)をOFFにすれば良いのです。
サーボ回転角度[deg] ONの時間 [ms]  ステップ数
0 0.5 120
60 1.0 240
90 1.5 361
120 2.0 481
180 2.5 602
  • サーボ回転角度を0degから180degにするためには、(602-120)=482ステップになります。
  • 1degあたりのステップ数は 482ステップ/180deg = 2.7 (step/deg)
  • なので任意のサーボ回転角度θでステップ数Nsを表現すると、Ns=120+2.7θ ということになります。

モジュール Adafruit_PCA9685

pip3 install Adafruit_PCA9685 したところ拒否されました。

pipのバージョンを上げて再チャレンジします。

pip3 install –upgrade pip3 と書いたところ pip3でなくてpipで書けみたいなことを言われました。

pip install –upgrade pip と書いたところ許可がないといっております。

なので、スーパーDOしてみます。

sudo pip install –upgrade pip これでOKでした

Successfully uninstalled pip-19.0.3
Successfully installed pip-19.1.1

そして再度チャレンジ

pip3 install Adafruit_PCA9685  [Errno 13] 許可がありません

なるほど読めました。やはり須藤ですね。

sudo pip3 install Adafruit_PCA9685

Successfully installed Adafruit-GPIO-1.0.3 Adafruit-PCA9685-1.0.1 adafruit-pureio-0.2.3

これでやっとAdafruit_PCA9685モジュールがインストールできました。

pip freezeすると

Adafruit-GPIO==1.0.3
Adafruit-PCA9685==1.0.1
Adafruit-PureIO==0.2.3

が入っていました。注意点として、importするときはAdafruitの後ろにはハイフンではなくアンダースコアになります。

スクリプト

余談

ラズパイの操作はWindowsマシンからrealVNC Viewerでリモートしているのですが、ラズパイ側のidleに書いたスクリプトをcnt+c しても Windows側にcnt+v できません。

コツがありまして、ラズパイ側のText Editorに一旦貼り付けた後に、それをcnt+cしてから、Windows側にcnt+v すると、しっかりと貼り付けられます。

どうぞお試しあれ。

IOT:ラズベリーパイでサーボモータSG92Rを動かす

どーもこんにちはKeita_Nakamori(´・ω・`)です。

今日は、GPIOでサーボモータを動かして見ようと思います。

デバイス

サーボモータ:SG92R

配線

  1. サーボの茶をGND(グランド)
  2. サーボの赤を電源+5V
  3. サーボのオレンジは制御パルス用なので、今回はGPIO18に接続しました。

ラズパイの電源は5Vバッテリー2.1Aです。

※サーボの挙動がガクガクしています。電源のせいかも・・・

テストスクリプト

 

IOT:ラズベリーパイにVNC接続してOpenCVで顔認識する

どーもこんにちは(´・ω・`)です。

 

前回、ラズベリーパイにVNC接続してOpenCVでカメラの起動に成功しました。

今回は更に、そのOpenCVで顔認識も追加していこうと思います。

bcm2835-v4l2 の自動化

前回ハマりました、bcm2835-v4l2 についてですが、やはりシャットダウンすると、無効になってしまい、OpenCVが機能しませんでした。

今回は、まず起動したときに自動的にbcm2835-v4l2 が実行される方法からやっていきます。

/etc/modules を開くと

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.

i2c-dev

と書いてありますが、これは”ブートするときにロードするためのカーネルモジュール群” を書いておく場所になっています。Windowsでいうとスタートアップです。

ここにbcm2835-v4l2をいれればOKなのですが、このファイルは書き込み禁止なので、予め解除しておきます。

ファイル書き込み禁止を解除する

パーミッションを確認します。

pi@pi:/etc $ ls -l modules

-rw-r–r– 1 root root 203 3月 23 20:29 modules

スーパーユーザーsudoとしてチェンジモードchmodして、パーミッションを777にします。

pi@pi:/etc $ sudo chmod 777 modules

で、変更が成功したか確認すると
pi@pi:/etc $ ls -l modules

-rwxrwxrwx 1 root root 203 3月 23 20:29 modules

フルアクセスに変更されました。

その上で、チェンジディレクトリcd /etc/でvimでmodulesを開きます。

pi@pi:/etc $ vim modules

i2c-devの下にbcm2835-v4l2を追加して保存しましょう。

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.

i2c-dev
bcm2835-v4l2

キャットで確認すれば

pi@pi:/etc $ cat modules

しっかりとbcm2835-v4l2が追加されているのがわかると思います。

本題:Opencvで顔認識をやってみる

基本的には、前回のコードに学習済みハールカスケードと顔認識した顔に四角い図形でマーキングをするスクリプトを追加するだけです。

まずhaarcascade_frontalface_alt2.xmlは/usr/local/share/OpenCV/haarcascades/ の中に入っているので、作業ディレクトリであるhome/pi/の中へコピーを作っておきます。

以上、簡単ですね。

IOT:ラズベリーパイにVNC接続してOpenCVで cv2.VideoCapture(0)してみる

どーもこんにちはKeita_Nakamori(´・ω・`)です。

今日は、WindowsマシンからラズベリーパイにVNC接続してOpenCVで cv2.VideoCapture(0)に挑戦します。

まずはrealVNC viewerを起動してIPアドレスを打ってVNC接続します。

1回つなげたことのあるIPアドレスは保存され、アイコンみたいに表示されるので2回目からはアイコンをクリックするだけの簡単操作でした。

落とし穴

早速ハマりました。cap=cv2.VideoCapture(0)してもcapにはなにもデータが入ってきません。ふぁ~(*´Д`)

ret, img = cap.read() しても、当然imgはNoneです。

なぜだ!

思い出しました

そう、かつてハマりまくった、あのときを・・・

ラズパイ専用カメラをしようしているので、一般的なwebカメラとして認識できるように下記のコードを実行することが必要でした。

注意点としては 最後の部分は 「ぶい よん える に」 です。

「ぶい よん いち に」 だと思って奮闘してしまいました。

sudo modprobe bcm2835-v4l2

ということで、shellでsudo modprobe bcm2835-v4l2と打ってカメラを認識させます。

テストコードを実行すると・・・

はい、隣の部屋のソファーが写っています。

弱点

ラズパイはwifi接続、Windowsマシンは有線ですが、VNC解像度をミディアムにしても、カメラのキャプチャー映像はガックガク!!です。

低解像度だと色がキッタナイ!

どうにもなりません。

念の為、試運転のコードを貼っておきます。

 

 

IOT:ラズベリーパイにwindowsからVNC接続

今日はSSH接続に引き続きVNC接続をやってみます。

IT予備知識

VNC

-Virtual Network Computing

仮想ネットワークコンピューティング。

サーバ側(ラズパイ)の画面をにピクセル化してクライアント(windowsマシン)へ送信しクライアント側の画面から遠隔操作することができます。

通信プロトコルはRFBプロトコルという、正にVNCのための非常に軽いプロトコルを使います。(RFB = Remote Frame Buffer)

VNCソフトウェアのインストール

RealVNCのVNC Viewerをダウンロードします。

 

起動したら、SSH接続に成功したラズパイのIPアドレスを入力します。

SSH接続と同様にIDはpi、そしてパスワードを入力します。

これだけで、ラズパイのGUIをリモートコントロールできます。

ラズパイの画面解像度の設定

しかし、ラズパイ画面の解像度が悪いので、設定します。

ラズベリーマークのアプリケーション>設定>Rasberry Piの設定>1920x1080

windows側の画面設定1920×1080に合わせました。とりあえずこの設定でやってみましょう

システムタブ>解像度>

右下のOKを押すと再起動が促されますの再起動します。

すると、一旦VNC接続が切れますが、1分位待つと再起動完了の頃合いで再び自動で接続されます。

画面上にマウスカーソルを持っていくと、なにやらVNCの画面設定がポップダウンします。歯車マークを押すとプロパティ設定が開くのでさ、General>Picture quality:をautomaticからHighに変更しました。

ScalingもAutomatic(Prewserve aspect ratio=ON)にしましたが、人によっては、若干見切れているとか調整の余地がありそうです。

IOT:ラズベリーパイ IPアドレスの固定方法

前回のラズパイSSH接続に引き続き、IPアドレスの固定をやってみます。

まずはwindows端末からTeraTermでラズパイにSSH接続してShellに入りましょう。

ここで、IPアドレスの固定に関する設定ファイル 「/etc/dhcpcd.conf」 を開いてみます。vimエディタで下記のように開きます。

vim /etc/dhcpcd.conf

これの最後に

を付け加えます。iで挿入モードにして :wq 書いて終わって・・・

sudo rebootします。

ラズパイが再起動しますが、その様子を伺うことはできません。1分くらい待ってrebootが完了した頃合を見計らって、TeraTermで変更前のIPアドレスを打ってみますと・・・

繋がりませんよね。なので今回設定したstatic ip_address=192.168.10.111/24 にしたがってIPアドレスを192.168.10.111に変更したところ、

つながりました。shellが立ち上がります。

ここでifconfigをしてみてください。

しっかりと

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.111 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::570e:b515:f27c:cf1a prefixlen 64 scopeid 0x20<link>
inet6 240f:7e:ab52:1:ee7e:c132:a6b2:b0d9 prefixlen 64 scopeid 0x0<global>

というように、。192.168.10.108  から 192.168.10.111へIPアドレスが変更されています。

以上です。

 

IOT:ラズベリーパイで日本語入力

日本語入力ができるようになるまで

ラズパイは初期状態で日本語入力ができません。

ブラウザも全部アルファベットになってしまいます。

日本語フォントをインストール

ipafontとipaexfontがよさそうです。

sudo apt-get install fonts-ipafont fonts-ipaexfont

日本語IME:Mozcをインストール

まずはアップデート
sudo apt-get update

Google日本語入力のMozcをインストール

読み方は、もずく・・・でいいんでしょうか?

sudo apt-get install fcitx-mozc
インストール後はラズパイを再起動しておきましょう。

日本語切り替えの設定

メニュー>設定>Fcitx設定

入力メソッドの設定>全体の設定

ホットキー>入力メソッドのオンオフ>半角/全角を押すと hankakuzenkakuと入力されるので これでOKします。

IOT:ラズベリーパイ SSHによるリモート接続

SSHによるリモート接続

ラズパイを買ったときに一度試してみたのですが、スキルが低すぎて全くできませんでした。

今回は、3ヶ月間色々学んできたので、ある程度直観力が付いたと思いリベンジ致します。

TeraTermをwindows側にインストールします。

管理者権限でログインしておきましょう。でないとエラー5にはじかれて無理でした。

最新のTera Term 4.102を入れました。

ifconfigでIPアドレスを調べる

ラズベリーパイのMACアドレスと、サブネットマスクを調べます。

有線の場合はeth0、無線の場合はwlan0を見ます。今回は無線でやります。

mtu 1500
inet 192.168.xxx.xxx (xxxはお使いのラズパイ、通信環境によって違うでしょう。)
netmast 255.255.255.0
と書いてあります。

TeraTermからラズパイにSSH接続

  1. windows側でTeraTermを起動させてください。
  2. TCP\IP ホスト 192.168.xxx.xxx と入力します。
  3. ヒストリにチェック(意味は不明)
  4. TCPポートは22固定です。いじるとつながりません。
  5. サービス SSH バージョンはSSH2
  6. OKします
  7. 次の画面でユーザー名にpiと入力します。これはラズパイのユーザー名ではありません。
  8. パスフレーズはラズパイで設定したパスワードになります。
  9. パスワードをメモリ上に記録するをチェック
  10. プレインパスワードを使うをチェック
  11. OKします。→接続できたでしょうか。

課題

現状まだIPアドレスを固定していないため、起動するたびにどんなIPアドレスになるのか予想が付きません。次はIPアドレスの固定をやってみましょう。

また、つながったのはいいのですが、Linuxのshellだけでは厳しいものがあります。

VNCで接続するとLinuxのGUIが丸ごと操作できるようになるので、次回の次回あたりでやってみましょう。

IOT:Python socketモジュールで通信してみる

どーも こんちには Keita_Nakamori (´・ω・`) です

今日は、socketモジュールを使ってみます。

前回、少しsocketモジュールについて基本的な操作をやりましたが、実際に運用するとなると不備が多いので、そこを修正していきます。

IT用語 (予備知識)

ポート

ネットワーク内の端末間でデータをやり取りする港(port)です。

ポート番号

ポートの番号です。TPCでデータをやり取りするとき、データは1プロセスとか1スレッドというプログラムの塊を対象とします。そのプロセスにはポート番号が割り当てられそこを通ってデータをやり取りします。

IPアドレスが住所なら、ポート番号はマンションの部屋番号みたいなものです。

よく使う番号をピックアップしてみます。

  • TCP 20 : FTP (データ)
  • TCP 22 : SSH
  • TCP 25 : SMTP
  • TCP 80 : HTTP
  • TCP 443 : HTTPS

ポート番号の種類

ポート番号は0から65535まで存在します。その中でも3つの種類に分けれれます。

ウェルノウンポート番号 0~1023

よく知られているポート番号という名前の通り、TPC/IP通信において主要なサービスがすでに使用しているポート番号です。ユーザーがここをいじってしまうと不具合が生じるので触らないでおきましょう。

レジスタードポート番号 1024~49151

特定のアプリケーションなどが使用することになっている番号です。IANAという団体が管理しているので、使うときは申請しなくてはいけません。

その他のポート番号 49152~65535

ユーザが自由に使って良いポート番号です。しかし、やたらと開放してはいけません。必要なものだけ開けましょう。

スクリプト

続きはあとで書きます。