作成したロボットのプログラムを掲載します。
テレビのリモコンで色々な動作を指示することができますので、試して遊んでみてください。
arduinoIDEというソフトでマイコンに書き込むためのプログラムになります。
わかりやすいように、接続図も作りました。
皆さんの参考になれば幸いです。
ottodiyのサイト
// 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);
*/
