2015年9月23日水曜日

Raspberry Pi 2 4足歩行ロボットを作ってみよう(その1)

ロボットと言えば多脚。

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

1 件のコメント :

  1. 2015/10/3にServoBlasterが更新され、Raspberry Pi 2 、kernel4.1に対応した模様です。
    https://github.com/richardghirst/PiBits/tree/master/ServoBlaster
    (私は、まだ動作確認をしていません。)

    返信削除