夏斌 发表于 2012-12-27 00:24:52

初识 FlyMaple — 用代码认识她

本帖最后由 夏斌 于 2012-12-27 02:15 编辑

2012年12月21日……这个日子好像是某个大片里的世界末日哦:L

这天,终于拿到了 FlyMaple ……哦,还有四个小舵机,打算玩固定翼。四轴风太强劲了,气象条件不宜飞行,俺还是暂避风头吧。
其实还有个订单,一个空速管一块GPS接收机,过几天才能到货。数传、视频传输还早呢,不急着买。

我想: FlyMaple + GPS + 空速管 + 数传电台 + 视频传输台    构成一个无人机的基本飞控平台。舵机? 那个应该算执行机构了,算在机体里的:lol

FlyMaple板子的特性在这就不重复了,论坛里很多。选这个板子的理由只有一个:我找到主频最高的Arduino板子!补充理由:板载十轴传感器。

下面就述说下我认识这板子的过程吧:




夏斌 发表于 2012-12-27 00:52:42

本帖最后由 夏斌 于 2012-12-27 01:42 编辑

拆开包装,首先是外观,挺精致的板子哦。
对照电路图,识别下各接线端子,引脚、按钮……拿在手上观察比看照片爽多了!

到 Leaflabs 网站下载 Maple IDE,再到 论坛 下载测试代码;都解压开。Maple IDE 不错,不用安装,直接运行就可以了。

用 USB线 连接到电脑上,按提示安装驱动,先安装 dfu,再安装 serial …… 虚拟串口COM4 ,一切正常。

打开 Maple IDE 在菜单 Files-Examples 里随便找段代码,点下载按钮,编译、链接……蹦出一堆红字错误信息!!! 之后,怎么也不认虚拟串口了,换了两台机器,还是不认,俺就没办法了,只好和客服联系换板子,等第二天把板子寄回去。(客服态度不错!)

半夜,突然看到板子包装盒里的服务卡片,有这个论坛的地址,结果发现 @怪怪金小鱼 已经遇到并解决了。
“按下reset键当蓝色指示灯快速闪烁时,立即按下BUT键,在慢闪烁时放开此键,这时蓝色指示灯会一直闪烁保持在bootloader等待下载程序,这时点击IDE中的上传程序键即可开始编译和下载,不需要选择串口。如有错误和提示信息会显示在下方的状态窗口。”
这段话起了决定性作用,照着做,问题解决了。唉,白白折磨客服一晚上(可怜的孩子啊),十分抱歉哦。

既然可以下载程序并调试了,那还等什么,连夜开工,看例程,查资料……写程序,开始用代码认识FlyMaple。

夏斌 发表于 2012-12-27 01:58:23

本帖最后由 Ricky 于 2013-2-19 12:38 编辑

按照 @Ricky 所说的步骤开始:

1)先用flymaple能控制电调,控制其转速
2)读取flymaple传感器数据,然后能根据传感器变化来控制转速
3)买机架,上另外三个
4)同时控制4个电机
5)写控制算法,进行稳定性测试。
6)差不多能飞了。。。

呃……咱要做固定翼,油动,没电调:dizzy: 那就先研究驱动舵机吧;P
驱动舵机?有现成的类 Servo,貌似很简单的说……

打开 Maple IDE,新建工程 FlyMaple_Base,先保存下;再建立个Tab,取名 Servo_Base,保存下。

编辑 FlyMaple_Base 如下:#include <stdio.h>

//////////////////////////////////////
// FlyMaple V1.1 Study Code 2012.12.21
//////////////////////////////////////

void setup()
{
SerialUSB.println("Run void setup()");

// 测试舵机驱动
initServo();

delay(1000);
SerialUSB.println("Run void setup() ...OK!");
}

void loop()
{
SerialUSB.println("Run void loop()");

// 测试舵机驱动
loopTestServo();

//总延时
delay(400);
SerialUSB.println("Run void loop()End");
}

编辑 Servo_Base 如下:

#include <Servo.h>

//////////////////////////////////////
// FlyMaple V1.1 Study Code 2012.12.21
//基本舵机(6个)设置
//////////////////////////////////////

Servo ServoLeftAileron;//左副翼
Servo ServoRightAileron;//左副翼
Servo ServoElevator;   //升降舵
Servo ServoRudder;       //方向舵
Servo ServoFlap;         //襟翼
Servo ServoThrottle;   //油门

