Raspberry Pi でタミヤのレスキュークローラーを制御

先日作成したRaspberry Pi用モータードライブ基板で、子供が持っているタミヤのレスキュークローラーを制御してみた。

RescueRobo1

タミヤのレスキュークローラセットを改造。

 

案外、パーツを搭載する場所が無い。本来後ろ上下動するフックが付いているのだが、これはあまり使わないとの子供の意見もあり、取り外した。

RescueRobo2

背中にRaspberry Pi を背負っている。 とぐろを巻いているのはWebカメラのケーブル(長すぎるのだが切り詰める勇気がない)。

 

Raspberry Piの電源にはモバイルバッテリー、動力用には単三型Ni-Hを4本使用。
モバイルバッテリーとRaspberry Piとモータドライブ基板の3層構造になっている。
できればバッテリーはRipoに替えて一つにまとめたいところであるが・・・。

RescueRobo3

モバイルバッテリー、Raspberry Pi、モータードライバの三層構造。 やっぱりカメラのケーブルが邪魔

 

キュリオシティっぽく、RCサーボを使ってカメラを上下左右に制御できる様にしてみた。

RescueRobo4

WebカメラとRCサーボ

 

画像を表示しているところ。

RescueRobo5

画像を見ながらコントロール

 

これはWindows側の制御画面。VisualC#2010Expressで作成した。
今のところマウスでボタンを押して制御しているが、これをOpenStickでコントロールしたい。

RescueRobo6

制御画面。3x3に並んでいるボタンはクローラー(キャタピラ)の回転制御。UP,Downボタンは前部クローラの上下、その右のスライダーはモーターのパワー調節。下の二つのスライダーはカメラの向き(RCサーボ)を制御する。

無線LANで接続し、画像を見ながら家中を探検でるので、なかなか楽しい。

イプシロンロケット打上げ

ここ熊本は鹿児島県とは隣接している。という事で見てきました。イプシロンロケット打上げ。
8/27は平日だったので見に行けなかったが、幸か不幸か延期となり9/14に再設定。 今回は土曜日で、しかも3連休の初日とあって行きやすい。

朝8時に出発して志布志方面から現地に向かったが、近づくにつれて渋滞が激しくなり、肝属川を渡ったところで警官に「この先は渋滞が激しいので他から見た方が良い」とのアドバイスを受けた。 でもやはり近くから見たい。 行ける所までは進んでみる事にした。 結局、見学施設までは行けなかったが内之浦湾の対岸から見る事ができた。

LiftOff1

お、とんだ!まだ音は聞こえてこない。

LiftOff2

ものすごい音と共に上昇していく。

RocketRoad1

あっという間に飛び去った。  「あのロケットロードが流れるまでの余韻 それを含めて打ち上げって言うんだ」 byデニール・ヤング@宇宙兄弟

 

やっぱり映像で観るのとは違うド迫力。来てヨカッタ。

Raspberry PiでRCサーボ制御 ~Wiring PiのsoftServo機能インストール~

先日作ったモータードライブ基板では、RCサーボを2個まで接続できる端子を設けた。
動作確認の際、WiringPiのsoftServo機能を使ったCのプログラムをコンパイルすると、”softServo.h”が見つからないというエラーが出た。

WiringPi関係のヘッダ類は/usr/local/include下にインストールされている様だが、softServo.hだけは見当たら ない。 そこでsoftServo.hをソースディレクトリから/usr/local/includeにコピーしてみた。 そして再びコンパイルするとヘッダは見つかった様だが、今度 は”softServoSetup”等の関数がリンクできないというエラーが出た。

ライブラリ関係は”/usr/local/lib/libwiringPi.so”としてインストールされているが、
’$ nm libwiringPi.so | grep Servo’ コマンドを実行してみても何も出ないので、どうやらこのライブラリ内にsoftServo関係が含まれていない様だ。

そこでソースディレクトリ内の Makefileを見ると、諸々のCソース類やその他の記述がある中、sortServo関係だけは記述されていない様にみえる。 そこでMakefileを次の様に 変更した上で再インストールすると、ライブラリにsoftServo関連の関数が含まれた状態でインストールされた。

pi@raspberrypi ~/wiringPi/wiringPi $ diff -C 1 Makefile.ORG Makefile
*** Makefile.ORG        2013-08-29 12:13:07.683625400 +0000
--- Makefile    2013-09-11 13:41:09.297999252 +0000
***************
*** 49,51 ****
wiringPiSPI.c wiringPiI2C.c                             \
!               softPwm.c softTone.c                                    \
mcp23008.c mcp23016.c mcp23017.c                        \
--- 49,51 ----
wiringPiSPI.c wiringPiI2C.c                             \
!               softPwm.c softServo.c softTone.c                        \
mcp23008.c mcp23016.c mcp23017.c                        \
***************
*** 99,100 ****
--- 99,101 ----
@install -m 0644 softTone.h             $(DESTDIR)$(PREFIX)/include
+       @install -m 0644 softServo.h            $(DESTDIR)$(PREFIX)/include
@install -m 0644 wiringPiSPI.h          $(DESTDIR)$(PREFIX)/include
***************
*** 140,141 ****
--- 141,143 ----
@rm -f $(DESTDIR)$(PREFIX)/include/softTone.h
+       @rm -f $(DESTDIR)$(PREFIX)/include/softServo.h
@rm -f $(DESTDIR)$(PREFIX)/include/wiringPiSPI.h
***************
*** 176,177 ****
--- 178,180 ----
softPwm.o: wiringPi.h softPwm.h
+ softServo.o: wiringPi.h softServo.h
softTone.o: wiringPi.h softTone.h

