Raspberry Piで赤外線の送受信をする
以前の方法(以下記事)では、赤外線の送受信が完全ではなかったので、作り直しました。
今回作りたい赤外線送信モジュールの条件は以下。
- テレビ以外の電子機器も操作できること
- 数メートル離れた位置から操作できること
- 多少角度が違っても赤外線が届くこと
- LEDを複数使わないこと
赤外線LEDはロボットの尻尾に搭載する予定なので、角度を変えて複数個LEDを設置する、という方法はとりたくありません。 そのため、基本方針として電流とソフト側の調整でなんとかしたいと思っていました。
ソフトに関しては、以下の記事をもとにpigpioを導入し使用します。
赤外線送信部の回路についてだけ、いくつか変更をしています。
上記記事でFETを使用しているところを、メジャーなトランジスタ2SC1815GRで代用。抵抗も少し大きくしています。
前回のLIRCを用いたテストでは、50mA程度の電流でも十分に機器の操作ができたことから、今回もLIRCのときと同じ電流値50mAで試したところうまくいかず。
機器が全く反応しないため、てっきり設定等にミスがあったかと思い色々試すもうまくいかず。。
そのまま数ヶ月放置していたのですが、結局、電流を大きくしたら無事動作が確認できました。
赤外線LEDに流す電流量について
赤外線LEDに流す電流の大きさですが、お高いLEDだと絶対最大定格が300mAのものがあります。電流が大きければ大きいほど赤外線は遠くまで飛ぶはずですが、私の場合は電流は300mAに収まる程度で十分と予想。そもそも前回は50mAで届いたので、200mAもあれば十分かなぁと(部屋も広くないし)。
上記記事の引用先を読んでみたところ、より大きな電流を流そうとする場合、2SC1815ではhFEの降下があるためFETを使用した、ということみたいです。なるほど。
抵抗計算
抵抗器は47Ωと4.7kΩの2種類を使用します。
抵抗器にも定格電力があるので、それをオーバーしないように計算。
抵抗器の定格電力は、次の三種類があるみたいです。
- 1/4W
- 1/2W
- 1W
今回は低い抵抗で大きな電流を流したいため、1Wの抵抗器を追加で購入しました。 抵抗器に流れる電流と電圧は、以下のようになります。
47Ω抵抗器に流れる電流
I = V / R
I = 5[V] / 47[Ω]
I ≒ 0.106[A] = 106[mA]
電力は電流と電圧の積だから、0.106*5でおよそ0.53Wになるはず。
定格電力は値の半分以下で使用するものらしいので、1Wの半分と考えると若干オーバーしていますが、赤外線LEDに電気を流す時間はごく短時間なので問題ないだろうという考え。
LEDに47Ωの抵抗器を並列に二つ繋いで、合計最大約212mAの電流が流れるようにします。
実際に流れる電流は、トランジスタ2SC1815のベースに流す電流によって決まります。
4.7kΩ抵抗器に流れる電流
I = V / R
I = 5[V] / 4700[Ω]
I ≒ 0.00106[A] = 1.06[mA]
およそ1mA。ラズパイのGPIOに流す電流は8mAまでにすべきですが、この電流量なら問題ありません。
今回用意したトランジスタ2SC1815GRの増幅率(hFE)はデータシートによると200~400なので、コレクタからの電流はおおよそ212~424mA程度までエミッタに流れることになります。つまりエミッタおよびLEDには、先ほど計算したコレクタに流れる電流の最大(約212mA)+ベース電流(約1mA)=約213mAが流れる。はず。
赤外線送信回路
赤外線送信部の回路は以下のような形に(実際は向きや配置を少し変えているけど、わかりにくかったので調整)。
トランジスタの各足は、画像の左から順にエミッタ、コレクタ、ベースになっています。
ラズパイからは5Vを赤外線LEDの陽極に、GPIO17をトランジスタのベースに繋いでいます。
実際はこれに赤外線受信モジュールが加わりますが、回路図作成ソフトに該当する部品が見つからなかったので省略。
結果
pigpioのインストール、上記記事にある設定およびIR Record and Playbackのダウンロード後、以下のコマンドで学習&送信。
学習
例)GPIO18を用いて照明ONの赤外線コードを学習、codesファイルに記録
$ python3 irrp.py -r -g18 -f codes light:on --no-confirm --post 130
送信
例)GPIO17を用いて、学習した照明ONの赤外線コードを送信
$ python3 irrp.py -p -g17 -f codes light:on
動作は完璧!
大体の角度だけあわせてあげれば、3mほどの距離から問題なく機器の操作ができるようになりました。
失敗もしつつ、数ヶ月越しに完成したからとても嬉しい。
つづく。
DHT22を使用して気温と湿度を取得する
Raspberry Piで気温と湿度を取得してみたのでメモ。
取得した温湿度データは、ロボットの対話・家電操作機能に利用する予定です。気温が一定の範囲を超えたり湿度が一定値を下回ったりしたときに、家電を付けてくれたり、注意を促してくれるようにしたい。
実用面で言えば、細かい気温・湿度の取得はあまり必要なく、だいたいの数値さえわかれば発話等の判定に使うことができます。そのためDHT11でもよかったのですが、湿度0.1%単位で計測できる自宅の温湿度計に負けるのが嫌だったので、細かい数値で計測可能なDHT22の方を選択。機能はとりあえず盛っておこうという安直な考え。
DHT22の購入はAliexpressで、値段は国内の1/3くらいで買えました。国内のショップで買うならDHT11にしてたかも。
プログラム等は以下を参考にさせていただきました。とっても助かりました。ありがとうございます!
データシート見てもそれをどうプログラムに反映すればよいかわからなかったので、これ自分じゃできなかったろうなぁ……。勉強していかなくては。
上記記事の通りにdht11関連のモジュールをダンロードしてリネームし、一部書き換えてからサンプルプログラムを作成。
配線も上記の記事の通り。3本しかないので簡単。
電源は3.3Vで問題なく動作しました。
実行。
10秒ごとに数値が取得できればOK。
市販の温湿度計と数値もほぼ同じだったので、ばっちりです。
Raspberry pi のセキュリティ関連設定
前回のユーザー名変更に引き続き、セキュリティ関連のやったことの覚え書き。
sudoコマンド実行時のパスワード必須化について
ユーザー名を変更すると、sudoコマンド実行時にパスワードを求められるようになる。
/etc/sudoers.d/010_pi-nopasswd
にユーザーpiはパスワード不要、という記述がされているため、必要に応じて削除したり変更したりする。
$ sudo nano /etc/sudoers.d/010_pi-nopasswd
SSH接続のポート番号変更
SSH接続のポート番号を広く知られる初期設定の22番から変更することで、悪意のあるロボットなどから攻撃を受けにくくする。
ポート番号は0~65535まであり、以下のように三つにわけられる。
ポート番号 | 名称 | 説明 |
---|---|---|
0~1023 | ウェルノウンポート | 何に使用するか決められているポート。使用できないものが多い。 |
1024~49512 | 登録ポート | 色々なソフトウェアによって割り当てられるポート。使用できるものもあるが、重複する可能性がある。 |
49513~65535 | ダイナミック/プライベートポート | 自由に使えるポート。 |
設定ファイルの記述「Port 22」のコメントアウトを外し、「Port 56789」など、49513~65535の任意のポート番号を指定。
$ sudo nano /etc/ssh/sshd_config
sshを再起動して、問題なく起動することを確認。
$ sudo /etc/init.d/ssh restart
ログアウトしてから、
指定外のポート番号では接続できないことをチェック。
ポート番号を指定して接続できることを確認。
$ exit # 接続できない $ ssh usr@198.xxx.xx.xx # 接続できない $ ssh usr@198.xxx.xx.xx -p 22 # 接続できる $ ssh usr@198.xxx.xx.xx -p 56789
公開鍵認証の作成と設定
RSA鍵のペアを作成。
$ ssh-keygen -t rsa
鍵ファイルの保存場所を聞かれるので、/Users/tool-lab/.ssh/id_rsa_raspi に指定。(そのままにする場合は入力せずにEnterでok) パスフレーズも任意の値を設定。設定しない場合はそのままEnter。
ポート番号、送信ファイル、ユーザー名、IPアドレスを指定してscpコマンドで公開鍵ファイルを転送する。
$ scp -P 56789 .ssh/id_rsa_raspi.pub user@192.168.xx.xx
ラズパイにログイン後、.sshディレクトリを作成し、その中のauthorized_keysファイルに公開鍵情報を書き出し、パーミッションを変更して、ホームディレクトリの公開鍵ファイルは削除する。
$ mkdir .ssh $ cat id_rsa_raspi.pub >> .ssh/authorized_keys $ chmod 700 .ssh $ chmod 600 .ssh/authorized_keys $ rm id_rsa_raspi.pub
ポート番号を指定したときの設定ファイルをまた開いて、
$ sudo nano /etc/ssh/sshd_config
以下の記述を一番下に追加。
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys PasswordAuthentication no
保存して、sshサーバーを再起動。
$ sudo /etc/init.d/ssh restart
ログアウト。
$ exit
PCのssh設定を変更。
$ nano .ssh/config
以下の記述を追加して保存。IPアドレス、ユーザー名、ポート番号はそれぞれ設定した値を入れる。
Host raspi HostName IPアドレス User ユーザー名 Port ポート番号 IdentityFile ~/.ssh/id_rsa_raspi
以下のコマンドでログインできるようになれば成功!
$ ssh raspi
つづく。
Raspberry Piのユーザー名を変更する
Raspberry Piではユーザー名とパスワードは初期設定値が公開されているため、そのまま使うのはセキュリティ上のリスクになります。
正直どの程度危険性があるのか私はまだ理解できていないのですが、、端末にアクセスした人が誰でも操作できる状態、というのが良くないことはわかります。
今回OSを再インストールしたため、ユーザー名を変更しておきます。
(今まではパスワードは変えていたものの、ユーザー名は「pi」のまま使用していました。)
ユーザー名変更の手順は、以下の通り。
- Raspberry PiをCLIで起動するようにしておく
- 仮ユーザーを追加する
- 仮ユーザーでログインし、既存のユーザー名(pi)を変更する
- 仮ユーザーを削除する
- (任意)Raspberry PiをGUIで起動するように戻す
なお、事前にOSのインストールと初期設定、IPアドレスの固定を済ませ、SSHで別PCから接続して作業しています。
Raspberry PiをCLIで起動するようにしておく
まずは事前準備として、ラズパイをCLIで起動するように設定変更します。
SSHで別ユーザーでログインしても、同時にGUIではユーザー「pi」でログインされていて、「pi」を変更できない、という現象が発生する模様。若干ややこしいですね。
あらかじめ起動時のモードをCLIにしておくことで、ユーザー「pi」で自動ログインしないようにし、ユーザー名を変更できるようにします。
$ sudo raspi-config
設定画面が出てくるので、「3. Boot Options」→「B1 Desktop/CLI」→「B1 Console」と選択。終了して再起動。
仮ユーザーを追加する
先述の通りログイン中のユーザー名には変更を加えられないようなので、一時的に別のユーザーを追加し、そちらにログインした上で初期ユーザーを変更します。
# 仮ユーザー(tmp)を追加 $ sudo useradd -M tmp # 仮ユーザー(tmp)をsudoグループに追加 $ sudo gpasswd -a tmp sudo $ sudo passwd tmp 新しいパスワード:{新しいパスワードを入力} 新しいパスワードを再入力してください:{新しいパスワードを入力}
これで仮ユーザーの追加ができたので、一旦ログアウトします。
$ exit
仮ユーザー(tmp)でログインし、既存ユーザー(pi)を変更する
作成した仮ユーザー(tmp)でログインします。
$ ssh tmp@192.xxx.xx.xx
ユーザー(pi)の名前を、新しく設定するユーザー名(任意、ここではnewuser)に変更。
$ sudo usermod -l newuser pi
ホームディレクトリとグループを修正。
$ sudo usermod -d /home/newuser -m newuser $ sudo groupmod -n newuser pi
仮ユーザーを削除する
$ sudo userdel tmp
ユーザー名の変更関連は以上。
(任意)Raspberry PiをGUIで起動するように戻す
VNCとかでGUIで動かせると便利なこともあるので、使うようであればGUI起動に戻しておきます。
$ sudo raspi-config
先ほどと同じ「3. Boot Options」→「B1 Desktop/CLI」から。
VNC、最初はすごいと思ったけどぶっちゃけあんまり使わない、、
つづく。
Raspberry PiのKernelのバージョンを戻す
前回からLIRCを用いた赤外線の送受信について試行錯誤しています。
赤外線の送受信においてはより簡便なpigpioを用いた方法もネット上には色々上がっているものの、そちらを試したところ学習も発光もしていてエラーも吐かないのだけど機器の制御ができない、という困った状況に陥り、やはりLIRCを使おうと思い直した次第。
しかし、どうやらラズパイのカーネルのバージョンが4.19の場合、LIRCではエアコンのような長い信号は制御ができないらしいので、カーネルのバージョンを4.14以前の古いものに戻すことにします。
戻したいカーネルのハッシュ値をgithubのページ(https://github.com/Hexxeh/rpi-firmware/commits/master)から取得し、以下のコマンドを実行。
$ sudo rpi-update {ハッシュ値}
e.g.) kernel 4.14.98 に戻す場合
$ sudo rpi-update a08ece3d48c3c40bf1b501772af9933249c11c5b
それなりに時間がかかるので、待ちます。
私は待っている間に、この備忘録を書いたりロボットの可動軸数を考えたりしてます。
完了したら、再起動して確認。
$ sudo reboot $ uname -a
OK!
つづく。