转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi
一、本次实验所需器材
1、Arduino UNO板
2、蓝牙模块
3、蓝牙小车底盘(可从淘宝网购买)
4、L298驱动模块:1个
3、面包板:1个
实验:给蓝牙模块发送h,回复i am here;发送b,回复see you.
硬件连接:
代码:
char getstr; void setup() { Serial.begin(9600); } void loop() { getstr=Serial.read(); if(getstr=='h') { Serial.println("I am here!"); } else if(getstr=='b'){ Serial.println("See you!"); } }
将以上代码写入arduino时,要注意先将蓝牙断开,写入完成后,再连上蓝牙,否则会出错。
手机端下载一个bluetooth spp或者蓝牙串口程序即可,这里我用的是http://www.mumayi.com/android-92724.html。
然后通过手机与该蓝牙模块进行连接,一般默认连接码是1234或者0000。连接后,发送h,会显示I am here,发送b,会显示See you!
1、从网上购买了蓝牙小车底盘,组装后如下图:
2、L298驱动模块
该模块的IN1、IN2、IN3、IN4分别连接arduino的12、11、10、9接口,电源12V口接arduino的5V,GND接地。
例子:
char getstr;
int in1=12;
int in2=11;
int in3=10;
int in4=9;
//上面定义了板上的4个控制端,12一组,34一组
void _mRight(int pin1,int pin2)//当in1和in2中有一个接高位时,电机会向某一方向转动
{
digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
}
void _mLeft(int pin1,int pin2)//同上
{
digitalWrite(pin1,LOW);
digitalWrite(pin2,HIGH);
}
void _mStop(int pin1,int pin2)//紧急制动,实际就是将电机两个端短接了
{
digitalWrite(pin1,HIGH);
digitalWrite(pin2,HIGH);
}
void setup()
{
Serial.begin(9600);
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
//下面程序开始时让控制端都为高电平,电机保持不动。
digitalWrite(in1,HIGH);
digitalWrite(in2,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in4,HIGH);
}
void loop()
{
getstr=Serial.read();
if(getstr=='f')
{
Serial.println("go forward!");
_mStop(in1,in2);
_mStop(in3,in4);
_mRight(in1,in2);
_mRight(in3,in4);
}
else if(getstr=='b'){
Serial.println("go back!");
_mStop(in1,in2);
_mStop(in3,in4);
_mLeft(in1,in2);
_mLeft(in3,in4);
}
else if(getstr=='l'){
Serial.println("go left!");
_mStop(in1,in2);
_mStop(in3,in4);
_mRight(in1,in2);
_mLeft(in3,in4);
}
else if(getstr=='r'){
Serial.println("go right!");
_mStop(in1,in2);
_mStop(in3,in4);
_mRight(in3,in4);
_mLeft(in1,in2);
}
else if(getstr=='s'){
Serial.println("Stop!");
_mStop(in1,in2);
_mStop(in3,in4);
}
}
注意,当输入f\b\l\r时,无论前往、后退、左转、右转,电机都是先停一下,再转,这样电机都流畅。
3、蓝牙模块
接法与二中蓝牙模块的使用接法相同。
4、超声波测距模块
连接方法是将VCC接5V,GND接地,trig接5口,Echo接6口。
5、硬件连接图
6、代码
char getstr; int in1=12; int in2=11; int in3=10; int in4=9; //上面定义了板上的4个控制端,12一组,34一组 int TrigPin = 5; int EchoPin = 6; float cm; int i=0;//记录测量次数,每5次取一下平均值 float cmsum;//计算5次总值 float cmeve;//计算5次平均值 void _mRun(int pin1,int pin2)//电机右转,电机到底是右转还是左转取决于电机端的接线和控制脚的顺序 { digitalWrite(pin1,HIGH); digitalWrite(pin2,LOW); } void _mBack(int pin1,int pin2)//同上 { digitalWrite(pin1,LOW); digitalWrite(pin2,HIGH); } void _mStop(int pin1,int pin2)//紧急制动,实际就是将电机两个端短接了 { digitalWrite(pin1,HIGH); digitalWrite(pin2,HIGH); } void setup() { Serial.begin(9600); pinMode(in1,OUTPUT); pinMode(in2,OUTPUT); pinMode(in3,OUTPUT); pinMode(in4,OUTPUT); pinMode(TrigPin, OUTPUT); pinMode(EchoPin, INPUT); //下面程序开始时让控制端都为高电平,电机保持不动。 digitalWrite(in1,HIGH); digitalWrite(in2,HIGH); digitalWrite(in3,HIGH); digitalWrite(in4,HIGH); } void loop() { getstr=Serial.read(); delayMicroseconds(60); digitalWrite(TrigPin, HIGH); delayMicroseconds(60); digitalWrite(TrigPin, LOW); cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm cm = (int(cm * 100.0)) / 100.0; //保留两位小数 if (i==5){//连接测5次,计算平均值,如果小于10厘米则紧急停车 i=0; cmeve=cmsum/5; cmsum=0; if (cmeve<10 and cmeve>0) { Serial.println(cmeve); _mStop(in1,in2); _mStop(in3,in4); } } else { i=i+1; cmsum=cmsum+cm; } if(getstr=='f') { Serial.println("go forward!"); _mStop(in1,in2); _mStop(in3,in4); _mRun(in1,in2); _mRun(in3,in4); } else if(getstr=='b'){ Serial.println("go back!"); _mStop(in1,in2); _mStop(in3,in4); _mBack(in1,in2); _mBack(in3,in4); } else if(getstr=='l'){ Serial.println("go left!"); _mStop(in1,in2); _mStop(in3,in4); _mRun(in1,in2); _mBack(in3,in4); } else if(getstr=='r'){ Serial.println("go left!"); _mStop(in1,in2); _mStop(in3,in4); _mRun(in3,in4); _mBack(in1,in2); } else if(getstr=='s'){ Serial.println("Stop!"); _mStop(in1,in2); _mStop(in3,in4); } }
7、视频