03-官網程式
(2017/04/09)
參考資料:Arduino Otto 跳舞機器人
官網:http://otto.strikingly.com/
Otto的Arduino Source Code網址:https://github.com/OttoDIY/OttoDIY
下載(約27MB)
解壓
將上面libraries下的資料夾複製到arduino下的libraries下
測試內附程式
測試 OTTO_avoid程式
適時擋住超音波感測器時,會呈現不同動作或聲響。
<註>後來發現新版的一直出問題(如下)
void setup(){
//Set the servo pins
//Otto.init(PIN_YL,PIN_YR,PIN_RL,PIN_RR,true, -1, -1, 8, 9); //一直出錯
Otto.init(PIN_YL,PIN_YR,PIN_RL,PIN_RR,true); //改成舊版,不要加後面的參數,就OK了
Otto.sing(S_connection); //Otto wake up!
Otto.home();
delay(50);
Otto.sing(S_happy); // a happy Otto :)
}
測試 OTTO_smooth_criminal (犯罪高手) 程式
開啟檔案與燒錄,作法同上
有沒有發現OTTO跳一支舞給您看~~
測試 OTTO_todo 程式
開啟檔案與燒錄,作法同上
從程式中,可知OTTO有5種模式:
也可在序列埠下【指令】(都是大寫)來完成一些動作
在指令列下指令
指令 S (停止)
這是第一個要知道的指令,就是停止!
//-- Function to receive Stop command.
void receiveStop(){
sendAck();
Otto.home();
sendFinalAck();
}
指令 M (與移動有關,這是最熱鬧的部分)
//-- Function to receive movement commands
void receiveMovement(){
sendAck();
if (Otto.getRestState()==true){
Otto.setRestState(false);
}
//Definition of Movement Bluetooth commands
//M MoveID T MoveSize
char *arg;
arg = SCmd.next();
if (arg != NULL) {moveId=atoi(arg);}
else{
Otto.putMouth(xMouth);
delay(2000);
Otto.clearMouth();
moveId=0; //stop
}
arg = SCmd.next();
if (arg != NULL) {T=atoi(arg);}
else{
T=1000;
}
arg = SCmd.next();
if (arg != NULL) {moveSize=atoi(arg);}
else{
moveSize =15;
}
}
//-- Function to execute the right movement according the movement command received.
void move(int moveId){
bool manualMode = false;
switch (moveId) {
case 0:
Otto.home();
break;
case 1: //M 1 1000 前進
Otto.walk(1,T,1);
break;
case 2: //M 2 1000 後退
Otto.walk(1,T,-1);
break;
case 3: //M 3 1000 向左
Otto.turn(1,T,1);
break;
case 4: //M 4 1000 向右
Otto.turn(1,T,-1);
break;
case 5: //M 5 1000 30 上升
Otto.updown(1,T,moveSize);
break;
case 6: //M 6 1000 30 月球漫步向左走
Otto.moonwalker(1,T,moveSize,1);
break;
case 7: //M 7 1000 30 月球漫步向右走
Otto.moonwalker(1,T,moveSize,-1);
break;
case 8: //M 8 1000 30 搖擺
Otto.swing(1,T,moveSize);
break;
case 9: //M 9 1000 30 扭一扭
Otto.crusaito(1,T,moveSize,1);
break;
case 10: //M 10 1000 30 扭一扭
Otto.crusaito(1,T,moveSize,-1);
break;
case 11: //M 11 1000 跳
Otto.jump(1,T);
break;
case 12: //M 12 1000 30 撲
Otto.flapping(1,T,moveSize,1);
break;
case 13: //M 13 1000 30 撲
Otto.flapping(1,T,moveSize,-1);
break;
case 14: //M 14 1000 20 墊腳尖
Otto.tiptoeSwing(1,T,moveSize);_
break;
case 15: //M 15 500 向左彎曲
Otto.bend(1,T,1);
break;
case 16: //M 16 500 向右彎曲
Otto.bend(1,T,-1);
break;
case 17: //M 17 500 搖右腳
Otto.shakeLeg(1,T,1);
break;
case 18: //M 18 500 搖左腳
Otto.shakeLeg(1,T,-1);
break;
case 19: //M 19 500 20 雙腳抖動
Otto.jitter(1,T,moveSize);
break;
case 20: //M 20 500 15 上升
Otto.ascendingTurn(1,T,moveSize);
break;
default:
manualMode = true;
break;
}
if(!manualMode){
sendFinalAck();
}
}
光 M 的指令就一共有20種動作可做
控制前後左右的指令如下:
//M MoveID T MoveSize
前進 ==> M 1 或 M 1 1000 (動作較快) 或 M 1 2000 (動作較慢,變慢動作)
後退 ==> M 2
向左 ==> M 3
向右 ==> M 4
指令 T (與蜂鳴器有關)
蜂鳴器指令(Tone)為 T 頻率 毫秒時間
例如:
T 523 500
T 1046 1000
音階--頻率對照表(單位:Hz)
指令 K (與聲音音效有關)
//-- Function to receive sing commands
void receiveSing(){
//sendAck & stop if necessary
sendAck();
Otto.home();
//Definition of Sing Bluetooth commands
//K SingID
int sing = 0;
char *arg;
arg = SCmd.next();
if (arg != NULL) {sing=atoi(arg);}
else
{
Otto.putMouth(xMouth);
delay(2000);
Otto.clearMouth();
}
switch (sing) {
case 1: //K 1
Otto.sing(S_connection);
break;
case 2: //K 2
Otto.sing(S_disconnection);
break;
case 3: //K 3 驚喜聲
Otto.sing(S_surprise);
break;
case 4: //K 4 哦1
Otto.sing(S_OhOoh);
break;
case 5: //K 5 哦2
Otto.sing(S_OhOoh2);
break;
case 6: //K 6 可愛
Otto.sing(S_cuddly);
break;
case 7: //K 7 睡覺
Otto.sing(S_sleeping);
break;
case 8: //K 8 好開心
Otto.sing(S_happy);
break;
case 9: //K 9 超開心
Otto.sing(S_superHappy);
break;
case 10: //K 10 微開心
Otto.sing(S_happy_short);
break;
case 11: //K 11 傷心
Otto.sing(S_sad);
break;
case 12: //K 12 迷惑
Otto.sing(S_confused);
break;
case 13: //K 13 放屁1
Otto.sing(S_fart1);
break;
case 14: //K 14 放屁2
Otto.sing(S_fart2);
break;
case 15: //K 15 放屁3
Otto.sing(S_fart3);
break;
case 16: //K 16
Otto.sing(S_mode1);
break;
case 17: //K 17
Otto.sing(S_mode2);
break;
case 18: //K 18
Otto.sing(S_mode3);
break;
case 19: //K 19 按鈕按下
Otto.sing(S_buttonPushed);
break;
default:
break;
}
sendFinalAck();
}
自己測試看看能發出什麼聲音(音效)
//K SingID
K1 - K19
指令 H (好像與手勢有關)
//-- Function to receive gesture commands
void receiveGesture(){
//sendAck & stop if necessary
sendAck();
Otto.home();
//Definition of Gesture Bluetooth commands
//H GestureID
int gesture = 0;
char *arg;
arg = SCmd.next();
if (arg != NULL) {gesture=atoi(arg);}
else
{
Otto.putMouth(xMouth);
delay(2000);
Otto.clearMouth();
}
switch (gesture) {
case 1: //H 1 好開心
Otto.playGesture(OttoHappy);
break;
case 2: //H 2 超開心
Otto.playGesture(OttoSuperHappy);
break;
case 3: //H 3 傷心
Otto.playGesture(OttoSad);
break;
case 4: //H 4 睡覺
Otto.playGesture(OttoSleeping);
break;
case 5: //H 5 放屁
Otto.playGesture(OttoFart);
break;
case 6: //H 6 迷惑
Otto.playGesture(OttoConfused);
break;
case 7: //H 7 愛
Otto.playGesture(OttoLove);
break;
case 8: //H 8 生氣
Otto.playGesture(OttoAngry);
break;
case 9: //H 9 煩躁
Otto.playGesture(OttoFretful);
break;
case 10: //H 10 神奇
Otto.playGesture(OttoMagic);
break;
case 11: //H 11 波動
Otto.playGesture(OttoWave);
break;
case 12: //H 12 勝利
Otto.playGesture(OttoVictory);
break;
case 13: //H 13 失敗
Otto.playGesture(OttoFail);
break;
default:
break;
}
sendFinalAck();
}
自己測試看看能做什麼動作及發出什麼聲音(音效)
//H GestureID
H1 - H13
指令 G (與伺服馬達有關)
//Definition of Servo Bluetooth command
//G servo_YL servo_YR servo_RL servo_RR
//Example of receiveServo Bluetooth commands
//G 90 85 96 78
可設定四個伺服馬達的角度
G 左上 右上 左下 右下
指令 R (設定名字)
R 名字(英文,不能空格)
指令 E (顯示名字)
指令 D (顯示超音波感測器測到的距離)
指令 B (顯示電池的電量)
指令 I (顯示Program的ID),像本例是Otto_todo
=============================================
測試 OttoDIY_EasyBluetooth 程式,移到下一個單元來說明