蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制
最近事真是多啊,一件接着一件的,加上自己拖延症~ - -!
遥控小车基本完成了,只是自己没时间来更新。
现在更新手机控制的部分
首先我们要熟悉一个软件——
官网地址:http://www.amarino-toolkit.net/
把下面两个下到手机上 安装
打开软件:
点击Monitoring
可以发送字符 跟上一篇PC端用串口工具发送一样的效果。
长按蓝牙设备
选择show events,
这是加速度传感器发送给arduino的数据
利用这些数据 我们就可以得到手机当前的状态,从而我们可以根据手机的姿态控制小车的前进后退左转右转
贴出来以下代码,供大家参考 这是没有加入PWM调速的 只要有姿态变化都是全速的
/* Name:liu_l Date:04.03 ID:A AmarinoService:send to Arduino:A-0.31603462;0.49799395;12.421119 enter:0x0d 都是8位数字 */ char accelBuff[100]; //定义接收数组用来存放手机发送的加速度传感器参数 int accelDot[2]; //存放数据中的小数点位于accelBuff中的位置,小数点的十六进制为2e int accelSemi; //存放数据中的分号位于accelBuff中的位置,分号的十六进制为3b int i; void setup() { Serial.begin(9600); pinMode(4, OUTPUT); //M1 pinMode(5, OUTPUT); //E1 pinMode(6, OUTPUT); //E2 pinMode(7, OUTPUT); //M2 } void loop() { //接收数据 if(Serial.available()) { accelBuff[0] = Serial.read(); //read //amarino发送的数据包含一个标志A if(accelBuff[0] == 'A') { //开始接收数据,数据以0x13结束 i=1; while(1) { if(Serial.available()) { accelBuff[i] = Serial.read(); //read if(accelBuff[i] == 0x13) break; else i++; } } //一直接收数据,直到接收数据结束 } //获取接收数据中分号的位置 for(i = 0 ; i < 100 ; i++) { if(accelBuff[i] == 0x3b) { accelSemi= i; break; } } //获取接收数据中小数点的位置 for(i = 0;i < 100;i++) { if(accelBuff[i] == 0x2e) //小数点 { accelDot[0]= i; //小数点位置 break; } } for(i = accelSemi;i < 100;i++) //从第一个分号位置开始,去找第二个小数点位置 { if(accelBuff[i] == 0x2e) { accelDot[1]= i; break; } } //////////////////////////////// //根据接收到的数据控制小车的运动 //////////////////////////////// //首先让小车停止 digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); Serial.println("STOP"); //通过X轴数据的正负判端前进还是后退 当数据为十位数的时候才行动 if(accelBuff[1] == '-') //手机前倾 小车向前走 A-0.31603462;0.49799395;12.421119 { if(accelDot[0] == 4 || (accelBuff[2]-0X30) > 1) //A-12.3 小数点在第四位(说明X参数为两位整数) 或者 数据第一位本身大于1(0的acsii码为0x30) { Serial.println("forward"); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, LOW); } } else { if(accelDot[0] == 3 || (accelBuff[1]-0X30) > 1) { Serial.println("back"); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, HIGH); } } //通过Y轴数据的正负判断左转还是右转 ///////////////////////////////////////////////////// A-0.31603462;0.49799395;12.421119 if(accelBuff[accelSemi+1] == '-') // ;-23.5 { if(accelDot[1] == accelSemi+4 || (accelBuff[accelSemi+2]-0X30) > 1) //如果 第二个小数点的位置等于=第一个分号+4,如上面假设的-23.5 或者是Y加速度值的第一位本身就大于1 { Serial.println("left"); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, HIGH); } } else { if(accelDot[1] == accelSemi+3 || (accelBuff[accelSemi+1]-0X30) > 1) { Serial.println("right"); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); } } } }