//////////////////////////////////////
int Test;
//////////////////////////////////////
void initServo()
{
//绑定舵机控制端口
ServoLeftAileron.attach(28);//左副翼
ServoRightAileron.attach(27);//右副翼
ServoElevator.attach(11);   //升降舵
//ServoRudder.attach(12);       //方向舵
//ServoFlap.attach(24);         //襟翼
//ServoThrottle.attach(14);   //油门

//舵面置中
ServoLeftAileron.write(90);//左副翼
ServoRightAileron.write(90);//右副翼
ServoElevator.write(90);   //升降舵
//ServoRudder.write(90);       //方向舵
//ServoFlap.write(90);         //襟翼
//ServoThrottle.write(90);   //油门

delay(1000);

//摆动舵面自检(目视检查)
ServoLeftAileron.write(0);//左副翼
ServoRightAileron.write(0);//右副翼
ServoElevator.write(0);   //升降舵
//ServoRudder.write(0);       //方向舵
//ServoFlap.write(0);         //襟翼
//ServoThrottle.write(0);   //油门
delay(200);
ServoLeftAileron.write(90);//左副翼
ServoRightAileron.write(90);//右副翼
ServoElevator.write(90);   //升降舵
//ServoRudder.write(90);       //方向舵
//ServoFlap.write(90);         //襟翼
//ServoThrottle.write(90);   //油门

Test = 1;
}

void X_Rotate(float dataVal)//横滚
{
if( dataVal > 100 ) dataVal = 100;
if( dataVal < -100 ) dataVal = -100;
float AngleDataA;

AngleDataA= 90 * dataVal / 100 + 90;

//SerialUSB.println(AngleDataA);

ServoLeftAileron.write( AngleDataA );   //左副翼
ServoRightAileron.write( AngleDataA );//右副翼
}

void Y_Rotate(float dataVal)//俯仰
{
if( dataVal > 100 ) dataVal = 100;
if( dataVal < -100 ) dataVal = -100;
float AngleDataA;

AngleDataA= 90 * dataVal / 100 + 90;

//SerialUSB.println(AngleDataA);

ServoElevator.write( AngleDataA );      //左副翼
}
//////////////////////////////////////
void Z_Rotate(int data)//方向舵
{
}
//////////////////////////////////////

void loopTestServo() // 测试用循环
{
SerialUSB.print("Run loopTestServo()   Test=");
   SerialUSB.print( Test );
if( Test==1 )
{
    SerialUSB.println("X_Rotate(-100)");
    X_Rotate(-100);
    Test = 0;
}
else
{
    SerialUSB.println("X_Rotate(+100)");
    X_Rotate(100);
    Test = 1;
}
}
都保存一下,点击下载按钮……开始编译链接

在蓝灯闪烁停止之后:
三个舵机(俺只插上前三个)先是吱的一声摆到中间位置;稍后又吱吱两声,摆了一下,回到中间位置。再过一会,1、2 两个舵机 开始来回摆动……汪汪! 糟了,俺家露露被吵醒了:Q

夏斌 发表于 2012-12-27 02:29:37

本帖最后由 夏斌 于 2013-1-2 23:36 编辑

今天先发这些吧,待续……

下边要把这几天写的代码都逐一的发出来,希望能对刚接触 FlyMaple 的新人有所帮助。(老鸟们就等着我去请教吧)
2:板载Led(蓝灯) 编程测试 (已发)
3:板载按钮 Boot0 编程测试(已发)
4:SerialUSB 读写编程 (已发)
5:气压高度计 BMP085基本测试
6:磁感应传感器 HMC5883基本测试
7:加速度传感器 ADXL345基本测试
8:陀螺仪传感器 ITG3205基本测试
9:硬件定时器中断编程
10:引脚中断编程

个人觉得这些是FlyMaple板子上必须熟悉的资源,也是将来编写飞控程序所必须掌握的东西。

FlyMaple很容易上手,基本编程也不难……难的是 @Ricky 所说的步骤 5)写控制算法,进行稳定性测试。
这个已经不是编程问题了,俺数学基础好像不够,控制理论也不扎实。

mickey 发表于 2012-12-30 11:27:04

技术帖,一定要置顶

Eric 发表于 2013-2-19 10:14:07

继续顶,呵呵:D
页: [1]
查看完整版本: 初识 FlyMaple — 用代码认识她