Taula de continguts:

Nivell d’esperit digital basat en Arduino i MPU6050: 3 passos
Nivell d’esperit digital basat en Arduino i MPU6050: 3 passos

Vídeo: Nivell d’esperit digital basat en Arduino i MPU6050: 3 passos

Vídeo: Nivell d’esperit digital basat en Arduino i MPU6050: 3 passos
Vídeo: 🎙 WADE DAVIS | MAGDALENA: River of DREAMS | On COLOMBIA, ANTHROPOLOGY and the WRITING Process 📚 2024, Desembre
Anonim
Image
Image
El Circuit
El Circuit

Benvingut al meu primer instructiu! Espero que el trobeu informatiu. Si us plau, no dubteu a deixar comentaris si són positius o negatius.

Aquest projecte és fer un nivell espiritual digital basat en arduino i MPU6050. Tot i que el disseny i el codi acabats són meus, el concepte original i gran part del codi que he treballat no ho són. No estic interessat en el plagi, així que estic més que feliç de donar crèdit a les idees que he construït. Les dues persones principals a les quals vull cridar són Paul McWhorter i DroneBot Workshop de YouTuber. Inclou enllaços a ells al meu enllaç útil de YouTube, PDF. Gràcies també a EEEnthusiast pel seu vídeo informatiu sobre l’ús del MPU6050, inclosa la configuració i lectura del mòdul sense biblioteca externa (el seu enllaç es troba al mateix PDF).

El projecte que he produït funciona "tal qual" i és de fades precís, fins a un 45% en qualsevol direcció. Podeu utilitzar-lo exactament tal com l’he dissenyat jo o el podeu adaptar als vostres gustos. Els més astuts de vosaltres notareu que el meu projecte sembla gairebé idèntic al produït pel taller DroneBot, però tingueu la seguretat que hi ha diferències significatives, sobretot pel que fa al codi per al càlcul d’angles, més la facilitat per emmagatzemar els valors de calibratge a Eeprom!

Algunes funcions per obrir la gana:

Angles de pitch and roll disponibles a 0,1 de grau.

Detecció automàtica de l'orientació de la unitat giroscòpica (horitzontal o vertical)

Calibratge complet amb resultats emmagatzemats automàticament a eeprom

Indicació LED de -2 a +2 graus (canviable en codi)

Indicació sonora addicional de nivell (es pot activar / desactivar al vol)

Curcuit compacte que requereix components mínims

Comencem.

Subministraments

Aquest projecte (tal qual) utilitza els elements següents:

1 x Arduino nano (el meu és un clon)

1 x mòdul giroscòpic / acceleròmetre MPU6050

1 x LCD: 16 x 2 + connexió I2C

1 x Premeu per fer el commutador

1 x brunzidor piezoelèctric

1 x LED verd

2 x LED grocs

2 x LED vermells

Resistències de 5 x 220 ohm

Diversos cables de pont

Taula de pa

Font d'alimentació (el meu utilitzava un banc d'alimentació USB de 5v quan no estava connectat al meu PC, però podeu utilitzar una bateria connectada adequadament)

Pas 1: el circuit

El Circuit
El Circuit
El Circuit
El Circuit

Suposant que teniu tots els components, haureu de construir la vostra taula de treball.

Mostro la meva configuració com a guia, però les connexions són les següents:

El pin Arduino D2 es connecta a 1 costat del polsador. L'altre costat del polsador es connecta a terra

El pin Arduino D3 es connecta a un costat de la resistència de 220 ohm. Un altre costat de la resistència es connecta per anoditzar el LED vermell. El càtode de LED vermell va a terra.

El pin Arduino D4 es connecta a un costat de la resistència de 220 ohm. L'altra cara de la resistència es connecta per anoditzar el LED groc. El càtode de LED groc va a terra.

El pin Arduino D5 es connecta a un costat de la resistència de 220 ohm. Un altre costat de la resistència es connecta per anoditzar el LED verd. El càtode de LED verd va a terra.

El pin Arduino D6 es connecta a un costat de la resistència de 220 ohm. L'altra cara de la resistència es connecta per anoditzar el LED groc. El càtode de LED groc va a terra.

El pin Arduino D7 es connecta a un costat de la resistència de 220 ohm. Un altre costat de la resistència es connecta per anoditzar el LED vermell. El càtode de LED vermell va a terra.

El pin Arduino D8 es connecta a un costat del brunzidor piezoelèctric. L’altra cara del brunzidor es connecta a terra.

El pin A4 Arduino es connecta als pins SDA del MPU6050 I de la pantalla LCD.

El pin Arduino A5 es connecta als pins SCL del MPU6050 I de la pantalla LCD

La potència de 5v i el Gnd per a MPU6050 i LCD provenen dels pins Arduino Nano 5v i GND respectivament.

Un cop finalitzada, hauria de ser similar a la configuració que es mostra. Vaig posar blu tak a sota del MPU6050 per evitar que es mogui i també a la pantalla LCD per mantenir-lo a la vora de la taula de treball.

Pas 2: el codi

El codi adjunt és el codi que he utilitzat per a aquest projecte. L'única biblioteca amb la qual pot tenir problemes és la

La biblioteca LiquidCrystal_I2C.h ja que la vaig importar quan vaig començar a treballar amb LCD. Malauradament, hi ha algunes biblioteques que fan servir la mateixa sentència #include, però que són lleugerament diferents. Si teniu problemes amb el vostre, cerqueu un altre codi LCD que us funcioni i modifiqueu el codi en conseqüència. És probable que la configuració sigui diferent. Totes les ordres "imprimir" haurien de funcionar igual.

