2015年6月21日日曜日

IchigoJamで遊ぶ、その3

 その1その2 につづいて、IchigoJam で遊ぶ その3 です。今回は、IchigoJam の I2Cで Adafruit の 16ch PWM Servo Driver を動かしてみました。
 サーボで動かすのは、以前に、ここ とか ここ で使ったおもちゃのロボットハンドです。

 まずは、Servo Driver への送信コマンドを解析するためにArduinoに接続して、Adafruit提供のライブラリのソースを見ながら、ロジアナでI2Cの信号を追いかけました。


 次に IchigoJam に Servo Driver を接続して、手動でコマンドをたたきながら、ロジアナで応答を確認。



 一応、パルス幅設定が正常にに行われ、オシロでもPWM出力のパルス幅が変わることが確認できたので、実際にサーボを接続して、コードから動かしてみました。



 動かしてみたところ。


 コードはこんな感じ。
10 clt:clv:A=#40
20 poke #700,#0,#10,#65,#a1
30 R=i2cw(A,#700,1,#700,1)
40 wait(1)
50 R=i2cw(A,#700,1,#701,1)
60 wait(1)
70 R=i2cw(A,#700,1,#702,1)
80 wait(1)
90 R=i2cw(A,#700,1,#700,1)
100 wait(1)
110 R=i2cw(A,#700,1,#703,1)
120 wait(180)
200 for I=1 to10
210 for B=0 to 1
220 poke #705,#6+B*4,#0,#0,#0,#7
230 R=i2cw(A,#705,1,#706,4)
240 next
250 for B=2 to 4
260 poke #705,#6+B*4,#0,#0,#70,#3
270 R=i2cw(A,#705,1,#706,4)
280 next
290 wait(120)
300 B=0
310 poke #705,#6+B*4,#0,#0,#0,#7
320 R=i2cw(A,#705,1,#706,4)
330 B=1
340 poke #705,#6+B*4,#0,#0,#70,#3
350 R=i2cw(A,#705,1,#706,4)
360 B=2
370 poke #705,#6+B*4,#0,#0,#0,#7
380 R=i2cw(A,#705,1,#706,4)
390 for B=3 to 4
400 poke #705,#6+B*4,#0,#0,#70,#3
410 R=i2cw(A,#705,1,#706,4)
420 next
430 wait(120)
440 for B=0 to 1
450 poke #705,#6+B*4,#0,#0,#70,#3
460 R=i2cw(A,#705,1,#706,4)
470 next
480 for B=2 to 4
490 poke #705,#6+B*4,#0,#0,#0,#7
500 R=i2cw(A,#705,1,#706,4)
510 next
520 wait(120)
530 next
' 以下コメントです。入力不要。
' Adafruit PCA9685 12bitx16ch I2C PWM Driver でサーボ制御。
' 変数説明:
' A: PCA9685のI2Cアドレス
' B: サーボch
' C: PWM幅設定値
' D: PWM幅設定値の上位8bit
' E* PWM幅設定値の下位8bit
' プログラムブロック説明:
' 10 初期化、I2Cアドレス設定。
' 20~120 PCA9685をPWM周波数60Hzで初期化。
' 210~290 グー。
' 300~430 チョキ。
' 440~520 パー。
view raw gistfile1.txt hosted with ❤ by GitHub

2015年6月13日土曜日

LEGO TECHNIC 42036 Street Motorcycle

 久々のLEGOです。テクニックシリーズのストリートバイク 「LEGO TECHNIC 42036 Street Motorcycle」 です。



 積みレゴから比較的部品点数の少なめのものを選びました。他にもトレインシリーズがいくつかとスターウォーズシリーズのスターデストロイヤーも積まれたままになっているんですが・・・。

 まずは、パッケージ。



 開梱。


 それほど、目を引く部品は入っていませんが、やはり、大きくて細いタイヤが目を引きます。あとは、チェーンが小さな部品を30個連結して作るような特殊な部品で、これは、他に用途がないんじゃないかという部品ですが、その2種類くらいかな。

 では、組み立て開始。

 一体、どの辺を組み立てているのかわからないですが、本体のフレームとかでしょうか。


 やっぱりフレームっぽいですね。真ん中が、エンジンが収まる空間かな。


 後輪のサスペンションが付きました。






 後輪がついて、チェーンを掛けるギアも。



 エンジン部分の組み立て。


 エンジンをフレームに乗せて、チェーンを掛けます。チェーンは小さな部品を30個連結しなければいけません。


 前輪、ハンドル。



 本体とつないで、


 バイクになりましたね。


 あとはカールやパイプなどを取り付けていって、


 できあがり。かっこいいですね。フレームに使われているビームのななめの組み合わせってどうやって思いつくんだろう。斜めにつないでいって、最初と最後が合って一周できるように組み合わせるって結構難しいと思うんだけど。









IchigoJamで遊ぶ、その2

 2ヶ月くらい前に IchigoJamを手に入れて、早速タミヤの昆虫ロボットに載せてがらくたを作りましたが、その後、IchigoJamはファームが日々改良されて、色々機能も増えたりしているようです。その中で、昆虫ロボットを作ったときにはアナログ入力が1chしか使えなかったのが、今は2ch使えるようになっていて、このアナログ2chを活かして何かできないかなぁ?と思っていたんですが、なかなか手を動かせずにいました。先日、アマゾンを「ロボット 工作」とかで検索して徘徊していたとき、前回の昆虫ロボットと同じタミヤのロボクラフトシリーズで「ボクシングロボット」というのを見つけました。面白そうなので、早速ポチって、これにIchigoJamとセンサ×2の組み合わせを考えることにしました。


 センサは前回と同じPSD測距センサです。前回は一つだけで手前にものがあったら避ける動作をさせましたが、今回は手前にあるものに向かわせる動作を左右に2つのPSDセンサを使って、やってみようと思います。

 まずは、タミヤのROBO CRAFTシリーズのボクシングロボット(Boxing Fighter)を開梱。



  説明書に従って組み立て・・・の前に、いつものDRV8830 I2Cモータドライバをモータに取り付けます。ロボットのボディ内部に余裕があるので、モータドライバ基板は絶縁テープで巻いて、ボディ内に入れてしまいます。




 モータにノイズ用のコンデンサとドライバへの配線をはんだづけしてギアボックスに取り付け。


 あとは、組み立て。本来リモコンと繋ぐ線を出す切り込みから、電源、GND、I2CのSDA、SCLの4本の線を取り出しています。












 形ができたところで、前回の昆虫ロボットからIchigoJamを取り外して、


 ボクシングロボットの背中にIchigoJamと単3×2本用電池ボックスを取り付けました。



 それから、頭の上にPSD測距センサを左右斜めに向けて取り付け。




 コネクタを差すために簡単なドータボード(シールド)を準備しました。



できあがり。


 この時点ではPSDセンサは縦置きにしていますが、実際に動かしてみて、調整した結果、最終的には横向きに取り付けることになりました。



 プログラムを入れて実際に動かしてみたところ、センサは横向きであまり左右に斜めにしない方向で落ち着きました。



 ボクシングロボット対博士。


 動かしてみたところです。ロボットの左側の足が右側に比べて接地が悪く(短い?)、左方向へはすぐに方向転換できるのですが、右方向へ向くのに時間がかかってしまいます。


 以下、ソースです。
10 clt:clv:A=#64:B=#65:goto 610
110 if C<0 E=1 else E=2
120 if C=0 E=0
130 E=E+(ABS(C)-5)<<2
140 if D<0 F=1 else F=2
150 if D=0 F=0
160 F=F+(ABS(D)-5)<<2
170 poke #700, 0, E, F
180 R=i2cw(A, #700, 1, #701, 1)
190 R=i2cw(B, #700, 1, #702, 1)
200 return
300 ' stop
310 C=0:D=0:gosub 110
320 return
400 ' right punch to left
410 C=0:D=-50:gosub 110
420 return
460 C=50:D=0:gosub 110
470 return
510 C=50:D=-50:gosub 110
520 return
600 ' main
610 P=ANA(0):Q=ANA(2)
620 ?P;",";Q
640 if P>=300 and Q<300 gosub 410
650 if P<300 and Q>=300 gosub 460
660 if P>300 and Q>=300 gosub 510
670 if P<300 and Q<300 gosub 310
680 goto 610
1000 ' 以下コメントです。入力不要。。
1001 ' タミヤのボクシングロボットをDRV8830 I2Cモータドライバと
1002 ' PSD測距センサで動かす。
1110 ' 変数説明:
1120 ' A: 左モータ用DRV8830のI2Cアドレス
1130 ' B: 右モータ用DRV8830のI2Cアドレス
1140 ' C: 左モータのスピード
1150 ' D: 右モータのスピード
1160 ' P: 左PSD測距センサのアナログ値
1170 ' Q: 右PSD測距センサのアナログ値
2000 ' プログラムブロック説明
2010 ' 10 初期化して、メイン処理へ
2020 ' 110~200 モータのスピード設定
2040 ' 410~420 右パンチを出して、左方向へ進む
2050 ' 460~470 左パンチを出して、右方向へ進む
2060 ' 510~520 左右のパンチで前進
2070 ' 600~680 メイン処理。PSD測距センサの値で動作分け。
view raw gistfile1.txt hosted with ❤ by GitHub