2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

カテゴリー

ブログパーツ

無料ブログはココログ

ちょこっとCoron

「ロボット作ろう」のスピンオフ企画。Coronで作るちょこっとロボットプロジェクト。現在休止中

2010年10月 5日 (火)

SoftModem用インターフェイスのまとめ

リモートブレインの夏休み:iPhoneロボット

いつのまにかロボットネタからずいぶん離れてしまいましたが、今回で終わりにしたいです。

まずは、前回で出来上がったモデムを、coronとインターフェィスするにあたって、問題になったもろもろのこと。


■coronでは315bpsは使えない
このプロジェクトでは、昔の電話用モデムのようにPICマイコンは変調・復調機能のみ、という方針でした。そのためには315bipでモデムと通信する必要があります。

coronではシリアルポートのボーレートをconf.hのUART_BAUDRATEの値を書き換えることで設定できますが、残念ながら600bpsより遅いボーレートの設定は出来ないようです。エラーにはなりませんが、通信速度がおかしなことになります。モチロン、各種レジスタを適正にセットすれば遅い方も大丈夫なんでしょうが、ちょっと大変そうです。

そこで、PICのUARTを使ってcoronとの通信はデフォルトの9600bpsで行い、iPhoneとの通信はPICが自力で行うようにしました。
通信速度に差があるので、PIC側に100バイトほどの送信データ用FIFOバッファを設けました。


■iPhoneとのFSK通信は負論理!
SoftModem TerminalからPICに送られるFSK信号は、リーダーとしてスペース(3150Hz)が送られ、スタートビットのマーク(1575Hz)に続いてデータ、最後にストップビットのスペースから構成されています。
最初はそのままマーク1、スペース0として受信したところ文字化けで受信できませんでした。コードを調べると反転しています。つまり、負論理で送られてきているわけですね。もちろん、送る方も負論理です。

モデムってそうだったけ、と改めて思いました。
インターフェイスを自作する人は気をつけないといけません。なお、今回製作したインターフェイスではソフトで対応済みなので、普通にシリアルで送受信できます。


■ボーレートは控えめに
この回路で1225bpsでの通信実験も行いましたが、多少エラーが出ます。マイコンから同じ文字を画面いっぱいになるまで(600字くらい?)送信すると、1〜2回の文字化けが出ることがあります。波形をチェックしましたが原因は不明です。みたところきれいな波形でした。原因追及には手間ひまかかりそうです。

まあ、これまた懐かしいXmodemとかのプロトコルを実装すればこれでも使い物になりそうですが、アマチュアのソフト工作向きではないですね。315bpsなら、普通に通信している限り文字化けは確認できませんでした。あとあとのことを考えるとボーレートは欲張らない方がいいみたいです。


回路図とPIC16F886用のCCSCのソースコードとオブジェクトです。
この回路は3Vから5Vの電源電圧で動作します。uCPUシリアルにMAX232などのレベルコンバータをつなげば、9600bpsのRS232CでPCと接続することも出来ます。僕も開発中はTeraTermでやってました。

「modem_mono.pdf」をダウンロード(回路図)
 2010/10/18更新・安定度向上のためプログラム修正しました。↓
「fsk_V11.zip」をダウンロード(CCSCのソースコードとオブジェクトファイル)

動作の様子はこんな感じです。
iRoverのcoronからSoftModem Terminalに'A'を連続送信している様子です。100mS周期で送信しています。100バイトほどのバッファをもっているので、それ以内ならいっぺんに送っても大丈夫ですが、FSKでは1バイト送るのに30msかかるので、送りすぎには要注意です。

2010年7月29日 (木)

iRover走行テスト!ジャイロはやっぱり振動に弱い

リモートブレインの夏休み:iPhoneロボ
ちょこっとCoron:番外編

iRoverの走行テストをしました。本当は公園の芝の上でもやりたかったのですが、この猛暑で挫折、室内でのテストのみになりました。

