LoginSignup
3
3

More than 5 years have passed since last update.

Raspberry pi (Raspbian OS Stretch Lite 2017-11-29) でSPIが動かない

Posted at

まず結論

現時点(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でなくてもいけると思われる)、
では、ということで、例えば以下のようなコードを走らせてみると、

analoginputtest.py
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で、ハードウェアの初期化まわりでアーキ毎の差異を吸収できてないっぽい、というのが推測されます。つい最近までコード直してるよ。

んでそんなら、過去に実績のあるバージョンで試してみるか、ってことでjessieに戻したら動いたというわけです。

それから、この記事は、使えないっていう現象は同じなのですが、症状は違うようです。

ご参考まで。

3
3
3

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
3
3