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 がアナログの入力回路。
次に、ふたつの PCA9685。こちらは I2C 接続で、U103 の PCA9685 はアドレスが 0x41 、U102 が 0x40 としている。LED0 から LED15 が出力端子。
ADC MCP3008 に接続する回路の例を示す。フォトトランジスタ NJL7502L を接続する場合はこんな感じ。NJL7502 は表面実装タイプもあるので、購入する時は気をつけること。
PCA9685 と LED の接続はこう。大きな LED を接続する時は FET などで電流を流せるようにすること。
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
次の手順で環境を整える。
#!/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
http://<Your Raspberry Pi IP addr>:8000/app/devices-monitor
この例の場合は、adc0 と pwm0, pwm1 が conf で有効にしてある。
また、Raspberry Pi の IP アドレスは 192.168.0.202 となっている。
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 関係のドライバインストールなどを行う。
- ドライバインストール
$ sudo apt-get -y install python-smbus i2c-tools
- 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
- 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
- /etc/modules の修正
$ sudo nano /etc/modules
で、次の2行を追加する。i2c-dev i2c-bcm2708
- リブート
- I2C の接続確認はこう
$ sudo i2cdetect -y 1
次に、WebIOPi 関係。
- /etc/webiopi/config [SCRIPTS]
[SCRIPTS] myscript = /home/pi/myproject/python/script.py
- /etc/webiopi/config [DEVICES]
ここで「adc0」と「pwm0」「pwm1」という名称は rest で使われるので、MCP3008と PCA9685 を操作するための URL 中に現れる。pwm0 = PCA9685 pwm1 = PCA9685 slave:0x41 adc0 = MCP3008
- 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
- myproject/python/script.py の def setup()
これを追加する。adc0 = MCP3008() pwm0 = PCA9685(frequency=100) pwm1 = PCA9685(slave=0x41, frequency=100)
$ sudo webiopi -d -c /etc/webiopi/configRaspberry Pi の IP アドレスを 192.168.0.202 とすると、次の URL で状態を表示できる。
さらにいろいろやりたい時は、 Javascript か Python でプログラムを作る。それはまた次回。
adc0 の入力電圧を表示する。
http://192.168.0.202:8000/devices/adc0/analog/0/voltadc0 の AD の値を表示する。
http://192.168.0.202:8000/devices/adc0/analog/0/integerpwm1 のチャンネル数を表示する。
http://192.168.0.202:8000/devices/pwm1/pwm/countPCA9685 に値を書き込むのは GET ではなく、POST になるのでこれも次回。
$sudo ./setup.sh skip-apt
/var/log/webiopi に WebIOPi のログがあるので、これを見ると何かあったときに原因がわかるかもしれない。
Raspberry Pi + WebIOPi 準備
前回は Raspberry Pi に WebIOPi をインストールした。
今回は、Tutorial : Framework basisで基本的な動きを見る。
- ホームディレクトリにプロジェクトディレクトリを作成する
- 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)
- html/index.html
html/index.html はそのままでよいので、チュートリアルのページからコピペする。 - /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
- [SCRIPTS] myscript
- 動かしてみる
ブート時に自動起動するようにしている時は、そのプロセスをいったん止めて、もう一度起動する。$ sudo webiopi -d -c /etc/webiopi/config
1分ごとの10秒から30秒まではボタンが青に、それ以外は黒になっている。GPIO 17 なので、ピン番号は11。この11番ピンに LED をつないでおくと青と黒とでついたり消えたりしているのがわかる。
Raspberry Pi + WebIOPi install
Raspberry Pi に WebIOPi をインストールして I2C の PWM 制御デバイス PCA9685 や SPI の ADC MCP3208 を動かしてみる。
- まず、WebIOPi をダウンロード
ここからダウンロードする。この時点ではバージョン 0.7 の WebIOPi-0.7.0.tar.gz となる。 - 解凍してインストール
解凍して、そのディレクトリに移動し、インストール。
$ tar xzf WebIOPi-0.7.0.tar.gz $ cd WebIOPi-0.7.0/ $ sudo ./setup.sh
- インストールした時のメッセージはこう
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
- 動かしてみる
先ほどのメッセージにあるコマンドを実行してみる。
$ sudo /etc/init.d/webiopi start
で、http://<Raspberry Pi の IP アドレス>:8000 をパソコンのブラウザで開く。
user ID は webiopi、パスワードは raspberry。
WebIOPi Main Menu が表示される。
$ 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
https://code.google.com/p/webiopi/wiki/DEVICES
https://code.google.com/p/webiopi/wiki/PCA9685