Otto

はじめに

すこし仕事で機会があったのでOttoのDIY Quadruped robotを作る工程をここに掲載していきたいと思います。 ほかにもOttoにはキャタピラ型やホイール型、人型など様々な種類があります。主なボディパーツは3Dプリンターで出力できますが、中のArduinoなどの内部パーツはOtto DIYのホームぺージから購入する必要があります。

機能のオミットについて

本来、このモデルのOttoにはBluetooth機能やリチウムイオン電池などが内蔵されていますが、今回は一部の機能をオミットしようと思います。 まず、BluetoothとLEDの感情表現機能をオミットし、リチウムイオン電池を単三電池3本分に代替します。配線図は以下となります。

配線図

部品を3Dプリントしてみる

それでは部品を3dプリントしてみます。部品はそれぞれhead,body,hips,legs.pinsの5パーツに分かれていて、基盤にプログラムを入れ込んだうえでそれぞれに電子部品を組み込み、組み立てることで完成します。

3DプリントしたOtto

プログラム

  1. #include <setjmp.h>
  2. #include "OTTOKame.h"
  3. jmp_buf jump_env;
  4. // Ottoのインスタンス
  5. Ottokame robot;
  6. // グローバル変数
  7. int MODE = 0; // モード: 0 (待機), 1 (ダンス), 2 (障害物検知), 3 (音検知)
  8. const int PIN_Buzzer = 13; // ブザーのピン
  9. const int CAL_TRIGGER_PIN = 12; // キャリブレーション用トリガーピン
  10. bool obstacleDetected = false; // 障害物検知フラグ
  11. // 設定関数
  12. void setup() {
  13.   Serial.begin(9600); // シリアル通信を開始
  14.   robot.init(PIN_Buzzer); // Otto ロボットの初期化
  15.   robot.reverseServo(2); // サーボモーターの設定
  16.   pinMode(CAL_TRIGGER_PIN, INPUT_PULLUP); // キャリブレーションピンを入力モードに設定
  17.   // キャリブレーション
  18.   while (digitalRead(CAL_TRIGGER_PIN)) { // トリガーピンが HIGH の間
  19.     robot.home(); // 初期位置に戻る
  20.     delay(100); // 少し待機
  21.   }
  22. }
  23. // メインループ関数
  24. void loop() {
  25.   switch (MODE) {
  26.     case 0: // 待機モード
  27.       break;
  28.     case 1: // ダンスモード
  29.       int randomDance = random(5, 15); // ランダムなダンスコマンドを生成
  30.       robot.home(); // 初期位置に戻る
  31.       gaits(randomDance); // ダンス動作を実行
  32.       break;
  33.     case 2: // 障害物検知モード
  34.       robot.run(0); // 前進
  35.       obstacleDetector(); // 障害物検知を実行
  36.       if (obstacleDetected) {
  37.         robot.home(); // 障害物が検知された場合は停止
  38.         delay(500); // 少し待機
  39.       }
  40.       break;
  41.     case 3: // 音検知モード
  42.       break;
  43.     default:
  44.       MODE = 0; // 待機モードにリセット
  45.       break;
  46.   }
  47. }
  48. // 動作関数
  49. void gaits(int cmd) {
  50.   switch (cmd) {
  51.     case 1: robot.run(0); break; // 前進
  52.     case 2: robot.run(1); break; // 後退
  53.     case 3: robot.turnL(1, 550); break; // 左回転
  54.     case 4: robot.turnR(1, 550); break; // 右回転
  55.     case 12: robot.dance(1, 1000); break; // ダンス
  56.   }
  57. }
  58. // 障害物検知関数
  59. void obstacleDetector() {
  60.   int distance = robot.getDistance(); // 距離を取得
  61.   obstacleDetected = (distance < 15); // 距離が15cm未満の場合、障害物ありと判断
  62. }