Inhoudsopgave:

Op Arduino & MPU6050 gebaseerde digitale waterpas - Ajarnpa
Op Arduino & MPU6050 gebaseerde digitale waterpas - Ajarnpa

Video: Op Arduino & MPU6050 gebaseerde digitale waterpas - Ajarnpa

Video: Op Arduino & MPU6050 gebaseerde digitale waterpas - Ajarnpa
Video: How to use MPU6050 with Arduino | Step by step instructions [Code and Circuit Diagram] 2024, Juli-
Anonim
Image
Image
Het circuit
Het circuit

Welkom bij mijn allereerste instructable! Ik hoop dat u het informatief vindt. Aarzel niet om feedback achter te laten, zowel positief als negatief.

Dit project is om een op arduino & MPU6050 gebaseerde digitale waterpas te maken. Hoewel het voltooide ontwerp en de code van mij zijn, zijn het oorspronkelijke concept en veel van de code waar ik aan heb gewerkt dat niet. Ik hou niet van plagiaat, dus ik geef graag de eer aan degenen op wiens ideeën ik heb voortgebouwd. De twee belangrijkste mensen die ik wil bedanken zijn Paul McWhorter van YouTuber en DroneBot Workshop. Ik neem links naar hen op in mijn youtube-pdf met nuttige links. Dank ook aan EEEnthusiast voor zijn informatieve video over het gebruik van de MPU6050, inclusief het instellen en lezen van de module zonder een externe bibliotheek (zijn link staat in dezelfde PDF).

Het project dat ik heb geproduceerd, werkt 'zoals het is' en is sprookjesachtig nauwkeurig, zeker tot 45% in beide richtingen. Je kunt het precies gebruiken zoals ik het heb ontworpen, of je kunt het aanpassen aan je eigen smaak. De slimmeriken van jullie zullen opmerken dat mijn project er bijna identiek uitziet als het project dat is geproduceerd door de DroneBot-werkplaats, maar wees gerust, er zijn aanzienlijke verschillen, vooral als het gaat om de code voor het berekenen van hoeken, plus de mogelijkheid om kalibratiewaarden op te slaan in Eeprom!

Enkele functies om uw eetlust op te wekken:

Pitch-and-roll-hoeken beschikbaar tot 0,1 graad.

Automatische detectie van de oriëntatie van de gyro-eenheid (horizontaal of verticaal)

Volledige kalibratie met resultaten automatisch opgeslagen in eeprom

LED indicatie van -2 tot +2 graden (veranderbaar in code)

Extra hoorbare indicatie van niveau (kan direct aan/uit worden gezet)

Compacte stroom die minimale componenten vereist

Laten we beginnen.

Benodigdheden

Dit project (zoals het is) gebruikt de volgende items:

1 x Arduino nano (de mijne is een kloon)

1 x MPU6050 gyroscoop/versnellingsmetermodule

1 x LCD - 16 x 2 + I2C-aansluiting

1 x Druk om schakelaar te maken

1 x piëzo-zoemer

1 x groene LED

2 x gele LED's

2 x Rode LED's

5 x 220 ohm weerstanden

Diverse startkabels

Breadboard

Stroomvoorziening (de mijne gebruikte een 5v USB-powerbank, wanneer deze niet op mijn pc was aangesloten, maar je zou een op de juiste manier aangesloten batterij kunnen gebruiken)

Stap 1: Het circuit

Het circuit
Het circuit
Het circuit
Het circuit

Ervan uitgaande dat u alle componenten hebt, moet u uw breadboard bouwen.

Ik toon mijn setup als een gids, maar de verbindingen zijn als volgt:

Arduino pin D2 wordt aangesloten op 1 kant van de drukschakelaar. De andere kant van de drukschakelaar maakt verbinding met aarde

Arduino pin D3 wordt aangesloten op 1 kant van 220 ohm weerstand. Andere kant van weerstand wordt aangesloten op anode van rode LED. Kathode van rode LED gaat naar aarde.

Arduino pin D4 wordt aangesloten op 1 kant van 220 ohm weerstand. Andere kant van weerstand wordt aangesloten op anode van gele LED. Kathode van gele LED gaat naar aarde.

