sabo laboratory

備忘録的な技術系ブログです。組み込み、ガジェットなどなどについて書いていきます。

【RaspberryPi】サーボをAdafruit製モータドライバーを使ってI2Cで制御

サーボモータをI2Cでたくさん制御したい!

ラズベリーパイにはハードPWM出力ができるGPIOがある。 しかし、それでは1CHしか制御できないし、しかもラズベリーパイ本体にノイズがのって動作が不安定になることも。 そこで、サーボモータドライバを利用、しかもI2C通信で2本の信号線でたくさんモータが制御できる!

I2Cってなんだ?

私は正直詳しく知らなかった。下記リンクを参照。

利用するモータードライバ

Adafruitから発売されているサーボモータードライバを利用する。本来ならばAruduino向けに作られているものだが、 公式サイトでもラズベリーパイでの動作を確認してくれている。

今回は下記のSwitchScienceから購入。品揃えも抜群だし、発送も早くて、梱包もおしゃれです。 ただ、常に在庫切れの商品が多数あり、欲しいものが買えない状態・・・。

今回は上記のドライバを購入しましたが、ネットに多く情報があるのは下記のドライバ。 私も本当はこちらが欲しかったが、在庫がなかった・・・そして待てなかった・・・ 性能としてはほとんど変わらないと思います。

モータドライバー利用準備

公式サイトに英語ですがマニュアルが丁寧に書かれています。 発送される製品自体には紙のマニュアルも何もないので、下記サイトを参照しながらはんだと配線、環境セットアップをしていきます。

*Shield Connections | Adafruit 16-channel PWM/Servo Shield | Adafruit Learning System
https://learn.adafruit.com/adafruit-16-channel-pwm-slash-servo-shield/shield-connections

日本語だと、下記サイトで解説されています。

注意する点として

  • 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ピンならば動くようだ。 私のはんだ不良だろうか?原因はよくわからないが、ともかく動いたのでよし。

ただし、このピンにラズベリーパイの電源をつけたまま挿すと、電圧降下が発生してラズベリーパイが再起動してしまうので注意。