[Maker]不握遥控器?Arduino+电调控制四轴飞行器电机

今天我们来论如何上天。

也许我们想飞得更高,看得更远

或是打造一款澎湃动力的电动漂移板:

那我们总离不开用单片机控制电机。

那么,arduino控制电机跟arduino通过电调控制电机区别在哪儿呢?

前者,控制小电机是比较容易的。然而对于四轴和电动滑板,电压太高烧主板!
由于电池电压过高(四轴无人机电压14.1V,电动漂移板28.8V),若是直接连接单片机,会烧坏。
这个时候便需要连接电调(speed controler)作为中转桥梁。

问题就是,电机连上电调后,就不受单片机直接控制了。电调就像是一位机场的安检员,只有“说服”安检员,让安检员传话给电机,电机才会动。

那怎么样用Arduino “说服” 电调呢?

Arduino控制高电压的四轴电机需要电调,然而坑爹的是电调默认校准方式是实体遥控器校准,电调说明书上并没写关于单片机与软件控制的方法,且目前网上搜集到的这方面教程比较散乱。

因此这篇文章的目的就是,一条龙解决Arduino连接电调控制电机。也就是让这小家伙通过Arduino而不是实体遥控器转起来,这样可以为自己用手机app遥控(一个实体遥控器几百呢)、电脑控制和以后其自主编程控制提供方便。


claim:standing on the shoulders of the giants

接下来以四轴无人机电机为例,电动滑板轮毅电机同理

要点:
1.电路连接方式
2.PWM控制
3.电调初始化
4.转速的有效信号区间查找
5.Wifi遥控时Arduino中 Serial.read() 的char转换为 速度的 int
5.过渡与渐变

材料
四轴20A电调 1
四轴2212电机 1
4S电池或直流电源 1
连接 若干

若电机有报障声音,请参考电调故障申明

值得注意的是,声音是从电机上发出来的,并不是电调。

其次,电机的声音能给我们提供非常多的反馈信息。

准备就绪后,电机没有声音又没有转动,说明电路未连接正确或电压不够(要大于7V)。

1.连接方式

电路连接方式

总的来说,就是:电源连电调,电调的电源线连电机+电调的信号线连arduino(接有“~”标记的7)

一张图搞定(只不过这里的接收机为Arduino):

电调与arduino连接时,因为电调有自动低压保护措施,记得要保证电源电压大于7V,才能正常激活电调!否则什么反应都没有。

有电池的同学用电池,当然电池什么的相比,还是可直接调压的直流电源更方便。

7V以上电压才能激活

2.电调初始化

这电调可高级了,内置独立的程序和连接马达的报错程序。

最关键的是,电调首次使用,没调制好油门行程,也是不能驱动电机的。想要首次激活电调,就要在Arduino上说一样的“暗号”,也就是模仿实体遥控器的程序走一遍。

说明书上关于实体遥控器校准的方法是这样的:

于是,我们需要模拟设置油门行程。

模拟设置油门行程代码如下,直接刷入Arduino等待几秒,若电调发出滴滴声音后开始转动,表示已激活(正常使用时只需要激活一遍,当然重复激活也不影响):

int sp1=9;//定义舵机接口数字接口7
int pulsewidth;//定义脉宽变量
int val;
int val1;
int myangle1;
//下面是servopulse函数部分(此函数意思:也就是說每次都是0.5ms高電平 1.98ms低電平 然後再0.52ms低電平 17ms延時也是低電平)
void servopulse(int sp1,int val1)//定义一个脉冲函数
{
  myangle1=map(val1,0,180,500,2480);
  digitalWrite(sp1,HIGH);//将舵机接口电平至高
  delayMicroseconds(myangle1);//延时脉宽值的微秒数
  digitalWrite(sp1,LOW);//将舵机接口电平至低
  delay(20-val1/1000);
}
//servopulse函数部分到此结束
void setup()
{
  pinMode(sp1,OUTPUT);//设定舵机接口为输出接口
  //设置两组串口波特率
  Serial.begin(9600);
  
  Serial.println("servu=o_seral_simple ready" ) ;
  
  //看电调说明书,设置油门行程时,一开始需要把遥控器打到最高点。i<=110大概是2杪多
  for(int i=0;i<=110;i++)
    {
      servopulse(sp1,150);//引用脉冲函数
    }
    
//等电机发出B-B两声后(就是两秒后,大概就是这里了)把油门打到最低点
    for(int i=0;i<=55;i++)
    {
      servopulse(sp1,20);//引用脉冲函数
    }
    
//后面提示后,就可以控制电机转动了
    for(int i=0;i<=150;i++)
    {
      servopulse(sp1,150);//引用脉冲函数
    }
    
    Serial.println("hello world" ) ;
  
}

