标签搜索

树莓派控制继电器

jjiaper
2022-06-03 / 0 评论 / 19 阅读 / 正在检测是否收录...

树莓派引脚图
此时选用的继电器为5v驱动,低电平触发的方式。
如图
继电器

由于是5v驱动,可以直接用树莓派进行供电,然后gpio来控制触发。

连接方式:

VCC端 连接树莓派物理引脚2或者4(我用的2)
GND端 连接树莓派物理引脚6、9、14、20、25、30、34、39都行(我用的20)
IN端 连接树莓派物理引脚很多,标志为gpio的都可以用(我用的22)

树莓派配置

python方式

    pip install RPi.GPIO
    pip install spidev

编写代码

    import RPi.GPIO as GPIO
    import time

    # GPIO.setmode(GPIO.BOARD)  # BOARD编号方式,基于插座引脚编号(如果是此模式,后面的引脚即为22)
    GPIO.setmode(GPIO.BCM)  # 若使用BCM编号方式,上两行代码应这样写
    
    while True:
        GPIO.setup(25, GPIO.OUT)  # 对应为22号脚(设置为输出模式)
        GPIO.output(25, GPIO.HIGH)
        time.sleep(3) # 单位秒
        # GPIO.output(11, GPIO.LOW) # 这里其实不用将其致为第电压,后面详细会说
        GPIO.setup(25, GPIO.IN)  # 对应为22号脚
        time.sleep(3)

然后运行该程序

python **(该文件名).py

此时继电器立马吸合然后三秒后断开,再过三秒,又吸合,如此循环

解释:

代码中有个小问题,就是触发继电器用的高电平,为什么恢复的时候用的引脚不是低电平,而是用的输入模式呢?
此时:
要考虑一个问题,继电器什么时候会吸合,什么时候会恢复呢?
应该是形成合适的电压差的时候会吸合,电压差不合适的时候恢复。(先不考虑电流)
那么此继电器是什么时候吸合呢。据官方文档说如下图
由此可以得出结论,当GND和IN端口形成通路,同时IN端口的电压小的时候会进行吸合,电压大的时候会恢复。
触发方式

实验阶段:(用电流表进行测试,说某个端口的电压是其和接地的电压差)

question:那么当树莓派控制gpio端口高电平和低电平的时候,此gpio的端口电压是如何变化的?
answer:经测量, 当gpio输出高电平,电压3.3v 当输出低电平的时候,电压为0v

question:默认情况下,IN的电压是如何呢?
answer:经测量,电压大约4.9v

question:当gpio输出高低电平的时候,IN端口的电压分别如何呢?
answer:经测量,gpio输出高电平的时候,IN端口3.3v,输出低电平的时候,IN端口是0v

question: 当gpio为输入模式的时候,IN端口电压如何?
answer:经测量,电压为默认值,4.9v左右

结论:

由此可以得出结论了: 低电压触发,电压得足够低的时候才能触发继电器吸合,当输出高电平的时候(3.3v)其实已经达到的继电器吸合的电压要求,再继续输出低电平, 电压达到0v,还是在工作电压内,只有将电压恢复到默认,继电器才会恢复,所以,将gpio的模式调整为输入模式。此时继电器吸合。

c语言实现

配置

    sudo apt-get install wiringpi
    mkdir WiringPI            #创建WiringPI文件夹
    cd WiringPI #
    wget https://project-downloads.drogon.net/wiringpi-latest.deb
    sudo dpkg -i wiringpi-latest.deb

代码编写

    #include <stdio.h>
    #include <wiringPi.h>

    int main(void)
    {
    int LED = 0;
    wiringPiSetup();
    pinMode(LED, OUTPUT);  // 在wiringPi编号格式中,GPIO0编号为0
    printf("relay is working...\r\n");
    while(1)
    {
                pinMode(LED, OUTPUT);delay(1000);
        printf("relay :%d is on \r\n", LED);
        pinMode(LED, INPUT);delay(1000);
        printf("relay :%d is off \r\n", LED);
    }
    return 0;
    }

运行程序

    gcc -o runfile filename.c -lwiringPi   # 编译并生成可执行文件
    ./runfile    # 运行可执行文件

结果:

此时继电器一秒闭合一秒打开,如此循环

0

评论 (0)

取消