goodluck 发表于 2016-8-26 15:46:57

请大神进来看看。想让小车速度变慢,上了ENA ENB 之后只有一个轮子转,

#include <Servo.h>
//#define send

Servo myservo;
#define ENA 10
#define ENB 11
int Echo =A1;// Echo回声脚(P2.0)
int Trig =A0;//Trig 触发脚(P2.1)
int in1 = 5;
int in2 = 4;
int in3 = 3;
int in4 = 2;

int rightDistance = 0,leftDistance = 0,middleDistance = 0 ;

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,0);
digitalWrite(in2,0);
digitalWrite(in3,1);
digitalWrite(in4,0);
}

void turnright()
{
digitalWrite(in1,1);
digitalWrite(in2,0);
digitalWrite(in3,0);
digitalWrite(in4,0);
}
void stop()
{
digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
digitalWrite(in3,LOW);
digitalWrite(in4,LOW);
}

int Distance_test()   // 量出前方距离
{
digitalWrite(Trig, LOW);   // 给触发脚低电平2μs
delayMicroseconds(2);
digitalWrite(Trig, HIGH);// 给触发脚高电平10μs,这里至少是10μs
delayMicroseconds(20);
digitalWrite(Trig, LOW);    // 持续给触发脚低电
float Fdistance = pulseIn(Echo, HIGH);// 读取高电平时间(单位:微秒)
Fdistance= Fdistance/58;       //为什么除以58等于厘米,Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
return (int)Fdistance;
}

void setup()
{
myservo.attach(9);
Serial.begin(9600);   // 初始化串口
pinMode(Echo, INPUT);    // 定义超声波输入脚
pinMode(Trig, OUTPUT);   // 定义超声波输出脚
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);

stop();
}

void loop()
{
   analogWrite(ENA,100);analogWrite(ENB,100);
    myservo.write(90);
    delay(500);
    middleDistance = Distance_test();
    //#ifdef send
    Serial.print("middleDistance=");
    Serial.println(middleDistance);
   // #endif
   
    if(middleDistance<=30)
    {   
      stop();
      delay(500);                        
      myservo.write(5);         
      delay(1000);      
      rightDistance = Distance_test();

      #ifdef send
      Serial.print("rightDistance=");
      Serial.println(rightDistance);
      #endif
      
      delay(500);
       myservo.write(90);            
      delay(1000);                                                
      myservo.write(175);            
      delay(1000);
      leftDistance = Distance_test();

      #ifdef send
      Serial.print("leftDistance=");
      Serial.println(leftDistance);
      #endif

      delay(500);
      myservo.write(90);            
      delay(1000);
      if(rightDistance>leftDistance)
      {
      turnright();
      delay(100);
       }
       else if(rightDistance<leftDistance)
       {
      turnleft();
      delay(100);
       }
       else
       {
      forward();
       }
    }
    else
   
      forward();                     
}


请大神进来看看。想让小车速度变慢,上了ENA ENB 之后只有一个轮子转,如果单独测试的话 两个轮子都转 请大神指教啊

goodluck 发表于 2016-8-26 15:49:17

如果不用ENA ENB 的话一切都好,就是速度太快 老撞墙 用了之后只能控制一个轮子 啊   郁闷

164335413 发表于 2016-8-27 10:41:17

goodluck 发表于 2016-8-26 15:49 static/image/common/back.gif
如果不用ENA ENB 的话一切都好,就是速度太快 老撞墙 用了之后只能控制一个轮子 啊   郁闷

为什么不用硬件的PWM?analogWrite(Pin,0~255)

houliji 发表于 2016-8-27 14:47:58

同求,我也遇到一个轮子转的情况。

goodluck 发表于 2016-8-27 17:22:04

164335413 发表于 2016-8-27 10:41 static/image/common/back.gif
为什么不用硬件的PWM?analogWrite(Pin,0~255)

谢谢大神指点现在已经解决了、我还有一个问题 怎么样把蓝牙控制和超声壁障结合到一起做一个小车啊

164335413 发表于 2016-8-28 13:32:49

goodluck 发表于 2016-8-27 17:22 static/image/common/back.gif
谢谢大神指点现在已经解决了、我还有一个问题 怎么样把蓝牙控制和超声壁障结合到一起做一个小车啊

蓝牙可以发送一个消息,告诉小车现在是避障模式,对蓝牙发送的前后左右的命令不进行处理。但是有一个命令是用来切换模式的,这个命令必须接收,并做处理。

goodluck 发表于 2016-8-29 11:11:26

164335413 发表于 2016-8-28 13:32 static/image/common/back.gif
蓝牙可以发送一个消息,告诉小车现在是避障模式,对蓝牙发送的前后左右的命令不进行处理。但是有一个命令 ...

大神能不能说点详细一点啊 我刚学 不懂这么复杂
页: [1]
查看完整版本: 请大神进来看看。想让小车速度变慢,上了ENA ENB 之后只有一个轮子转,