raspi-config で SPI を有効にして、さあ使おうとしたらうまくいかなかったお話。
環境
- Raspberry Pi 3B
- Raspberry Pi OS Lite (2024-07-04-raspios-bookworm-armhf-lite.img.xz)
spi を python で読もうとするとエラー
以下は gpiozero ライブラリを使った場合。
$ python3 mcp30088.py
/usr/lib/python3/dist-packages/gpiozero/pins/pi.py:465: SPISoftwareFallback: failed to initialize hardware SPI, falling back to software (error was: 'can not open SPI device')
warnings.warn(
/usr/lib/python3/dist-packages/gpiozero/pins/pi.py:465: SPISoftwareFallback: failed to initialize hardware SPI, falling back to software (error was: 'can not open SPI device')
warnings.warn(
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 75, in __call__
self = cls._instances[key]()
~~~~~~~~~~~~~~^^^^^
KeyError: ('GPIO11', 'GPIO8')
.
.
.
WiringPi を使ったものでも同様です。
pi@raspberrypi:~ $ sudo python3 de.py
Unable to open SPI device: No such file or directory
spi のデバイスファイルが無い
$ ls -l /dev/spi*
ls: '/dev/spi*' にアクセスできません: そのようなファイルやディレクトリはありません
ハードウェア不良?
RaspberryPi を交換しても同様でした。
OSのバージョン?
SPIが動作するシステムから、OSの入った microSD カードを持ってきて起動したら、そちらでは SPI が動作します。OSのバージョンが悪いのかな?
再インストール
切り分けのために、OSを再インストールしました。
再インストール直後は spi デバイスは見えます。
$ ls -alh /dev/spi*
crw-rw---- 1 root spi 153, 0 7月 11 11:42 /dev/spidev0.0
crw-rw---- 1 root spi 153, 1 7月 11 11:42 /dev/spidev0.1
先の python プログラムで spi を操作するのも問題ありませんでした。
パッケージの競合?
問題のあったシステムでは、plymouth や pygame などをインストールしていました。それらが干渉しているかな? と思ったけれどそれらをインストールしていきましたが問題は再現しませんでした。
該当作業
「RaspberryPi Lite で起動スプラッシュを設定する」
https://qiita.com/nanbuwks/items/5c9bde5dce676de623a2
「Raspberry Pi で pygame」
https://qiita.com/nanbuwks/items/1e0e32f449e64cd0d188
結局、旧OSシステムのどこかがおかしくなっていたらしいというところまでで追求はやめて、新しくインストールしたOSシステムでSPIを動かすことにしました。
原因は?
問題のあったシステムでは、 dmesg 中に以下のような表示がありました。
$ dmesg | grep spi
[ 12.770727] ads7846 spi0.1: supply vcc not found, using dummy regulator
[ 12.803033] ads7846 spi0.1: touchscreen, irq 200
[ 12.810634] input: ADS7846 Touchscreen as /devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.1/input/input2
問題の解消したシステムでは、そのようなものはありませんでした。
$ dmesg | grep spi
意図せずに、ads7846 の何かをインストールしていたか、どうかしていたのかな?