2018年12月19日 星期三

素人組Otto

我最早是到thingiverse的網站抓3D圖檔,
https://www.thingiverse.com/thing:2398231

但是發現底下的網站還有其他的類型
https://wikifactory.com/+OttoDIY#project

而要找程式碼時,是到雲林SONG去抓的,
https://yunlinsong.blogspot.com/2016/12/arduino-otto.html

因為整個過程紊亂且資訊散落,自己又記不住這麼多,所以寫一篇作為紀錄

要注意的是,藍芽的HC-05跟HC-06設定,會因為買到的模組版本不一樣,連接時的設定也會不一樣,我以為比較簡單的HC-06一直無法穩定連線,反而是HC-05順利成功,因為要進入AT MODE設定,而HC-05跟HC-06進入的方法不一樣,另外早期買的藍牙模組CC41-A跟新版的android無法連線,這些問題就開不同文章記錄。

基本上,想要玩藍芽遙控的OTTO只需要可以連線就好,不管是哪一種規格,只要先設定好連線用的名稱跟密碼就可以,還有一個要注意的是藍牙直接連到RX跟TX,所以想把程式傳送到arduino的時候,需要把藍牙模組拔掉,不然沒辦法順利傳進去。

藍芽的連線設定說明寫在另外一篇,
完成底下設定的內容就好
設定名稱:"AT+NAME=Zowi"
設定密碼:"AT+PSWD=1234"
設定速率:"AT+UART=115200,1,0"


雖然安裝Otto的影片網路上很多,但是大部分就比較簡略,底下這個影片應該是一個素人安裝的,所以比較仔細,不過最好先看完一次,因為他嘗試好幾次才會對,先看完才不會跟著一起嘗試錯誤。
https://www.hackster.io/ottoplus/otto-diy-arduino-bluetooth-robot-easy-to-3d-print-33406c


還有,在做了三隻之後,個人經驗是不用先校正馬達,而是邊安裝邊校正,我是分階段進行,先安裝上股關節的馬達,校正後再把撥片裝上去,接著安裝膝蓋關節的馬達,校正後再把撥片裝上去,如果先校正好再安裝,在過程中可能會動到,安裝撥片上去就不準了。

依據行進方式跟外觀的不同,我分成三種類型,因為寫程式的時候要分清楚
1.兩隻腳
2.兩隻腳跟兩隻手
3.輪胎或履帶

一開始安裝的時候,也是糊里糊塗的,每個程式都不清楚,最後我只有使用底下兩個
OTTO_ServoHome:這是校正馬達用的
OTTO_BT              :這是有藍芽連線功能,測試的時候,好幾個功能不能用,比如MODE

如果不使用藍芽遙控功能,而是要自己編輯動作寫程式的話,我是使用mblock (mBlock 3 for PC),

http://www.mblock.cc/mblock-software/

安裝好mBlock之後,要讓它認識otto的功能的話,還要安裝extension裡面的ottodiy,接著把arduino相關的功能都安裝好之後,就可以連線,把程式碼傳過去了
我是看底下的影片才有點概念
https://www.youtube.com/watch?v=6cpj8iwdlck


基本款就是會走跟偵測前方障礙物,雖然還有其他,但是我只看到touch sensor跟麥克風,而RGB LED我就不知道要裝哪裡。

在進化一點,就有表情了,一樣都可以在底下網站找到各種外型
https://wikifactory.com/+OttoDIY#project


拆解OTTO的動作
除了預設好的動作之後,因為自己也想試試看有沒有其他動作,所以就繼續參考雲林SONG的說明
https://yunlinsong.blogspot.com/2018/01/otto.html

說實話,對於不是本科系的我看得很吃力,只好按部就班的一個一個寫下來
OTTO_BT是用藍芽控制otto的動作,裡面預設20種,在接收到藍芽指令之後,做出相對應的動作,就是底下這段程式碼
void move(int moveId){
  bool manualMode = false;

  switch (moveId) {

第17個的動作是
    case 17: //M 17 500
      Otto.shakeLeg(1,T,1);

呼叫了shakeleg函式,帶有三個參數,於是搜尋otto.cpp,發現了底下的程式碼

//---------------------------------------------------------
//-- Otto gait: Shake a leg
//--  Parameters:
//--    steps: Number of shakes
//--    T: Period of one shake
//--    dir: RIGHT=Right leg LEFT=Left leg
//---------------------------------------------------------
void Otto::shakeLeg (int steps,int T,int dir){

  //This variable change the amount of shakes
  int numberLegMoves=2;

  //Parameters of all the movements. Default: Right leg
  int shake_leg1[4]={90, 90, 58, 35}; 
  int shake_leg2[4]={90, 90, 58, 120};
  int shake_leg3[4]={90, 90, 58, 60};
  int homes[4]={90, 90, 90, 90};

  //Changes in the parameters if left leg is chosen
  if(dir==-1)   
  {
    shake_leg1[2]=180-35;
    shake_leg1[3]=180-58;
    shake_leg2[2]=180-120;
    shake_leg2[3]=180-58;
    shake_leg3[2]=180-60;
    shake_leg3[3]=180-58;
  }

  //Time of the bend movement. Fixed parameter to avoid falls
  int T2=1000; 
  //Time of one shake, constrained in order to avoid movements too fast.         
  T=T-T2;
  T=max(T,200*numberLegMoves);

  for (int j=0; j<steps;j++)
  {
  //Bend movement
  _moveServos(T2/2,shake_leg1);
  _moveServos(T2/2,shake_leg2);

    //Shake movement
    for (int i=0;i<numberLegMoves;i++)
    {
    _moveServos(T/(2*numberLegMoves),shake_leg3);
    _moveServos(T/(2*numberLegMoves),shake_leg2);
    }
    _moveServos(500,homes); //Return to home position
  }

  delay(T);
}

本來想試著照樣自己做個動作,竟然出現
compilation terminated.
編譯時發生錯誤

In file included from Otto.cpp:10:0:
Otto.h:6:20: fatal error: EEPROM.h: No such file or directory
 #include <EEPROM.h>

但是,我明明沒有看到include otto.h,而且在寫otto程式的時候,也不會出現錯誤,在交叉比對之下,發現mblock並沒有把EEPROM 給include進來,只好打開arduino IDE自己編輯。

後來,把電腦關掉重開就好了。

因為分解動作的程式碼對我來說還是很困難,所以我自己寫號碼上去,一個一個觀察

土法煉鋼的寫出一個抖右腳的動作。






沒有留言:

張貼留言