树莓派【二、RGB_LED灯实验】

1、接线图

本实验中均采用物理引脚,即BOARD编码,RGB灯如下图从左到右分别为R、G、B和GND引脚,树莓派GPIO口选择34、36、38、40,由接线图可以得到:
34pin -> RGB灯[GND]
36pin -> RGB灯[R]
38pin -> RGB灯[G]
40pin -> RGB灯[B]

在这里插入图片描述
在这里插入图片描述
实物图(多余的线不用关注,只关注和接线原理图对应的线即可):
在这里插入图片描述

二、实验代码

# -*- coding: utf-8 -*-
# __projectName__           : Pi
# __fileUnit__              : hello.py
# __owner__                 : bingo
# __data__                  : 2021/7/2
# __time__                  : 19:26
# ++++++++++++++ Please start your code from here +++++++++++++++++
import RPi.GPIO as gpio
import time
import random


class RGBLED(object):
    """
     +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
     | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
     +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
     |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
     |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
     |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
     |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
     |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
     |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
     |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
     |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
     |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
     |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
     |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
     |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
     |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
     |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
     |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
     |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
     |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
     |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
     |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 1 | IN   | GPIO.28 | 28  | 20  |
     |     |     |      0v |      |   | 39 || 40 | 1 | IN   | GPIO.29 | 29  | 21  |
     +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
     | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
     +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
    """
    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = super().__new__(cls)
        return cls.__instance

    def __init__(self, *args, **kwargs):
        self.pin_R = kwargs.get("pin_R") if kwargs.get("pin_R", None) else 37   # R引脚IO
        self.pin_G = kwargs.get("pin_G") if kwargs.get("pin_G", None) else 38   # G引脚IO
        self.pin_B = kwargs.get("pin_B") if kwargs.get("pin_B", None) else 40   # B引脚IO
        print(f"pins: R->{self.pin_R}, G->{self.pin_G}, B->{self.pin_B}")
        self.gpio = gpio
        self.gpio.setwarnings(False)
        self.gpio.setmode(self.gpio.BOARD)
        self.gpio.setup([self.pin_R, self.pin_G, self.pin_B], gpio.OUT)
        self.pin_R_inst = self.gpio.PWM(self.pin_R, 1)                          # R引脚脉冲信号实例
        self.pin_G_inst = self.gpio.PWM(self.pin_G, 1)                          # G引脚脉冲信号实例
        self.pin_B_inst = self.gpio.PWM(self.pin_B, 1)                          # B引脚脉冲信号实例
        self.pin_R_inst.start(100)
        self.pin_G_inst.start(100)
        self.pin_B_inst.start(100)

    def test(self):
        for _ in range(100):
            for pin in [self.pin_R, self.pin_G, self.pin_B]:
                self.gpio.output(pin, self.gpio.HIGH)
                time.sleep(0.1)
                self.gpio.output(pin, self.gpio.LOW)

    def set_up(self):
        """
        gpio.PWM(pin, 10) 设置脉冲信号, pin为针脚,10为频率
        start(dc)方法中,dc为占空比,即一个周期内高电压占整个周期的比例
        stop()方法停止脉冲信号
        :return:
        """
        try:
            while True:
                freq_R = random.randrange(1, 20)
                freq_G = random.randrange(1, 20)
                freq_B = random.randrange(1, 20)
                dc_R = random.randrange(1, 101)
                dc_G = random.randrange(1, 101)
                dc_B = random.randrange(1, 101)
                self.pin_R_inst.ChangeFrequency(freq_R)
                self.pin_G_inst.ChangeFrequency(freq_G)
                self.pin_B_inst.ChangeFrequency(freq_B)
                self.pin_R_inst.ChangeDutyCycle(dc_R)
                self.pin_G_inst.ChangeDutyCycle(dc_G)
                self.pin_B_inst.ChangeDutyCycle(dc_B)
                print(f"R[频率:{freq_R}, 占空比:{dc_R}]、G[频率:{freq_G}, 占空比:{dc_G}]、B[频率:{freq_B}, 占空比:{dc_B}]")
                time.sleep(5)
        except KeyboardInterrupt:
            self.pin_R_inst.stop()
            self.pin_G_inst.stop()
            self.pin_B_inst.stop()

    def __del__(self):
        self.gpio.cleanup()


pins = {
    "pin_R": 40,
    "pin_G": 38,
    "pin_B": 36
}
a = RGBLED(**pins)
a.set_up()

树莓派运行代码,可以看到RGB灯闪烁(无法上传视频)
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八戒无戒i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值