(いろんな意味で)入手できるサーボモータは、
デジタル・マイクロサーボ SG90の10個セットなので、
これで、できそうな範囲を考える。
サーボモータ10個以内だと、2自由度の4脚(Quadruped Robot)って選択肢になる。
ネットで4足歩行ロボットの情報を漁りつつ、Raspberry PiのGPIOでサーボモータを
制御する方法を調べる。
サーボモータの制御は、GPIOからPWM(パルス幅変調)信号をモータ側へ
与えることで回転角度を調節する仕組みらしい。
信号のパルス幅を変える(変調する)ことで、角度も変わる。
Raspberry Pi 2 Model Bの場合、ハード的に精度の高いPWMを扱えるのは、GPIOの
18番と19番(あるいは12番と13番)の二つになるので、これでは最低8個の
サーボモータを動かすには足りない。
ハード(PCA9685搭載のサーボドライバー) を追加する手もあるが、そこまで
したくはない。
ソフトで擬似的にPWM制御が出きるようなのでそれを試す。
すぐ見つかったのは、WiringPiと言う、C言語でGPIOを制御する為のライブラリと、
デバイスファイルに値を書き込むことでサーボモータを制御するServoBlaster。
・WiringPi
WiringPiはC/C++以外にもPythonやPHP用のラッパーを使えば、それらでの使用が可能。
WiringPiはpacmanでArch Linux ARM のリポジトリからインストール可能。
コンパイルとか面倒なことはしたくないので、Pythonで試してみる。
Arch Linux ARMではPython3が標準なので WiringPi2-Python(ラッパー)を
インストールして、 import wiringpi2として呼び出す。
※追記2(2016/05/15 13:35)※
ラッパーのインストール事情が変わったようなので、こちらを参照
インストールはgitで
git clone https://github.com/Gadgetoid/WiringPi2-Python.git cd WiringPi2-Python sudo python setup.py install sudo python3 setup.py installサンプル:
#!/usr/bin/env python # -*- coding:utf-8 -*- import wiringpi2 as wiringpi from time import sleep wiringpi.wiringPiSetupGpio() def movleft(pin): wiringpi.softPwmCreate(pin,0,200) sleep(0.5) wiringpi.softPwmWrite(pin,20) def movright(pin): wiringpi.softPwmCreate(pin,0,200) sleep(0.5) wiringpi.softPwmWrite(pin,10) def movmiddle(pin): wiringpi.softPwmCreate(pin,0,200) sleep(0.5) wiringpi.softPwmWrite(pin,15) movleft(17) movright(17) movleft(17) movmiddle(17)
wiringpi.softPwmCreate(pin,0,200)softPwmCreateの第1引数でGPIO番号を指定し、第2引数でPWM初期値(取り敢えず"0"にしとく)、
第3引数で200を指定して、サーボモータの周期に合わせて20msにする。
wiringpi.softPwmWrite(pin,20)後は、softPwmWriteで指定したGPIO番号にいくつのカウンタを送るかを指定する。
1カウンタは0.1msに固定されているので、20を引数にすれば2.0ms幅の信号が送られる。
(※上のサンプルは、都度softPwmCreateを実行してますが、1回設定すれば良いので、
これは悪い例です。マネしないでください※)
あのー、Pythonってインデントで構文ブロックを判断するんですか?
慣れないと変な間違いをしそう。
一応、動きましたけどね。
・ServoBlaster
さてServoBlaster、これはちと古いのでそのままではRaspberry Pi 2 Model B
に対応していない。
対応版のこちら ServoBlaster-20150219.tgz を使う。
ただし、kernelのバージョンが4.1以上の場合は、コードの修正が必要。
ServoBlaster-20150219.tgzを解凍した中の、servod.c をエディタで開き、
1281行目
if (mknod(MBFILE, S_IFCHR|0600, makedev(100, 0)) < 0)
makedev(100,0) を makedev(249,0) に書き換えたうえで、
"cd ServoBlaster", "make", "sudo ./servod"を実行。
こんな表示が出ればOK。
使い方は簡単で、
echo 0=50% > /dev/servoblaster
のように、ServoBlasterでの番号にどの程度動かすかを指定して、
/dev/servoblasterに書き込むだけ。
パーセンテージ指定の他に、パルス幅の指定や、相対的な増減量指定もできる。
(自分は%指定しか使わないので、他の方法を詳しく知りたい場合は検索してくださ い)
これなら、シェルスクリプトで手軽に使えるね!
さあ、基幹となるサーボモータの制御ができたら、いよいよロボットの作成に移る。
※追記1(2015/11/15 10:45)※
文中では、ServoBlaster-20150219.tgzを使用していましたが、
2015/10/3にServoBlasterが更新され、Raspberry Pi 2 、kernel4.1(以降)に対応しています。
https://github.com/richardghirst/PiBits/tree/master/ServoBlaster
更新版を使っての動作確認が出来ました。
※追記3(2017/04/29 21:30)※
"servod: Cannot parse the hardware name string"
kernel4.9系で、上のエラーが出る場合、こちらに対処方法があります
2015/10/3にServoBlasterが更新され、Raspberry Pi 2 、kernel4.1に対応した模様です。
返信削除https://github.com/richardghirst/PiBits/tree/master/ServoBlaster
(私は、まだ動作確認をしていません。)