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

תחילת העבודה עם ממשק חיישן I2C ?? - ממשק MMA8451 שלך באמצעות ESP32s: 8 שלבים
תחילת העבודה עם ממשק חיישן I2C ?? - ממשק MMA8451 שלך באמצעות ESP32s: 8 שלבים

וִידֵאוֹ: תחילת העבודה עם ממשק חיישן I2C ?? - ממשק MMA8451 שלך באמצעות ESP32s: 8 שלבים

וִידֵאוֹ: תחילת העבודה עם ממשק חיישן I2C ?? - ממשק MMA8451 שלך באמצעות ESP32s: 8 שלבים
וִידֵאוֹ: פאקט טרייסר - כל הטיפים לעבודה יעילה מהירה ומגניבה 2024, נוֹבֶמבֶּר
Anonim
תחילת העבודה עם ממשק חיישן I2C ?? - ממשק את ה- MMA8451 שלך באמצעות מערכות ESP32
תחילת העבודה עם ממשק חיישן I2C ?? - ממשק את ה- MMA8451 שלך באמצעות מערכות ESP32

במדריך זה תלמדו הכל כיצד להתחיל, להתחבר ולקבל מכשיר I2C (מד תאוצה) שעובד עם בקר (Arduino, ESP32, ESP8266, ESP12 NodeMCU)

שלב 1: כיצד להתחיל עם I2C - עולם מפואר של תקשורת אינטר -IC

כולם Arduino, סדרת ESP, PIC, Rasberry PI וכו '. אבל מה עושים עם זה ברגע שיש לכם אחד כזה?

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

שלב 2: סקירה כללית על I2C

I2C הוא פרוטוקול תקשורת סידורי, סינכרוני וחצי דופלקס המאפשר קיום דו-קיומי של מאסטרים ועבדים רבים באותו אוטובוס. אוטובוס I2C מורכב משני קווים: קו נתונים סידורי (SDA) ושעון סדרתי (SCL). שני הקווים דורשים נגדי משיכה.

SDA (Data Serial) - השורה של המאסטר והעבד לשלוח ולקבל נתונים. SCL (שעון סידורי) - הקו המוביל את אות השעון. עם יתרונות כמו פשטות ועלות ייצור נמוכה, I2C משמש בעיקר לתקשורת של התקנים היקפיים במהירות נמוכה למרחקים קצרים (בתוך רגל אחת).

רוצה ללמוד עוד על I2C? ……

שלב 3: כיצד להגדיר חיישני I²C

לפני שתכנס לפרויקט, עליך להבין כמה יסודות של החיישן שלך. אז מזגו לעצמכם כוס קפה לפני שאתם צוללים פנימה:)? …

הכוח הגדול של I2C הוא שאתה יכול לשים כל כך הרבה חיישנים על אותם ארבעה חוטים. אך עבור יחידות עם מספר מודולים מוכנים מראש, ייתכן שתצטרך להסיר כמה נגדים מסוג smd מהפריצות, אחרת המשיכה באוטובוס עלולה להפוך לאגרסיבית מדי.

איזה מידע אנו רוצים מתוך גליון הנתונים ??

  1. פונקציונליות חיישן
  2. פונקציונליות Pinouts ו- pins
  3. תיאור הממשק (אל תפספסו להסתכל על "טבלת בחירת כתובות I2c")
  4. נרשמים !!

הכל בסדר תמצא את זה בקלות אבל נרשמים ?? רישומים הם פשוט מיקומי זיכרון בתוך מכשיר I²C. הסיכום של כמה רשמים בחיישן נתון, ומה שהם שולטים או מכילים נקרא מפת רגיסטר. רוב המידע בגליון הנתונים של החיישן עוסק בהסבר כיצד כל רגיסט מתפקד, והם יכולים להיות די סיכוי לקרוא אותו מכיוון שהמידע מוצג לעתים רחוקות בצורה ישירה.

כדי לתת לך מושג למה אני מתכוון בכך: ישנם סוגים רבים של רשמים, אך למבוא זה אני הולך לקבץ אותם לשני סוגים כלליים: רשימות בקרה ונתונים.

1) רשימות בקרה

רוב החיישנים משנים את אופן פעולתם על סמך הערכים המאוחסנים ברשומי הבקרה. תחשוב על רשימות הבקרה כבנקים של מתגי הפעלה/כיבוי, אותם אתה מפעיל על ידי הגדרת מעט ל -1 וכיבוי על ידי הגדרת הסיביה ל 0. לחיישנים מבוססי שבבים I²C יש לרוב תריסר הגדרות תפעוליות או יותר לדברים כמו ביט- מצבים, הפרעות, בקרת קריאה-כתיבה, עומק, מהירות הדגימה, הפחתת רעש וכו ', כך שבדרך כלל עליך להגדיר סיביות במספר רשימות בקרה שונות לפני שתוכל לבצע קריאה בפועל.

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

