Armadilloフォーラム

DHT22 での温湿度計測

yuji_aoki

2024年2月26日 11時58分

armadillo a6 にて温度・湿度を計測しようとしています。
https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-st…
こちらに記載のある、DHT22 というセンサーを購入・接続してみたのですが、使い方がよく分かりません。
表中に 資料 iio/humidity/dht11.txt とありますが、これはどちらから閲覧可能ですか?
サンプルコードなどはありませんでしょうか?

また、https://zenn.dev/hasegawasatoshi/articles/f4708b23077cf7
こちらのサンプルコード(python)を試してみたところ、

root@armadillo:~/camwork# python3 test_dht.py
Traceback (most recent call last):                                              
  File "test_dht.py", line 5, in <module>                                       
    import board                                                                
  File "/usr/local/lib/python3.7/dist-packages/board.py", line 397, in <module> 
    """                                                                         
NotImplementedError:                                                            
        Adafruit-PlatformDetect version 3.60.0 was unable to identify the board 
and/or                                                                          
        microcontroller running the Linux platform. Please be sure you          
        have the latest packages by running:                                    
        'pip3 install --upgrade adafruit-blinka adafruit-platformdetect'        
 
        If you are running the latest package, your board may not yet be support
ed. Please                                                                      
        open a New Issue on GitHub at https://github.com/adafruit/Adafruit_Blink
a/issues and                                                                    
        select New Board Request.  

このようなエラーが発生し、import boardが出来ませんでした。
pip3 install --upgrade adafruit-blinka adafruit-platformdetect コマンドの実行でも状況は変わりませんでした。
armadillo a6 はAdafruit-Blinka に対応していないのでしょうか?

よろしくお願いいたします。

コメント

https://armadillo.atmark-techno.com/blog/615/4300
こちらの記事を参考に、GPIOの値を読み取る事は出来ましたが、
GPIOから温湿度を読み取るには、データ受信と解析のための複雑なタイミングとプロトコルの詳細を抽象化し、開発者が簡単に温度と湿度の値にアクセスできるようにする
Adafruit CircuitPython DHTライブラリ 等を利用するのが一般的のようです。

Adafruit_DHTライブラリは、元々Raspberry PiやBeagleBone Blackのような一般的な開発ボード向けに設計されており、
Armadilloには対応していないと判断しました。
理由は、センサーを armadillo a6 の ピン名:GPIO4_IO07に接続しており、
https://manual.atmark-techno.com/armadillo-iot-a6/armadillo-iota6_produ…
こちらの対応表から GPIO番号:103を指定し
Adafruit_Python_DHT/examples# python3 AdafruitDHT.py 22 103
と実行しても

File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/Beaglebone_Black.py"
, line 206, in read                                                             
    raise ValueError('Pin must be a valid GPIO identifier like P9_12 or GPIO1_28
.')                                                                             
ValueError: Pin must be a valid GPIO identifier like P9_12 or GPIO1_28.

というエラーが発生するためです。
"P4_07" や "GPIO4_07", "GPIO4_IO07" も試しましたが同様のエラーでした。

何か利用できるライブラリがありましたら教えて頂けませんでしょうか?
また、
https://manual.atmark-techno.com/armadillo-guide-std/armadillo-guide-st…
こちらに記載のある、DHT22の 資料 iio/humidity/dht11.txt の閲覧方法も未だ閲覧方法が分からずにいます。
ご存知の方助けて下さい。

松坂です。

資料 iio/humidity/dht11.txtは、カーネルのソースコードに含まれている文書です。

すぐに確認したい場合は、以下のgithubから参照できます。
https://github.com/atmark-techno/linux-4.14-at/blob/master/Documentatio…

iioでDHTを使えるようにするには、以下のドキュメントを参照してカーネルをビルドできるようにして、カーネルをカスタマイズする必要があります。

■製品マニュアル
開発/動作確認環境の構築
「ATDE のセットアップ」から「コマンドライン端末の起動」まで
ビルド手順
「Linux カーネルをビルドする」

■Armadillo標準ガイド ハードウェア拡張編
ハードウェア機能をカスタマイズする
Device Treeのカスタマイズ
カーネルイメージのカスタマイズ

pythonについて、Adafruit_DHTライブラリは、GPIO制御ライブラリのAdafruit_Blinkaを使用しているみたいで、
armadillo a6のCPUであるNXPのi.MX6ULLもサポートしているように見えます。
https://github.com/adafruit/Adafruit_Blinka/blob/main/src/adafruit_blin…

今回DHTを接続しているGPIO4_IO07が定義されていないので、定義することでもしかすると使えるようになるかもしれません。

test_dht.pyの実行時のエラーメッセージを見ると、「Adafruit-PlatformDetect version 3.60.0 was unable to identify the board」
と記載されているので、Armadillo(=i.MX6ULL)を認識していない可能性があります。

松坂様
ご回答ありがとうございました。

> iioでDHTを使えるようにするには、以下のドキュメントを参照してカーネルをビルドできるようにして、カーネルをカスタマイズする必要があります。
こちらはpythonから取得する場合にも、必要になりますでしょうか?

松坂です。

> > iioでDHTを使えるようにするには、以下のドキュメントを参照してカーネルをビルドできるようにして、カーネルをカスタマイズする必要があります。
> こちらはpythonから取得する場合にも、必要になりますでしょうか?

はい。この場合は、Adafruit CircuitPython DHTライブラリのようにpythonのライブラリ内でGPIOを操作し、センサと通信するのではなく、
カーネルのデバイスドライバがセンサと通信し、測定値はファイルを経由して読み取ることができます。
pythonでは、ファイルを読み出すだけで温度を取得することができます。

以下の手順で作成したカーネルイメージとデバイスツリーで、センサ(DHT11)の温度を取得できましたので、参考にしてください。
※今回はA640とDHT11の組み合わせで確認しましたが、A6とDHT22でも同様の手順でおそらく温度取得ができると思います。

カーネルのカスタマイズを行います。
製品マニュアルの「howto イメージをカスタマイズする」を参考にカーネルと DTB をビルドできる状況にして、
カーネルのソースツリーに対して、以下の手順を行ってください。

以下の示す場所に、「armadillo-640-dht11.dtsi」を配置、作成してください。

■場所、ファイル名
arch/arm/boot/dts/armadillo-640-dht11.dtsi
■ファイル内容

/ {
	humidity_sensor {
		compatible = "dht11";
		gpios = <&gpio4 7 0>;
	};
};

以下の既存ファイルを編集して、1行を追加してください。

■場所、ファイル名
arch/arm/boot/dts/armadillo-640.dts

■ファイル内容(抜粋)

#include "armadillo-640-lcd70ext-l00.dtsi"
#endif
#include "armadillo-640-dht11.dtsi" ← この行を追加する
 
/ {
	model = "Atmark Techno Armadillo-640";
	compatible = "atmark,a640", "fsl,imx6ull";

menuconfig を使用してカーネルコンフィギュレーションを変更します。

■コマンド例

[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm menuconfig

■変更場所

  Location:
  │     -> Device Drivers
  │       -> Industrial I/O support (IIO [=y])
  │         -> Humidity sensors
  │           -> [*] DHT11 (and compatible sensors) driver ←有効にする

変更を加え、カーネルコンフィギュレーションを確定してください。
以上の変更後、製品マニュアルの「howto イメージをカスタマイズする」と同様にカーネルと DTB をビルドし、Armadillo に
書き込んでください。

Armadilloを再起動したのち、以下のコマンドを実行して、センサが計測した温度を読み出せるか確認します。

[armadillo ~]# cat /sys/bus/iio/devices/iio\:device0/in_temp_input
23600

以下は、pythonで温度を読み取る場合のコード例です。

f = open('/sys/bus/iio/devices/iio:device0/in_temp_input')
Temp = round(int(f.read()) / 1000.0, 1)
f.close
print(Temp)

松坂様
本件長い間結果が報告できておらず申し訳ありません。
ようやく試す事が出来たのですが、

root@armadillo:~# cat /sys/bus/iio/devices/iio\:device0/in_temp_input           
cat: '/sys/bus/iio/devices/iio:device0/in_temp_input': No such file or directory
root@armadillo:~# ll /sys/bus/iio/devices/                                      
total 0

となってしまいました。

試した事としては、松坂様からいただきました手法(armadillo-640)を
armadillo-iotg-a6に読み替え、

以下の示す場所に、「armadillo-iotg-a6-dht11.dtsi」を作成

■場所、ファイル名
arch/arm/boot/dts/armadillo-iotg-a6-dht11.dtsi
■ファイル内容

/ {
humidity_sensor {
compatible = "dht11";
gpios = <&gpio4 7 0>;
};
};

以下の既存ファイルを編集して、1行を追加

■場所、ファイル名
arch/arm/boot/dts/armadillo-iotg-a6.dts

■ファイル内容(抜粋)
#include "armadillo-iotg-a6-dht11.dtsi" ← この行を追加
■コマンド例

[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm menuconfig

Location:
│ -> Device Drivers
│ -> Industrial I/O support (IIO [=y])
│ -> Humidity sensors
│ -> [*] DHT11 (and compatible sensors) driver ←有効にする

にて動作させました。
armadillo-iotg-a6に読み替えは不要で、そのままarmadillo-640にて実行すべきでしたでしょうか?
アドバイスお願いいたします。

松坂です。

> armadillo-iotg-a6に読み替えは不要で、そのままarmadillo-640にて実行すべきでしたでしょうか?
armadillo-iotg-a6に記載でも問題ありません。

> root@armadillo:~# ll /sys/bus/iio/devices/
> total 0

修正されたイメージの書き換えがうまくいっていないように見えます。
製品マニュアルの章「特定のイメージファイルだけを書き換える」にあります、
「Linux カーネルイメージの書き換え」と「DTB の書き換え」を参考にイメージの書き換えを再度お願いいたします。

あと、念のため以下のコマンドでビルドをもう一度実行してみてください。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage armadillo-iotg-a6.dtb

松坂様、ご回答ありがとうございました。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage armadillo-iotg-a6.dtb
にて、末尾のarmadillo-iotg-a6.dtb が抜けていることが原因でした。
無事温度が取得できました、ありがとうございました。

[armadillo ~]# cat /sys/bus/iio/devices/iio\:device0/in_temp_input
このコマンドは
[armadillo ~]# cat /sys/bus/iio/devices/iio:device0/in_temp_input
にて動作しました。