Arduino & MPU6050 -baserad digital vattenpass: 3 steg
Arduino & MPU6050 -baserad digital vattenpass: 3 steg
Anonim
Image
Image
Kretsen
Kretsen

Välkommen till min första instruerbara någonsin! Jag hoppas att du tycker att det är informativt. Lämna gärna feedback om den är positiv eller negativ.

Detta projekt är att göra en arduino & MPU6050 baserad digital vattenpass. Medan den färdiga designen och koden är min, är det ursprungliga konceptet och mycket av koden jag har arbetat utifrån inte. Jag är inte intresserad av plagiat, så jag ger mer än gärna kredit till dem som har idéer som jag har byggt vidare på. De två huvudpersonerna jag vill skrika ut till är YouTubers Paul McWhorter och DroneBot Workshop. Jag inkluderar länkar till dem i min youtube användbara länkar PDF. Tack också till EEEnthusiast för hans informativa video om hur man använder MPU6050 inklusive installation och läsning från modulen utan ett externt bibliotek (hans länk finns i samma PDF).

Projektet jag har tagit fram, fungerar "som det är" och är fairy -korrekt, säkert upp till 45% åt båda hållen. Du kan använda den precis som jag har designat den, eller så kan du skräddarsy den efter din egen smak. De mer kloka av dig kommer att märka att mitt projekt ser nästan identiskt ut med det som producerades av DroneBot -verkstaden, men var säker på att det finns betydande skillnader, särskilt när det gäller koden för beräkning av vinklar, plus möjligheten att lagra kalibreringsvärden i Eeprom!

Några funktioner för att väcka din aptit:

Pitch and roll -vinklar tillgängliga inom 0,1 grad.

Automatisk detektering av gyroenhetens orientering (horisontellt eller vertikalt)

Full kalibrering med resultat lagras automatiskt på eeprom

LED -indikering från -2 till +2 grader (kan ändras i kod)

Ytterligare hörbar indikering av nivå (kan slås på/av på flyget)

Kompakt kurva som kräver minimala komponenter

Låt oss börja.

Tillbehör

Detta projekt (som det är) använder följande objekt:

1 x Arduino nano (min är en klon)

1 x MPU6050 gyro/accelerometer -modul

1 x LCD - 16 x 2 + I2C -anslutning

1 x Tryck för att göra omkopplaren

1 x Piezo -summer

1 x grön LED

2 x gula lysdioder

2 x röda lysdioder

5 x 220 ohm motstånd

Olika bygelkablar

Bakbord

Strömförsörjning (min använde en 5v USB -powerbank, när den inte var ansluten till min PC, men du kan använda ett batteri på rätt sätt)

Steg 1: Kretsen

Kretsen
Kretsen
Kretsen
Kretsen

Förutsatt att du har alla komponenter måste du bygga din brödbräda.

Jag visar min inställning som en guide, men anslutningarna är följande:

Arduino -stift D2 ansluts till ena sidan av tryckknappen. Den andra sidan av tryckkontakten ansluts till marken

Arduino stift D3 ansluts till 1 sida av 220 ohm motstånd. Andra sidan av motståndet ansluts till annoden för den röda lysdioden. Katod av röd lysdiod går till marken.

Arduino -stift D4 ansluts till 1 sida av 220 ohm motstånd. Den andra sidan av motståndet ansluts till annoden för gul LED. Katod av gul lysdiod går till marken.

Arduino -stift D5 ansluts till 1 sida av 220 ohm motstånd. Andra sidan av motståndet ansluts till annoden för grön LED. Katod av grön lysdiod går till marken.

Arduino stift D6 ansluts till en sida av 220 ohm motstånd. Den andra sidan av motståndet ansluts till annoden för gul LED. Katod av gul lysdiod går till marken.

Arduino stift D7 ansluts till 1 sida av 220 ohm motstånd. Andra sidan av motståndet ansluts till annoden för den röda lysdioden. Katod av röd lysdiod går till marken.

Arduino -stift D8 ansluts till ena sidan av Piezo -summern. Andra sidan av summern ansluts till marken.

Arduino -stift A4 ansluts till SDA -stift på MPU6050 OCH LCD -skärmen.

Arduino -stift A5 ansluts till SCL -stiften på MPU6050 OCH LCD -skärmen

5v effekt och Gnd för MPU6050 och LCD kommer från Arduino Nano 5v respektive GND -stiften.

När den är klar ska den likna min inställning som visas. Jag lägger blu tak under MPU6050 för att stoppa den att röra sig och även på LCD -skärmen för att hålla den på kanten av brödbrädan.

Steg 2: Koden

Koden bifogad är koden jag har använt för detta projekt. Det enda biblioteket du kan ha problem med är

