###まず結論
現時点(2018/02/25)では、Raspberry Pi ZeroにRaspbian OS Stretch Lite 2017-11-29を入れるとSPIインタフェースがうまく動きません。Jessie最終版(2017-07-05)で塗り直したところ、全く同じハードウェア構成で動きました。
私が試したのはZeroですが、Zero Wや初代RPiなど、bcm2835を使っているものは軒並み動かないのではないかと推測されます。
また、インストールしたOSはStretch Lite 2017-11-29ですが、apt-get update / apt-get upgradeはかけてます。
いやー、だいぶハマったよ。半日つぶれた。
なお、以下はあんまり参考にならない周辺情報です。
経緯
Raspberry Pi Zero (Wではない)でNeoPixel(ws281x)を使ってフルカラーなLチカをやろうと思って色々セットアップしていました。可変抵抗を3つつないでRGBをつまみで変更できるようにしたいと思っていて、ADコンバータとしてMCP3208を用意し、これをSPIインタフェース経由でラズパイにつなぐつもりで作業していました。
NeoPixelを光らせる方は本題ではないのでここでは特に触れませんが、まあ問題なくできました。
では次に、RGB値の変更の方だね、ということで、MCP3208をブレッドボード等々で繋いで、
$ sudo raspi-config
で、5.Interfacing OptionsからSPIを有効にしてリブート(raspi-configの代わりに/boot/config.txtを直接いじってもOKなはず)、
更に
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python3 setup.py install
とやって(たぶんpython3でなくてもいけると思われる)、
では、ということで、例えば以下のようなコードを走らせてみると、
import time
import sys
import spidev
spi = spidev.SpiDev()
spi.open(0,0)
def readAdc(channel):
adc = spi.xfer2([(0x07 if(channel & 0x04) else 0x06), (channel & 0x03) << 6, 0])
data = ((adc[1] & 0x0f) << 8) | adc[2]
return data
'''
def convertVolts(data):
volts = (data * 3.3) / float(4095)
volts = round(volts,4)
return volts
'''
if __name__ == '__main__':
try:
while True:
data = readAdc(0)
print("adc : {:8} ".format(data))
volts = convertVolts(data)
#print("volts: {:8.2f}".format(volts))
time.sleep(0.01)
except KeyboardInterrupt:
spi.close()
sys.exit(0)
$ sudo python3 analoginputtest.py
数値が正しく取れません。全く同じコードと同じ構成で、RPi2(Jessie使用)では動いたのに!
コマンド起動直後に0.5秒間くらいだけなんとなくそれっぽい数値が見えて、その後ずっと0になってしまうという謎挙動です。SPIインタフェースの初期化に失敗しているのではないか?と思われるような感じです。
原因
はっきり追いきれていません。
「raspi zero spi」とかで調べてみると幾つか事例っぽいものが出てくるのですが、ハンダ不良のケースだったり(ここ)とか、初期化がうまくない?(これ)とか、ちょっと違うのが出てきて、ドンピシャリのものを見つけ出せていません。
一番参考になったのは[これ https://github.com/raspberrypi/linux/issues/1547]
(https://github.com/raspberrypi/linux/issues/1547)で、ハードウェアの初期化まわりでアーキ毎の差異を吸収できてないっぽい、というのが推測されます。つい最近までコード直してるよ。
んでそんなら、過去に実績のあるバージョンで試してみるか、ってことでjessieに戻したら動いたというわけです。
それから、この記事は、使えないっていう現象は同じなのですが、症状は違うようです。
ご参考まで。