2014年2月27日木曜日

タミヤの楽しい工作シリーズ レスキュークローラ で BBクローラ

 Google+ でタミヤの楽しい工作シリーズを作った人の投稿を見て、久々に作りたくなったので、何種類か買ったまま、積んである在庫の中から レスキュークローラを引っ張り出してきて作ることにしました。みんな大好きタミヤの楽しい工作シリーズは、自分も大好き。


  モータ3つを有線リモコンでコントロールできるようになっていて、うち2つは左右のクローラを前後に回転、残り1つが車体前部のアームを上下にコントロールできるようになっています。リモコンでアームを上下にコントロールしながら上手く障害物を乗り越えるように操作するということでしょうか。

 箱を開けてみます。結構色々なパーツが入っていて、楽しそう。


 まずは、下準備でアーム用の棒状のパーツと本体ベースになるプレート状のユニバーサルプレートを指定のサイズにカットしていきます。



 次にアーム上下を操作するクランクギアボックスを組み立てます。


 続いて、クローラを駆動する両輪型のギアボックスを組み立て。




 クランクギアボックスをベースプレートに取り付け。


 クローラ駆動用のギアボックスをクランクギアを取り付けたベースプレートの反対面に取り付けるのですが、ここで、ちょっと気が変わって、説明書通りに作るのを放棄しました・・・。
 手持ちのユニバーサルプレートをもう一枚加工して、そちらにクローラ駆動用のギアボックスを取り付けることに。


 タミヤの楽しい工作シリーズで 同じような機構をもった アームクローラ というのがあって、こちらはアーム部分の上下をモータで制御せずに、成り行き任せになっているんですが、動画等をみるとその方法で十分というかなまじモータでコントロールするよりもいい感じで動いているように見えるので、そちらの方式を採用することにしました。前進中に障害物に乗り上げると、アーム部分のクローラの回転で障害物を下側に巻き込もうとして、結果アームが上方向にせり上がって、障害物の上に乗り上げて行くような動作をするはずです。

 と、いうわけで、足回りを組み立てていきます。


 モータを取り付けて、


 クローラ(履帯)を取り付けます。


 裏側。


 続いて、アーム部を組み立てます。



 履帯をはめたところ。


 本体と合体させて、間の履帯も取り付けました。


 かっこいい。こういう感じ、好きです。

 上部のクランクアームをやめて、別のユニバーサルプレートを追加したのは、元々有線リモコン式でリモコン側から有線経由でパワー供給する仕組みなんですが、これを、バッテリー搭載して無線化してみようと思ったためです。試しに小型のモバイルバッテリと小型の無線LANルータを載せてみたところ、ピッタリサイズ。ただし、実際にはバッテリに接続するUSBコネクタや無線LANルータへの電源供給コネクタやLANケーブルコネクタに挿さるものが出っ張るので、それぞれを斜めに配置して左右に中心をずらすように配置してやろうと思っています。


 モバイルバッテリの高さ(厚み)が23mm~24mm位なので、10mmと14mmのプラ支柱を連結してベースプレートに立てます。



 せっかくバッテリを積んだので、マイコンを積みたくなります。今回は Beaglebone Black で行ってみようと思います。ただ、BBB はユニバーサルプレートには上手く載ってくれません。これが Raspberry Pi だとネジ穴がいい位置(5mm単位の穴と重なる位置)にあり、そのまま支柱を立てて載せられるのですが、BBBはダメです。そこで、間にアクリルの板でマウンタを作成してネジ穴位置を調整します。


 支柱とネジにはプラスティック製を使用しました。これは、絶縁の問題もあるんですが、今回マウンタの切り出しや穴あけは採寸せずに現物合わせで適当にやっているので、かなり位置がずれています。金属の硬いネジだとずれてしまうと当然ハマりませんが、プラスティック製は弾力で吸収させて、位置ずれをごまかすことがある程度できるためです。


 キットに元々入っていたベースプレートからクランクギアを外してしまい、BBBのマウンタを取り付けました。


 あとは、無理やり?ナットで止めて、はみ出したプラネジの部分をニッパで切り落として、ネジの長さも調整します。

 レスキュークローラのベースプレートの支柱に固定して、バッテリ・無線LANとBBBの2階建て構造にしました。
 ただ、モバイルバッテリに挿したUSBコネクタや無線LANに挿した電源供給用マイクロUSBとBBBへ接続するLANケーブルが予想以上にかさばってしまい、非常に収まりの悪い配置になってしまいました。




 さて、次に、モータ駆動周りを考えます。BeagleBone BlackなのでPWMも複数利用できますが、コントローラをRaspberry Piに変えたりすることも考えて、I2Cモータドライバを使ってみようと思います。プログラムもそのほうが楽なんじゃないかな?


 まずは、BeagleBone Black とI2Cモータドライバ単体で動かしてみます。


 I2Cモータドライバは例によってDRV8830です。部品棚にはストリナのモジュールと秋月のモジュールが転がっているんですが、お試しは秋月版で行ってみます。コネクタや配線は違いますが、制御方法は当然共通なので、実装するときは現物合わせでどちらかを選定すればいいやということで、秋月版で試しましたが、実際に基板に載せるときは、実装ステペース的にストリナ版を使うことになりました。



 まずは、モータを動かすところからですが、一応、I2Cコンパスとジャイロも載せられるようにしました。BeageleBone 単体でとりあえず、モータが回転することを確認。


 クローラに載せて実装します。





 正面から見ると綺麗に収まっているようにみえるんですが・・・・


 実は後ろ側がUSBケーブルでグチャグチャ・・・


 なにか綺麗に収める、または、配線できる方法があるといいんですが・・・

 とりあえず、クローラをテスト稼働。


 現時点では特にセンサ情報のフィードバックや制御は行っていませんが、とりあえず、プリセット的にプログラムして、走行テスト。


 このくらいの山は乗り越えられるようです。今後、センサ(コンパス、ジャイロ)等を使えたらいいなと考えています。











