INHOUDSOPGAWE:

Arduino en MPU6050 -gebaseerde digitale waterpas: 3 stappe
Arduino en MPU6050 -gebaseerde digitale waterpas: 3 stappe

Video: Arduino en MPU6050 -gebaseerde digitale waterpas: 3 stappe

Video: Arduino en MPU6050 -gebaseerde digitale waterpas: 3 stappe
Video: Digital Spirit level meter using Arduino | DIY 2024, Julie
Anonim
Image
Image
Die stroombaan
Die stroombaan

Welkom by my eerste instruksies ooit! Ek hoop dat u dit insiggewend vind. Laat gerus terugvoer, positief of negatief.

Hierdie projek is om 'n arduino- en MPU6050 -gebaseerde digitale waterpas te maak. Alhoewel die voltooide ontwerp en kode myne is, is die oorspronklike konsep en baie van die kode waaruit ek gewerk het, nie. Ek hou nie van plagiaat nie, en ek gee graag krediet aan diegene wat op my idees gebaseer is. Die twee belangrikste mense vir wie ek 'n oproep wil gee, is Paul McWhorter van YouTube en DroneBot Workshop. Ek bevat skakels na hulle in my PDF -skakel met nuttige skakels. Dankie ook aan EEEnthusiast vir sy insiggewende video oor die gebruik van die MPU6050, insluitend die opstel en lees van die module sonder 'n eksterne biblioteek (sy skakel is in dieselfde PDF).

Die projek wat ek gemaak het, werk 'soos dit is' en is akkuraat, beslis tot 45% in beide rigtings. U kan dit presies gebruik soos ek dit ontwerp het, of u kan dit volgens u eie smaak aanpas. Hoe skerper julle sal sien dat my projek byna identies lyk aan die wat deur die DroneBot -werkswinkel vervaardig is, maar wees verseker: daar is beduidende verskille, veral wat die kode vir die berekening van hoeke betref, plus die fasiliteit om kalibrasiewaardes in te stoor Eeprom!

Sommige funksies om u eetlus aan te wakker:

Steek- en rolhoeke tot 0,1 grade beskikbaar.

Outomatiese opsporing van die oriëntasie van die gyro -eenheid (horisontaal of vertikaal)

Volle kalibrasie met resultate wat outomaties op eeprom gestoor word

LED -aanduiding van -2 tot +2 grade (veranderlik in kode)

Bykomende hoorbare aanduiding van die vlak (kan op die vlieg aangeskakel/afgeskakel word)

Kompakte koord wat minimale komponente benodig

Laat ons begin.

Voorrade

Hierdie projek (soos dit is) gebruik die volgende items:

1 x Arduino nano (myne is 'n kloon)

1 x MPU6050 gyro/versnellingsmeter module

1 x LCD - 16 x 2 + I2C -verbinding

1 x Druk om die skakelaar te maak

1 x Piezo -zoemer

1 x groen LED

2 x geel LED's

2 x rooi LED's

5 x 220 ohm weerstande

Verskeie springkabels

Broodbord

Kragtoevoer (myne het 'n 5V USB -kragbank gebruik as dit nie aan my rekenaar gekoppel was nie, maar u kon 'n gepaste battery gebruik)

Stap 1: Die stroombaan

Die stroombaan
Die stroombaan
Die stroombaan
Die stroombaan

As u al die komponente het, moet u u broodbord bou.

Ek wys my opstelling as 'n gids, maar die verbindings is soos volg:

Arduino -pen D2 kan aan die een kant van die drukknop gekoppel word. Die ander kant van die drukknop skakel met die grond

Arduino -pen D3 kan aan die een kant van die 220 ohm -weerstand gekoppel word. Die ander kant van die weerstand sluit aan by die annode van die rooi LED. Katode van Rooi LED gaan grond toe.

Arduino -pen D4 kan aan die een kant van die 220 ohm -weerstand gekoppel word. Die ander kant van die weerstand sluit aan by die annode van die geel LED. Katode van geel LED gaan grond toe.

Arduino -pen D5 kan aan die een kant van die 220 ohm -weerstand gekoppel word. Die ander kant van die weerstand sluit aan by die annode van die groen LED. Katode van groen LED gaan grond toe.

Arduino -pen D6 kan aan die een kant van die 220 ohm -weerstand gekoppel word. Die ander kant van die weerstand sluit aan by die annode van die geel LED. Katode van geel LED gaan grond toe.

Arduino -pen D7 kan aan die een kant van die 220 ohm -weerstand gekoppel word. Die ander kant van die weerstand sluit aan by die annode van die rooi LED. Katode van Rooi LED gaan grond toe.

Arduino -pen D8 kan aan die een kant van die Piezo -zoemer gekoppel word. Die ander kant van die zoemer sluit aan op die grond.

Arduino -pen A4 kan gekoppel word aan SDA -penne op die MPU6050 EN die LCD.

Arduino -pen A5 kan gekoppel word aan die SCL -penne op die MPU6050 EN die LCD

5v krag en Gnd vir MPU6050 en LCD kom van onderskeidelik die Arduino Nano 5v en GND penne.

Sodra dit voltooi is, moet dit soortgelyk wees aan my opstelling wat getoon word. Ek sit blu tak onder die MPU6050 om te keer dat dit beweeg, en ook op die LCD om dit op die rand van die broodbord te hou.

Stap 2: Die kode

Die aangehegte kode is die kode wat ek vir hierdie projek gebruik het. Die enigste biblioteek waarmee u 'n probleem het, is die

LiquidCrystal_I2C.h biblioteek toe ek dit ingevoer het toe ek die eerste keer met LCD's begin werk het. Ongelukkig is daar 'n paar biblioteke wat dieselfde #include -stelling gebruik, maar effens anders is. As u probleme ondervind met die uwe, soek 'n ander LCD -kode wat vir u werk en verander die kode dienooreenkomstig. Dit is waarskynlik slegs die opset wat verskil. Alle 'druk' -opdragte moet dieselfde werk.

Op al die kode is kommentaar gelewer en as ek reg gedoen het, sal daar ook 'n video wees wat alles verduidelik, maar hier is 'n paar punte om op te let:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Bogenoemde kode is die opstelling vir my LCD. As u biblioteek anders is, moet u moontlik nie net u biblioteek nie, maar ook hierdie reël verander.

{lcd.setCursor (0, 1); lcd.print ("Horisontaal!"); oriëntasie = HORISONTALE; // Lees die rou acc en gyro data van die MPU-6050 1000 keer vir (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Voeg die gyro x -offset by die gyro_x_cal -veranderlike gyro_x_cal += gyro_x; // Voeg die gyro y -offset by die gyro_y_cal -veranderlike gyro_y_cal += gyro_y; // Voeg die gyro z -offset by die gyro_z_cal -veranderlike gyro_z_cal += gyro_z; // Voeg die acc x offset by die acc_x_cal veranderlike acc_x_cal += acc_x; // Voeg die acc y offset by die acc_y_cal veranderlike acc_y_cal += acc_y; } // Deel alle resultate met 1000 om 'n gemiddelde verrekening gyro_x_cal /= 1000.0 te kry; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; horisontale kalibrasie = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horisontale kalibrasie); 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: ons stoor nie 'n offset vir acc_z nie, weens swaartekrag! vertraging (500); }

Bogenoemde blok kode word uitgevoer volgens die kalibreringsroetine. Hierdie kode is vir die horisontale kalibrasie. Daar is byna identiese kode vir die vertikale kalibrasie (let op, die kode weet of u MPU6050 horisontaal of vertikaal gemonteer is!). MPU6050, word 1000 keer gelees. gepaste waardes word kumulatief bygevoeg en dan gedeel deur 1000 om 'n gemiddelde 'offset' -waarde te gee. Hierdie waardes word dan op die Nano -eeprom gestoor. Alle horisontale kalibrasiewaardes word gestoor vanaf eeprom -adres 0. Alle vertikale waardes word gestoor vanaf eeprom -adres 24. Die kalibrasie MOET op 'n heeltemal gelyk oppervlak gedoen word, anders beteken dit niks.

/ * * Die volgende paar reëls verwerk die rou data om dit in hoeke te verander wat na die LCD en LED's gestuur kan word. * Die waarde van 4096, waarmee die versnellingsdata gedeel word, word geneem uit die MPU6050 -datablad en is gebaseer op die monstertempo. * Die waarde van 9.8 is swaartekrag * Die atan2-funksie is afkomstig van die wiskundige module en word gebruik om die hoeke te bereken uit die gegewe data */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Rou data phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Rou data dt = (millis ()-millisOld)/1000.; millisOld = millis (); / * * Hierdie afdeling gebruik die gyrodata om die stelsel meer reageerbaar te maak * die waarde van 65,5, waarmee die gyrodata gedeel word, is geneem uit die MPU6050 -datablad en is gebaseer op die steekproefstempo */ theta = (theta+(gyro_y/ 65.5)*dt)*. 96 + thetaM*.04; // Laagdeurlaatfilter phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // Laagdeurlaatfilter

Bogenoemde kode is die materiaal wat die hoeke bereken. Hopelik gee die kommentaar 'n bietjie insig in hoe dit werk, maar vir 'n diepgaande verduideliking, kyk na die video van Paul McWhorters in die aangehegte PDF. Wat ek wel sal sê, is dat u die monstertempo vir die gyro en versnellingsmeter kan verander (wat in die opstel MPU6050 -subroutine onderaan my kode gedoen word). As u die monstertempo verander, moet u ook verander hoeveel die rou data deur gedeel word. Vir die versnellingsmeterdata is die huidige waarde 4096. Vir die gyro is die huidige waarde 65,5.

Raadpleeg die aangehegte gegewensblaaie en die video deur EEEntusiast (skakel in die aangehegte PDF) vir meer diepgaande inligting oor hoe die steekproef- en verrekeningswaardes gevind word.

Stap 3: Volgende stappe

Teen hierdie tyd het ek hopelik hierdie projek gemaak, maar wat nou?

Eerstens, waarom bou u dit nie eintlik in op 'n waterpas wat u kan gebruik nie? U kan 'n goedkoop waterpas koop (maak seker dat dit die tipe boks is) wat u kan aanpas, of as u die kit het, kan u u eie vlak/boks druk.

Probeer miskien met die gyro- en versnellingsmetermonstertempo's om te sien of dit beter werk as die ander.

Probeer die kode verder verfyn. Byvoorbeeld, op die oomblik, bo 45 grade, is die aangegeven hoek op die minste grof. Is daar 'n manier om dit te omseil?

As u enige vrae het, hoe eenvoudig dit ook al mag wees, vra dit gerus. As ek kan help, sal ek.

As u van hierdie instruksies hou, gee dit asseblief, sodat ek weet.

Wys my dit as u dit maak (veral as dit in 'n werkende geval is).

DANKIE

Aanbeveel: