茶運び人形ロボのGR-SAKURAプログラム

【ソース】
http://licheng.sakura.ne.jp/myeongwol/MyeongWol_Sakura.zip
GR-SAKURAのクラウドWebコンパイラ用ソース。
(Sketch Template Version 1.01への追加分のみ)


(1) gr_sketch.cpp
これがメインのソース。
ラジコンサーボの制御にはGR-SAKURAのライブラリ(Arduinoとソース後漢)のServoクラスを利用する。ステッピングモータの制御は、GR-SAKURAのライブラリのStepperクラスは使わず、後述のsteppers.cppに制御を実装した。
Arduino同様、setup()が初期化関数。ここで、I/Oのピン機能設定を行っている。I/Oピン表は下記の通り。

IO0 シリアル RxD
IO1 シリアル TxD
IO2 ステッピングモータ 右輪 方向
IO3 ステッピングモータ 右輪 クロック
IO4 ステッピングモータ 左輪 方向
IO5 ステッピングモータ 左輪 クロック
IO6 ステッピングモータ 両輪イネーブル
IO7 サーボ 全軸イネーブル
IO8 サーボ 左肘
IO9 サーボ 左肩
IO10 サーボ 右肘
IO11 サーボ 右方
IO12 サーボ 首
IO13 サーボ 腰


またArduino同様、loop()がメインループ関数。ここでは専らAndroid端末から送られてくるコマンドをシリアルポートで受信して、コマンドを実行する。コマンド実行の関数がexecute_command()。昨日のブログに書いたコマンド仕様に従ってコマンドを解釈して、ラジコンサーボおよびステッピングモータを制御する。
ラジコンサーボの角度指令は、Servoクラスのwriteメソッドを使用する。引数は角度(0〜180)。また、ステッピングモータの制御には後述のsteppers.cppに実装した関数を使用している。


(2) steppers.cpp / steppers.h
ステッピングモータの制御をおこなう。GR-SAKURAのライブラリにもStepperクラスというのがあるが、同期待ちな仕様なので、マルチタスク化でもしない限り実用的でない。stepメソッドは指定したステップ数だけ回転し終わるまで処理が戻ってこないのだ。
このsteppers.cppが提供する関数は下記のとおり。
steppers_init I/Oピンの指定とタイマ処理の初期化
steppers_forward 速度を指定して車輪を前進させる
steppers_backward 速度を指定して車輪を後退させる
steppers_turnRight 速度を指定して車輪を右回転させる
steppers_turnLeft 速度を指定して車輪を左回転させる
steppers_stop 車輪を停止させる
steppers_enable 車輪の制御を有効にする(通電する)
steppers_disable 車輪の制御を有効にする(通電しない)


steppers_init()では、I/Oピンの設定のほか、特電HALのtimer_regist_userfunc()関数を利用して、1ms周期のタイマハンドラsteppers_callback()を登録する。steppers_callback()関数では、時間をカウントして左右のステッピングモータのクロック信号を出力する。


(3) common.cpp / common.h
コマンド解釈のための、文字列→数値変換の関数を定義。まあ、説明の必要もないだろう。