接下来我们来详细说明一下如何使用光耦隔离器。我们先来看一下E817光耦隔离器的接线图:
当树莓派的GPIO信号输出引脚有一个高电平时,电流经过EL817光耦隔离器,流回树莓派的GPIO Ground引脚,与此同时EL817会在这次电流经过时,隔离器左侧会产生一个光源信号,照射到隔离器的右侧,右侧捕获到这个光源信号之后,就会将右侧电调信号线的正极接入,并输出到电调的信号线,此时电调信号线就产生了一个与信号线等同电压的高电平。另外,为了防止在产生高电平时,电调信号线的正极与负极直接构成回路产生大电流,所以要在电调信号线的负极上接一个电阻。这个电阻是330R的,当然你可以根据实际情况选用合适的电阻。
有了EL817光耦隔离器我们就可以把电调接入树莓派,并通过编写程序来控制电机的转数。我们的系统环境为Linux x86-64发行版为Fedora 24,我们可以在PC机上做程序编写和调试工作,之后再移植到树莓派上。当然如果你直接在树莓派上写代码也没有任何问题。采用gcc编译器,我们使用的gcc版本为6.1.1,使用的树莓派GPIO接口函数库为WiringPi。关于Linux和gcc部分我们不做说明,只对树莓派的相关操作做一些简介,首先下载并安装WiringPi:
git clone git://git.drogon.net/wiringPi cd wiringPi ./build
WiringPi是一个可以直接对GPIO操作的C语言库,我们可以通过调用它的函数来对树莓派的GPIO做相关操作。它的GPIO编号图如下:
例如:我们可以把电调接上电机,并把电调的信号线接入EL817光耦隔离器,最后将EL817的左侧信号线接入树莓派GPIO的WiringPi 15引脚,于是我们就可以让电机转起来。
先定义一个PWM信号的数据结构:
typedef struct { //高电平时长 int time_w; //低电平时长 int time_m; } driver_pwm;
写两个函数,一个是根据我们想要让电机转动的百分比,设置PWM信号;另一个是对GPIO引脚做高低电平输出:
void driver_set_pwm(int speed, driver_pwm *pwm) { pwm->time_m = 1500 + speed; pwm->time_w = 2000 - pwm->time_m; } void driver_run_pwm(driver_pwm *pwm) { digitalWrite(15, HIGH); usleep(pwm->time_m); digitalWrite(15, LOW); usleep(pwm->time_w); }
最后来初始化GPIO并启动并让电机转起来:
int main(int argc, char *argv[]) { wiringPiSetup(); pinMode(15, OUTPUT); driver_pwm pwm; while (true) { driver_set_pwm(100, &pwm); driver_run_pwm(&pwm); } return 0; }
注意,你的电调可能先需要油门行程校准,或者叫作“电调初始化”,但这个过程不是必要的。其它的资料上通常会这么说(先看完下面的内容,再做决定用什么样的方式油门行程校准,不要马上用遥控器操作):
1、用遥控器控制电调,将遥控器的油门拉到最大;
2、给电调上电,电调会发出do re mi的音乐声音;
3、将遥控器的油门拉到最小,电调会发出“滴”、“滴”、“滴”……声音,你的锂电池是几S的,就会有几个“滴”。
关于锂电池的相关问题我们会马上谈到。但在这里,你不需要使用遥控器就可以对电调初始化。你只需要写一个初始化程序,先对电调输出3秒的2.0ms的PWM信号,相当于遥控器的最大油门,电调会发出do re mi的音乐声音;再对电调输出3秒的1.0ms的PWM信号,相当于遥控器的最小油门,电调会发出“滴”、“滴”、“滴”……声音,你的锂电池是几S的,就会有几个“滴”。注意,电调只需要初始化一次即可,如果在已经上电并初始化过的电调上再给它3秒的1.5ms的PWM信号,它就会认为这是让电机用最快的速度转动,如果你的电机已经安装上了桨叶,这将是非常危险的,螺旋桨在高速转动时非常容易砍伤人,一定要小心。
于是,我们的电调油门行程校准就完成了,上面的程序就可以直接操作电调,从而让电机按照你想要的方式转动。
Copyright © 2015-2023 问渠网 辽ICP备15013245号