Innholdsfortegnelse:

Arduino og MPU6050 basert digitalt vater: 3 trinn
Arduino og MPU6050 basert digitalt vater: 3 trinn

Video: Arduino og MPU6050 basert digitalt vater: 3 trinn

Video: Arduino og MPU6050 basert digitalt vater: 3 trinn
Video: gy-521 mpu 6050 гироскоп для arduino обзор 2024, November
Anonim
Image
Image
Kretsen
Kretsen

Velkommen til min første instruerbare noensinne! Jeg håper du finner det informativt. Kom gjerne med tilbakemeldinger, enten positive eller negative.

Dette prosjektet skal lage et arduino- og MPU6050 -basert digitalt vaterpas. Selv om den ferdige designen og koden er min, er ikke det originale konseptet og mye av koden jeg har jobbet ut fra. Jeg er ikke interessert i plagiat, så jeg er mer enn glad for å gi æren til de som har ideer jeg har bygget videre på. De to hovedpersonene jeg vil rope ut til er YouTubers Paul McWhorter og DroneBot Workshop. Jeg inkluderer lenker til dem i min youtube nyttige lenker PDF. Takk også til EEEnthusiast for hans informative video om bruk av MPU6050, inkludert oppsett og lesing fra modulen uten et eksternt bibliotek (lenken hans er i samme PDF).

Prosjektet jeg har produsert, fungerer 'som det er' og er fairy -nøyaktig, sikkert opptil 45% i begge retninger. Du kan bruke den akkurat som jeg har designet den, eller du kan skreddersy den etter din egen smak. De mer forstandige av dere vil legge merke til at prosjektet mitt ser nesten identisk ut med det som ble produsert av DroneBot -verkstedet, men vær trygg, det er betydelige forskjeller, spesielt når det gjelder koden for beregning av vinkler, pluss muligheten til å lagre kalibreringsverdier i Eeprom!

Noen funksjoner for å øke appetitten:

Pitch and roll vinkler tilgjengelig innen 0,1 grad.

Automatisk oppdagelse av orienteringen til gyroenheten (horisontal eller vertikal)

Full kalibrering med resultater lagret automatisk på eeprom

LED -indikasjon fra -2 til +2 grader (kan endres i kode)

Ytterligere hørbar indikasjon på nivå (kan slås på/av på flyet)

Kompakt kurv som krever minimale komponenter

La oss komme i gang.

Rekvisita

Dette prosjektet (som det er) bruker følgende elementer:

1 x Arduino nano (min er en klon)

1 x MPU6050 gyro/akselerometer -modul

1 x LCD - 16 x 2 + I2C -tilkobling

1 x Trykk for å gjøre bryteren

1 x Piezo -summer

1 x grønn LED

2 x gule lysdioder

2 x røde lysdioder

5 x 220 ohm motstander

Ulike startkabler

Brødbrett

Strømforsyning (min brukte en 5v USB strømbank når den ikke var koblet til PCen min, men du kan bruke et batteri riktig tilkoblet)

Trinn 1: Kretsen

Kretsen
Kretsen
Kretsen
Kretsen

Forutsatt at du har alle komponentene, må du bygge brødbrettet.

Jeg viser oppsettet mitt som en guide, men tilkoblinger er som følger:

Arduino pin D2 kobles til 1 side av trykkbryteren. Den andre siden av trykkbryteren kobles til bakken

Arduino pin D3 kobles til 1 side av 220 ohm motstand. Den andre siden av motstanden kobles til annode av rød LED. Katode av rød LED går til bakken.

Arduino pin D4 kobles til 1 side av 220 ohm motstand. Den andre siden av motstanden kobles til annode av gul LED. Katoden av gul LED går til bakken.

Arduino pin D5 kobles til 1 side av 220 ohm motstand. Den andre siden av motstanden kobles til annoden til grønn LED. Katode av grønn LED går til bakken.

Arduino pin D6 kobles til 1 side av 220 ohm motstand. Den andre siden av motstanden kobles til annode av gul LED. Katoden av gul LED går til bakken.

Arduino pin D7 kobles til 1 side av 220 ohm motstand. Den andre siden av motstanden kobles til annode av rød LED. Katode av rød LED går til bakken.

Arduino pin D8 kobles til den ene siden av Piezo summer. Den andre siden av summeren kobles til bakken.

Arduino -pinne A4 kobles til SDA -pinner på MPU6050 OG LCD -skjermen.

Arduino -pinne A5 kobles til SCL -pinnene på MPU6050 OG LCD -skjermen

5v strøm og Gnd for MPU6050 og LCD kommer fra henholdsvis Arduino Nano 5v og GND pins.

Når den er fullført, skal den være lik oppsettet mitt som vises. Jeg la blu tak under MPU6050 for å stoppe den i bevegelse og også på LCD -skjermen for å holde den på kanten av brødbrettet.

Trinn 2: Koden

Koden vedlagt er koden jeg har brukt til dette prosjektet. Det eneste biblioteket du kan ha et problem med er

LiquidCrystal_I2C.h bibliotek da jeg importerte dette da jeg først begynte å jobbe med LCD -er. Dessverre er det noen få biblioteker som bruker den samme #include -setningen, men er litt forskjellige. Hvis du har problemer med din, finner du en annen LCD -kode som fungerer for deg, og endrer koden deretter. Det er bare sannsynlig at oppsettet er forskjellig. Alle 'print' kommandoer skal fungere det samme.

