Cuprins:
- Pasul 1: Materiale:
- Pasul 2: Diagrama blocurilor de sistem:
- Pasul 3: Funcționarea sistemului:
- Pasul 4: Aspecte mecanice
- Pasul 5: Citirea tensiunii:
- Pasul 6: Programare Arduino:
- Pasul 7: Programare Raspberry Pi 3:
- Pasul 8: Schema electrică:
- Pasul 9: Rezultate:
Video: Generarea tensiunii cu o bicicletă ergometră: 9 pași (cu imagini)
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:45
Elaborarea proiectului a constat în asamblarea unui „joc” cu obiectivul de a pedala într-o bicicletă ergometră conectată la un generator și un turn de lămpi care se activează pe măsură ce turația motorului crește - care se acordă pedalării bicicletei. Sistemul s-a bazat pe citirea - printr-un port analogic al unui Arduino Mega - tensiunea instantanee generată, apoi transmiterea acestor date către un Raspberry Pi 3 prin comunicare serială RX-TX și activarea ulterioară a lămpilor prin releu.
Pasul 1: Materiale:
- 1 Raspberry Pi 3;
- 1 Arduino Mega 2560;
- 1 ecran de releu cu 10 relee de 12 V;
- 10 lămpi cu incandescență 127 V;
- 1 bicicleta Ergometer;
- 1 mașină electrică (generator) 12 V;
- Rezistoare (1x1kΩ, 2x10kΩ);
- 1 condensator electrolitic 10 µF;
- 1 diodă Zener 5,3 V;
- Cablu de 1,5 mm (roșu, negru, maro);
- 1 turn MDF cu suport pentru 10 lămpi.
Pasul 2: Diagrama blocurilor de sistem:
Pasul 3: Funcționarea sistemului:
Sistemul se bazează pe transformarea energiei cinetice generate atunci când bicicleta bicicletei în energie electrică responsabilă de activarea releelor care vor aprinde lămpile.
Tensiunea generată de generator este citită de un pin analogic al Arduino și este trimisă prin RX-TX către Raspberry Pi. Activarea releelor este proporțională cu tensiunea generată - cu cât este mai mare tensiunea, cu atât mai multe relee vor fi declanșate și se vor aprinde mai multe lămpi.
Pasul 4: Aspecte mecanice
Pentru a cupla mecanic generatorul de curent continuu la bicicletă, sistemul de curele trebuia înlocuit cu sistemul utilizat pe bicicletele obișnuite (format dintr-o coroană, lanț și pinion). O placă metalică a fost sudată de cadrul bicicletei, astfel încât motorul să poată fi fixat cu șuruburi. După aceea, pinionul a fost sudat pe arborele generatorului, astfel încât lanțul să poată fi plasat, interconectând sistemul de pedale la generator.
Pasul 5: Citirea tensiunii:
Pentru a citi tensiunea generatorului folosind Arduino este necesar să conectați polul pozitiv al mașinii electrice la pinul A0 al controlerului și polul negativ la GND - pentru a evita ca tensiunea maximă a generatorului să fie mai mare decât 5 V din Au fost construiți și conectați pinii Arduino, un filtru de tensiune care utilizează un condensator de 10 µF, un rezistor de 1 kΩ și o diodă Zener de 5,3 V între controler și generator. Firmware-ul încărcat în Arduino este foarte simplu și constă doar în citirea unui port analogic, înmulțirea valorii citite cu constanta 0,0048828125 (5/1024, adică tensiunea GPIO a Arduino împărțită la numărul de biți ai portului său analog) și trimiterea variabilă la Serial - codul va fi disponibil în articol.
Procedura pentru activarea comunicării RX-TX în Raspberry Pi este puțin mai complexă și trebuie să urmați procedura descrisă în link. Pe scurt, trebuie să editați un fișier numit „inittab” - situat în „/ etc / inittab” -, comentați linia „T0: 23: respawn: / sbin / getty -L ttyAMA0 115200 vt100” (dacă fișierul nu este fondat în sistemul de operare Raspberry, trebuie să introduceți comanda: „sudo leafpad /boot/config.txt” și să atașați linia „enable_uart = 1” la sfârșitul fișierului). Odată ce ați făcut acest lucru, trebuie să redeschideți terminalul LX și să dezactivați serialul cu comenzile „sudo systemctl stop [email protected]” și „sudo systemctl disable [email protected]”. După aceea, trebuie să executați comanda „sudo leafpad /boot/cmdline.txt”, ștergeți linia „console = serial0, 115200”, salvați fișierul și reporniți dispozitivul. Pentru ca comunicarea RX-TX să fie posibilă, biblioteca Serial trebuie instalată pe Raspberry Pi cu comanda „sudo apt-get install -f python-serial” și importă biblioteca în cod inserând linia „import serial”, inițializarea serialului inserând linia "ser = serial. Serial (" / dev / ttyS0 ", 9600)" și citirea tensiunii trimise de Arduino folosind comanda „ser.readline ()” - codul complet utilizat în Raspberry va fi disponibil la sfârșitul articolului.
Urmând procedura descrisă mai sus, etapa de citire și trimitere a tensiunii este finalizată.
Pasul 6: Programare Arduino:
După cum sa menționat anterior, codul responsabil pentru citirea tensiunii generate atunci când mergeți cu bicicleta este foarte simplu.
În primul rând, este necesar să alegeți pinul A0 ca responsabil pentru citirea tensiunii.
În funcția „void setup ()”, trebuie să setați pinul A0 la INPUT cu comanda „pinMode (senzor, INPUT)” și să selectați viteza de transmisie a portului serial folosind comanda „Serial.begin (9600)”.
În „bucla de gol ()”, funcția „Serial.flush ()” este utilizată pentru a șterge bufferul de fiecare dată când termină trimiterea informațiilor prin serial; citirea tensiunii este realizată de funcția „analogRead (senzor)” - amintind că este necesar să se convertească valoarea citită de portul analogic în Volți - proces citat în secțiunea „tensiune de citire” a articolului.
De asemenea, în funcția "void loop ()", este necesar să convertiți variabila x de la float la șir, deoarece acesta este singurul mod de a trimite variabila prin RX-TX. Ultimul pas din funcția buclă este să imprimați șirul în portul serial, astfel încât să poată fi trimis la Raspberry - pentru aceasta trebuie să utilizați funcția "Serial.println (y)". Linia „întârziere (100)” a fost adăugată la cod numai astfel încât variabila să fie trimisă în intervale de 100 ms - dacă acest timp nu este respectat, va apărea suprasarcina serială, generând posibile blocări în program.
tensiune_citire.ino
senzor plutitor = A0; |
voidsetup () { |
pinMode (senzor, INPUT); |
Serial.begin (9600); |
} |
voidloop () { |
Serial.flush (); |
float x = analogRead (senzor) * 0,0048828125 * 16,67; |
Șirul y = ""; |
y + = x; |
Serial.println (y); |
întârziere (100); |
} |
vizualizați rawvoltage_read.ino găzduit cu ❤ de GitHub
Pasul 7: Programare Raspberry Pi 3:
lights_bike.py
import os #import biblioteca OS (folosit pentru a șterge ecranul atunci când este necesar) |
import RPi. GPIOas gpio #import biblioteca utilizată pentru a controla GPIO-ul Raspnerry |
import serial #import biblioteca responsabilă pentru comunicarea serial |
import timp #import bibliotecă care face posibilă utilizarea funcției de întârziere |
import subproces #import biblioteca responsabilă pentru redarea melodiilor |
#start serial |
ser = serial. Serial ("/ dev / ttyS0", 9600) #definește numele dispozitivului și rata de transmisie |
# ecran clar |
clear = lambda: os.system ('clear') |
#set pin pentru controlul releului |
gpio.setmode (gpio. BOARD) |
gpio.setup (11, gpio. OUT) #lamp 10 |
gpio.setup (12, gpio. OUT) #lamp 9 |
gpio.setup (13, gpio. OUT) #lamp 8 |
gpio.setup (15, gpio. OUT) #lamp 7 |
gpio.setup (16, gpio. OUT) #lamp 6 |
gpio.setup (18, gpio. OUT) #lamp 5 |
gpio.setup (19, gpio. OUT) #lamp 4 |
gpio.setup (21, gpio. OUT) #lamp 3 |
gpio.setup (22, gpio. OUT) #lamp 2 |
gpio.setup (23, gpio. OUT) #lamp 1 |
#începeți înregistrările |
nume = ["Nici unul"] * 10 |
tensiune = [0,00] * 10 |
#citește fișierul de înregistrări |
f = deschis („înregistrări”, „r”) |
for i inrange (10): #cele 10 cele mai bune scoruri apar pe listă |
nume = f.readline () |
nume = nume [: len (nume ) - 1] |
tensiune = f.readline () |
tensiune = plutitor (tensiune [: len (tensiune ) - 1]) |
f.close () |
clar() |
# setați tensiunea maximă |
max = 50,00 |
#stingeți lămpile |
pentru i gama (11, 24, 1): |
dacă i! = 14 și i! = 17 și i! = 20: |
gpio.output (i, gpio. HIGH) #set la HIGH, releele sunt oprite |
#start |
whileTrue: |
# ecran inițial |
print "Înregistrări: / n" |
pentru i gama (10): |
numele de imprimare , ":", tensiunea , "V" |
current_name = raw_input ("Scrieți-vă numele pentru a începe:") |
clar() |
#Modificați valoarea maximă |
dacă current_name == "max": |
max = input („Scrieți tensiunea maximă: (2 zecimale)”) |
clar() |
altceva: |
avertisment #start |
pentru i gama (11, 24, 1): # bucla începe în PIN 11 și se oprește în PIN 24 |
dacă i! = 14 și i! = 17 și i! = 20: #PIN 14 și 20 sunt pini GND și 20 este un pin de 3,3 V |
gpio.output (i, gpio. LOW) #prindeți lămpile |
time.sleep (0,5) |
k = 10 |
pentru i gama (23, 10, -1): |
clar() |
dacă i! = 14 și i! = 17 și i! = 20: |
subproces. Popen (['aplay', 'Audios /' + str (k) + '. wav']) |
time.sleep (0,03) |
clar() |
tipăriți „Pregătiți! / n”, k |
time.sleep (1) |
k- = 1 |
gpio.output (i, gpio. HIGH) # stingeți lămpile (una câte una) |
subprocess. Popen (['aplay', 'Audios / go.wav']) # redă muzica de început |
time.sleep (0,03) |
clar() |
tipărește „GO!” |
time.sleep (1) |
clar() |
#tensiune citită |
tensiune_curent = 0,00 |
tensiune1 = 0,00 |
pentru i inrange (200): |
ser.flushInput () |
precedent = tensiune1 |
voltage1 = float (ser.readline ()) #collects datele Arduino transferate de RX-TX |
clar() |
tensiune de imprimare1, "V" |
dacă tensiune1> tensiune_curent: |
tensiune_curent = tensiune1 |
# în funcție de tensiunea generată, se aprind mai multe lămpi. |
dacă tensiunea 1 <max / 10: |
pentru i gama (11, 24, 1): |
dacă i! = 14 și i! = 17 și i! = 20: |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = max / 10: |
gpio.output (11, gpio. LOW) |
pentru i gama (12, 24, 1): |
dacă i! = 14 și i! = 17 și i! = 20: |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = 2 * max / 10: |
pentru i gama (11, 13, 1): |
gpio.output (i, gpio. LOW) |
pentru i gama (13, 24, 1): |
dacă i! = 14 și i! = 17 și i! = 20: |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = 3 * max / 10: |
pentru i gama (11, 14, 1): |
gpio.output (i, gpio. LOW) |
pentru i gama (15, 24, 1): |
dacă i! = 17 și i! = 20: |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = 4 * max / 10: |
pentru i gama (11, 16, 1): |
dacă i! = 14: |
gpio.output (i, gpio. LOW) |
pentru gama I (16, 24, 1): |
dacă i! = 17 și i! = 20: |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = 5 * max / 10: |
pentru i gama (11, 17, 1): |
dacă i! = 14: |
gpio.output (i, gpio. LOW) |
pentru i gama (18, 24, 1): |
dacă i! = 20: |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = 6 * max / 10: |
pentru i gama (11, 19, 1): |
dacă i! = 14 și i! = 17: |
gpio.output (i, gpio. LOW) |
pentru i gama (19, 24, 1): |
dacă i! = 20: |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = 7 * max / 10: |
pentru i gama (11, 20, 1): |
dacă i! = 14 și i! = 17: |
gpio.output (i, gpio. LOW) |
pentru i gama (21, 24, 1): |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = 8 * max / 10: |
pentru i gama (11, 22, 1): |
dacă i! = 14 și i! = 17 și i! = 20: |
gpio.output (i, gpio. LOW) |
pentru i gama (22, 24, 1): |
gpio.output (i, gpio. HIGH) |
dacă tensiunea1> = 9 * max / 10: |
pentru i gama (11, 23, 1): |
dacă i! = 14 și i! = 17 și i! = 20: |
gpio.output (i, gpio. LOW) |
gpio.output (23, gpio. HIGH) |
dacă tensiunea1> = max: |
pentru i gama (11, 24, 1): |
dacă i! = 14 și i! = 17 și i! = 20: |
gpio.output (i, gpio. LOW) |
dacă tensiunea1 |
pauză |
#stingeți lămpile |
pentru i gama (11, 24, 1): |
dacă i! = 14 și i! = 17 și i! = 20: |
gpio.output (i, gpio. HIGH) |
muzica #victory |
dacă tensiune_curentă> = maxim: |
subprocess. Popen (['aplay', 'Audios / rocky.wav']) |
time.sleep (0,03) |
clar() |
tipăriți „FOARTE BINE, AȚI CÂȘTIGAT!”% (u '\u00c9', u '\u00ca', u '\u00c2') |
pentru i gama (10): |
pentru gama j (11, 24, 1): |
dacă j! = 14 și j! = 17 și j! = 20: |
gpio.output (j, gpio. LOW) |
time.sleep (0,05) |
pentru gama j (11, 24, 1): |
dacă j! = 14 și j! = 17 și j! = 20: |
gpio.output (j, gpio. HIGH) |
time.sleep (0,05) |
time.sleep (0,5) |
subprocess. Popen (['aplay', 'Audios / end.wav']) |
time.sleep (0,03) |
clar() |
tipăriți „Finalizați jocul … / n”, tensiune_actuală, „V” |
#înregistrări |
time.sleep (1.2) |
atins = 0 |
pentru i gama (10): |
dacă tensiune_curent> tensiune : |
a ajuns la + = 1 |
temp_voltage = tensiune |
tensiune = tensiune_curent |
current_voltage = tensiune_timp |
temp_name = nume |
nume = nume_curent |
current_name = temp_name |
dacă este atins> 0: |
subprocess. Popen (['aplay', 'Audios / record.wav']) |
time.sleep (0,03) |
clar() |
f = deschis („înregistrări”, „w”) |
pentru i gama (10): |
f.scrie (nume ) |
f.write ("\ n") |
f.write (str (tensiune )) |
f.write ("\ n") |
f.close () |
clar() |
vizualizați rawlamps_bike.py găzduit cu ❤ de GitHub
Pasul 8: Schema electrică:
Arduino și Raspberry Pi 3 sunt alimentate de o sursă de 5V cu curent 3A.
Circuitul electric începe cu conectarea generatorului de curent continuu (cuplat la bicicletă) la Arduino printr-un filtru de tensiune compus dintr-o diodă Zener de 5,3V, un condensator de 10μF și un rezistor de 1kΩ - intrarea filtrului este conectată la terminalele generatorului și ieșirea sunt conectate la portul A0 și la GND al controlerului.
Arduino este conectat la Raspberry prin comunicare RX-TX - realizată printr-un divizor rezistiv folosind rezistențe de 10kΩ (cerute de porturile controlerelor care funcționează la diferite tensiuni).
GPIO-urile Raspberry Pi sunt conectate la releele responsabile de aprinderea lămpilor. „COM” a tuturor releelor a fost interconectat și conectat la fază (rețea de curent alternativ), iar „N. O” (normal deschis) a fiecărui releu a fost conectat la fiecare lampă și neutrul rețelei de curent alternativ a fost interconectat la toate lămpile. Astfel, când GPIO-ul responsabil pentru fiecare releu este activat, releul este comutat în faza rețelei de curent alternativ și aprinde lampa respectivă.
Pasul 9: Rezultate:
După asamblarea finală a proiectului, s-a verificat că a funcționat așa cum era de așteptat - în funcție de viteza pe care utilizatorul pedalează pe bicicletă, se generează mai multă tensiune și se aprind mai multe lămpi.
Recomandat:
Generarea de sunete diferite din filme folosind numai Arduino: 3 pași
Generarea de sunete diferite din filme folosind numai Arduino: As-salamu alaykum! Am vrut să generez diferite sunete precum predator, optimus prime & bondar din filmul cu transformatoare. De fapt mă uitam la „hackerul” videoclip despre fabricarea unei căști de prădător
Măsurarea frecvenței și tensiunii de alimentare cu ajutorul Arduino: 6 pași
Măsurarea frecvenței și tensiunii de alimentare folosind Arduino: Introducere: Scopul acestui proiect este de a măsura frecvența și tensiunea de alimentare, care este cuprinsă între 220 și 240 Volți și 50Hz aici în India. Am folosit un Arduino pentru captarea semnalului și calcularea frecvenței și tensiunii, puteți utiliza orice alt microcont
Generarea de artă din comentarii: 5 pași (cu imagini)
Generarea de artă din comentarii: Acest proiect este unul ambițios, în care dorim să folosim unele dintre cele mai discutabile părți ale internetului, secțiuni de comentarii și camere de chat, pentru a crea artă. De asemenea, dorim să facem proiectul ușor accesibil, astfel încât oricine să poată încerca să genereze
Generarea tonurilor de diferite tipuri folosind ecuații matematice (MathsMusic) Arduino: 5 pași
Generarea tonurilor de diferite tipuri folosind ecuații matematice (MathsMusic) Arduino: Descrierea proiectului: A început o nouă călătorie în care ideile pot fi implementate cu ușurință folosind comunitatea open source (Mulțumită Arduino). Așadar, iată o modalitate · Uită-te în jurul tău și observă-ți împrejurimile · Descoperă problemele care trebuie să fie
Măsurarea tensiunii DC cu Arduino și Node-RED: 8 pași (cu imagini)
Măsurarea tensiunii de curent continuu cu Arduino și Node-RED: Există o mulțime de tutoriale de măsurare a tensiunii de curent continuu cu Arduino, în acest caz am găsit un tutorial pe care îl consider cea mai bună metodă funcțională pentru a măsura DC fără a necesita valori de intrare de rezistență, necesită doar o anumită rezistență și un multimetru