void loop()
{
    Serial.print(val1,DEC);
    Serial.println();
    for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
    {
      servopulse(sp1,val1);//set the speed
    }
  }

   }

设置好了之后,电机终于转起来了!若是正常使用,以后就不需要再次校准了。

但是,我们若在初始速度信号不等于0时启动了电机,电调就会报错,我们需要重新刷入这个程序进行一遍校准。

3.寻找速度的有效信号区间

校准后,我们就想控制速度了。下面刷入正式的代码,以调速:

int sp1=9;//定义舵机接口数字接口7
int pulsewidth;//定义脉宽变量
int val;
int val1;
int speed1=0;
int myangle1;



//下面是servopulse函数部分(此函数意思:也就是說每次都是0.5ms高電平 1.98ms低電平 然後再0.52ms低電平 17ms延時也是低電平)
void servopulse(int sp1,int val1)//定义一个脉冲函数
{
  myangle1=map(val1,0,180,500,2480);
  digitalWrite(sp1,HIGH);//将舵机接口电平至高
  delayMicroseconds(myangle1);//延时脉宽值的微秒数
  digitalWrite(sp1,LOW);//将舵机接口电平至低
  delay(20-val1/1000);
}
//servopulse函数部分到此结束
void setup()
{
  pinMode(sp1,OUTPUT);//设定舵机接口为输出接口
  //设置两组串口波特率
  Serial.begin(9600);
  
  Serial.println("servu=o_seral_simple ready" ) ;
    
    Serial.println("hello world" ) ;

}

void loop()
{
      String inchars="";
  while(Serial.available()>0)
  {
    char inchar=Serial.read();
    if(isDigit(inchar))
    {
      inchars+=inchar;
    }
      speed1=inchars.toInt();
  }


Serial.println(speed1);


    
    for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
    {
      servopulse(sp1,speed1);//引用脉冲函数
    }
  

}

我们知道,arduino的PMW功能其实是通过构造不同电压和时间,利用W=P*T来调控功率(速度)的。

我们首先来看一下这个脉冲函数的构造:

电调PMW信号构造

Arduino可以发出的PMW的范围是非常宽的,高达over 2000Hz,而我手上这款电调最高只能识别600,因此会被电调识别为无信号输入,产生报警。我们需要不断设置电调速度值,探索出有效信号区域。

于是,构造电调可以识别的PMW信号,代码如下:

int sp1=9;//定义舵机接口数字接口7
int pulsewidth;//定义脉宽变量
int val;
int val1;
int speed1=0;
int myangle1;

void servopulse(int sp1,int val1)//定义一个脉冲函数
{
  myangle1=map(val1,0,180,500,2480);
  digitalWrite(sp1,HIGH);//将舵机接口电平至高
  delayMicroseconds(myangle1);//延时脉宽值的微秒数
  digitalWrite(sp1,LOW);//将舵机接口电平至低
  delay(20-val1/1000);
}

构造好后,开始试探出识别的有效区间。简单来说,用二分法,在电压7V以上的条件下,找出min和max。

一般来说,min<50,max<200。我的电调很快通过二分法试出有效信号范围是[27,163];

这个时候,我们通过改变speed1的值,加上这条命令

      servopulse(sp1,speed1);//set the speed

