Raspberry Pi:Примеры/Управление массивом светодиодов(чарлиплексинг)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Управление массивом светодиодов(чарлиплексинг)

Данный пример демонстрирует как подключить как можно больше светодиодов к как можно меньшему количеству выводов GPIO Raspberry Pi.

Данный способ получил название чарлиплексинг(Charlieplexing), от имени изобретателя, Чарли Аллена из компании Maxim Integrated. Он первым догадался использовать возможность программно изменять состояния выводов GPIO с выхода на вход для получения трехзначной логики. В его схеме перевод вывода с выхода на вход не только прекращает подачу питания на часть светодиодов, но и приводит к инвертированию состояния выводов на некоторых других светодиодах.

При выполнении, программа запрашивает порядковый номер светодиода, который будет активирован.

Чтобы понять как это работает, разберем пример как зажечь светодиод LED1. Он будет гореть только когда на его анод подается сигнал высокого уровня(3.3В), на катод сигнал низкого уровня(0В). При всех других условиях светодиод будет выключен. Для зажигания светодиода LED1 необходимо подключить анод светодиода через резистор к контакту GPIO BCM18(номер контакта на гребенке 12), подать на него сигнал высокого уровня, катод светодиода через резистор подключить к контакту GPIO BCM23(номер контакта на гребенке 16), подать на него сигнал низкого уровня. Вывод GPIO BCM24(номер контакта на гребенке 18) перевести в состояние вход, иначе LED3, LED4 будут загораться в зависимости от уровня сигнала на этом выводе.

pin_led_states - список, в котором хранятся все возможные состояния каждого из выводов всех светодиодов(0 - низкий уровень, 1 - высокий уровень, -1 - вывод в состоянии входа).

Количество светодиодов которыми можно управлять с помощью выводов GPIO, определяется по формуле:

LEDs = n^2 - n

LEDs - количество светодиодов, n - количество задействованных выводов GPIO.

Необходимое оборудование

Схема

Будьте осторожны при обращении с портами GPIO вашего Raspberry Pi. Помните входы и выходы GPIO расссчитаны на напряжение +3,3В




Все манипуляции по подключению производите только при отключенном питании платы Raspberry Pi


Код

Python 2.X

import RPi.GPIO as GPIO

pins = [18, 23, 24]

pin_led_states = [
  [1, 0, -1], # LED1
  [0, 1, -1], # LED2
  [-1, 1, 0], # LED3
  [-1, 0, 1], # LED4
  [1, -1, 0], # LED5
  [0, -1, 1]  # LED6
]

GPIO.setmode(GPIO.BCM)

def set_pin(pin_index, pin_state):
    if pin_state == -1:
        GPIO.setup(pins[pin_index], GPIO.IN)
    else:
        GPIO.setup(pins[pin_index], GPIO.OUT)
        GPIO.output(pins[pin_index], pin_state)

def light_led(led_number):
    for pin_index, pin_state in enumerate(pin_led_states[led_number]):
        set_pin(pin_index, pin_state)

set_pin(0, -1)
set_pin(1, -1)
set_pin(2, -1)
		
while True:
    x = int(raw_input("Pin (0 to 5):"))
    light_led(x)

Python 3.X

import RPi.GPIO as GPIO

pins = [18, 23, 24]

pin_led_states = [
  [1, 0, -1], # LED1
  [0, 1, -1], # LED2
  [-1, 1, 0], # LED3
  [-1, 0, 1], # LED4
  [1, -1, 0], # LED5
  [0, -1, 1]  # LED6
]

GPIO.setmode(GPIO.BCM)

def set_pin(pin_index, pin_state):
    if pin_state == -1:
        GPIO.setup(pins[pin_index], GPIO.IN)
    else:
        GPIO.setup(pins[pin_index], GPIO.OUT)
        GPIO.output(pins[pin_index], pin_state)

def light_led(led_number):
    for pin_index, pin_state in enumerate(pin_led_states[led_number]):
        set_pin(pin_index, pin_state)

set_pin(0, -1)
set_pin(1, -1)
set_pin(2, -1)
		
while True:
    x = int(input("Pin (0 to 5):"))
    light_led(x)

См.также

Внешние ссылки