九个皇后 发表于 2017-3-9 21:41:02

两模式小车——蓝牙遥控和寻迹;加霍尔测速显示在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-10 13:04:16

楼主请上图

164335413 发表于 2017-3-11 13:15:43

再改的简洁一些会更好!

穆浩然 发表于 2017-3-12 18:12:50

中断那个函数做什么没看出来,能讲解一下吗

九个皇后 发表于 2017-3-16 11:27:03

穆浩然 发表于 2017-3-12 18:12
中断那个函数做什么没看出来,能讲解一下吗

中断函数是为测速服务的(测两个时间),

1728311366 发表于 2017-7-29 14:57:54

楼主,我自己写了一个小程序,也是两个模式的,只是用的是无刷直流电机,程序上稍微有点区别。但是运行起来有问题,没反应,求楼主指导:程序如下:
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]
查看完整版本: 两模式小车——蓝牙遥控和寻迹;加霍尔测速显示在1602上