2014年2月9日日曜日

BrickPi お試し その3 (PORT_AとBのモータが動かない件の調査)

 BrickPi を使い始めて、すぐ(多分、初日、もしかすると、初期不良?)、モータのPORT_AとPORT_Bが効かなくなりました。はじめてサンプルプログラムを動かした時は動いたような?動かなかったような?はじめて動かした時はモータポートのCとDを使ったような気もするし・・・。そのあたりは曖昧なんですが、結果的に今はPORT_AとPORT_Bはまともに動きません。PORT_Aは片方向には回転するんですが、動きがおかしいです。また、PORT_Bは全く回転しません。(もちろん、同じモータをPORT_CかDにつなげば期待通りの動きをします。)



 そこで、まずは、公開されているBrickPiの回路図を参照してみました。実際のボード上の部品を見ていてなんとなく予想がついてはいましたが、PORT_AとB側とPORT_CとD側で回路がわかれていて、それぞれ別のモータドライバIC(SN754410)による実装となっています。となると、PORT_AとB側のこのSN754410が怪しいので、ロジアナで入出力を調べてみることにしました。


 まずは、正常なPORT_Cの入出力をロジアナでモニタしてみます。


 上から3つA0~A2が入力信号で、A0とA1がPWM入力とEnable信号の組み合わせ、A2が方向入力です。A2の方向入力の切り替えで、A3とA4の出力信号が変化しています。A3の位相が反転(On/Offのデューティ比が反転)して、同時にA4側のレベルが反転しています。結果的にモータは同じ速さで逆向きに回転することになります。これが、正しい動き。

 次に問題のPORT_AとPORT_Bを同じように調べてみました。






 A2の方向切り替え信号に怪しい波形が出ています。HブリッジICへの入力の時点ですでにおかしい(AtmelのコントローラATMEGA328からの出力)のでしょうか?


 ただ、もう片方は、PWM信号を入力している(Enableにもなっている)のに出力がHに張り付いたままになっていて、こちらはHブリッジICが機能していないように見えます。

 まずは、試しにSN754410 を入手して、交換してみるという感じでしょうか?SN754410自体は割りとポピュラーなHブリッジドライバICなので、秋月等でも手に入ると思われます。通販で部品入手したりして、調査の続きは来週だな・・・。



2014年2月4日火曜日

BrickPi お試し その2

 先日、BrickPi を入手して、ひと通りの設定を行いましたので、簡単なプログラムで動作を試してみようと思います。試すにあたって、LEGOの機構というか駆動モデルとして、この辺りを組み立ててみました。が、Instruction通りに組んでもずれていたりするので、適当に修正してやる必要があります。今回は、NXTモータの代わりにEV3を使ったので、取付軸や穴の形状も少し違うのでそこも適宜変更しました。
 Bluetooth接続したDualShock3コントローラの左右のアナログスティックの上下方向でロボットの左右のクローラのスピードをコントロールするようなプログラムを動かしてみました。


#include <stdio.h>
#include <math.h>
#include <time.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>

#include <stdlib.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/joystick.h>

#include "tick.h"
#include <wiringPi.h>
#include "BrickPi.h"

#define MAX_ANALOG_RANGE (32767)
#define MIN_ANALOG_RANGE (-32767)
#define ANALOG_RANGE (MAX_ANALOG_RANGE - MIN_ANALOG_RANGE)

#define MAX_MOTOR_SPEED (300)

// grobal valiable.


// function prototype.


