ארדואינו, מחשב, נעים להכיר

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

חברים בקהילת המפתחים המקומית כבר הצליחו ליצור את החיבור הנחשק באמצעות שפת התכנות פייתון, אך אני רציתי לעבוד דווקא עם Object Pascal (בסביבת הפיתוח Delphi) שאני מכיר ואוהב. ידעתי שבסופו של דבר, שפת התכנות הספציפית חסרת חשיבות – מה שחשוב באמת זה למצוא את הדרך שלה לתקשר עם יציאה טורית (Serial Port), כי זה בעצם מה שכבל ה-USB של הארדואינו נותן.

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

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

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.write(map(analogRead(A0), 0, 1023, 0, 255));  
  delay(200);
}

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

procedure TForm1.ConnectClick(Sender: TObject);
var
  c : Byte;

begin

  // Start Serial Connection
  ApdComPort1.Baud := 9600;
  ApdComPort1.Output := 'ATZ';

  repeat
    application.ProcessMessages;
    if ApdComPort1.CharReady then
     begin

       c := Ord(ApdComPort1.GetChar);
       Gauge1.Progress := c;
       case c of
         0..205 : Gauge1.Color := clGreen;
         206..229 : Gauge1.Color := clYellow;
         230..255 : Gauge1.Color := clRed;
       end;

     end;
  until ExitLoop;

end;

לא הגדרתי את מספר היציאה בתוכנה, אך הסתבר שאין כלל צורך: בעת ההפעלה (הפקודה ATZ המוזרה ההיא), התוכנה פשוט מקפיצה את החלון המוכר מסביבת הפיתוח של הארדואינו ושואלת לאיזה Port לפנות.

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

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

מגניב,בדיוק אני גם מנסה לחבר את הארדואינו לאנדרויד גם עם חיבור סריאלי אבל ניתקתי קצת(הוספתי קצת תעוד למה שעשיתי…לא לכעוס) יש שתי אפשרויית לחבר את האנדרויד להארדואינו עם כבל USB: 1.אירוח (HOST) על גבי הארדואינו עם ADK 2.אירוח (HOST) על גבי האנדרויד עם תמיכה CHIP HOST בחרתי את 2 ניסיתי להפעיל את האנדרויד וירטואלי android-x86-4.0 (גירסה של אנדרויד למחשב רגיל 8086 גירסת אנדרויד 4.0) עם VMware Player מה לעשות האימולטור של הפיתוח לא תומך ב USB הורדתי את התוכנה המתאימה לאנדרויד ולארדואינו לינק: http://android.serverbox.ch/?p=549 ועובד…LOL אבל כאשר עברתי לאנדרויד אחר (MK802 גם עם HOST) לא הצלחתי MK802 -מעין DOK עם… לקרוא עוד »

יפה מאד:) נראה לי שאפשר לממשק אותו לכל שפת תכנות בתכלס… כל אחד עם מה שהוא אוהב …

מאוד יפה, ראיתי הרבה שעשו דברים כאלה גם עם BASIC …
אני מאוד מתעניין בזה אבל אני לא יודע פסקל או פייתון…
תקשורת כזאת עם הארדואינו יכולה לשמש להרבה דברים…
וזה יכול להיות גם אלחוטי

ראיתי כאלה שמשתמשים בETHERNET SHEILD ושולטים על הארדואינו דרך WEBSERVER

אבל בהחלט אפשר גם רכיבי RF וארדואינו מתווך, יהיה יותר פשוט

מגניב. אני חייב להודות שלא התעסקתי עם דלפי כבר כמעט עשור, מצאתי את דוט נט וC# כתחליפים טובים.
הדבר האחד שהייתי אולי עושה שונה הוא להחליף את השורה הזאת:
map(analogRead(A0), 0, 1023, 0, 255)
בזאת:
analogRead(A0) >> 2

אני חושב שיש לה משמעות יותר נכונה של לוותר על שני הביטים הפחות משמעותיים בקריאה

אוריאל

אני חושב שזה גם מקום טוב להסביר את הקונספט של Least Significant Bit ואת המשמעות של לעבור מ10 ביט ל8 ברמה הקונספטואלית ולא רק את הפעולה המתמטית שעושה את זה (לחלק ב4)

analogRead(A0) >> 2
תוכל להסביר מה זה עושה בדיוק?
חיפשתי באתר של ארדואינו אבל לא הבנתי כל כך…

מצאתי שיטה אפילו יותר טובה
byte x = analogRead

מה זה map? ראיתי את זה בהמון מקומות אבל לא הבנתי כלום…

בהחלט מסקרן