ブリザードはもともと、人間が走るくらいのスピードが出るダイナミックなラジコンです。iRoverでは緩い速度制御をかけ、最高速度を歩く速さくらいに押えています。
ギアが比較的しぶく、パワーを抜けば直ちに停止するので、うまく速度制御することが出来ました。ラジコンカーのように、パワーを抜いても惰性で走るようなものではもっと難しいでしょう。

旋回角度はねずー同様、ジャイロで制御しますが、直進補正はうまくいきませんでした。
モーターも大きいし、キャタピラの振動もあるので、ジャイロコンパスがものの10秒ほどでずれてきてしまいます。理由はハッキリわかりませんが、振動が多いとジャイロコンパスは不安定になります。振動を緩和する方法を工夫しなければなりませんね。

そんなわけで、今回は、シェーキーのように、左右のモーターの総回転数をそろえる方式で直進性を確保しました。これだとキャタピラが滑ると、進行方向がずれてしまいますが、実験用にとりあえず実装しました。

これが走行テストの様子です。

室内なので、最高速度は出していません。中速までです。

障害物を微速で乗り越えるテストで、キャタピラが障害物にあたったときiRoverがちょっと止まります。平面を微速で走行するパワーでは、障害物に乗り上げられないので止まるのですが、プログラムがモーターの回転が落ちたことを検出すると、すぐにパワーをあげて走行状態をキープします。

この機能がないと、オフロードを安全な速度で走行できません。

2010年7月27日 (火)

iRoverにもCoron搭載

リモートブレインの夏休み:iPhoneロボット
ちょこっとCoron:Coronノウハウ

iRoverにもねずーと同じCoronを搭載しました。サーボ信号が出ているので、簡単に使えそうです。
デッキ上のアビオニクスボックスに写真のように搭載しました。写真ではすっきりして見えますが、完成すると車体各部からのケーブルでいっぱいになります。

Dscn0787

主な部品はCoronとねずーと同じ秋月のジャイロです。これで直進補正や旋回角度の制御を行います。ジャイロセンサは直接引き出してADに入力します。

問題はジャイロの機械的振動によるノイズ混入です。ねずーよりははるかに大きな振動があるので、これが問題を引き起こしそうです。とりあえず、ねずーと同じウレタンで取り付けました。

運動に関するソフトは、ねずーからもらってきました。大げさに言えば、遺伝情報の継承です。
モーター回りを修正して、同じジャイロパラメータで90度旋回のテストをしたところ、そこそこ正確に動いたのには驚きました。さすがジャイロですね。これくらいなら振動の影響もあまりないようです。

ただ、サーボの動きがあまりよろしくありません。数秒おきくらいににびくっと誤動作します。ねずーではあまり気にしてませんでしたが、雲台に接続してみると、結構大きく動く感じがします。見た目も良くないし、撮影中に起これば画像がぶれるかもしれません。なんとかしないといけません。

いろいろ調べてみると、DCモーターのPWM制御とサーボの制御を両方イネーブルにしたときに、この現象が起こることがわかりました。
今回はDCモーターを使っていないので、これをデゼーブルにしました。それ以降、サーボのピク付きは感じられなくなりました。

とはいうもの、両方使いたいユーザには困った問題です。時間のあるときに原因を調べてみようかと思います。

2010年4月 6日 (火)

Coronの電源問題まとめ

ちょこっとCoron:ねずー製作記

前の記事がちょっとごちゃごちゃしていたので、ここでいったんまとめておこうという訳です。

まず、かかえていた問題点を整理すると

●モーターの回り出し時にセンサの値がおかしくなるようだ

という事になります。この時の状況を計測すると次の事実が出てきます。

●センサの値をオシロで読むと、特に異常な値は出ていない
●モーターの回り出し時にモーター電圧(レギュレータの入力電圧)が2.7Vほどにまで下がる
●そのためマイコンやセンサの3.3V安定化電源が100msほどの間、電圧低下する

Coronの安定化電源は低損失の三端子レギュレータのようで、3.3V出力するには少なくとも入力に3.5V位は必要ですから、電圧降下は無理からぬことです。
マイコンにはADコンバータが組込まれ、それでセンサの電圧出力を読み込んでいます。そしてその参照電圧(Vref)はマイコンの電源電圧と同じです。これから、次の事実が導かれます。

