- RDA5807M IC
- IC PT2258
- סכמטי
- רכיבים נדרשים
- איך אנו מקבלים נתונים מה- Google Assistant?
- הקמת חשבון Adafruit לתקשורת
- הגדרת מתווך IFTTT לרדיו FM
- קוד והסבר ארדואינו
- בדיקת רדיו FM נשלט באמצעות קול באמצעות Arduino
- שיפור נוסף
כיום, רובנו אוהבים להאזין למוזיקה, עם הטלפונים החכמים שלנו. אבל לפני כמה שנים זה לא היה המקרה, באותה נקודת זמן, מכשירי רדיו FM היו הבחירה הראשונה להאזנה למוסיקה, פודקאסטים, חדשות ואחרים. כיום אף אחד לא מקשיב לרדיו למוזיקה, חדשות ואחרים, סבתא וסבא הם יוצאים מן הכלל.
לכן, כדי להחיות קצת את התהילה הישנה של רדיו ה- FM, בפרויקט זה אני הולך לבנות רדיו FM נשלט קול באמצעות Google Assistance ו- IC הפופולרי RDA5870M Super Receiver IC.
כמו כן, בדוק את מעגלי הרדיו הקודמים שלנו ב- FM:
- רדיו FM מבוסס ארדואינו
- רדיו FM מבוקר בטלפון חכם באמצעות Arduino
- מעגל משדר FM פשוט
- כיצד לבנות מעגל משדר FM
RDA5807M IC
ה- RDA5807M הוא מכוון רדיו סטריאו FM מודרני מאוד עם שבב יחיד עם סינתיסייזר משולב לחלוטין, סלקטיביות IF, RDS / RBDS ומפענח MPX התומך בטווח התדרים 50 מגה עד 115 מגה הרץ. זה מקלט FM מקלט FM זול מאוד אשר דורש מעט מאוד רכיבים חיצוניים כדי לפעול באופן פונקציונלי. IC זה משתמש בממשק I2C כדי לתקשר עם כל מכשיר מאסטר, כך שכל התכונה הזו הופכת אותו למאוד מתאים למכשירים ניידים.
ל- IC זה יש מעבד שמע פנימי שאחראי על איכות השמע הנהדרת שלו.
חלק מהתכונות הבסיסיות כוללות-
- תמיכה ברצועות תדרים ברחבי העולם
- תמיכה ב- RDS / RBDS
- טיונר דיגיטלי נמוך עם IF
- סינתיסייזר תדרים דיגיטלי משולב לחלוטין
- בקרת רווח אוטומטי דיגיטלי (AGC)
- דחיפה בס
- תומך ישירות בעומס התנגדות 32Ω
- רגולטור LDO משולב ועוד
אתה יכול ללמוד עוד על IC זה על ידי מעבר על פרויקט זה מבוסס רדיו FM Arduino באמצעות RDA5807.
IC PT2258
ה- PT2258 הוא IC המיועד לשימוש כבקר נפח אלקטרוני בעל 6 ערוצים, IC זה משתמש בטכנולוגיית CMOS שתוכננה במיוחד ליישומי שמע ווידאו מרובי-ערוצים.
IC זה מספק ממשק בקרה I2C עם טווח הנחתה של 0 עד -79 dB ב -1 dB / צעד ומגיע בחבילה DIP או SOP עם 20 פינים.
חלק מתכונות היסוד כוללות-
- 6 ערוצי כניסה ופלט (עבור 5.1 מערכות שמע ביתיות)
- כתובת I2C הניתנת לבחירה (ליישום שרשרת דייזי)
- הפרדת ערוצים גבוהה (ליישום רעש נמוך)
- יחס S / N של> 100dB
- מתח ההפעלה הוא 5 עד 9 וולט
הסברנו בעבר על IC זה בפרויקט בקרת עוצמת הקול הדיגיטלית PT2258. אתה יכול לבדוק את הפרויקט אם אתה רוצה לדעת יותר על IC זה.
סכמטי
דיאגרמת מעגלים עבור רדיו FM נשלט על ידי Google עוזר להלן:
רכיבים נדרשים
- מיקרו-בקרת NodeMCU - 1
- בקר נפח דיגיטלי PT2258 - 1
- מודול רדיו FM RDA5807 - 1
- ממסר SPDT 6V - 1
- 1n4007 דיודה - 1
- מסוף בורג 5mmx2 - 1
- שקע אוזניות 3.5 מ"מ - 1
- ממיר רמת לוגיקה - 1
- נגד 10K, 5% - 4
- נגד 150K, 5% - 4
- נגד 100K, 5% - 2
- קבל 10uF - 6
- קבלים 0.1uF - 1
- חוט מגשר - 10
איך אנו מקבלים נתונים מה- Google Assistant?
התמונה לעיל נותנת לך את הרעיון הבסיסי של תהליך התקשורת בין Google Assistant ל- NodeMCU.
ל- Google Assistant הסמכות לשנות נתונים בשרת Adafruit IO כדי ש- IFTTT עם MQTT יעבוד כמתווך.
אם מתרחש שינוי כלשהו בצד השרת (Adafruit IO), זה בא לידי ביטוי בצד NodeMCU. כדי להשיג זאת, עליך לבצע את ההוראות המפורטות להלן -
הקמת חשבון Adafruit לתקשורת
ראשית, צור חשבון IO של Adafruit. היכנס ל- Adafruit IO עם האישורים שלך או הירשם אם אין לך חשבון. בעבר השתמשנו ב- Adafruit IO לבניית LED מבוקר Alexa, Raspberry Pi אוטומציה ופרויקטים רבים אחרים מבוססי IoT.
לאחר הכניסה לחשבון Adafruit, לחץ על לוח המחוונים ואז לחץ על פעולה> צור לוח מחוונים חדש .
לאחר מכן אנו הולכים להוסיף שם חדש ותיאור קצר של לוח המחוונים החדש שלנו .
לאחר שיצרת את לוח המחוונים, עליך להביא את שם המשתמש והמפתח הפעיל מחשבונך כפי שהוא נדרש בקוד הארדואינו. אתה יכול להשיג זאת על ידי לחיצה על סמל המפתח.
לאחר מכן, הכין שלוש בלוקים; בלוק Toggle אחד, בלוק מד אחד, בלוק טקסט אחד .
הבלוקים חשובים מאוד, מכיוון שחסימות אלה אחראיות לתקשורת בין סיוע בגוגל לבין ה- NodeMCU.
כדי ליצור חסימה, עליך ללחוץ על סימן + בפינה הימנית העליונה.
בשלב הבא אנו הולכים להכין את הבלוקים.
לאחר מכן, עליך להגדיר כל בלוק, לשם כך, עליך לסמן בלוק מסוים וללחוץ על השלב הבא.
עבור פרויקט זה, אין צורך לשנות הגדרות כלשהן למעט כפתור ההחלפה.
טקסט הלחצן המתחלף ב אותיות גדולות, אתה צריך להפוך אותו מכתב קטן ו לעדכן את השינויים.
זהו, זה כל הדברים שאתה צריך להגדיר ב- IO adafruit.
המסך הסופי שלי נראה כך-
הגדרת מתווך IFTTT לרדיו FM
כמו תמיד, הירשם אם אין לך חשבון או היכנס אם כבר יש לך חשבון.
כעת עליך ליצור יישומון. לשם כך, בצע את השלבים הבאים:
כדי להפוך היישומון, לחצו על שלך סמל חשבון ו לחץ על צור.
במסך היצירה, לחץ על סמל + לאחר if.
לאחר מכן, עליך לאפשר גישה לחשבון Google שלך .
לשם כך, עליך לחפש את Google Assistant בסרגל החיפוש וללחוץ על סמל Google Assistant.
במסך הבא עלינו לבחור טריגר, זכור, עשינו שלושה חסימות בשרת Adafruit IO, עלינו לעשות שם טריגרים לשלושת הבלוקים האלה.
ראשית, חסימת הרדיו, לשם כך, עלינו לבחור אמור ביטוי עם מרכיב טקסט .
במסך הבא עלינו להקליד מה ברצונך לומר ובמה העוזר של גוגל צריך לענות לך.
לאחר מכן לחץ על כפתור ההדק.
המסך הבא נראה בערך כך, מכיוון שהשלמתם את החלק אם , הגיע הזמן לחלק אז , לחצו על הסימן + לאחר מכן .
יוצג בפניך מסך כמו התמונה למטה, חפש את Adafruit ולחץ על סמל Adafruit.
לאחר מכן, אשר את חשבון Adafruit שלך באמצעות IFTTT, ואז לחץ על התחבר.
לאחר מכן, עליך ללחוץ על שלח נתונים ל- Adafruit IO.
לאחר מכן תוצג בפניך נפתח של עדכונים שיצרת קודם לכן בחשבון Adafruit.
בחר כל אחד ולחץ על צור פעולה, עליך לעשות זאת לשלושתם.
ועם זה מסמן את סופו של תהליך IFTTT, מסך היישומון הסופי שלי נראה כך,
קוד והסבר ארדואינו
קוד הארדואינו נמצא לשם ניהול כל התקשורת בין ה- IC והתקשורת בין Adafruit IO IFTTT ו- WIFI. הקוד השלם לרדיו FM זה של Arduino Nano ניתן בסוף הדרכה זו. הקוד מעט ארוך ומורכב, כאן הסברנו את הקוד השלם שורה אחר שורה.
ראשית, עלינו לכלול את כל הספריות הנדרשות, והן:
#לִכלוֹל
לאחר מכן, הגדירו את ה- SSID והסיסמה עבור ה- WI-FI, זהו ה- SSID וסיסמת הסיסמה של הנתב שלכם.
const char * ssid = "אנדרואיד"; // SSID של הנתב שלך const char * password = "12345678"; // סיסמת הנתב שלך
לאחר מכן אנו מגדירים שני בוליאנים ומשתנה, הבוליאנים משמשים להחזקת מצב התקשורת של ה- IC, ומשתנה עוצמת הקול משמש להגדרת עוצמת הקול.
סיר בול סטטוס; // 1 כאשר נוצרת תקשורת בין MCU לבין IC bool radioStatus; // 1 כאשר נוצרת תקשורת בין MCU ונפח IC int = 15; // רמת עוצמת הקול המוגדרת כברירת מחדל עם ה- IC מתחילה עם
לאחר מכן, הגדרנו סיכת GPIO בשם Relay_Pin להפעלה או כיבוי של המגבר.
#define Relay_Pin D7 // סיכה זו משמשת להפעלת וכיבוי הרדיו
בשלב הבא עלינו להגדיר את כל ההגדרות הדרושות כדי לתקשר עם Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // use 8883 for SSL #define AIO_USERNAME "debashis13" // החלף אותו בשם המשתמש שלך #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp"
ההגדרות שלהלן FIX_BAND היא הגדרה קניינית המשמשת את הספרייה.
המשפט המוגדר הבא מגדיר את עוצמת הקול הפנימית של המודול.
#define FIX_BAND RADIO_BAND_FM // <הלהקה תכוון לפי מערכון זה הוא FM. #define FIX_RADIO_VOLUME 6 /// <נפח ברירת המחדל של המודול.
לאחר מכן, הכינו את האובייקטים הנדרשים עבור ה- PT2258, ה- RDA5807M ו- WiFiClient.
PT2258 digitalPot; // PT2258 אובייקט RDA5807M רדיו; // לקוח WiFiClient אובייקט RDA5807M; // אובייקט WiFiClient
לאחר מכן הגדר את מחלקת הלקוחות MQTT על ידי העברת פרטי לקוח ה- WiFi ושרת MQTT ופרטי הכניסה.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// הגדר את מחלקת הלקוחות MQTT על ידי העברת לקוח ה- WiFi ושרת MQTT ופרטי הכניסה.
ואז עלינו להירשם כמנוי לעדכון. מה זה גורם לך לשאול?
אם ערכים מסוימים, חלק מהפרמטרים משתנים בשרת Adafruit, השינויים יבואו לידי ביטוי כאן.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // שיטות המשמשות כמנוי ל- Feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // שיטות המשמשות כמנוי ל- Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // שיטות המשמשות כמנוי לעדכון
להלן אב הטיפוס של הפונקציה לפונקציה MQTT_connect () .
בטל MQTT_connect (); // אב טיפוס לפונקציה עבור MQTT Connect
ואז אנו מתחילים בתהליך ההתקנה שלנו. בהתחלה, אנו מתחילים את תקשורת ה- UART בשיטת התחלה.
Serial.begin (9600); // UART מתחילים Serial.println (); // מוסיף שורה נוספת לריווח Serial.println (); // מוסיף שורה נוספת לריווח הבא, אנו עושים את כל הדבר הרגיל להתחבר ל- WiFI **************** כל הדברים הרגילים הנדרשים לחיבור WiFi ********************** / Serial.print ("מתחבר ל"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, סיסמה); בעוד (WiFi.status ()! = WL_CONNECTED) {עיכוב (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi מחובר"); Serial.println ("כתובת IP:"); Serial.println (WiFi.localIP ()); / **************** כל הדברים הרגילים הנדרשים לחיבור WiFi **********************
לאחר מכן, התקשר לשיטת Wire.begin () כדי ליצור חיבור I2C ואנחנו קוראים לשיטת Wire.setClock () כדי לתקן את תדר I2C ל -100 KHz מכיוון שזה המהירות המלאה של ה- PT2258 IC.
Wire.begin (); // התחל את רצף ההתחלה של I2C Wire.setClock (100000); // הגדרת שעון I2C ל- 100KHz
לאחר מכן, התקשר לשיטת init () הן ל- PT2258 והן ל- IC RDA5807 והחזק את מצב ההחזרה לבוליאנים שהוגדרו קודם לכן.
potStatus = digitalPot.init (); radioStatus = radio.init ();
לאחר מכן, בדוק אם ה- MCU הצליח לתקשר עם ה- IC או לא. אנו עושים זאת בשתי הצהרות אם אחרת .
אם (potStatus) {Serial.println ("נמצא מכשיר PT2258!"); } אחר {Serial.println ("נכשל ייזום PT2258"); } אם (radioStatus) {Serial.println ("נמצא מכשיר RDA5807M!"); } אחר {Serial.println ("נכשל ייזום RDA5807M"); }
לאחר מכן, התקשר לשיטת המנוי מספריית MQTT. נודיע לנו על ידי שרת MQTT אם חלו שינויים בעדכונים המנויים שלנו.
mqtt.subscribe (& Radio_Station); // הגדרת מנוי MQTT להזנת Radio_Station mqtt.subscribe (& Toggle_FM); // הגדרת מנוי MQTT להאכיל Toggle_FM mqtt.subscribe (& Volume); // הגדרת מנוי MQTT להזנת נפח
לאחר מכן, הגדרנו את סיכת הממסר כפלט ואת מצב הסיכה ל- LOW
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
לאחר מכן, הגדר עוצמת קול רדיו קבועה מראש, פרמטר זה מגדיר את עוצמת הקול הפנימית של ה- RDA5807 IC, המסמן את סוף תהליך ההתקנה שלנו.
radio.setVolume (FIX_RADIO_VOLUME); / / הבא הגדרנו את נפח הרדיו radio.setMono (false); // אנחנו לא רוצים שהשבב ייתן רדיו radio.setMute (false); // אנחנו לא רוצים שהשבב יושתק בהתחלה
אנו מתחילים את הלולאה על ידי קריאה לפונקציה MQTT_connect () אשר יוצרת חיבור לשרת MQTT.
בפונקציית MQTT connect, אנו מנסים שלוש פעמים ליצור חיבור לשרת MQTT.
אם היא מצליחה, נקבל הודעת הצלחה אחרת נקבל הודעת שגיאה.
בטל MQTT_connect () {int8_t ret; // מספר 8 שלם לאחסון הניסיונות החוזרים // עצור אם כבר מחובר. אם (mqtt.connected ()) {return; } Serial.print ("מתחבר ל- MQTT…"); uint8_t מנסה שוב = 3; ואילו ((ret = mqtt.connect ())! = 0) {// connect יחזיר 0 עבור Serial.println מחובר (mqtt.connectErrorString (ret)); Serial.println ("מנסה שוב לחיבור MQTT בעוד 5 שניות…"); mqtt.disconnect (); עיכוב (5000); // המתן 5 שניות שוב - אם (מנסה שוב == 0) {// בעצם למות ולחכות ל- WDT לאפס אותי בזמן (1); }} Serial.println ("MQTT מחובר!"); }
לאחר מכן, התחל ביצירת מצביע לאובייקט Adafruit_MQTT_Subscribe . נשתמש בזה כדי לקבוע איזה מנוי התקבל.
Adafruit_MQTT_ מנוי * מנוי;
לאחר מכן, אנו מחכים להודעת מנוי.
mqtt.readSubscription (timeInMilliseconds) יקשיב לזמן מסוים, לכל הודעה שמגיעה משרת MQTT.
אם היא תקבל הודעה לפני פסק הזמן, היא תשיב עם מצביע למנוי או שהיא פשוט תפסק ותחזיר 0. במקרה זה, היא תחכה ל -2 שניות.
while ((מנוי = mqtt.readSubscription (20000)))
אם מתרחש פסק זמן, מילוי הלולאה בזמן נכשל. אם לא, אנו משווים איזה מנוי ונקבל את המנויים הידועים שלנו.
בקוד זה אנו עושים זאת עבור כל שלושת העדכונים הרשומים שלנו.
אם (מנוי == & Toggle_FM) אם (מנוי == & רדיו_סטיישן) אם (מנוי == ונפח)
אלה היו שלושת הפרמטרים העיקריים שעליך להבין בסעיף הלולאה.
חלק זה של הקוד משמש לניטור והגדרת העדכון Toggle_FM .
אם (מנוי == & Toggle_FM) // האם זו הודעה מהעדכון Toggle_FM {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // הדפיסו את נתוני העדכון רק לצורך ניפוי באגים אם (String ((char *) Toggle_FM.lastread) == String ("on")) // אנו משווים את הנתונים שהתקבלו לפרמטר ידוע במקרה זה אנו מצפים ש- "on "מגיע מהחתך {// אבל לפני שאנחנו עושים את זה אנחנו צריכים להפוך אותו למחרוזת שהופכת את ההשוואה לסופר דיגיטלית קלה (D7, HIGH); // אם נקבל מחרוזת" על "מהשרת שאנחנו מכינים סיכת D7 HIGH} אם (String ((char *) Toggle_FM.lastread) == String ("off")) // שוב אנו בודקים את המחרוזת מ- {digitalWrite (D7, LOW); // אם נקבל מחרוזת "כבוי" מהשרת שאנו מכינים את הסיכה D7 LOW}}
חלק זה של הקוד משמש לניטור והגדרת העדכון Radio_Station .
אם (מנוי == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); אם (String ((char *) Radio_Station.lastread) == String ("Big FM")) // תשמע שאנחנו בודקים את המחרוזת Big FM {radio.setBandFrequency (FIX_BAND, 9270); // אם התנאי הנ"ל נכון אנו מכוונים את ערוץ radoi ל- 92.7MHz} // התהליך הנ"ל נמשך למטה אם (String ((char *) Radio_Station.lastread) == String ("Red FM")) { radio.setBandFrequency (FIX_BAND, 9350); } אם (String ((char *) Radio_Station.lastread) == String ("Radio Mirchi")) {radio.setBandFrequency (FIX_BAND, 9830); }}
חלק זה של הקוד משמש לניטור והגדרת הזנת עוצמת הקול.
אם (מנוי == ונפח) // // שומע אנו בודקים את נפח המחרוזת וזה ערך שלם בפורמט מחרוזת // עלינו להמיר אותו בחזרה למספר שלם כדי לשנות את עוצמת הקול בעזרת ה- PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); נפח = אטוי ((char *) Volume.lastread); // אנו משתמשים במתודה atoi () להמרת מצביע תווים לנפח שלם = מפה (נפח, 0,100,79,0); // מפה (value, fromLow, fromHigh, toLow, toHigh) // כ- pt2258 מבינים רק ערכים שלמים ב- dB // אנו ממפים את הערך 0dB - 79dB ל 0% - 100%. digitalPot.setChannelVolume (נפח, 0); // אחרי כל זה אנו מגדירים את עוצמת הקול עבור הערוץ 0 של PT2258 IC digitalPot.setChannelVolume (נפח, 1); // אחרי כל זה אנו מגדירים את עוצמת הקול של ערוץ 1 של ה- PT2258 IC}}
בדיקת רדיו FM נשלט באמצעות קול באמצעות Arduino
כדי לבדוק את המעגל, נעשה שימוש במנגנון הבא-
- שנאי בעל ברז 13-0-13
- שני רמקולים 20W 20W כעומס.
- טלפון לשימוש ב- Google Assistant.
במאמר קודם, הראיתי לך כיצד להכין מגבר אודיו פשוט 2x32 וואט עם TDA2050 IC, אני הולך להשתמש בזה לצורך הדגמה זו, גם, הפרעתי את הפוטנציומטר המכני וקצרתי שני מובילים עם שני כבלים מגשרים קטנים. כעת, בעזרת שני לחצני כפתור, הצלחתי לשנות את עוצמת הקול של המגבר.
שיפור נוסף
ישנם שיפורים רבים נוספים שניתן לבצע במעגל זה.
- ישנן בעיות רעש שונות מכיוון שמקור שמע עובד ליד ה- NodeMCU, לכן עלינו ליישם מיגון נוסף כדי לשפר את חסינות הרעשים.
- בניית המעגל הכולל ל- PCB תשפר את חסינות הרעש.
- ניתן להוסיף מסננים נוספים ל- IC זה כדי למנוע רעש.
אני מקווה שאהבת את המאמר הזה ולמדת ממנו משהו חדש. אם יש לך ספק, אתה יכול לשאול בתגובות למטה או להשתמש בפורומים שלנו לדיון מפורט.