Inhoudsopgave:
- Stap 1: Materialen:
- Stap 2: Systeemblokkendiagram:
- Stap 3: Systeembediening:
- Stap 4: Mechanische aspecten
- Stap 5: Spanningsmeting:
- Stap 6: Arduino-programmering:
- Stap 7: Raspberry Pi 3 Programmeren:
- Stap 8: Elektrisch schema:
- Stap 9: Resultaten:
Video: Spanning opwekken met een ergometerfiets - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:18
De uitwerking van het project bestond uit het samenstellen van een "spel" met als doel een ergometerfiets in te trappen die is aangesloten op een generator en een toren van lampen die worden geactiveerd naarmate het motortoerental toeneemt - wat gebeurt op basis van het trappen van de fiets. Het systeem was gebaseerd op het uitlezen – via een analoge poort van een Arduino Mega – van de onmiddellijk gegenereerde spanning, het vervolgens verzenden van deze gegevens naar een Raspberry Pi 3 via seriële RX-TX-communicatie en de daaropvolgende activering van de lampen via relais.
Stap 1: Materialen:
- 1 Framboos Pi 3;
- 1 Arduino Mega 2560;
- 1 relaisscherm met 10 relais 12 V;
- 10 gloeilampen 127 V;
- 1 ergometerfiets;
- 1 Elektrische Machine (Generator) 12 V;
- Weerstanden (1x1kΩ, 2x10kΩ);
- 1 elektrolytische condensator 10 µF;
- 1 Zenerdiode 5,3 V;
- 1,5 mm kabel (rood, zwart, bruin);
- 1 MDF toren met steun voor 10 lampen.
Stap 2: Systeemblokkendiagram:
Stap 3: Systeembediening:
Het systeem is gebaseerd op de transformatie van de kinetische energie die wordt gegenereerd tijdens het fietsen in elektrische energie die verantwoordelijk is voor de activering van de relais die de lampen aanzetten.
De door de generator gegenereerde spanning wordt uitgelezen door een analoge pin van Arduino en via RX-TX naar de Raspberry Pi gestuurd. De activering van de relais is evenredig met de gegenereerde spanning - hoe hoger de spanning, hoe meer relais zullen worden geactiveerd en meer lampen zullen oplichten.
Stap 4: Mechanische aspecten
Om de gelijkstroomgenerator mechanisch aan de fiets te koppelen, moest het gordelsysteem worden vervangen door het systeem dat op gewone fietsen wordt gebruikt (bestaande uit een kroon, ketting en rondsel). Aan het fietsframe werd een metalen plaat gelast, zodat de motor met schroeven kon worden vastgezet. Daarna werd het rondsel aan de generatoras gelast, zodat de ketting kon worden geplaatst en het pedaalsysteem met de generator kon worden verbonden.
Stap 5: Spanningsmeting:
Om de spanning van de generator met behulp van Arduino te lezen, is het nodig om de positieve pool van de elektrische machine aan te sluiten op de A0-pin van de controller en de negatieve pool op de GND - om te voorkomen dat de maximale spanning van de generator groter is dan de 5 V van de Arduino-pinnen, een spanningsfilter met een condensator van 10 µF, een weerstand van 1 kΩ en een Zenerdiode van 5,3 V werden geconstrueerd en aangesloten tussen de controller en de generator. De firmware die in Arduino is geladen, is heel eenvoudig en bestaat alleen uit het lezen van een analoge poort, vermenigvuldigen van de waarde die wordt gelezen met de constante 0,0048828125 (5/1024, dat is de GPIO-spanning van de Arduino gedeeld door het aantal bits van de analoge poort) en het verzenden van de variabele naar de Serial - de code zal beschikbaar zijn in het artikel.
De procedure voor het inschakelen van RX-TX-communicatie in Raspberry Pi is iets ingewikkelder en u moet de procedure volgen die in de link wordt beschreven. In het kort, je moet een bestand met de naam "inittab" bewerken - dat zich in "/etc/inittab" bevindt -, commentaar geven op de regel "T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100" (als het bestand niet opgericht in het besturingssysteem van Raspberry, moet u het commando "sudo leafpad /boot/config.txt" invoeren en de regel "enable_uart=1" aan het einde van het bestand toevoegen). Zodra dit is gebeurd, moet u de LX-terminal opnieuw openen en de seriële uitschakelen met de commando's "sudo systemctl stop [email protected]" en "sudo systemctl uitschakelen [email protected]". Daarna moet je het commando "sudo leafpad /boot/cmdline.txt" uitvoeren, de regel "console = serial0, 115200" verwijderen, het bestand opslaan en het apparaat opnieuw opstarten. Om RX-TX-communicatie mogelijk te maken, moet de seriële bibliotheek op de Raspberry Pi worden geïnstalleerd met het commando "sudo apt-get install -f python-serial" en de bibliotheek in de code importeren door de regel "import serial" in te voegen, initialiseer het serienummer door de regel "ser = serial. Serial (" / dev / ttyS0 ", 9600)" in te voegen en de spanning te lezen die door de Arduino is verzonden met het commando "ser.readline()" - de volledige gebruikte code in Raspberry zal aan het einde van het artikel beschikbaar worden gesteld.
Door de hierboven beschreven procedure te volgen, is de stap voor het lezen en verzenden van de spanning voltooid.
Stap 6: Arduino-programmering:
Zoals eerder vermeld, is de code die verantwoordelijk is voor het lezen van de spanning die wordt gegenereerd tijdens het fietsen heel eenvoudig.
Ten eerste is het noodzakelijk om de A0-pin te kiezen als de verantwoordelijke voor het lezen van de spanning.
In de functie "void setup ()" moet u pin A0 instellen op INPUT met de opdracht "pinMode(sensor, INPUT)" en de transmissiesnelheid van de seriële poort selecteren met behulp van de opdracht "Serial.begin(9600)".
In de "void loop ()" wordt de functie "Serial.flush ()" gebruikt om de buffer te wissen telkens wanneer deze het verzenden van informatie via serieel beëindigt; de spanningsmeting wordt uitgevoerd door de functie "analogRead (sensor)" - onthoud dat het noodzakelijk is om de waarde die door de analoge poort wordt gelezen naar Volt te converteren - proces dat wordt vermeld in de sectie "voltage lezen" van het artikel.
In de functie "void loop ()" is het ook nodig om de variabele x van float naar string te converteren, aangezien dit de enige manier is om de variabele via RX-TX te verzenden. De laatste stap in de loop-functie is om de string in de seriële poort af te drukken zodat deze naar Raspberry kan worden gestuurd - hiervoor moet u de functie "Serial.println (y)" gebruiken. De regel "vertraging (100)" is alleen aan de code toegevoegd zodat de variabele wordt verzonden met intervallen van 100 ms - als deze tijd niet wordt gerespecteerd, zal de seriële overbelasting optreden, waardoor mogelijke crashes in het programma worden gegenereerd.
voltage_read.ino
vlottersensor = A0; |
voidsetup() { |
pinMode (sensor, INGANG); |
Serieel.begin(9600); |
} |
voidloop() { |
Serieel.flush(); |
float x=analogRead(sensor)*0.0048828125*16.67; |
Tekenreeks y=""; |
y+=x; |
Serieel.println(y); |
vertraging (100); |
} |
bekijk rawvoltage_read.ino gehost met ❤ door GitHub
Stap 7: Raspberry Pi 3 Programmeren:
lampen_bike.py
import os #import the os library (gebruikt om het scherm te wissen indien nodig) |
import RPi. GPIOas gpio #import bibliotheek gebruikt om de GPIO van Raspnerry te besturen |
import serial #import library verantwoordelijk voor de seriële communicatie |
import time #import bibliotheek die het mogelijk maakt om de vertragingsfunctie te gebruiken |
import subproces #import bibliotheek die verantwoordelijk is voor het afspelen van de nummers |
#start serie |
ser = serial. Serial("/dev/ttyS0", 9600) #definieer de apparaatnaam en de baudrate |
#leeg scherm |
clear =lambda: os.system('clear') |
#set pinnen voor relaisbesturing |
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 |
#start records |
name=["Geen"]*10 |
spanning=[0.00]*10 |
#read records-bestand |
f =open('records', 'r') |
voor i inrange(10): #de 10 beste scores verschijnen op de lijst |
naam=f.readline() |
naam=naam[:len(naam)-1] |
spanning=f.readline() |
voltage=float(voltage[:len(voltage)-1]) |
f.sluiten() |
Doorzichtig() |
#stel de maximale spanning in |
max = 50,00 |
#doe de lampen uit |
voor i binnenbereik (11, 24, 1): |
als ik!=14en ik!=17en ik!=20: |
gpio.output(i, gpio. HIGH) #ingesteld op HOOG, de relais zijn uitgeschakeld |
#begin |
whileTrue: |
#beginscherm |
print"Records:\n" |
voor ik binnen bereik (10): |
print naam, ":", spanning, "V" |
current_name=raw_input("Schrijf je naam om te beginnen: ") |
Doorzichtig() |
#Wijzig maximale waarde |
if current_name =="max": |
max=input("Schrijf de maximale spanning op: (2 cijfers achter de komma)") |
Doorzichtig() |
anders: |
#startwaarschuwing |
voor i binnenbereik (11, 24, 1): #de lus begint in de PIN 11 en stopt in PIN 24 |
if i!=14and i!=17and i!=20: #PIN 14 en 20 zijn GND-pinnen en 20 is een 3.3 V-pin |
gpio.output(i, gpio. LOW) #zet de lampen aan |
tijd.slaap(0.5) |
k=10 |
voor i binnenbereik (23, 10, -1): |
Doorzichtig() |
als ik!=14en ik!=17en ik!=20: |
subprocess. Popen(['aplay', 'Audios/'+str(k)+'.wav']) |
tijd.slaap(0.03) |
Doorzichtig() |
print"Bereid je voor!\n", k |
tijd.slaap(1) |
k-=1 |
gpio.output(i, gpio. HIGH) #zet de lampen uit (een voor een) |
subprocess. Popen(['aplay', 'Audios/go.wav']) #speelt de startmuziek |
tijd.slaap(0.03) |
Doorzichtig() |
afdrukken"GO!" |
tijd.slaap(1) |
Doorzichtig() |
#voltage lezen |
huidige_voltage=0.00 |
spanning1=0.00 |
voor ik binnen bereik (200): |
ser.flushInput() |
vorige=spanning1 |
voltage1=float(ser.readline()) #verzamelt Arduino's data overgedragen door RX-TX |
Doorzichtig() |
printspanning1, "V" |
als spanning1>stroom_spanning: |
huidige_voltage=voltage1 |
# afhankelijk van de opgewekte spanning gaan er meer lampjes branden. |
als spanning1<max/10: |
voor i binnenbereik (11, 24, 1): |
als ik!=14en ik!=17en ik!=20: |
gpio.output(i, gpio. HIGH) |
als spanning1>=max/10: |
gpio.output (11, gpio. LAAG) |
voor i binnen bereik (12, 24, 1): |
als ik!=14en ik!=17en ik!=20: |
gpio.output(i, gpio. HIGH) |
als spanning1>=2*max/10: |
voor i binnen bereik (11, 13, 1): |
gpio.output(i, gpio. LOW) |
voor i binnenbereik(13, 24, 1): |
als ik!=14en ik!=17en ik!=20: |
gpio.output(i, gpio. HIGH) |
als spanning1>=3*max/10: |
voor i binnen bereik (11, 14, 1): |
gpio.output(i, gpio. LOW) |
voor i binnenbereik (15, 24, 1): |
als ik!=17en ik!=20: |
gpio.output(i, gpio. HIGH) |
als spanning1>=4*max/10: |
voor i binnen bereik (11, 16, 1): |
als ik!=14: |
gpio.output(i, gpio. LOW) |
voor i binnen bereik (16, 24, 1): |
als ik!=17en ik!=20: |
gpio.output(i, gpio. HIGH) |
als spanning1>=5*max/10: |
voor i binnen bereik (11, 17, 1): |
als ik!=14: |
gpio.output(i, gpio. LOW) |
voor i binnen bereik (18, 24, 1): |
als ik!=20: |
gpio.output(i, gpio. HIGH) |
als spanning1>=6*max/10: |
voor i binnen bereik (11, 19, 1): |
als ik!=14en ik!=17: |
gpio.output(i, gpio. LOW) |
voor i binnen bereik (19, 24, 1): |
als ik!=20: |
gpio.output(i, gpio. HIGH) |
als spanning1>=7*max/10: |
voor i binnen bereik (11, 20, 1): |
als ik!=14en ik!=17: |
gpio.output(i, gpio. LOW) |
voor i binnenbereik(21, 24, 1): |
gpio.output(i, gpio. HIGH) |
als spanning1>=8*max/10: |
voor i binnen bereik (11, 22, 1): |
als ik!=14en ik!=17en ik!=20: |
gpio.output(i, gpio. LOW) |
voor i binnenbereik(22, 24, 1): |
gpio.output(i, gpio. HIGH) |
als spanning1>=9*max/10: |
voor i binnen bereik (11, 23, 1): |
als ik!=14en ik!=17en ik!=20: |
gpio.output(i, gpio. LOW) |
gpio.output(23, gpio. HOOG) |
als spanning1>=max: |
voor i binnen bereik (11, 24, 1): |
als ik!=14en ik!=17en ik!=20: |
gpio.output(i, gpio. LOW) |
als spanning1 |
pauze |
#doe de lampen uit |
voor i binnen bereik (11, 24, 1): |
als ik!=14en ik!=17en ik!=20: |
gpio.output(i, gpio. HIGH) |
#overwinningsmuziek |
if current_voltage>=max: |
subprocess. Popen(['aplay', 'Audios/rocky.wav']) |
tijd.slaap(0.03) |
Doorzichtig() |
print"HEEL GOED, JE HEBT GEWONNEN!"% (u'\u00c9', u'\u00ca', u'\u00c2') |
voor ik binnen bereik (10): |
voor j binnen bereik (11, 24, 1): |
als j!=14en j!=17en j!=20: |
gpio.output(j, gpio. LAAG) |
tijd.slaap(0.05) |
voor j binnen bereik (11, 24, 1): |
als j!=14en j!=17en j!=20: |
gpio.output(j, gpio. HOOG) |
tijd.slaap(0.05) |
tijd.slaap(0.5) |
subprocess. Popen(['aplay', 'Audios/end.wav']) |
tijd.slaap(0.03) |
Doorzichtig() |
print"Einde spel…\n", huidige_voltage, "V" |
#records |
tijd.slaap(1.2) |
bereikt=0 |
voor ik binnen bereik (10): |
als stroom_spanning > spanning : |
bereikt+=1 |
temp_voltage=voltage |
voltage=current_voltage |
huidige_voltage=temp_voltage |
temp_name=naam |
naam=huidige_naam |
huidige_naam=temp_naam |
indien bereikt >0: |
subprocess. Popen(['aplay', 'Audios/record.wav']) |
tijd.slaap(0.03) |
Doorzichtig() |
f =open('records', 'w') |
voor ik binnen bereik (10): |
f.schrijf(naam) |
f.write("\n") |
f.write(str(spanning)) |
f.write("\n") |
f.sluiten() |
Doorzichtig() |
bekijk rawlamps_bike.py gehost met ❤ door GitHub
Stap 8: Elektrisch schema:
De Arduino en de Raspberry Pi 3 worden gevoed door een 5V-bron met 3A-stroom.
Het elektrische circuit begint met de aansluiting van de DC-generator (gekoppeld aan de fiets) op de Arduino via een spanningsfilter bestaande uit een Zener-diode van 5,3V, een condensator van 10μF en een weerstand van 1kΩ - de filteringang is verbonden met de generatorterminals en de uitgang is verbonden met de A0-poort en de GND van de controller.
De Arduino is verbonden met Raspberry via RX-TX-communicatie - uitgevoerd via een resistieve verdeler met 10kΩ-weerstanden (vereist door de poorten van de controllers die op verschillende spanningen werken).
De GPIO's van Raspberry Pi zijn verbonden met de relais die verantwoordelijk zijn voor het inschakelen van de lampen. De "COM" van alle relais was onderling verbonden en verbonden met de fase (AC-net) en de "N. O" (normaal open) van elk relais was verbonden met elke lamp en de nulleider van het AC-net was verbonden met alle lampen. Dus, wanneer de GPIO die verantwoordelijk is voor elk relais wordt geactiveerd, wordt het relais geschakeld naar de fase van het AC-netwerk en schakelt de betreffende lamp in.
Stap 9: Resultaten:
Na de eindmontage van het project werd geverifieerd dat het werkte zoals verwacht - afhankelijk van de snelheid waarmee de gebruiker op de fiets trapt, wordt er meer spanning gegenereerd en gaan er meer lampen branden.
Aanbevolen:
Een condensator of een inductor meten met een mp3-speler: 9 stappen
Een condensator of een inductor meten met een mp3-speler: Hier is een eenvoudige techniek die kan worden gebruikt om de capaciteit en inductantie van een condensator en inductor nauwkeurig te meten zonder dure apparatuur. De meettechniek is gebaseerd op een gebalanceerde brug en kan eenvoudig worden geconstrueerd uit onde
Een lijn toevoegen aan een Boombox met een cassettespeler: 5 stappen
Een line-in toevoegen aan een boombox met een tapespeler: ** Zoals bij alle instructables, neem je je item / gezondheid / wat dan ook in eigen handen wanneer je het probeert! Houd rekening met hoge spanningen op het hoofdvoedingsbord, de hete soldeerbout, enz. Voorzichtig en geduldig zijn, zal u succes brengen. **NS
Een Halloween Scare Machine met behulp van een PIR, een 3D-geprinte pompoen en de Troll Arduino Compatible Audio Pranker/praktische Joke Board.: 5 stappen
Een Halloween Scare Machine met behulp van een PIR, een 3D-geprinte pompoen en het Troll Arduino-compatibele audio-pranker/praktische grapbord.: Het Troll-bord gemaakt door Patrick Thomas Mitchell van EngineeringShock Electronics, en niet zo lang geleden volledig gefinancierd op Kickstarter. Ik kreeg mijn beloning een paar weken te vroeg om te helpen bij het schrijven van enkele gebruiksvoorbeelden en het bouwen van een Arduino-bibliotheek in een po
Bouw een Apple HomeKit-temperatuursensorapparaat met een ESP8266 en een BME280: 10 stappen
Bouw een Apple HomeKit-temperatuursensorapparaat met behulp van een ESP8266 en een BME280: in de instructable van vandaag zullen we een goedkope temperatuur-, vochtigheids- en vochtsensor maken op basis van de AOSONG AM2302/DHT22 of BME280 temperatuur- / vochtigheidssensor, YL-69 vochtsensor en het ESP8266/Nodemcu-platform. En voor het weergeven van
Bedien tot 4 servo's met een smartphone of een ander apparaat met een audio-uitgang: 3 stappen
Bedien tot 4 servo's met behulp van een smartphone of elk apparaat met een audio-uitgang: hier presenteer ik een eenvoudige elektronische montage om maximaal vier servo's te besturen met elk apparaat dat een audiobestand kan lezen