●モーターの回り出し時にADコンバータの参照電圧が3.3Vより下がる

ADコンバータの参照電圧が下がるとどうなるか、参照電圧を変えた場合のADの値はこんな風に変わります。

ADの入力電圧1.5V、分解能12bit(4096)の場合

■参照電圧3.3V 読み出し値=1.5/(3.3/4096)=1862
■参照電圧3.0V 読み出し値=1.5/(3.0/4096)=2048

これを見てもわかるように、同じ入力電圧で読み出し値が200近く変わります。電圧が下がっているのに参照電圧3.3Vのつもりで値だけを見ると、入力電圧が1.65Vに跳ね上がったように見える訳です。

したがって対策は

●ADコンバータを使うならモーター動作時に3.3Vの電圧が下がらないようにする

ということになり、今回取った具体的対応策が

●バッテリー部のダイオードをバイパスし、レギュレータの入力電圧を0.8Vほど高くする

ということでした。

実際、システムの電圧マージンを考えると、4.8Vでは今回取った対策でもぎりぎりです。バッテリの電圧をあげるか、もっとバッテリ周りの電気抵抗(内部抵抗や電池ボックスとの接触抵抗)を低くする工夫をしたほうが安心だと思います。

ダイオードをバイパスしないで使うなら、電源電圧は最低でも6〜7.2Vが必要です。この場合モーター電圧は5.2〜6.4Vくらいになります。

Coronボードとサーボを使って自律ロボットを目指す方は、電源に気を配らないと、おかしな反応に悩まされることになります。気をつけましょう。

2010年4月 5日 (月)

ジャイロ問題再考?はたして真犯人は…

ちょこっとCoron:ねずー製作記

通勤電車の中でつり革につかまりながら、今回のトラブルを考え直してみたところ、次の事実に思い当たりました。

1・衝突検出の加速度センサがすぐ反応してしまうんでハンドラをコメントアウトしたっけ
2・そういえば最近ねずーを充電してなかったなあ

そうですね。モーターが本気で回るようになって電池の電圧降下が顕著化、それがセンサやADコンバータの電源である安定化した3.3Vにも影響を与えているのでは?

帰宅後、早速シンクロで電圧をモニタしてみました。シンクロは久しぶりの登場で画面が猫の毛だらけですが。
左が3.3Vのライン、右がモーター電源のモニターです。電圧軸は1V/div、時間軸は100ms/divです。

Dscn0548  Dscn0549

本来変動してはイケナイ左側の3.3Vのラインが、モーター回転と同時に2.5Vくらいまで落ち込んでいます。
ただし、写真はありませんがジャイロセンサや加速度センサの出力には何も影響は見られませんでした。これらのセンサの動作下限が2.7Vなので、これくらい下がっても正常に動作しているようです。

となると、どうでしょう。ADコンバータの基準電圧も3.3Vから取っているので、これが下がるとセンサの電圧が上がったように見えるはずです。加速度センサの場合で考えると、衝突時の加速度で電圧上昇するように取り付けられているので、

モーター起動→ADコンバータの基準電圧降下→相対的に加速度センサの電圧上昇→衝突加速度と誤認識

と、いう現象のようです。ジャイロも同じ理屈で方向が狂うようです。

前にも書きましたがCoronの電源回路にはUSB、DCジャック、バッテリいずれからの給電にも対応できるよう、電流合成のダイオードが入っています。これが0.8Vくらいの準方向電圧降下を引き起こしており、ねずーのように電源が4.8Vと比較的低い場合は問題になります。
前の写真右側を見てもらうと、ダイオードを通ってきているモーター電源は無負荷でも4Vくらいしか出ていません。ダイオードの準方向電圧降下が影響しています。

ということで、ダイオードをショートすることにしました。ねずーはDCジャックから給電しているので、そこのダイオードをショートします。条件によってはバッテリーにいくらか電流が流れ込む可能性もありますが、トリクル充電程度なので問題はないでしょう。
Photo

