close

這次的專題,因為很多資料都是在很多專家高手的Blog查到的

所以決定效法他們來造福(?)他人

不過這並不是一篇純知性的文章

前後夾雜了很多過程中的故事和心情,以整體來說比較像是一篇...呃......心得日記吧!

如果讓你覺得故事有點跳來跳去......就體諒一下新手部落客吧><

段落連結>>  前情提要   Servo的改裝   藍芽連線   統整組裝   測試影片看這裡   漏掉的故事情節   心得


 

「同學們~ 我們這次微處理機要來做的 Arduino專題報告喔~  你們可以自己做或是分組,但是一組最多2個人,加油吧!」

嗯...像我這種初階級的 Arduino玩家,當然得找個伴carry我啊


 

才這麼一想,就有個同學問我能不能跟我一組 (該同學以下稱...嗯......Mr.L 好了)

噢...這下子有趣了  怎麼說? 因為Mr.L 在班上是個人緣不好而這方面也不強的人,而我是少數對他比較好一點點的人 (仔細想想事實上也就真的那麼一點點)

哎呀呀~該怎麼辦勒? 我應該婉拒他去找個跟我比較容易合作的人呢? 還是只因為同情他就答應他呢?

嗯...上次公訓沒跟他一組他一整個就很受傷的樣子...如果我這次跟他一組,下次就有理由拒絕了。好吧!這次就先答應他好了


 

決定好組員之後,我們開始討論要做什麼

我一開始是想做一台遙控戰車,這樣馬達就只要用 Arduino的 5V電壓輸出即可推動的伺服馬達就好了,而且轉彎什麼的就跟真的戰車一樣很好解決,對一個WOT玩家幾乎不構成問題

後來我也忘記為什麼他會去找到一台「水陸兩用車」...

好吧!如果都聽我的感覺好像我是你的上司一樣,這次就依你吧

於是,我們ㄉ專題題目: Arduino藍芽水陸兩用車



 

再來該講講我們究竟做了些什麼了


 

首先,車子的輪子,我們使用方便控制的伺服馬達(以下稱Servo),而型號則選擇較便宜的SG90

知道的人可能會問:「你們用一顆只能轉180度的馬達當輪子?!」

嗯...這問題很棒,我們的馬達當然有經過改裝,這也是我們第一階段的工作

 

蛤?! 你問什麼是伺服馬達?! 呃...我的專題報告已經在PPT跟Word各打一次了.....

唉呀好啦簡單說明

伺服馬達又稱為伺服機,屬於直流馬達
依其動作方式可分為兩種,一為180度定位型(SG90屬於此類),二為360度連續旋轉型
共通點是利用脈波寬度調變(PWM)來控制轉動角度或轉速。
(不要問我PWM是什麼,自己去查。不過會看這篇文章的人大部分都會知道吧)
用簡單的程式和單晶片本身的5V輸出即可控制,比傳統馬達來的容易許多

控制Servo的脈波週期一般為20mS

當脈寬為  1.5mS時(D = 7.5%) ,Servo定位在正中間 或是 停止轉動

當脈寬大於1.5mS或小於1.5mS時(D > 7.5% or D < 7.5%) , Servo 會逆時針or順時針旋轉一個角度 或 逆時針or順時針旋轉
脈寬不可超過2.5mS或低於0.5mS(2.5% ≦ D ≦ 12.5%) 在極值時角度逆時針偏轉約0°or180° 或 以最快速度旋轉

脈寬越靠近極值,所偏轉之角度越大 或 旋轉速度越快

不過你還是得看你是要做什麼,如果你是要做電風扇或是大台一點的車子,就不適合使用Servo

 

好,回歸正題

首先這是一顆正常的Servo,要改裝它,想也知道當然得把它拆解開

 

這就是把它底部螺絲鬆開拆解,把齒輪拿起來的樣子

      

接下來,將 Servo的 Pin腳接上 Arduino,咖啡色的接GND 紅色接VCC(5V) 然後黃色的接在訊號輸出腳

利用 Arduino內建的Servo函式庫程式碼(以下稱 code)將伺服馬達的角度設定至90度:

-------

