两模式小车——蓝牙遥控和寻迹;加霍尔测速显示在1602上
和大家一起交流,还有很多不完美的地方,请大神指导,我对arduino很感兴趣,也很希望大神指导。/*L298N:BNA--9,BNB--10,IN1--30,IN2--31,IN3--32,IN4--33
1602:K--GND,A--3.3V,D7--2,D6--3,D5--4,D4--5,E--11,RW--GND,RS--12,VDD--5V,VSS--GND
霍尔--6
光电开关左D0--8,右D0--7*/
#include <LiquidCrystal.h>
int i=2;
int v=1;
char k;
int A=1;
int a=1;
int b=1;
int c=1;
int d=1;
int e=1;
int f=1;
int g=1;
float time;
float time1;
float time2;//一定要定义成float,不然不能测;
float spd;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// put your setup code here, to run once:
lcd.begin(16, 2);
attachInterrupt(3, blink, FALLING);
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
Serial.begin(9600);
pinMode(30,OUTPUT);
pinMode(31,OUTPUT);
pinMode(32,OUTPUT);
pinMode(33,OUTPUT);
digitalWrite(6,HIGH);
digitalWrite(30,LOW);
digitalWrite(31,LOW);
digitalWrite(32,LOW);
digitalWrite(33,LOW);
}
void loop() {
// put your main code here, to run repeatedly:
{
if(Serial.available())
{
k=Serial.read();
}
switch(k)
{
case'0':
a=1;
do{
xunji();
Bluetoothcesu();
lcd.setCursor(0,1);
lcd.print("Trsckingmode");
if(Serial.available())
{k=Serial.read();}
if(k!='0')
a=0;
}while(a);break;
case'1'://前进
b=1;
do{lcd.setCursor(0,1);
lcd.print("Bluetooth mode");
analogWrite(9,120);
analogWrite(10,120);
digitalWrite(30,HIGH);
digitalWrite(31,LOW);
digitalWrite(32,HIGH);
digitalWrite(33,LOW);
Bluetoothcesu();
Serial.println(k);
if(k!='1')
b=0;
}while(b);break;
case'2': //后退
c=1;
do{lcd.setCursor(0,1);
lcd.print("Bluetooth mode");
analogWrite(9,120);
analogWrite(10,120);
digitalWrite(30,LOW);
digitalWrite(31,HIGH);
digitalWrite(32,LOW);
digitalWrite(33,HIGH);
Bluetoothcesu();
if(k!='2')
c=0;
}while(c);break;
case'3': //左转
d=1;
do{lcd.setCursor(0,1);
lcd.print("Bluetooth mode");
analogWrite(9,120);
analogWrite(10,120);
digitalWrite(30,HIGH);
digitalWrite(31,LOW);
digitalWrite(32,LOW);
digitalWrite(33,HIGH);
Bluetoothcesu();
if(k!='3')
d=0;
}while(d);break;
case'4': //右转
e=1;
do{lcd.setCursor(0,1);
lcd.print("Bluetooth mode");
analogWrite(9,120);
analogWrite(10,120);
digitalWrite(30,LOW);
digitalWrite(31,HIGH);
digitalWrite(32,HIGH);
digitalWrite(33,LOW);
Bluetoothcesu();
Serial.println(k);
if(k!='4')
e=0;
}while(e);break;
case'5': //左后转
f=1;
do{lcd.setCursor(0,1);
lcd.print("Bluetooth mode");
analogWrite(9,120);
analogWrite(10,120);
digitalWrite(30,LOW);
digitalWrite(31,HIGH);
digitalWrite(32,HIGH);
digitalWrite(33,LOW);
Bluetoothcesu();
if(k!='5')
f=0;
}while(f);break;
case'6': //右后转
g=1;
do{lcd.setCursor(0,1);
lcd.print("Bluetooth mode");
analogWrite(9,120);
analogWrite(10,120);
digitalWrite(30,HIGH);
digitalWrite(31,LOW);
digitalWrite(32,LOW);
digitalWrite(33,HIGH);
Bluetoothcesu();
if(k!='6')
g=0;
}while(g);break;
case'7': //停止
lcd.setCursor(0,1);
lcd.print("Bluetooth mode");
analogWrite(9,120);
analogWrite(10,120);
digitalWrite(30,LOW);
digitalWrite(31,LOW);
digitalWrite(32,LOW);
digitalWrite(33,LOW);
lcd.setCursor(0,0);//1602第一位第一行开始显示,
lcd.print(0.00000);//(覆盖)掉前面的速度,
lcd.print(000000);
break;
}}}
void blink()
{v--;
i--;}
void xunji()
{
if(digitalRead(7)==HIGH && digitalRead(8)==LOW)
{analogWrite(10,110);
digitalWrite(32,HIGH);
digitalWrite(33,LOW);
analogWrite(9,110);
digitalWrite(30,LOW);
digitalWrite(31,HIGH);
}
else if(digitalRead(8)==HIGH && digitalRead(7)==LOW)
{analogWrite(9,100);
digitalWrite(30,HIGH);
digitalWrite(31,LOW);
analogWrite(10,100);
digitalWrite(32,LOW);
digitalWrite(33,HIGH);}
else if(digitalRead(7)==HIGH && digitalRead(8)==HIGH)
{digitalWrite(30,LOW);
digitalWrite(31,LOW);
digitalWrite(32,LOW);
digitalWrite(33,LOW);
lcd.setCursor(0,0);//1602第一位第一行开始显示,
lcd.print(0.00000);//(覆盖)掉前面的速度,
lcd.print(000000);
lcd.print("m/s");
}
else
{analogWrite(9,120);
analogWrite(10,120);
digitalWrite(30,HIGH);
digitalWrite(31,LOW);
digitalWrite(32,HIGH);
digitalWrite(33,LOW);
}
}
void Bluetoothcesu()
{
while(abs(v)<1)//abs取绝对值函数
{
time1=micros();//返回微秒
v--;
}
while(abs(i)<1)
{
time2=micros();
i--;
time=time2-time1;
}
if(i<=-1)
{
time2=0;
time1=0;
i=2;
v=1;
}
if(time!=0 &&digitalRead(31)==HIGH)
{
spd=220000/time;
lcd.setCursor(0,0);
lcd.print("-");
lcd.print(spd);
lcd.print("m/s");
}
else if(time!=0 && digitalRead(30)==HIGH)
{
spd=220000/time;
lcd.setCursor(0,0);
lcd.print("+");
lcd.print(spd);
lcd.print("m/s");
}
if(Serial.available())
{k=Serial.read();}
} 楼主请上图 再改的简洁一些会更好! 中断那个函数做什么没看出来,能讲解一下吗 穆浩然 发表于 2017-3-12 18:12
中断那个函数做什么没看出来,能讲解一下吗
中断函数是为测速服务的(测两个时间), 楼主,我自己写了一个小程序,也是两个模式的,只是用的是无刷直流电机,程序上稍微有点区别。但是运行起来有问题,没反应,求楼主指导:程序如下:
const int SV_L=3;
const int FR_L=12;
const int EN_L=4;
const int SV_R=5;
const int FR_R=6;
const int EN_R=7;
const int sensor_C=9;
const int sensor_L=8;
const int sensor_R=11;
const int interrupt=13;
void setup() {
Serial.begin(9600);
attachInterrupt(0,bluetoothmode,RISING);
pinMode(SV_L,OUTPUT);
pinMode(FR_L,OUTPUT);
pinMode(EN_L,OUTPUT);
pinMode(SV_R,OUTPUT);
pinMode(FR_R,OUTPUT);
pinMode(EN_R,OUTPUT);
pinMode(sensor_C,INPUT);
pinMode(sensor_L,INPUT);
pinMode(sensor_R,INPUT);
pinMode(interrupt,OUTPUT);
}
void loop() {
if(Serial.available()>0)
{
char IN=Serial.read();
if(IN=='G')
{
digitalWrite(interrupt,HIGH);
}
else
{
digitalWrite(interrupt,LOW);
}
}
int C=digitalRead(sensor_C);
int L=digitalRead(sensor_L);
int R=digitalRead(sensor_R);
if((C==1)&&(L==0)&&(R==0))
{
forward();
}
else if((C==0)&&(L==1)&&(R==0))
{
turn_left();
}
else if((C==0)&&(L==0)&&(R==1))
{
turn_right();
}
else if((C==1)&&(L==1)&&(R==0))
{
turn_left();
}
else if((C==1)&&(L==0)&&(R==1))
{
turn_right();
}
else
{
stop_car();
}
}
void bluetoothmode()
{
char command;
if(Serial.available()>0)
{
command=Serial.read();
if(command=='A')
{
forward();
}
else if(command=='B')
{
back();
}
else if(command=='C')
{
turn_left();
}
else if(command=='D')
{
turn_right();
}
else if(command=='F')
{
stop_car();
}
}
if(command!='H')
{
bluetoothmode();
}
}
void forward()
{
digitalWrite(EN_L,LOW);
digitalWrite(FR_L,LOW);
digitalWrite(EN_R,LOW);
digitalWrite(FR_R,HIGH);
digitalWrite(SV_L,HIGH);
digitalWrite(SV_R,HIGH);
}
void turn_left()
{
digitalWrite(EN_L,LOW);
digitalWrite(FR_L,LOW);
digitalWrite(EN_R,LOW);
digitalWrite(FR_R,HIGH);
analogWrite(SV_L,255);
analogWrite(SV_R,50);
}
void turn_right()
{
digitalWrite(EN_L,LOW);
digitalWrite(FR_L,LOW);
digitalWrite(EN_R,LOW);
digitalWrite(FR_R,HIGH);
analogWrite(SV_L,50);
analogWrite(SV_R,255);
}
void stop_car()
{
digitalWrite(EN_L,HIGH);
digitalWrite(EN_R,HIGH);
}
void back()
{
digitalWrite(EN_L,LOW);
digitalWrite(FR_L,HIGH);
digitalWrite(EN_R,LOW);
digitalWrite(FR_R,LOW);
digitalWrite(SV_L,HIGH);
digitalWrite(SV_R,HIGH);
}
页:
[1]