これをすることにより、電圧波形はこうなりました。ダイオードをショートしたのでモーター電源=バッテリーです。無負荷で4.8V、最低でも3Vくらいの感じです。測定時はバッテリーが大分へたった状態ですが、電源コンデンサの効果もあり3.3Vラインには影響は出なくなりました。右側の写真はショート改造の様子です。

Dscn0553  Dscn0552

その後、走行テストをしたところ、きちんと直進するようになりました。すぐにバッテリーを充電してしばらく走行させましたが、問題は見られませんでした。

ジャイロではなく、電源が真犯人だったのですね。通勤電車も役に立つものです。
ただし、まだ十分な電圧マージンがあるとは言えないので、もう少し検討が必要のようです。

2010年4月 4日 (日)

またまたジャイロのノイズ!

ちょこっとCoron:ねずー製作記

ねずーのギア比を落とし、割り込みを使ったプログラムに変更しようとしていじっていると、どうもなんか変です。

ジャイロの値がぶれるようです。最初はソフトを疑って割り込み周期を計測したりしてみたのですが、コレは問題ありませんでした。タイマーでの割り込み周期は正確です。少なくともジャイロセンサの積分結果に影響の出そうな誤差はありません。

最初のころのテストプログラムに戻って、ジャイロで直進補正しながらの前進をさせてみると…モーターパワー50だときれいに直進しますが、90くらいにすると、加速時に右に15度くらいカーブし、あとはそのまま直進することがわかりました。

減速比を落としたためモーターの立ち上がりがよくなったためでしょう。電気的な問題なのかそれとも機械的な振動が影響しているのかはまだわかりません。

現在の回路は何も考えずジャイロセンサの出力をAD変換機にいれているので、ここにCRの積分回路を入れて、10Hzくらいから上を減衰させてみようかと思います。

2010年3月15日 (月)

Coronにタイマー割り込みを追加する(その3)

ちょこっとCoron:ねずー製作記

今回改造したファイルは下記の3ファイルです。修正箇所には「花岡ちゃん」のコメントを付けてあるので、ダウンロードしたファイルを検索してください。簡単な改造なので仕組みはすぐわかると思います。

stm32f10x_it.c ユーザー割り込みのハンドラHandler_MyTick()の呼び出しを追加
coron_conf.h Handler_MyTick()のextern宣言を追加
main.c Handler_MyTick()の本体を追加、デモ用main関数の作成

花岡ちゃん版のフレームワークを使って、DCモーターとサーボのコントロールを独立に行うテストをしてみました。

DCモーターのコントロールは、Coronのサンプルコードをコピペしてmain関数の無限ループで行います。加減速を繰り返すプログラムです。これ↓がコードです。


Photo


サンプルコードからの変更で重要なのは、wait_timerをwait_timer_msにしたことです。これは前にも書いたように、割り込み周期を1msに設定したままに保ちたいからです。

RCサーボの制御はタイマー割り込みで行います。これ↓がコードです。

Photo_2

500ms周期でサーボを動かし続けます。いうまでもないことですが、タイマー割り込みハンドラの中で時間を食う処理は御法度です。1msごとに割り込まれる訳ですから、数百usくらいが上限です。これを意識しながらプログラムすれば、意外と複雑な処理も入るものです。

このプログラムを実行した時の動画がこれです。車輪の回転とサーボの動作がそれぞれ固有の周期で動いていることがわかると思います。(わかり難いですか?音を聞いてもらうといいかもです。)

2010年3月14日 (日)

Coronにタイマー割り込みを追加する(その2)

ちょこっとCoron:ねずー製作記

と言う訳でユーザータイマー割り込みを追加しました。これが主要部分のソースコードです。

Photo

Handler_MyTick()がユーザー割り込みのハンドラです。ここにはグローバル変数myTickCountを使って500msごとにLEDを点滅するプログラムを見本として入れてあります。

