תוכן עניינים:

שליטה בסרוו באמצעות MPU6050 בין Arduino ל- ESP8266 עם HC-12: 6 שלבים
שליטה בסרוו באמצעות MPU6050 בין Arduino ל- ESP8266 עם HC-12: 6 שלבים

וִידֵאוֹ: שליטה בסרוו באמצעות MPU6050 בין Arduino ל- ESP8266 עם HC-12: 6 שלבים

וִידֵאוֹ: שליטה בסרוו באמצעות MPU6050 בין Arduino ל- ESP8266 עם HC-12: 6 שלבים
וִידֵאוֹ: עדיין נידרשים כיולים .. אבל עושה עבודה טובה :-) 2024, נוֹבֶמבֶּר
Anonim
שליטה בסרוו באמצעות MPU6050 בין Arduino ל- ESP8266 עם HC-12
שליטה בסרוו באמצעות MPU6050 בין Arduino ל- ESP8266 עם HC-12

בפרויקט זה, אנו שולטים במיקום של מנוע סרוו באמצעות mpu6050 ו- HC-12 לתקשורת בין Arduino UNO ו- ESP8266 NodeMCU.

שלב 1: אודות הפרויקט הזה

זהו פרויקט IoT נוסף המבוסס על מודול RF-12 RF. כאן, נתוני imu (mpu6050) מארדואינו משמשים לשליטה במנוע הסרוו (המחובר ל- Nodemcu). כאן, ויזואליזציית הנתונים מתבצעת גם בצד arduino שבו נתוני המגרש mpu6050 (סיבוב סביב ציר ה- x) מדומיינים בעזרת סקיצה לעיבוד (נדון בהמשך). בעיקרון הפרויקט הזה הוא רק התחממות קטנה לזכור היבטים שונים של בקרת Imu & Servo עם Arduino ו- ESP8266 nodemcu.

מַטָרָה

המטרה של זה די ברור, אנו שולטים במיקום של מנוע סרוו באמצעות ערך המגרש של IMU. וסך הכל המיקום והמקום המוטורי המסונכרן הזה מדמיינים עם עיבוד.

שלב 2: נדרשת חומרה

NodeMCU מודול Wifi ESP8266 12E

קרש לחם ללא הלחמה

כבל מגשר

MPU6050 accelo+gyro

מודולי RF HC-12 (זוג)

מנוע סרוו SG90

שלב 3: מעגל וחיבורים

מעגל וחיבורים
מעגל וחיבורים
מעגל וחיבורים
מעגל וחיבורים

החיבורים ישירים קדימה. אתה יכול להפעיל את סרוו עם 3.3V של Nodemcu שלך. אתה יכול גם להשתמש ב- Vin כדי להפעיל את הסרוו אם ל- nodemcu שלך יש כל כך הרבה מתח על הסיכה הזו. אבל לרוב הלוחות Lolin אין 5V ב Vin (תלוי ביצרן).

תרשימי מעגלים אלה נעשים באמצעות EasyADA.

שלב 4: עבודה

עובד
עובד

ברגע שהסקיצה של הארדואינו החלה, היא תשלח את זווית המגרש (שנעה בין -45 ל -45) למקלט hc12 של Nodemcu שממופה עם מיקום סרוו 0 עד 180 מעלות. כאן השתמשנו בזווית המגרש מ -45 עד +45 מעלות כך שנוכל למפות זאת לעמדת סרוו.

כעת, אתם חושבים מדוע אנו יכולים פשוט להשתמש בשיטת המפה כדלקמן:-

int pos = מפה (val, -45, 45, 0, 180);

מכיוון שהזווית השלילית שנשלחת על ידי משדר hc12 מתקבלת כ:

מחצית ראשונה: (T) 0 עד 45 => 0 עד 45 (R)

מחצית שנייה: (T) -45 עד -1 => 255 עד 210 (R)

אז אתה צריך למפות אותו ל 0 עד 180 כמו

אם (val> = 0 && val <= 45) pos = (val*2) +90; אחרת pos = (val-210)*2;

אני נמנע משיטת המפה בגלל שגיאה לא רלוונטית. אתה יכול לנסות את זה ולהעיר שזה עובד איתך

if (val> = 0 && val <= 45) pos = map (val, 0, 45, 90, 180); אחרת pos = מפה (val, 255, 210, 0, 90); // הארגומנט הרביעי יכול להיות 2 (אתה יכול לבדוק)

חישוב זווית המגרש MPU6050

אני משתמש בספריית MPU6050_tockn המבוססת על מסירת נתונים גולמיים מה- IMU.

int pitchAngle = mpu6050.getAngleX ()

