Оглавление:
- Шаг 1: Материалы:
- Шаг 2: Схема системных блоков:
- Шаг 3: Работа системы:
- Шаг 4: аспекты механики
- Шаг 5: Считывание напряжения:
- Шаг 6: Программирование Arduino:
- Шаг 7: Программирование Raspberry Pi 3:
- Шаг 8: электрическая схема:
- Шаг 9: Результаты:
Видео: Создание напряжения с помощью велосипеда-эргометра: 9 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
Разработка проекта заключалась в сборке «игры» с целью крутить педали в велосипеде-эргометре, подключенном к генератору, и столбу ламп, которые активируются при увеличении оборотов двигателя, что происходит в соответствии с педалированием велосипеда. Система была основана на считывании через аналоговый порт Arduino Mega мгновенного генерируемого напряжения, последующей передаче этих данных на Raspberry Pi 3 через последовательную связь RX-TX и последующей активации ламп через реле.
Шаг 1: Материалы:
- 1 Raspberry Pi 3;
- 1 Arduino Mega 2560;
- 1 релейный экран с 10 реле 12 В;
- 10 ламп накаливания 127 В;
- 1 велосипед с эргометром;
- 1 электрическая машина (генератор) 12 В;
- Резисторы (1х1кОм, 2х10кОм);
- 1 электролитический конденсатор 10 мкФ;
- 1 стабилитрон 5,3 В;
- Кабель 1,5 мм (красный, черный, коричневый);
- 1 мачта МДФ с опорой на 10 светильников.
Шаг 2: Схема системных блоков:
Шаг 3: Работа системы:
Система основана на преобразовании кинетической энергии, генерируемой при езде на велосипеде, в электрическую энергию, отвечающую за активацию реле, которые включают лампы.
Напряжение, генерируемое генератором, считывается аналоговым выводом Arduino и отправляется через RX-TX на Raspberry Pi. Активация реле пропорциональна генерируемому напряжению - чем выше напряжение, тем больше реле срабатывает и загорается больше ламп.
Шаг 4: аспекты механики
Чтобы механически соединить генератор постоянного тока с велосипедом, ременную систему пришлось заменить системой, используемой на обычных велосипедах (состоящей из короны, цепи и шестерни). К раме велосипеда приваривалась металлическая пластина, чтобы двигатель можно было закрепить винтами. После этого к валу генератора приваривали шестерню, чтобы можно было разместить цепь, соединяющую педальную систему с генератором.
Шаг 5: Считывание напряжения:
Чтобы считывать напряжение генератора с помощью Arduino, необходимо подключить положительный полюс электрической машины к выводу A0 контроллера, а отрицательный полюс - к GND - чтобы максимальное напряжение генератора не превышало 5 В Контакты Arduino, фильтр напряжения с конденсатором 10 мкФ, резистор 1 кОм и стабилитрон 5,3 В были сконструированы и подключены между контроллером и генератором. Прошивка, загруженная в Arduino, очень проста и состоит только из чтения аналогового порта, умножения считанного значения на константу 0,0048828125 (5/1024, то есть напряжения GPIO Arduino, деленного на количество бит аналогового порта) и отправки в Serial - код будет доступен в статье.
Процедура включения связи RX-TX в Raspberry Pi немного сложнее, и вы должны следовать процедуре, описанной в ссылке. Вкратце, вам нужно отредактировать файл с именем «inittab» - расположенный в «/ etc / inittab» -, прокомментируйте строку «T0: 23: respawn: / sbin / getty -L ttyAMA0 115200 vt100» (если файл не основанный в ОС Raspberry, вы должны ввести команду: «sudo leafpad /boot/config.txt» и добавить строку «enable_uart = 1» в конец файла). Как только это будет сделано, вы должны снова открыть терминал LX и отключить последовательный порт с помощью команд «sudo systemctl stop [email protected]» и «sudo systemctl disable [email protected]». После этого необходимо выполнить команду «sudo leafpad /boot/cmdline.txt», удалить строку «console = serial0, 115200», сохранить файл и перезагрузить устройство. Для возможности связи RX-TX на Raspberry Pi необходимо установить последовательную библиотеку с помощью команды «sudo apt-get install -f python-serial» и импортировать библиотеку в код, вставив строку «import serial»., инициализируя серийный номер, вставляя строку «ser = serial. Serial (« / dev / ttyS0 », 9600)» и считывая напряжение, отправленное Arduino с помощью команды «ser.readline ()» - использованный полный код in Raspberry будет доступен в конце статьи.
Следуя описанной выше процедуре, этап считывания и отправки напряжения завершен.
Шаг 6: Программирование Arduino:
Как было сказано ранее, код, отвечающий за считывание напряжения, генерируемого при езде на велосипеде, очень прост.
Во-первых, необходимо выбрать вывод A0 как ответственный за считывание напряжения.
В функции «void setup ()» вам необходимо установить контакт A0 на INPUT с помощью команды «pinMode (sensor, INPUT)» и выбрать скорость передачи последовательного порта с помощью команды «Serial.begin (9600)».
В «void loop ()» функция «Serial.flush ()» используется для очистки буфера каждый раз, когда он прекращает отправку информации по последовательному каналу; считывание напряжения выполняется функцией «analogRead (sensor)» - помня, что необходимо преобразовать значение, считываемое аналоговым портом, в вольты - процесс, упомянутый в разделе «считывание напряжения» статьи.
Также в функции void loop () необходимо преобразовать переменную x из числа с плавающей точкой в строку, поскольку это единственный способ отправить переменную через RX-TX. Последним шагом в функции цикла является печать строки в последовательном порту, чтобы ее можно было отправить в Raspberry - для этого вы должны использовать функцию «Serial.println (y)». Строка «delay (100)» была добавлена в код только для того, чтобы переменная отправлялась с интервалом в 100 мс - если это время не соблюдается, произойдет последовательная перегрузка, вызывающая возможные сбои в программе.
Voltage_read.ino
датчик поплавка = A0; |
voidsetup () { |
pinMode (датчик, ВХОД); |
Serial.begin (9600); |
} |
voidloop () { |
Serial.flush (); |
float x = analogRead (датчик) * 0,0048828125 * 16,67; |
Строка y = ""; |
у + = х; |
Serial.println (y); |
задержка (100); |
} |
просмотреть rawvoltage_read.ino, размещенный на ❤ от GitHub
Шаг 7: Программирование Raspberry Pi 3:
lamp_bike.py
import os # импортировать библиотеку ОС (используется для очистки экрана при необходимости) |
import RPi. GPIOas gpio #import библиотека, используемая для управления GPIO Raspnerry |
import serial #import библиотека, отвечающая за последовательную связь |
import time #import библиотека, позволяющая использовать функцию задержки |
import subprocess #import библиотека, отвечающая за воспроизведение песен |
#start serial |
ser = serial. Serial ("/ dev / ttyS0", 9600) # определить имя устройства и скорость передачи |
#очисти экран |
clear = лямбда: os.system ('очистить') |
# установить контакты для управления реле |
gpio.setmode (gpio. BOARD) |
gpio.setup (11, gpio. OUT) # лампа 10 |
gpio.setup (12, gpio. OUT) # лампа 9 |
gpio.setup (13, gpio. OUT) # лампа 8 |
gpio.setup (15, gpio. OUT) # лампа 7 |
gpio.setup (16, gpio. OUT) # лампа 6 |
gpio.setup (18, gpio. OUT) # лампа 5 |
gpio.setup (19, gpio. OUT) # лампа 4 |
gpio.setup (21, gpio. OUT) # лампа 3 |
gpio.setup (22, gpio. OUT) # лампа 2 |
gpio.setup (23, gpio. OUT) # лампа 1 |
# начать записи |
name = ["None"] * 10 |
напряжение = [0,00] * 10 |
# читать файл записей |
f = open ('записи', 'г') |
for i inrange (10): # 10 лучших результатов появляются в списке |
name = f.readline () |
name = name [: len (name ) - 1] |
напряжение = f.readline () |
напряжение = плавающее (напряжение [: len (Voltage ) - 1]) |
f.close () |
Чисто() |
# установить максимальное напряжение |
макс = 50.00 |
# выключить лампы |
для i в диапазоне (11, 24, 1): |
если i! = 14 и i! = 17 и i! = 20: |
gpio.output (i, gpio. HIGH) # установить в HIGH, реле выключены |
#Начните |
whileTrue: |
# начальный экран |
print "Записи: / n" |
для i inrange (10): |
напечатать имя , ":", напряжение , "V" |
current_name = raw_input ("Напишите свое имя для начала:") |
Чисто() |
# Изменить максимальное значение |
если current_name == "max": |
max = input («Запишите максимальное напряжение: (2 десятичных знака)») |
Чисто() |
еще: |
# стартовое предупреждение |
for i inrange (11, 24, 1): # цикл начинается с PIN 11 и останавливается на PIN 24 |
если i! = 14 и i! = 17 и i! = 20: #PIN 14 и 20 - контакты GND, а 20 - контакты 3,3 В. |
gpio.output (i, gpio. LOW) # включить лампы |
time.sleep (0,5) |
k = 10 |
для i inrange (23, 10, -1): |
Чисто() |
если i! = 14 и i! = 17 и i! = 20: |
subprocess. Popen (['aplay', 'Audios /' + str (k) + '. wav']) |
время сна (0,03) |
Чисто() |
print "Prepare! / n", k |
время сна (1) |
k- = 1 |
gpio.output (i, gpio. HIGH) # выключаем лампы (по одной) |
subprocess. Popen (['aplay', 'Audios / go.wav']) # воспроизводит начальную музыку |
время сна (0,03) |
Чисто() |
напечатать "GO!" |
время сна (1) |
Чисто() |
#voltage read |
current_voltage = 0,00 |
напряжение1 = 0,00 |
для i inrange (200): |
ser.flushInput () |
предыдущий = напряжение1 |
Voltage1 = float (ser.readline ()) # собирает данные Arduino, передаваемые RX-TX |
Чисто() |
напряжение печати1, "В" |
если Voltage1> current_voltage: |
current_voltage = напряжение1 |
# в зависимости от генерируемого напряжения загорается больше ламп. |
если напряжение1 <макс / 10: |
для i в диапазоне (11, 24, 1): |
если i! = 14 и i! = 17 и i! = 20: |
gpio.output (я, gpio. HIGH) |
если напряжение1> = макс / 10: |
gpio.output (11, gpio. LOW) |
для i в диапазоне (12, 24, 1): |
если i! = 14 и i! = 17 и i! = 20: |
gpio.output (я, gpio. HIGH) |
если напряжение1> = 2 * макс / 10: |
для i в диапазоне (11, 13, 1): |
gpio.output (я, gpio. LOW) |
для i в диапазоне (13, 24, 1): |
если i! = 14 и i! = 17 и i! = 20: |
gpio.output (я, gpio. HIGH) |
если напряжение1> = 3 * макс / 10: |
для i в диапазоне (11, 14, 1): |
gpio.output (я, gpio. LOW) |
для i inrange (15, 24, 1): |
если i! = 17 и i! = 20: |
gpio.output (я, gpio. HIGH) |
если напряжение1> = 4 * макс / 10: |
для i в диапазоне (11, 16, 1): |
если i! = 14: |
gpio.output (я, gpio. LOW) |
для i inrange (16, 24, 1): |
если i! = 17 и i! = 20: |
gpio.output (я, gpio. HIGH) |
если напряжение1> = 5 * макс / 10: |
для i в диапазоне (11, 17, 1): |
если i! = 14: |
gpio.output (я, gpio. LOW) |
для i в диапазоне (18, 24, 1): |
если i! = 20: |
gpio.output (я, gpio. HIGH) |
если напряжение1> = 6 * макс / 10: |
для i в диапазоне (11, 19, 1): |
если i! = 14 и i! = 17: |
gpio.output (я, gpio. LOW) |
для i в диапазоне (19, 24, 1): |
если i! = 20: |
gpio.output (я, gpio. HIGH) |
если напряжение1> = 7 * макс / 10: |
для i в диапазоне (11, 20, 1): |
если i! = 14 и i! = 17: |
gpio.output (я, gpio. LOW) |
для i в диапазоне (21, 24, 1): |
gpio.output (я, gpio. HIGH) |
если напряжение1> = 8 * макс / 10: |
для i в диапазоне (11, 22, 1): |
если i! = 14 и i! = 17 и i! = 20: |
gpio.output (я, gpio. LOW) |
для i inrange (22, 24, 1): |
gpio.output (я, gpio. HIGH) |
если напряжение1> = 9 * макс / 10: |
для i в диапазоне (11, 23, 1): |
если i! = 14 и i! = 17 и i! = 20: |
gpio.output (я, gpio. LOW) |
gpio.output (23, gpio. HIGH) |
если напряжение1> = макс: |
для i в диапазоне (11, 24, 1): |
если i! = 14 и i! = 17 и i! = 20: |
gpio.output (я, gpio. LOW) |
если напряжение1 |
перерыв |
# выключить лампы |
для i в диапазоне (11, 24, 1): |
если i! = 14 и i! = 17 и i! = 20: |
gpio.output (я, gpio. HIGH) |
# победная музыка |
если current_voltage> = max: |
subprocess. Popen (['aplay', 'Audios / rocky.wav']) |
время сна (0,03) |
Чисто() |
напечатайте «ОЧЕНЬ ХОРОШО, ВЫ ВЫИГРАЛИ!»% (u '\u00c9', u '\u00ca', u '\u00c2') |
для i inrange (10): |
для j в диапазоне (11, 24, 1): |
если j! = 14 и j! = 17 и j! = 20: |
gpio.output (j, gpio. LOW) |
время сна (0,05) |
для j в диапазоне (11, 24, 1): |
если j! = 14 и j! = 17 и j! = 20: |
gpio.output (j, gpio. HIGH) |
время сна (0,05) |
time.sleep (0,5) |
subprocess. Popen (['aplay', 'Audios / end.wav']) |
время сна (0,03) |
Чисто() |
print "Конец игры… / n", current_voltage, "V" |
# записи |
time.sleep (1.2) |
достигнуто = 0 |
для i inrange (10): |
если current_voltage> Voltage : |
достиг + = 1 |
temp_voltage = напряжение |
напряжение = current_voltage |
current_voltage = temp_voltage |
temp_name = имя [я] |
name = current_name |
current_name = temp_name |
если достигнуто> 0: |
subprocess. Popen (['aplay', 'Audios / record.wav']) |
время сна (0,03) |
Чисто() |
f = open ('записи', 'ш') |
для i inrange (10): |
f.write (имя ) |
f.write ("\ n") |
f.write (str (напряжение )) |
f.write ("\ n") |
f.close () |
Чисто() |
просмотреть rawlamps_bike.py, размещенный на ❤ на GitHub
Шаг 8: электрическая схема:
Arduino и Raspberry Pi 3 питаются от источника 5 В с током 3 А.
Электрическая схема начинается с подключения генератора постоянного тока (подключенного к велосипеду) к Arduino через фильтр напряжения, состоящий из стабилитрона 5,3 В, конденсатора 10 мкФ и резистора 1 кОм - вход фильтра подключен к Клеммы генератора и выход подключены к порту A0 и GND контроллера.
Arduino подключается к Raspberry через связь RX-TX, которая осуществляется через резистивный делитель с использованием резисторов 10 кОм (требуемых портами контроллеров, работающих при разных напряжениях).
GPIO Raspberry Pi подключены к реле, отвечающим за включение ламп. «COM» всех реле был соединен между собой и подключен к фазе (сеть переменного тока), а «Н. О» (нормально разомкнутый) каждого реле был подключен к каждой лампе, а нейтраль сети переменного тока была подключена ко всем лампам. Таким образом, при активации GPIO, отвечающего за каждое реле, реле переключается на фазу сети переменного тока и включает соответствующую лампу.
Шаг 9: Результаты:
После окончательной сборки проекта было подтверждено, что он работает, как ожидалось - в зависимости от скорости, которую пользователь крутил на велосипеде, генерируется больше напряжения и загорается больше ламп.
Рекомендуемые:
Измерение частоты и напряжения источника питания с помощью Arduino: 6 шагов
Измерение частоты и напряжения источника питания с использованием Arduino: Введение: цель этого проекта - измерить частоту и напряжение источника питания, которые находятся в диапазоне от 220 до 240 Вольт и 50 Гц здесь, в Индии. Я использовал Arduino для захвата сигнала и расчета частоты и напряжения, вы можете использовать любой другой микроконтакт
Понижающий преобразователь напряжения постоянного тока в понижающий режим понижающего напряжения (LM2576 / LM2596): 4 ступени
Понижающий преобразователь напряжения постоянного и понижающего режима понижающего напряжения (LM2576 / LM2596): создание высокоэффективного понижающего преобразователя - сложная работа, и даже опытным инженерам требуется несколько конструкций, чтобы найти правильный. представляет собой преобразователь постоянного тока в постоянный, который понижает напряжение (при повышении
Фотоэластиметрия: определение механического напряжения с помощью оптики: 5 шагов (с изображениями)
Фотоэластиметрия: определение механических напряжений с помощью оптики. Фотоэластиметрия - это способ визуализировать деформации материалов. В этом руководстве мы увидим, как вы можете сделать несколько образцов, чтобы экспериментально определить распределение напряжений в некоторых материалах при механической нагрузке
Измерение постоянного напряжения с помощью Arduino и Node-RED: 8 шагов (с изображениями)
Измерение напряжения постоянного тока с помощью Arduino и Node-RED: существует множество руководств по измерению напряжения постоянного тока с помощью Arduino, в этом случае я нашел руководство, которое считаю лучшим функциональным методом для измерения постоянного тока, не требуя входных значений сопротивления, требуется только некоторое сопротивление. и мультиметр
Создание маленьких роботов: создание роботов Micro-Sumo на один кубический дюйм и меньше: 5 шагов (с изображениями)
Создание маленьких роботов: создание роботов Micro-Sumo на один кубический дюйм и меньше: вот некоторые подробности о создании крошечных роботов и схем. В этом руководстве также будут рассмотрены некоторые основные советы и методы, которые могут быть полезны при создании роботов любого размера. Для меня одна из самых сложных задач в электронике - это увидеть, насколько малы