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值不一样
- 小车做前后左右综合动作。
- 小车做花式动作。
相关资料
步进电机
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号