התחל למדוד את העולם סביבך עם הפרויקט המעשי והמקיף הזה.
טייק אווי מפתח
- ל-Raspberry Pi אין קלט אנלוגי, אבל אתה יכול להוסיף ADCs חיצוניים כדי להמיר מתחים מהעולם האמיתי לצורה דיגיטלית להקלטה, מניפולציה ובקרה.
- אפשרויות ADC פופולריות כוללות את MCP3004/MCP3008 עבור מהירות ודיוק או ADS111x עבור קריאות של 16 סיביות בקצב דגימה איטי יותר.
- ה-ADS1115 מבית Adafruit הוא אופציה פשוטה עם מגבר חיזוק לתכנות (PGA) המאפשר לך לזהות הפרשי מתח קטנים ולהתאים את הגבר במהלך התוכנית. לחבר אותו עם Raspberry Pi באמצעות I2C הוא פשוט.
מחוץ לקופסה, ל-Raspberry Pi חסרה כניסה אנלוגית. זה מציב אותו בעמדת נחיתות בהשוואה ללוחות מבוססי מיקרו-בקר כמו ה- Arduino.
אבל אל ייאוש: יש הרבה אפשרויות לשקול. התחל לעבוד עם Raspberry Pi ו-ADC חיצוני.
למה להוסיף כניסות?
העולם האמיתי מלא בתופעות שאם יש לך את המעגל הנכון, ניתן לתאר בקלות באמצעות מתח. קבל את המתחים האלה בצורה דיגיטלית, ותוכל להקליט אותם, לתפעל אותם ולהשתמש בהם כדי לשלוט בפרמטרים והתקנים אחרים.
ייתכן שאתה מחפש לעקוב אחר הלחות של האדמה שלך, הטמפרטורה של החממה שלך, או משקל האוגר שלך. אולי אתה מחפש להוסיף בקרת עוצמת הקול ל-Pi שלך, לבנות בנק שלם של פאדרים או לעצב ג'ויסטיק מאפס. האפשרויות הן, פחות או יותר, בלתי מוגבלות.
אפשרויות עבור ADCs
אז איזה ADC הכי מתאים למתחילים?
בין האפשרויות הפופולריות והפשוטות ביותר הן MCP3004 (ו MCP3008) שבבים מ-Microchip. תקבלו ארבעה (או שמונה) ערוצים של 10 ביטים כל אחד, שיכולים לקרוא עד 200 kSPS. מצד שני, ישנם מכשירי ADS111x מבית Texas Instruments, שקוראים 16 סיביות ב-860 SPS. אז, יש פשרה בין מהירות ודיוק (וכמובן, מחיר).
מיקרו-בקרים רבים מגיעים עם ADCs מובנים. ה-ATMega שאתה מוצא בארדואינו הממוצע יציע מספר ערוצים של 10 סיביות, בנוסף לכל השאר. זה מה שמאפשר לארדואינו לספק כניסות אנלוגיות במקום שבו ה-Raspberry Pi לא יכול. אם כבר יש לך Arduino מעורב בהתקנה שלך, ו-10 סיביות זה מספיק נאמנות, אז זו עשויה להיות הדרך הקלה ביותר ללכת.
כאן, נשאיר את זה פשוט, עם ADS1115 מבית Adafruit.
מהו מגבר הגבר הניתן לתכנות?
שבב זה מגיע עם כמה תכונות מעניינות, כולל מגבר רווח לתכנות (PGA). זה יאפשר לך להגדיר את טווח הערכים הרצוי בצורה דיגיטלית, עד לשבריר וולט. עם מספר הערכים ש-16 סיביות יכולים לייצג, זה יאפשר לך לזהות הבדלים של כמה מיקרו-וולט בלבד.
היתרון כאן הוא שאתה יכול לשנות את הרווח באמצע התוכנית. שבבים אחרים, כמו MCP3004, נוקטים בגישה שונה; הם מגיעים עם פין נוסף, שאליו אתה יכול לספק מתח ייחוס.
מה לגבי ריבוי?
מרבב (או mux) הוא מתג המאפשר לקרוא כניסות רבות באמצעות ADC יחיד. אם שבב ה-ADC שלך מגיע עם פיני קלט רבים, אז יש ריבוי פנימי כלשהו. ה-mux של ה-ADS1115 מאפשר ארבע כניסות, אותן ניתן לבחור דרך האוגרים הפנימיים.
טיפול ברישום
ה-ADS1115 מספק את האפשרויות הללו, ועוד כמה חוץ מזה. אתה יכול להתמודד עם המרבב, להתאים את ההגבר, להפעיל את ההשוואה המובנית, לשנות את קצב הדגימה ולהכניס את המכשיר למצב שינה עם צריכת חשמל נמוכה, הכל על ידי הפעלת כמה מתגים.
אבל איפה המתגים האלה? הם נמצאים בתוך החבילה, בצורה של פיסות זיכרון קטנות מאוד שנקראות רושמת. כדי להפעיל תכונה נתונה, אתה רק צריך להגדיר את הביט הרלוונטי ל-1, ולא ל-0.
מסתכל על גיליון הנתונים של ADS111x, תגלו שהדגמים האלה מגיעים עם ארבעה אוגרים, כולל אוגרי התצורה השולטים בהתנהגות המכשיר.
לדוגמה, סיביות 14 עד 12 שולטות במרבב. באמצעות שלושת הביטים הללו, אתה יכול לבחור מתוך שמונה תצורות. זה שתרצה כאן הוא "100", אשר ייתן את ההבדל בין קלט אפס לאדמה. סיביות 7 עד 5, לעומת זאת, קובעות את קצב הדגימה. אם אתה רוצה את המקסימום של 860 דגימות לשנייה, אתה יכול להגדיר את אלה ל-"111".
ברגע שאתה יודע אילו אפשרויות להגדיר, יהיו לך שני בתים לשלוח ל-ADC. אם מאוחר יותר תרצה להגדיר ביט בודד לכאן או לכאן, אז אתה יכול להתמודד איתם בנפרד באמצעות אופרטורים סיביים.
כאן זה עלול לבלבל. במקרה זה, הבינארי אינו מייצג ערך, אלא את הערכים של מתגים בודדים. אתה יכול לבטא את המשתנים האלה כמספר אחד גדול, בעשרוני או בהקסדצימלי. אבל אם אתם רוצים להימנע מכאבי ראש, כדאי להיצמד לגרסה הבינארית, שקל יותר לקריאה.
חוט את זה
אתה יכול לחבר את המכשיר הזה ישר ללוח הלחם. כניסת המתח החיובי תקבל בכל מקום בין 2 ל-5.5 וולט, מה שאומר שמסילת ה-3.3 וולט ב-Raspberry Pi תעבוד יפה.
חברו את כניסות ה-SDA וה-SCL למקבילים ב-RPi, ועשו את אותם דברים עם האדמה ו-3.3v. קבל פוטנציומטר בין קווי האדמה למתח, והכנס את ההובלה האמצעית לכניסה הראשונה של ה-ADC. זה כל מה שאתה צריך כדי לצאת לדרך!
התמודדות עם I2C
ADCs שונים פועלים באמצעות פרוטוקולים שונים. במקרה של ADS1115 שלנו, אנחנו הולכים להשתמש ב-I2C.
הדוגמה הבאה תיצור אינטראקציה עם ה-ADC באמצעות Python. אבל לפני שתעשה את זה, תצטרך להגדיר את זה. הגרסאות האחרונות של Raspberry Pi OS הפכו את זה לפשוט מאוד. פנה אל העדפות > תצורת Raspberry Pi. ואז, מה ממשקים לשונית, לעבור I2C עַל.
כדי לבדוק שהכל עובד, פתח מסוף והפעל:
sudo i2cdetect -y 1
פקודה זו תוציא רשת. בהנחה שהכל עובד וחיברת אותו כהלכה, תראה ערך חדש מופיע ברשת. זו הכתובת של ה-ADC שלך. זכור כאן שזה ערך הקסדצימלי, אז אתה צריך להקדים אותו "0x" כאשר אתה משתמש בו בקוד למטה. הנה זה 0x48:
ברגע שיש לך את הכתובת, תוכל להשתמש בספריית SMBus כדי לשלוח פקודות I2C. אתה תתמודד כאן עם שתי שיטות. הראשון הוא write_word_data(), שמקבל שלושה ארגומנטים: כתובת המכשיר, האוגר שאליו אתה כותב והערך שאתה רוצה לכתוב.
השני הוא read_word_data(), שמקבל רק את כתובת ההתקן והרישום. ה-ADC יקרא ברציפות מתחים ויאחסן את התוצאה במאגר ההמרות. בשיטה זו, אתה יכול לאחזר את התוכן של אותו רישום.
אתה יכול לייפות קצת את התוצאה, ואז להדפיס אותה. לפני שאתה חוזר לתחילת הלולאה, הצג השהיה קצר. זה יבטיח שאתה לא מוצף בנתונים.
from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010))# define the top of the range
TOP = 26300whileTrue:
# read the register
b = bus.read_word_data(addr, CONVERSIONREG)# swap the two bytes
b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)
# subtract half the range to set ground to zero
b -= 0x8000# divide the result by the range to give us a value between zero and one
b /= TOP# cap at one
b = min(b, 1)# bottom is zero
b = max(b, 0)
# two decimal places
b = round(b, 2)
print(b)
time.sleep(.01)
כמעט סיימת. מפה את טווח הערכים שאתה מקבל לזה שאתה מעדיף, ולאחר מכן חתוך למספר המקומות העשרוניים הרצויים. אתה יכול להתאים את פונקציית ההדפסה כך שתדפיס ערך חדש רק כאשר הוא שונה מהערך האחרון. אם אתה לא בטוח לגבי מקסימום, דקה, ו עִגוּל, אתה יכול עיין ברשימה שלנו של 20 פונקציות Python החשובות ביותר!
התמודדות עם רעש
כעת, אלא אם כן ההגדרה שלך סופר, סופר מסודרת ומסודרת, תבחין ברעש. זהו החיסרון הטבוע בשימוש ב-16 סיביות ולא רק בעשרה: הרעש הקטן הזה יהיה מורגש יותר.
על ידי קשירת הקלט הסמוך (כניסה 1) לאדמה, ושינוי המצב כך שאתה משווה בין כניסות 1 ו-2, אתה יכול לקבל תוצאות הרבה יותר יציבות. אתה יכול גם להחליף את כבלי המגשרים הארוכים ואוספי הרעשים האלה לקטנים, ולהוסיף כמה קבלים בזמן שאתה עושה את זה. גם הערך של הפוטנציומטר שלך יכול לעשות הבדל.
יש גם אפשרויות תוכנה. אתה יכול ליצור ממוצע מתגלגל, או פשוט להתעלם משינויים קטנים. החיסרון שם הוא שקוד נוסף יטיל עלות חישובית. אם אתה כותב הצהרות מותנות בשפה ברמה גבוהה כמו Python, ולוקח אלפי דגימות בכל שנייה, העלויות הללו יתערבו במהירות.
התקדם עם הרבה שלבים אפשריים הבאים
ביצוע קריאות דרך I2C הוא די פשוט וזה נכון במידה רבה לגבי שיטות אחרות, כמו SPI. אמנם נראה שיש הבדלים גדולים בין אפשרויות ה-ADC הזמינות, אבל האמת היא שברגע שאחת מהן עובדת, קל ליישם את הידע על האחרות.
אז למה לא לקחת את הדברים רחוק יותר? קשרו פוטנציומטרים מרובים יחד, או נסה לקרוא את האור, הקול או הטמפרטורה. הרחב את הבקר שיצרת זה עתה, וצור התקנה של Raspberry Pi שהיא ממש מעשית!