视频:
视频1 视频2 视频3遥控器使用现成的航模遥控器,使用3个通道。
一个通道控制油门,
一个通道控制舵机调整浆叶方向,
一个通道用来选择前进与后退。
发挥ART多线程的优势,一个主程序控制浆叶,另一个程序监测电池电量。
====================== 主控制程序 ======================
int oil = 8; // 油门输入
int dir = 9; // 方向输入
// #1
int pwm = 7; // PWM输出引脚定义
int in1 = 6; // 电机方向使能1
int in2 = 5; // 电机方向使能2
int dir_value = 0; // 记录当前方向值, 0:停止 >0:前进 <0:后退
// 设置方向
void set_dir(int value)
{
if(value == 0)
{
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
return;
}
if(value > 0)
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
else
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
}
}
// the setup routine runs once when you press reset:
void setup()
{
// initialize the digital pin as an output.
//Serial.begin(9600);
pinMode(oil, INPUT);
pinMode(dir, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
set_dir(1);
}
// the loop routine runs over and over again forever:
void loop()
{
int oil_value;
// 读取方向输入
{
int new_dir;
if(pulseIn(dir, HIGH) > 1700)
{
new_dir = 1;
}
else
{
new_dir = 0;
}
if(new_dir != dir_value)
{
dir_value = new_dir;
set_dir(0);
delay(300);
if( dir_value == 0)
{
set_dir(1);
}
else
{
set_dir(-1);
}
}
}
// 读取油门输入,油门值是反向
oil_value = pulseIn(oil, HIGH);
//Serial.println(oil_value);
// 为了比较容易停止,只要值大于1850就算到底。
if(oil_value > 1850)
{
oil_value = 1850;
}
// PWM值范围是 0~255。换算之
oil_value = oil_value - (1850 - (255 * 3));
oil_value = (255 * 3) - oil_value;
oil_value = oil_value / 3;
// 限制一下最大值。
oil_value = oil_value / 3;
// 调整最小油门,利于电机启动。
if((oil_value > 0) && (oil_value < 20))
{
oil_value = 20;
}
// 油门输出
analogWrite(pwm, oil_value);
//Serial.println(oil_value);
delay(10);
}
====================== 电量监控程序 ======================
const int analogInPin = 0; // Analog input pin that the potentiometer is attached to
const int LED_Pin = 12; // Analog input pin that the potentiometer is attached to
int sensorValue = 0; // value read from the pot
void setup()
{
pinMode(LED_Pin, OUTPUT);
digitalWrite(LED_Pin, LOW);
}
void loop()
{
// read the analog in value:
sensorValue = analogRead(analogInPin);
//rt_kprintf("AD:%u
", sensorValue);
if(sensorValue < 2700) // 7V
{
digitalWrite(LED_Pin, HIGH);
delay(80);
digitalWrite(LED_Pin, LOW);
delay(100);
digitalWrite(LED_Pin, HIGH);
delay(80);
digitalWrite(LED_Pin, LOW);
delay(2000);
}
else
{
digitalWrite(LED_Pin, HIGH);
delay(200);
digitalWrite(LED_Pin, LOW);
delay(5000);
}
}
================================== 分割线 ========================================
湖里面水草太多,水下的螺旋浆不能用,所以弄了个水上的。

[2012-10-03]
刚去试水了,因为还没弄电量指示,不敢开太久。
下次再弄个救援舰,就可以放心开了。

[2012-10-04]
加装了个电量指示,如果电压低于6.8V就闪灯,然后开回来,电池是7.4V的锂电。

使劲塞了塞,都塞进去了。

水草无压力,直接接近1号亭子。

不过有位小朋友去玩具店买了个,就杯具了,没开出5米就回不来了。
打算赶过去帮一把。

快速冲撞。

我再撞。

终于撞开了。

被救的军舰顺利返航。

有了刚才的救援,信心大增,电压指示灯也没闪,于是放心前行。

顺利接近2号亭,野鸭估计这是飘来的,不理会。

继续慢慢接近。

野鸭近照。

再继续靠近,那只大的终于跑掉了。

于是追上去。

太慢,追不上,不过我也没想让追上,因为追上了什么也做了,要是惹得它们不高兴了,随便给我扑腾一下我就回不来了。

既然追不上,就跟去芦苇荡看看。





都玩了这么久了,得意忘形了,也没见电压指示灯闪,可突然发现浆转一下停一下。
这下慌了,没电了,想挣扎一下开回来,最终是没成功。
最后花了10元钱捞上来。

收工,1是回去把电压警告好好调一下,2是救援舰不弄好是不敢玩了。
更多细节待续。。
查看更多