S’ha comentat tot el codi i suposant que ho he fet bé, també hi haurà un vídeo que ho explicarà tot, però aquí teniu alguns punts a tenir en compte:

LiquidCrystal_I2C lcd (0x27, 16, 2);

El codi anterior és la configuració del meu LCD. Si la vostra biblioteca és diferent, potser haureu de canviar no només la vostra biblioteca, sinó també aquesta línia.

{lcd.setCursor (0, 1); lcd.print ("Horitzontal!"); orientació = HORITZONTAL; // Llegiu les dades brutes d'acc i giroscopi de la MPU-6050 1000 vegades per (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Afegiu el desplaçament gyro x a la variable gyro_x_cal gyro_x_cal + = gyro_x; // Afegiu el gir offset a la variable gyro_y_cal gyro_y_cal + = gyro_y; // Afegiu el desplaçament de giroscopi z a la variable gyro_z_cal gyro_z_cal + = girosc_; // Afegiu el desplaçament acc x a la variable acc_x_cal acc_x_cal + = acc_x; // Afegiu el desplaçament acc y a la variable acc_y_cal acc_y_cal + = acc_y; } // Divideix tots els resultats per 1000 per obtenir una compensació mitjana 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; HoritzontalCalibration = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horizonalCalibration); 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 (adreça_eeprom, acc_y_cal); eeprom_address + = sizeof (float); // Tingueu en compte que no estem emmagatzemant un desplaçament per acc_z, a causa de la gravetat. retard (500); }

El bloc de codi anterior s'executa a la rutina de calibratge. Aquest codi és per al calibratge horitzontal. Hi ha un codi gairebé idèntic per al calibratge vertical (tingueu en compte que el codi sap si el vostre MPU6050 està muntat horitzontalment o verticalment). MPU6050, es llegeix 1000 vegades. els valors adequats s’afegeixen acumulativament i es divideixen entre 1000 per donar un valor mitjà de “compensació”. Aquests valors s'emmagatzemen a Nano eeprom. Tots els valors de calibratge horitzontals s'emmagatzemen a partir de l'adreça eeprom 0. Tots els valors verticals s'emmagatzemen a l'inici de l'adreça eeprom 24. El calibratge s'ha de fer en una superfície completament plana, en cas contrari no volen dir res.

/ * * Les següents línies processen les dades brutes per canviar-les en angles que es poden enviar a la pantalla LCD i als LED. * El valor de 4096, dividit per les dades d’acceleració, es pren del full de dades MPU6050 i es basa en la freqüència de mostreig. * El valor de 9,8 és la gravetat * La funció atan2 prové del mòdul matemàtic i s’utilitza per calcular els angles a partir de les dades donades * / thetaM = -atan2 ((acc_x / 4096.0) /9.8, (acc_z / 4096.0) /9.8) /2/3.141592656 * 360; // Dades brutes phiM = -atan2 ((acc_y / 4096.0) /9.8, (acc_z / 4096.0) /9.8) /2/3.141592656 * 360; // Dades brutes dt = (millis () - millisOld) / 1000.; millisOld = millis (); / * * Aquesta secció utilitza les dades giroscòpiques per fer el sistema més sensible * el valor de 65,5, dividit per les dades giroscòpiques, es pren del full de dades MPU6050 i es basa en la freqüència de mostra * / theta = (theta + (gyro_y / 65,5) * dt) *. 96 + thetaM *.04; // Filtre pas baix phi = (phi + (gyro_x / 65.5) * dt) *. 96 + phiM *.04; // Filtre de pas baix

El codi anterior és el que calcula els angles. Esperem que els comentaris donin una mica de coneixement sobre el seu funcionament, però per obtenir una explicació més profunda, consulteu el vídeo de Paul McWhorters enllaçat al PDF adjunt. El que diré és que podeu canviar la freqüència de mostra del giroscopi i l’acceleròmetre (que es fa a la subrutina de configuració MPU6050 a la part inferior del meu codi). Si canvieu la freqüència de mostreig, també haureu de canviar quant es divideixen les dades brutes. Per a les dades de l’acceleròmetre, el valor actual és 4096. Per al giroscopi, el valor actual és 65,5.

Consulteu els fulls de dades adjunts i el vídeo d'EEEntusiast (enllaç al PDF adjunt) per obtenir informació més detallada sobre com es troben els valors de mostreig i desplaçament.

Pas 3: passos següents

En aquest punt, amb sort, haurà fet aquest projecte, però què passa ara?

En primer lloc, per què no construir-lo en un nivell espiritual que pugueu utilitzar? Podeu comprar un nivell espiritual barat (assegureu-vos que sigui del tipus de caixa) que pugueu adaptar o, si teniu el kit, imprimiu el vostre propi nivell / caixa.

Potser jugueu amb les velocitats de mostra del giroscopi i l’acceleròmetre per veure si funcionen millor a un ritme que a un altre.

Intenteu restringir el codi. Per exemple, en l'actualitat, més enllà dels 45 graus, l'angle indicat és aproximadament mínim. Hi ha alguna manera de solucionar-ho?

Si teniu cap pregunta, per senzilla que semblin, pregunteu. Si puc ajudar, ho faré.

Si us agrada aquesta instrucció, doneu-li un "like", perquè ho sàpiga.

Si ho feu, si us plau, mostreu-me-ho (sobretot si es tracta d’un cas de treball).

GRÀCIES

Recomanat: