ラズパイで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を有効化

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接続らしい。しかも画像が違うのがあやしい。

DS18B20

デバイスが見えているのかを確認してみると、ちゃんと見えた。

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は使えたので今日はここまでにする。

この記事が気に入ったらサポートをしてみませんか?