LiquidCrystal_I2C.h -biblioteket när jag importerade detta när jag började arbeta med LCD -skärmar. Tyvärr finns det några bibliotek som använder samma #include -uttalande, men är något annorlunda. Om du har problem med din, hitta en annan LCD -kod som fungerar för dig och ändra koden därefter. Det är bara troligt att det är inställningen som skiljer sig åt. Alla "print" -kommandon ska fungera likadant.

All kod har kommenterats och förutsatt att jag har gjort det rätt kommer det också att finnas en video som förklarar allt, men här är några punkter att notera:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Ovanstående kod är inställningen för min LCD. Om ditt bibliotek är annorlunda kan du behöva ändra inte bara ditt bibliotek, utan också den här raden.

{lcd.setCursor (0, 1); lcd.print ("Horisontellt!"); orientering = HORIZONTAL; // Läs råa acc- och gyrodata från MPU-6050 1000 gånger för (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Lägg till gyro x -förskjutningen till variabeln gyro_x_cal gyro_x_cal += gyro_x; // Lägg till gyro y -förskjutningen till variabeln gyro_y_cal gyro_y_cal += gyro_y; // Lägg till gyro z -förskjutningen till variabeln gyro_z_cal gyro_z_cal += gyro_z; // Lägg till acc x -förskjutningen till acc_x_cal -variabeln acc_x_cal += acc_x; // Lägg till acc y offset till acc_y_cal -variabeln acc_y_cal += acc_y; } // Dela alla resultat med 1000 för att få genomsnittlig förskjutning 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; horisontell kalibrering = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horizononalCalibration); 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); // Observera att vi inte lagrar en förskjutning för acc_z, på grund av gravitation! fördröjning (500); }

Ovanstående kodblock körs till kalibreringsrutin. Denna kod är för den horisontella kalibreringen. Det finns nästan identisk kod för den vertikala kalibreringen (notera, koden vet om din MPU6050 är monterad horisontellt eller vertikalt!). MPU6050, läses 1000 gånger. lämpliga värden adderas kumulativt sedan dividerat med 1000 för att ge ett genomsnittligt 'offset' värde. Dessa värden lagras sedan på Nano eeprom. Alla horisontella kalibreringsvärden lagras från och med eeprom -adressen 0. Alla vertikala värden lagras i början på eeprom -adressen 24. Kalibreringen MÅSTE göras på en helt plan yta, annars betyder de ingenting.

/ * * De närmaste raderna bearbetar rådata för att ändra det till vinklar som kan matas ut till LCD och LED. * Värdet 4096, som accelerationsdata divideras med, hämtas från MPU6050 -databladet och baseras på samplingshastighet. * Värdet på 9,8 är gravitation * Atan2-funktionen är från matematikmodulen och används för att beräkna vinklarna från de angivna data */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 (); / * * Detta avsnitt använder gyrodata för att göra systemet mer responsivt * värdet på 65,5, som gyrodata divideras med är hämtat från MPU6050 -databladet och baseras på samplingshastigheten */ theta = (theta+(gyro_y/ 65,5)*dt)*. 96 + thetaM*.04; // Lågpassfilter phi = (phi + (gyro_x/65,5)*dt)*. 96 + phiM*.04; // Lågpassfilter

Ovanstående kod är det som beräknar vinklarna. Förhoppningsvis ger kommentarerna en liten inblick i hur det fungerar, men för en fördjupad förklaring, kolla in Paul McWhorters -video länkad till i bifogad PDF. Vad jag kommer att säga är dock att du kan ändra samplingshastigheten för gyro och accelerometer (som görs i installationsprogrammet MPU6050 underprogrammet längst ner i min kod). Om du ändrar samplingshastigheten måste du också ändra hur mycket rådata divideras med. För accelerometerdata är det aktuella värdet 4096. För gyro är det nuvarande värdet 65,5.

Se de bifogade databladen och videon från EEEntusiast (länk i bifogad PDF) för mer ingående information om hur samplings- och förskjutningsvärdena hittas.

Steg 3: Nästa steg

Vid denna tidpunkt kommer förhoppningsvis att ha gjort detta projekt, men vad nu?

För det första, varför inte bygga in det till en vattenpass som du kan använda. Du kan köpa en billig vattenpass (se till att det är lådtypen) som du kan anpassa, eller om du har satsen, skriv ut din egen nivå/låda.

Kanske leker med gyro- och accelerometerprovhastigheterna för att se om de fungerar bättre i en takt än en annan.

Försök att förfina koden ytterligare. Till exempel, för närvarande, bortom 45 grader, är den angivna vinkeln minst sagt grov. Finns det en väg runt det?

Om du har några frågor, hur enkla de än kan verka, fråga. Om jag kan hjälpa så gör jag det.

Om du gillar detta instruerbart, snälla ge det ett gilla, så att jag vet.

Om du gör detta, vänligen visa mig (särskilt om det är i ett fungerande fall).

TACK