עוד משחקים עם מודולי DA14531MOD

אחרי שהבנו איך להשתמש במודולי ה-BLE לתקשורת נתונים בסיסית (חלק ראשון, חלק שני), בואו נראה אילו "בונוסים" קטנים מוסיפה לנו קושחת ה-Codeless.

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

אגב, פרט חשוב: בפוסטים הקודמים, כל הפקודות שהצגתי התחילו באותיות AT או ATr, ואחריהן סימן "+". מסתבר שהפלוס הזה מיותר והפקודות יפעלו גם בלעדיו! אך למען העקביות (עם עצמי ועם המדריכים ברשת) אמשיך לציין את ה-"+".

קריאת מתח אנלוגי (ADC)

קושחת Codeless לא מאפשרת לשמור הגדרות בזיכרון בלתי-נדיף, זאת אומרת שבכל פעם שהמודול שמשמש בתפקיד "Central" מתנתק ממקור החשמל ומתחבר מחדש, מישהו צריך לתת לו מחדש דרך UART קווי את פקודות ההתחברות, הגדרות ה-GPIO וכו'. לעומת זאת את המודול השני, ה-"Peripheral", אפשר לאתר ולהגדיר מרחוק דרך ה-Central, מה שאומר שהיחידה המרוחקת יכולה להיות מבוססת על מודול ה-BLE בלבד, ללא מיקרו-בקר נוסף, ואנחנו נתפעל את הפינים שלה בשלט רחוק. כבר ראינו איך עושים את זה ל-On/Off דיגיטלי, כעת נראה את האופציות המתקדמות יותר – ADC ו-PWM.

הגדרת פין IO כ-"5" הופכת אותו לפין קלט אנלוגי. בתיאור הפקודה כתוב שיש רק ארבעה פינים שיכולים למלא את התפקיד הזה. בפועל, אך ורק פין 7 לא גרם להודעת שגיאה… אז נראה שנכון לעכשיו יש לנו ערוץ ADC אחד ויחיד:

ATr+IOCFG=7,5

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

ATr+ADC=7

היא תחזיר לנו ערך בן 10 ביטים, בטווח 0-1023, כרגיל כמחרוזת טקסטואלית שמסתיימת בתווי שורה חדשה. אחרי זה תבוא המחרוזת OK שמגיעה בסיום כל הרצת פקודה מוצלחת. בדקתי את זה עם פוטנציומטר ובגדול נראה שזה עובד. חשוב לזכור שמתח הרפרנס (והמקסימום) הוא המתח של אספקת החשמל למודול, שאמור להיות 3V3 אבל עשוי להשתנות בהתאם להתרוקנות סוללה וכדומה.

הפקת אות PWM

הפקה של PWM (כמו analogWrite בארדואינו) יכולה להיות שימושית – בתיווך דרייבר מתאים – להפקת צליל, לשינוי עוצמת תאורה או לשליטה במהירות של מנוע DC. לרוע המזל, האפשרויות ב-Codeless מוגבלות ומגבילות מאוד. ראשית, עלינו להגדיר את פין ה-GPIO הרצוי עם הקוד "24". למשל:

ATr+IOCFG=9,24

כאן, כל הפינים יכולים לקבל את התפקיד – אבל האות שייווצר יהיה משותף לכולם! בפקודת PWM שנראה מייד אי אפשר לבחור פין ספציפי, וזה אומר שאות זהה יופיע בו-זמנית בכל הפינים שהוגדרו עם הקוד 24…

בפקודה עצמה אנחנו בוחרים תדר (1000 עד 500000 כולל), את ה-Duty cycle (0 עד 100 כולל), וגם כמה אלפיות שנייה כל העסק יימשך (100 עד 10000 כולל, כלומר 0.1 עד 10 שניות). גיליתי שאם שולחים פקודת PWM בזמן שפקודת PWM קודמת רצה, מתקבלת הודעת שגיאה. המשמעות היא שלא ניתן ליצור אות PWM שנמשך ברציפות יותר מ-10 שניות.

אז הנה הפקודה להפקה, במודול המרוחק, של אות PWM בתדר 2KHz, עם Duty cycle של 25% ולמשך 6.4 שניות:

ATr+PWM=2000,25,6400

ועוד נקודה חשובה מאוד: פקודת PWM נתמכת רק במודולים עם קושחת Codeless Standalone. אם נצרוב למודול את Standalone Set Two, שבה השתמשנו בפוסטים הקודמים, הפקודה לא תזוהה אצלו, בין אם היא נשלחה אליו דרך UART קווי או ממודול Central מחובר. מצד שני, אם הפקודה נשלחת מרחוק, המודול השולח יכול להיות עם איזו קושחה שנרצה – הוא רק מעביר את הפקודה, לא חייב להכיר אותה בעצמו.

