Raspberry Pi + WebIOPi + MCP3008 (SPI ADC) + PCA9685(I2C PWM)

Raspberry Pi に WebIOPi をインストールして SPI 接続タイプの ADC MCP3008 を制御してみる。ついでに PWM 制御 LSI の PCA9685 も使ってみる。PCA9685 は I2C。MCP3008 はひとつだが、PCA9685 は二つ接続している。

 

SPI と I2C のドライバ関係は改めてインストールする必要はない。

WebIOPi に含まれているらしい。

まず、Raspberry Pi に SPI と I2C 関係のドライバインストールなどを行う。

  1. ドライバインストール
    $ sudo apt-get -y install python-smbus i2c-tools
  2. raspi-blacklist.conf の修正
    $ sudo nano /etc/modprobe.d/raspi-blacklist.conf
    で、この2行をコメントアウトする。
    [BEFORE]
    blacklist spi-bcm2708
    blacklist i2c-bcm2708
    [AFTER]
    # blacklist spi-bcm2708
    # blacklist i2c-bcm2708
  3. py-spidev のインストール
    $ cd
    $ mkdir py-spidev
    $ cd py-spidev
    $ wget https://raw.github.com/doceme/py-spidev/master/setup.py
    $ wget https://raw.github.com/doceme/py-spidev/master/spidev_module.c
    $ sudo python setup.py install
    $ cd ../
    $ rm -fr py-spidev
  4. /etc/modules の修正
    $ sudo nano /etc/modules
    で、次の2行を追加する。
    i2c-dev
    i2c-bcm2708
  5. リブート
  6. I2C の接続確認はこう
    $ sudo i2cdetect -y 1

 

次に、WebIOPi 関係。

  1. /etc/webiopi/config [SCRIPTS]
    [SCRIPTS]
    myscript = /home/pi/myproject/python/script.py
    
  2. /etc/webiopi/config [DEVICES]
    ここで「adc0」と「pwm0」「pwm1」という名称は rest で使われるので、MCP3008と PCA9685 を操作するための URL 中に現れる。
    pwm0 = PCA9685
    pwm1 = PCA9685 slave:0x41
    adc0 = MCP3008
    
  3. myproject/python/script.py の import 部分
    チュートリアルでは
    from webiopi.devices.analog import MCP3008
    となっていたが、これではインポートできなかった。webiopi.devices.analog ではなく、webiopi.devices.analog.mcp3x0x を使用する。
    import webiopi
    from webiopi import deviceInstance
    from webiopi.devices.analog.mcp3x0x import MCP3008
    from webiopi.devices.analog.pca9685 import PCA9685
    import datetime
    
  4. myproject/python/script.py の def setup()
    これを追加する。
        adc0 = MCP3008()
        pwm0 = PCA9685(frequency=100)
        pwm1 = PCA9685(slave=0x41, frequency=100)
    
WebIOPi の起動はこれ。
$ sudo webiopi -d -c /etc/webiopi/config
Raspberry Pi の IP アドレスを 192.168.0.202 とすると、次の URL で状態を表示できる。
さらにいろいろやりたい時は、 JavascriptPython でプログラムを作る。それはまた次回。

adc0 の入力電圧を表示する。
http://192.168.0.202:8000/devices/adc0/analog/0/volt
adc0 の AD の値を表示する。
http://192.168.0.202:8000/devices/adc0/analog/0/integer
pwm1 のチャンネル数を表示する。
http://192.168.0.202:8000/devices/pwm1/pwm/count
PCA9685 に値を書き込むのは GET ではなく、POST になるのでこれも次回。
 
WebIOPi のインストールコマンドに、こういうのもあった。
$sudo ./setup.sh skip-apt
 
device not found のようなエラーが発生した。WebIOPi をインストールし直したら動いてしまった。なんだったのか・・・。
/var/log/webiopi に WebIOPi のログがあるので、これを見ると何かあったときに原因がわかるかもしれない。