All koden har blitt kommentert og forutsatt at jeg har gjort det riktig, vil det også være en video som forklarer alt, men her er noen få punkter å merke seg:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Koden ovenfor er oppsettet for LCD -skjermen min. Hvis biblioteket ditt er annerledes, må du kanskje ikke bare endre biblioteket ditt, men også denne linjen.

{lcd.setCursor (0, 1); lcd.print ("Horisontal!"); orientering = HORIZONTAL; // Les rådata og gyrodata fra MPU-6050 1000 ganger for (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Legg til gyro x -forskyvningen i gyro_x_cal -variabelen gyro_x_cal += gyro_x; // Legg til gyro y -forskyvningen i gyro_y_cal -variabelen gyro_y_cal += gyro_y; // Legg til gyro z -forskyvningen i gyro_z_cal -variabelen gyro_z_cal += gyro_z; // Legg til acc x -forskyvningen i acc_x_cal -variabelen acc_x_cal += acc_x; // Legg til acc y -forskyvningen i acc_y_cal -variabelen acc_y_cal += acc_y; } // Del alle resultatene med 1000 for å få gjennomsnittlig forskyvning gyro_x_cal /= 1000.0; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000,0; acc_x_cal /= 1000,0; acc_y_cal /= 1000,0; horisontal kalibrering = 255; eeprom_address = 0; EEPROM.put (eeprom_adresse, horisontal kalibrering); 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); // Merk at vi ikke lagrer en forskyvning for acc_z, på grunn av tyngdekraften! forsinkelse (500); }

Ovennevnte kodeblokk kjøres til kalibreringsrutine. Denne koden er for den horisontale kalibreringen. Det er nesten identisk kode for den vertikale kalibreringen (merk at koden vet om MPU6050 er montert horisontalt eller vertikalt!). MPU6050, blir lest 1000 ganger. passende verdier blir kumulativt lagt til og deretter delt med 1000 for å gi en gjennomsnittlig 'offset' verdi. Disse verdiene lagres deretter på Nano -eeprom. Alle horisontale kalibreringsverdier lagres fra og med eeprom -adresse 0. Alle vertikale verdier lagres i begynnelsen på eeprom -adressen 24. Kalibreringen MÅ gjøres på en helt plan overflate, ellers betyr de ingenting.

/ * * De neste linjene behandler rådataene for å endre det til vinkler som kan sendes ut til LCD og LED. * Verdien på 4096, som akselerasjonsdataene deles med, er hentet fra MPU6050 -databladet og er basert på samplingshastighet. * Verdien på 9,8 er tyngdekraften * Atan2-funksjonen er fra matemodulen og brukes til å beregne vinklene fra de gitte dataene */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // rådata phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // rådata dt = (millis ()-millisOld)/1000.; millisOld = millis (); / * * Denne delen bruker gyrodataene for å gjøre systemet mer responsivt * verdien på 65,5, som gyrodataene er delt med, er hentet fra MPU6050 -databladet og er basert på samplingshastigheten */ theta = (theta+(gyro_y/ 65,5)*dt)*. 96 + thetaM*.04; // Lavpassfilter phi = (phi + (gyro_x/65,5)*dt)*. 96 + phiM*.04; // Lavpassfilter

Koden ovenfor er ting som beregner vinklene. Forhåpentligvis gir kommentarene et lite innblikk i hvordan det fungerer, men for en grundig forklaring, sjekk Paul McWhorters -videoen som er lenket til i vedlagte PDF. Det jeg vil si er at du kan endre samplingsfrekvensen for gyroen og akselerometeret (som gjøres i oppsettet MPU6050 -underprogrammet nederst i koden min). Hvis du endrer samplingshastigheten, må du også endre hvor mye rådata er delt på. For akselerometerdataene er gjeldende verdi 4096. For gyroen er gjeldende verdi 65,5.

Se de vedlagte databladene og videoen fra EEEntusiast (lenke i vedlagte PDF) for mer detaljert informasjon om hvordan prøve- og forskyvningsverdiene blir funnet.

Trinn 3: Neste trinn

På dette tidspunktet vil forhåpentligvis ha laget dette prosjektet, men hva nå?

For det første, hvorfor egentlig ikke bygge det inn på et vater som du kan bruke. Du kan kjøpe et billig vaterpas (sørg for at det er boksetypen) som du kan tilpasse, eller hvis du har settet, kan du skrive ut ditt eget nivå/eske.

Kanskje leke med gyro- og akselerometerprøvehastighetene for å se om de fungerer bedre i en takt enn en annen.

Prøv å finjustere koden ytterligere. For eksempel, for tiden, utover 45 grader, er den angitte vinkelen minst grov. Er det en vei rundt det?

Hvis du har spørsmål, uansett hvor enkle de kan virke, kan du spørre. Hvis jeg kan hjelpe, vil jeg.

Hvis du liker dette instruerbart, vennligst gi det et like, så jeg vet det.

Hvis du lager dette, vennligst vis meg (spesielt hvis det er i en arbeidssak).

TAKK SKAL DU HA

Anbefalt: