极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15448|回复: 5

两模式小车——蓝牙遥控和寻迹;加霍尔测速显示在1602上

[复制链接]
发表于 2017-3-9 21:41:02 | 显示全部楼层 |阅读模式
和大家一起交流,还有很多不完美的地方,请大神指导,我对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("Trscking  mode");
        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 | 显示全部楼层
楼主请上图
回复 支持 反对

使用道具 举报

发表于 2017-3-11 13:15:43 | 显示全部楼层
再改的简洁一些会更好!
回复 支持 反对

使用道具 举报

发表于 2017-3-12 18:12:50 | 显示全部楼层
中断那个函数做什么没看出来,能讲解一下吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-16 11:27:03 | 显示全部楼层
穆浩然 发表于 2017-3-12 18:12
中断那个函数做什么没看出来,能讲解一下吗

中断函数是为测速服务的(测两个时间),
回复 支持 反对

使用道具 举报

发表于 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);
}

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-16 20:36 , Processed in 0.039301 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表