终于是完成了图纸的设计了,导入到建模软件的效果也还满意,于是准备下一步的切割了。
图纸到实物
我在某宝上找了个加工KT板的厂家,将图纸发过去了。之前确实考虑过使用木板,但是轻木太软,桐木太脆,椴木太重,权衡下来还是切kt板,因为之前玩航模确实很多飞机都是用KT板做的,很结实也很轻。
等待了几天之后,切割好的kt板送到了,查看了一下,没有问题,由于切割KT板的时候切割机会烧灼KT板的边缘导致一些尺寸会对不上,幸好我在设计图纸的时候预留了一些余量,这点也提醒大家注意。
随后急忙的组装了起来,这时候门铃响了,原来是买的电机到货了。正好赶上组装,于是迅速的安装上了电机,成品如下:
下面就是安装我设计的电路板了,设计图纸时给气垫船设计了一个设备舱,正好可以容纳电路板。
电路板装进去,将电机插头插到板子上,到这里所有的结构搭建以及硬件电路都连接好了,下面就是给气垫船注入灵魂——编写代码了!
程序的编写
其实控制程序非常简单,首先说接受端,其实就是将无线模块接收到的数据转换成对应引脚输出的PWM占空比来控制电机的转速。于是一段时间过后,我编好了接受端的代码。[mw_shl_code=arduino,true]//接收端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
unsigned int value;
unsigned int CH1,CH3,left,right,qi;
void setup()
{
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"FGHIJ"); //设置自己的地址(接收端地址),使用5个字符
Mirf.payload = sizeof(value);
Mirf.channel = 90; //设置使用的信道
Mirf.config();
Serial.println("Listening..."); //开始监听接收到的数据
pinMode(10,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(3,OUTPUT);
pinMode(9,OUTPUT);
digitalWrite(5,0);
digitalWrite(6,0);
digitalWrite(9,0);
digitalWrite(3,0);
digitalWrite(10,0);
}
void loop()
{
if(Mirf.dataReady()) { //当接收到程序,便从串口输出接收到的数据
Mirf.getData((byte *) &value);
CH3=(unsigned int)value&255;
CH1=(unsigned int)value>>8;
if(CH1>140)
{
qi=CH1;
if(CH3>135) //左转弯
{
right=CH1;
if(CH1<CH3)
left=0;
else
left=CH1-CH3/3.5;
}
else if(CH3<120) //右转弯
{
if(CH1<(255-CH3))
right=0;
else
right=CH1-((255-CH3)/3.5);
left=CH1;
}
else
{
right=CH1;
left=CH1;
}
}
else
{
left=0;
right=0;
qi=0;
}
analogWrite(3,left);
analogWrite(9,right);
analogWrite(10,qi);
Serial.print("Got data: ");
Serial.print(CH1);
Serial.print(" ");
Serial.print(CH3);
Serial.print(" ");
Serial.print(left);
Serial.print(" ");
Serial.println(right);
}
}
[/mw_shl_code]
发送端也是很简单,我使用摇杆作为控制杆,用arduino的ADC引脚读取摇杆输出的电压来获得当前的摇杆位置,然后将摇杆位置的数据通过无线模块发送出去。
[mw_shl_code=arduino,true]//发射端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
unsigned int value,value1;
unsigned int data;
unsigned int CH1,CH3;
void setup()
{
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"ABCDE"); //设置自己的地址(发送端地址),使用5个字符
Mirf.payload = sizeof(value);
Mirf.channel = 90; //设置所用信道
Mirf.config();
Serial.begin(9600);
}
void loop()
{
Mirf.setTADDR((byte *)"FGHIJ"); //设置接收端地址
value = analogRead(1); //0-255的随机数
value1 = analogRead(6);
CH1=value/4;
CH3=value1/4;
data=((unsigned int)(CH1<<8)+CH3);
Serial.print(CH1);
Serial.print(" ");
Serial.print(CH3);
Serial.print(" ");
Serial.println(data);
//Serial.println(value1);
Mirf.send((byte *)&data); //发送指令,发送随机数value
while(Mirf.isSending()) delay(1); //直到发送成功,退出循环
delay(10);
}
[/mw_shl_code]
下载程序到气垫船和遥控器中:
上电!我使用的电池是550mah的3.7v锂电池,带这四个电机大概可以玩10分钟的时间。于是》》》迫不及待的上电开始玩耍!!
需要的一些改进
在玩耍中发现由于气垫船的阻力非常小(几乎不和地面接触),所以推进电机要是速度不一样就会导致气垫船偏航,但是由于驱动芯片的误差以及电机之间的误差问题,即使我使用相同占空比的PWM方波驱动他们,仍然会导致他们转速不同以致气垫船容易偏航(很难跑直线),这个问题比较影响玩耍的体验感,需要改进。
计划是使用一个电子罗盘,也就是磁力计来确定现在气垫船船头的指向,然后引入PID算法来通过电子罗盘的数据来校正控制每个推进电机的PWM波,这样应该会改善到整体的操控性。
不过这有需要一段时间的研究,主要是软件方面,现在板子上预留了IIC的通信接口,想必找到一个IIC通信的电子罗盘应该不是什么难事,问题就在PID算法以及一些滤波算法上,我还对PID算法不太了解。而且是否运转的电机或者电机内的磁铁会对电子罗盘的数据产生干扰也不是很确定。
成功的让这个气垫船跑起来达到了我的目的,对于 其的一些改进应该会放在之后,应为近期准备开始做室内玩的遥控飞机的板子,是基于51和LT8920的,所以这个改进应该会等到做完那个项目之后。如果你对这个气垫船有什么改进的建议,欢迎提出来。