玩转树莓派

    返回首页    发表留言
本文作者:李德强
          第五节 光耦隔离
 
 

        接下来我们来详细说明一下如何使用光耦隔离器。我们先来看一下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信号,它就会认为这是让电机用最快的速度转动,如果你的电机已经安装上了桨叶,这将是非常危险的,螺旋桨在高速转动时非常容易砍伤人,一定要小心。

        于是,我们的电调油门行程校准就完成了,上面的程序就可以直接操作电调,从而让电机按照你想要的方式转动。

    返回首页    返回顶部
#1楼  njxxcs  于 2017年07月09日22:09:20 发表
 
raspberry pi只支持一个PWM口,如何完成对四个PWM口控制信号的输出?望给予提示
#2楼  李德强  于 2017年07月10日09:51:03 发表
 
树莓派3有很多个GPIO引脚,任意引脚都可以做为pwm信号输出。用树莓派做pwm信号非常简单,比如对一个GPIO引脚输出高电平并持续1.5ms,再对其输出低电平持续0.ms即可,高低电平持续时间自己控制,高电平时长即是pwm有效的取值。

如果你要做4路pwm就选择任意4个GPIO引脚做为OUTPUT模式,然后创建4个线程来产生4路pwm即可。

请参见我写的程序中mod/motor/motor.c模块中的pwm信号输出代码,4个线程分别生产4路pwm信号:

for (int i = 0; i < 4; i++)

{

//设置电机GPIO为输出引脚

pinMode(ports[i], OUTPUT);

//启动电机信号输出线程

pthread_create(&pthddr, (const pthread_attr_t*) NULL, (void* (*)(void*)) &motor_run, (void*) (long) i);

}
#3楼  王龙  于 2017年07月11日23:49:49 发表
 
顶,楼主很赞
#4楼  李德强  于 2017年07月12日11:38:06 发表
 
感谢您对问渠网的支持!谢谢!
#5楼  去时心飞扬  于 2018年11月14日11:10:33 发表
 
也可以考虑软件PWM输出
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号