Raspberry Pi + MCP3008 (SPI ADC) + PCA9685(I2C PWM) 回路図

Raspberry Pi に SPI 接続の ADC である MCP3008 と I2C 接続である PWM 制御 IC の PCA9685 を接続し、 WebIOPi で制御してみた。

そのソフト関係は今までの通り。

今回は回路図を示す。

まず、Raspberry Pi の26ピンヘッダと ADC の MCP3008。

電源は Raspberry Pi の 3.3V を利用している。MCP3008 の ch0から ch7 がアナログの入力回路。

f:id:video_36:20140731115648p:plain

次に、ふたつの PCA9685。こちらは I2C 接続で、U103 の PCA9685 はアドレスが 0x41 、U102 が 0x40 としている。LED0 から LED15 が出力端子。

f:id:video_36:20140731115650p:plain

ADC MCP3008 に接続する回路の例を示す。フォトトランジスタ NJL7502L を接続する場合はこんな感じ。NJL7502 は表面実装タイプもあるので、購入する時は気をつけること。

f:id:video_36:20140731121132p:plain

PCA9685 と LED の接続はこう。大きな LED を接続する時は FET などで電流を流せるようにすること。

f:id:video_36:20140731122213p:plain

Raspberry Pi + WebIOPi + PCA9685(I2C PWM) 遅い?

WebIOPi は遅い?

ちょっとチェックする。前回のプログラムを一部修正して、10秒間で何回ループしているかカウントしてみる。

プログラムの後ろの方はこう。

if __name__ == '__main__':

    my_webiopi = MyWebIOPi()

    time_to = time.time() + 10.0

    count = 0

    finished = False

    while not finished:

        my_webiopi.demo()

        count += 1

        if time.time() > time_to:

            finished = True

    print count

値は「90」だった。10秒間に90回繰り返している。

で、WebIOPi は使わずに自前の処理の場合は「166」だった。

自前のルーチンを使う方が2倍近く早いことがわかった。

Raspberry Pi + WebIOPi + PCA9685(I2C PWM) with Python Script

WebIOPi で PCA9685 を使って PWM 生成の試験を行っているが、POST ではなぜか動作させることができないので、Python のプログラムからやってみることにする。
次の手順で環境を整える。
  1. WebIOPi をインストールする
  2. Raspberry Pi + WebIOPi + MCP3008 (SPI ADC) + PCA9685(I2C PWM)
PCA9685 を二つ接続して、32 個の LED を明滅させる。
Python のプログラムはこれ。これは動いている。

#!/usr/bin/python

# coding: UTF-8

 

#from webiopi import deviceInstance

from webiopi.devices.analog.pca9685 import PCA9685

import random

 

class MyWebIOPi(object):

 

    def __init__(self):

        '''

        Constructor

        '''

        # self.pca0 = deviceInstance("pwm0")

        # self.pca1 = deviceInstance("pwm1")

        self.pca0 = PCA9685(slave=0x40, frequency=100)

        self.pca1 = PCA9685(slave=0x41, frequency=100)

        self.ch_list = range(32)

        random.shuffle(self.ch_list)

        self.kMinPWM = 1

        self.kMaxPWM = 4095

        self.vals =

        self.kmms =

        self.mms = []

        for ch in self.ch_list:

            self.vals.append(self.kMinPWM)

            mm = 1.05 + float(ch) / 60.0

            self.kmms.append(mm)

            self.mms.append(mm)

 

    def demo(self):

        for ch in self.ch_list:

            val = self.vals[ch]

            kmm = self.kmms[ch]

            mm = self.mms[ch]

            val *= mm

            if val > self.kMaxPWM:

                val = self.kMaxPWM

                mm = 1.0 / kmm

            elif val < self.kMinPWM:

                val = self.kMinPWM

                mm = kmm

            pwm_percent = val / self.kMaxPWM

            if ch < 16:

                self.pca0.pwmWriteFloat(ch, pwm_percent) 

            else:

                self.pca1.pwmWriteFloat(ch - 16, pwm_percent)

            self.vals[ch] = val

            self.mms[ch] = mm

            

if __name__ == '__main__':

    my_webiopi = MyWebIOPi()

    whileTrue:

        my_webiopi.demo()

        


Apache + wsgi + Python/Pyramid の環境よりも、ぎこちない動きになっている。変なところに時間がかかっている?

Raspberry Pi + WebIOPi + MCP3008 (SPI ADC) + PCA9685(I2C PWM) /app/devices-monitor

次の手順でインストールおよび設定を行うと・・・
  1. WebIOPi をインストールする
  2. Raspberry Pi + WebIOPi + MCP3008 (SPI ADC) + PCA9685(I2C PWM)
この URL で操作することができる。
http://<Your Raspberry Pi IP addr>:8000/app/devices-monitor
この例の場合は、adc0 と pwm0, pwm1 が conf で有効にしてある。
また、Raspberry Pi の IP アドレスは 192.168.0.202 となっている。

f:id:video_36:20140728182827p:plain