זה יביא לנו את זווית הסיבוב סביב ציר ה- x. כפי שראית באיור, האימו שלי ממוקם אנכית על קרש הלחם, כך שלא תבלבל עם המגרש והגליל. למעשה אתה תמיד צריך לראות את הציר מודפס על לוח הפריצה.

באמצעות ספרייה זו, אינך צריך להתעסק באלקטרוניקה הפנימית של קריאת אוגרים ספציפיים להפעלה ספציפית. אתה רק מציין את העבודה וסיימת!

Btw אם אתה רוצה לחשב את הזווית בעצמך. אתה יכול לעשות זאת בקלות כדלקמן:

#לִכלוֹל

const int MPU6050_addr = 0x68; int16_t AcX, AcY, AcZ, Temp, GyroX, GyroY, GyroZ; הגדרת חלל () {Wire.begin (); שידור Wire.beginTransmission (MPU6050_addr); Wire.write (0x6B); Wire.write (0); Wire.endTransmission (true); Serial.begin (9600); } לולאת חלל () {Wire.beginTransmission (MPU6050_addr); Wire.write (0x3B); Wire.endTransmission (שקר); Wire.requestFrom (MPU6050_addr, 14, true); AcX = Wire.read () << 8 | Wire.read (); AcY = Wire.read () << 8 | Wire.read (); AcZ = Wire.read () << 8 | Wire.read (); Temp = Wire.read () << 8 | Wire.read (); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read ();

int xAng = map (AcX, minVal, maxVal, -90, 90); int yAng = map (AcY, minVal, maxVal, -90, 90); int zAng = map (AcZ, minVal, maxVal, -90, 90); x = RAD_TO_DEG * (atan2 (-yAng, -zAng)+PI); y = RAD_TO_DEG * (atan2 (-xAng, -zAng)+PI); z = RAD_TO_DEG * (atan2 (-yAng, -xAng)+PI); Serial.print ("AngleX ="); // Pitch Serial.println (x); Serial.print ("AngleY ="); // רול Serial.println (y); Serial.print ("AngleZ ="); // Yaw Serial.println (z); }

אבל, אין צורך שתכתוב קוד כה רב כדי לקבל את הזווית. אתה צריך לדעת את העובדות מאחורי הקלעים, אך השימוש בספרייה של אנשים אחרים יעיל מאוד בפרויקטים רבים. אתה יכול לקרוא על imu זה ועל אישורים אחרים לקבל נתונים מסוננים יותר מהקישור הבא: Explore-mpu6050.

קוד הארדואינו שלי בקצה השידור כולל רק 30 שורות בעזרת ספריית MPU6050_tockn כך שהשימוש בספרייה הוא טוב, אלא אם כן לא צריך כמה שינויים מרכזיים בפונקציונליות של IMU. ספרייה בשם I2Cdev מאת ג'ף רווברג עוזרת מאוד אם אתה רוצה נתונים מסוננים באמצעות DMP (מעבד תנועה דיגיטלי) של ה- IMU.

אינטגרציה עם עיבוד

כאן העיבוד משמש להדמיה של הנתונים הסיבוביים על ציר ה- x של IMU כפי שהם מחושבים על ידי הנתונים הגולמיים המגיעים מ- MPU6050. אנו מקבלים את הנתונים הגולמיים הנכנסים ב- SerialEvent באופן הבא:

void serialEvent (Serial myPort) {

inString = myPort.readString (); נסה {// לנתח את הנתונים // println (inString); String dataStrings = split (inString, ':'); if (dataStrings.length == 2) {if (dataStrings [0].equals ("RAW")) {for (int i = 0; i <dataStrings.length - 1; i ++) {raw = float (dataStrings [i+1]); }} else {println (inString); }}} catch (חריגה ה) {println ("תפס חריג"); }}

כאן תוכל לראות הדמיה בתמונה המצורפת בשלב זה. נתוני המיקום המתקבלים בקצה nodemcu נראים גם על הצג הסדרתי כפי שמוצג בתמונה.

שלב 5: קוד

צירפתי את מאגר github. אתה יכול לשבט ולזלג אותו לשימוש בפרויקטים שלך.

קוד my_code

הריפו כולל 2 סקיצות ארדואינו למשדר (arduino+IMU) ומקלט (Nodemcu+Servo).

ומערכון עיבוד אחד. סמן את כוכב הריפו אם זה עוזר בפרויקט שלך.

בהנחיה זו, R- מקלט & T- משדר

שלב 6: הפגנת וידיאו

אני מצרף את הסרטון מחר. עקוב אחריי כדי לקבל הודעה.

תודה לכולכם!

מוּמלָץ: