LoginSignup
2
1

More than 3 years have passed since last update.

Raspberry PiでPythonからAdafruit_DHTを使おうとしたときに遭遇したエラーについて

Last updated at Posted at 2020-09-14

導入

Raspberry PiでAM2302という温湿度センサを、Adafruit_DHTというパッケージを使用し、Pythonで扱うことを試みるとエラーが生じた。
インストール時のエラーは簡単な操作を行うことによって回避できるが、実際に温度・湿度を取得する際に生じるエラーまでは回避できなかったため、そのエラーまで回避することを行った。

コンピュータはRaspberry Pi 4B/4GB, OSはRaspbian lite, Ubuntu Server20.04の両方でエラーが生じたのを確認し、Pythonはpyenvから3.8.5をインストールし、Pipenvを使用。

遭遇したエラー

まずは素直にpipenvからインストールを行おうとする。

$ pipenv install Adafruit_DHT
Installing Adafruit_DHT…
Error:  An error occurred while installing Adafruit_DHT!
Error text: Collecting adafruit_dht
  Downloading Adafruit_DHT-1.4.0.tar.gz (15 kB)
Building wheels for collected packages: adafruit-dht
  Building wheel for adafruit-dht (setup.py): started
  Building wheel for adafruit-dht (setup.py): finished with status 'error'
  Running setup.py clean for adafruit-dht
Failed to build adafruit-dht
Installing collected packages: adafruit-dht
    Running setup.py install for adafruit-dht: started
    Running setup.py install for adafruit-dht: finished with status 'error'
---
中略
---
✘ Installation Failed

インストールが失敗したことを確認できた。
次に、パッケージをGitHubから落とし、使用している機器がRaspberry Piである事を表すパラメータを加えて手動でインストールを行う。

$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git
$ cd Adafruit_Python_DHT
$ python setup.py install --force-pi
Finished processing dependencies for Adafruit-DHT==1.4.0

インストールが完了したことを確認したので、実際に温度の取得を行ってみる。

$python
>>> import Adafruit_DHT
>>> Adafruit_DHT.read_retry(Adafruit_DHT.AM2302, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/Projects/temp/Adafruit_Python_DHT/Adafruit_DHT/common.py", line 94, in read_retry
    humidity, temperature = read(sensor, pin, platform)
  File "/home/pi/Projects/temp/Adafruit_Python_DHT/Adafruit_DHT/common.py", line 80, in read
    platform = get_platform()
  File "/home/pi/Projects/temp/Adafruit_Python_DHT/Adafruit_DHT/common.py", line 63, in get_platform
    raise RuntimeError('Unknown platform.')
RuntimeError: Unknown platform.

となる。

解決法

Python3.8.5の使用を辞め、Python3.7.9を使用する。

解説

Adafruit_DHTでは、パッケージが使用されているプラットフォームの検出にPythonの標準ライブラリであるplatformから情報を得ている
ここで得られたプラットホームの固有情報に('armv7l-with-debian', 'armv7l-with-ubuntu', 'armv7l-with-glibc2.4', 'armv7l-with-arch')のいずれかが含まれていれば動作する。
このとき、Python3.8.5とPython3.7.9の出力が異なっていることがエラーの原因となっていた。

下は実際にRaspbian lite上でplatformの情報をそれぞれのPythonのバージョンから確認したものである。

Python3.8.5

>>> import platform
>>> platforfm.platform()
'Linux-5.4.51-v7l+-armv7l-with-glibc2.28'

Python3.7.9

>>> import platform
>>> platforfm.platform()
'Linux-5.4.51-v7l+-armv7l-with-debian-10.4'

余談

そもそも上記のもので検出を狙っているのはBeaglebone Blackという機器であり、Raspberry Piは別の場所で検出を狙っている。しかしRaspberry Pi 4B上で/proc/cpuinfoに記載されているHardwareの項目はBCM2711で、このプログラムからは検出されない。

追記

そもそもAdafruit_Python_DHTのリポジトリは現在アーカイブされており、メンテナンスされていないものでした。
その代わり、Adafruit_CircuitPython_DHTのリポジトリがあるのでこちらを利用してださいとの事です。
こちらの方なら、Python3.8.5でも問題なくインストールできました。
ただ、利用する際はRPi.GPIOというパッケージもインストールしないとインポートできない点に注意が必要です。
利用する際は下のコマンドで、Adafruit_CircuitPython_DHTとRPi.GPIOをインストールしてください。

$ pip install adafruit-circuitpython-dht RPi.GPIO

下はRPI.GPIOをインストールしていない環境でadafruit-circuitpython-dhtをインポートしようとした場合。

>>> import adafruit_dht
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/pi/temp/.venv/lib/python3.8/site-packages/adafruit_dht.py", line 34, in <module>
    from digitalio import DigitalInOut, Pull, Direction
  File "/home/pi/temp/.venv/lib/python3.8/site-packages/digitalio.py", line 15, in <module>
    from adafruit_blinka.microcontroller.bcm283x.pin import Pin
  File "/home/pi/temp/.venv/lib/python3.8/site-packages/adafruit_blinka/microcontroller/bcm283x/pin.py", line 2, in <module>
    import RPi.GPIO as GPIO
ModuleNotFoundError: No module named 'RPi'
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1