Përmbajtje:
Video: Gjenerimi i tensionit me një biçikletë ergometër: 9 hapa (me fotografi)
2025 Autor: John Day | [email protected]. E modifikuara e fundit: 2025-01-13 06:58
Përpunimi i projektit konsistoi në montimin e një "loje" me objektivin për të pedaluar në një biçikletë ergometër të lidhur me një gjenerator dhe një kullë llambash që aktivizohen me rritjen e shpejtësisë së motorit - që ndodh sipas pedalimit të biçikletës. Sistemi u bazua në leximin-përmes një porti analog të një Arduino Mega-tensionin e çastit të gjeneruar, pastaj transmetimin e këtyre të dhënave në një Raspberry Pi 3 përmes komunikimit serik RX-TX dhe aktivizimin pasues të llambave përmes stafetës.
Hapi 1: Materialet:
- 1 mjedër Pi 3;
- 1 Arduino Mega 2560;
- 1 Mburojë Stafetë me 10 Rele 12 V;
- 10 llamba inkandeshente 127 V;
- 1 biçikletë ergometër;
- 1 Makinë Elektrike (Gjenerator) 12 V;
- Rezistenca (1x1kΩ, 2x10kΩ);
- 1 Kondensator elektrolitik 10 μF;
- 1 Zener Diodë 5.3 V;
- Kabllo 1.5 mm (e kuqe, e zezë, kafe);
- 1 kullë MDF me mbështetje për 10 llamba.
Hapi 2: Diagrami i Blloqeve të Sistemit:
Hapi 3: Funksionimi i sistemit:
Sistemi bazohet në transformimin e energjisë kinetike të gjeneruar kur lëviz biçikletën me energji elektrike përgjegjëse për aktivizimin e stafetëve që do të ndezin llambat.
Tensioni i gjeneruar nga gjeneratori lexohet nga një pin analog i Arduino dhe dërgohet përmes RX-TX në Raspberry Pi. Aktivizimi i stafetëve është proporcional me tensionin e gjeneruar - sa më i lartë të jetë tensioni, aq më shumë stafetë do të ndizen dhe më shumë llamba do të ndizen.
Hapi 4: Aspektet e Mekanikës
Për të bashkuar mekanikisht gjeneratorin DC me biçikletën, sistemi i rripit duhej të zëvendësohej nga sistemi i përdorur në biçikletat e zakonshme (i përbërë nga një kurorë, zinxhir dhe majë). Një pllakë metalike ishte ngjitur në kornizën e biçikletës në mënyrë që motori të mund të fiksohej me vida. Pas kësaj, maja ishte ngjitur në boshtin e gjeneratorit në mënyrë që zinxhiri të mund të vendoset, duke lidhur sistemin e pedalimit me gjeneratorin.
Hapi 5: Leximi i tensionit:
Për të lexuar tensionin e gjeneratorit duke përdorur Arduino është e nevojshme të lidhni polin pozitiv të makinës elektrike me pinin A0 të kontrolluesit dhe polin negativ me GND - për të shmangur që tensioni maksimal i gjeneratorit të jetë më i madh se 5 V i Kunjat Arduino, një filtër tensioni duke përdorur një kondensator prej 10 µF, një rezistencë prej 1 kΩ dhe një diodë Zener prej 5.3 V u ndërtuan dhe u lidhën midis kontrolluesit dhe gjeneratorit. Firmueri i ngarkuar në Arduino është shumë i thjeshtë dhe konsiston vetëm në leximin e një porti analog, shumëzimin e vlerës së lexuar me konstantën 0.0048828125 (5/1024, që është tensioni GPIO i Arduino -s i ndarë me numrin e bitëve të portës së tij analoge) dhe dërgimin e e ndryshueshme në Serial - kodi do të jetë i disponueshëm në artikull.
Procedura për të mundësuar komunikimin RX-TX në Raspberry Pi është pak më komplekse dhe duhet të ndiqni procedurën e përshkruar në lidhje. Shkurtimisht, ju duhet të redaktoni një skedar të quajtur "inittab" -i vendosur në "/etc/inittab" -, komentoni rreshtin "T0: 23: respawn:/sbin/getty -L ttyAMA0 115200 vt100" (nëse skedari nuk është themeluar në OS të Raspberry, duhet të futni komandën: "sudo leafpad /boot/config.txt" dhe të shtoni rreshtin "enable_uart = 1" në fund të skedarit). Pasi të bëhet kjo, duhet të rihapni Terminalin LX dhe të çaktivizoni Serialin me komandat "sudo systemctl stop [email protected]" dhe "sudo systemctl çaktivizoni [email protected]". Pas kësaj ju duhet të ekzekutoni komandën "sudo leafpad /boot/cmdline.txt", fshini rreshtin "console = serial0, 115200", ruani skedarin dhe rinisni pajisjen. Në mënyrë që komunikimi RX-TX të jetë i mundur, biblioteka Seriale duhet të instalohet në Raspberry Pi me komandën "sudo apt-get install -f python-serial" dhe të importojë bibliotekën në kod duke futur rreshtin "import serial", duke inicializuar serialin duke futur rreshtin "ser = serial. Serial (" / dev / ttyS0 ", 9600)" dhe leximin e tensionit të dërguar nga Arduino duke përdorur komandën "ser.readline ()" - kodi i plotë i përdorur në mjedër do të vihet në dispozicion në fund të artikullit.
Duke ndjekur procedurën e përshkruar më sipër, hapi i leximit dhe dërgimit të tensionit është i plotë.
Hapi 6: Programimi Arduino:
Siç u tha më parë, kodi përgjegjës për leximin e tensionit të gjeneruar gjatë çiklizmit është shumë i thjeshtë.
Së pari, është e nevojshme të zgjidhni pinin A0 si përgjegjës për leximin e tensionit.
Në funksionin "void setup ()", duhet të vendosni pin A0 në INPUT me komandën "pinMode (sensor, INPUT)" dhe zgjidhni shpejtësinë e transmetimit të portit serik duke përdorur komandën "Serial.begin (9600)".
Në "void loop ()", funksioni "Serial.flush ()" përdoret për të pastruar bufferin sa herë që ai përfundon dërgimin e informacionit përmes serialit; leximi i tensionit kryhet nga funksioni "analogRead (sensor)" - duke kujtuar se është e nevojshme të konvertohet vlera e lexuar nga porti analog në Volt - proces i cituar në seksionin "tensioni i leximit" të artikullit.
Gjithashtu, në funksionin "void loop ()", është e nevojshme të konvertohet ndryshorja x nga float në string, pasi kjo është mënyra e vetme për të dërguar ndryshoren nëpërmjet RX-TX. Hapi i fundit në funksionin e lakut është të printoni vargun në portin serik në mënyrë që të mund të dërgohet te Raspberry - për këtë ju duhet të përdorni funksionin "Serial.println (y)". Linja "vonesë (100)" i është shtuar kodit vetëm në mënyrë që ndryshorja të dërgohet në intervale prej 100 ms - nëse kjo kohë nuk respektohet, mbingarkesa Serike do të ndodhë, duke gjeneruar përplasje të mundshme në program.
leximi i tensionit.ino
sensori notues = A0; |
voidsetup () { |
pinMode (sensor, INPUT); |
Serial.filloj (9600); |
} |
voidloop () { |
Serial.flush (); |
noton x = analogRead (sensor)*0.0048828125*16.67; |
Vargu y = ""; |
y+= x; |
Serial.println (y); |
vonesa (100); |
} |
shikoni rawvoltage_read.ino të organizuar me ❤ nga GitHub
Hapi 7: Programimi i Raspberry Pi 3:
llambat_bike.py
importo os #importo bibliotekën os (përdoret për të pastruar ekranin kur është e nevojshme) |
importo RPi. GPIOas gpio #import bibliotekë e përdorur për të kontrolluar GPIO -n e Raspnerry |
importoni seri #bibliotekë importi përgjegjëse për komunikimin serik |
koha e importimit #biblioteka e importit që bën të mundur përdorimin e funksionit të vonesës |
importo nënproces #bibliotekë importi përgjegjëse për luajtjen e këngëve |
serial #fillo |
ser = serial. Serial ("/dev/ttyS0", 9600) #përcaktoni emrin e pajisjes dhe shkallën e baudit |
#ekran i pastër |
qartë = lambda: os.system ('qartë') |
#vendosni kunjat për kontrollin e stafetës |
gpio.setmode (gpio. BOARD) |
gpio.setup (11, gpio. OUT) #llambë 10 |
gpio.setup (12, gpio. OUT) #llambë 9 |
gpio.setup (13, gpio. OUT) #llambë 8 |
gpio.setup (15, gpio. OUT) #llambë 7 |
gpio.setup (16, gpio. OUT) #llambë 6 |
gpio.setup (18, gpio. OUT) #llambë 5 |
gpio.setup (19, gpio. OUT) #llambë 4 |
gpio.setup (21, gpio. OUT) #llambë 3 |
gpio.setup (22, gpio. OUT) #llambë 2 |
gpio.setup (23, gpio. OUT) #llambë 1 |
#fillo regjistrimet |
emri = ["Asnjë"]*10 |
tension = [0.00]*10 |
#lexoni skedarin e regjistrimeve |
f = hapur ('regjistrimet', 'r') |
për i inrange (10): #10 rezultatet më të mira shfaqen në listë |
emri = f. leximi () |
emri = emri [: len (emri )-1] |
tension = f. linja e leximit () |
tension = notues (tension [: len (tension )-1]) |
f. mbyll () |
qartë() |
#caktoni tensionin maksimal |
max = 50.00 |
#fikni llambat |
për i inrange (11, 24, 1): |
nëse i! = 14dhe i! = 17dhe i! = 20: |
gpio.output (i, gpio. HIGHT) #vendos në LART, stafetat janë të fikura |
#fillo |
ndërsa e vërtetë: |
#ekran fillestar |
printoni "Regjistrimet: / n" |
për inrange (10): |
emri i printuar , ":", tensioni , "V" |
emri aktual = input_ i papërpunuar ("Shkruaj emrin tënd për të filluar:") |
qartë() |
#Ndrysho vlerën maksimale |
nëse emri aktual == "max": |
max = input ("Shkruani tensionin maksimal: (2 shifra dhjetore)") |
qartë() |
tjeter: |
#paralajmërim për fillimin |
për i inrange (11, 24, 1): #lak fillon në PIN 11 dhe ndalet në PIN 24 |
nëse i! = 14 dhe i! = 17 dhe i! = 20: #PIN 14 dhe 20 janë kunja GND dhe 20 është një kunj 3.3 V |
gpio.output (i, gpio. LOW) #ndez llambat |
koha. gjumi (0.5) |
k = 10 |
për i inrange (23, 10, -1): |
qartë() |
nëse i! = 14dhe i! = 17dhe i! = 20: |
nënproces. Hap (('' aplay ',' Audios/'+str (k)+'. wav ']) |
koha. gjumi (0.03) |
qartë() |
shtyp "Përgatit! / n", k |
koha. gjumi (1) |
k- = 1 |
gpio.output (i, gpio. HIGHT) #fikni llambat (një nga një) |
nënproces. Hap ((['aplay', 'Audios/go.wav']) #luan muzikën e fillimit |
koha. gjumi (0.03) |
qartë() |
shtyp "SHKO!" |
koha. gjumi (1) |
qartë() |
#tension i lexuar |
tensioni aktual = 0.00 |
tension1 = 0.00 |
për inrange (200): |
ser.flushInput () |
e mëparshme = tension1 |
tension1 = noton (ser.readline ()) #mbledh të dhënat e Arduino të transferuara nga RX-TX |
qartë() |
tensioni i printimit1, "V" |
nëse tensioni 1> tensioni aktual: |
rryma_tension = tension1 |
# në varësi të tensionit të gjeneruar, më shumë llamba ndizen. |
nëse tension1 <max/10: |
për i inrange (11, 24, 1): |
nëse i! = 14dhe i! = 17dhe i! = 20: |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = max/10: |
gpio.putput (11, gpio. LOW) |
për inrange (12, 24, 1): |
nëse i! = 14dhe i! = 17dhe i! = 20: |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = 2*max/10: |
për i inrange (11, 13, 1): |
gpio.putput (i, gpio. LOW) |
për i inrange (13, 24, 1): |
nëse i! = 14dhe i! = 17dhe i! = 20: |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = 3*max/10: |
për inrange (11, 14, 1): |
gpio.putput (i, gpio. LOW) |
për i inrange (15, 24, 1): |
nëse unë! = 17dhe unë! = 20: |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = 4*max/10: |
për i inrange (11, 16, 1): |
nëse unë! = 14: |
gpio.putput (i, gpio. LOW) |
për i inrange (16, 24, 1): |
nëse unë! = 17dhe unë! = 20: |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = 5*max/10: |
për inrange (11, 17, 1): |
nëse unë! = 14: |
gpio.putput (i, gpio. LOW) |
për inrange (18, 24, 1): |
nëse unë! = 20: |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = 6*max/10: |
për i inrange (11, 19, 1): |
nëse unë! = 14dhe unë! = 17: |
gpio.putput (i, gpio. LOW) |
për i inrange (19, 24, 1): |
nëse unë! = 20: |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = 7*max/10: |
për inrange (11, 20, 1): |
nëse unë! = 14dhe unë! = 17: |
gpio.putput (i, gpio. LOW) |
për i inrange (21, 24, 1): |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = 8*max/10: |
për i inrange (11, 22, 1): |
nëse i! = 14dhe i! = 17dhe i! = 20: |
gpio.putput (i, gpio. LOW) |
për i inrange (22, 24, 1): |
gpio.putput (i, gpio. HIGHT) |
nëse tension1> = 9*max/10: |
për i inrange (11, 23, 1): |
nëse i! = 14dhe i! = 17dhe i! = 20: |
gpio.putput (i, gpio. LOW) |
gpio.output (23, gpio. HIGHT) |
nëse tension1> = max: |
për i inrange (11, 24, 1): |
nëse i! = 14dhe i! = 17dhe i! = 20: |
gpio.putput (i, gpio. LOW) |
nëse tensioni 1 |
pushim |
#fikni llambat |
për i inrange (11, 24, 1): |
nëse i! = 14dhe i! = 17dhe i! = 20: |
gpio.putput (i, gpio. HIGHT) |
#muzikë fitore |
nëse tensioni aktual> = max: |
nënproces. Hap ((['aplay', 'Audios/rocky.wav']) |
koha. gjumi (0.03) |
qartë() |
printoni "SHUMY MIR, FITONI!"% (u '\u00c9', u '\u00ca', u '\u00c2') |
për inrange (10): |
për j inrange (11, 24, 1): |
nëse j! = 14and j! = 17dhe j! = 20: |
gpio.putput (j, gpio. LOW) |
koha. gjumi (0.05) |
për j inrange (11, 24, 1): |
nëse j! = 14and j! = 17dhe j! = 20: |
gpio.putput (j, gpio. HIGHT) |
koha. gjumi (0.05) |
koha. gjumi (0.5) |
nënproces. Hap ((['aplay', 'Audios/end.wav']) |
koha. gjumi (0.03) |
qartë() |
printoni "Përfundoni lojën … / n", tensionin aktual, "V" |
#regjistrime |
koha. gjumi (1.2) |
arriti = 0 |
për inrange (10): |
nëse tensioni aktual> tensioni : |
arriti+= 1 |
temp_voltage = tension |
tension = tension_ aktual |
tension_ aktual = tension_voltage |
temp_name = emri |
emri = emri aktual |
emri aktual = emri temp_ |
nëse arrihet> 0: |
nënproces. Hap ((['aplay', 'Audios/record.wav']) |
koha. gjumi (0.03) |
qartë() |
f = hapur ('regjistrimet', 'w') |
për inrange (10): |
f.shkruaj (emri ) |
f.shkruaj ("\ n") |
f.shkruani (str (tension )) |
f.shkruaj ("\ n") |
f. mbyll () |
qartë() |
shiko rawlamps_bike.py e pritur me ❤ nga GitHub
Hapi 8: Skema elektrike:
Arduino dhe Raspberry Pi 3 mundësohen nga një burim 5V me rrymë 3A.
Qarku elektrik fillon me lidhjen e gjeneratorit DC (të lidhur me biçikletën) me Arduino përmes një filtri tensioni të përbërë nga një diodë Zener prej 5.3V, një kondensatori 10μF dhe një rezistencë 1kΩ - hyrja e filtrit është e lidhur me terminalet e gjeneratorit dhe dalja lidhet me portën A0 dhe GND të kontrolluesit.
Arduino është i lidhur me mjedrën përmes komunikimit RX-TX-i kryer përmes një ndarësi rezistent duke përdorur rezistorë 10kΩ (të kërkuar nga portat e kontrolluesve që veprojnë në tensione të ndryshme).
GPIO -të e Raspberry Pi janë të lidhura me stafetat përgjegjëse për ndezjen e llambave. "COM" i të gjithë stafetëve ishte i ndërlidhur dhe i lidhur me fazën (rrjeti AC) dhe "N. O" (normalisht e hapur) e secilës stafetë ishte e lidhur me secilën llambë dhe neutralja e rrjetit AC ishte e ndërlidhur me të gjitha llambat. Kështu, kur aktivizohet GPIO përgjegjës për secilën stafetë, stafeta kalon në fazën e rrjetit AC dhe ndez llambën përkatëse.
Hapi 9: Rezultatet:
Pas montimit përfundimtar të projektit, u verifikua se ai funksionoi siç pritej - sipas shpejtësisë që përdoruesi pedalon në biçikletë, gjenerohet më shumë tension dhe ndizen më shumë llamba.