f:id:video_36:20140728182829p:plain

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 のログがあるので、これを見ると何かあったときに原因がわかるかもしれない。

Raspberry Pi + WebIOPi 準備

前回は Raspberry Pi に WebIOPi をインストールした。
今回は、Tutorial : Framework basisで基本的な動きを見る。

  1. ホームディレクトリにプロジェクトディレクトリを作成する
    チュートリアルのままこのように作成する。
    home
    - pi
      - myproject
        - python
        - html
    これをするコマンドはこう。
    $ cd /home/pi/
    $ mkdir myproject
    $ cd myproject/
    $ mkdir python
    $ mkdir html
  2. python スクリプトファイル script.py を作成し、python フォルダに置く
    チュートリアルでは8時から18時となっているが、そんなにのんびりできないので、10秒から30秒とする。
    #!/usr/bin/env python
    # coding: UTF-8
    """
    /home/pi/myproject/python/script.py
    """
    import webiopi
    import datetime
    
    GPIO = webiopi.GPIO
    LIGHT = 17
    
    SECOND_ON  = 10  # Turn Light ON at 10 second
    SECOND_OFF = 30  # Turn Light OFF at 30 second
    
    def setup():
        GPIO.setFunction(LIGHT, GPIO.OUT)
        now = datetime.datetime.now()
        if ((now.second >= SECOND_ON) and (now.second < SECOND_OFF)):
            GPIO.digitalWrite(LIGHT, GPIO.HIGH)
    
    def loop():
        now = datetime.datetime.now()
        if (now.second == SECOND_ON):
            if (GPIO.digitalRead(LIGHT) == GPIO.LOW):
                GPIO.digitalWrite(LIGHT, GPIO.HIGH)
        if (now.second == SECOND_OFF):
            if (GPIO.digitalRead(LIGHT) == GPIO.HIGH):
                GPIO.digitalWrite(LIGHT, GPIO.LOW)
        webiopi.sleep(1)
    
    def destroy():
        GPIO.digitalWrite(LIGHT, GPIO.LOW)
  3. html/index.html
    html/index.html はそのままでよいので、チュートリアルのページからコピペする。
  4. /etc/webiopi/config
    いくつか追加する。
    • [SCRIPTS] myscript
      myscript = /home/pi/myproject/python/script.py
    • [HTTP] doc-root
      doc-root = /home/pi/myproject/html
    • [REST]
      gpio-export = 17
      gpio-post-value = true
      gpio-post-function = false
  5. 動かしてみる
    ブート時に自動起動するようにしている時は、そのプロセスをいったん止めて、もう一度起動する。
    $ sudo webiopi -d -c /etc/webiopi/config
    1分ごとの10秒から30秒まではボタンが青に、それ以外は黒になっている。GPIO 17 なので、ピン番号は11。この11番ピンに LED をつないでおくと青と黒とでついたり消えたりしているのがわかる。
というわけで、python script、html、config の関係が何となくわかった。
次回は SPI の ADC をつないでみる。

Raspberry Pi + WebIOPi install

Raspberry Pi に WebIOPi をインストールして I2C の PWM 制御デバイス PCA9685 や SPI の ADC MCP3208 を動かしてみる。

  1. まず、WebIOPi をダウンロード
    ここからダウンロードする。この時点ではバージョン 0.7 の WebIOPi-0.7.0.tar.gz となる。
  2. 解凍してインストール
    解凍して、そのディレクトリに移動し、インストール。
    $ tar xzf WebIOPi-0.7.0.tar.gz
    $ cd WebIOPi-0.7.0/
    $ sudo ./setup.sh
    
  3. インストールした時のメッセージはこう
    WebIOPi successfully installed
    * To start WebIOPi foreground	: sudo webiopi [-h] [-c config] [-l log] [-s script] [-d] [port]
    
    * To start WebIOPi background	: sudo /etc/init.d/webiopi start
    * To start WebIOPi at boot	: sudo update-rc.d webiopi defaults
    
    * Look in /home/pi/WebIOPi-0.7.0/examples for Python library usage examples
    
  4. 動かしてみる
    先ほどのメッセージにあるコマンドを実行してみる。
    $ sudo /etc/init.d/webiopi start
    で、http://<Raspberry Pi の IP アドレス>:8000 をパソコンのブラウザで開く。
    user ID は webiopi、パスワードは raspberry。
    WebIOPi Main Menu が表示される。
Raspberry pi で使いやすいようにエイリアスを作成する
$ ln -s WebIOPi-0.7.0 webopi

この段階で、/etc/webopi に config と passwd のファイルが作成されている。
tutorialに従って、パスワードを変更しておく。
$ sudo webiopi-passwd

ブート時に自動起動するようにセットする。
$ sudo update-rc.d webiopi defaults

解除はこう。
$ sudo update-rc.d webiopi remove
 
I2C や SPI を使うための情報はこちら。これは次回とする。
https://code.google.com/p/webiopi/wiki/DEVICES
https://code.google.com/p/webiopi/wiki/PCA9685