作成したロボットのプログラムを掲載します。

テレビのリモコンで色々な動作を指示することができますので、試して遊んでみてください。

arduinoIDEというソフトでマイコンに書き込むためのプログラムになります。

わかりやすいように、接続図も作りました。

皆さんの参考になれば幸いです。

ottodiyのサイト

https://www.ottodiy.com/

 

 

 

 

// OTTO ROBOT 赤外線リモコン動作確認用
// 2026.2.2 konan0119
#include <IRremote.hpp>
#include <Otto.h>
#include <PlayRtttl.hpp>
Otto Otto;//Ottoロボット宣言(クラス、オブジェクト)
#define LeftLeg 2 //左足
#define RightLeg 3//右足
#define LeftFoot 4 //左足首
#define RightFoot 5 //右足首
#define Buzzer  13 //ブザー
// ---- 8x8 LED Matrix ----Using LED使う場合
#define DIN A3 // Data In pin
#define CS A2  // Chip Select pin
#define CLK A1 // Clock pin
// 8x8 LED Matrix orientation  Top  = 1, Bottom = 2, Left = 3, Right = 4 
#define Orientation 1 
// ---- 超音波モジュール端子 ----Using ultrasound
#define TRIG_PIN 8
#define ECHO_PIN 9
long duration;
int distance;
// ---- 赤外線受信端子 ----IR-Receiver
const int IR_RECEIVE_PIN = 12;

void setup() {
  Otto.init(LeftLeg, RightLeg, LeftFoot, RightFoot, true, Buzzer); //端子セット
  Otto.initMATRIX( DIN, CS, CLK, Orientation);
  Otto.playGesture(OttoHappy);//ハッピー2
  Otto.home();
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  Serial.begin(115200);
  delay(200);
  IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);//LED フィードバックを無効化
  Serial.println("Press the SONY remote control key");
}

void loop() {
   if (IrReceiver.decode()) {
      // 受信データが正しいプロトコルか確認する
      if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
        IrReceiver.resume();
        return;
      }
      if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
        // ノイズなので無視
        IrReceiver.resume();
        return;
      }
      // ここから先は「正しい信号だけ」
      IrReceiver.printIRResultShort(&Serial);
      uint32_t raw = IrReceiver.decodedIRData.decodedRawData;
    
      switch (raw) {//リモコンキー押下げによる処理先
        case 0x80:Serial.println("1番キー");  demo1(); break;
        case 0x81:Serial.println("2番キー");  demo2(); break;
        case 0x82:Serial.println("3番キー");  demo3(); break;
        case 0x83:Serial.println("4番キー");  demo4(); break;
        case 0x84:Serial.println("5番キー");  demo5(); break;
        case 0x85:Serial.println("6番キー");  demo6(); break;
        case 0x86:Serial.println("7番キー");  demo7(); break;
        case 0x87:Serial.println("8番キー");  demo8(); break;
        case 0x88:Serial.println("9番キー");  demo9(); break;
        case 0x89:Serial.println("10番キー");demo10(); break;
        case 0x8A:Serial.println("11番キー");demo11(); break;
        case 0x8B:Serial.println("12番キー");demo12(); break;
        //case 0x4BCF: // ↑キー前進
        case 0xF4:
        //前方距離不足の場合はreturnでloop始めに戻る
        Serial.println("↑キー");if (chk()) return;demo13();break;
        //case 0x4BD0: // ↓キー後退
        case 0xF5:
        Serial.println("↓キー");demo14();break;
        //case 0x4BCD: // ←キー左に進む
        case 0xB4:
        Serial.println("←キー");if (chk()) return;demo15();break;
        //case 0x4BCE: // →キー右に進む
        case 0xB3:
        Serial.println("→キー");if (chk()) return;demo16();break;
        default:
        Serial.println("未割り当てのキー");
        break;
      }
      IrReceiver.resume();// 次の受信に備える
  }
}
//超音波距離測定
long ultrasound_distance_simple() {//longは大きな整数を扱うための型
   long duration, distance;
   digitalWrite(8,LOW);//超音波を1回発射
   delayMicroseconds(2);
   digitalWrite(8, HIGH);
   delayMicroseconds(10);
   digitalWrite(8, LOW);
   duration = pulseIn(9, HIGH);//超音波が戻る往復時間
   distance = duration/58;//58「往復時間をcmに変換する定数」
   return distance;//値を関数の外に渡す
}

bool chk() {//void関数は値を返せないのでboolを使う
  distance = ultrasound_distance_simple();
  Serial.print("Distance: ");
  Serial.println(distance);
  if (distance < 15) {//15cm以下なら
    Otto.sing(S_buttonPushed);
    Otto.walk(2.5, 1000, -1);//後退
    Otto.home();
    delay(500);
    IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);//LED フィードバックを無効化
    return true;//前方距離不足
  }
    return false;//前方距離問題なし
}