אז אתחול חיישן I²C הוא תהליך רב שלבי וסדר הפעולות הנכון מוסבר לעתים קרובות בכתב הפוך, במקום פשוט בגליון הנתונים. הרשימה לעולם לא אומרת "כדי לקבל קריאה מחיישן זה, בצע (1), (2), (3), (4) וכו '", אך אתה מוצא תיאורים של סיביות פנקס הבקרה שאומרים "לפני שתגדיר ביט x בזה register עליך להגדיר את bit y במרשם הבקרה האחר הזה ".

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

שלב 4: התחל בתנועה - מד תאוצה

מדי תאוצה מודרניים הם מכשירי מיקרו אלקטרו-מכניים (MEMS), מה שאומר שהם מסוגלים להתאים לשבב קטן בתוך הגאדג'טים הקטנים ביותר. שיטה אחת למדידת האצה בה משתמשים מד תאוצה MEMS היא שימוש במסה מוליכה זעירה המונעת על מעיינות. האצת המכשיר גורמת למתיחות או התכווצות של המעיינות, וניתן למדוד את סטיית המסה המוליכה באמצעות שינוי קיבול ללוחות סמוכים וקבועים.

מדי תאוצה מוגדרים לפי התכונות הבאות:

  1. מספר הצירים, מאחד לשלושה צירים, המסומנים ב- X, Y ו- Z בתרשימי המפרט. שים לב שמדי תאוצה מסוימים נקראים 6 צירים או 9 צירים, אך זה רק אומר שהם מצורפים עם התקני MEMS אחרים כגון גירוסקופים ו/או מגנטומטרים. לכל אחד מהמכשירים האלה יש גם שלושה צירים, ולכן ישנן 3, 6 או 9 צירים יחידות מדידה אינרציאלית (IMU).
  2. סוג הפלט, אנלוגי או דיגיטלי. מד תאוצה דיגיטלי דואג לעצב את נתוני ההאצה לייצוג דיגיטלי הניתן לקריאה באמצעות I2C או SPI.
  3. טווח ההאצה הנמדד ב- g, כאשר 1g הוא התאוצה הנובעת מכוח המשיכה של כדור הארץ.
  4. מעבדי עזר שיכולים להוריד כמה מהחישובים הדרושים לניתוח הנתונים הגולמיים מה- MCU. לרוב מד התאוצה יש יכולת הפרעה פשוטה לזהות סף תאוצה (הלם) ומצב 0 גרם (נפילה חופשית). אחרים יכולים לבצע עיבוד מתקדם על הנתונים הגולמיים כדי להציע נתונים משמעותיים יותר ל- MCU.

שלב 5: ממשק עם בקר

מכיוון שאנו מכירים מיקרו -בקרי ESP במגמה, נשתמש ב- ESP32 כדוגמה שלנו. אז קודם כל אתה צריך Nodemcu-32s.

אל תדאג אם יש לך לוחות ESP אחרים או אפילו Arduino !!! אתה רק צריך להתקין את Arduino IDE והתצורה שלך לפי לוחות הפיתוח שלך, עבור Arduino, ESP NodeMCU, ESP32s וכו '… תצטרך גם סוג של חלקים I2C, בדרך כלל על לוח פריצה. במדריך זה אני הולך להשתמש ב- MMA8451 לוח פריצה של מד תאוצה דיגיטלי.

ומעט חוטי מגשר….

שלב 6: חיבורים

חיבורים
חיבורים

והנה פריסה.

השתמשתי בחיבור הבא מהמודול למעלה למודול Nodemcu-32s שלי.

ESP32s - מודול

3v3 - וין

Gnd - Gnd

SDA 21 - SDA

SCL 22 - SCL

"זכור, לרוב לא לכל לוחות הפיתוח (בעיקר במערכות ESP) יש pinout ברור ברור שיסייע לקבוע באילו סיכות משתמשים !! אז לפני החיבור, זיהוי הסיכות הנכונות של הלוח שלך לשימוש אילו סיכות מיועדות ל- SDA ו- SCL."

שלב 7: קוד

זה דורש את ספריית Adafruit

מתוך

הורד, פרק ותמצא תיקיית דוגמאות, בתיקייה פשוט פתח את MMA8451demo ב- Arduino IDE שלך והנה …

תראה את הקוד הבא עבור ממשק החיישן MMA8451 שלך עם הבקר שלך

#לִכלוֹל

