Taula de continguts:
Vídeo: Nivell d’esperit digital basat en Arduino i MPU6050: 3 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:11
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
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:
Nivell d'esperit digital de bricolatge: 5 passos (amb imatges)
Nivell d’esperit digital de bricolatge: en aquest projecte analitzarem de prop els circuits integrats de l’acceleròmetre i descobrirem com podem utilitzar-los amb un Arduino. Posteriorment combinarem aquest CI amb un parell de components complementaris i un recinte imprès en 3D per crear un digital
Termòmetre infraroig sense contacte basat en Arduino - Termòmetre basat en IR mitjançant Arduino: 4 passos
Termòmetre infraroig sense contacte basat en Arduino | Termòmetre basat en IR que utilitza Arduino: Hola nois, en aquest instructable farem un termòmetre sense contacte amb arduino, ja que de vegades la temperatura del líquid / sòlid és massa alta o baixa a la temperatura i és difícil fer-hi contacte i llegir-ne temperatura llavors en aquell escenari
Generador de música basat en el temps (generador de midi basat en ESP8266): 4 passos (amb imatges)
Generador de música basat en el temps (generador de midi basat en ESP8266): Hola, avui explicaré com fer el vostre propi generador de música basat en el temps. Es basa en un ESP8266, que és com un Arduino, i respon a la temperatura, a la pluja i intensitat lumínica. No espereu que faci cançons senceres o progrés d’acords
Controlador de nivell d'aigua basat en IOT que utilitza NodeMCU ESP8266: 6 passos
Controlador de nivell d’aigua basat en IOT que utilitza NodeMCU ESP8266: és útil per crear un controlador de nivell d’aigua basat en IOT. Les característiques d’aquest projecte són: - Actualitzacions de nivell d’aigua en temps real a l’aplicació per a Android. Activeu automàticament la bomba d'aigua quan l'aigua arriba a un nivell mínim. Au
Creeu un nivell d’esperit elèctric: 15 passos
Crea un nivell espiritual elèctric: utilitza aquest nivell espiritual per mostrar de forma ràpida i senzilla la inclinació de qualsevol objecte adjunt. Creat per Kaitlyn de Raffles Institution