void demo1() { Otto.bend(1,700,1); Otto.bend(1,800,-1);                                    buz1();} // 左傾 右傾
void demo2() { Otto.shakeLeg(1,800,-1); Otto.shakeLeg(1,1000,1);                           buz1();}//左ゆら右ゆら
void demo3() { Otto.moonwalker(2.5, 800, 25, 1); Otto.moonwalker(2.7, 800, 25, -1);        buz1();}//ムーンウォーカー
void demo4() { Otto.crusaito(3, 1000, 25, 1); delay(500);Otto.crusaito(3.1, 1000, 25, -1); buz1();}//クロッシング
void demo5() { Otto.flapping(3, 1000, 25, 1);delay(500); Otto.flapping(3.8, 1000, 25, -1); buz1();}//フラッピング
void demo6() { Otto.swing(3, 800, 30); buz1(); }
void demo7() { Otto.updown(3.1, 800, 25); buz1(); }
void demo8() { Otto.tiptoeSwing(3, 500, 25);Otto.jitter(2, 1000, 20);Otto.ascendingTurn(2, 1000, 50);Otto.jump(1,500);buz1(); }//(small T)buz1();  
void demo9() {  Otto._tone(10, 3, 1);Otto.bendTones (100, 200, 1.04, 10, 10); buz1(); }
void demo10(){  Otto.sing(S_cuddly);
                Otto.sing(S_OhOoh);
                Otto.sing(S_OhOoh2);
                Otto.sing(S_surprise);
                Otto.sing(S_buttonPushed);       
                Otto.sing(S_mode1);        
                Otto.sing(S_mode2);         
                Otto.sing(S_mode3);  
                Otto.sing(S_sleeping);
                Otto.sing(S_fart1);
                Otto.sing(S_fart2);
                Otto.sing(S_fart3);
                Otto.sing(S_happy);
                Otto.sing(S_happy_short);                   
                Otto.sing(S_superHappy);   
                Otto.sing(S_sad);               
                Otto.sing(S_confused);
                Otto.sing(S_disconnection);
 
                delay(1000);buz2();IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);
}

void demo11(){ Serial.println("ハッピー1 ");Otto.playGesture(OttoSuperHappy);//ハッピー1
               Serial.println("ハッピー2 ");Otto.playGesture(OttoHappy);//ハッピー2
               Serial.println("悲しい ");Otto.playGesture(OttoSad);//悲しい
               Serial.println("ねむり ");Otto.playGesture(OttoSleeping);//ねむり
               Serial.println("混乱");Otto.playGesture(OttoConfused);//混乱
               Serial.println("気が重い ");Otto.playGesture(OttoFretful);//気が重い
               Serial.println("愛 ");Otto.playGesture(OttoLove);//愛
               Serial.println("いかり ");Otto.playGesture(OttoAngry);//いかり
               Serial.println("マジック ");Otto.playGesture(OttoMagic);//マジック
               Serial.println("ウェーブ ");Otto.playGesture(OttoWave);//ウェーブ
               Serial.println("勝利 ");Otto.playGesture(OttoVictory);//勝利
               //Serial.println("失敗 ");Otto.playGesture(OttoFail);//失敗 倒れる
               Serial.println("おなら ");Otto.playGesture(OttoFart); //おなら
               Otto.home();Serial.println("再生終了 ");buz2();
               IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);
}
//曲データ33曲 全部聞こうとするとメモリ不足で書き込み不可
void demo12(){ Serial.println("1");playRtttlBlockingPGM(13,(char*)StarWars);
               Serial.println("2");playRtttlBlockingPGM(13,(char*)MahnaMahna);
               //Serial.println("3");playRtttlBlockingPGM(13,(char*)LeisureSuit);
               Serial.println("4");playRtttlBlockingPGM(13,(char*)MissionImp);
               //Serial.println("5");playRtttlBlockingPGM(13,(char*)Entertainer);
               //Serial.println("6");playRtttlBlockingPGM(13,(char*)Muppets);
               //Serial.println("7");playRtttlBlockingPGM(13,(char*)Flinstones);
               //Serial.println("8");playRtttlBlockingPGM(13,(char*)YMCA);
               //Serial.println("9");playRtttlBlockingPGM(13,(char*)Simpsons);
               //Serial.println("10");playRtttlBlockingPGM(13,(char*)Indiana);
               //Serial.println("11");playRtttlBlockingPGM(13,(char*)TakeOnMe);
               //Serial.println("12");playRtttlBlockingPGM(13,(char*)Looney);
               //Serial.println("13");playRtttlBlockingPGM(13,(char*)_20thCenFox);
               //Serial.println("14");playRtttlBlockingPGM(13,(char*)Bond);
               //Serial.println("15");playRtttlBlockingPGM(13,(char*)GoodBad);
               //Serial.println("16");playRtttlBlockingPGM(13,(char*)PinkPanther);
               //Serial.println("17");playRtttlBlockingPGM(13,(char*)A_Team);
               //Serial.println("18");playRtttlBlockingPGM(13,(char*)Jeopardy);
               //Serial.println("19");playRtttlBlockingPGM(13,(char*)Gadget);
               //Serial.println("20");playRtttlBlockingPGM(13,(char*)Smurfs);
               //Serial.println("21");playRtttlBlockingPGM(13,(char*)Toccata);
               //Serial.println("22");playRtttlBlockingPGM(13,(char*)Short);
               Serial.println("23");playRtttlBlockingPGM(13,(char*)JingleBell);
               //Serial.println("24");playRtttlBlockingPGM(13,(char*)Rudolph);
               //Serial.println("25");playRtttlBlockingPGM(13,(char*)WeWishYou);
               //Serial.println("26");playRtttlBlockingPGM(13,(char*)WinterWonderland);
               //Serial.println("27");playRtttlBlockingPGM(13,(char*)OhDennenboom);
               //Serial.println("28");playRtttlBlockingPGM(13,(char*)LetItSnow);
               //Serial.println("29");playRtttlBlockingPGM(13,(char*)Frosty);
               Serial.println("30");playRtttlBlockingPGM(13,(char*)SilentNight);
               //Serial.println("31");playRtttlBlockingPGM(13,(char*)LastChristmas);
               //Serial.println("32");playRtttlBlockingPGM(13,(char*)AllIWant);
               Serial.println("33");playRtttlBlockingPGM(13,(char*)AmazingGrace);
               Serial.println("再生終了 ");buz2();
               IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);
}
void demo13(){ Otto.walk(3,800,1);}  // FORWARD  ↑キー
void demo14(){ Otto.walk(3,800,-1);} // BACKWARD ↓キー
void demo15(){ Otto.turn(3,800,1);}  // LEFT     ←キー
void demo16(){ Otto.turn(3,800,-1);} // RIGHT    →キー
void buz1(){tone(Buzzer,880,100);delay(200);noTone(Buzzer);
     IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);}