就已经可以改变电机速度了。

直流电源上电压缓缓调高

Hhh,小心螺旋桨割到手,打开Arduino的Serial.命令台,输入一个有效区间内的速度,比如31,电源电压调起,感受风声吧~

4.Wifi遥控中读取到的String型速度转换为int型

可以改变速度后,我们想着怎样遥控接收更改的速度值。不论是蓝牙还是wifi遥控,都离不开Arduino中Serial.available 和Serial.read() 帮助我们获取和读取我们输入的速度值。问题就是,我们接收到的是String,是不能够speed=(int)String的

这个时候,我么需要把String转化为int。可是怎么转化呢,由于获取信号这个本身就涉及到函数调用,在调用过程中试图改变类型是非常难的,于是我们从result想办法。找了很久终于找到了:

将接收到的速度信号转化为int值 代码有:

void loop()
{
      String inchars="";
  while(Serial.available()>0)
  {
    char inchar=Serial.read();
    if(isDigit(inchar))
    {
      inchars+=inchar;
    }
      speed1=inchars.tolnt();
  }

记得清空 String要在每一个loop之前,而赋值要等到有新值输入后。

转化为int后,就可以设置电调速度了

speed1=inchars.tolnt();
servopulse(sp1,speed1);//set the speed

这个时候,我们已经具备了电脑、手机遥控电机速度的能力,甚至乎可以自己写app或用已有的app进行控制,如TCP连接;

6.平滑速度变化(可选)

我们改变电机速度的值,比如从10%到90%的时候,若是太快,电机会来不及变化,产生暴增或暴减,后果就是 无人机忽上忽下,或是电动滑板加速太快人仰马翻;若是太慢,会出现控制迟缓。因此,我们需要平滑速度变化。

延时函数
线性速度增长函数。

曲线函数
想要速度变得更加平滑的,比如先慢后快,可以用数学建模 弄一个过渡函数,比如(ax^2+bx+cx) or (a^x),然后再把值赋给speed1.

好,至此为止,我们已经能够用Arduino连接电调控制无刷电机,甚至通过wifi进行遥控
这意味着我们具备了arduino驱动电机的基础,加上自己编写或应用手机软件,将在四轴无人机飞行和电动滑板上大显神通。

最后,愿大家都能做出像航模协会大神那样DIY的成品:

Good luck!_

欢迎关注/交流讨论~


参考资料:

1.Arduino控制好盈电调

2.Arduino 编程入门到实战(PWM部分)

3.Arduino串口数据分割字符串和数字

4.单片机控制无刷电机转速——Arduino篇(详细代码)

5.Make: Drones: Teach an Arduino to Fly

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,444评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,867评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,157评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,312评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,673评论 3 289
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,802评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,470评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,696评论 2 250
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,187评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,538评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,188评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,127评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,889评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,741评论 2 274

推荐阅读更多精彩内容

  • 历时三周左右的时间,完成了一架四旋翼无人机F450的组装,今天成功试飞定高、定点、自动返航、自动降落等飞行...
    85后程序员阅读 23,625评论 11 48
  • 1 电荷的性质 电荷之间存在着相互作用力,同性电荷相互排斥,异性电荷相互吸引。 2 电场。。 在带电体周围的空间存...
    电圈子阅读 2,491评论 0 8
  • 太有特色的一本书了,荒诞怪异又丝丝入扣,正常人写不出这种作品出来,应了那句话:“鬼知道他经历了什么!”,不过...
    还不至于阅读 188评论 0 0
  • 终于不用开空调了,阴着天,秋风阵阵萧瑟,天空飘着零星小雨,这是睡懒觉的绝好天气。可是不管如何,还是准点醒了,老年人...
    mimi播报阅读 495评论 1 3
  • 最近这段时间在使用influxdb,抽空翻译了一下配置文件。有不足的地方请指正。因为简书默认markdown编辑器...
    wangrui927阅读 4,190评论 0 4