Cuprins:

Generarea tensiunii cu o bicicletă ergometră: 9 pași (cu imagini)
Generarea tensiunii cu o bicicletă ergometră: 9 pași (cu imagini)

Video: Generarea tensiunii cu o bicicletă ergometră: 9 pași (cu imagini)

Video: Generarea tensiunii cu o bicicletă ergometră: 9 pași (cu imagini)
Video: Recuperare respiratorie-Dr.Dan Caimac, Asist. Univ., Medic Primar, Specialitate Bft -Recup. Medicală 2024, Iulie
Anonim
Generarea tensiunii cu bicicleta ergonomică
Generarea tensiunii cu bicicleta ergonomică
Generarea tensiunii cu bicicleta ergonomică
Generarea tensiunii cu bicicleta ergonomică
Generarea tensiunii cu bicicleta ergonomică
Generarea tensiunii cu bicicleta ergonomică

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:

Diagrama blocurilor de sistem
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

Aspecte mecanice
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ă:

Schema electrică
Schema electrică
Schema electrică
Schema electrică
Schema electrică
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:

Image
Image

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: