מודול BLE של חברת Renesas פותר חלק מהבעיות והקשיים של מייקרים, שרוצים להוסיף תקשורת אלחוטית מקומית לפרוייקטים שלהם. הנה פרטים בסיסיים על המודול ועל אופן השימוש בו.
החיפוש אחר הגביע הקדוש
מרגע שהתחלתי לעבוד עם ארדואינו ועד היום, תמיד היו בעיות סביב העניין של תקשורת רדיו לטווח קצר. זה יכול היה להיות אמינות נמוכה (כגון ה-RF KIT הזכור לרע), צריכת חשמל גבוהה, מודול מגושם, זמינות לא מובטחת (כמו עם ה-HC-11 המבטיח שנכחד כמעט לגמרי מהשוק), פרוטוקול לא ברור, מחיר גבוה – כל פרויקט ופרויקט עם אלמנט אלחוטי, שרציתי לעשות לעצמי או ללקוחות, נתקל באחד או יותר מהמכשולים האלה. וזה עוד לפני שדיברנו על הצל הכבד של משרד התקשורת, שאיים "להתלבש" על כל מודול שהוזמן מסין ולעכב או להחרים אותו, אפילו אם בפועל הוא משדר בתדרים ובעוצמות חוקיים לגמרי.
גם למי שהיה מוכן לספוג את עלויות החומרה והמשלוח ולהזמין מודולים של חברות מוּכּרוֹת דרך אתרים מקצועיים (מה שפותר, בגדול, את בעיית משרד התקשורת), נתקל בקושי בתחילת העשור הנוכחי: המחסור בשבבים הביא למחסור קיצוני גם במודולי רדיו. אתה אדם פרטי, לקוח קטן? אין מודולים בשבילך. עד שיום אחד הופיע פתאום שחקן חדש: מודול BLE של Dialog (שנרכשה לפני כשנתיים על ידי Renesas), שיש לו הכול-
- חוקי ותקני למהדרין
- מתוצרת מוכרת ואמינה
- קטן ולא זקוק לאנטנה חיצונית
- זמין בכמויות אדירות
- חסכוני בחשמל (כי BLE)
- מחיר מהנמוכים בקטגוריה
- פרוטוקול AT command מבטיח
למי שלא זוכר: פקודות AT הן סוג ממשק נפוץ מאוד עם מודולי רדיו. המיקרו-בקר המנהל מדבר איתם דרך תקשורת UART קווית רגילה, בפורמט טקסט קריא (ASCII) שכל פקודה בו מתחילה באותיות "AT". הפקודות עצמן הן לא לפי סטנדרט, וכל יצרן בוחר אם ואיך להגדיר אותן.
להגיע למצב Codeless
מלא התרגשות מהתגלית החדשה, מיהרתי להזמין כמה יחידות (זה היה בשנה שעברה), ורק אז התיישבתי לקרוא את המפרטים. תוך זמן קצר הבנתי שזה לא יהיה פשוט כמו שנראה במבט ראשון.
המודול הוא לא "סתם" מודול תקשורת: בפנים מסתתר מיקרו-בקר ARM עצמאי, שיכול לנהל בעצמו מערכת שלמה. מי שרוצה ללמוד איך עובדים איתו ישירות יכול להוריד את סביבת הפיתוח והספריות של Dialog/Renesas, ואלה כוללות גם את יכולות ה-Bluetooth שבמודול. לעומת זאת, מי שמעדיף לנהל את התקשורת "מבחוץ" יכול להשתמש במצב Codeless – כלומר, שליטה במודול באמצעות פקודות AT. הבעיה היא שכדי להגיע למצב Codeless הנוח הזה צריך לצרוב, באופן חד-פעמי, קובץ מוכן-מראש על המודול – ובשביל זה צריך צורב עם ממשק JTAG.
הנה קישור לדף ההורדה של Dialog Smartbond Flash Programmer. זו תוכנה קטנה למחשב שיכולה להוריד בעצמה את הקבצים הרלוונטיים מהרשת, ולצרוב אותם דרך הצורב (אני השתמשתי ב-J-Link EDU, יש גם פתרונות אחרים). נכון להיום, יש ארבע אפשרויות הורדה של Codeless:
השנייה בתמונה (שכתוב בה DA14531-01) לא רלוונטית למודול הספציפי שלנו. כל אחת משלוש האחרות תומכת בתת-קבוצה שונה של פקודות ה-AT, כפי שמצוין בדף פירוט הפקודות, אבל הפקודה השימושית AT+RSSI, שמדווחת על עוצמת השידור הנקלט, נתמכת אך ורק ב-"Standalone Set Two", אז השתמשתי בקובץ הזה בניסויים שלי.
המגבלות
לפני שאתם רצים להזמין מודולים, הנה רשימה התחלתית של חסרונות ומגבלות שמצאתי, או שטרם גיליתי איך אפשר להתגבר עליהם (אם בכלל):
- המודול מותאם לעבודה ב-3V3, אי אפשר להתממשק ישירות ל-5V
- המגעים של המודול הם צדדים (Castellated) ובריווח של 1.5 מ"מ – לא נוח לפרוטוטייפינג בלי PCB שנתכנן במיוחד.
- פרוטוקול התקשורת BLE ייחודי ל-Renesas, אז לא ניתן לכתוב בקלות אפליקציה לסמארטפון שתתקשר עם המודול בפרוטוקולים סטנדרטיים.
- תקשורת ה-UART עם המודול ב-"Set Two" מוגבלת ל-57600 באוד, לכן זה הסף העליון לקצב העברת המידע בין מודולים – לא כולל עיכובי BLE למיניהם.
- החיבור האלחוטי הוא בין שתי יחידות בלבד, אחת מוגדרת כ-Central ואחת כ-Peripheral. המפרטים מזכירים אופציה של Broadcaster (שולח נתונים "לקריאה בלבד") אבל לא הצלחתי להפעיל אותה.
- התקשורת באמצעות פקודות AT מחייבת עיבוד של מחרוזות טקסט ASCII, מה שיכול להעמיס קצת על המיקרו-בקר המנהל.
בלינק מרחוק
אם לא התייאשתם מכל מה שכתבתי למעלה, בואו נתקדם ונראה הדגמה פשוטה (יחסית), של הדלקת לד מרחוק באמצעות שני מודולי DA14531MOD. ההדגמה מתבצעת על PCB ייעודי שערכתי בשביל בדיקות וניסויים. חוץ מהמודול יש בו מקום לסוללת CR2032, קונקטור ל-J-Link, וכן לחצן שמתחבר לפין 9 ולד אדום שמתחבר לפין 11. מיפוי הפינים של המודול מופיע ב-Datasheet שמורידים מדף המוצר הזה.
דבר ראשון – וכפי שציינתי, חד-פעמי – נצרוב לשני המודולים את הקושחה Codeless Standalone Set Two. זה לוקח שניות ספורות. תוכנת הצריבה אינה יודעת להפעיל את אספקת החשמל מהצורב, אז עלינו לספק למודולים חשמל עצמאי.
ניקח אחד מהמודולים הצרובים ונשים אותו בצד, עם סוללה. זה יהיה ה-Peripheral, המודול הנשלט. לא צריך לומר לו במפורש שהוא כזה.
למודול השני, השולט, נתחבר מהמחשב באמצעות תוכנת טרמינל כלשהי ודרך מתאם USB-to-UART מתאים ל-3V3. שלושה חוטים יספיקו – לאדמה, ל-RX של המודול (פין 5) ול-TX שלו (פין 6). קצב התקשורת כאמור 57600 באוד, וחשוב מאוד לזכור – כל מחרוזת שנשלח למודול חייבת להסתיים בתו CR (מס' 13 ב-ASCII).
מודול מתעורר ישלח אוטומטית דרך ה-UART את המחרוזת
+READY
אבל אם שמנו סוללה לפני החיבור למתאם ה-UART, לא נראה כמובן את המחרוזת הזו. כדי לבדוק שהחיבור עובד, נשלח את הפקודה הכי בסיסית:
AT
אם כל החיבורים נכונים, אנחנו אמורים לראות את המענה הזה:
AT
OK
הפקודה AT הופיעה כחלק מהמענה כי כברירת מחדל, המודול חוזר על הפקודה שקיבל (echo). אפשר לנטרל את זה באמצעות הפקודה:
ATE=0
המודול יחזור על הפקודה הספציפית הזו, אבל יריץ אותה – ובכל הפקודות העתידיות נקבל רק את התשובות נטו, עד שנשלח פקודה הפוכה ATE=1. כעת נרצה להגדיר למודול תפקיד Central, אך לשם כך חייבים להפסיק קודם את ה-Advertising שהוא מבצע. כל זה נעשה בשתי פקודות:
AT+ADVSTOP
AT+CENTRAL
כדי למצוא את המודול הנשלט, נריץ סריקה:
AT+GAPSCAN
התשובה יכולה להיראות בערך ככה:
SCANNING
( ) CB:4E:AA:BB:CC:48,R, Type: ADV, RSSI:-67
( ) CB:4E:AA:BB:CC:48,R, Type: RSP, RSSI:-67, RSP:A_Device
( ) 6C:02:E0:BB:CC:DD,P, Type: ADV, RSSI:-71
( ) 6C:02:E0:BB:CC:DD,P, Type: RSP, RSSI:-70, RSP:0x76EB
(*) 48:23:35:0B:C7:11,P, Type: ADV, RSSI:-52
( ) 48:23:35:0B:C7:11,P, Type: RSP, RSSI:-52, RSP:CLv2-CodeLess
SCAN COMPLETE
OK
במדריכים למשתמש לא מצאתי מה המשמעות המדויקת של הכוכבית בין הסוגריים, אך במקרה או לא במקרה, ההתקן המסומן הוא המודול השני שלנו. אותה כתובת מופיעה גם בשורה הבאה, עם הטקסט המסגיר CLv2-CodeLess. אז אנחנו יודעים לאיזו כתובת להתחבר, וכך נעשה זאת:
AT+GAPCONNECT=48:23:35:0B:C7:11,P
התשובה, כעבור שנייה בערך, אמורה להיראות כך:
CONNECTING
+CONNECTED
OK
את הפעולות הבאות, של הגדרת פין במודול הרחוק כפין פלט והפעלה/כיבוי שלו, נבצע בעזרת הקידומת ATr – שימו לב ל-"r" בסוף, שפירושו "remote". הקוד עבור "פין פלט פשוט" הוא 4, אז כדי להגדיר את פין 11 לשליטה בלד נשלח את הפקודה:
ATr+IOCFG=11,4
ואז נפעיל ונכבה אותו עם הפקודות
ATr+IO=11,1
ATr+IO=11,0
וזה עובד. הפקודות מועברות דרך תקשורת ה-BLE הסמויה בין המודולים, והלד המרוחק נדלק וכבה כרצוננו. נהדר. בפוסט הבא נדבר על צריכת חשמל, נלמד עוד כמה פקודות ונראה איך אפשר לשלוח מידע יותר מורכב מצד לצד.
כלומר, אם הצלחתי להבין נכון מהשורות האחרונות, אם הפעולות שאמורות להתבצע בצד ה"קולט" הן פשוטות יחסית אז בכלל אין צורך בבקר נוסף! נשמע יתרון גדול.
בנוסף, אני יודע שאתה לא חובב של הESP בגלל התיעוד החלקי שלהם, אבל אם כבר משתמשים ברכיב תקשורת שהוא כבר בקר בפני עצמו, הESP עושה את זה גם כן, ומהניסיון המועט שלי באמינות לא רעה… באופן אישי שימוש כזה מרגיש ממש אוברקיל ברוב המקרים ולכן דוחץ אותי לחפש מודולים פשוטים ש"רק" יודעים לשדר ולקלוט, בלי יכולת בקרה של ממש
המשפט הראשון בתגובתך – בדיוק ככה. לשליטה מרחוק ברמה בסיסית (כתיבה/קריאה של פיני IO ספורים ביחידה המרוחקת), מספיק לשים שם מודול אחד וזהו.
לגבי ESP32, מההתנסות הקצרה-מאוד שלי איתם בעבר ומחיפוש שטחי לאחרונה, היה לי רושם שקשה יותר להשיג אותם, שהם גדולים יותר פיזית, צורכים יותר חשמל ושההגדרה שלהם יותר מורכבת. אבל יכול להיות שאני טועה. אף פעם לא מזיק לבדוק ולהכיר עוד אופציות 🙂
אני דווקא התכוונתי לESP8266…
עדיין משתמשים בו? היה לי רושם שה-ESP32 המתקדם-יותר תפס את מקומו בשוק ובעולם המייקינג, אבל אני באמת לא בעניינים בקטע הזה. אכן היו מודולים די קטנים, נדמה לי שצריכת הזרם שלהם גבוהה משמעותית משל המודולים בפוסט.