JetsonNanoでPython3.8でDHT11

JetsonNanoでDHT11を動かした。

DHT11とは

GPIO1本で温度・湿度が図ることのできるセンサー。 精度やサンプリングレートは良くないが、温度も湿度も測れるセンサーとしては非常に安価であり、広く用いられている、らしい。

  • データシート

akizukidenshi.com

Amazon.co.jp: VKLSVAN 3個セット DHT11温度センサー モジュール湿度センサーモジュール デュポンラインと付属 Arduinoに対応: DIY・工具・ガーデン

配線

以下の用につないだ。(画像はラズパイですが使ったのはJetson Nanoです。)

f:id:wooolwoool:20210113204149j:plain
配線

ライブラリ

ラズパイ用にはいろいろ公開されているがJetsonNano用のものはそんなになかった。 今回は以下を使用。

github.com

ただ、これはPython2用のライブラリなのでPython3用にポーティングして使用する。

手順

まずはリポジトリをクローン。

$ git clone --recurse-submodules -j8 https://github.com/GrgoMariani/NVidia-Jetson-DHT22-Python

READMEに書いてある通り、Pinを使用するものに変更する。今回は以下のようにする。

#define PIN0 jetsonnano_pin32
#define PIN1 jetsonnano_pin31

続いてビルド。今回はPython3で使うのでPython3でビルド。そうするとPy_Initializeじゃないのか?と聞かれる。(ネタバレするとPython3ではPy_InitModuleを使えないので手を加える必要がある。ビルドはできるのでひとまずこのまま進めてみる。)

$ python3 setup.py build
~~~
C_DHT.c:173:8: warning: implicit declaration of function ‘Py_InitModule’; did you mean ‘Py_Initialize’? [-Wimplicit-function-declaration]
  (void)Py_InitModule("C_DHT", C_DHT22Methods);
        ^~~~~~~~~~~~~
        Py_Initialize
C_DHT.c:174:1: warning: control reaches end of non-void function [-Wreturn-type]
 };
~~~

インストール。

$ python3 setup.py install

試してみる。

$ python3
>>> import C_DHT
Traceback (most recent call last):
  File "", line 1, in 
ImportError: /usr/local/lib/python3.8/site-packages/C_DHT.cpython-38-aarch64-linux-gnu.so: undefined symbol: Py_InitModule

Python3用ではないのでエラー。なのでソースコードを修正する。

対象:C_DHT.c

まずは以下の行を削除。

PyMODINIT_FUNC
initC_DHT(void){
        (void)Py_InitModule("C_DHT", C_DHT22Methods);
};

そして以下の行を最後に追加。

static struct PyModuleDef C_DHT =
{
       PyModuleDef_HEAD_INIT,
       "C_DHT", /* name of module */
       "",          /* module documentation, may be NULL */
       -1,          /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
       C_DHT22Methods
};

PyMODINIT_FUNC
PyInit_C_DHT(void){
        return PyModule_Create(&C_DHT);
};

ビルド+インストール。

$ python3 setup.py build
$ python3 setup.py install

試す。

$ python3
>>> import C_DHT
>>>

うまく行きました。