ラズパイで1-Wireを使ってみる
1-Wire通信とは?
1-Wireは、Maxim Integrated社が商標登録している、1本の信号線と接地線(GND)だけで実現する低速の通信方法らしい。
1-Wire通信の特徴
上記に書いた信号線の少なさが特徴で、信号線(データ信号)は、電力も同時に供給できるようになっている。
I2Cが電源、GND、クロック信号線(SCL)、データ信号線(SDA)に対して、1-Wireはこれを2本の信号線で実現できるので、小型化できる。
Wikipediaだとよくわからない。
丸文さんのページを参考に、理解をすすめていく。
I2Cなどと同じ1つのマスターに複数のスレーブが接続されるマルチドロップ構成が可能になっている。
1-Wire デバイスID
スレーブには、64ビットのデバイスIDが用意されている。
マスターは以下の64ビットのデバイスIDを読むことで、スレーブデバイスの識別が可能となっている。
・8ビットのファミリーコード
・48ビットのシリアル番号
・8ビットのCRCチェックサム
1- Wire 通信速度
一般的には、以下2つのモードをサポートしている。
・Standard-Mode :16kbps
・Overdrive-Mode :120kbps
I2Cと比較すると想像以上に高速で動作する。
最大500mの通信が可能らしいので、I2Cよりもコスパがいい。
スレーブがEEPROMになると信号線が増えるようなので、
EEPROMを使うのであればI2Cバスになるのかもしれない。
あるいは、電源をデータ信号と一緒に送るというのが、コスパが悪いのかもしれない。IDがあるので、ライセンス料が掛かる可能性もありそう。
1-Wire 通信シーケンス
Wikipediaには、以下のように書かれている。
① リセットパルスを送信
② コマンド(8ビット)を送信
③ データ(8ビット x N回)を送受信
④誤り検知(8ビット/16ビットのCRC)
これも、丸文さんのサイトに細かい内容が紹介されている。
Wikipediaの方にはデバイスIDの指定がシーケンスには書かれていない。
なぜだろう?デバイスIDはマルチドロップ対応の追加仕様なのだろうか。
もしかすると、マスター:スレーブが1:1の時に、デバイスID不要でアクセスできる仕様があるのかもしれない。
ラズパイでの1-Wireの使い方
Raspberry Pi OSでの1-Wireの使い方を調べる。
1-Wireの有効化
まずは、Raspberry Piの設定 から1-Wireを有効化する。
1-wireを有効化すると、以下のモジュールがインストールされるようだ。
ukari@rp3bp:~ $ lsmod | grep -i "w1"
w1_therm 28672 0
w1_gpio 16384 0
wire 36864 2 w1_gpio,w1_therm
w1_therm : おそらく、温度センサーに特化したモジュール
w1_gpio :おそらく、一般的なアクセスのモジュール
wire :w1_therm、w1_thermから呼び出されるモジュール
1-wireのデフォルトのピンは、GPIO4になっている。
DHT11 - デジタル温度・湿度センサー
使い方は、以下に書かれている。
※ すでにリンク切れが多く、参考程度に。
WiringPiというラズパイのGPIO制御ライブラリのインストールが必要らしい。
WiringPiのインストール ※現在開発中止
このWiringPiだが、リポジトリからはインストールできなくなってる。
他のGPIOライブラリを使ってほしいとのことらしい。
ukari@rp3bp:~/work $ sudo apt install wiringpi
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
パッケージ wiringpi は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。
pigpioをインストール
WiringPiの代わりとして、pigpioライブラリをインストールする。
サイトに書かれている通りにビルドする。
wget https://github.com/joan2937/pigpio/archive/master.zip
unzip master.zip
cd pigpio-master
make
sudo make install
ビルドが終わったら、以下コマンドでpigpioデーモンを起動させる。
sudo pigpiod
pigpioのサンプル
DHT11向けのサンプルもサイトに公開されている。
以下はPython向けのサンプル。
https://abyz.me.uk/rpi/pigpio/code/DHT.py
pigpioをインストールした際、以下にDHT11のサンプルが含まれている。
pigpio-master/EXAMPLES/Python/DHT11_SENSOR
dht11.pyの実行
yukari@rp3bp:~/work/pigpio-master/EXAMPLES/Python/DHT11_SENSOR $ python dht11.py
Traceback (most recent call last):
File "/home/yukari/work/pigpio-master/EXAMPLES/Python/DHT11_SENSOR/dht11.py", line 158, in <module>
for d in sensor:
TypeError: iter() returned non-iterator of type 'DHT11'
エラーになった…よく見たらセンサーに3.3Vではなく5Vを接続していた。
暫く5Vが流れていたようだが、壊れてしまったのだろうか。
気付いたけど、1-Wireモジュールに電源入れるって何なんだろう…
結局のところ、1-Wireで電源をとらずにGPIOの単線バスといった考えなのだろうか。
DS18B20 - 温度センサー
DHT11が動作しないようなので、代わりにDS18B20を使ってみる。
こっちは5V接続らしい。しかも画像が違うのがあやしい。
デバイスが見えているのかを確認してみると、ちゃんと見えた。
yukari@rp3bp:~ $ ls /sys/bus/w1/devices/
28-02160377fcee w1_bus_master1
アクセスも問題なくできた。
yukari@rp3bp:/sys/bus/w1/devices/28-02160377fcee $ cat w1_slave
55 01 4b 46 7f ff 0c 10 be : crc=be YES
55 01 4b 46 7f ff 0c 10 be t=21312
pigpioのDS18B20サンプル
Pythonのソースコードが公開されている。
これは、pigpioのEXAMPLEには含まれていないので、サイトから直接ダウンロードしてくる必要がある。
wget https://abyz.me.uk/rpi/pigpio/code/DS18B20-1_py.zip
unzip DS18B20-1_py.zip
実行してみたが、いつまでたっても結果が表示されない。
ukari@rp3bp:~/work $ python DS18B20-1.py
センサーのサイトにあるソースコードをコピーして実行すると動作した。
これ、pigpio使ってないけど…
yukari@rp3bp:~/work/DS18B20 $ python temp.py
C =21.187 F = 70.137
C =21.187 F = 70.137
C =21.187 F = 70.137
C =21.187 F = 70.137
C =21.187 F = 70.137
C =21.250 F = 70.250
なんだか、pigpioモジュールを上手く動かせていないだけな気がする。
やっぱり、WiringPiを使ってみようかな。
とりあえず、1-wireは使えたので今日はここまでにする。
この記事が気に入ったらサポートをしてみませんか?