בניית התוכנית הראשונה
התוכנית הראשונה שלנו תהיה הדלקת לד וכיבויו בכל X זמן שנרצה. נתבונן בתוכנית הבאה:
התוכנית הראשונה שלנו תהיה הדלקת לד וכיבויו בכל X זמן שנרצה. נתבונן בתוכנית הבאה:
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
נשים לב שהתוכנית מחולקת לשני חלקים עיקריים Setup ו-Loop אלו שתי פונקציות מרכזיות בכל תוכנית. לפני שהתוכנית שלנו מתחיל לרוץ לרוב נרצה לבצע מספר פעולות לפני, כמו למשל לקבוע שפין מספר 13 מהיציאות או הכניסות הדיגיטליות ישמש כיציאה. איך עושים זאת? בעזרת הפונקציה pinMode המקבלת כפרמטר ראשון את מספר הפין וכפרמטר שני את ההגדרה החדשה שלו (INPUT או OUTPUT).
Loop היא למעשה התוכנית הראשית, ובסיומה, אלא אם הגדרנו אחרת, הקוד יתבצע שוב ושוב עד אינסוף. בדוגמא הזו אנחנו מבצעים כתיבה דיגיטלית לפין 13 וקובעים שהוא יהיה HIGH. HIGH הוא קבוע מערכת המגדיר רמה לוגית 1 במידה וקיים מתח, והקבוע בשם LOW המגדיר רמה לוגית 0 מציין העדר מתח.
את הכתיבה לפין דיגיטלי אנחנו מבצעים בעזרת הפונקציה digitalWrite, המקבלת כפרמטר ראשון את מספר הפין וכפרמטר שני את הרמה הלוגית שלו (HIGH או LOW). בין הכתיבות הדיגיטליות מיקמנו פונקציה בשם delay, המספקת השהייה למערכת לפי הערך שסיפקנו לה. הערך שהיא מקבלת הוא מספר המציין את משך ההשהיה במילי שניות. כאשר 1000 מילי שניות הן שנייה אחת.
מכאן קל להבין שהקוד הנ"ל מעביר את פין 13 לרמה לוגית 1, ממתין שם שנייה אחת ולאחר מכן מוריד את הפין לרמה לוגית 0 וממתין שם שנייה אחת נוספת. לאחר מכן הקוד חוזר חלילה. בלוח הפיתוח בפין 13 ישנו לד מובנה על גבי הלוח כך שהתוכנית למעשה מדליקה ומכבה את הלד המובנה.
מה נעשה אם נרצה לשנות את מספר הפין? נשנה את הקוד בצורה הבאה:
#define LEDPin 10
pinMode(LEDPin, OUTPUT);
}
digitalWrite(LEDPin, HIGH);
delay(1000);
digitalWrite(LEDPin, LOW);
delay(1000);
}
השינוי הוא מינורי. הוספנו קבוע בשם LEDPin וקבענו שערכו 10. כעת החלפנו בכל התוכנית את המספר 13 בקבוע החדש כך שאם נרצה בפעם אחרת לשנות מפין 10 לפין אחר נבצע שינוי במקום אחד בלבד ולא נצטרך לחפש בכל התוכנית את הפין אותו אנחנו רוצים לשנות.
כעת נלחץ על כפתור ה-Upload כדי להדר ולשלוח את התוכנית ללוח. נראה מספר לדים דולקים במהירות על הלוח ולאחר מכן תופיע שורה בסביבת העבודה (מעל להודעות המערכת) שהפעולה הושלמה והתוכנית נטענה ללוח. משלב זה, כל עוד יש ללוח מתח (במקרה שלנו מחיבור ה-USB) התוכנית תמשיך ותרוץ.
נמשיך ונשכלל את התוכנית שלנו, הדלקת לד הוא צעד חשוב ובסיסי אבל לא מרשים ושימושי במיוחד. כעת נכתוב תוכנית קטנה ב C# שתשנה את מצב הלד בעזרת לחיצה בתוכנה.
תקשורת סריאלית
ראינו שכאשר הלוח מחובר למחשב באמצעות כבל ה-USB נוסף חיבור וירטואלי בשם COMx (x – מספר כלשהו). זהו חיבור סריאלי שדרכו נוכל לתקשר עם הלוח והתוכנית שלנו. לשם הקמת החיבור הסריאלי נצטרך לבצע שינוי קל בקוד התוכנית. נתבונן בקוד הבא:
#define LEDPin 10
void setup() {
pinMode(LEDPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(LEDPin, HIGH);
Serial.println("LED on");
delay(1000);
digitalWrite(LEDPin, LOW);
Serial.println("LED off");
delay(1000);
}
כפי שנוכל לראות התווספו מספר שורות קוד חדשות. בחלק ה-Setup, נוספה השורה:
Serial.begin(9600);
Serial היא למעשה מחלקה מובנית היודעת לטפל בכל ההיבטים הנוגעים לתקשורת הסריאלית. הפונקציה being מקבלת כפרמטר את המהירות שבו החיבור יעבוד. מהירות זו נקראת Baud rate שזה למעשה כמות הביטים בשנייה. מהירויות סטנדרטיות ונפוצות הן: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 ו-115200 כאשר לרוב נשתמש במהירות 9600. לאחר שהרצנו את הפונקציה ,being המחלקה תאזין כל הזמן ב-COMx עבור בקשת התחברות לתקשורת.
בחלק ה-Loop, הוספנו את שתי השורות הבאות:
Serial.println("LED on");
Serial.println("LED off");
שורות אלו למעשה שולחות באמצעות היציאה הסריאלית הודעה המדווחת על לד דולק או לד כבוי לאחר כל מצב. בכדי לראות את הדוגמא הזו עובדת נשלח את הקוד ללוח ולאחר שהוא סיים נלחץ על כפתור Serial Monitor כדי לפתוח את חלון התקשורת הסריאלית. חלון זה למעשה מבקש בקשה מ-COMx להתחברות במהירות המצוינת בחלקו התחתון הימני. יש לוודא שהמהירות זהה למהירות שהגדרנו בתוכנית עצמה. לאחר החיבור נוכל לראות שהטקסט שהלוח שולח מופיע בחלון התקשורת.
כעת נשנה את קוד התוכנית כדי שיתאים לתקשורת מול תוכנה שנכתוב ב-C#:
#define LEDPin 10
byte LED_OFF = 0;
byte LED_ON = 1;
void setup() {
pinMode(LEDPin, OUTPUT);
digitalWrite(LEDPin, LOW);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
byte data = Serial.read();
if (data == LED_ON) {
digitalWrite(LEDPin, HIGH);
Serial.write(LED_ON);
} else if (data == LED_OFF) {
digitalWrite(LEDPin, LOW);
Serial.write(LED_OFF);
}
}
}
תחילה, יצרנו שני משתנים חדשים בגודל בית אחד שתפקידם לסמל את מצב הלד, LED_OFF ו LED_ON ולאחר מכן בשלב ה-Setup הוספנו כתיבה לפין הלד כדי שהתוכנית תתחיל במצב שהלד כבוי. בתוכנית הראשית ביצענו בדיקה שתפקידה לבדוק האם התקבל משהו בערוץ התקשורת הסריאלי, Serial.available(). הפונקציה מחזירה את כמות הבתים הממתינים בבאפר (buffer, מאגר זיכרון קטן אשר כל המידע שמיגע עובר קודם כל דרכו ולאחר מכן נקרא ממנו בצורה של First In Firt Out) של הערוץ.
במידה והגיע מידע חדש נבצע קריאה של בית אחד מהבאפר על ידי הפונקציה Serial.read() אשר תחזיר את הבית לתוך משתנה. כל שנותר לבדוק הוא האם המשתנה שווה ל-0 (כיבוי לד) או 1 (הדלקת לד) ולכן, לאחר שכיבינו או הדלקנו את הלד נרצה לשלוח לתוכנה פידבק כדי שהיא תדע שהפעולה אכן התבצעה בהצלחה. לשם כך נשתמש בפונקציה Serial.write() המקבלת משתנה מטיפוס byte.
שימוש בפידבק הוא חשוב ביותר אם אנחנו מעוניינים לשמור על סנכרון בין שני הצדדים בתקשורת. ייתכן ומסיבה כלשהי המידע שנשלח מתוכנת המחשב ללוח הפיתוח לא הגיע בשלמותו, ואם לא יהיה פידבק לתוכנה היא תחשוב שהכל בסדר, ובפעם הבאה שנרצה לשנות את מצב הלד השינוי לא יעבוד כי הלד לא נמצא על אותו מצב שהתוכנה נמצאת. חיבור הלוח באמצעות USB נחשב אמין ולרוב הבדיקה הספציפית שביצענו כאן אינה נחוצה אך כאשר דברים מתחילים לעבוד בצורה שונה מהמצופה. משום כך, תמיד טוב לזכור את החלק הזה למטרת ניפוי שגיאות (Debugging).
בצד תוכנת המחשב נרצה לבצע את הפעולות הבאות:
- איתור כל יציאות ה-COM במחשב ובחירת ה-COM המתאים אליו מחובר לוח הפיתוח.
- אפשרות שינוי מהירות התקשורת.
- כפתור יצירת חיבור או ניתוק החיבור.
- כפתור המאפשר להדליק ולכבות את ה-LED בלוח הפיתוח.
- תיבה המציגה למשתמש את הפידבק שהתקבל מהלוח.
מכיוון שמדריך זה עוסק יותר בצד פיתוח החומרה לא נפרט כאן על כתיבת התוכנה ב-C# אך ניתן להוריד את קוד המקור עבור תוכנית זו מהקישור הבא.
שימוש ב-PWM
לאחר שהצלחנו להדליק ולכבות לד נרצה לשלוט גם על עוצמת ההארה (Brightness) שלו. לשם כן נרשם השימוש ב-PWM, ובכדי להשתמש ב-PWM נאתר את הפינים שיכולים לשמש אותנו כפי שמופיע באיור הלוח. הקוד הבא נעשה שימוש בפין 11:
#define LEDPin 11
void setup() {
pinMode(LEDPin, OUTPUT);
digitalWrite(LEDPin, LOW);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
byte data = Serial.read();
analogWrite(LEDPin, data);
}
}
בקוד זה נראה רק שורה חדשה אחת שעושה שימוש בפונקציה analogWrite(). פונקציה זו מקבלת מספר פין ואת ערך ה-Duty Cycle כאשר 0 מייצג 0% ו-255 מייצג 100%.
כעת נוכל לבצע מספר שינויים בתוכנת החלונות שכתבנו, במקום כפתור ON/OFF נוסיף בורר עוצמה שיכיל ערכים מ-0 עד 255 וע"י גרירתו נשלוט בעוצמת ההארה של הלד.
בלחיצה על הקישור הבא תוכלו להוריד קובץ RAR של התוכנה המעודכנת.
כתבה מעולה!
יפה מאוד
מאמר מקצועי ומעניין , אין ספק
PWM
PWM הוא מתח קבוע (שלא משנה מה רמת המתח שלו) והדבר היחיד שמשתנה בו הוא ה-Duty Cycle כאשר:
0% = מתח מינימלי (לרוב אפס).
50% = משך הזמן שהמתח הוא מקסימלי שווה למשך הזמן שהמתח הוא מינימלי (לרוב אפס).
100% = מתח מקסימלי.
נהנתי לקרוא
תודה!
תודה רבה!
כתבה יפה ועוד אתר בנושא
כל יוזמה לקדם את הנושא מבורכת!
הייתי מוסיף גם את הבלוג הזה לרשימת האתרים המומלצים:
http://bildr.org/
עוד
קנייה זולה של לוחות:
http://www.seeedstudio.com
http://www.iteadstudio.com
הכי זול כנראה תמצאו באיביי.
זולים משמעותית מ-sparkfun, והמשלוח שגם כך הוא זול, הופך להיות חינם מ-$50.
לוחות ARM:
מעבר ללוחות ARM מבוססי דוט נט, ישנם לוחות ARM שמריצים מערכת נייטיב. חפשו את leaf maple ותואמיהם בשתי החנויות שלמעלה.
ישנם גם לוחות מבוססי PIC32 ב- digilentinc.com שמריצים גם הם גרסה של ארדואינו, חפשו chipkit בגוגל.
אבי מי שרוצה להכנס לעולם הבקרים באופן
ה כ י – ז ו ל , שיחפש את הקיט מבוסס MSP430 של TI הנקרא Llaunchpad' שעולה, כמה (לא) מקרי, $4.30
כן, $4.30 ללוח שכולל בקר וחיבור צריבה/דיבאג ב- USB.
המחיר, דרך אגב כולל משלוח מהיר לארץ,
וכן, TI מפסידה על כל אחד.
הלוחות הראשונים הגיעו רק עם 2K זכרון פלאש ו- 128 בייט RAM, אבל הם מגיעים עכשיו עם 8K פלאש.
אם יש לכם פרוייקט ממש פשוט שנכנס לגודל הזה, זה הפתרון הזול ביותר.
בניגוד לפתרונות למעלה שמשתמשים בסביבת הארדואינו, כאן מדובר על סביבה אחרת לגמרי מבוססת eclipse הנקראת code composer studio.
אפשר למצוא גם ב-buyincoins.com דברים לארדואינו
ובהרבה יותר זול מהאתרים שנתת בכתבה..
(ומשלוח חינם לארץ, כמובן)
תחפש את המילה Arduino באתרים הסיניים,
כמו dealextreme.com
buyincoins.com
וכו'
יש פה משהו לא ברור
מה זה אומר
'בייצוג הקסהדצימאלי בית אחד מכיל שתי ספרות, כלומר הערך הגבוה ביותר לבית הוא 255 בדצימאלי ו 0xFF בהקסהדצימאלי.'
טעות קטנה
"הוא רכיב זיכרון בסיסי המורכב ממספר משתנה של ביטים או בתים. רובנו שמענו את המושג מעבד 32-bit או מעבד 64-bit אבל מה המשמעות של המושג הזה? המשמעות היא שהאוגרים הגדולים ביותר במעבד יכולים להכיל לכל היותר 32 או 64 סיביות או לחילופין 8 או 16 בתים בהתאמה."
צריך להיות רשום "4 או 8 בתים בהתאמה".