一、简单认识遥控器
接下来我们要了解的是摇控器,你如果对摇控器有一定了解的话可能听说过“日本手”和“美国手”这两种不同的摇控器。其实它们并没有什么本质差别。假设我们的四轴已经可以成功的飞行,我们需要摇控器上的一个控制杆可以控制四个电机的整体转数,也就是人们常说的“油门”。当然,油门这个词用在四轴上可能不太贴切,它的作用就是控制电机转数,可快,可慢,而所谓的“日本手”摇控器是油门在右侧,“美国手”摇控器的油门则在左侧:

关于选择日本手还是美国手,我们还建议是根据你自己的习惯(其实没有什么区别)。另外摇控器上还有很多其它的功能控制旋钮,你可能被说明书搞的头晕脑涨,不过你完全不用担心。我们的四轴只用摇控器的3个通道,也就是“前/后”、“左/右”、“上、下”。摇控器其实是两个设备,包括一个发射器和一个接收机,接收机就是我们要接在树莓派上的。发射器就是我们手里拿的摇控器。我们不管用的是什么日本手还是美国手,先来看看它的4个通道:

也就是说,我们只用到3个通道来控制四轴,“前/后(俯仰)”、“左/右(横滚)”、“上、下(油门)”,而对于“航向”通道我们暂时不做处理。而用于这3个功能的通道我们可以自己定义,你想让哪个通道来控制油门都可以。我们将接收器连接到树莓派的GPIO接口上,用哪一个接口都可以。接收机上通常有4个通道的信号输出接口(你的接收机或许是6通道的,或者更多,但我们只使用其中的3个通道),每一个信号接口都有3根引脚,分别是5V、GROUND、SIGNAL,所有的5V都接在树莓派的5V引脚上;所有GROUND都接在GND引脚上。
注意:遥控器在第一次使用时需要进行遥控器与接收机的对码,如何给遥控器对码请参见购买时的使用说明书,这里我们不再赘述。

这里,我们用的接线引脚是15、16、1。这只是个例子,在实际接线时一定要注意引脚的编号,别弄错了。当接线完成时,你就可以写一个程序来读取接收机的3个通道数据。
首先初始化引脚15为输入引脚(这与我们之前用的电调是一个引脚号,在实际接线时要把电调和接收机信号分开接到不用的GPIO引脚上)为输入模式:
wiringPiSetup();
pinMode(15, INPUT);
二、使用循环计时方式读取遥控器信号(不推荐)
再来看一下如何通过程序来读取树莓派的引脚,从而取得摇控器接收器的通道值:
void driver_ctl_LR()
{//高电平开始struct timeval start;//高电平结束struct timeval end;int s = 0;int f = 0;//循环接收信号while (1){s = 0;f = 0;do{//读取引脚的值int lr = digitalRead(15);//如果是高电平则计时开始if (lr == 1 && s == 0){gettimeofday(&start, NULL);s = 1;}//如果已经开始计时,并且读到低电平,说明信号读取结束if (s == 1 && lr == 0){//高电平结束(低电平)gettimeofday(&end, NULL);//计算高电平持续时间long timer = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);//得到PWM信号做出相应动作engine_lr_pwm(timer);break;}//超时检测if (s == 0 && lr == 0){if (f == 0){gettimeofday(&start, NULL);f = 1;}//如果持续低电平if (f == 1){//如果低电平持续时间超过1秒,跳出gettimeofday(&end, NULL);long timer = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);if (timer > 1000000){break;}}}}while (1);}
}
这样就可以得到引脚15的PWM信号了,顺便说一下:摇控器接收机的信号通常也是PWM信号,通常是在1.0ms到2.0ms之间。
这样的程序虽然可以得到遥控器的读数,但有一个非常大的问题就是占用CPU的时间非常占用率非常高。
三、使用中断方式读取遥控器信号(推荐)
为了让我们的程序把CPU的占用率降低下来我们可以使用GPIO中断的方式来读取乳制品遥控器的读数,中断方式是计算机处理外部设备时常用的一种方式,,在使用Wringpi处理中断时我们需要初始化一个GPIO引脚为输入,并为其指定中断处理函数,也就是说当中断发生之后weiringpi程序会自动回调我们的处理函数,例如:
//设置摇控器3个通道到GPIO为输入引脚
pinMode(15, INPUT);
pinMode(16, INPUT);
pinMode(1, INPUT);//注册摇控器3个通道的引脚变化中断
wiringPiISR(15, INT_EDGE_BOTH, &controller_ctl_pwm_fb);
wiringPiISR(16, INT_EDGE_BOTH, &controller_ctl_pwm_fb);
wiringPiISR(1, INT_EDGE_BOTH, &controller_ctl_pwm_fb);void controller_ctl_pwm_fb()
{//处理功能
}
void controller_ctl_pwm_lr()
{//处理功能
}
void controller_ctl_pwm_pw()
{//处理功能
}
这样,我们就注册了3个回调函数函数当GPIO引脚的电平发生变化时WiringPi就会自己调用这3个函数,我们可以在处理函数中这样写:
void controller_ctl_pwm_fb()
{//读取电平信号s32 value = digitalRead(15);//如果是高电平if (value){//计时开始gettimeofday(&ctl_pwm->timer_start, NULL);return;}//如果是低电平,计时结束gettimeofday(&ctl_pwm->timer_end, NULL);//计算高电平时长,即pwm占空比timer = (ctl_pwm->timer_end.tv_sec - ctl_pwm->timer_start.tv_sec) * 1000000 + (ctl_pwm->timer_end.tv_usec - ctl_pwm->timer_start.tv_usec);
}
当然我们在程序中写的GPIO引脚编号只是为了便于调试而设置的15、16、1。了解了遥控器信号和读入的原理之后我们就可以任意指定其编号了。
得到了一个通道的信号,那么再取其它通道的信号也就没有什么难度了,我们可以读取摇控器上4个通道的任意3个,并把它们做为控制四轴的“前/后”、“左/右”、“上/下”。所以我们说你使用摇控器时,选择日本手还是美国手其实并不太重要,你可以把任意一个通道变为你想要的功能。

