Innehållsförteckning:
Video: Generera spänning med en ergometercykel: 9 steg (med bilder)
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-13 06:58
Projektets utarbetande bestod i montering av ett "spel" med syftet att trampa i en ergometercykel ansluten till en generator och ett torn med lampor som aktiveras när motorvarvtalet ökar - vilket sker till följd av cykelpedalen. Systemet baserades på att läsa-genom en analog port på en Arduino Mega-den omedelbara spänningen som genererades och sedan överföra dessa data till en Raspberry Pi 3 via seriell RX-TX-kommunikation och efterföljande aktivering av lamporna via relä.
Steg 1: Material:
- 1 hallon Pi 3;
- 1 Arduino Mega 2560;
- 1 Reläskydd med 10 reläer 12 V;
- 10 glödlampor 127 V;
- 1 Ergometercykel;
- 1 elektrisk maskin (generator) 12 V;
- Motstånd (1x1kΩ, 2x10kΩ);
- 1 elektrolytkondensator 10 µF;
- 1 zenerdiod 5,3 V;
- 1,5 mm kabel (röd, svart, brun);
- 1 MDF -torn med stöd för 10 lampor.
Steg 2: Systemblock Diagram:
Steg 3: Systemdrift:
Systemet är baserat på transformationen av den rörelseenergi som genereras när cykeln cyklas i elektrisk energi som är ansvarig för aktiveringen av reläerna som tänder lamporna.
Spänningen som genereras av generatorn läses av en analog pin av Arduino och skickas via RX-TX till Raspberry Pi. Aktiveringen av reläerna är proportionell mot den genererade spänningen - ju högre spänning, desto fler reläer utlöses och fler lampor tänds.
Steg 4: Mekaniska aspekter
För att mekaniskt koppla likströmsgeneratorn till cykeln måste bältessystemet bytas ut mot systemet som används på vanliga cyklar (bestående av en krona, kedja och pinjong). En metallplatta svetsades fast på cykelramen så att motorn kunde säkras med skruvar. Därefter svetsades kugghjulet till generatoraxeln så att kedjan kunde placeras och kopplade pedalsystemet till generatorn.
Steg 5: Spänningsavläsning:
För att läsa generatorns spänning med Arduino är det nödvändigt att ansluta den elektriska maskinens positiva pol till A0 -stiftet på styrenheten och den negativa polen till GND - för att undvika att generatorns maximala spänning är större än 5 V på Arduino -stift, ett spänningsfilter med en kondensator på 10 µF, ett motstånd på 1 kΩ och en zenerdiod på 5,3 V konstruerades och kopplades mellan styrenheten och generatorn. Den fasta programvaran som laddas i Arduino är mycket enkel och består bara av att läsa en analog port, multiplicera värdet som läses med konstanten 0,0048828125 (5/1024, det vill säga Arduinos GPIO -spänning dividerat med antalet bitar i den analoga porten) och skicka variabel till serien - koden kommer att finnas tillgänglig i artikeln.
Proceduren för att aktivera RX-TX-kommunikation i Raspberry Pi är lite mer komplex, och du måste följa proceduren som beskrivs i länken. I korthet måste du redigera en fil som heter "inittab" -som finns i "/etc/inittab" -, kommentera raden "T0: 23: respawn:/sbin/getty -L ttyAMA0 115200 vt100" (om filen inte är grundat i Raspberry's OS måste du ange kommandot: "sudo leafpad /boot/config.txt" och lägg till raden "enable_uart = 1" i slutet av filen). När detta är gjort måste du öppna LX-terminalen igen och inaktivera Serial med kommandona "sudo systemctl stop [email protected]" och "sudo systemctl disable [email protected]". Efter det måste du utföra kommandot "sudo leafpad /boot/cmdline.txt", radera raden "console = serial0, 115200", spara filen och starta om enheten. För att RX-TX-kommunikation ska vara möjlig måste seriebiblioteket installeras på Raspberry Pi med kommandot "sudo apt-get install -f python-serial" och importera biblioteket till koden genom att infoga "import serial" -raden, initiera serien genom att infoga raden "ser = serial. Serial (" / dev / ttyS0 ", 9600)" och avläsning av spänningen som skickas av Arduino med kommandot "ser.readline ()" - hela koden som används i Hallon kommer att göras tillgängligt i slutet av artikeln.
Efter proceduren som beskrivs ovan är steget för läsning och sändning av spänning klart.
Steg 6: Arduino -programmering:
Som tidigare sagts är koden som är ansvarig för att läsa spänningen som genereras vid cykling mycket enkel.
För det första är det nödvändigt att välja A0 -stift som ansvarig för avläsning av spänningen.
I funktionen "void setup ()" måste du ställa in stift A0 på INPUT med kommandot "pinMode (sensor, INPUT)" och välja överföringshastigheten för den seriella porten med kommandot "Serial.begin (9600)".
I "void loop ()" används "Serial.flush ()" -funktionen för att rensa bufferten varje gång den avslutar att skicka information via serie; spänningsavläsningen utförs med funktionen "analogRead (sensor)" - kom ihåg att det är nödvändigt att konvertera värdet som läses av den analoga porten till Volt - process som anges i avsnittet "lässpänning" i artikeln.
I funktionen "void loop ()" är det också nödvändigt att konvertera variabeln x från float till string, eftersom detta är det enda sättet att skicka variabeln via RX-TX. Det sista steget i loop -funktionen är att skriva ut strängen i serieporten så att den kan skickas till Raspberry - för detta måste du använda funktionen "Serial.println (y)". Raden "fördröjning (100)" har lagts till i koden endast så att variabeln skickas i intervall om 100 ms - om denna tid inte respekteras kommer den seriella överbelastningen att inträffa, vilket genererar möjliga krascher i programmet.
voltage_read.ino
flottörsensor = A0; |
voidsetup () { |
pinMode (sensor, INGÅNG); |
Serial.begin (9600); |
} |
voidloop () { |
Serial.flush (); |
float x = analogRead (sensor)*0,0048828125*16,67; |
Sträng y = ""; |
y+= x; |
Serial.println (y); |
fördröjning (100); |
} |
visa rawvoltage_read.ino värd med ❤ av GitHub
Steg 7: Programmering av Raspberry Pi 3:
lampor_cykel.py
importera os #importera os -biblioteket (används för att rensa skärmen vid behov) |
importera RPi. GPIOas gpio #importbibliotek som används för att styra Raspnerrys GPIO |
importera seriellt #importbibliotek som ansvarar för den seriella kommunikationen |
importtid #importbibliotek som gör det möjligt att använda fördröjningsfunktionen |
importera delprocess #importbibliotek som ansvarar för att spela låtarna |
#startserie |
ser = serial. Serial ("/dev/ttyS0", 9600) #definiera enhetens namn och överföringshastighet |
#rensa skärmen |
clear = lambda: os.system ('clear') |
#set pins för reläkontroll |
gpio.setmode (gpio. BOARD) |
gpio.setup (11, gpio. OUT) #lampa 10 |
gpio.setup (12, gpio. OUT) #lampa 9 |
gpio.setup (13, gpio. OUT) #lampa 8 |
gpio.setup (15, gpio. OUT) #lampa 7 |
gpio.setup (16, gpio. OUT) #lampa 6 |
gpio.setup (18, gpio. OUT) #lampa 5 |
gpio.setup (19, gpio. OUT) #lampa 4 |
gpio.setup (21, gpio. OUT) #lampa 3 |
gpio.setup (22, gpio. OUT) #lampa 2 |
gpio.setup (23, gpio. OUT) #lampa 1 |
#startposter |
name = ["None"]*10 |
spänning = [0,00]*10 |
#read records file |
f = open ('records', 'r') |
för i inrange (10): #de 10 bästa poängen visas på listan |
namn = f.readline () |
namn = namn [: len (namn )-1] |
spänning = f.readline () |
spänning = float (spänning [: len (spänning )-1]) |
f.close () |
klar() |
#ställ in maxspänningen |
max = 50,00 |
#släck lamporna |
för i intervall (11, 24, 1): |
om jag! = 14och jag! = 17och jag! = 20: |
gpio.output (i, gpio. HIGH) #inställd på HIGH, reläerna är avstängda |
#Start |
whileTrue: |
#initial skärm |
skriv ut "poster: / n" |
för i intervall (10): |
utskriftsnamn , ":", spänning , "V" |
current_name = raw_input ("Skriv ditt namn för att börja:") |
klar() |
#Ändra maxvärde |
om current_name == "max": |
max = input ("Skriv maxspänningen: (2 decimaler)") |
klar() |
annan: |
#startvarning |
för i intervall (11, 24, 1): #slingan börjar i PIN 11 och stannar med PIN 24 |
om i! = 14och i! = 17 och i! = 20: #PIN 14 och 20 är GND -stift och 20 är ett 3,3 V -stift |
gpio.output (i, gpio. LOW) #tänd lamporna |
tid. sover (0,5) |
k = 10 |
för i intervall (23, 10, -1): |
klar() |
om jag! = 14och jag! = 17och jag! = 20: |
delprocess. Popen (['aplay', 'Audios/'+str (k)+'. wav']) |
time.sleep (0,03) |
klar() |
print "Förbered! / n", k |
tid. sover (1) |
k- = 1 |
gpio.output (i, gpio. HIGH) #släck lamporna (en efter en) |
delprocess. Popen (['aplay', 'Audios/go.wav']) #spelar startmusiken |
time.sleep (0,03) |
klar() |
skriva ut "GO!" |
tid. sover (1) |
klar() |
#spänning läst |
strömspänning = 0,00 |
spänning1 = 0,00 |
för i intervall (200): |
ser.flushInput () |
föregående = spänning1 |
voltage1 = float (ser.readline ()) #collects Arduinos data överförd av RX-TX |
klar() |
utskriftsspänning1, "V" |
om spänning1> strömspänning: |
ström_spänning = spänning1 |
# beroende på genererad spänning tänds fler lampor. |
om spänning1 <max/10: |
för i intervall (11, 24, 1): |
om jag! = 14och jag! = 17och jag! = 20: |
gpio.output (i, gpio. HIGH) |
om spänning1> = max/10: |
gpio.output (11, gpio. LOW) |
för i intervall (12, 24, 1): |
om jag! = 14och jag! = 17och jag! = 20: |
gpio.output (i, gpio. HIGH) |
om spänning1> = 2*max/10: |
för i intervall (11, 13, 1): |
gpio.output (i, gpio. LOW) |
för i intervall (13, 24, 1): |
om jag! = 14och jag! = 17och jag! = 20: |
gpio.output (i, gpio. HIGH) |
om spänning1> = 3*max/10: |
för i intervall (11, 14, 1): |
gpio.output (i, gpio. LOW) |
för i intervall (15, 24, 1): |
om jag! = 17och jag! = 20: |
gpio.output (i, gpio. HIGH) |
om spänning1> = 4*max/10: |
för i intervall (11, 16, 1): |
om jag! = 14: |
gpio.output (i, gpio. LOW) |
för i intervall (16, 24, 1): |
om jag! = 17och jag! = 20: |
gpio.output (i, gpio. HIGH) |
om spänning1> = 5*max/10: |
för i intervall (11, 17, 1): |
om jag! = 14: |
gpio.output (i, gpio. LOW) |
för i intervall (18, 24, 1): |
om jag! = 20: |
gpio.output (i, gpio. HIGH) |
om spänning1> = 6*max/10: |
för i intervall (11, 19, 1): |
om jag! = 14och jag! = 17: |
gpio.output (i, gpio. LOW) |
för i intervall (19, 24, 1): |
om jag! = 20: |
gpio.output (i, gpio. HIGH) |
om spänning1> = 7*max/10: |
för i intervall (11, 20, 1): |
om jag! = 14och jag! = 17: |
gpio.output (i, gpio. LOW) |
för i intervall (21, 24, 1): |
gpio.output (i, gpio. HIGH) |
om spänning1> = 8*max/10: |
för i intervall (11, 22, 1): |
om jag! = 14och jag! = 17och jag! = 20: |
gpio.output (i, gpio. LOW) |
för i intervall (22, 24, 1): |
gpio.output (i, gpio. HIGH) |
om spänning1> = 9*max/10: |
för i intervall (11, 23, 1): |
om jag! = 14och jag! = 17och jag! = 20: |
gpio.output (i, gpio. LOW) |
gpio.output (23, gpio. HIGH) |
om spänning1> = max: |
för i intervall (11, 24, 1): |
om jag! = 14och jag! = 17och jag! = 20: |
gpio.output (i, gpio. LOW) |
om spänning1 |
ha sönder |
#släck lamporna |
för i intervall (11, 24, 1): |
om jag! = 14och jag! = 17och jag! = 20: |
gpio.output (i, gpio. HIGH) |
#viktorisk musik |
om strömspänning> = max: |
delprocess. Popen (['aplay', 'Audios/rocky.wav']) |
time.sleep (0,03) |
klar() |
skriv ut "MYCKET BRA, DU VINNADE!"% (u '\u00c9', u '\u00ca', u '\u00c2') |
för i intervall (10): |
för j intervall (11, 24, 1): |
om j! = 14 och j! = 17 och j! = 20: |
gpio.output (j, gpio. LOW) |
time.sleep (0,05) |
för j intervall (11, 24, 1): |
om j! = 14 och j! = 17 och j! = 20: |
gpio.output (j, gpio. HIGH) |
time.sleep (0,05) |
tid. sover (0,5) |
delprocess. Popen (['aplay', 'Audios/end.wav']) |
time.sleep (0,03) |
klar() |
skriv ut "Avsluta spelet … / n", aktuell spänning, "V" |
#uppgifter |
time.sleep (1,2) |
nådde = 0 |
för i intervall (10): |
om strömspänning> spänning : |
nådde+= 1 |
temp_voltage = spänning |
spänning = strömspänning |
current_voltage = temp_voltage |
temp_name = namn |
namn = aktuellt_namn |
current_name = temp_name |
om nått> 0: |
delprocess. Popen (['aplay', 'Audios/record.wav']) |
time.sleep (0,03) |
klar() |
f = open ('records', 'w') |
för i intervall (10): |
f.write (namn ) |
f.write ("\ n") |
f.write (str (spänning )) |
f.write ("\ n") |
f.close () |
klar() |
visa rawlamps_bike.py värd med ❤ av GitHub
Steg 8: Elschema:
Arduino och Raspberry Pi 3 drivs av en 5V -källa med 3A ström.
Den elektriska kretsen börjar med anslutningen av DC -generatorn (kopplad till cykeln) till Arduino genom ett spänningsfilter som består av en Zenerdiod på 5,3V, en kondensator på 10μF och ett motstånd på 1kΩ - filteringången är ansluten till generatoruttag och utgången är ansluten till A0 -porten och regulatorns GND.
Arduino är ansluten till Raspberry via RX-TX-kommunikation-utförs via en resistiv avdelare med 10kΩ motstånd (krävs av styrenhetens portar som arbetar vid olika spänningar).
Raspberry Pi: s GPIO är anslutna till reläerna som ansvarar för att tända lamporna. "COM" för alla reläer var sammankopplade och anslutna till fasen (AC -nät) och "N. O" (normalt öppet) för varje relä var anslutet till varje lampa och AC -nätets neutral var ansluten till alla lampor. Således, när GPIO som ansvarar för varje relä aktiveras, växlar reläet till fasen i AC -nätet och tänder respektive lampa.
Steg 9: Resultat:
Efter den slutliga monteringen av projektet verifierades det att det fungerade som förväntat - beroende på hastigheten som användaren trampar på cykeln genereras mer spänning och fler lampor tänds.