1.前言
一直对小车情有独钟,大学的时候做过一个语音小车参加校园电子设计大赛,不过那时语音识别还是有点傻乎乎的,识别度不高,不过也算是自己入门单片机的一个结晶。毕业之后就走了android开发,做了两年坑爹的android,学不到太多东西。近来兴趣兴起,又重新捣鼓一下单片机,萌发重新做一辆小车,初定手机蓝牙控制(因为蓝牙模块便宜,其实是因为穷),可以充分利用现在人手一部的android手机,做个简单的蓝牙遥控app,这样就可以把成本再降低点。由于做小车的过程中,发现缺了几个元器件,导致不能测试一下arduino程序,所以就先暂且放几天,等元器件到了再继续弄弄,所以就先写基础篇好了,后面再不上实操篇。
1.1 测试图片
1.2 工具
工具名称 | 数量 |
---|---|
arduino UNO R3 | 1 |
L298N电机驱动模块 | 1 |
HC06 蓝牙模块 | 1 |
小车底盘 | 1 |
12V电源(7~9V) | 1 |
导线 | 若干 |
蓝牙遥控app,楼主简单编写的,供大家下载和参考 | 1 |
特别说明:
- L298N电机驱动模块,这个模块简单易懂
-
蓝牙模块选用这个,比较方便,把蓝牙接上电源,再把蓝牙的Tx引脚接到开发板的Rx引脚,蓝牙Rx引脚置空,因为不需要把数据从开发板发到手机app,接好后可以直接用了。供电好以后,我们用手机连上蓝牙后,配对,密码一般是“1234”或者“0000”,输入好密码,就配对成功了。
-
电源,我用了12V 18650电池。
-
小车车板
2.蓝牙小车原理
- app设定编码
- 通过手机蓝牙发送编码
- HC06收到编码,发送到arduino板子
- 板子解析编码
- 控制电机
上面说了,由于元器件问题,暂时不能讲解实操小车部分,那么就讲一下app端以及蓝牙模块测试程序。
2.1 蓝牙小车app
先贡献app (原来app没有适配到android6.0 所以我就直接上传到应用市场好了,供大家直接下载或者更新 以后不用再发邮箱了。)
app下载链接
- 讲解一下app使用:
- 点击打开app之后,首先会自动弹出提示要求打开手机蓝牙,可以看到四个方向箭头以及中间停止,用来控制小车前进后退左转右转,做这些操作前提是要连接上蓝牙小车的蓝牙模块HC06.所以需要首先点击右下角很像螺母的图标弹出下图:
-
如果没有上图所示,请点击搜索蓝牙设备,不出意外应该会看到一个HC06,没有的话 请确保你的蓝牙模块电源连接正确。看到HC06,点击一下,如果是第一次配对,是需要输入密码:默认是0000或者1234.如果配对过,点击就自动连接了。
-
蓝牙小车前进后退左转右转停止,都是一种状态,所以我们用编码去区分。在我的app里,我默认设置为: 前进3 后退4 左转1 右转2 停止0。当然,也可以自定义编码,点击左下角进入设置页面:
编码只能是0-9数字以及大小写26个字母,足够使用。
2.2 蓝牙小车Arduino端测试代码
/*
日期:2016.10.31
功能:蓝牙小车测试按键值程序
*/
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available()>0){
char ch = Serial.read();
if(ch == '1'){
//前进
Serial.println("up");
}else if(ch == '2'){
//后退
Serial.println("back");
}else if(ch == '3'){
//左转
Serial.println("left");
}else if(ch == '4'){
//右转
Serial.println("right");
}else if(ch=='0'){
//停车
Serial.println("stop");
}else{
//其他编码
Serial.println(ch);
}
}
}
然后就可以用arduino IDE自带的串口调试器来查看,不出意外应该可以看到类似下面的打印:
默认的编码就显示 up down left stop right ,自定义编码就显示 编码值
2.3 蓝牙小车运行arduino代码
/*
日期:2016/11/05
功能:蓝牙小车程序
作者:单片机菜鸟
*/
#define IN1 6 // 7 6 右轮
#define IN2 7
#define IN3 4 // 5 4 左轮
#define IN4 5
#define LEFT '3' //左转编码
#define RIGHT '4'//右转编码
#define GO '1'//前进编码
#define BACK '2'//后退编码
#define STOP '0'//停止编码
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
initCar();
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available()>0){
char ch = Serial.read();
if(ch == GO){
//前进
go();
}else if(ch == BACK){
//后退
back();
}else if(ch == LEFT){
//左转
turnLeft();
}else if(ch == RIGHT){
//右转
turnRight();
}else if(ch=='0'){
//停车
stopCar();
}
}
}
void initCar(){
//默认全是低电平 停止状态
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
}
/**
* 左转
*/
void turnLeft(){
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW); //右轮前进
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW); //左轮不动
}
/**
* 右转
*/
void turnRight(){
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW); //右轮不动
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW); //左轮前进
}
/**
* 前进
*/
void go(){
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW); //右轮前进
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW); //左轮前进
}
/**
* 倒车
*/
void back(){
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH); //右轮后退
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH); //左轮后退
}
/**
* 停车
*/
void stopCar(){
initCar();
}