工程筆記本 / AppInventor - 圖形化Android

AppInventor - 圖形化Android

【雙A計劃】Part4:App Inventor 藍牙遙控 Arduino 雙輪機器人

CAVEDU 阿吉 - 雜工📅 2014-05-22👁 53

雙A計畫來到第五篇了,您都 follow 了嗎?在手機上製作多個按鈕,分別發送不同的字元來控制 Arduino 機器人。

雙A計畫文章總覽:

中文系列文章

English version
 
作者/攝影   曾吉弘
難度

★★★☆☆

材料表
  • Android系統智慧型手機
  • Arduino相容開發板(機器人王國購物連結,請點我)本文使用 Arduino MEGA2560
  • 藍牙收發接收器,本系列使用JY-MCU04 或 JY-MCU05
  • 麵包板
  • 具備2個連續型伺服馬達的車身,右側馬達的訊號線接在 D12 腳位,左側則是13。並分別接電與接地。
  • 9V電池,為機器人供電。如果用 USB 的話,馬達可能轉得非常慢或根本不會轉。
【推薦套件】自學者的天堂|Arduino 入門到雲端基本套件包
下載 範例程式請點我下載(App Inventor中文學習網檔案庫)  App Inventor 2檔名:BTRobot.aia

範例影片如下:

https://www.youtube.com/watch?v=xeLjGcejtsQ   先根據下圖,將藍牙與兩個 servo motor 接上Arduino。 *請注意如果您要用直流馬達的話,就要使用 TA7279p 或 L293D  等馬達驅動電路。或是國產的 motoduino 控制板(已整合 L293D 晶片)

App Inventor 編寫藍牙訊息接收程式

畫面元件很簡單,點選 BT List 之後,會顯示藍牙配對裝置清單,點選您已經配對好的藍牙裝置之後,就會顯示一個包含有五個按鈕的操作介面。 a001 以下是安裝到實體手機上的截圖 [gallery columns="2" size="large" ids="11214,11213"]    

程式說明:

本段程式重點在於按下不同的按鈕就會藉由 BluetoothClient元件發送不同的字元。例如 f 是前進,s 是停止等等。到了Arduino 端的程式就是藉由 switch 架構去判斷所收到字元的 ASCII碼,並執行對應的動作。所以機器人的接收端程式不太需要修改。 其他程式例如點選 ListPicker 去連接藍牙裝置或是斷線等,與先前的範例完全相同。在此就不再介紹囉。

BT_U:送出 ' f ' 讓機器人前進

BT_S:送出 ' s ' 讓機器人停止

BT_R:送出 ' r ' 讓機器人右轉

BT_L:送出 ' l ' 讓機器人左轉

BT_Dwn:送出 ' d ' 讓機器人後退

a002

Arduino 端程式

