Arduino小车-小车运动实验

介绍 本文主要介绍小车电机实验。包括前进调试、前后左右综合实验、花式动作。

介绍

本文主要介绍小车电机实验。包括前进调试、前后左右综合实验、花式动作。

注意:由于小车电机在出厂时马达会有各种不同的磨损,所以直走前进的方向会偏左或偏右。这个可以通过模拟输出调节

所需硬件

  • 智能小车 *1

连接图

  • 电机/Arduino引脚连接:
    P1.2/IN1→Ard/pin5
    P1.3/IN1→Ard/pin6
    P1.6/IN1→Ard/pin9
    P1.7/IN1→Ard/pin10

注意:使能引脚P1.4/EN1和P1.5/EN2悬空电压为2V,默认为高电平,所以可以不连接。Arduino的3,5,6,9,10,11引脚为PWM输出引脚,均可控制电机PWM输出

代码

  • 调整左右电机PWM模拟输出,直到小车能向前直走,记录PWM值。
//===============================================================
//  智能小车前进调整实验
//===============================================================
//#include <Servo.h> 
int Left_motor_back=5;     //左电机后退(IN1)
int Left_motor_go=6;     //左电机前进(IN2)

int Right_motor_go=9;    // 右电机前进(IN3)
int Right_motor_back=10;    // 右电机后退(IN4)

void setup()
{
  //初始化电机驱动IO为输出方式
  pinMode(Left_motor_go,OUTPUT); // PIN 5 (PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 6 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 9 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 10 (PWM)
}
void run(int time)     // 前进
{
  analogWrite(Right_motor_go,200);//右电机前进,PWM比例0~255调速,左右轮差异略增减
  analogWrite(Right_motor_back,0);
  analogWrite(Left_motor_go,200);//左电机前进,PWM比例0~255调速,左右轮差异略增减
  analogWrite(Left_motor_back,0);
  delay(time * 100);   //执行时间,可以调整  
}

void brake(int time)         //刹车,停车
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
  delay(time * 100);//执行时间,可以调整  
}
void loop()
{
  delay(2000); //延时2s后启动
  run(10);//前进1s
  brake(5);//停车
}
  • 增加后退、左右转和急转函数,实现前后左右动作。
//===============================================================
//  智能小车前后左右综合实验
//===============================================================
//#include <Servo.h> 
int Left_motor_back=5;     //左电机后退(IN1)
int Left_motor_go=6;     //左电机前进(IN2)

int Right_motor_go=9;    // 右电机前进(IN3)
int Right_motor_back=10;    // 右电机后退(IN4)

void setup()
{
  //初始化电机驱动IO为输出方式
  pinMode(Left_motor_go,OUTPUT); // PIN 5 (PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 6 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 9 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 10 (PWM)
}
void run(int time)     // 前进
{
  analogWrite(Right_motor_go,200);//右电机前进,PWM比例0~255调速,左右轮差异略增减
  analogWrite(Right_motor_back,0);
  analogWrite(Left_motor_go,200);// 左电机前进,PWM比例0~255调速,左右轮差异略增减
  analogWrite(Left_motor_back,0);
  delay(time * 100);   //执行时间,可以调整  
}

void brake(int time)         //刹车,停车
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
  delay(time * 100);//执行时间,可以调整  
}

void left(int time)         //左转(左轮不动,右轮前进)
{
  analogWrite(Right_motor_go,200); //右电机前进,PWM比例0~255调速
  analogWrite(Right_motor_back,0);
  digitalWrite(Left_motor_go,LOW);   //左轮不动
  digitalWrite(Left_motor_back,LOW);
  delay(time * 100);    //执行时间,可以调整  
}

void spin_left(int time)         //左转(左轮后退,右轮前进)
{
  analogWrite(Right_motor_go,200); //右电机前进,PWM比例0~255调速
  analogWrite(Right_motor_back,0);

  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,200);//左轮后退PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整  
}

void right(int time)        //右转(右轮不动,左轮前进)
{
  digitalWrite(Right_motor_go,LOW);   //右电机不动
  digitalWrite(Right_motor_back,LOW);

  analogWrite(Left_motor_go,200); 
  analogWrite(Left_motor_back,0);//左电机前进,PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整  
}

void spin_right(int time)        //右转(右轮后退,左轮前进)
{
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,200);//右电机后退,PWM比例0~255调速

  analogWrite(Left_motor_go,200); //左电机前进,PWM比例0~255调速
  analogWrite(Left_motor_back,0);
  delay(time * 100);    //执行时间,可以调整  
}

void back(int time)          //后退
{
  analogWrite(Right_motor_go,0);
  analogWrite(Right_motor_back,150);//右轮后退,PWM比例0~255调速

  analogWrite(Left_motor_go,0);
  analogWrite(Left_motor_back,150);//左轮后退,PWM比例0~255调速
  delay(time * 100);     //执行时间,可以调整  
}