WiringPiのインストールはこの本を参考にインストールしたのだが、本の例ではWiringPiのバージョンが1.12であるのに対し、実際にインストールしたのは2.13で、どうやらこのバージョンではMakefile内にsoftServo関係が入れ忘れられている様だった。

Raspberry Piで遊ぼう

Raspberry Piで遊ぼう (ラトルズ刊)

以上でテストコードは無事コンパイルでき、RCサーボがシャコシャコ動作する事が確認できた。

Raspberry Pi のPWM出力の周波数

先日作ったモータードライブ基板ではドライバICとして東芝TA7291Pを用いている。このICはマブチモータークラスを駆動するのにちょうど良い電圧範囲なので、以前、赤外線リモコン戦車を作った時にも使用しており馴染みがある。 そしてまた使う事もあるかと思い買っておいたのがパーツ箱に4個程入っていたのだ。
で、このIC、モーターに加える電圧を制御する端子があるので、今回の基板ではRaspberryPiのPWM出力を与えてみる事にした。  そこでまずはPWMの周波数がどの程度か、資料が見当たらなかったので実測してみた。

PWM値=512(Duty=50%)のとき・・・半周期1.6μSなので312.5KHz

RaspiPWM=512

PWM=512(Duty=50%)

PWM値=256(Duty=25%)のとき・・・H側はほぼ1.6μSのままでL側だけ時間が伸び、150KHzとなっている。

RaspiPWM=256

PWM=256(Duty=25%)

PWM値=789(Duty=75%)のとき・・・今度はL側が1.6μSでH側が伸び、周波数はやはり150KHzとなっている。

RaspiPWM=768

PWM値=768(Duty75%)

どうやらHもLも最小幅は1.6μSで、あとはどちらかが伸びていくという動きをする様だ。という事は最大周波数は約313KHzで、最小は1/(16μS×1024)=610Hzという計算になり、実測するとほぼその通りであった。結構幅が広く、周波数が低いときには綺麗にリプルをとるのは難しい気がする。
とりあえず手持ちのL=330μHとC=10μFでフィルタを組んでみた。カットオフ周波数は約2.8KHz。これでもモーターの回転数はそれなりに制御できている。

 

Raspberry Pi の拡張基板 その3 ~両面基板に挑戦~

先日は両面基板を切削する際、裏返して貼り付ける位置がピッタリ合わず失敗した。
そこで今回は位置を合わせる方法を工夫してみた。

  1. まず、基板CADでの設計段階で基板の左右の端から2.54mmのところにそれぞれ穴を開ける事にする。 この二つの穴は裏返すと左右入れ替わるが同じ位置に穴が来る様にするのだ。
  2. 表面を切削する時、上記二つの穴だけは基板を突き抜けてCNCのベース(MDFボード)まで穴を開けてしまう。
  3. この二つの穴にピアノ線を差し込む。
  4. 裏返す時、ピアノ線だけ残して基板を取り外し、裏返して再びピアノ線にさしこむ様にして基板を貼り付ける。
  5. ピアノ線を抜いて裏面を切削する。

穴にピアノ線を差し込んだ写真・・・

左右の端から2.54mmにあけた穴にピアノ線を差し込む。

そして出来上がった両面基板がこれ。。。

裏面

表面

どちらもパッド内に穴が開いており、使用に問題はなさそう。パッドを大き目にした事による安心感もある。

そして部品を実装した。ついでにRCサーボ用コネクタも2個つけておいた。全部同時に動作させている写真・・・

ありあわせのモーター3個とRCサーボ2個を制御

ほぼ全て手持ち部品で完成した。
これを息子のおもちゃに載せる予定なのだ。

Raspberry Pi の拡張基板 その2

両面基板を削ってみたが、見事に失敗した。

RaspiMD基板失敗-裏

裏面。切削と穴あけを連続して実行したので穴とパターンが、まあ使える程度に一致している。

RaspiMD-失敗基板-表

表面。一旦基板を取り外し、裏返しに貼り付けて切削した。慎重に位置を合わせたつもりだが、穴とパターンがずれている。ここまでずれると使うのは厳しい。

予想通り、基板を裏返しに取りつける際の位置合わせが難しい。確実に位置を合わせる方法を考えているので、もう一度トライする予定。
また、パッドの直径も小さすぎた。できるだけ大きくなる様に変更しよう。

Raspberry Pi の拡張基板

Raspberry Piでマブチモーターを制御したくなったので、モータードライバの基板を作り始めた。
Arduinoで言う「シールド」の様にRaspberry Piの上に拡張基板を重ねる構造で作成開始。
例によってKi-Cadで基板を設計してCNCで切削したまでは良かったのだが、ここで大きな勘違いをしている事に気付いた。

Raspberry Pi 拡張基板

Raspberry Pi と拡張基板とピンソケット

Raspberry Piの拡張コネクタはボードの上側にピンヘッダが出ているので、拡張基板側のピンソケットは下に取り付ける必要がある。  しかし拡張基板は上を部品面、下を半田面として作成してしまったので、ピンソケットを下向きに取りつけると半田付けができないのだ。
Arduinoも同じ構造なので慣れた人には当たりなのかもしれない・・・。

基板を裏返して再作成しようかとも考えたが、半田面を上にすると、今度はリード部品の中に半田面側には実装できないものがある。  という事はやはり両面基板にするか、全部品を表面実装タイプにするのが正しい道なのかな・・・。

両面基板を切削するなら途中で基板を裏返す必要がある(もちろん手作業で)。この時、精度良く取り付けられる自信がない。
他に良い方法が無いか思案中。 うーん、とりあえず風呂入ろ。