Python
RaspberryPi

ラズパイでSPIが使えない(未解決)

More than 1 year has passed since last update.

アナログセンサを使おうとして、ADCのMCP3004を買ってきてSPI通信しようとしたのだけど、どうもSPIが使えない?

こちらのサイトを参考にして、以下Pythonを作成。
http://qiita.com/masato/items/f089a17b1c9329eb7d03

light.py
#!/usr/bin/env python3
# coding:utf-8

import spidev

spi = spidev.SpiDev()
# spi.open(bus,device)
spi.open(0,0)
def readAdc(channel):
    adc = spi.xfer2([1,(8+channel)<<4,0])
    print(adc)
    data = ((adc[1]&3) << 8) + adc[2]
    return data
def convertVolts(data, vref):
    volts = (data * vref) / float(1023)
    volts = round(volts,4)
    return volts

if __name__ == '__main__':
    ch = 0
    data = readAdc(ch)
    print("adc : {:8} ".format(data))

    v = 3.3
    volts = convertVolts(data, v)
    print("volts: {:8.2f}".format(volts))

上のファイルを、ssh接続させたラズパイゼロにコピーして起動しようとした。

pi@raspberrypi:~ $ sudo python pyhome/light.py
Traceback (most recent call last):
  File "pyhome/light.py", line 9, in <module>
    spi.open(0,0)
IOError: [Errno 2] No such file or directory

そんなもんねーよと言われる。え。なんでや。

海外フォーラムを見てみると、以下の投稿が自分の症状と同じようだ。
https://www.raspberrypi.org/forums/viewtopic.php?t=154317

pi@raspberrypi:~ $ ls /dev/spi*
ls: /dev/spi* にアクセスできません: そのようなファイルやディレクトリはありません

spiが無いと言われる。

pi@raspberrypi:~ $ grep -i 'dtparam' /boot/config.txt
dtparam=i2c_arm=on
#dtparam=i2s=on
dtparam=spi=on
dtparam=audio=on

pi@raspberrypi:~ $ lsmod | grep spi
spidev                  7034  0
spi_bcm2835aux          5235  0
spi_bcm2835             7424  0

SPI自体は認識している様子?

/boot/config.txt
dtoverlay=spi1-3cs

どっかでこんなの書いてたから追記してみた。何も変わらず。

pi@raspberrypi:~ $ ls /dev/spi*
/dev/spidev1.0  /dev/spidev1.1  /dev/spidev1.2

フォーラムを一通りなぞってみたらいつの間にか出てきた。
もしかして・・・!

pi@raspberrypi:~ $ sudo python pyhome/light.py
Traceback (most recent call last):
  File "pyhome/light.py", line 9, in <module>
    spi.open(0,0)
IOError: [Errno 2] No such file or directory

・・・と思ったがメッセージは変わらず。
フォーラムもなんか解決しないまま終わっている様子?

どうしたものか。

誰か助けてほしい。

追記

コメントのご助言通りspi.open(1,0)としたらエラーは回避された。とても助かります。
ただ、値がゼロとなる。
SPI1用の配線にしてみたが、変わらず。
うーむ。

以下気になる点。

pi@raspberrypi:~ $ ls -la /dev/spidev*
crw-rw---- 1 root spi 153, 2  9月 25 17:18 /dev/spidev1.0
crw-rw---- 1 root spi 153, 1  9月 25 17:18 /dev/spidev1.1
crw-rw---- 1 root spi 153, 0  9月 25 17:18 /dev/spidev1.2

検索すると/dev/spidev0.0、/dev/spidev0.1が出てくるのだけど、自分のには1.0~しかない。
気になる。

pi@raspberrypi:~ $ dmesg | grep spi
[    9.451988] spi_master spi0: /soc/spi@7e204000/waveshare35a-ts@1 has no valid 'spi-max-frequency' property (-22)
[    9.452016] spi_master spi0: Failed to create SPI device for /soc/spi@7e204000/waveshare35a-ts@1
[    9.698613] pinctrl-bcm2835 20200000.gpio: pin gpio18 already requested by 20215080.spi; cannot claim for 20203000.i2s
[   11.043387] spi0.1 supply vcc not found, using dummy regulator
[   11.171913] ads7846 spi0.1: touchscreen, irq 177
[   11.186649] input: ADS7846 Touchscreen as /devices/platform/soc/20204000.spi/spi_master/spi0/spi0.1/input/input0
[   11.491343] pinctrl-bcm2835 20200000.gpio: pin gpio17 already requested by 20215080.spi; cannot claim for spi0.0
[   11.491368] pinctrl-bcm2835 20200000.gpio: pin-17 (spi0.0) status -22
[   11.491394] fb_ili9340 spi0.0: Error applying setting, reverse things back
[   11.532846] fb_ili9340: probe of spi0.0 failed with error -22

この辺りにヒントがありそう。
こっちだとspi0.0,0.1が出て来る。ただ既に使われてる?とか書いてるように見える。
Displayの表示もいろいろある。もしかして一時期使ってた小型ディスプレイの設定が悪さしている?
cocopar 3.2インチ ディスプレイ タッチパネル
確かにSPIのディスプレイだし可能性ありそう。先に使ってたら駄目とかあるのだろうか・・・。