#include <Servo.h>

 Servo myservo;     //定義伺服馬達
 
 void setup() 
 { 
   Serial.begin(9600);  //設定鲍率
   myservo.attach(6);   //設定輸出腳位
 } 

 void loop() 
 { 
   int d;
   if(Serial.available())
  {
     d = Serial.parseInt();
     Serial.println(d);
     if(0 <= d && d <= 180)
     {
       myservo.write(d);  //寫入角度
     }
   }
 }

-------

利用這個code,把序列埠監控視窗打開,輸入0~180,Servo就會轉至相對應的角度

所以輸入90,讓它轉到90度,但是因為你把它拆開了,所以它可能會一直轉不會停下來

所以要轉動圖中的那個旋鈕(右邊黃色那根),那是個可變電阻(以下稱VR,Variablr Resister, 不是虛擬實境),要把它轉到一個讓Servo停下來的角度

建議可以插上那個最大顆的齒輪再轉,這樣不但比較好轉,也不會因為手去碰它而影響了阻值 (經驗談XD

Servo 停下之後,利用快乾或什麼的,把可變電阻黏住、固定,讓它再也不能轉動,這部分就先告一個段落

 

再來是齒輪的部分 (如果你剛剛把它裝上VR了記得拔下來時盡量去不要轉到)

拆解之後你應該會注意到,VR的旋鈕為了要固定大齒輪,所以它跟大齒輪的孔是半圓而不是圓的

除此之外,大齒輪底下還有兩塊突起來的小方塊

所以你現在要做的,就是把大齒輪半圓的洞挖成圓的,並且除去小方塊  (圓的大小以不卡住VR的轉軸為原則)

最後,把所有的零件裝回去,就......

Do Ra Mi So ~  完成啦!!!!

現在輸入數值後,它不會轉到特定的角度,而是以不同速度往順時針或逆時針方向不同旋轉,而原本的90度則為停止

 

以 台中電子街 今華電子 的價格來說

180度的SG90 要80$  而一顆360度的Servo我記得是320$還是360$

整整省下了約4~5倍的成本呀!

 

而如果你真的很不幸的在VR固定後發現 90度時仍會有些微的轉動或是微小的馬達震動,沒能完全停止

這時候只要把輸入的值加減個1~5,找到讓它完全停止的值,在寫code時記得輸入的是該數值就可以了

可別像我一開始一樣以為沒救了就用了另外一個讓我差點沒崩潰的方法重新改造

另外一個方式是什麼  因為很麻煩所以也不想講了

 

參考資料:http://gsyan888.blogspot.tw/2016/01/diy-sg90-servo-360.html

(另一個方式:http://gsyan888.blogspot.tw/2014/12/diy-towerpro-sg90-servo-360.html  因為我拿到的Servo 裡VR的腳是金屬棒狀而不是多芯線,讓我除了焊接又多費了一番功夫想辦法把它剪斷)

(對不起我忘記我的Servo test code是從哪個網頁找ㄉ了QAQ)   (抱歉我那時忘記拍齒輪的照片 ㄎㄎ)


 

接下來是藍芽連線的部分

 

我們當然是用最簡單又可以發射接收改來改去的HC-05  

(讀者:Arduino 的藍芽模組也不就05、06這兩顆不然呢==?)

Arduino藍芽模組的介紹網路上一堆  所以我就不再贅述了

這裡要好好謝謝另一位好同學 Mr.T,這部分要是沒有他凱瑞一波我大概就完了

至於連線的部分也是利用他推薦的 Bluetooth Terminal HC-05

幸好有這個,不然那個自己寫壞的APP應該會把我弄到崩潰*2

下面的對話框是發送指令的地方,BTN 是指 Botten, 點進去可以設定輸出指令,這樣就不需要一直打字

而上面的黑色框框則是 Arduino回傳的資料(序列埠的資料)

加入回傳程式的優點就是 可以確定HC-05到底有沒有收到資料 方便Debug

-------
#include <SoftwareSerial.h>   // 引用程式庫
SoftwareSerial BT(2,4); // TX, RX
int val = 0; 

void setup() 
{
  Serial.begin(9600);
  Serial.println("BT is ready!");
  BT.begin(9600);
}

void loop() 
{
  if (Serial.available())    // 若收到「序列埠監控視窗」的資料,則送到藍牙模組
  {
    val = Serial.read();
    BT.write(val);
  }

  if (BT.available())         // 若收到藍牙模組的資料,則送到「序列埠監控視窗」
  {
    val = BT.read();
    Serial.print(val);
    BT.write(val);
  }
}

-------

(code感謝 Mr.T提供)

如果一直失敗的話... 或許是你 RX TX 接反了

不然就讓它冷卻一下吧XD


 

問題都處理完了,接下來就該整體測試啦

 

因為遙控車是利用輸入來決定移動方向

所以我的code 是利用 swich(in) 的方式在序列埠監控視窗輸入指令控制伺服馬達

一開始他接收到指令只能轉動一點點,於是請教了高手 -- 刺蝟 

「不然用while迴圈試試看吧!」

試來試去改來改去,卻都還是行不通

(甚至一度因為把5V插成3.3V導致Servo不動還以為它們死了,跑去砸了500$買了自旋式Servo回來發現原來只是插錯而且根本買回來還買錯型號!!!根本超悲劇QAQ)

 

在某個我繼續嘗試的晚上,因為我家有睡前一起禱告的習慣,所以我想禱告完再來弄好了不然其他人想睡覺

回來之後,「嗯...這兩顆Servo停止的數值是92...改一下好了」

改了之後,再試一次,輸入!    (轉轉轉轉轉轉轉轉~)

什麼?!!!成功了?!!這...這不科學呀!!它...它成功了!這除了是神蹟還是什麼!我還沒加迴圈呀!!

來看看成功的影片吧

 

再來就要脫離麵包版焊上900孔洞洞板啦

這部份決定交給咱們Mr.L 來做,為了省事(不放心就說啦),我簡單畫了一張佈線圖,所以他只需要完全的按圖施工

隔了幾天他把成品拍照給我看 問我這樣是不是錯了

因為之前他的問題我不是不會就是聽不懂,所以我也沒多看,就告訴他只要VCC、GND不要錯,其他的只要是接到IO腳都好處理

結果後來看到成品...... 什麼?!!你真的按照我的圖把它焊在銅箔面?!!我畫的是元件面而不是銅箔面呀!而且你Servo的腳位用母座是要怎麼接!!!

(後來翻了一下對話紀錄,噢...老天...我只能說我當初應該好好思考一下你的問題......雖然你的表達真的也不有問是沒題......)

唉...這...反過來接也行不通......這...真的只能...重焊了......(阿不就好險你接Arduino的排針沒有全部焊上去還拆得下來(呼~))

(拆下可用元件後的殘骸)

最後,還是由我親自操烙鐵  (本來還覺得我好像把麻煩事都丟給你有點不好意思...)

結果一個不小心把HC-05的排針焊得太近了...... (這樣...呃...應該...還行吧...?)

 

電路測試

YA~~ 大功告成!! (保險起見HC-05還是用杜邦線接好了)

 

 

測試影片看這裡~

至於測試花絮...算了吧我懶得弄了有人想看再說吧

 

成果程式碼? 想要? 才不要給你哩~

只給你滿滿的 白~屏~

 

(讀者:看到這麼多黑條大概就知道只要反白...((作者:閉嘴((摀住

#include <SoftwareSerial.h>   // 引用程式庫
SoftwareSerial BT(2,4);             // TX, RX

#include <Servo.h>                 // 引用程式庫
Servo servoL;                           //定義Servo
Servo servoR;
int val = 0;

void setup()
{
  Serial.begin(9600);
  Serial.println("BT is ready!");
  BT.begin(9600);
  servoL.attach(12);  //設定輸出訊號腳位
  servoR.attach(6);
  servoL.write(91);   //設定初始值
  servoR.write(94); 
}

void loop()
{
 // 若收到「序列埠監控視窗」的資料,則送到藍牙模組
  if (Serial.available())
  {
    val = Serial.read();
    BT.write(val);
  }
                                                                                                 
  // 若收到藍牙模組的資料,則送到「序列埠監控視窗
  if (BT.available()) 
  {
    val = BT.read();
    Serial.print(val);
    BT.write(val);
  }

 
  switch (val)
  {
    case'w':                    //往前
    servoL.write(180);
    servoR.write(50);
    delay(3000);            //因為藍芽發送只能讓Servo轉動一個瞬間
    break;                      //只好用delay讓它往前QQ

  
    case's':                    //後退
    servoL.write(0);
    servoR.write(115);
    delay(2000);
    break;

    case'a':                    //右轉
    servoL.write(91);
    servoR.write(50);
    delay(1500);
    break;

    case'd':                   //左轉
    servoL.write(180);
    servoR.write(91);
    delay(1500);
    break;

    default:
    servoL.write(91);
    servoR.write(91); 
  }
  Serial.write(val);
  Serial.println(' ');       //顯示在序列埠視窗
 }

 




 

在這裡補充一點劇情

 

事實上在幾次討論後我覺得題目改成「多功能自走車」比較保險,避免做不出來的窘境

果然

你一定會發現我的標題和最後的成果完全沒看到半滴水

因為真的最後只完成這樣,其他的什麼避障聲控水陸兩用通通都不要了

根本來不及也做不出來嘛QAQ

至少作業來得及交差了(呼~

等畢業專題再好好改善吧

 

在討論的過程中,我們也遇到很~很多多的瓶頸

一開始,Mr.L 提出什麼,我質疑什麼
他單純的認為:這樣就好啦、用什麼就好啦 的部分,我都覺得:可是你這樣這個難道不會怎樣嗎、用這樣那那個要怎麼辦
而他覺得:糟糕、慘了、該怎麼辦 的問題,對我來說卻是:根本不比擔心那個,就怎樣怎樣不就得了
光是如何防水這件事,他幾乎每個方法都被我駁回,討論到最後,我要他做好就好怎麼做都隨便了,因為我根本沒有力氣再思考那樣倒底行不行得通了
因為這看似深不見底(誇飾)的代溝,導致很多次我對他的態度都很差

甚至有一次同學問到
「欸你們專題做的怎麼樣」 「喔  就剩藍芽連線的部分啊」 「那他有在做事嗎」 「喔哈哈 我覺得我比他還廢欸w 他APP都寫好了就等我...」 「那我怎麼看你常常在兇他啊?」 「呃...因為他有些想法就很...」 「喔好 我懂我懂XD」

...好 我真的很抱歉有時候不小心就有點崩潰失控了(我真的有那麼兇嗎p.p) 

(從最後一句也可以看出來他在班上可憐的處境了吧www)

不過他後來也跑來跟我說謝謝我願意跟他同組 (真心希望沒有下次了...)

 


 

這次的專題,不論是在專業、技術、或是人際關係
我都學到了很多

先講講技術層面好了

原本我的Servo測試是用從課本附的光碟裡找到用脈寬控制的程式
後來才發現原來Arduino裡有內建的Servo函式庫,可以再省去一些小複雜的地方

也學會了控制藍芽模組的方法(接收而已,主動發送還不會 www)

對 威力導演 的使用也更熟悉了一點 (有看成果影片就會懂)

 

人際關係和生活的部分呢~ (本文精華(?))

千萬不要做個爛好人
雖然有個願意幫助人、憐憫人的心很值得讚賞,但是在伸出援手之前,還是得先衡量一下自己的能力。不然很可能不但沒幫到忙,還把自己給拖垮了

時間一定要安排好
這真是太重要了。不要把事情都拖到最後才處理,應該要把事情一個階段一個階段的分配好。不然拖到最後不但會把自己弄得一團亂,甚至可能連成果都交不出來

不要越級打怪
設立一個自己能力範圍內的目標,才不會做得非常辛苦最後還失敗覺得自己糟糕透頂。做個簡單一點的,不但輕鬆快樂又有成就感不是很好嗎(當然也要有點程度可以看啦!不是說隨便找個菜鳥等級的東西敷衍了事)

然~後...

分組還是要找個志同道合好溝通的組員,而且動作要快,這樣有辦法說:不好意思 我已經跟誰誰誰一組了

成績通常大於人情,有時候該堅持的就別妥協吧

平時就要跟那些成績很好的同學打好交情,分組或需要時才有人可以求carry

做事要有B計畫

嗯...大概就這樣了吧!

 

好~了! 這次的心得分享就到這裡

謝謝大家\(^_^)/

 

有任何的建議或是問題 歡迎在下方留言 我會盡快回復您喔^_^

 

昨天專題發表完  下星期就要段考了

我很高興我還可以花兩個晚上把這篇文章寫完

arrow
arrow

    發表在 痞客邦 留言(0) 人氣()