极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 血阳

从菜鸟到完美掌控arduino蓝牙小车

  [复制链接]
 楼主| 发表于 2015-6-10 01:44:54 | 显示全部楼层
libinbin112233 发表于 2015-6-9 16:41
小车能动是能动,如何设计超声波测距并转向的编程呢~ 头疼了! 本来设想的是超声波测距后小车原地转,当测距大 ...

这个不难呀,你首先要知道超声波的模块使用方法。然后接在板子的模拟串口,然后再在loop循环里加上if语句来判断。就OK了。
回复 支持 反对

使用道具 举报

发表于 2015-6-11 15:55:11 | 显示全部楼层
血阳 发表于 2015-6-10 01:44
这个不难呀,你首先要知道超声波的模块使用方法。然后接在板子的模拟串口,然后再在loop循环里加上if语句 ...

是模拟接口?
我贴一段代码 RCW();
  distance = pulseIn(EchoPin,HIGH)/58.00;
if(distance<10)
{
   back();
}
else if(distance<20)
{
   turnRightOrigin();
}
else if(distance<500)
{
   forward();
}
else if(distance>=500)
{
   _stop();
}
Serial.println(distance);
delay(1000);
}
  void RCW()
  {
  digitalWrite(TrigPin,LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin,LOW);
  }
串口输出的距离都是0~不知道为啥
回复 支持 反对

使用道具 举报

发表于 2015-6-11 15:55:37 | 显示全部楼层
血阳 发表于 2015-6-10 01:44
这个不难呀,你首先要知道超声波的模块使用方法。然后接在板子的模拟串口,然后再在loop循环里加上if语句 ...

是模拟接口?
我贴一段代码
RCW();
  distance = pulseIn(EchoPin,HIGH)/58.00;
if(distance<10)
{
   back();
}
else if(distance<20)
{
   turnRightOrigin();
}
else if(distance<500)
{
   forward();
}
else if(distance>=500)
{
   _stop();
}
Serial.println(distance);
delay(1000);
}
  void RCW()
  {
  digitalWrite(TrigPin,LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin,LOW);
  }
串口输出的距离都是0~不知道为啥
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-12 21:28:19 | 显示全部楼层
libinbin112233 发表于 2015-6-11 15:55
是模拟接口?
我贴一段代码
RCW();

说错了,接数字口。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-12 22:59:51 | 显示全部楼层
本帖最后由 血阳 于 2015-6-12 23:08 编辑
libinbin112233 发表于 2015-6-11 15:55
是模拟接口?
我贴一段代码
RCW();


我用的是红外接近开关。

下面这个是没用遥控的代码,就是自己跑,然后遇到障碍就会转弯的。