// main.
int main()
{
 int result;
 int motor1, motor2;
 int fd_j;
 char inp;
 int *axis;
 struct js_event js;
 int speedL , speedR;
 int i;

 speedL = 0;
 speedR = 0;
 axis = (int*)calloc(4, sizeof(int));
 for (i = 0; i < 4; i++)
  axis[i] = 0;

 // Open Joystick's file.
 if ((fd_j = open("/dev/input/js0", O_RDONLY)) < 0)
 {
  printf("Error in Opening Joystick.\n");
 }

 ClearTick();

 result = BrickPiSetup();
 if (result) return 0;

 BrickPi.Address[0] = 1;
 BrickPi.Address[1] = 2;

 // select the ports to be used by the motors.
 motor1 = PORT_D;
 motor2 = PORT_C;
 // enable motors.
 BrickPi.MotorEnable[motor1] = 1;
 BrickPi.MotorEnable[motor2] = 1;

 // setup the properties of sensors for the BrickPi.
 result = BrickPiSetupSensors();
 // set timeout.
 BrickPi.Timeout = 3000;
 BrickPiSetTimeout();
 
 if (!result)
 {
  while(1)
  {
   // read joystick.
   if (read(fd_j, &js, sizeof(struct js_event)) == sizeof(struct js_event))
   {
    switch (js.type & ~JS_EVENT_INIT)
    {
    case JS_EVENT_AXIS:
     axis[js.number] = js.value;
     break;
    default:
     break;
    }

    // axis values to speed.
    printf("axis[1]: %6d, axis[3]: %6d    ", axis[1], axis[3]);
    speedL = (int)((double)axis[1] / (double)ANALOG_RANGE * (double)MAX_MOTOR_SPEED * -2.0);
    speedR = (int)((double)axis[3] / (double)ANALOG_RANGE * (double)MAX_MOTOR_SPEED * -2.0);
    printf("SpeedL: %3d,   SpeedR: %3d\n", speedL, speedR);

    BrickPi.MotorSpeed[motor1] = speedL;
    BrickPi.MotorSpeed[motor2] = speedR;

    BrickPiUpdateValues();

   }

   // sleep for 10ms
   //usleep(10000);
   
  }
 }

 return 0;
}

 DualShock3と
 
   sudo sixad -start

で、コントローラのPSボタンを押して接続して、プログラムを実行します。
 とりあえず、それっぽく動いているんですが、実は、はじめモータをポートAとBにつないで動かしていたんですが、途中で動きがおかしくなって、ポートCとDに差し替えて動かしています。もしかして、もう壊れた?まだ、2~3日しか使ってないのに・・・。ハードがおかしくなったのか、週末に切り分け・調査を行ってみます。

2014年2月2日日曜日

LEGO 79111 THE LONE RANGER Train Chase と その電動化

 今回のLEGOは LEGO 79111 THE LONE RANGER Train Chase です。


 ローレン・ローレン・ローレン♪~。と、別にローン・レンジャーのファンとかそういうんじゃ全然無いです。ただ単に「汽車」のモデルが作ってみたかっただけ・・・。
 「LEGO 10194 エメラルドトレイン」というのが本当は作ってみたかったんですが、既に廃盤でプレミアが付いて、価格が上がってしまっているので、今回はこちらで妥協しました。

 まずは、外箱ですが、



 上では「妥協」したと言いましたが、なかなか、面白そう。ミニフィグもたくさんついています。開梱したところ。


 結構、箱にパンパンにつまっていましたが、レールが結構入っているので、これが、かさばっていたみたい。


白馬が入っています。今年の干支ですね。

 まずは、先頭の機関車。





 なんとなく、それっぽい面影が出てきました。


 牛よけ。



 汽車っぽくなってきました。





 まずは、機関車のできあがり。なかなか、カッコいい。






 続いては、石炭(を積んである)車。




 出来上がり。



 機関車と連結します。





 正直、あまり期待してなかったのですが、結構、カッコいい汽車が出来上がりました。期待以上。おもったよりもカッコよかっかので、こいつを走らせてみたくなりました。そこで、トレインモータを付けて動力化してみます。

 汽車(機関車)部分にトレインモータを取り付けるのは難しそうなので、石炭を積んでいる車両に仕込むことにします。


 台車の部分を取り外して、



 トレインモータに替りのベースになる部分を組んでいきます。


 下の写真ではオレンジのパーツで両側を止めていますが、実際に上部分を載せるときには後ろ側は上部分にブロックが入っていて、そのブロックで押さえることができた(というか競合した)ので外しています。



 まずは、トレインモータを取り付けました。




 次に、ちょっと強引ですが、赤外線リモコン受信機を同じく石炭を積む車両に、そこから線を伸ばして、後ろに連結した貨物車両にバッテリを積みました。



  ちょっと、見た目が良くないですが、とりあえず、これで動かせるはず。