Съдържание:

Arduino и MPU6050 базирано цифрово духовно ниво: 3 стъпки
Arduino и MPU6050 базирано цифрово духовно ниво: 3 стъпки

Видео: Arduino и MPU6050 базирано цифрово духовно ниво: 3 стъпки

Видео: Arduino и MPU6050 базирано цифрово духовно ниво: 3 стъпки
Видео: [Webinar] DIY: графични контролни интерфейси за IoT домашна автоматизация 2024, Декември
Anonim
Image
Image
Веригата
Веригата

Добре дошли в първата ми инструкция! Надявам се да го намерите информативно. Моля, не се колебайте да оставите обратна връзка, независимо дали е положителна или отрицателна.

Този проект има за цел да направи дигитален нивелир на базата на arduino и MPU6050. Докато завършеният дизайн и код са мои, оригиналната концепция и голяма част от кода, от който съм работил, не са. Не се занимавам с плагиатство, така че съм повече от щастлив да отдам кредит на тези, чиито идеи съм надградил. Двамата основни хора, на които искам да кажа, са Paul McWhorter от YouTube и работилница DroneBot. Включвам връзки към тях в моя YouTube полезни връзки PDF. Благодаря и на EEEnthusiast за информативното му видео за използването на MPU6050, включително настройка и четене от модула без външна библиотека (връзката му е в същия PDF).

Проектът, който съм продуцирал, работи „както е“и е приказно точен, със сигурност до 45% във всяка посока. Можете да го използвате точно както съм го проектирал, или можете да го съобразите според собствените си вкусове. По -проницателните от вас ще забележат, че моят проект изглежда почти идентичен с този, създаден от работилницата на DroneBot, но бъдете сигурни, че има значителни разлики, особено когато става въпрос за кода за изчисляване на ъгли, плюс възможност за съхраняване на стойностите за калибриране в Иепром!

Някои функции, които предизвикват апетита ви:

Ъглите на наклон и преобръщане са на разположение в рамките на 0,1 от градуса.

Автоматично откриване на ориентация на жироскоп (хоризонтално или вертикално)

Пълно калибриране с резултати, автоматично съхранявани в eeprom

LED индикация от -2 до +2 градуса (променя се в код)

Допълнителна звукова индикация за ниво (може да се включва/изключва в движение)

Компактен пистолет, изискващ минимални компоненти

Да започваме.

Консумативи

Този проект (такъв, какъвто е) използва следните елементи:

1 x Arduino nano (моят е клонинг)

1 x модул за жироскоп/акселерометър MPU6050

1 x LCD - 16 x 2 + I2C връзка

1 x Натиснете за превключване

1 х пиезо зумер

1 x Зелен светодиод

2 x жълти светодиода

2 x червени светодиода

5 x 220 ома резистори

Различни джъмперни кабели

Платка

Захранване (моят използва 5v USB захранваща банка, когато не е свързан към моя компютър, но можете да използвате подходящо свързана батерия)

Стъпка 1: Веригата

Веригата
Веригата
Веригата
Веригата

Ако приемем, че имате всички компоненти, ще трябва да изградите своя макет.

Показвам настройката си като ръководство, но връзките са следните:

Arduino щифт D2 се свързва с едната страна на превключвателя. Другата страна на натискащия превключвател се свързва към земята

Arduino щифт D3 се свързва към 1 страна на резистор 220 ома. Другата страна на резистора се свързва към анода на червения светодиод. Катодът на червения светодиод отива към земята.

Arduino щифт D4 се свързва към 1 страна на резистор 220 ома. Другата страна на резистора се свързва с анод на жълт светодиод. Катодът на жълтия светодиод отива към земята.

Arduino щифт D5 се свързва към 1 страна на резистор 220 ома. Другата страна на резистора се свързва с анод на зелен светодиод. Катодът на зеления светодиод отива към земята.

Arduino щифт D6 се свързва към 1 страна на резистор 220 ома. Другата страна на резистора се свързва с анод на жълт светодиод. Катодът на жълтия светодиод отива към земята.

Arduino щифт D7 се свързва към 1 страна на резистор 220 ома. Другата страна на резистора се свързва към анода на червения светодиод. Катодът на червения светодиод отива към земята.

Arduino щифт D8 се свързва с едната страна на пиезо зумера. Другата страна на зумера се свързва със земята.

Arduino щифт A4 се свързва към SDA щифтове на MPU6050 И LCD.

Arduino щифт A5 се свързва към SCL пиновете на MPU6050 И LCD

5v захранване и Gnd за MPU6050 и LCD идват съответно от щифтовете Arduino Nano 5v и GND.

След като приключи, трябва да е подобна на показаната ми настройка. Сложих blu tak под MPU6050, за да спра да се движи, а също и върху LCD, за да го държа на ръба на макета.

Стъпка 2: Кодът

Приложеният код е кодът, който използвах за този проект. Единствената библиотека, с която може да имате проблем, е

Библиотека LiquidCrystal_I2C.h, тъй като импортирах това, когато за първи път започнах работа с LCD. За съжаление, има няколко библиотеки, които използват един и същ израз #include, но са малко по -различни. Ако имате проблеми с вашия, намерете друг LCD код, който работи за вас, и променете кода съответно. Вероятно е само настройката да се различава. Всички команди за печат трябва да работят еднакво.