請注意Arduino 端程式會因為您使用連續型伺服馬達或是透過直流馬達控制晶片而有所不同,但基本上的架構都是一樣的。手機端程式則完全不變,都是滿足某個條件(例如按按鈕)發送字元。 連續型伺服馬達的機器人如下圖 (請忽略學生手上拿的 Wii 手把)   請先看伺服馬達的版本 [pastacode lang="c" message="Arduino 藍牙遙控機器人 - 伺服馬達版" highlight="" provider="manual" manual="%23include%20%3CSoftwareSerial.h%3E%0A%23include%20%3CServo.h%3E%0A%0AServo%20servoRight%3B%0AServo%20servoLeft%3B%0A%0ASoftwareSerial%20BTSerial(10%2C%2011)%3B%20%2F%2F%20RX%2C%20TX%0A%0Abyte%20dis%5B6%5D%3B%20%20%2F%2Fdistance%20package%0Aint%20t%2Ci%2Cpp%3B%20%20%20%2F%2Ftemp%20value%0A%0A%0Avoid%20setup()%7B%0A%20%20Serial.begin(9600)%3B%0A%20%20BTSerial.begin(57600)%3B%20%20%20%20%2F%2FBTSerial%209600%2C19200%2C38400%2C57600%0A%20%20servoRight.attach(12)%3B%0A%20%20servoLeft.attach(13)%3B%0A%20%20dis%5B0%5D%20%3D%2065%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fcheck%20value%0A%7D%0A%0Avoid%20loop()%7B%0A%20%20if%20(BTSerial.available()%3E0)%7B%0A%20%20%20%20pp%3DBTSerial.read()%3B%0A%20%20%20%20Serial.println(pp)%3B%0A%20%20%20%20switch(pp)%7B%0A%20%20%20%20case%20'f'%3A%20%20%2F%2FForward%0A%20%20%20%20%20%20Up()%3B%0A%20%20%20%20break%3B%0A%20%20%20%20case%20'x'%3A%20%20%2F%2FBack%0A%20%20%20%20%20%20Down()%3B%0A%20%20%20%20break%3B%0A%20%20%20%20case%20'a'%3A%20%20%2F%2FTurn%20Left%0A%20%20%20%20%20%20Left()%3B%0A%20%20%20%20break%3B%0A%20%20%20%20case%20'd'%3A%20%20%2F%2FTurn%20Right%0A%20%20%20%20%20%20Right()%3B%0A%20%20%20%20break%3B%0A%20%20%20%20case%20's'%3A%20%20%2F%2FStop%0A%20%20%20%20%20%20stop()%3B%0A%20%20%20%20break%3B%0A%20%20%20%20case%2065%3A%20%20%2F%2FReturn%20distance%20value%0A%20%20%20%20%20%20for(i%3D5%3Bi%3E0%3Bi--)%7B%0A%20%20%20%20%20%20%20%20dis%5Bi%5D%20%3D%20t%2510%3B%0A%20%20%20%20%20%20%20%20t%2F%3D10%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2FPack%20value%0A%20%20%20%20%20%20for(i%3D0%3Bi%3C%3D5%3Bi%2B%2B)%0A%20%20%20%20%20%20%20%20BTSerial.write(dis%5Bi%5D)%3B%0A%20%20%20%20%20%20%20%20%2F%2FReturn%20value%0A%20%20%20%20break%3B%0A%20%20%20%20default%3A%0A%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0Aint%20Up()%7B%0A%20%20servoRight.writeMicroseconds(1300)%3B%0A%20%20servoLeft.writeMicroseconds(1700)%3B%0A%20%20%2F%2Fdelay(1000)%3B%0A%7D%0Aint%20Down()%7B%0A%20%20servoRight.writeMicroseconds(1700)%3B%0A%20%20servoLeft.writeMicroseconds(1300)%3B%0A%20%20%2F%2Fdelay(1000)%3B%20%20%2F%2F%E8%A6%96%E6%83%85%E6%B3%81%E8%AA%BF%E6%95%B4%0A%7D%0Aint%20Right()%7B%0A%20%20servoRight.writeMicroseconds(1700)%3B%0A%20%20servoLeft.writeMicroseconds(1700)%3B%0A%7D%0Aint%20Left()%7B%0A%20%20servoRight.writeMicroseconds(1300)%3B%0A%20%20servoLeft.writeMicroseconds(1300)%3B%0A%7D%0Aint%20stop()%7B%0A%20%20servoRight.writeMicroseconds(1500)%3B%0A%20%20servoLeft.writeMicroseconds(1500)%3B%0A%7D"/]   為了回饋各位朋友,也一併附上 motoduino 的版本。 [pastacode lang="c" message="Arduino 藍牙遙控機器人 - 直流馬達版(Motoduino)" highlight="" provider="manual" manual="const%20int%20Motor_E2%20%3D%205%3B%20%2F%2F%20digital%20pin%205%20of%20Arduino%20(PWM)%20%20%20%20%0Aconst%20int%20Motor_E1%20%3D%206%3B%20%20%2F%2F%20digital%20pin%206%20of%20Arduino%20(PWM)%20%20%0Aconst%20int%20Motor_M1%20%3D%207%3B%20%20%20%20%20%2F%2F%20digital%20pin%207%20of%20Arduino%0Aconst%20int%20Motor_M2%20%3D%208%3B%20%20%20%20%2F%2F%20digital%20pin%208%20of%20Arduino%0Achar%20val%3B%20%20%2F%2F%20variable%20to%20receive%20data%20from%20the%20serial%20port(bluetooth)%0A%0Avoid%20setup()%20%20%0A%7B%0A%20%20%2F%2F%20Start%20serial%20communication%20at%209600%0A%20%20Serial.begin(9600)%3B%20%0A%20%20pinMode(Motor_M1%2C%20OUTPUT)%3B%0A%20%20pinMode(Motor_M2%2C%20OUTPUT)%3B%0A%7D%0A%0Avoid%20loop()%0A%7B%0A%20%20if(Serial.available()%3E0)%0A%20%20%7B%0A%20%20%20%20val%20%3D%20Serial.read()%3B%0A%20%20%20%20switch(val)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20case%20'f'%3A%20%20%20%2F%2F%20car%20forward%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20forward(0%2C%20255)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20'd'%3A%20%20%20%2F%2F%20car%20backward%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20backward(0%2C%20255)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20'l'%3A%20%20%20%2F%2F%20car%20turn%20left%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20left(0%2C%20255)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20'r'%3A%20%20%20%2F%2F%20car%20turn%20right%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20right(0%2C%20255)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%20's'%3A%20%20%20%2F%2F%20car%20stop%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20motorstop(0%2C%200)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%20%20%20%20%20%0A%20%20%7D%0A%7D%0A%0Avoid%20motorstop(byte%20flag%2C%20byte%20motorspeed)%0A%7B%0A%20%20Serial.println(%22Stop!%22)%3B%0A%20%20digitalWrite(%20Motor_E1%2C%20motorspeed)%3B%0A%20%20digitalWrite(%20Motor_E2%2C%20motorspeed)%3B%0A%7D%0A%0Avoid%20forward(byte%20flag%2C%20byte%20motorspeed)%0A%7B%0A%20%20Serial.println(%22Forward!%22)%3B%0A%0A%20%20digitalWrite(%20Motor_M1%2C%20HIGH)%3B%0A%20%20digitalWrite(%20Motor_M2%2C%20HIGH)%3B%0A%0A%20%20analogWrite(%20Motor_E1%2C%20motorspeed)%3B%0A%20%20analogWrite(%20Motor_E2%2C%20motorspeed)%3B%0A%7D%0A%0Avoid%20backward(byte%20flag%2C%20byte%20motorspeed)%0A%7B%0A%20%20Serial.println(%22Backward!%22)%3B%0A%0A%20%20digitalWrite(%20Motor_M1%2C%20LOW)%3B%0A%20%20digitalWrite(%20Motor_M2%2C%20LOW)%3B%0A%0A%20%20analogWrite(%20Motor_E1%2C%20motorspeed)%3B%0A%20%20analogWrite(%20Motor_E2%2C%20motorspeed)%3B%0A%7D%0A%0Avoid%20right(byte%20flag%2C%20byte%20motorspeed)%0A%7B%0A%20%20Serial.println(%22Turn%20Right!%20%22)%3B%0A%0A%20%20digitalWrite(%20Motor_M1%2C%20HIGH)%3B%0A%20%20digitalWrite(%20Motor_M2%2C%20HIGH)%3B%0A%0A%20%20analogWrite(%20Motor_E1%2C%20motorspeed)%3B%0A%20%20analogWrite(%20Motor_E2%2C%200)%3B%0A%7D%0A%0Avoid%20left(byte%20flag%2C%20byte%20motorspeed)%0A%7B%0A%20%20Serial.println(%22Turn%20Left!%22)%3B%0A%0A%20%20digitalWrite(%20Motor_M1%2C%20HIGH)%3B%0A%20%20digitalWrite(%20Motor_M2%2C%20HIGH)%3B%0A%0A%20%20analogWrite(%20Motor_E1%2C%200)%3B%0A%20%20analogWrite(%20Motor_E2%2C%20motorspeed)%3B%20%0A%7D%0A"/]

相關文章 📎

留言 💬 (0)

還沒有留言,來當第一個。