概述

在这一课中我们将学习如何驱动继电器,利用继电器当一个开关控制LED亮灭。

所需物料

1 * Raspberry Pi

1 * Breadboard

1 * Relay

1 * LED

1 * Resistor (200Ω)

Several jumper wires

工作原理

继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。继电器有很多种类,在这一课中我们使用的是电磁继电器。

电磁继电器的构造如图所示。主要有电磁铁(Electromagnet)、衔铁(Armature )、弹簧(Spring )、动触点(Normally close contacts )、静触点(Normally open contacts)。电磁继电器工作电路可分为输入回路和输出回路。输入回路是由电磁铁、衔铁、低压电源E1和开关S组成;输出回路是由负载(Load)、电源E2和相当于开关的静触电、动触点组成。连接好工作电路,在常态时,静触点和动触点间未导通,输出回路断开。闭合开关S,电磁铁通电会产生磁场,在磁场的作用下,这时弹簧被拉长,衔铁被电磁铁吸下来,动触点同时与两个静触点接触,使输出回路导通;断开开关S,电磁铁失去磁性,弹簧收缩,对衔铁无吸引力,衔铁在弹簧的拉力作用下回到原来的位置,动触点与静触点分开,输出回路被断开。

继电器工作原理可以用下面的动态图形象地描述

本课中所用继电器模块原理图,如下图所示。

将LED作为负载接到继电器模块的输出端,将继电器信号控制引脚接到Raspberry Pi的GPIO 0(BCM_GPIO 17)上,用继电器控制LED亮灭。向继电器信号输入端(S)输入一个高电平,继电器导通,使LED点亮;给继电器信号控制引脚(S)置一个低电平,继电器断开,LED熄灭。

实物连接图

没画(o(╯□╰)o)

软件

对于C语言用户,请看下面

1)  在/home/pi目录下新建一个.c源文件,名字随意(你开心就好)

cd  ~

sudo  nano  relay_with_led.c

2) 编码

#define  RelayPin  0

将继电器接到Raspberry Pi的GPIO0(BCM_GPIO17)上

pinMode(RelayPin, OUTPUT);   //set GPIO0 output

并将RelayPin脚设置成输出模式。

for(;;){
        // disconnect
        printf("|********************|\n");
        printf("|   ...Relay Close   |\n");
        printf("|********************|\n");
        digitalWrite(RelayPin, LOW);
        delay(1000);
        // connect
        printf("|********************|\n");
        printf("|   Relay Open...    |\n");
        printf("|********************|\n");
        digitalWrite(RelayPin, HIGH);
        delay(1000);
    }

在循环程序中先让继电器断开,经过短暂延时后,再让继电器闭合,这样继电器就不停地断开、闭合。

完整的源代码可以通过下面命令获取

sudo  wget http://osoyoo.co/driver/pi3_start_learning_kit_lesson_9/relay_with_led.c

3) 编译

sudo  -Wall  -o  relay_with_led   relay_with_led.c  -lwiringPi

4) 执行程序

sudo  ./relay_with_led  

5) 最终结果

运行编译后的程序,会听到继电器通断是啪啪啪的声音,同时LED灯会闪烁。

对于python用户

1) 在/home/pi下新建一个.py脚本文件,文件名随意(你爱咋咋地)

cd  ~

sudo  nano  relay_with_led.py

2) 编码

import RPi.GPIO as GPIO
import time

# set BCM_GPIO 17 as relay pin
RelayPin = 17

#print message at the begining ---custom function
def print_message():
    print ('|**********************************************|')
    print ('|                     Relay                    |')
    print ('|        -----------------------------------   |')
    print ('|        GPIO0 connect to relay control pin    |')
    print ('|        led connect to relay NormalOpen pin   |')
    print ('|        5V connect to relay COM pin           |')
    print ('|        Make relay to control a led           |')
    print ('|        -----------------------------------   |')
    print ('|                                              |')
    print ('|                                        OSOYOO|')
    print ('|**********************************************|\n')
    print ('Program is running...')
    print ('Please press Ctrl+C to end the program...')
    print ('\n')

#setup function for some setup---custom function
def setup():
    GPIO.setwarnings(False)
    #set the gpio modes to BCM numbering
    GPIO.setmode(GPIO.BCM)
    #set RelayPin's mode to output,and initial level to LOW(0V)
    GPIO.setup(RelayPin,GPIO.OUT,initial=GPIO.LOW)

#main function
def main():
    #print info
    print_message()
    while True:
        print ('|******************|')
        print ('|  ...Relay close  |')
        print ('|******************|\n')
        
        #disconnect
        GPIO.output(RelayPin,GPIO.LOW)
        time.sleep(1)

        print ('|*****************|')
        print ('|  Relay open...  |')
        print ('|*****************|\n')
        print ('')
        #connect
        GPIO.output(RelayPin,GPIO.HIGH)
        time.sleep(1)

#define a destroy function for clean up everything after the script finished
def destroy():
    #turn off relay
    GPIO.output(RelayPin,GPIO.LOW)
    #release resource
    GPIO.cleanup()
#
# if run this script directly ,do:
if __name__ == '__main__':
    setup()
    try:
            main()
    #when 'Ctrl+C' is pressed,child program destroy() will be executed.
    except KeyboardInterrupt:
        destroy()


将RelayPin引脚接到BCM_GPIO17口上,并将其设置成输出模式,初始电平为低电平,在main函数中不断改变RelaPin脚电平状态,使继电器不断开关,LED不停地闪烁。

完整的程序源码,可以通过以下命令获取

sudo  wget http://osoyoo.co/driver/pi3_start_learning_kit_lesson_9/relay_with_led.py

3) 运行程序

sudo  python  ./realy_with_led.py

4) 最终结果

运行Python脚本后,屏幕上会打印出继电器与Raspberry Pi连接和LED与继电器的连接信息,然后继电器不停地通断,使LED闪烁,还会听到继电器通断时候发出的声音,屏幕上也会输出继电器状态。