void buz2(){tone(Buzzer,880,100);delay(200);noTone(Buzzer);tone(Buzzer,880,100);delay(200);noTone(Buzzer);
     IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);}


/* 動作コード設定一覧
ジェスチャー(8x8LEDで口の動作可能)
Otto.playGesture(OttoSuperHappy);//ハッピー
Otto.playGesture(OttoHappy);//ハッピー2
Otto.playGesture(OttoSad);//悲しい
Otto.playGesture(OttoSleeping);//ねむり
Otto.playGesture(OttoConfused);//混乱
Otto.playGesture(OttoFretful);//気が重い
Otto.playGesture(OttoLove);//愛
Otto.playGesture(OttoAngry);//いかり
Otto.playGesture(OttoMagic);//マジック
Otto.playGesture(OttoWave);//ウェーブ
Otto.playGesture(OttoVictory);//勝利
Otto.playGesture(OttoFail);//失敗 倒れる
Otto.playGesture(OttoFart); //おなら

ダンス(回数,速度,動作,左右)
速度:ノーマル1000 スロー2000 ベリースロー3000 速い750 高速500 超高速250
動作:ノーマル25 小さく10 大きく40
    Otto.moonwalker(1, 1000, 25, 1);Otto.moonwalker(1, 1000, 25, -1);
    Otto.crusaito(1, 1000, 25, 1);Otto.crusaito(1, 1000, 25, -1);
    Otto.flapping(1, 1000, 25, 1);Otto.flapping(1, 1000, 25, -1);
    Otto.bend(1,800,1);Otto.bend(1,800,-1);
    Otto.shakeLeg(1,800,1);Otto.shakeLeg(1,800,-1);

実行(回数,速度,動作)
速度:ノーマル1000 スロー2000 ベリースロー3000 速い750 高速500 超高速250
動作:ノーマル25 小さく10 大きく40
    Otto.swing(1, 1000, 25);
    Otto.updown(1, 1000, 25);
    Otto.tiptoeSwing(1, 1000, 25);
    Otto.jitter(1, 1000, 25);
    Otto.ascendingTurn(1, 1000, 25);
    Otto.walk(3,800,1);Otto.walk(3,800,1);//前後
    Otto.turn(3,800,1);Otto.turn(3,800,-1);//左右

キャリブレーション
    Otto.setTrims(0,0,0,0);

動く(速度、足左、足右、足首左、足首右角度)
    Otto_moveLegs(200,90,90,90,90);

ブザー音(ピン番号、周波数、長さ)
tone( Buzzer,1500,500);delay(1000); noTone(Buzzer);
*/