本帖最后由 mikeyaomikeyao 于 2012-8-10 22:32 编辑
无聊的暑假,于是钻技术
感觉用android手机的比51强百倍的cortex A8处理器的性能只发一个按钮指令实在可惜,于是自己写上位机程序,将通过蓝牙串口发送指令改为pwm的高电位值和电机旋转方向,在手机上取得手机的空间位置姿态yaw pitch 和roll然后把手机做成遥控车的手柄,利用空间位置来决定车的前进方向,转换成pwm信息再通过蓝牙串口发到小车。主要思路将传感和算法尽量放到手机上实现,其实用这个平台把手机装到车上利用手机超强的处理能力和齐全的传感器可以实现很多其他算法,先上视频http://v.youku.com/v_show/id_XNDM3NjQwNTU2.html
看过感兴趣的可以接下来读后面枯燥的文字。
材料:
编程环境eclipse加上android 的开发adt
上位机环境:htc G10 android系统版本2.3.7,处理器cortex A8架构1GHz,内存768MB
下位机环境:89c52单片机开发板
BLK-MD-BC04-B蓝牙串口透传
L298N两路电机驱动板
两个螃蟹王国减速电机+车轮
蒙牛酸奶盒一只、
万向轮一只
面包板一块
杜邦线
刀锋航模锂电11.1v 3s2200mah(动力电)
配套电显(保护锂电之用)
四节电池盒(信号电)
程序说明
手机和飞机中 Yaw Pitch Roll的说明
当手机是这样放置时, Yaw PitchRoll与上图方向相同。
我这里利用了pitch来控制左右,roll来控制前进方向的前后。用了一个进度条来控制马力,主要代码:
private SensorEventListener mySensorEventListener = newSensorEventListener(){
@Override
public voidonAccuracyChanged(Sensor sensor, int accuracy) {//重写onAccuracyChanged方法,在此为空实现
}
@Override
public voidonSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){//判断是否为加速度传感器变化产生的数据
float [] values = event.values; //获得捕获的数据
myText.setText("Yaw:" +values[0] + " Pitch:"+values[1] + " Roll:"+values[2]);
yaw1=(int)values[0];
byte[] pwms = new byte[4];
if(values[2]>=0)
{ pwms[0]=1;
pwms[2]=1;
if(values[1]>=0)
{pwms[3]=(byte)(int)(30+30*(values[1]/90));
pwms[1]=(byte)(int)(60-pwms[3]);}
else
{pwms[1]=(byte)(int)(30+30*((-values[1])/90));
pwms[3]=(byte)(int)(60-pwms[1]);}
}
else
{pwms[0]=2;
pwms[2]=2;
if(values[1]>=0)
{pwms[1]=(byte)(int)((30+30*(values[1]/90)));
pwms[3]=(byte)(int)(60-pwms[1]);}
else
{pwms[3]=(byte)(int)(30+30*((-values[1])/90));
pwms[1]=(byte)(int)(60-pwms[3]);}
}
pwms[1]=(byte)(int)((float)power/100*pwms[1]);
pwms[3]=(byte)(int)((float)power/100*pwms[3]);
Stringmessage;
byte[] msgBuffer = new byte[6];
try {
outStream= btSocket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
msgBuffer[0] = 0;//(byte)(yaw1 >> 0 & 0xff);;
msgBuffer[1] = pwms[0];
msgBuffer[2]=pwms[1];
msgBuffer[3]=pwms[2];
msgBuffer[4]=pwms[3];
msgBuffer[5]=(byte)0xff;
try {
outStream.write(msgBuffer);
} catch (IOException e){
e.printStackTrace();
}
蓝牙部分编程详见代码包
蓝牙串口采用透传9600波特率,通信协议
格式 如下 第一位起始位0 第二位左电机旋转方向位0x01或0x02 第三位左电机转速位(60为最大) 第四位右电机转向 第五位右电机转速位 第六位结束位0xff。例如 0x00 0x020x21 0x02 0x21 0xff代表以0x21的速度向前进。
下位机是典型的pwm调速程序在51上跑,大家应该都熟悉,详见代码包。
最后实现的还不错,不过对于串口协议的设计在解析上有一定的不合理,主要是图简单,有时会出错,但是因为发送每当手机移动时就会不停进行所以总体影响不大。
C51keil工程http://kuai.xunlei.com/d/QBEBREENMWIE
其实这种控制策略对于智能小车的启示不在于遥控,而在于智能,把智能手机绑在车上,就拥有了一个资源超强的处理平台,以及加速度计磁罗盘陀螺仪光强计等等传感器,还有800万象素的摄像头,各种视频硬件编解码器,wifi蓝牙连接,GPS,而且还有许多现成的算法。这对于已经有智能手机的智能小车玩家来说是相当划算的。
|