手机蓝牙遥控arduino小车——手动和重力感应

2015-02-082.4万
AI 快速预览详细 收起
手机蓝牙遥控Arduino小车项目通过手机蓝牙模块与Arduino小车通信,实现手动和重力感应控制。硬件清单包括Arduino UNO控制板、298扩展板、CSR06蓝牙模块等。项目难度适中,适合STEM教育和少儿编程入门。最终效果是通过手机APP控制小车前进、后退、左转、右转,并且可以通过重力感应进行控制。
各位看官 请看看下边的视频吧 看看如何中立感应控制小车移动的


技术参数及器材
技术参数
1. 14个数字输入/输出端口TX,RX,D2~D13,
2. 8个模拟输入端口A0~A7
3. 1对TTL电平串口收发端口RX/TX
4.6个PWM端口,D3, D5, D6, D9, D10, D11
5.采用Atmel Atmega328P和ATMEGA8U2单片机
6.工作频率为16MHz
7.支持USB下载及供电
8.支持外接7-12V直流电源供电
9.支持9V电池供电
10.支持ISP下载
11.三种供电方式:USB,VIN,外部5V输入
元器件清单:
Arduino履带车体一台
ARDUINO UNO控制板一个
ARDUINO 298 扩展板 一个
蓝牙模块 一个(蓝牙芯片是采用CSR的06蓝牙芯片,蓝控制距离:10米毫无难度
18650锂电池两节(1500MA)
18650电池盒一个
18650充电器一个
7彩LED灯两个
杜邦线20条
3MM有机玻璃板一片
铜柱4根 螺丝10个,螺母10个
USB线一条




附上蓝牙小车代码
  1. /***********************************************************/
  2. /* 程式名稱:Android BTcar.APK 操控遙控車                   */
  3. /* 腳位: pin10、pin11接前進的左右輪                        */
  4. /*       pin8、pin9接後退的左右輪                          */
  5. /*       pin7 接Buzzer                                     */
  6. /*       pin6、pin5個接一顆LED                             */
  7. /*       pin4接七彩LED                                     */
  8. /*       Arduino的TX接上藍牙的RX,RX接上藍牙的TX           */
  9. /***************如需更改腳位,請勿更改到pin13***************/
  10. /* 功能簡介:按下APK的控制鈕能讓車子前進後退左轉右轉,還能配合
  11.    倒車時有倒車聲音,左轉右轉則會有各個LED閃爍。           */
  12. /* 作者: HIF團隊 ( JimmyFang )               2012/04/11    */
  13. /***********************************************************/
  14. //******Program code setting*************************************//
  15. char val;             //Variable to receive data from the serial port
  16. char temp[4];
  17. int LED_Status = 0;
  18. int ledr=1,ledl=1;
  19. int i;
  20. volatile unsigned int count = 0;
  21. void setup()       //腳位設定
  22. {
  23.   for(int i=10;i<=13;i++)
  24.   {
  25.     pinMode(i,OUTPUT);
  26.     //digitalWrite(i,HIGH);
  27.   }
  28.   digitalWrite(11,LOW);
  29.   digitalWrite(10,LOW);
  30.   
  31.   for(int i=3;i<=6;i++)
  32.   {
  33.     pinMode(i,OUTPUT);
  34.   }
  35.    pinMode(8,OUTPUT);
  36. // Car_Init();   //將車子做初始化的動作
  37.   
  38.   //***設定內部中斷時間*********************************************//
  39.   TCCR1A = 0x00;
  40.   // 沒有任何設定,只是一個計時器
  41.   TCCR1B &= ~_BV(CS12);         //  
  42.   TCCR1B &= ~_BV(CS11);        
  43.   TCCR1B |= _BV(CS10);      
  44.   TCNT1 = 0;
  45.   TIMSK1 |= _BV(TOIE1);  // 開啟內部計時器
  46.   Serial.begin(9600);   // 設定袍率為 9600bps  
  47.   //****************************************************************//
  48. }
  49. //******************************************************************//
  50. //*****Main code do nothing*****************************************//
  51. void loop()
  52. {
  53.   performCommand();
  54.   Serial.print(temp[3]);
  55.   Serial.print(temp[2]);
  56.   Serial.print(temp[1]);
  57.   Serial.print(temp[0]);
  58.   Serial.println("cm");  
  59. }
  60. //******************************************************************//
  61. void Car_Init()
  62. {
  63.    go_forward();
  64.    delay(1000);
  65.    stop_go_forward();
  66.    go_reverse();
  67.    delay(1000);
  68.    stop_go_reverse();
  69. }
  70. //***判斷送來的訊號************************************************//
  71. void performCommand()
  72. {
  73.   if(Serial.available())  // 接收串列口資料
  74.   {
  75.    for(i=0;i<4;i++)
  76.     temp[i]=Serial.read();
  77.   }
  78.   if (temp[0] == 'r')
  79.   {
  80.     if(temp[2] == 'b')
  81.     {
  82.       //LED_Status = 1;
  83.       //go_right_F();   //  前進時右轉
  84.       go_reverse();  // 倒退
  85.     }
  86.     else if(temp[2] == 'f')
  87.     {
  88.       //LED_Status = 2;
  89.       //go_left_F();    //  前進時左轉
  90.       go_forward();   // 前進
  91.     }
  92.     else
  93.     {
  94.       LED_Status = 0;
  95.       //go_forward();   // 前進
  96.       stop_go_forward();   // 停止前進
  97.     }
  98.   }
  99.   else if (temp[0] == 's')
  100.   {
  101.     LED_Status = 0;
  102.     stop_go_forward();   // 停止前進
  103.     //go_reverse();  // 倒退
  104.     stop_go_reverse();  // 停止倒退
  105.   }
  106.   else if (temp[0] == 'f')
  107.   {
  108.     if(temp[2] == 'l')
  109.     {
  110.       LED_Status = 3;
  111.       //go_right_B();   // 倒退時右轉
  112.       go_left_F();    //  前進時左轉
  113.     }
  114.     else if(temp[2] == 'r')
  115.     {
  116.       LED_Status = 4;
  117.       //go_left_B();   // 倒退時左轉
  118.       go_right_F();   //  前進時右轉  
  119.   }
  120.     else
  121.     {
  122.       LED_Status = 5;
  123.       //go_reverse();  // 倒退
  124.     }
  125.   }
  126.   else if (temp[0] == 'y')
  127.   {
  128.     //TIMSK1 &= ~_BV(TOIE1);  // 關閉內部定時器
  129.     LED_Status = 0;
  130.     //digitalWrite(7,LOW);
  131.     stop_go_reverse();  // 停止倒退
  132.   }
  133.   else if (temp[0] == 'a')
  134.   {
  135.     lights_on();   // 開啟近燈
  136.   }
  137.   else if (temp[0] == 'c')
  138.   {
  139.     lights_off();   // 關閉近燈
  140.   }
  141.   else if (temp[0] == 'd')
  142.   {
  143.     long_lights_on();  // 開啟遠燈
  144.   }
  145.   else if (temp[0] == 'e')
  146.   {
  147.     long_lights_off();  // 關閉遠燈
  148.   }
  149.   else if (temp[0] == 't')
  150.   {
  151.     go_turbo();  // 開啟渦輪表示燈
  152.   }
  153.   else if (temp[0] == 'x')
  154.   {
  155.     stop_go_turbo();  // 關閉渦輪表示燈
  156.   }
  157.   
  158. }
  159. //***************************************************************//
  160. //*****Action code***********************************************//
  161. void go_forward()      // 前進動作
  162. {
  163.   digitalWrite(12,HIGH);
  164.   digitalWrite(8,HIGH);
  165.   digitalWrite(10,HIGH);  
  166.   digitalWrite(11,HIGH);  
  167. }
  168. void stop_go_forward()    // 停止前進動作
  169. {
  170.   //digitalWrite(12,HIGH);
  171.   //digitalWrite(8,HIGH);
  172.   digitalWrite(10,LOW);   
  173.   digitalWrite(11,LOW);  
  174. }
  175. void go_reverse()    // 倒退動作
  176. {
  177.   digitalWrite(10,HIGH);
  178.   digitalWrite(11,HIGH);
  179.   digitalWrite(12,LOW);  
  180.   digitalWrite(8,LOW);  
  181. }
  182. void stop_go_reverse()    // 停止倒退動作
  183. {
  184.   digitalWrite(10,LOW);
  185.   digitalWrite(11,LOW);
  186.   //digitalWrite(12,HIGH);   
  187.   //digitalWrite(8,HIGH);   
  188. }
  189. void go_right_F()   // 前進時右轉彎動作
  190. {
  191.   digitalWrite(12,HIGH);
  192.   digitalWrite(8,LOW);
  193.   digitalWrite(11,HIGH);   
  194.   digitalWrite(10,HIGH);   
  195. }
  196. void go_left_F()    // 前進時左轉彎動作
  197. {
  198.   digitalWrite(12,LOW);
  199.   digitalWrite(8,HIGH);
  200.   digitalWrite(11,HIGH);   
  201.   digitalWrite(10,HIGH);   
  202. }
  203. void go_right_B()     // 後退時右轉彎動作
  204. {
  205.   digitalWrite(10,HIGH);
  206.   digitalWrite(11,HIGH);
  207.   digitalWrite(12,LOW);  
  208.   digitalWrite(8,HIGH);   
  209. }
  210. void go_left_B()     // 後退時左轉彎動作
  211. {
  212.   digitalWrite(10,HIGH);
  213.   digitalWrite(11,HIGH);
  214.   digitalWrite(12,HIGH);   
  215.   digitalWrite(8,LOW);
  216. }
  217. void lights_on()
  218. {
  219.   digitalWrite(5, HIGH);
  220.   ledr=1;
  221. }
  222. void lights_off()      // Short Lights OFF
  223. {
  224.   digitalWrite(5, LOW);
  225.   ledr=0;
  226. }
  227. void long_lights_on()     // Long Lights ON
  228. {
  229.   digitalWrite(6, HIGH);
  230.   ledl=1;
  231. }
  232. void long_lights_off()     // Long Lights OFF
  233. {
  234.   digitalWrite(6, LOW);
  235.   ledl=0;
  236. }
  237. void go_turbo()         // Turbo action
  238. {
  239.   digitalWrite(3, HIGH);
  240. }
  241. void stop_go_turbo()      // Stop Turbo action
  242. {
  243.   digitalWrite(3, LOW);
  244. }
  245. //******************************************************************//
  246. //***Interrupt******************************************************//
  247. ISR (TIMER1_OVF_vect)   //內部中斷向量位址
  248. {   
  249.   count++;
  250.   if (count == 122)        //判斷動作時間是不是到了
  251.   {  
  252.     if(LED_Status == 0)                      //沒做任何動作
  253.     {
  254.       digitalWrite(5,ledr);
  255.       digitalWrite(6,ledl);
  256.       digitalWrite(3,LOW);
  257.     }
  258.     else if(LED_Status == 1)                 //前進時右轉讓LED1做閃爍動作
  259.     {
  260.       digitalWrite(5,!(digitalRead(5)));
  261.     }
  262.     else if(LED_Status == 2)                 //前進時左轉讓LED2做閃爍動作
  263.     {
  264.       digitalWrite(6,!(digitalRead(6)));
  265.     }
  266.     else if(LED_Status == 3)                 //倒車時右轉讓LED1做閃爍動作
  267.     {                                        //並且發出逼逼逼的聲音
  268.       digitalWrite(5,!(digitalRead(5)));
  269.       digitalWrite(3,!(digitalRead(3)));
  270.     }
  271.     else if(LED_Status == 3)                 //倒車時左轉讓LED2做閃爍動作
  272.     {                                        //並且發出逼逼逼的聲音
  273.       digitalWrite(6,!(digitalRead(6)));
  274.       digitalWrite(3,!(digitalRead(3)));
  275.     }
  276.     else if(LED_Status == 5)                 //倒車時讓喇叭發出聲音
  277.     {
  278.       digitalWrite(3,!(digitalRead(3)));
  279.     }      
  280.      
  281.     count = 0;
  282.   }   
  283. }
复制代码



源码以及app上传到附件

蓝牙小车.zip

795.38 KB, 下载次数: 12487

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(9)
小狗吃大白菜
小狗吃大白菜
一直显示CAN YOU FIND THE SPECIFIED DEVICE ,PERFORM A SEARCH 。(蓝牙用的HC06),用蓝牙助手SPP能连接蓝牙,不是硬件问题,请问这个怎么解决
小狗吃大白菜
小狗吃大白菜
您好,我刚下载了APP,但是手机界面怎么没有和蓝牙的连接界面。
forrany
forrany
支持一下,最近也在也就这方面的内容
eversence213
eversence213
开始时8,9,10,11控制电机吗,下面变成8,10,11,12了么
Jane
Jane
效果不错呀~赞一个
qq815076543322
qq815076543322
作者
回复Jane
小伙伴 还有没有其他的建议可以改一下的 让小车更酷更炫
qq815076543322
qq815076543322
作者
回复Jane
小伙伴 还有没有其他的建议可以改一下的 让小车更酷更炫
babykeke
babykeke
很好玩的样子啊
qq815076543322
qq815076543322
作者
回复babykeke
是呀 手机上一些app游戏 是一些重力感应的游戏 现在用在小车上了 通过蓝牙实现了控制。看看大家还有哪些想法 一起聊聊
我爱小宇宙
我爱小宇宙
很好玩的一辆小车,有空去尝试一下~顶楼主!!
qq815076543322
qq815076543322
作者
回复我爱小宇宙
DF那里都做出来了吧 我还是在学习阶段 分享一些 让我们亮亮双眼
我爱小宇宙
我爱小宇宙回复qq815076543322
体感控制的话,可以用6轴惯性传感器来做的啊
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
qq815076543322
qq815076543322
作者
嘿嘿,可以试试看
mxhhaixin
mxhhaixin
先顶为敬,嘿嘿
- 没有更多了 -