void setup()
{
&#160;&#160;pinMode(11,INPUT);
&#160;&#160;pinMode(12,INPUT);
}
void loop()
{
&#160;&#160;forward();
&#160;&#160;if(LOW==digitalRead(11))
&#160;&#160;{
&#160;&#160;&#160;&#160;_stop();
&#160;&#160;&#160;&#160;turnRightOrigin();
&#160;&#160;&#160;&#160;delay(1000);
&#160;&#160;}
&#160;&#160;if(LOW==digitalRead(12))
&#160;&#160;{
&#160;&#160;&#160;&#160;_stop();
&#160;&#160;&#160;&#160;turnRightOrigin();
&#160;&#160;&#160;&#160;delay(1000);
&#160;&#160;}
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-12 23:15:15 | 显示全部楼层
libinbin112233 发表于 2015-6-9 16:41
小车能动是能动,如何设计超声波测距并转向的编程呢~ 头疼了! 本来设想的是超声波测距后小车原地转,当测距大 ...


如果你想实现的是遇到障碍自动转的话,建议你用我上面说的那个,就是红外接近开关,这个比较简单粗暴。红外接近开关,无障碍时候输出高电平,有障碍输出低电平。
如果你就是想用超声波测距的话,这个···我还没玩过,你可以去看看论坛里的大神们的相关教程,比如他们的超声波自平衡小车,从里面应该可以学习到超声波测距的应用吧。
祝你成功~
回复 支持 反对

使用道具 举报

发表于 2015-6-14 16:35:43 | 显示全部楼层
本帖最后由 alai2015 于 2015-6-14 16:47 编辑

谢谢!写的认真,详细, 帮助很大,我的第一台藍芽小車, 看著這篇完成的.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-15 01:25:37 | 显示全部楼层
alai2015 发表于 2015-6-14 16:35
谢谢!写的认真,详细, 帮助很大,我的第一台藍芽小車, 看著這篇完成的.

恭喜恭喜大家相互学习相互进步~~
回复 支持 反对

使用道具 举报

发表于 2015-6-15 23:45:25 | 显示全部楼层
本帖最后由 pumpitup 于 2015-6-15 23:49 编辑

俺也准备做个这个哦。。。

话说,您供电这一块是怎么做的,难道是电池给arduino供电,arduino给298供电?

我一直在想用11.1V给298供电,298给arduino供电,不知道怎么接。
回复 支持 反对

使用道具 举报

发表于 2015-6-16 13:17:51 | 显示全部楼层
我是1.5x4電池供电給L298N, 再由L298N供給nano
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-16 15:36:00 | 显示全部楼层
alai2015 发表于 2015-6-16 13:17
我是1.5x4電池供电給L298N, 再由L298N供給nano

恩恩,这个也行。
只是我不太清楚这些个电压的输入输出,所以不敢乱给电,怕把元件给烧了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-18 21:07:17 | 显示全部楼层
其实这个小车还可以加上很多模块,比如遥控模块不用手机,用专门的手柄遥控
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-18 21:07:50 | 显示全部楼层
还有可以加上很多自动控制的传感器,比如温度传感器
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-18 21:08:41 | 显示全部楼层
让小车既可以手动,当触发条件了又能自动控制。
回复 支持 反对

使用道具 举报

发表于 2015-6-19 10:16:25 | 显示全部楼层
/*  程序的开头要描述你的设备
    再来要说是脽写的日期版本
    然后碰到问题一次一次都要写清楚
    马达几个驱动电路都要描述
    L = 左
    R = 右
    F = 前
    B = 后
*/  
#include <Servo.h>   
int pinLB=6;     // 定义8脚位 左后  
int pinLF=9;     // 定义9脚位 左前  
  
int pinRB=10;    // 定义10脚位 右后  
int pinRF=11;    // 定义11脚位 右前  
  
int inputPin = A1;  // 定义超音波信号接收脚位  
int outputPin =A2;  // 定义超音波信号发射脚位  
  
int Fspeedd = 0;      // 前速  
int Rspeedd = 0;      // 右速  
int Lspeedd = 0;      // 左速  
int directionn = 0;   // 前=8 后=2 左=4 右=6   
Servo myservo;        // 设 myservo  
int delay_time = 250; // 伺服马达转向后的稳定时间  
  
int Fgo = 8;         // 前进  
int Rgo = 6;         // 右转  
int Lgo = 4;         // 左转  
int Bgo = 2;         // 倒车  
  
void setup()  
{  
  Serial.begin(9600);     // 定义马达输出脚位   
  pinMode(pinLB,OUTPUT); // 脚位 8 (PWM)  
  pinMode(pinLF,OUTPUT); // 脚位 9 (PWM)  
  pinMode(pinRB,OUTPUT); // 脚位 10 (PWM)   
  pinMode(pinRF,OUTPUT); // 脚位 11 (PWM)  
   
  pinMode(inputPin, INPUT);    // 定义超音波输入脚位  
  pinMode(outputPin, OUTPUT);  // 定义超音波输出脚位     
  
  myservo.attach(5);    // 定义伺服马达输出第5脚位(PWM)  
}  
void advance(int a)     // 前进  
    {  
     digitalWrite(pinRB,LOW);  // 使马达(右后)动作  
     digitalWrite(pinRF,HIGH);  
     digitalWrite(pinLB,LOW);  // 使马达(左后)动作  
     digitalWrite(pinLF,HIGH);  
     delay(a * 50);      
    }  
  
void right(int b)        //右转(单轮)  
    {  
     digitalWrite(pinRB,LOW);   //使马达(右后)动作  
     digitalWrite(pinRF,HIGH);  
     digitalWrite(pinLB,HIGH);  
     digitalWrite(pinLF,HIGH);  
     delay(b * 20);  
    }  
void left(int c)         //左转(单轮)  
    {  
     digitalWrite(pinRB,HIGH);  
     digitalWrite(pinRF,HIGH);  
     digitalWrite(pinLB,LOW);   //使马达(左后)动作  
     digitalWrite(pinLF,HIGH);  
     delay(c * 20);  
    }  
void turnR(int d)        //右转(双轮)  
    {  
     digitalWrite(pinRB,LOW);  //使马达(右后)动作  
     digitalWrite(pinRF,HIGH);  
     digitalWrite(pinLB,HIGH);  
     digitalWrite(pinLF,LOW);  //使马达(左前)动作  
     delay(d * 30);  
    }  
void turnL(int e)        //左转(双轮)  
    {  
     digitalWrite(pinRB,HIGH);  
     digitalWrite(pinRF,LOW);   //使马达(右前)动作  
     digitalWrite(pinLB,LOW);   //使马达(左后)动作  
     digitalWrite(pinLF,HIGH);  
     delay(e * 30);  
    }      
void stopp(int f)         //停止  
    {  
     digitalWrite(pinRB,HIGH);  
     digitalWrite(pinRF,HIGH);  
     digitalWrite(pinLB,HIGH);  
     digitalWrite(pinLF,HIGH);  
     delay(f * 50);  
    }  
void back(int g)          //后退  
    {  
  
     digitalWrite(pinRB,HIGH);  //使马达(右后)动作  
     digitalWrite(pinRF,LOW);  
     digitalWrite(pinLB,HIGH);  //使马达(左后)动作  
     digitalWrite(pinLF,LOW);  
     delay(g * 50);      
    }  
      
void detection()        //测量3个角度(0.90.179)  
    {        
      int delay_time = 250;   // 伺服马达转向后的稳定时间  
      ask_pin_F();            // 读取前方距离  
        
     if(Fspeedd < 5)         // 假如前方距离小于10公分  
      {  
      stopp(1);               // 清除输出数据   
      back(2);                // 后退 0.2秒  
      }  
            
      if(Fspeedd < 10)         // 假如前方距离小于25公分  
      {  
        stopp(1);               // 清除输出数据   
        ask_pin_L();            // 读取左方距离  
        delay(delay_time);      // 等待伺服马达稳定  
        ask_pin_R();            // 读取右方距离   
        delay(delay_time);      // 等待伺服马达稳定   
         
        if(Lspeedd > Rspeedd)   //假如 左边距离大于右边距离  
        {  
         directionn = Rgo;      //向右走  
        }  
         
        if(Lspeedd <= Rspeedd)   //假如 左边距离小于或等于右边距离  
        {  
         directionn = Lgo;      //向左走  
        }   
         
        if (Lspeedd < 5 && Rspeedd < 5)   //假如 左边距离和右边距离皆小于10公分  
        {  
         directionn = Bgo;      //向后走         
        }            
      }  
      else                      //加如前方不小于(大于)25公分      
      {  
        directionn = Fgo;        //向前走      
      }  
      
    }      
void ask_pin_F()   // 量出前方距离   
    {  
      myservo.write(90);  
      digitalWrite(outputPin, LOW);   // 让超声波发射低电压2μs  
      delayMicroseconds(2);  
      digitalWrite(outputPin, HIGH);  // 让超声波发射高电压10μs,这里至少是10μs  
      delayMicroseconds(10);  
      digitalWrite(outputPin, LOW);    // 维持超声波发射低电压  
      float Fdistance = pulseIn(inputPin, HIGH);  // 读差相差时间  
      Fdistance= Fdistance/5.8/10;       // 将时间转为距离距离(单位:公分)  
      Serial.print("F distance:");      //输出距离(单位:公分)  
      Serial.println(Fdistance);         //显示距离  
      Fspeedd = Fdistance;              // 将距离 读入Fspeedd(前速)  
    }   
void ask_pin_L()   // 量出左边距离   
    {  
      myservo.write(5);  
      delay(delay_time);  
      digitalWrite(outputPin, LOW);   // 让超声波发射低电压2μs  
      delayMicroseconds(2);  
      digitalWrite(outputPin, HIGH);  // 让超声波发射高电压10μs,这里至少是10μs  
      delayMicroseconds(10);  
      digitalWrite(outputPin, LOW);    // 维持超声波发射低电压  
      float Ldistance = pulseIn(inputPin, HIGH);  // 读差相差时间  
      Ldistance= Ldistance/5.8/10;       // 将时间转为距离距离(单位:公分)  
      Serial.print("L distance:");       //输出距离(单位:公分)  
      Serial.println(Ldistance);         //显示距离  
      Lspeedd = Ldistance;              // 将距离 读入Lspeedd(左速)  
    }   
void ask_pin_R()   // 量出右边距离   
    {  
      myservo.write(177);  
      delay(delay_time);  
      digitalWrite(outputPin, LOW);   // 让超声波发射低电压2μs  
      delayMicroseconds(2);  
      digitalWrite(outputPin, HIGH);  // 让超声波发射高电压10μs,这里至少是10μs  
      delayMicroseconds(10);  
      digitalWrite(outputPin, LOW);    // 维持超声波发射低电压  
      float Rdistance = pulseIn(inputPin, HIGH);  // 读差相差时间  
      Rdistance= Rdistance/5.8/10;       // 将时间转为距离距离(单位:公分)  
      Serial.print("R distance:");       //输出距离(单位:公分)  
      Serial.println(Rdistance);         //显示距离  
      Rspeedd = Rdistance;              // 将距离 读入Rspeedd(右速)  
    }   
      
void loop()  
{  
    myservo.write(90);  //让伺服马达回归 预备位置 准备下一次的测量  
    detection();        //测量角度 并且判断要往哪一方向移动  
        
   if(directionn == 2)  //假如directionn(方向) = 2(倒车)               
   {  
     back(8);                    //  倒退(车)  
     turnL(2);                   //些微向左方移动(防止卡在死巷里)  
     Serial.print(" Reverse ");   //显示方向(倒退)  
   }  
   if(directionn == 6)           //假如directionn(方向) = 6(右转)      
   {  
     back(1);   
     turnR(6);                   // 右转  
     Serial.print(" Right ");    //显示方向(左转)  
   }  
   if(directionn == 4)          //假如directionn(方向) = 4(左转)      
   {   
     back(1);        
     turnL(6);                  // 左转  
     Serial.print(" Left ");     //显示方向(右转)     
   }   
   if(directionn == 8)          //假如directionn(方向) = 8(前进)        
   {   
    advance(1);                 // 正常前进   
    Serial.print(" Advance ");   //显示方向(前进)  
    Serial.print("   ");      
   }  
}
用这个代码实现了,不过小车老纠结了 ,总卡到一个地方左右摇头
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 14:29 , Processed in 0.049616 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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