Целият код е коментиран и ако приемем, че съм го направил правилно, ще има и видео, обясняващо всичко, но ето няколко точки, които трябва да се отбележат:

LiquidCrystal_I2C LCD (0x27, 16, 2);

Горният код е настройката за моя LCD. Ако вашата библиотека е различна, може да се наложи да промените не само библиотеката си, но и този ред.

{lcd.setCursor (0, 1); lcd.print ("Хоризонтално!"); ориентация = ХОРИЗОНТАЛНА; // Прочетете необработените данни за acc и gyro от MPU-6050 1000 пъти за (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Добавяне на изместването на жироскопа x към променливата gyro_x_cal gyro_x_cal += gyro_x; // Добавяне на отместване на жироскопа y към променливата gyro_y_cal gyro_y_cal += gyro_y; // Добавяме изместването на жироскоп z към променливата gyro_z_cal gyro_z_cal += gyro_z; // Добавяме отместването на acc x към променливата acc_x_cal acc_x_cal += acc_x; // Добавяме отместването на acc y към променливата acc_y_cal acc_y_cal += acc_y; } // Разделете всички резултати на 1000, за да получите средно изместване 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; horizonalCalibration = 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 (eeprom_address, acc_y_cal); eeprom_address += sizeof (float); // Обърнете внимание, че не съхраняваме отместване за acc_z, поради гравитацията! забавяне (500); }

Горният блок код се изпълнява към калибрираща рутина. Този код е за хоризонтално калибриране. Има почти идентичен код за вертикално калибриране (имайте предвид, че кодът знае дали вашият MPU6050 е монтиран хоризонтално или вертикално!). MPU6050, се чете 1000 пъти. подходящите стойности се натрупват кумулативно, след това се разделят на 1000, за да се получи средна стойност на „изместване“. След това тези стойности се съхраняват в Nano eeprom. Всички стойности за хоризонтално калибриране се съхраняват, започвайки от адрес eeprom 0. Всички вертикални стойности се съхраняват в началото на адрес eeprom 24. Калибрирането ТРЯБВА да се извърши на напълно равна повърхност, в противен случай те не означават нищо.

/ * * Следващите няколко реда обработват необработените данни, за да ги променят в ъгли, които могат да се извеждат към LCD и LED. * Стойността на 4096, на която данните за ускорението са разделени, е взета от листа с данни MPU6050 и се основава на честотата на дискретизация. * Стойността на 9.8 е гравитация * Функцията atan2 е от математическия модул и се използва за изчисляване на ъглите от дадените данни */thetaM = -atan2 ((acc_x/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Сурови данни phiM = -atan2 ((acc_y/4096.0) /9.8, (acc_z/4096.0) /9.8) /2/3.141592656 * 360; // Сурови данни dt = (millis ()-millisOld)/1000.; millisOld = millis (); / * * Този раздел използва жироскопичните данни, за да направи системата по -отзивчива * стойността на 65,5, на която са разделени жироскопните данни, е взета от листа с данни MPU6050 и се основава на честотата на дискретизация */ theta = (theta+(gyro_y/ 65,5)*dt)*. 96 + тетаМ*.04; // Нискочестотен филтър phi = (phi + (gyro_x/65.5)*dt)*. 96 + phiM*.04; // Нискочестотен филтър

Горният код е материалът, който изчислява ъглите. Надяваме се коментарите да дадат малко представа за това как работи, но за задълбочено обяснение вижте видеото на Paul McWhorters, свързано в прикачения PDF. Това, което ще кажа, е, че можете да промените честотата на дискретизация за жироскопа и акселерометъра (което се прави в подпрограмата за настройка MPU6050 в долната част на моя код). Ако промените честотата на извадката, трябва също да промените колко се разделят необработените данни. За данните от акселерометъра текущата стойност е 4096. За жироскопа текущата стойност е 65,5.

Вижте приложените информационни листове и видеоклипа на EEEntusiast (връзка в прикачения PDF) за по -задълбочена информация за това как се намират стойностите на извадката и изместването.

Стъпка 3: Следващи стъпки

Надяваме се до този момент да направим този проект, но какво сега?

Първо, защо всъщност не го вградите в нивелир, който можете да използвате. Можете да си купите евтин спирт (уверете се, че е тип кутия), който можете да адаптирате, или ако имате комплекта, отпечатайте собствено ниво/кутия.

Може би си поиграйте с честотата на дискретизация на жироскопа и акселерометъра, за да видите дали те работят по -добре с една скорост от друга.

Опитайте се да подобрите кода допълнително. Например, в момента, над 45 градуса, посоченият ъгъл е меко казано груб. Има ли начин да го заобиколя?

Ако имате въпроси, колкото и прости да изглеждат, моля попитайте. Ако мога да помогна, ще го направя.

Ако ви харесва тази инструкция, моля, харесайте я, за да знам.

Ако направите това, моля, покажете ми (особено ако е в работен калъф).

БЛАГОДАРЯ ТИ

Препоръчано: