小车的蓝牙控制功能我们选择放在最后做,当时把蓝牙控制放在最后实现简直是再明智不过的决定!因为有前两天的经验积累,这次整个过程更顺利更流畅。
首先我们的思路很简单,就是用“switch”语句将小车的运动状态分为五种情况:“前进、停止、后退、左转、右转”。
在之前我们也已经在手机上安装了几款用于与小车进行串口通信的软件,感觉上图中的软件对用户比较友好,操作界面也比较简洁,推荐此款软件蓝牙串口APP下载地址。
- 软件安装完毕后,点击右上方“连接”连接arduino小车的蓝牙;
- 连接完毕后将软件切换为“键盘”模式。
- 在按钮文本处输入该按钮代表的功能;
- 将后面的选项改为字符,并输入该功能要发送的信息;
之后用写好的move函数针对小车不同的运动状态给move函数不同的参数。在这里小车转向我们采用的方案是让小车原地转向,即小车的两个轮子向不同的方向转动但转速相同。不知道是不是我们给的电压没达到的原因,当analogWrite()函数的第二个参数给到90以下时马达就不转了(我们用了四节南孚供电,电压在六伏左右)
我们用Serial.parseInt()函数来查找传入串行流中的下一个有效整数,即读取手机发送的指令。但在发送的过程中一直存在延时而且延时很明显,这个有点小瑕疵。
要注意的是因为信息传输存在延时,小车转向时的速度最好设置慢一点。不然很容易转过头。
蓝牙控制小车实现视频
以下为蓝牙控制实现代码:
int STBY = 11; //standby
int PWMA = 3; //Speed control
int AIN1 = 23; //Direction
int AIN2 = 22; //Direction
int PWMB = 5; //Speed control
int BIN1 = 25; //Direction
int BIN2 = 24; //Direction
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int i;
Serial.println("Hello World!");
if(Serial.available())
{
i=Serial.parseInt();
}
Serial.println(i,DEC);
switch(i)
{
case 2:
{
move(1,128,1);
move(2,128,1);
Serial.println("前进");
break;
}
case 4:
{
move(1,90,1);
move(2,90,0);
Serial.println("左转");
break;
}
case 6:
{
move(1,90,0);
move(2,90,1);
Serial.println("右转");
break;
}
case 8:
{
move(1,128,0);
move(2,128,0);
Serial.println("后退");
break;
}
case 5:
{
move(1,0,0);
move(2,0,0);
Serial.println("STOP!!!");
break;
}
}
}
void move(int motor, int speed, int direction){
digitalWrite(STBY, HIGH); //disable standby
boolean inPin1 = HIGH;
boolean inPin2 = LOW;
if(direction == 1){
inPin1 = LOW;
inPin2 = HIGH;
}
if(motor == 1){
digitalWrite(AIN1, inPin1);
digitalWrite(AIN2, inPin2);
analogWrite(PWMA, speed);
}
else{
digitalWrite(BIN1, inPin1);
digitalWrite(BIN2, inPin2);
analogWrite(PWMB, speed);
}
}
到此为止,arduino智障能小车的三个分功能都已经实现了,之后我和搭档nidie会将三段功能代码整合在一起。并添加矩阵键盘,通过操作矩阵键盘选择三个功能中的一个让小车实现。
现在我的思路是用switch语句,通过读取矩阵键盘的数值,选择功能。而switch语句的位置应该放在arduinoIDE的配置文件中的main.cpp中。