Волшебные руки
Мастер-классы, инструкции, полезные советы, рецепты.

Габарит + указатель поворотов для велосипеда

14

Advertisement

Габарит + указатель поворотов для велосипеда
Для безопасности маневров на велосипеде мастер-самодельщик сделал светодиодный указатель поворотов. Включение и выключение поворотов осуществляется с помощью сенсорных кнопок, закрепленных на руле велосипеда. В ночное время указатель дополнительно выполняет функцию заднего габаритного огня.

Инструменты и материалы:
-Резистор 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)

Advertisement

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()

Шаг шестой: корпус
В качестве корпуса для указателя поворотов и для Рассбери, мастер использует пластиковые коробки.
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Закрепляет в корпуса детали устройства. Провода прокладывает через кабель каналы покрашенные в черный цвет.
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Все готово.
Габарит + указатель поворотов для велосипеда
Габарит + указатель поворотов для велосипеда
Сборку устройства можно посмотреть на видео.

Advertisement

Оставьте ответ