#include #include Adafruit_MMA8451 mma = Adafruit_MMA8451 (); הגדרת void (void) {Serial.begin (9600); Wire.begin (4, 5); / * הצטרף לאוטובוס i2c עם SDA = D1 ו- SCL = D2 של NodeMCU */ Serial.println ("Adafruit MMA8451 test!"); if (! mma.begin ()) {Serial.println ("לא ניתן היה להתחיל"); בעוד (1); } Serial.println ("נמצא MMA8451!"); mma.setRange (MMA8451_RANGE_2_G); Serial.print ("טווח ="); Serial.print (2 << mma.getRange ()); Serial.println ("G"); } לולאת void () {// קרא את הנתונים 'הגולמיים' בספירות 14 סיביות mma.read (); Serial.print ("X: / t"); Serial.print (mma.x); Serial.print ("\ tY: / t"); Serial.print (mma.y); Serial.print ("\ tZ: / t"); Serial.print (mma.z); Serial.println (); / * קבל אירוע חיישן חדש */ sensors_event_t אירוע; mma.getEvent (& event); / * הצג את התוצאות (האצה נמדדת ב- m/s^2) */Serial.print ("X: / t"); Serial.print (event.acceleration.x); Serial.print ("\ t"); Serial.print ("Y: / t"); Serial.print (event.acceleration.y); Serial.print ("\ t"); Serial.print ("Z: / t"); Serial.print (event.acceleration.z); Serial.print ("\ t"); Serial.println ("m/s^2"); / * קבל את כיוון החיישן */ uint8_t o = mma.getOrientation (); switch (o) {case MMA8451_PL_PUF: Serial.println ("דיוקן מלפנים"); לשבור; מקרה MMA8451_PL_PUB: Serial.println ("דיוקן למעלה"); לשבור; מקרה MMA8451_PL_PDF: Serial.println ("דיוקן מלפנים"); לשבור; מקרה MMA8451_PL_PDB: Serial.println ("דיוקן למטה לאחור"); לשבור; מקרה MMA8451_PL_LRF: Serial.println ("חזית ימין לרוחב"); לשבור; מקרה MMA8451_PL_LRB: Serial.println ("נוף ימין אחורי"); לשבור; מקרה MMA8451_PL_LLF: Serial.println ("נוף חזית שמאלי"); לשבור; מקרה MMA8451_PL_LLB: Serial.println ("נוף אחורי שמאלי"); לשבור; } Serial.println (); עיכוב (1000); }

שמור, אמת והעלה ……

פתח את הצג הטורי ותראה משהו כזה, הזזתי את החיישן ומכאן הקריאות השונות

X: -2166 Y: 1872 Z: 2186

X: -2166 Y: 1872 Z: 2186X: -4.92 Y: 5.99 Z: 4.87 m/s^2

נוף קדמי שמאלי

X: -224 Y: -2020 Z: 3188

X: -5.10 Y: -3.19 Z: 7.00 m/s^2

דיוקן מלפנים

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

אבל המכשיר לא עובד ??

פשוט המשך לשלב הבא ……

שלב 8: הפעל את מכשיר ה- I2C שלך

שלבים בסיסיים לעבודה במכשירי I2C

בואו לחקור….

  • החיווט תקין.. (בדוק שוב)
  • התוכנית נכונה.. (כן, זו דוגמא לבדיקה..)

התחל עם שלבים לפתרון ….

שלב 1: הפעל את תוכנית סורק מכשירי I2C כדי לבדוק את כתובת המכשיר וראשית התקן I2C שלך בסדר

אתה יכול להוריד סקיצה ולבדוק את הפלט.

תוצאה - המכשיר פועל וכתובת החיישן נכונה

סורק I2C. סורק…

כתובת שנמצאה: 28 (0x1C) בוצע. נמצא מכשיר אחד.

שלב 2: בדוק את ספריית החיישנים

פתח את הקובץ Adafruit_MMA8451.h ומצא את כתובת המכשיר

תוצאה - כתובת שונה מהמכשיר שלי ??

/*================================================= ========================= I2C ADRESS/BITS --------------------- -------------------------------------------------- * /#define MMA8451_DEFAULT_ADDRESS (0x1D) //! <ברירת מחדל MMA8451 I2C, אם A היא GND, 0x1C /*======================= ==================================================== */

עשה - ערוך קובץ מפנקס (שנה כתובת) + שמור + הפעל מחדש את IDE

זה עובד. אתה יכול לקבל את הקריאות שלך.

אדן לא….. ???

שלב 3: בדוק Wire.begin מוחלף?

פתח את הקובץ Adafruit_MMA8451.c ומצא את Wire.begin.

תוצאה - הצהרה זו מוחלפת

/********************************************* ************************ //*! @brief הגדרת ה- HW (קריאת ערכי מקדמים וכו ')* / / ********************************* ***********************************/ bool Adafruit_MMA8451:: begin (uint8_t i2caddr) {Wire.begin (); _i2caddr = i2caddr;

עשה - ערוך קובץ מפנקס (הצהרת הערה) + שמור + הפעל מחדש את IDE

ולבסוף המכשיר עובד ☺…

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

מוּמלָץ: