ロボットと言えば多脚。
(いろんな意味で)入手できるサーボモータは、
デジタル・マイクロサーボ 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系で、上のエラーが出る場合、こちらに対処方法があります