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!
つづく。
LIRCを用いた赤外線送受信をRaspberry Piで行う
Raspberry Piにおける、LIRCを用いた赤外線の受信および解析と、送信について。
OSとkernelのバージョンに応じて、動作させるまでの方法が異なります。
以下の書籍と、そのサポートページに完全な方法が記載されています。
↓サポートページ
ちなみに、今回私は「Raspbian Stretch + kernel 4.19」で実際に赤外線の受信および送信ができました!
(書籍の補足情報を見つけるまではあれこれやってみるもののうまくいかず、かなり苦労しました。。)
ネットでも検索をかけると赤外線リモコンの記事がいくつも出てきますが、ほとんどは(このブログのような)メモや備忘録にとどまり、自分の環境とは異なることがしばしばあります。
開発元のマニュアルを読み込むのが正攻法なのかもしれませんが、英語だしなかなかにハードルが高い……。
こうして書籍などでバージョンごとの導入手順がまとめられていると、初学者にとってはとてもありがたいですね。
次はエアコンの操作を……と思いきや、kernel 4.19ではエアコンのような長い信号を受け付けないみたい?
バージョンを下げてやり直すことになりそう。
つづく。