Arduino pin D5 wordt aangesloten op 1 kant van 220 ohm weerstand. Andere kant van weerstand wordt aangesloten op anode van groene LED. Kathode van groene LED gaat naar aarde.

Arduino pin D6 wordt aangesloten op 1 kant van 220 ohm weerstand. Andere kant van weerstand wordt aangesloten op anode van gele LED. Kathode van gele LED gaat naar aarde.

Arduino pin D7 wordt aangesloten op 1 kant van 220 ohm weerstand. Andere kant van weerstand wordt aangesloten op anode van rode LED. Kathode van rode LED gaat naar aarde.

Arduino-pin D8 wordt aangesloten op één kant van de piëzo-zoemer. De andere kant van de zoemer is verbonden met aarde.

Arduino-pin A4 maakt verbinding met SDA-pinnen op de MPU6050 EN het LCD-scherm.

Arduino pin A5 maakt verbinding met de SCL-pinnen op de MPU6050 EN de LCD

5v stroom en Gnd voor MPU6050 en LCD komen respectievelijk van de Arduino Nano 5v en GND pinnen.

Eenmaal voltooid, zou het vergelijkbaar moeten zijn met mijn getoonde setup. Ik heb blu tak onder de MPU6050 geplaatst om te voorkomen dat hij beweegt en ook op het LCD-scherm om hem aan de rand van het breadboard te houden.

Stap 2: De code

De bijgevoegde code is de code die ik voor dit project heb gebruikt. De enige bibliotheek waar u mogelijk een probleem mee heeft, is de

LiquidCrystal_I2C.h bibliotheek zoals ik deze importeerde toen ik voor het eerst met LCD's begon te werken. Helaas zijn er een paar bibliotheken die hetzelfde #include-statement gebruiken, maar iets anders zijn. Als je problemen hebt met de jouwe, zoek dan een andere LCD-code die voor jou werkt en pas de code dienovereenkomstig aan. Het is waarschijnlijk alleen de opstelling die verschilt. Alle 'print'-commando's zouden hetzelfde moeten werken.

Alle code is becommentarieerd en ervan uitgaande dat ik het goed heb gedaan, zal er ook een video zijn waarin alles wordt uitgelegd, maar hier zijn een paar punten om op te merken:

LiquidCrystal_I2C lcd (0x27, 16, 2);

De bovenstaande code is de setup voor mijn LCD. Als uw bibliotheek anders is, moet u mogelijk niet alleen uw bibliotheek, maar ook deze regel wijzigen.

