2015年9月26日土曜日

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

ロボット製作は疎か、電子工作すらやったことのない文系なので、
ゼロからの出発は無理。
参考になるサイトを探し回った結果、以下のページを参考にした。

http://www.robotshop.com/letsmakerobots/project-sc-qr-1-with-more-videos
http://robotshop.com/letsmakerobots/arduino-quadruped-walking-robot
http://www.robotshop.com/letsmakerobots/chopstick-junior-10
(『参考にした』と言ったら、先方に失礼なんですが、、、。)

動画を何度も見て、頭の中でイメージを固めていく。
で、図面など描ける筈もないので、簡単なスケッチを書く。

上のスケッチから、ダンボールや厚紙で、具体的な形にしてみる。
右の白いのは、平行リンクっぽい足の動きを確かめるための物で、大きく作ってある。

SG90をブラケットにはめ込んでみた。

何となく、具体的なイメージが掴めたら、用意した『硬質塩ビ板』で作る。
用意した塩ビ板が(事もあろうに)1mm厚だったため、実際にサーボモータや
脚を取り付けてみると、胴体がペランペランで歪んでしまった。
今更、素材を変更して作り直す気力はなかったので、、、。
補強用の桟を取り付け、ブラケットも強度が必要な部分は2枚重ねにした。
これで、Raspberry Pi 2とブレッドボードを載せても、何とか支えることができる
ようにになった。

後は、いよいよ配線してServoBlasterでマイクロサーボSG90を制御するための
シェルスクリプトを動かすことになる。

果たして、この自作4足歩行ロボット(もどき)は動くのだろうか?

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系で、上のエラーが出る場合、こちらに対処方法があります

2015年9月21日月曜日

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

Raspberry Pi 2  Model B を買っちまった。

最初はNOOBSを使ってRaspbianをインストールした。
 簡単だった。

で、、、?

やっぱり、Arch Linuxを入れたいじゃないですか。
先ずは、現在使用中のPCでの作業。

1  ARM用のArchLinuxARM-rpi-2-latest.tar.gzをダウンロードしてroot権限で解凍
2  ラズパイ用のmicroSDカードをフォーマット(例によってGpartedを使う)
パーティションは二つに分ける
boot用にFAT32で100M、それ以外をext4でフォーマット
3  先に解凍してできたディレクトリからbootディレクトリの『中身』
microSDカードのFAT32領域にコピペ
(※bootディレクトリのコピペではない!!※ )
その他はディレクトリごとext4領域へコピペ
  4 出来上がったmicroSDをRaspberry Piへ挿して、電源を繋ぐ

(上記方法で上手く行かなければ、こちらのとおりに実行する)



後は、Arch Linuxの諸々の設定をする『だけ』。
無線LANを使いたい場合は、予めwirelwsstools、wpa_supplicant、dialog、
そしてlibnlのパッケージを別途ダウンロードしてmicroSDへ入れておき、
Raspberry Piでの起動後にpacman -U でインストールする。
wifi-menuを使って無線LANの設定をする。
(※もし"Calling CRDA to update world regulatory domain" って出たら、
 wireless-regdbとcrdaパッケージを入れ、 /etc/conf.d/wireless-regdomの
 WIRELESS_REGDOM="JP" と書かれた行をアンコメントして再起動※)

一通りLチカの実験等をしながら、思った。

「次はサーボモータの制御実験かな。
ん?どうせなら、ロボット作ってみようぜ」ってね、、、。
(済みません。上の台詞はフィクションです。
実際は、DCモータをモータードライバで制御して、車輪かキャタピラの
自走ロボットを作り、Webカメラを搭載して動くピーピングトムにしようと
思ったんです。でも、そろえなきゃならない物が意外と多そうなので、
止めました。)