טיימרים

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

נניח שהמיקרו-בקר שלי רוצה ללכת לישון, ושהמודול BLE יעיר אותו בעוד ארבע שניות באמצעות סיגנל קצרצר מפין 11, שכבר הוגדר כפין פלט. קודם כל, נאחסן את שתי הפקודות, להתחלת הסיגנל ולסיומו, בסלוט – לצורך העניין, סלוט 2:

AT+CMDSTORE=2,AT+IO=11,1;AT+IO=11,0

הפקודות להרצה עתידית מופרדות ביניהן בנקודה-פסיק. עכשיו נגדיר את טיימר 3 שיריץ את הפקודות מסלוט 2 בעוד ארבע שניות. שימו לב שפרק הזמן מוגדר ביחידות של מאית שנייה:

AT+TMRSTART=3,2,400

אם נרצה לעצור את הטיימר ולבטל את הפעולה לפני סיום הספירה לאחור, אפשר להשתמש בפקודה הזו:

AT+TMRSTOP=3

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

אגב, ניתן להריץ פקודות מסלוט גם בלי תיווך של טיימר, עם הפקודה הישירה:

AT+CMDPLAY=3

אבל הנה הקאץ' המעצבן, שגיליתי בדרך הקשה כי הוא לא מתועד בשום מקום: בניגוד לשכל הישר, פקודות ATr, שמיועדות למודול מרוחק, לא פועלות מתוך סלוטים! פניתי ל-Renesas דרך הפורום המתאים גם כדי לוודא שהבנתי נכון (אכן כן), וגם כדי לבקש שיתקנו את העניין (נראה מה ייצא מזה). בינתיים, תזכרו ש-CMDPLAY וטיימרים יכולים להריץ רק פקודות מקומיות.

חידה קטנה לחובבי הז'אנר: מה לדעתכם יקרה אם נשים בסלוט 3 פקודת CMDPLAY שתריץ את סלוט 2, ובסלוט 2 נשים פקודת CMDPLAY שתריץ את סלוט 3? הייתי מוכרח לנסות כמובן, וכמו שציפיתי, המפתחים של Codeless לא חשבו על קונצים כאלה: התוכנה נכנסה לרקורסיה אינסופית של קריאות לפונקציות וקרסה לחלוטין (=אתחול של המודול) כעבור כחמש שניות.

אירועים

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

  1. התחברות
  2. התנתקות
  3. התעוררות ממצב שינה

אירוע 2 מעניין במיוחד: נניח שאנחנו רוצים לבדוק את טווח השידור בין מודולים. אנחנו לוקחים אחד ביד והולכים איתו עד שהחיבור מתנתק. איך נדע איפה בדיוק זה קרה? עם הפקודה AT+HNDL. הפרמטרים שנשלחים עם הפקודה הם קוד האירוע, ואחריו הפקודות שירוצו כשהוא יתרחש, מופרדות בנקודה-פסיק. שימו לב, יש מגבלה של 50 תווים לשורת הפקודות הזו, אבל כמובן שאחת מהן יכולה להיות CMDPLAY…

לקחתי לוח עם מודול, צרבתי עליו את הקושחה Standalone שמכירה את HNDL (כי Set Two לא מכירה!), ושמתי בצד. התחברתי אליו מרחוק, הגדרתי את פין 11 שלו (שמחובר ללד) כפין פלט, ואז שלחתי את הפקודה הזו:

ATr+HNDL=2,AT+IO=11,1

או בעברית, "אתה שם, כשאתה מתנתק, העבר את פין 11 שלך למצב פלט HIGH". ואכן, כאשר לקחתי את המודול הזה והתרחקתי איתו עוד ועוד מהמודול ה-Central, בשלב מסוים הלד נדלק והראה לי שיצאתי מהטווח.

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

כדי למחוק את הפקודות לאירוע מסוים, נשלח פקודת HNDL לאותו אירוע, ללא פקודות. למשל:

ATr+HNDL=2

יש עוד פקודות AT שלא הזכרתי, אך אם אינני טועה, כיסיתי את כל מה שמעניין את המייקר הטיפוסי. בשאיפה, בפעם הבאה שאדבר על DA14531MOD יהיה לי כבר פרויקט של ממש שעובד איתו…

להרשמה
הודע לי על
2 תגובות
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

בפסקה של הפקת אות PWM אם הבנתי נכון מה אמור להיות, כתבת בקוד 5 במקום 24..