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 に対応していないのでしょうか?

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

コメント

yuji_aoki

2024年2月27日 19時39分

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 の閲覧方法も未だ閲覧方法が分からずにいます。
ご存知の方助けて下さい。

at_matsuzaka

2024年2月28日 8時55分

松坂です。

資料 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)を認識していない可能性があります。

yuji_aoki

2024年3月4日 14時36分

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

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

at_matsuzaka

2024年3月5日 11時29分

松坂です。

> > 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)