main関数ではwait_timer_msec(1)で1msの時間待ちを実行することで、sysTick割り込みを1ms周期に設定しています。これをしないと割り込み周期は100usになり、ちょっとばかり早いようなのでこうしました。

その後、何もしない無限ループに入ります。つまり、ここにLEDの点滅と同時に実行したいプログラム、例えばあるパターンを走行するとかを書けば良い訳です。

注意すべきことは時間待ちにwait_timer_msec以外を使うとSysTickの割り込み周期が1ms以外に設定されてしまうことです。wait_timer_msecは問題なく使えるので、これを時間待ちに使います。

この機能を組込んだ「花岡ちゃん」バージョンのEx_ALLを参考までに用意しました。LEDを点滅させながらのプログラム実行を確認してもらえると思います。

「Ex_ALL_HanaokaChan.zip」をダウンロード

2010年3月13日 (土)

Coronにタイマー割り込みを追加する(その1)

ちょこっとCoron:ねずー製作記

Coronにユーザーが利用できるタイマー割り込みがあると便利です。
ねずーの場合だと、ジャイロコンパスの更新やビヘィビアの実行時間の管理などは、定期的にタイマー割り込みで起動するのが定石です。これをCoronで実現しましょう。

Coronには、ユーザーがタイマー割り込みを使えるようなサンプルコードがありません。と、いうことは自分で作るしかありませんね。

Coronではモーターやサーボなどの制御にタイマー割り込みを使っているようです。srcフォルダにmain.cと一緒に入っているstm32f10x_it.cに各種インタラプトのハンドラが収まっています。これを見るとTimer1が空いているようです。これを使いましょうか。モーター制御などの関数を調べてタイマー割り込みの設定をしてみましょう‥

うーん、これは無理です。STM32のマニュアルをしっかり読み込まないと理解不能ですねえ。「ちょこっと」と言う訳には行かないようです。

そこで!他の割り込みに「便乗」することにします。つまり、定期的に割り込んでいるハンドラの中に自前の割り込みサービスを文字通り「割り込ませ」てしまおうと言う訳です。

白羽の矢をたてられた不運な関数はHandler_SysTick()です。ソースコードを読むと時間待ち機能wait_timerで利用されています。wait_timerを呼ぶとカウンタに引数をセット、さらに100usごとに割り込みがかかるようにSysTickをセットし、割り込みごとにHandler_SysTick()でカウンタをカウントダウン、これが0になったらリターンという作業をしています。

また、マニュアルにはないですが、ms単位で時間待ちをするwait_timer_msecもあることがわかりました。これはwait_timerと全く同じで、割り込み周期が1msになっているものです。他にwait_timer_secとwait_timer_usecもありました。これらがマニュアルに無いのは、wait_timerでカバーできるからだと思います。

これは私にとってはラッキーでした。割り込み周期の切り替え方法がわかったからです。

次回は便乗プログラムの製作をしたいと思います。

2010年3月11日 (木)

ねずーの近況報告

ちょこっとCoron:ねずー製作記

ねずーはその後、鳥の声や猫の声を発生する機能を追加され、何回か「出動」しています。

Dscn0452

基本的なビヘィビアは、サウンドを再生→猫じゃらしのアクションを1分ほど繰り返し、その後、1分ほどexploreで室内を高速走行します。猫じゃらしアクション中にPSDに反応があったら、avoidビヘィビアで逃げ回る行動をします。

猫の相手を出来ないときに、猫の興味を引きつけるくらいの効果はあるようです。あまり近づいては行きませんが、物陰に隠れてのぞいています。
どうも、ちょっとばかりねずーが怖いようです。逃げ出すほどではないですが、攻撃するにはちょいと怖いという感じでしょうか。たまに思い切って飛びかかりますが、ちょいと手を出してもどってくるという典型的ビビリーの行動をします。

これをふまえて、ギアの減速比を元に戻そうかと考えています。走行スピードではなくで、ネズミっぽいちょろちょろ動き回るアクションを試してみるためです。現在のギア比は低すぎるため、直進後すぐ旋回などを安定に行えません。