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 程式,移到下一個單元來說明