市面上有许多遥控车,都很贵,性能好点的,大概要300多400吧,不如自己做一个,在做的过程中即得到了知识又收获了快了,岂不美哉?
所需材料:
arduino x1
NanoPi M1 x1
LED若干
面包板 x1
面包板跳线若干
红外遥控器x1
红外接收x1
数据线
马达(遥控车拆开也可以)
分工,arduino负责利用红外传感器控制小车,NanoPi M1负责给面包板和arduino供电,及控制LED。上次我们已经讲了LED的程序编写,这次只需拔掉HDMI就可以了。
首先,先搭建小车,我是采用了遥控车的,拆开来用。
前轮是控制方向,有一个减速装置和转向轴。
IMG_3455.JPG (329.01 KB, 下载次数: 0)
下载附件 保存到相册
9 小时前 上传
IMG_3456.JPG (302.34 KB, 下载次数: 0)
下载附件 保存到相册
9 小时前 上传
后轮是一个简单的马达传动轴。
将马达焊上面包板跳线,不然的话,很难插入arduino。
有个问题:怎样让前驱正反转?
a23b748eec3a87c24028c444.jpg (69.74 KB, 下载次数: 0)
下载附件 保存到相册
9 小时前 上传
4ec2d5628535e5dde518160c76c6a7efce1b6228.jpg (37.21 KB, 下载次数: 0)
下载附件 保存到相册
9 小时前 上传
有很多解决方法,如上面图,最佳解决方案就是用三极管。
原来车上的控制板也是这么做的。
IMG_3435.JPG (346.36 KB, 下载次数: 0)
下载附件 保存到相册
9 小时前 上传
那么解决了这个问题剩下就比较简单了。
全部焊好了之后,就进行对车进行改造设计,将面包板放置在车上,根据个人喜爱,设计自己的车灯等。
插入LED、连接线。
我的设计:
IMG_3470.JPG (417.03 KB, 下载次数: 0)
下载附件 保存到相册
7 小时前 上传
IMG_3469.JPG (386.97 KB, 下载次数: 0)
下载附件 保存到相册
7 小时前 上传
Nanopi M1负责给arduino及面包板的LED供电。
arduino用红外接收进行编程。
遥控车的遥控器,使用的是Nanopi M1配套的红外遥控器
IMG_3465.JPG (488.31 KB, 下载次数: 0)
下载附件 保存到相册
7 小时前 上传
RC-100
那么我们如果要遥控,就得知道遥控器的波长。
那么怎么知道波长呢?
精彩的来了!
用arduino连接传感器测呀!!!
IMG_3471.JPG (316.25 KB, 下载次数: 0)
下载附件 保存到相册
7 小时前 上传
红外接收的引脚定义:
u=1985812817,53019476&fm=21&gp=0.jpg (7.37 KB, 下载次数: 0)
下载附件 保存到相册
7 小时前 上传
GND负极 5V正极,OUT接arduino的2号数字输入接口。
怎么写程序呢?
程序如下:
#define IRpin_PIN PIND
#define IRpin 2
#define MAXPULSE 65000
#define RESOLUtiON 20
uint16_t pulses[100][2];
uint8_t currentpulse=0;
int madaPin=13;
int zhwanPin=12;
void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
pinMode(madaPin,OUTPUT);
pinMode(zhwanPin,OUTPUT);
}
void loop(void) {
uint16_t highpulse,lowpulse;
highpulse = lowpulse = 0;
while(IRpin_PIN & (1 << IRpin)){
highpulse++;
delayMicroseconds(20);
if((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][0] = highpulse;
while(! (IRpin_PIN & _BV(IRpin))){
lowpulse++;
delayMicroseconds(20);
if((lowpulse >= MAXPULSE) && (currentpulse != 0)){
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;
currentpulse++;
}
void printpulses(void){
Serial.println("nrnrReceiced: nrOFFtON");
for (uint8_t i=0; i< currentpulse;i++){
Serial.print(pulses[0] * RESOLUTION,DEC);
Serial.println(" usec,");
Serial.print(pulses[1] * RESOLUTION,DEC);
Serial.println(" usec");
}
}
分析程序:首先定义红外接口,定义数组储存脉冲。最后自己写了个函数,显示调用。
储存后显示出脉冲。
记住接口连2哟。
IMG_3474.JPG (328.71 KB, 下载次数: 0)
下载附件 保存到相册
7 小时前 上传
2016-10-02.png (778.99 KB, 下载次数: 0)
下载附件 保存到相册
7 小时前 上传
2016-10-02 (1).png (636.13 KB, 下载次数: 0)
下载附件 保存到相册
7 小时前 上传
随便按了一个键后,你会看到在编程软件arduino IDE里,串口监视器(在工具一栏)会有一大串数字,那是脉冲,一会儿高一会儿低。
知道了脉冲我们怎么控制马达呢?
还记得程序中将脉冲数据储存进数组吗?
那么我们可以在调用函数里,加入马达。
#define IRpin_PIN PIND
#define IRpin 2
#define MAXPULSE 65000
#define RESOLUTION 20
uint16_t pulses[100][2];
uint8_t currentpulse=0;
int madaPin=13;
int zhwanPin=12;
void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
pinMode(madaPin,OUTPUT);
pinMode(zhwanPin,OUTPUT);
}
void loop(void) {
uint16_t highpulse,lowpulse;
highpulse = lowpulse = 0;
while(IRpin_PIN & (1 << IRpin)){
highpulse++;
delayMicroseconds(20);
if((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][0] = highpulse;
while(! (IRpin_PIN & _BV(IRpin))){
lowpulse++;
delayMicroseconds(20);
if((lowpulse >= MAXPULSE) && (currentpulse != 0)){
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;
currentpulse++;
}
void printpulses(void){
Serial.println("nrnrReceiced: nrOFFtON");
for (uint8_t i=0; i< currentpulse;i++){
Serial.print(pulses[0] * RESOLUTION,DEC);
Serial.println(" usec,");
Serial.print(pulses[1] * RESOLUTION,DEC);
Serial.println(" usec");
}
digitalWrite(madaPin,HIGH);
delay(3000);
digitalWrite(madaPin,LOW);
}
下载!
分析程序,在调用函数后加了个直走,输出马达,再关闭,开动3秒。
不过arduino接口可能电压不够,最好有个升压模块。马达动力才够。才可以驱动起来。
这个程序只写了直走的,那么转弯呢,
#define IRpin_PIN PIND
#define IRpin 2
#define MAXPULSE 65000
#define RESOLUTION 20
uint16_t pulses[100][2];
uint8_t currentpulse=0;
int madaPin=13;
int zhwanPin=12;
void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
pinMode(madaPin,OUTPUT);
pinMode(zhwanPin,OUTPUT);
}
void loop(void) {
uint16_t highpulse,lowpulse;
highpulse = lowpulse = 0;
while(IRpin_PIN & (1 << IRpin)){
highpulse++;
delayMicroseconds(20);
if((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][0] = highpulse;
while(! (IRpin_PIN & _BV(IRpin))){
lowpulse++;
delayMicroseconds(20);
if((lowpulse >= MAXPULSE) && (currentpulse != 0)){
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;
currentpulse++;
}
void printpulses(void){
Serial.println("nrnrReceiced: nrOFFtON");
for (uint8_t i=0; i< currentpulse;i++){
Serial.print(pulses[0] * RESOLUTION,DEC);
Serial.println(" usec,");
Serial.print(pulses[1] * RESOLUTION,DEC);
Serial.println(" usec");
}
uint8_t i=0;
if( [0][0] < 300 && [0][0] > 600 ) {
digitalWrite(madaPin,HIGH);
delay(3000);
digitalWrite(madaPin,LOW);
}else{
digitalWrite(zhwanPin,HIGH);
digitalWrite(madaPin,HIGH);
delay(1000);
digitalWrite(zhwanPin,LOW);
digitalWrite(madaPin,LOW);
}
}
脉冲的数据由实际情况而定,不一定准确。
程序分析,因为红外按键的脉冲每个按钮都不一样,所以我们利用它微小的差别进行分析,是要拐弯还是直走?
分析后执行。
最后欣赏下作品:
IMG_3477.JPG (359.2 KB, 下载次数: 0)
下载附件 保存到相册
6 小时前 上传
IMG_3478.JPG (319.05 KB, 下载次数: 0)
下载附件 保存到相册
6 小时前 上传
IMG_3479.JPG (447.59 KB, 下载次数: 0)
下载附件 保存到相册
6 小时前 上传
这款车有许多的不足之处,比如说电源或线太乱,希望大家指正,程序也不是很完美,大家可以自己设计程序和模型,按照自己的喜爱去做。
也有很多可以提高的,如在上面装许多传感器,得到实际信息,wifi传输手机,判断,执行等,谢谢!
下载附件 保存到相册
9 小时前 上传
|