クローラロボット開発プラットフォームの初心者向けサンプルコードはこちらをご参照ください
https://github.com/CuboRex-Development/cugo-arduino-beginner-programming
旧製品のArduinoKitの方はこちらをご覧ください。
https://github.com/CuboRex-Development/cugo-sdk-samples/tree/uno
これはクローラロボット開発プラットフォームをより発展的に使うために、さまざまな便利関数をまとめたサンプルコードです。CuGoを動かす各種関数等を説明します。
クローラロボット開発プラットフォームの利用開始までの手順を説明します。
- 公式ページ( https://www.arduino.cc/en/software )へ移動
- DOWNLOAD OPTIONSからご自身のOSのバージョンを選択
- JUST DOWNLOADかCONTRIBUTE & DOWNLOADを選択
- ダウンロードされたらファイルを実行して指示に従いインストール
Arduino IDE でRaspberryPiPicoに書き込む場合、IDEにRaspberryPiPicoのボード情報をあらかじめ取得する必要があります。
Arduino IDE バージョン2系(最新版)の場合
-
追加のボードマネージャのURLに以下のURLを入力し、OKを押します。右のウィンドウボタンをクリックすると入力できるようになります。
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
-
"pico"で検索し、”Raspberry Pi Pico/RP2040”を見つけます。”INSTALL”ボタンを押します(すでに入っている場合はUPDATEボタンを押して最新にします)。
-
RPi_Pico_TimerInterrupt.hで検索し、”RPI_PICO_TimerInterrupt”を見つけます。”INSTALL”ボタンを押します(すでに入っている場合はUPDATEボタンを押して最新にします)。
Arduino IDE バージョン1.8.19(レガシー)の場合
-
追加のボードマネージャのURLに以下のURLを入力し、OKを押します。右のウィンドウボタンをクリックすると入力できるようになります。
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
-
"pico"で検索し、”Raspberry Pi Pico/RP2040”を見つけます。”インストール”ボタンを押します(すでに入っている場合は"更新"ボタンを押して最新にします)。
-
RPi_Pico_TimerInterrupt.hで検索し、”RPI_PICO_TimerInterrupt”を見つけます。”インストール”ボタンを押します(すでに入っている場合は"更新"ボタンを押して最新にします)。
Pythonの'encoding'モジュールが見つからないエラーでビルドできない場合
コマンドプロンプトなどのなんらかのShellを起動して以下のファイルを削除してください。
C:\Users\YutaNakamura\AppData\Local\Arduino15\packages\rp2040\tools\pqt-python3\1.0.1-base-3a57aed\
クローラロボット開発プラットフォームには、V3iモデルとV4モデルがあります。各モデルごとに制御パラメータが異なる場所がありますので、確認をしてください。
Arduino IDE上部タブから”CugoSDK.h”を選択
下記パラメータを使用しているモデルに合わせます。
cugo-sdk-samples/CugoSDKSample/CugoSDK.h
Lines 10 to 24 in 495630e
プログラムが下の図と同じになるように必要に応じてプログラムを書き換え、ご自身のモデルのパラメータが反映されるように調整してください。
V4の場合
”CugoSDK.h”は、サンプルプログラムから変更する必要はありません。
V3iの場合
”CugoSDK.h”の12行目から17行目の行頭に//
を追記し、19行目から24行目の行頭の//
を削除します。
-
CugoBeginnerProgramming.inoがArduino IDEで開かれていることを確認
-
USBケーブルでパソコンとRaspberry Pi Picoを接続。PCに認識されないときは基板にある”BOOTSEL”ボタンを押しながらPCに挿してください。
-
ツール > ポート からRasberry Pi Picoのポートを選択します。ポートはUSBを接続する前と後を比較して増えたものがRaspberry Pi Picoなので、それを選択します。
USBを接続する前↓
クローラロボット開発プラットフォームでは、安全のため、出荷時にプログラム動作する、コマンドモードを無効化しています。
以下の図に従って、電源が切れていることを確認し、DIPスイッチの2番をON側に倒してください。大変小さなスイッチですので、つまようじなどを用意して操作してください。
詳細は、取扱説明書をご覧ください。
https://drive.google.com/drive/folders/18MQUVMLYS_4JgkeGd2v7dVHmdmFaMaZc?usp=drive_link
クローラロボット開発プラットフォームでは2つのモードが利用できます
ラジコンモードはCugoSDKSample.inoを書き込み後、付属のコントローラの左スティックを左側に倒すことでラジコンモードが開始します。
ラジコンモードでの操作方法は
- 左スティックの上下操作が左クローラーの前進後進移動
- 右スティックの上下操作が右クローラーの前進後進移動
- CuGoSDKSampleにて自作関数を利用する場合は
loop
内の//ここから自動走行モードの記述
から//ここまで自動走行モードの記述
までに記載してください。 - loop()のif()により、ラジコンモードの実装とプログラムモードの実装を記載しております。このプログラムモードのブロック内を編集していください。
void loop() {
//プロポ入力によりcugo_run_modeが変化
if(cugo_runmode == CUGO_RC_MODE){//ラジコンモード
ld2_set_control_mode(CUGO_RC_MODE);
cugo_wait(100);
}else if(cugo_runmode == CUGO_CMD_MODE){//自動走行モード
//ここから自動走行モードの記述
//ここまで自動走行モードの記述
ld2_set_control_mode(CUGO_RC_MODE);
cugo_wait(1000);
//自動走行モードを1回のloopで終了する場合のみ記載、不要の場合コメントアウト
}
}
プログラムモードでシーケンシャルに命令を設定している場合、プログラムを最初から実行したい場合があります。 このとき、cugo_switching_reset = true;にすると、プログラムを毎回最初から実行させることができます(cugo_beginner_programmingと同じ動作)。デフォルトはfalseです。
cugo-sdk-samples/CugoSDKSample/CugoSDKSample.ino
Lines 25 to 27 in c41dfb4
cugo_switching_reset = false; の時
cugo_switching_reset = true; の時
ウォッチドッグタイマを使用してプログラムをリセットしているため、再起動に3秒ほどかかります。
ラジコンモード⇔プログラムモードの切り替えを素早く行うとプログラムモードが開始されないように感じることがあります。
(ラジコンモードに切り替えてから、短い時間でプログラムモードに切り替えた時が対象)
このとき、確実にラジコンモードに切り替えた後、約3秒間待ってから、プログラムモードに切り替える操作(スティックを右に倒す)をしてください。
なお、ラジコン操作は下位システムが常に制御をしているため、RaspberryPiPicoが再起動している間も操作をすることができますので、ご安心ください。
- 正方形に移動させたい場合は下記コードを参考にしてください
void loop() {
//プロポ入力によりcugo_run_modeが変化
if(cugo_runmode == CUGO_RC_MODE){//ラジコンモード
ld2_set_control_mode(CUGO_RC_MODE);
cugo_wait(100);
}else if(cugo_runmode == CUGO_CMD_MODE){//自動走行モード
//ここから自動走行モードの記述
//サンプルコード記載
Serial.println(F("自動走行モード開始"));
cugo_wait(1000);
Serial.println(F("1.0mの正方形移動の実施"));
cugo_move_forward(1.0);
cugo_wait(1000);
cugo_turn_clockwise(90);
cugo_wait(1000);
cugo_move_forward(1.0);
cugo_wait(1000);
cugo_turn_clockwise(90);
cugo_wait(1000);
cugo_move_forward(1.0);
cugo_wait(1000);
cugo_turn_clockwise(90);
cugo_wait(1000);
cugo_move_forward(1.0);
cugo_wait(1000);
cugo_turn_clockwise(90);
cugo_wait(1000);
Serial.println(F("自動走行モード終了"));
//サンプルコード終了
//ここまで自動走行モードの記述
ld2_set_control_mode(CUGO_RC_MODE);
cugo_wait(1000);
//自動走行モードを1回のloopで終了する場合のみ記載、不要の場合コメントアウト
}
}
- S字に移動させたい場合は下記コードを参考にしてください
void loop() {
//プロポ入力によりcugo_run_modeが変化
if(cugo_runmode == CUGO_RC_MODE){//ラジコンモード
ld2_set_control_mode(CUGO_RC_MODE);
cugo_wait(100);
}else if(cugo_runmode == CUGO_CMD_MODE){//自動走行モード
//ここから自動走行モードの記述
Serial.println(F("自動走行モード開始"));
cugo_wait(1000);
Serial.println(F("半径1.0mのS字移動"));
cugo_curve_theta_raw(1.0,180,90);
cugo_wait(1000);
cugo_curve_theta_raw(-1.0,180,90);
cugo_wait(1000);
Serial.println(F("自動走行モード終了"));
//ここまで自動走行モードの記述
ld2_set_control_mode(CUGO_RC_MODE);
cugo_wait(1000);
//自動走行モードを1回のloopで終了する場合のみ記載、不要の場合コメントアウト
}
}
- その他、関数の使い方の例は
CugoSDK.cpp
内のcugo_test
を参考にしてください。
- 【説明】
- CuGoが前進後進する関数です。
cugo_move_forward_raw
は位置制御を実施していないため、上限速度まで急峻に到達し、目標距離を超えると急停止します。
- 【構文】
cugo_move_forward(float target_distance)
cugo_move_forward(float target_distance,float target_rpm)
cugo_move_forward_raw(float target_distance,float target_rpm)
- 【パラメータ】
target_distance
:目標距離 単位はmtarget_rpm
:上限速度 単位はrpm
- 【戻り値】
- なし
- 【説明】
- CuGoが時計回りに回転する関数です。
cugo_turn_clockwise_raw
は位置制御を実施していないため、上限速度まで急峻に到達し、目標距離を超えると急停止します。
- 【構文】
cugo_turn_clockwise(float target_degree)
cugo_turn_clockwise(float target_degree,float target_rpm)
cugo_turn_clockwise_raw(float target_degree,float target_rpm)
- 【パラメータ】
target_degree
:目標距離 単位は度target_rpm
:上限速度 単位はrpm
- 【戻り値】
- なし
- 【説明】
- CuGoが反時計回りに回転する関数です。
cugo_turn_counterclockwise_raw
は位置制御を実施していないため、上限速度まで急峻に到達し、目標距離を超えると急停止します。
- 【構文】
cugo_turn_counterclockwise(float target_degree)
cugo_turn_counterclockwise(float target_degree,float target_rpm)
cugo_turn_counterclockwise_raw(float target_degree,float target_rpm)
- 【パラメータ】
target_degree
:目標距離 単位は度target_rpm
:上限速度 単位はrpm
- 【戻り値】
- なし
- 【説明】
- CuGoが指定した半径を指定した角度まで円軌道する関数です。
cugo_turn_counterclockwise_raw
は位置制御を実施していないため、上限速度まで急峻に到達し、目標距離を超えると急停止します。
- 【構文】
cugo_curve_theta_raw(float target_radius,float target_degree,float target_rpm)
- 【パラメータ】
target_radius
:円軌道半径 単位はm- 円軌道半径は指定した値が正の場合、原点はcugoの進行方向左側になります
target_degree
:円軌道角度 単位は度target_rpm
:上限速度 単位はrpm
- 【戻り値】
- なし
- 【説明】
- CuGoが指定した半径を指定した移動距離まで円軌道する関数です。
cugo_turn_counterclockwise_raw
は位置制御を実施していないため、上限速度まで急峻に到達し、目標距離を超えると急停止します。
- 【構文】
cugo_curve_distance_raw(float target_radius,float target_disttance,float target_rpm)
- 【パラメータ】
target_radius
:円軌道半径 単位はm- 円軌道半径は指定した値が正の場合、原点はCuGoの進行方向左側になります
target_disttance
:円軌道距離 単位はmtarget_rpm
:上限速度 単位はrpm
- 【戻り値】
- なし
-
【説明】
- CugoSDKSampleでは割り込み処理を利用してモード遷移をしているため、delay関数を使用しないことを強く推奨します。
cugo_wait
はdelay関数と同等の役割を果たす関数になります。cugo_wait
はCugoSDKSample内で利用する停止関数です。cugo_wait
の計測時間の上限は約70分です。70分以上の計測にはcugo_long_wait
を利用してください。- PICO内の水晶子を利用しているため時間は正確でない場合があります。
-
【構文】
cugo_wait(unsigned long long int wait_ms)
cugo_long_wait(unsigned long long int wait_seconds)
-
【パラメータ】
wait_ms
:停止時間 単位はミリ秒wait_sedonds
:停止時間 単位は秒
-
【戻り値】
- なし
- 【説明】
- CuGoのオドメトリを取得します。
- 【構文】
cugo_check_odometer(int check_number)
- 【パラメータ】
check_number
:以下から選択CUGO_ODO_X
,CUGO_ODO_Y
,CUGO_ODO_THETA
,CUGO_ODO_DEGREE
- 上記の定数はdefineによりそれぞれ0,1,2,3の数値に対応しています。
- 【戻り値】
- float型
- 【説明】
- CuGoを利用するための初期設定関数です。setup関数内にあります。
- 【構文】
cugo_init
- 【説明】
- モーターへプロポ入力します。
- モーターを停止させたい場合は左右のパラメータに
0
を入力します。
- 【構文】
cugo_rpm_direct_instructions(float left, float right)
- 【パラメータ】
left
左モーターへの入力値(RPM)right
右モーターへの入力値(RPM)
- 【戻り値】
- なし