最近公司事情比较多,有段时间没玩arduino了,这周末又拾起来了,打算把之前答应给儿子做的履带坦克兑现了。
在某宝上花几十大洋淘了个履带底盘,捣鼓了半天,先是用L298N控制2个DC3-6V电机时总是只有一个能转,后来用了1块9v方块电池做外接电源,终于两个都转了;然后把电机换成坦克的t130电机,又趴窝了,换成4块1.5v南孚,坦克在不坨东西的情况下能同时转,但是把数据线一拔,又趴窝了,确定是电压或电流不够的问题,试了1.5v南孚串联、9v方块电池、充电宝、手机锂电池,最后发现使用两节18650电池不但电压和电流够用,而且充满电能用好久,以后搞arduino用这种电池就行了,所以看到此文的人就不要在外接电池的问题上耽误时间了。
试验过程和连线图
写在另一篇l298n的文章里了:
效果图
下图是换了个底盘,儿子用一次性筷子和吸管做的炮管
坦克v1.0代码
#tank.ino
#include <IRremote.h>//包含红外库
int infraredPin = 3;//红外线接收器端口
long INFRARED_PLAY = 0x00FFA857;//红外遥控器上的PLAY键指令
long INFRARED_LEFT = 0x00FFE01F;//红外遥控器上的左键指令
long INFRARED_RIGHT = 0x00FF906F;//红外遥控器上的右键指令
long INFRARED_UP = 0x00FF02FD;//红外遥控器上的上键指令
long INFRARED_DOWN = 0x00FF9867;//红外遥控器上的下键指令
long INFRARED_C = 0x00FFB04F;//红外遥控器上的C指令
int ledLightPin = 4; //led常亮端口
int ledPin = 2; //led控制提醒端口
int rightMotor = 5; // 定义uno的pin 5 向 rightMotor 输出
int rightMotor_ = 6; // 定义uno的pin 6 向 rightMotor_ 输出
int leftMotor = 9; // 定义uno的pin 9 向 leftMotor 输出
int leftMotor_ = 10; // 定义uno的pin 10 向 leftMotor_ 输出
IRrecv irrecv(infraredPin);//初始化红外接收器对象
decode_results results;//定义results变量为红外结果存放位置
/* 履带坦克 */
void setup() {
//红外接收器端口初始化
pinMode(infraredPin, INPUT);
//初始化电机IO,模式为OUTPUT 输出模式
pinMode(rightMotor,OUTPUT);
pinMode(rightMotor_,OUTPUT);
pinMode(leftMotor,OUTPUT);
pinMode(leftMotor_,OUTPUT);
//led端口初始化
pinMode(ledPin, OUTPUT);
pinMode(ledLightPin, OUTPUT);
digitalWrite(ledLightPin, HIGH);
//波特率9600
Serial.begin(9600);
//启动红外解码
irrecv.enableIRIn();
}
void loop() {
//检测红外信号
if (irrecv.decode(&results)) {//是否接收到解码数据,把接收到的数据存储在变量results中
Serial.println(results.value, HEX);//接收到的数据以16进制的方式在串口输出//接收到的数据以16进制的方式在串口输出
if (results.value == INFRARED_PLAY ) {//遥控器按下了PLAY键,涡轮前进
digitalWrite(ledPin, HIGH);
//forward 向前转
digitalWrite(rightMotor,HIGH); //给高电平
digitalWrite(rightMotor_,LOW); //给低电平
digitalWrite(leftMotor,HIGH); //给高电平
digitalWrite(leftMotor_,LOW); //给低电平
} else if (results.value == INFRARED_C ) {//遥控器按下了c键,停止
digitalWrite(ledPin, HIGH);
//stop 停止
digitalWrite(rightMotor,LOW);
digitalWrite(rightMotor_,LOW);
digitalWrite(leftMotor,LOW);
digitalWrite(leftMotor_,LOW);
}else if (results.value == INFRARED_DOWN ) {//遥控器按下了-键,后退
digitalWrite(ledPin, HIGH);
//back 向后转
digitalWrite(rightMotor,LOW);
digitalWrite(rightMotor_,HIGH);
digitalWrite(leftMotor,LOW);
digitalWrite(leftMotor_,HIGH);
}else if (results.value == INFRARED_LEFT ) {//遥控器按下了左键,左转
digitalWrite(ledPin, HIGH);
//left 左转
digitalWrite(leftMotor,LOW);
digitalWrite(leftMotor_,LOW);
digitalWrite(rightMotor,HIGH);
digitalWrite(rightMotor_,LOW);
}else if (results.value == INFRARED_RIGHT ) {//遥控器按下了左键,右转
digitalWrite(ledPin, HIGH);
//right 右转
digitalWrite(rightMotor,LOW);
digitalWrite(rightMotor_,LOW);
digitalWrite(leftMotor,HIGH);
digitalWrite(leftMotor_,LOW);
}
//继续等待接收下一组信号
irrecv.resume();
//led熄灭
delay(200);
digitalWrite(ledPin, LOW);
}
}
yan 17.8.6 1:08