作为adruino的自学小白,我喜欢在这博客中学习提升自己。发布该博客可能会用很多前辈的影子。我本身是想把我得学习过程分享给想入门的小白借鉴。
话不多说,材料准备走起。
hc05蓝牙模块一个
l9110s两路电机驱动模块一个或l298n电机模块(两者区别是L298N模块内置5v电压输出口)
两个小型电机
首先是蓝牙模块的配置问题
我使用的电脑调试软件是xcom(如下图)
然后就是用USB转TTL模块与蓝牙模块连接
接线是情况VCC-VCC,GND-GND,RXD-TXD,TXD-RXD
之后按住蓝牙模块的复位键将USB转TTL模块插入电脑后松开复位键会看到蓝牙模块的led会间隔2s左右慢闪,这说明蓝牙模块进入AT调试模式。此时将电脑上的串口调试软件的波特率调到38400,停止位1,数据位8,校验位None,打开串口;此时发送AT返回的是ok则证明串口连接成功。
接下来根据AT指令集设置,输入下面指令
AT+ROLE=0 //0表示主模式,1表示从模式,2表示回环模式
AT+NAME="BLUENAME" //配置蓝牙模块名称,也可以不打引号,返回OK
AT+PSWD=1234 //设置蓝牙配对码
/*这里设置 自动连接工作模式的波特率,也就是通信的当蓝牙接收发送数据模式的波特率
我们现在是AT模式下波特率只能是38400,这个改不了*/
AT+UART=115200,1,0
AT+RESET //重启模块,可以看到LED等以0.5s间隔闪烁
模块配置好后用手机连接前要将USB转TTL模块vcc的线接到5v口上才能用手机连接成功。
手机上的蓝牙串口我推荐用spp蓝牙串口。以下是我常用控件,你们自己百度下载
小车连接图(我用的是L9110s电机驱动模块)
adruino uno 可以用nano板代替毕竟便宜
注意l9110s模块工作电压在6v到12v之间
adruino uno 和nano板的电源接口是VIN(正极)GND(负极)
其中我发现蓝牙模块与手机连接后频繁开的原因是输入电压太低会导致在发送一个信号(如启动电机,这是本来能维持蓝牙模块的电压输送给电机后会导致蓝牙模块电压过低重启也就是看到的断开连接)
另外程序下载到开发板上时蓝牙模块的RX TX要从板子上拔掉,程序上传成功后在接回;程序上传是板上的vin不能接入电源。
检查接线不要将正负极接反就好了
程序部分
unsigned int Motor_A_1A=10; //控制A电机的PWM引脚 一定改成自己用的
unsigned int Motor_A_1B=11;
unsigned int Motor_B_2A=5; //控制A电机的PWM引脚 一定改成自己用的
unsigned int Motor_B_2B=6;
char Motor_Order; //定义一个字符型变量存储串口输入命令
void setup()
{
Serial.begin(115200); //打开串口,输入你编写的蓝牙模块波特率
Serial.println("/*****开始驱动*****/");
pinMode(Motor_A_1A,OUTPUT); //设置两个驱动引脚为输出模式
pinMode(Motor_A_1B,OUTPUT);
pinMode(Motor_B_2A,OUTPUT); //设置两个驱动引脚为输出模式
pinMode(Motor_B_2B,OUTPUT);
}
void loop()
{
while(Serial.available()>0) //检测串口是否有命令
{
Motor_Order=Serial.read(); //将命令存储在变量中
switch(Motor_Order)
{
//发送字符1电机正转
case '1' : analogWrite(Motor_A_1A,250); analogWrite(Motor_A_1B,0);analogWrite(Motor_B_2A,250); analogWrite(Motor_B_2B,0);Serial.println("小车前进");break;
//发送字符1小车前进
case '2' : analogWrite(Motor_A_1A,0); analogWrite(Motor_A_1B,250);analogWrite(Motor_B_2A,0); analogWrite(Motor_B_2B,250);Serial.println("小车后退/");break;
//发送2小车后退
case '3' : analogWrite(Motor_A_1A,250); analogWrite(Motor_A_1B,0);analogWrite(Motor_B_2A,0); analogWrite(Motor_B_2B,250);Serial.println("小车左转");break;
//发送字符3小车左转
case '4' : analogWrite(Motor_A_1A,0); analogWrite(Motor_A_1B,250);analogWrite(Motor_B_2A,250); analogWrite(Motor_B_2B,0);Serial.println("小车右转");break;
//发送字符4小车右转
default : analogWrite(Motor_A_1A,0); analogWrite(Motor_A_1B,0);analogWrite(Motor_B_2A,0); analogWrite(Motor_B_2B,0);Serial.println("小车停止");break;
//发送字符0小车停止
}
}
}
有人可能会说怎么不封装下,额,我懒~~~~~
好吧,下面是我简单函数化了一下
unsigned int Motor_B_2A=5;
unsigned int Motor_B_2B=6;
unsigned int Motor_A_1A=10; //控制A电机的PWM引脚 一定改成自己用的
unsigned int Motor_A_1B=11;
char Motor_Order; //定义一个字符型变量存储串口输入命令
void setup()
{
Serial.begin(115200); //打开串口
Serial.println("/*****开始驱动*****/");
pinMode(Motor_A_1A,OUTPUT); //设置两个驱动引脚为输出模式
pinMode(Motor_A_1B,OUTPUT);
pinMode(Motor_B_2A,OUTPUT); //设置两个驱动引脚为输出模式
pinMode(Motor_B_2B,OUTPUT);
}
void forward()
{
analogWrite(Motor_A_1A,250);
analogWrite(Motor_A_1B,0);
analogWrite(Motor_B_2A,250);
analogWrite(Motor_B_2B,0);
}
void back()
{
analogWrite(Motor_A_1A,0);
analogWrite(Motor_A_1B,250);
analogWrite(Motor_B_2A,0);
analogWrite(Motor_B_2B,250);
}
void turnleft()
{
analogWrite(Motor_A_1A,250);
analogWrite(Motor_A_1B,0);
analogWrite(Motor_B_2A,0);
analogWrite(Motor_B_2B,250);
}
void turnright()
{
analogWrite(Motor_A_1A,0);
analogWrite(Motor_A_1B,250);
analogWrite(Motor_B_2A,250);
analogWrite(Motor_B_2B,0);
}
void pstop()
{
analogWrite(Motor_A_1A,0);
analogWrite(Motor_A_1B,0);
analogWrite(Motor_B_2A,0);
analogWrite(Motor_B_2B,0);
}
void loop()
{
while(Serial.available()>0) //检测串口是否有命令
{
Motor_Order=Serial.read(); //将命令存储在变量中
switch(Motor_Order)
{
case '1' :forward();Serial.println("/*****小车前进*****/");break;
case '2' : back;Serial.println("/*****小车后退*****/");break; //car for back
case'3':turnleft;Serial.println("/*****小车向左转*****/");break;
case'4':turnright;Serial.println("/*****小车向右转*****/");break;
case'0' :pstop;Serial.println("/*****停转****/");break;//发送其他字符电机停转
}
}
}
本篇是小白我的学习过程笔记,轻点喷