今日のガラクタは ST Nucleo STM32F103 です。mbedの開発環境に対応していて、Arduinoとピン互換(ただし、I/Oは3.3V)だそうです。スイッチサイエンスさんで入手しました。このST Nucleoのシリーズは値段が一緒でCortex M0、M3、M4のCoreの物があり、F103はM3でFlash128kBです。M3でもFlashの容量が512kBと大きいL152というのもあるんですが、Visual GDBのコンパイラがサポートするSTM32デバイスにF103はあったんですが、L152はなかったので、あえてF103の方を選びました。まずは、mbedでのお試しですが、そのうち、mbedではなく素で使って見るときにVisual GDBでビルド・デバッグが試せたらいいなと思ったので。
さて、例によって、使い道があるわけではありません。ただ単に、新しいものが好きで、ちょっとだけいじってみたいだけです。今回はmbedのクラウド開発環境からLチカサンプルのプロジェクトをダウンロードして、ローカルでデバッグ(ステップ実行)を試してみます・
まずは、開封して、外観はこんな感じでArduino配置のピンの外側に独自のピン配置が用意されていて、基盤表裏両側にピンヘッダが突き出た形になっています。
mbed のオンラインコンパイラで「ST Nucleo F103RB」というデバイスが選択できるので、サンプルのLチカ(blink_led)をテンプレートで作成しました。
クラウドでビルドしてダウンロードされたバイナリをUSBストレージとして見えるNucleoのフォルダにおいてリセットして、LEDが点滅するのをまずは確認。
続いて、プロジェクトツリーの当該プロジェクトを右クリックして表示されるメニューから「Export Program」を選択。
すると、「Keil uVision4」というToolchain形式でダウンロードできるようなので、これをダウンロード。
ダウンロードしたzipファイルを解凍すると、Keil uVision形式のプロジェクトファイルが展開されます。そこで、このKeil uVisionについて調べてみたところ、「MDK-ARM」というARM本家の開発環境のIDEらしいです。無料のお試し版をダウンロードして、試してみました。
ダウンロードしたMDK-ARM(Ver.5でした)のお試し版をインストールして、先ほど解凍したプロジェクトファイルを開いてビルドしたところ、ビルドに成功。
そこで、デバッグボタン(Start/Stop Debug Session)を押したんですが、「フラッシュ書き込みエラー・・」っぽいニュアンスのエラーメッセージ。そこで、「Flash」 → 「Configure flash tools」というメニューを開いてみると、「Debug]設定なるタブがあります。
「Debug」タブ → 「Flash Download」タブ と進むと、書き込みアドレスを設定するような画面がありました。といっても、このチップのアドレスマッチングは全然わかりません。とりあえず、「Add」ボタンを押すと、リストの中に「STM32F103」があった(これは、MDK-ARMをインストールした時に使用するデバイスのライブラリをダウンロードする画面が表示されたので、そこで選んでダウンロードしてあったために表示されているんだと思います。この表示がない場合は、デバイスファイルのダウンロートで該当するデバイスファイルをダウンロードすればよいのだと思います。)ので、選択。
再度、ビルド&デバッグボタンを押すと、ダウンロードが始まり・・・・
おっ。動きました。Lチカとメッセージ出力をブレーク、ステップ実行出来ました。やた。
あいかわらず、使い道もないのに、ボードのコレクションが増えていきますが、まあ、色々なボードを集めて、Lチカ程度に動かすこと自体が趣味ってことで・・・。
2014年3月8日土曜日
2014年3月2日日曜日
BrickPi お試し その4 (モータドライバの交換)
BrickPi が、(多分初期不良)モータPORT_AとBがまともに動かない件で、別の品物を秋月に通販で頼む機会があったので、ついでに、SN754410 も取り寄せました。
早速、ダメICを切除。でも、Mindstorms のモジュラコネクタが邪魔で、結構、ちょん切るのが難しい。
なんとか、足を切って、取り外し、このあとは基板に残ったICの足をハンダごてで温めながら、抜いていきました。吸い取り器と吸い取り線を使って、ランドの穴が空くようにきちんとハンダを吸い取るのは結構難しい。特にGNDは熱容量が大きいのでしんどかった。
どうにか取り外せたので、ICソケットを付けておくことに。これで、また?ドライバICが死んでも大丈夫?今回、秋月から予備も買ってあります...
モータドライバIC(SN754410)を取り付けて、前回、変な動きをしたソフトを動かしたところ、無事、正常(期待通り)動作。
やっぱり、原因はモータドライバICでした。う~ん、何をしたら壊れた(壊した)んだろう?元からだったような気がするな...。ま、ドライバICの予備も用意したし、いいか...。(いいのか?)
早速、ダメICを切除。でも、Mindstorms のモジュラコネクタが邪魔で、結構、ちょん切るのが難しい。
なんとか、足を切って、取り外し、このあとは基板に残ったICの足をハンダごてで温めながら、抜いていきました。吸い取り器と吸い取り線を使って、ランドの穴が空くようにきちんとハンダを吸い取るのは結構難しい。特にGNDは熱容量が大きいのでしんどかった。
どうにか取り外せたので、ICソケットを付けておくことに。これで、また?ドライバICが死んでも大丈夫?今回、秋月から予備も買ってあります...
モータドライバIC(SN754410)を取り付けて、前回、変な動きをしたソフトを動かしたところ、無事、正常(期待通り)動作。
やっぱり、原因はモータドライバICでした。う~ん、何をしたら壊れた(壊した)んだろう?元からだったような気がするな...。ま、ドライバICの予備も用意したし、いいか...。(いいのか?)
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ケーブルでグチャグチャ・・・
なにか綺麗に収める、または、配線できる方法があるといいんですが・・・
とりあえず、クローラをテスト稼働。
現時点では特にセンサ情報のフィードバックや制御は行っていませんが、とりあえず、プリセット的にプログラムして、走行テスト。
このくらいの山は乗り越えられるようです。今後、センサ(コンパス、ジャイロ)等を使えたらいいなと考えています。
モータ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が怪しいので、ロジアナで入出力を調べてみることにしました。
A2の方向切り替え信号に怪しい波形が出ています。HブリッジICへの入力の時点ですでにおかしい(AtmelのコントローラATMEGA328からの出力)のでしょうか?
ただ、もう片方は、PWM信号を入力している(Enableにもなっている)のに出力がHに張り付いたままになっていて、こちらはHブリッジICが機能していないように見えます。
まずは、試しにSN754410 を入手して、交換してみるという感じでしょうか?SN754410自体は割りとポピュラーなHブリッジドライバICなので、秋月等でも手に入ると思われます。通販で部品入手したりして、調査の続きは来週だな・・・。
そこで、まずは、公開されている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なので、秋月等でも手に入ると思われます。通販で部品入手したりして、調査の続きは来週だな・・・。
ラベル:
BlickPi,
LEGO,
LEGO Mindstorms,
Linux,
Raspberry Pi,
Robot,
マイコン,
レゴ,
ロボット
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日しか使ってないのに・・・。ハードがおかしくなったのか、週末に切り分け・調査を行ってみます。
sudo sixad -start
で、コントローラのPSボタンを押して接続して、プログラムを実行します。
とりあえず、それっぽく動いているんですが、実は、はじめモータをポートAとBにつないで動かしていたんですが、途中で動きがおかしくなって、ポートCとDに差し替えて動かしています。もしかして、もう壊れた?まだ、2~3日しか使ってないのに・・・。ハードがおかしくなったのか、週末に切り分け・調査を行ってみます。
登録:
投稿 (Atom)


























































