Для безопасности маневров на велосипеде мастер-самодельщик сделал светодиодный указатель поворотов. Включение и выключение поворотов осуществляется с помощью сенсорных кнопок, закрепленных на руле велосипеда. В ночное время указатель дополнительно выполняет функцию заднего габаритного огня.
Инструменты и материалы:
-Резистор 330 Ом и 120 Ом;
-Raspberry Pi 3;
-Макетная плата;
-Соединительные провода;
-Емкостный сенсорный датчик TTP223 — 2 шт;
-Светодиоды RGB — 13 шт;
-Светодиоды — 2 шт;
-Паяльные принадлежности;
-Powerbank;
-Электролитический конденсатор 1 мФ;
-Резистор LDR;
-Кабельные стяжки;
-Кабель-канал;
-Акриловая краска;
-Кисть;
-Две пластиковых коробки для корпуса;
Шаг первый: сборка макета, проверка комплектующих
Перед сборкой устройства мастер проверяет работу комплектующих. В проекте используются RGB-светодиоды. Такие светодиоды бывают с общим анодом или общим катодом. Для проекта нужно подбирать светодиоды одного типа. Мастер использует светодиоды с общим катодом. В случае использования других светодиодов, для их работы нужно будет вносить изменения в код.
Для тестирования комплектующих мастер производит монтаж, как на фото.
Красный: контакт 11 (резистор 330 Ом)
Зеленый: контакт 13 (резистор 120 Ом)
Синий: контакт 15 (резистор 120 Ом)
Загружает на Рассбери код:
import RPi.GPIO as GPIO
#The pin numbers correspond to exact number on the RPi GPIO
Red_pin = 11
Green_pin = 13
Blue_pin = 15
#Connect Common cathode pin to Pin 6
def turnOn(pin):
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.HIGH) #GPIO.output(pin, GPIO.LOW) for common anode type
def turnOff(pin):
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW) #GPIO.output(pin, GPIO.HIGH)
def redOn():
turnOn(Red_pin)
def redOff():
turnOff(Red_pin)
def greenOn():
turnOn(Green_pin)
def greenOff():
turnOff(Green_pin)
def blueOn():
turnOn(Blue_pin)
def blueOff():
turnOff(Blue_pin)
try:
while True:
cmd = input("Type your command: ")
if cmd == "red on": #type input commands as mentioned exactly inside ""
redOn()
elif cmd == "red off":
redOff()
elif cmd == "green on":
greenOn()
elif cmd == "green off":
greenOff()
elif cmd == "blue on":
blueOn()
elif cmd == "blue off":
blueOff()
else:
print("Not a valid command")
except KeyboardInterrupt:
GPIO.cleanup()
Для проверки сенсорных модулей подключает их (как подключать можно посмотреть здесь.)
Загружает следующий код.
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(IO.BOARD)
touchpad1 = 11 #pin 11
touchpad2 = 13 #pin 13
GPIO.setup(touchpad1, GPIO.IN)
GPIO.setup(touchpad2, GPIO.IN)
# We can club both the above statements together as
# GPIO.setup([touchpad1, touchpad2], GPIO.IN)
try:
while True:
if(GPIO.input(touchpad1) == True):
print ("Touchpad 1 touched")
sleep(2)
elif (GPIO.input(touchpad2) == True):
print ("Touchpad 2 touched")
sleep(2)
else:
print("Not Touched")
except KeyboardInterrupt:
GPIO.cleanup() #CTRL-C to exit
После тестирования деталей можно приступить к сборке устройства.
Шаг второй: светодиодная панель
Дальше мастер монтирует светодиоды на плате. Всего на плате размещается 13 светодиодов. 5 левая сторона, 5 правая сторона, 3 центральная линия.
У все светодиодов мастер соединяет катоды. Затем соединяет все ножки по цветам на левой стороне и на правой стороне.
У трех центральных светодиодов соединяются красные ножки вместе, а зеленые только у верхнего и нижнего + катоды.
Шаг третий: тестирование панели
Дальше нужно проверить работу панели. Мастер подключает провода:
Красный справа — контакт 7
Зеленый справа — контакт 11
Общий катод справа — контакт 6 (GND)
Красный слева — Контакт 13
Зеленый слева — Контакт 15
Общий катод слева — контакт 9 (GND)
Центр Красный — Контакт 16
Зеленый центр (сверху и снизу) — контакт 18
Центральный общий катод — контакт 14 (GND)
Устанавливает код.
import RPi.GPIO as GPIO
from time import sleep
#Connect according to below pin numbers
Red_right = 7
Green_right = 11
Red_left = 13
Green_left = 15
Red_center = 16
Green_top_bottom = 18
GPIO.setmode(GPIO.BOARD)
def right_turn():
print ("Turning Right")
blink(Green_right, Green_top_bottom, 0)
def left_turn():
print ("Turning Left")
blink(Green_left, Green_top_bottom, 0)
def blink(pin1, pin2, pin3):
if(pin3 == 0):
GPIO.setup([pin1, pin2], GPIO.OUT)
for x in range(10):
GPIO.output([pin1, pin2], GPIO.HIGH)
sleep(0.5)
GPIO.output([pin1, pin2], GPIO.LOW)
sleep(0.5)
else:
GPIO.setup([pin1,pin2, pin3], GPIO.OUT)
for x in range(10):
GPIO.output([pin1, pin2, pin3], GPIO.HIGH)
sleep(0.5)
GPIO.output([pin1, pin2, pin3], GPIO.LOW)
sleep(0.5)
def night_sight():
print("Night Sight ON")
blink(Red_left, Red_right, Red_center)
try:
while True:
cmd = input("Test LED for: ")
if cmd == "right turn":
right_turn()
elif cmd == "left turn":
left_turn()
elif cmd == "night sight":
night_sight()
else:
print("Invalid Command")
except KeyboardInterrupt:
GPIO.cleanup()
Проверяет работу.
Шаг четвертый: сенсорные кнопки
Подключает сенсорные модули.
Правая панель:
Сенсорный модуль
Контакт GND — контакт 34
Контакт VCC — Контакт 1
Контакт SIG — контакт 29
Светодиод
Анод (+) вывод — Контакт 33
Левая панель:
Сенсорная панель
Контакт GND — контакт 30
Контакт VCC — Контакт 17
Контакт SIG — контакт 31
Светодиод
Анод (+) вывод — Контакт 35
Загружает код.
import RPi.GPIO as GPIO
from time import sleep
Red_right = 7
Green_right = 11
Red_left = 13
Green_left = 15
Red_center = 16
Green_top_bottom = 18
right_touch = 29
left_touch = 31
right_led = 33
left_led = 35
triggered = 0
GPIO.setmode(GPIO.BOARD)
GPIO.setup([right_led, left_led], GPIO.OUT)
GPIO.setup(right_touch, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(left_touch, GPIO.IN, pull_up_down = GPIO.PUD_UP)
def right_turn(channel):
GPIO.output(right_led, GPIO.HIGH)
global triggered
triggered = 1
print ("Turning Right")
blink(Green_right, Green_top_bottom)
def left_turn(channel):
GPIO.output(left_led, GPIO.HIGH)
global triggered
triggered = 1
print ("Turning Left")
blink(Green_left, Green_top_bottom)
GPIO.add_event_detect(right_touch, GPIO.FALLING, callback = right_turn, bouncetime = 500)
GPIO.add_event_detect(left_touch, GPIO.FALLING, callback = left_turn, bouncetime = 500)
def blink(pin1, pin2):
GPIO.setup([pin1, pin2], GPIO.OUT)
for x in range(10):
GPIO.output([pin1, pin2], GPIO.HIGH)
sleep(0.5)
GPIO.output([pin1, pin2], GPIO.LOW)
sleep(0.5)
GPIO.output([right_led, left_led], GPIO.LOW)
global triggered
triggered = 0
def night_sight():
while (True):
GPIO.setup([Red_center, Red_left, Red_right],GPIO.OUT)
global triggered
if (triggered == 0):
print ("Night Sight ON")
GPIO.output([Red_center, Red_left, Red_right], GPIO.HIGH)
sleep(0.27)
GPIO.output([Red_center, Red_left, Red_right], GPIO.LOW)
sleep(0.27)
else:
print ("Night Sight OFF")
GPIO.output([Red_center, Red_left, Red_right], GPIO.LOW)
try:
night_sight()
except KeyboardInterrupt:
GPIO.cleanup()
Проверяет работу. В коде заложена следующая функция: габаритный огонь горит в ночное время постоянно. При касании сенсорной кнопки (включения указателя поворотов) габаритный огонь тухнет и начинает работать указатель поворота.
Сенсорные кнопки закрепляются на руле в месте доступном и удобном для касания пальцем.
Шаг пятый: фоторезистор
Для экономии батареи мастер устанавливает в цепь фоторезистор. В этом случае габаритный свет будет светить только в темное время суток.
Производит подключение согласно схемы.
Загружает код.
import RPi.GPIO as GPIO
from time import sleep
Red_right = 7
Green_right = 11
Red_left = 13
Green_left = 15
Red_center = 16
Green_top_bottom = 18
right_touch = 29
left_touch = 31
right_led = 33
left_led = 35
ldr = 36
triggered = 0
GPIO.setmode(GPIO.BOARD)
GPIO.setup([right_led, left_led], GPIO.OUT)
GPIO.setup(right_touch, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(left_touch, GPIO.IN, pull_up_down = GPIO.PUD_UP)
def right_turn(channel):
GPIO.output(right_led, GPIO.HIGH)
global triggered
triggered = 1
print ("Turning Right")
blink(Green_right, Green_top_bottom)
def left_turn(channel):
GPIO.output(left_led, GPIO.HIGH)
global triggered
triggered = 1
print ("Turning Left")
blink(Green_left, Green_top_bottom)
GPIO.add_event_detect(right_touch, GPIO.FALLING, callback = right_turn, bouncetime = 500)
GPIO.add_event_detect(left_touch, GPIO.FALLING, callback = left_turn, bouncetime = 500)
def light_sensing(ldr):
count = 0
#Output on the pin for
GPIO.setup(ldr, GPIO.OUT)
GPIO.output(ldr, GPIO.LOW)
sleep(0.1)
#Change the pin back to input
GPIO.setup(ldr, GPIO.IN)
#Count until the pin goes high
while (GPIO.input(ldr) == GPIO.LOW):
count += 1
return count
def blink(pin1, pin2):
GPIO.setup([pin1, pin2], GPIO.OUT)
for x in range(10):
GPIO.output([pin1, pin2], GPIO.HIGH)
sleep(0.5)
GPIO.output([pin1, pin2], GPIO.LOW)
sleep(0.5)
GPIO.output([right_led, left_led], GPIO.LOW)
global triggered
triggered = 0
def night_sight():
while (True):
GPIO.setup([Red_center, Red_left, Red_right],GPIO.OUT)
global triggered
if(light_sensing(ldr) > 7800):
if (triggered == 0):
print ("Night Sight ON")
GPIO.output([Red_center, Red_left, Red_right], GPIO.HIGH)
sleep(0.27)
GPIO.output([Red_center, Red_left, Red_right], GPIO.LOW)
sleep(0.27)
else:
print ("Night Sight OFF")
GPIO.output([Red_center, Red_left, Red_right], GPIO.LOW)
try:
night_sight()
except KeyboardInterrupt:
GPIO.cleanup()
Шаг шестой: корпус
В качестве корпуса для указателя поворотов и для Рассбери, мастер использует пластиковые коробки.
Закрепляет в корпуса детали устройства. Провода прокладывает через кабель каналы покрашенные в черный цвет.
Все готово.
Сборку устройства можно посмотреть на видео.