【RaspberryPi】サーボをAdafruit製モータドライバーを使ってI2Cで制御
サーボモータをI2Cでたくさん制御したい!
ラズベリーパイにはハードPWM出力ができるGPIOがある。 しかし、それでは1CHしか制御できないし、しかもラズベリーパイ本体にノイズがのって動作が不安定になることも。 そこで、サーボモータドライバを利用、しかもI2C通信で2本の信号線でたくさんモータが制御できる!
I2Cってなんだ?
私は正直詳しく知らなかった。下記リンクを参照。
- I2C通信の使い方
http://www.picfun.com/c15.html
利用するモータードライバ
Adafruitから発売されているサーボモータードライバを利用する。本来ならばAruduino向けに作られているものだが、 公式サイトでもラズベリーパイでの動作を確認してくれている。
- Adafruit 16-Channel 12-bit PWM/Servo Shield - I2C interface ID: 1411 - $17.50 : Adafruit Industries, Unique & fun DIY electronics and kits
http://www.adafruit.com/product/1411
今回は下記のSwitchScienceから購入。品揃えも抜群だし、発送も早くて、梱包もおしゃれです。 ただ、常に在庫切れの商品が多数あり、欲しいものが買えない状態・・・。
- Adafruit I2C接続16チャンネル12ビットPWM/サーボ シールド - スイッチサイエンス
https://www.switch-science.com/catalog/1411/
今回は上記のドライバを購入しましたが、ネットに多く情報があるのは下記のドライバ。 私も本当はこちらが欲しかったが、在庫がなかった・・・そして待てなかった・・・ 性能としてはほとんど変わらないと思います。
- PCA9685搭載16チャネル PWM/サーボ ドライバー (I2C接続) - スイッチサイエンス
https://www.switch-science.com/catalog/961/
モータドライバー利用準備
公式サイトに英語ですがマニュアルが丁寧に書かれています。 発送される製品自体には紙のマニュアルも何もないので、下記サイトを参照しながらはんだと配線、環境セットアップをしていきます。
*Shield Connections | Adafruit 16-channel PWM/Servo Shield | Adafruit Learning System
https://learn.adafruit.com/adafruit-16-channel-pwm-slash-servo-shield/shield-connections
日本語だと、下記サイトで解説されています。
- 首ふりwebカメラを作ってみる(4)(サーボ制御編) - うつなエンジニアの日記
http://raspuser.blog.fc2.com/blog-entry-8.html
注意する点として
- Adafruit_PWM_Servo_Driver.pyを開きコードを修正すること。ラズベリーパイB+を利用している場合は下記の様に修正。
#self.i2c = Adafruit_I2C(address) self.i2c = Adafruit_I2C(address,1)
- 上記の修正でもうまく動かない場合は、Adafruit_I2C.pyを下記のように修正する
def __init__(self, address, busnum=1, debug=False): self.address = address # By default, the correct I2C bus is auto-detected using /proc/cpuinfo # Alternatively, you can hard-code the bus version below: # self.bus = smbus.SMBus(0); # Force I2C0 (early 256MB Pi’s) self.bus = smbus.SMBus(1); # Force I2C1 (512MB Pi’s) #←この行のコメントアウトを外す #self.bus = smbus.SMBus(busnum if busnum >= 0 else Adafruit_I2C.getPiI2CBusNumber()) #←この行をコメントアウト self.debug = debug
またもやここでつまづいた・・・
上記の修正を加えても”Error accsessing 0x40: Check your I2C address”のエラーが発生して動かない・・・。 もしかして配線ミス?ということで、ためしにモータードライバ上に挿しているGNDピンを差し替えた。
動いた!
どうやら、モータードライバの5Vピンの隣のGNDピンではうまく動かず、その更に隣のGNDピンならば動くようだ。 私のはんだ不良だろうか?原因はよくわからないが、ともかく動いたのでよし。