void loop()
{
  delay(2000); //延时2s后启动
  back(10); //后退1s
  brake(5);//停止0.5s
  run(10);//前进1s
  brake(5);//停止0.5s
  left(10);//向左转1s
  right(10);//向右转1s
  spin_right(20); //向右旋转2s
  spin_left(20);//向左旋转2s
  brake(5);//停车
}
  • 小车指定花式动作代码
//===============================================================
//  智能小车指定花式动作
//===============================================================
//#include <Servo.h> 
int Left_motor_back=5;     //左电机后退(IN1)
int Left_motor_go=6;     //左电机前进(IN2)

int Right_motor_go=9;    // 右电机前进(IN3)
int Right_motor_back=10;    // 右电机后退(IN4)

void setup()
{
  //初始化电机驱动IO为输出方式
  pinMode(Left_motor_go,OUTPUT); // PIN  5(PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 6 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 9 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 10 (PWM)
}
void run(int time)     // 前进
{
  analogWrite(Right_motor_go,200);//右电机前进,PWM比例0~255调速,左右轮差异略增减
  analogWrite(Right_motor_back,0);
  analogWrite(Left_motor_go,200);// 左电机前进,PWM比例0~255调速,左右轮差异略增减
  analogWrite(Left_motor_back,0);
  delay(time * 100);   //执行时间,可以调整  
}

void brake(int time)         //刹车,停车
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
  delay(time * 100);//执行时间,可以调整  
}

void left(int time)         //左转(左轮不动,右轮前进)
{
  analogWrite(Right_motor_go,200); //右电机前进,PWM比例0~255调速
  analogWrite(Right_motor_back,0);
  digitalWrite(Left_motor_go,LOW);   //左轮不动
  digitalWrite(Left_motor_back,LOW);
  delay(time * 100);    //执行时间,可以调整  
}

void spin_left(int time)         //左转(左轮后退,右轮前进)
{
  analogWrite(Right_motor_go,200); //右电机前进,PWM比例0~255调速
  analogWrite(Right_motor_back,0);

  analogWrite(Left_motor_go,0); 
  analogWrite(Left_motor_back,200);//左轮后退PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整  
}

void right(int time)        //右转(右轮不动,左轮前进)
{
  digitalWrite(Right_motor_go,LOW);   //右电机不动
  digitalWrite(Right_motor_back,LOW);

  analogWrite(Left_motor_go,200); 
  analogWrite(Left_motor_back,0);//左电机前进,PWM比例0~255调速
  delay(time * 100);    //执行时间,可以调整  
}

void spin_right(int time)        //右转(右轮后退,左轮前进)
{
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,200);//右电机后退,PWM比例0~255调速

  analogWrite(Left_motor_go,200); //左电机前进,PWM比例0~255调速
  analogWrite(Left_motor_back,0);
  delay(time * 100);    //执行时间,可以调整  
}

void back(int time)          //后退
{
  analogWrite(Right_motor_go,0);
  analogWrite(Right_motor_back,150);//右轮后退,PWM比例0~255调速

  analogWrite(Left_motor_go,0);
  analogWrite(Left_motor_back,150);//左轮后退,PWM比例0~255调速
  delay(time * 100);     //执行时间,可以调整  
}

void loop()
{    
  int i;
  delay(2000); //延时2s后启动
  run(10);
  back(10);//全速前进急停后退
  brake(5);

  for(i=0;i<5;i++)
  {
    run(10);//小车间断性前进5步
    brake(1);
  }

  for(i=0;i<5;i++)
  {
    back(10);//小车间断性后退5步
    brake(1);
  }

  for(i=0;i<5;i++)
  {
    left(10);//大弯套小弯连续左旋转
    spin_left(5);
  }

  for(i=0;i<5;i++)
  {
    right(10);//大弯套小弯连续右旋转
    spin_right(5);
  }

  for(i=0;i<10;i++)
  {
    right(1);//间断性原地右转弯
    brake(1);
  }

  for(i=0;i<10;i++)
  {
    left(1);//间断性原地左转弯
    brake(1);
  }

  for(i=0;i<10;i++)
  {
    left(3);//走S形前进
    right(3);
  }

  for(i=0;i<10;i++)
  {
    spin_left(3);//间断性原地左打转
    brake(3);
  }

  for(i=0;i<10;i++)
  {
    spin_right(3);//间断性原地右打转
    brake(3);
  } 
}

结果

  • 本小车的左电机调到190,右电机调到200时,小车前进相对较直。注意:不同小车,需要调节的PWM值不一样
  • 小车做前后左右综合动作。
  • 小车做花式动作。

 

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论