היכרות מעמיקה עם Genuino 101, לוח הפיתוח החדש של אינטל וארדואינו

המתחרה הישיר עבור דגם ה-Arduino 101 כבר כאן, עם מיקרו-בקר זעיר חדש של יצרנית השבבים הגדולה ותמיכה מובנית ב-Bluetooth. בואו ללמוד מה ניתן לעשות איתו, ואיך זאת

לפני כשנה בתערוכת CES חשפה מיקרו-בקר חדש בשם Curie (קירי) המיועד לתחום המחשוב הלביש. מאז אותה הכרזה לא ראינו מוצר ממשי שיצא לשוק מבוסס Cuire – עד היום.

שיתוף פעולה של Arduino עם יצר בקר Arduino חדש העונה לשם Genuino 101 (הידוע בשם Arduino 101 בארה"ב) ובליבו של הבקר פועם המיקרו בקר החדש והמסקרן. הבקר זהה לחלוטין בגודלו ל-Arduino Uno ומכיל בתוכו תמיכה מובנית ב-BLE (ר"ת Low Energy) וכן במד תאוצה וג'ירוסקופ המעניקים יחדיו 6 דרגות חופש בכל הצירים.

עלות הלוח דרך החנות של Arduino היא 31 דולר, כ-10 דולר יותר מאשר Arduino UNO הפופולרי.

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

genuino-101-board

מפרט עיקרי:

מאפייןGenuino 101Genuino Uno
מיקרו בקרIntel Curie 32bitATmega328P 8bit
מהירות שעון32Mhz16Mhz
מתח עבודה3.3v5v
כניסות / יציאות דיגיטליות1414
יציאות בעלות יכולת PWM46
כניסות אנלוגיות66
זרם עבודה בכל כניסה / יציאה20mA20mA
מד תאוצה (Accelerometer)ישאין
ג'ירו (Gyro)ישאין
Bluetooth LEישאין
זיכרון פלאש196 KB32 KB
זיכרון SRAM24 KB2 KB

ניתן לראות מהמפרט ש- Genuino 101 מציע מגוון רחב יותר של אפשרויות הן מבחינת פיצ'רים והן מבחינת יכולות עיבוד. הפרמטר היחיד בו Genuino 101 נחות יותר הוא במספר היציאות הדיגיטליות המאפשרות PWM כך שאם יש צורך ביותר מ 4 יציאות PWM לפרויקט שלכם יש צורך להשתמש בחומרה תומכת כגון TLC5940 ודומיו.

התקנה

כדי להתחיל לעבוד עם Genuino 101 יש להתקין את סביבת הפיתוח העדכנית ביותר עבור Arduino מהקישור הבא.

לאחר שההתקנה הושלמה יש להפעיל את התוכנה ולגשת ל-Tools > Board > Boards Manager.

בחלון שנפתח יש לגלול מעט למטה ולחפש את Intel Curie Boards by וללחוץ על כפתור ה-Install שמופיע בצד.

 arduino-board-manager arduino-board-manager-curie

ההתקנה נמשכת עשרות שניות עד דקות בודדות שבמהלך ההתקנה תתבקשו לאשר התקנת עבור הלוח.