欢迎关注公众号:编程外星人

树莓派多旋翼无人机制作:遥控器读数相关推荐

  1. 人工智能六旋翼无人机制作直播间,开贴!!!!!!!!

    最近想做一个无人机,把人工智能应用到无人机上,希望可以做出完全自主飞行的无人机 这篇是开贴,以后的每一贴都会写出无人机的制作过程和进展,还有遇到的问题! 自己组装了一个F550无人机 上面这几张图片是 ...

  2. 人工智能六旋翼无人机制作直播间(第一波)

    下面是超声波高度的数据 下面这个是光流模组的数据位置 刚开始起飞的时候会有一点漂移,用遥控器微调的按钮调一调就好了,起飞后,差不多稳定了,直接进入悬停模式,上面的视频就是最后的效果了. 超声波传感器没 ...

  3. 基于MiniFly魔改的共轴双旋翼无人机

    基于MiniFly魔改的共轴双旋翼无人机 共轴双旋翼无人机结构设计 共轴双旋翼无人机的工作原理与飞行动作 共轴双旋翼无人机的系统方案 共轴双旋翼无人机的总体设计 共轴双旋翼无人机飞控设计 共轴双旋翼无 ...

  4. 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)

    前言:本文为手把手教学飞控核心知识点之一的姿态解算--MPU6050 姿态解算(飞控专栏第2篇).项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算(四元数方法),搭配设计的卡尔曼滤波器与 ...

  5. 六旋翼无人机动力学建模与仿真搭建

    本文主要研究六旋翼无人机的动力.运动学建模及可视化仿真,相对以前常用的四旋翼稳定性更高,灵动性更强. 本课题主要利用MATLAB.UG软件对六旋翼无人机进行建模及仿真操作,研究六旋翼无人机的垂直起降姿 ...

  6. 四旋翼无人机硬件,飞控,基站,NX

    四旋翼无人机硬件 一 总览 四旋翼无人机的硬件组成:无刷电机(4个):电子调速器(简称电调,4个,常见有好盈.中特威.新西达等品牌):螺旋桨(4个,需要2个正浆,2个反浆):飞控:电池(11.1v航模 ...

  7. 无人机基础知识:多旋翼无人机系统基本组成

    无人机基础知识:多旋翼无人机系统基本组成 多旋翼无人机基本组成 机械系统 动力系统 直流无刷电机 电子调速器 Li-Po电池 螺旋桨 飞行控制系统 无人机(Unmanned Aerial Vehicl ...

  8. 无人机基础知识:多旋翼无人机飞行原理及飞行模式

    无人机基础知识:多旋翼无人机飞行原理及飞行模式 力的来源 飞行原理 横滚运动 俯仰运动 偏航运动 升降运动 无人机的控制模式 纯手动模式 姿态模式 定高模式 悬停模式 其它模式 在此篇博客分析了 无人 ...

  9. 02 四旋翼无人机的组成与拼装(上)

    02 四旋翼无人机的组成与拼装(上) 目录 1 总体介绍 2 布局设计 2.1 机身布局 2.1.1 交叉形 2.1.2 环形 - 比较少 2.1.3 可折叠交叉形 2.2 旋翼安装 2.2.1 常规 ...

最新文章

  1. .net framework 注册到IIS上
  2. 定义ComboBox(下拉列表)组件垂直滚动条的样式。
  3. Web前端开发笔记——第二章 HTML语言 第十一节 语义标签
  4. scikit_learn中fit()/transform()/fit_transform()区别和联系
  5. 一统江湖的大前端(4)shell.js——穿上马甲我照样认识你
  6. Android程序员重头学Synchronized
  7. 2021年一月文章导读
  8. PCA(主成分分析)和FA(因子分析)区别
  9. LoRa协议在Arduino上的应用——原理及代码分析(二)
  10. 计算机专业及相关知识测试,计算机知识及测验考试.doc
  11. 数字化营销转型,你的企业准备好了吗?
  12. ubuntu 校准时间_ubuntu server自动校正时间 | 学步园
  13. 数独程序matlab,Matlab 求解数独的程序
  14. opencv python教程简书_OpenCV-Python教程:57.图像修复
  15. Uable to attach or mount volumes: unmounted volumes=[xxxx], unattached volumes=[xxxx]: timed out wa
  16. Java专题 基础篇--判断(三元表达式,switch等) +个税计算案例
  17. SpringBoot 优雅的读取yml(yml规范篇)
  18. 英语不好,Oracle OCP或MySQL OCP考试也能拿80分的高分
  19. 一、分布式关系型数据库 DRDS介绍
  20. 微信小程序开店怎么做?

热门文章

  1. Android Thermal Demo小记
  2. 【基于Multisim的超外差中波调幅接收机设计】
  3. 普通话测试第四题评分标准_普通话测试评分标准
  4. 探秘亚马逊AWS数据湖
  5. 8个步骤,一次完整的产品迭代
  6. C语言使用数组和循环解决约瑟夫环问题
  7. 大神教程,如何在Mysql数据库中快速插入一百万条数据详细解读!!!
  8. ssm毕设项目校外实习管理平台6tu82(java+VUE+Mybatis+Maven+Mysql+sprnig)
  9. 学习Java开发有哪些优势?
  10. 图书馆的藏书分类代码