libinbin112233 发表于 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("   ");      
   }
}
用这个代码实现了,不过小车老纠结了 ,总卡到一个地方左右摇头

libinbin112233 发表于 2015-6-19 10:18:05

帮我改进改进阿 ,吐槽一下验证马真难看

血阳 发表于 2015-6-19 11:38:55

libinbin112233 发表于 2015-6-19 10:18 static/image/common/back.gif
帮我改进改进阿 ,吐槽一下验证马真难看

{:3_57:}{:3_57:}
天啦噜,这么多!好腻害{:3_41:}。。。。。
我现在看不啦,考期到了,复习复习,考完试再一起研究探讨吧,我也不一定会啊,就相互探讨吧。

血阳 发表于 2015-6-19 11:41:37

libinbin112233 发表于 2015-6-19 10:18 static/image/common/back.gif
帮我改进改进阿 ,吐槽一下验证马真难看

还有啊,你小车的图能发下不?这样方便理解你的程序。

libinbin112233 发表于 2015-6-26 20:02:42

#define IN1 9
#define IN2 6//定义IN1接arduino4号引脚,IN2接5号引脚
#define IN3 11
#define IN4 10//定义IN3接arduino6号引脚,IN4接7号引脚
#define EchoPin A1
#define TrigPin A2
float distance;
void setup()
{
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(EchoPin,INPUT);
pinMode(TrigPin,OUTPUT);
Serial.begin(9600);
}
void loop()
{
RCW();
distance = pulseIn(EchoPin,HIGH)/58.00;
if(distance>30)
{
    forward();
}
else
{
do
{
    turnLeftOrigin();
    delay(10);
}
while(distance>30);
}
}   

void RCW()
{
digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
}
void forward()//前进
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);//左轮前进
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//右轮前进
}
void back()//后退
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//左轮后退
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);//右轮后退
}
void turnLeft()//前左转
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);//左轮停止
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//右轮前进
}
void turnRight()//前右转
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);//左轮前进
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);//右轮停止
}
void turnBackLeft()//后左转
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//左轮后退
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);//右轮停止
}
void turnBackRight()//后右转
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);//左轮停止
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);//右轮后退
}
void turnLeftOrigin()//原地左转
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//左轮后退
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//右轮前进
}
void turnRightOrigin()//原地右转
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);//左轮前进
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);//右轮后退
}
void _stop()
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);//左轮停止
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);//右轮停止
}
哈哈 今天用UNTIL循环改进了一下

tomylver 发表于 2015-7-3 15:02:01

very good ..

tomylver 发表于 2015-7-3 15:02:32

就是视屏不能看

血阳 发表于 2015-7-4 02:23:43

tomylver 发表于 2015-7-3 15:02 static/image/common/back.gif
就是视屏不能看

可以看到啊,你换个浏览器试试。
还有其实视频也没啥,就是操控小车跑了一小段距离而已。

tomylver 发表于 2015-7-4 22:02:41

。。。好把,希望多多分享。感谢回复

菜鸟一个 发表于 2015-7-8 18:49:41

:lol:lol:lol:lol:lol

艾弗森闯天涯 发表于 2015-7-21 17:13:31

我的小车转的太快 我想控制他的转速也就是在手机上设置个加速 和减速项   具体就是我通过蓝牙发射个数字过去他接收到以后就把转速提高一点减速原理也是这样可是我不知道如何用PWM写这个程序   求帮助 :funk:

血阳 发表于 2015-7-21 17:23:11

艾弗森闯天涯 发表于 2015-7-21 17:13 static/image/common/back.gif
我的小车转的太快 我想控制他的转速也就是在手机上设置个加速 和减速项   具体就是我通过蓝牙发射个数字过 ...

不是有一个L298N的驱动模块吗?
你把那个ENA,和ENB的短接冒去掉。然后两个同时连线引到arduino有PWM的一个引脚(就是引脚号前面有~或者其他符号的引脚)
然后,写一个函数,用annalogWrite来写一个控制速度的函数,给这个引脚,就行了。
然后用在loop里,判断,当接受信号为A时,赋值某个速度,当接受信号为B时,赋值某个速度。
大概就这样子··

艾弗森闯天涯 发表于 2015-7-22 14:10:20

血阳 发表于 2015-7-21 17:23 static/image/common/back.gif
不是有一个L298N的驱动模块吗?
你把那个ENA,和ENB的短接冒去掉。然后两个同时连线引到arduino有PWM的一 ...

#define IN1 11
#define IN2 12 //定义In1接arduino的4引脚,In2接5引脚
#define EN1 9//用PWM控制电机速度接13端口
rvoid forward();
void back();
void _stop();//这里是把我们用到的函数都声明一遍

void setup()
{
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(13,OUTPUT);//
Serial.begin(9600);
}
int i;
void loop()
{
if(Serial.available())
{
    i=Serial.read();
    switch(i)
    {
      case'2':
    {forward();break;}
      case'8':
   {back();break;}
      case'5':
   {_stop();break;}
   case'1':
   {analogWrite(9,250);break;}
   case'3':
   {analogWrite(,100);break;}
    }
}
}
void forward()
{
   digitalWrite(IN1,HIGH);      
   digitalWrite(IN2,LOW);         //左轮前进      
}

void back( )
{
   digitalWrite(IN1,LOW);      
   digitalWrite(IN2,HIGH);      //左轮后退

}
void _stop()

{
   digitalWrite(IN1,LOW);      
   digitalWrite(IN2,LOW);         //左轮静止不动

}
你看这样行不?另外,我单纯的给电机analogWrite(9,--)随便赋不同的值,他的转速还是没有变???还有你给L298N供电用的是什么?我找不到合适的无线电源

血阳 发表于 2015-7-22 17:19:01

艾弗森闯天涯 发表于 2015-7-22 14:10 static/image/common/back.gif
#define IN1 11
#define IN2 12 //定义In1接arduino的4引脚,In2接5引脚
#define EN1 9//用PWM控制电机 ...

你的EN1 是9引脚,结果在setup里写成13啦。

血阳 发表于 2015-7-22 17:23:06

艾弗森闯天涯 发表于 2015-7-22 14:10 static/image/common/back.gif
#define IN1 11
#define IN2 12 //定义In1接arduino的4引脚,In2接5引脚
#define EN1 9//用PWM控制电机 ...

给L298N供电,我是直接接在arduino板子的5v电压口那的。供电给arduino板子5~9V都行。
页: 1 2 3 [4] 5 6 7 8 9 10 11
查看完整版本: 从菜鸟到完美掌控arduino蓝牙小车