一、蓝牙模块设置
Arduino 进入 AT 模式代码
接下来,我们需要为使用 Arduino 设置蓝牙模块 AT 模式编写程序,这个程序是让我们可以通过 Arduino IDE 提供的串口监视器来设置蓝牙模块。详细的 Arduino 代码如下:
#include <SoftwareSerial.h>
// Pin10为RX,接HC05的TXD
// Pin11为TX,接HC05的RXD
SoftwareSerial BT(10, 11);
char val;
void setup() {
Serial.begin(38400);
Serial.println("BT is ready!");
// HC-05默认,38400
BT.begin(38400);
}
void loop() {
if (Serial.available()) {
val = Serial.read();
BT.print(val);
}
if (BT.available()) {
val = BT.read();
Serial.print(val);
}
}
利用 Arduino IDE 串口监视器进行调试
首先,将 Arduino 断电,然后按着蓝牙模块上的黑色按钮,再让 Arduino 通电,如果蓝牙模块指示灯按2秒的频率闪烁,表明蓝牙模块已经正确进入 AT 模式。
打开 Arduino IDE 的串口监视器,选择正确的端口,将输出格式设置为 Both: NL & CR ,波特率设置为 38400 ,可以看到串口监视器中显示 BT is ready! 的信息。
然后,输入 AT ,如果一切正常,串口显示器会显示 OK。
接下来,我们即可对蓝牙模块进行设置,常用 AT 命令如下:
AT+ORGL # 恢复出厂模式
AT+NAME=<Name> # 设置蓝牙名称
AT+ROLE=0 # 设置蓝牙为从模式
AT+CMODE=1 # 设置蓝牙为任意设备连接模式
AT+PSWD=<Pwd> # 设置蓝牙匹配密码
二、arduino UNO蓝牙小车
1、一个4节+3节电池盒串联,用最便宜的电池,呵呵,vin供电;
2、L298N红板,接法见前边文章;
3、mixly代码
三、ardino uno 超声波摇头避障小车1、小车演示视频
2、编程思路:
(1)舵机初始化90度;
(2)测距(前方距离);
(3)判断:如果距离大于30cm,那么前进;否则,舵机转向0度(也就是右边),测距left_distance,舵机转向180度(也就是左边),测距right_distance;继续判断:如果左侧距离大于右侧距离,则左转,否则右转。
3、mixly程序
代码下载
4、arduino代码(根据自己的小车再进行优化,多了一个三次测距,增加了精度)
#include <Servo.h> // 控制舵机的头文件
Servo myservo; // 创建伺服对象
const int TrigPin = 12; //超声波
const int EchoPin = 13;
unsigned int distance;
unsigned char pos = 90; // 舵机初始化位置
int right_distance = 0; // 右边测距的距离
int left_distance = 0; //左边测距的距离
const int L298pin1 = 5; // 模块控制信号
const int L298pin2 = 6;
const int L298pin3 = 9;
const int L298pin4 = 10;
void setup()
{
pinMode(L298pin1,OUTPUT);
pinMode(L298pin2,OUTPUT);
pinMode(L298pin3,OUTPUT);
pinMode(L298pin4,OUTPUT);
// 初始化串口通信及连接SR04的引脚
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
// Serial.println("Ultrasonic sensor:");
myservo.attach(11); // 使用第11脚控制舵机伺服位置
}
void loop()
{
myservo.write(pos); // 舵机伺服初始化
delay(1500);
int temp = dis();
if(temp > 30)
{
go();
}
else
{
stops(); // 小车停止
myservo.write(0); //右边测距
delay(1500);
for(int i=0; i<3; i++) // 为了提高测量精度,进行三次测量计算
{
int temp_1 = dis();
right_distance += temp_1; // 三次累计
}
right_distance = right_distance/3;
//Serial.println(right_distance);
myservo.write(180); //左边测距
delay(1500);
for(int i = 0; i < 3;i++)
{
int temp_2=dis();
left_distance += temp_2;
}
left_distance = left_distance/3;
// Serial.println(left_distance);
if(right_distance >= left_distance) // 右边的距离是否大于左边
{
myservo.write(90); //舵机初始化
delay(500);
right(); //右转
//delay(300);
// stops(); // 小车停止 暂停
} else
{
myservo.write(90); //舵机初始化
delay(500);
left(); // 小车左转
// delay(200);
// stops(); // 小车停止
}
}
}
unsigned int dis() // 超声波测距函数
{
// 产生一个10us的高脉冲去触发TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
// 检测脉冲宽度,并计算出距离
distance = pulseIn(EchoPin, HIGH);
distance=distance/58;
// Serial.println(distance);
return distance; // 返回数据
}
void go() // 小车前进
{
analogWrite(L298pin1,230);
analogWrite(L298pin2,0);
analogWrite(L298pin3,255);
analogWrite(L298pin4,0);
}
void back() //小车后退
{
analogWrite(L298pin1,0);
analogWrite(L298pin2,230);
analogWrite(L298pin3,0);
analogWrite(L298pin4,255);
}
void left() // 小车左转
{
analogWrite(L298pin1,0);
analogWrite(L298pin2,255);
analogWrite(L298pin3,100);
analogWrite(L298pin4,0);
}
void right() // 小车右转
{
analogWrite(L298pin1,255);
analogWrite(L298pin2,0);
analogWrite(L298pin3,0);
analogWrite(L298pin4,100);
}
void stops() // 小车停止
{
analogWrite(L298pin1,0);
analogWrite(L298pin2,0);
analogWrite(L298pin3,0);
analogWrite(L298pin4,0);
}