שימוש ב-BLE (ר"ת Bluetooth Low Energy)

נתחיל בבחינת מספר דוגמאות שאינטל צרפה לסביבת העבודה ואותן ניתן למצוא ב-File > Examples. נבחר את CuireBle > BatteryMonitor.

לפני שנצלול לקוד נכיר כמה נקודות בפרוטוקול Bluetooth Low Energy שיעזרו לנו להבין בקלות את התהליך. בניגוד למודולים BT נפוצים ל-Arduino אשר משמשים כ-Serial Port BLE מוגדר ע"י שרותים ומאפיינים שונים בכל שרות.

בקישור הבא ניתן לראות מגוון רחב של שרותים ידועים הנתמכים בתקן BLE בהם שרותי דגימת מצב , לחץ דם, מדידת דופק, דיווח על רמת הגלוקוז ועוד.

נבודד מדוגמת הקוד חלקים ונבין כיצד להשתמש ולשנות אותם בהתאם לצרכינו.

BLEPeripheral blePeripheral; // BLE Peripheral Device (the board you're programming) 
BLEService batteryService("180F"); // BLE Battery Service

בשורה השנייה ניתן לראות שאנחנו יוצרים את האובייקט BLEService ומעבירים לו את הערך "180F" בקונסטרקטור. הערך הזה מגיע מהטבלה אליה קישרנו מעלה. כאן אנחנו קובעים שההתקן שלנו יהיה בתקן של Battery Service כך שכל שתתחבר אלינו תדע מה יכולות ההתקן.

arduino-ble-service-type

השורה הבאה שמעניינת אותנו היא:

BLEUnsignedCharCharacteristic batteryLevelChar("2A19",BLERead | BLENotify);

שורה זו מגדירה מאפיין שקיים בהתקן שאנחנו בונים. הערך הראשון מגיע גם הוא מהקישור הנ"ל. כדי לראות מהם המאפיינים שיש בכל שירות ניתן ללחוץ על שם השירות ובעמוד הבא נוכל לראות את כל המאפיינים הזמינים.

arduino-ble-service-characteristic

הערך השני שעובר בקונסטרקטור קובע מה תהיה האינטראקציה עם תוכנת הלקוח. כאן אנחנו רואים שהלקוח יוכל לקרוא את הערך (BLERead) וגם לקבל נוטיפיקציה כאשר הערך משתנה באופן אוטומטי (BLENotify).

נמשיך הלאה למקטע הבא:

blePeripheral.setLocalName("BatteryMonitorSketch");
blePeripheral.setAdvertisedServiceUuid(batteryService.uuid()); // add the service UUID
blePeripheral.addAttribute(batteryService); // Add the BLE Battery service
blePeripheral.addAttribute(batteryLevelChar); // add the battery level characteristic
batteryLevelChar.setValue(oldBatteryLevel); // initial value for this characteristic

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

בשתי השורות הבאות אנחנו מעבירים את כל מה שהגדרנו להתקן ה-BLE. שורה האחרונה אנחנו שמים ערך התחלתי למד הסוללה שלנו.

arduino-ble-detect

כל שנותר לנו לעשות הוא להפעיל את ההתקן ולהמתין לקישור מול צד הלקוח.

blePeripheral.begin();

כעת נביט על הלולאה הראשית של התוכנית:

void loop() {
	// listen for BLE peripherals to connect:
	BLECentral central = blePeripheral.central();

	// if a central is connected to peripheral:
	if (central) {
		Serial.print("Connected to central: ");
		// print the central's MAC address:
		Serial.println(central.address());
		// turn on the LED to indicate the connection:
		digitalWrite(13, HIGH);

		// check the battery level every 200ms
		// as long as the central is still connected:
		while (central.connected()) {
			long currentMillis = millis();
			// if 200ms have passed, check the battery level:
			if (currentMillis - previousMillis >= 200) {
				previousMillis = currentMillis;
				updateBatteryLevel();
			}
		}
		// when the central disconnects, turn off the LED:
		digitalWrite(13, LOW);
		Serial.print("Disconnected from central: ");
		Serial.println(central.address());
	}
}

אנחנו ממתינים להתחברות של לקוח להתקן שלנו ומאזינים לכך ע"י:

BLECentral central = blePeripheral.central();

ולאחר מכן דוגמאים את המשתנה central, במידה ויש חיבור ניכנס לתוך התנאי, נדפיס את כתובת ה-MAC שלו ונדליק את הלד המובנה בלוח (המחובר לפין מספר 13) כחיווי ויזואלי לחיבור.

כאשר נוצר החיבור אנחנו דוגמים כל 200 מילישניות את הערך בכניסה האנלוגית A0 (ניתן לראות את הפעולה בפונקציה האחרונה בקוד שם updateBatteryLevel) וממפים את הערך (שנקרא מ-0 עד 1023) לטווח 0-100 כפי שמופיע בתקן BLE של ניטור הסוללה.

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

לשם כך, ניתן להשתמש באפליקציה Newbit BLE Tool עבור כדי להתחבר להתקן שהרגע יצרנו ולדגום את כל המאפיינים והערכים שיש בהתקן.

arduino-ble-newbite1arduino-ble-newbite2

 

 

 

 

האפליקציה מאפשרת לצפות בכל התקני ה-BLE המחוברים למחשב ולקרוא את המאפיינים והערכים שההתקנים מספקים.

במקרה שלנו ניתן לראות שההתקן BatteryMonitorLevel מופיע ברשימה כפי שהגדרנו אותו בתוכנה. לחיצה עליו תפתח לנו בצד ימין את רשימת השירותים הזמינים אצלו, ניתן לראות שהשירות האחרון הוא 180F כפי שהגדרנו קודם ולחיצה עליו מציגה תפריט נוסף מימין עם כל המאפיינים של השירות. גם כאן ניתן לראות שהמאפיין הוא 2A19 המציין את ה-Battery Level.

לחיצה על המאפיין תאפשר שני כפתורים, Read ו-Notify כאשר לחיצה על Read תציג לנו את הערך העדכני שיש להתקן להציע ולחיצה על Notify תציג לנו ערך חדש כל פעם שיהיה שינוי.

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

הסבר על חיבור פוטנציומטר ללוח Arduino ניתן למצוא כאן.

שימוש ב-IMU (ר"ת Inertial Measurement Unit)

IMU כפי שהשם מרמז זו יחידה העוסקת באיסוף נתונים על האורינטציה של הגוף במרחב. הדבר נעשה במקרה שלנו ע"י מד תאוצה (Accelerometer) וג'ירו (Gyro) המעניקים רמת חופש של 6 צירים.

התאוצה בכל הצירים נמדדת ע"י מד התאוצה (3 צירים) והסיבוב ע"י הג'ירו (3 צירים נוספים). שימוש ב-IMU נפוץ במגוון יישומים כגון רחפנים, מיוצבים ועוד.

800px-6DOF_en

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

הספריה CurieImu מאפשרת לנו לכייל את הסנסורים בשני אופנים, ידנית ואוטומטית. כדי לכייל באופן אוטומטית יש לבצע את הפעולות הבאות.

עבור כיול הג'ירו:

CurieImu.autoCalibrateGyroOffset();

עבור כיול מד התאוצה:

CurieImu.autoCalibrateXAccelOffset(0);
CurieImu.autoCalibrateYAccelOffset(0);
CurieImu.autoCalibrateZAccelOffset(1);

המספרים אותם אנחנו מעבירים (0 או 1) בכיול האוטומטי של מד התאוצה מציינים כמה g (ערך התאוצה של כח הגרביטציה) אנחנו אמורים לחוש בכל אחד מהצרים. היות והלוח צריך להיות מונח על השולחן בצורה אופקית רק ציר Z הניצב ללוח צריך להרגיש תאוצה בערך של g (כ-9.8 m/s2). אם הלוח היה הפוך 180 מעלות היינו שמים -1 וכו'.

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

כאשר תהליך איסוף הנתונים מסתיים ניתן להדפיס רק את ערכי ה-offset למסך כדי להתרשם מהם. זה מה שקטע הקוד שלאחר השורה Internal sensor offsets AFTER calibration עושה.

שתי השורות הבאות קובעות שיש לעשות שימוש בקיזוז ה-offset כדי לקבל נתונים נקיים:

CurieImu.setGyroOffsetEnabled(true);
CurieImu.setAccelOffsetEnabled(true);

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

CurieImu.setXGyroOffset(220);
CurieImu.setYGyroOffset(76);
CurieImu.setZGyroOffset(-85);
CurieImu.setXAccelOffset(-76);
CurieImu.setYAccelOffset(-235);
CurieImu.setZAccelOffset(168);

הערכים שעוברים לכל פונקציה הם כמובן הערכים אותם אנחנו קובעים לפי הקריאות אותן אנחנו מקבלים מהסנסורים.

כעת כל שנותר הוא לדגום את הנתונים מהסנסורים ולעשות בהם שימוש. גם כאן יש לנו יכולת בחירה האם לקרוא את כל הנתונים יחד (של מד התאוצה והג'ירו) או כל סנסור בנפרד.

כדי לקרוא את הכל ביחד יש להשתמש בשורה הבאה:

CurieImu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

כאשר הפונקציה מקבלת פוינטרים לכל המשתנים (מטיפוס int16_t) כדי לשנות אותם.

כדי לקרוא כל סנסור בנפרד יש לבצע עבור מד התאוצה:

CurieImu.getAcceleration(&ax, &ay, &az);

ועבור הג'ירו:

CurieImu.getRotation(&gx, &gy, &gz);

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

אנו נמשיך לספר לכם על ה-Genuino 101 ויכולותיו בקרוב, ועד אז אתם מוזמנים לנסות ולשלב בעצמכם בין שני הפרויקטים ולשלוח את נתוני ה-IMU בעזרת BLE לאפליקציה.


שיתוף

הגב

wpDiscuz