{ lcd.setCursor (0, 1); lcd.print("Horizontaal!"); oriëntatie = HORIZONTAAL; // Lees de onbewerkte acc- en gyro-gegevens van de MPU-6050 1000 keer voor (int cal_int = 0; cal_int < 1000; cal_int ++) { read_mpu_6050_data (); // Voeg de gyro x offset toe aan de gyro_x_cal variabele gyro_x_cal += gyro_x; //Voeg de gyro y-offset toe aan de gyro_y_cal variabele gyro_y_cal += gyro_y; // Voeg de gyro z-offset toe aan de gyro_z_cal variabele gyro_z_cal += gyro_z; // Voeg de acc x offset toe aan de acc_x_cal variabele acc_x_cal += acc_x; //Voeg de acc y-offset toe aan de acc_y_cal variabele acc_y_cal += acc_y; } // Deel alle resultaten door 1000 om de gemiddelde offset gyro_x_cal /= 1000,0 te krijgen; gyro_y_cal /= 1000,0; gyro_z_cal /= 1000,0; acc_x_cal /= 1000,0; acc_y_cal /= 1000,0; horizontale Kalibratie = 255; eeprom_adres = 0; EEPROM.put (eeprom_address, horizontale kalibratie); eeprom_address += sizeof(int); EEPROM.put(eeprom_address, gyro_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_y_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_z_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_y_cal); eeprom_address += sizeof(float); //Let op: we slaan geen offset op voor acc_z, vanwege de zwaartekracht! vertraging (500); }

Het bovenstaande codeblok wordt uitgevoerd naar de kalibratieroutine. Deze code is voor de horizontale kalibratie. Er is een bijna identieke code voor de verticale kalibratie (let op, de code weet of uw MPU6050 horizontaal of verticaal is gemonteerd!). MPU6050, wordt 1000 keer gelezen. geschikte waarden worden cumulatief opgeteld en vervolgens gedeeld door 1000 om een gemiddelde 'offset'-waarde te geven. Deze waarden worden vervolgens opgeslagen in de Nano eeprom. Alle horizontale kalibratiewaarden worden opgeslagen vanaf eeprom-adres 0. Alle verticale waarden worden opgeslagen vanaf eeprom-adres 24. De kalibratie MOET op een volledig vlak oppervlak worden uitgevoerd, anders betekenen ze niets.

/* * De volgende paar regels verwerken de onbewerkte gegevens om deze te veranderen in hoeken die kunnen worden uitgevoerd naar de LCD en LED's. * De waarde van 4096, waarmee de acceleratiegegevens worden gedeeld, is afkomstig uit de MPU6050-datasheet en is gebaseerd op de samplefrequentie. * De waarde van 9,8 is zwaartekracht * De atan2-functie komt uit de wiskundemodule en wordt gebruikt om de hoeken uit de gegeven gegevens te berekenen */ thetaM =-atan2((acc_x/4096.0)/9.8, (acc_z/4096.0)/9.8) /2/3.141592656 * 360; //Ruwe data phiM =-atan2((acc_y/4096.0)/9.8, (acc_z/4096.0)/9.8)/2/3.141592656 * 360; //Onbewerkte gegevens dt=(millis()-millisOld)/1000.; millisOld=millis(); /* * Deze sectie gebruikt de gyrogegevens om het systeem responsiever te maken * de waarde van 65,5, waar de gyrogegevens door worden gedeeld, is afkomstig uit de MPU6050-datasheet en is gebaseerd op de samplefrequentie */ theta=(theta+(gyro_y/ 65.5)*dt)*.96 + thetaM*.04; //Laagdoorlaatfilter phi=(phi+(gyro_x/65.5)*dt)*.96 + phiM*.04; //Laagdoorlaatfilter

De bovenstaande code is het spul dat de hoeken berekent. Hopelijk geven de opmerkingen een beetje inzicht in hoe het werkt, maar voor een diepgaande uitleg, bekijk de Paul McWhorters-video waarnaar wordt gelinkt in de bijgevoegde PDF. Wat ik echter wel wil zeggen, is dat je de samplefrequentie voor de gyro en accelerometer kunt wijzigen (wat wordt gedaan in de MPU6050-subroutine onderaan mijn code). Als u de samplefrequentie wijzigt, moet u ook wijzigen hoeveel de onbewerkte gegevens worden gedeeld door. Voor de versnellingsmetergegevens is de huidige waarde 4096. Voor de gyro is de huidige waarde 65,5.

Raadpleeg de bijgevoegde datasheets en de video van EEEntusiast (link in de bijgevoegde PDF) voor meer diepgaande informatie over hoe de bemonsterings- en offsetwaarden worden gevonden.

Stap 3: Volgende stappen

Op dit punt zal hopelijk dit project hebben gemaakt, maar wat nu?

Ten eerste, waarom zou u het niet daadwerkelijk inbouwen in een waterpas die u kunt gebruiken. Je kunt een goedkope waterpas kopen (zorg ervoor dat het het doostype is) die je kunt aanpassen, of, als je de kit hebt, je eigen waterpas/doos printen.

Misschien eens spelen met de bemonsteringsfrequenties van de gyro en de accelerometer om te zien of ze bij de ene snelheid beter werken dan bij de andere.

Probeer de code verder te verfijnen. Op dit moment is de aangegeven hoek bijvoorbeeld boven de 45 graden op zijn zachtst gezegd ruw. Is er een manier om het heen?

Als je vragen hebt, hoe eenvoudig ze ook lijken, stel ze gerust. Als ik kan helpen, zal ik dat doen.

Als je dit instructable leuk vindt, geef het dan een like, zodat ik het weet.

Als je dit maakt, laat het me dan zien (vooral als het in een werkende koffer is).

BEDANKT

Aanbevolen: