עד היום, כל התקשורת בין המחשב שלי לארדואינו הסתכמה בתכנות הארדואינו דרך סביבת הפיתוח, וב-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 אחר, קופצת הודעת שגיאה מכוערת. הפתרון מן הסתם לא מסובך במיוחד, אלא שהשעה הרבה יותר מדי מאוחרת בשביל לחפש אותו, אז המשך יבוא…
מגניב,בדיוק אני גם מנסה לחבר את הארדואינו לאנדרויד גם עם חיבור סריאלי אבל ניתקתי קצת(הוספתי קצת תעוד למה שעשיתי…לא לכעוס) יש שתי אפשרויית לחבר את האנדרויד להארדואינו עם כבל 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 …
אני מאוד מתעניין בזה אבל אני לא יודע פסקל או פייתון…
תקשורת כזאת עם הארדואינו יכולה לשמש להרבה דברים…
וזה יכול להיות גם אלחוטי
כמו שאמרתי, כל שפת תכנות בעולם יכולה בעיקרון לתקשר עם הארדואינו, אם מישהו טרח וכתב לה מודול לתקשורת טורית.
כדי לעשות את זה אלחוטי צריך רכיבי RF וארדואינו מתווך – יש לך פתרון פשוט יותר?
ראיתי כאלה שמשתמשים בETHERNET SHEILD ושולטים על הארדואינו דרך WEBSERVER
אבל בהחלט אפשר גם רכיבי RF וארדואינו מתווך, יהיה יותר פשוט
ועדכון חשוב – עוד דקה של עבודה על הבוקר, והתוכנה שלי מסוגלת לשלוח מידע בחזרה לארדואינו. הוספתי כפתור לחלון התוכנה שמכבה ומדליק את נורית ה-LED של פין 13. מסתבר שהפקודה Output של רכיב התוכנה, זו ששימשה לשליחת פקודת האיפוס ATZ, בעצם מעבירה ל-Port כל אוסף תווים שנרצה. המגבלה היחידה היא שאם רוצים לשלוח מספרים, צריך לזכור להמיר אותם לתווים המתאימים.
מגניב. אני חייב להודות שלא התעסקתי עם דלפי כבר כמעט עשור, מצאתי את דוט נט וC# כתחליפים טובים.
הדבר האחד שהייתי אולי עושה שונה הוא להחליף את השורה הזאת:
map(analogRead(A0), 0, 1023, 0, 255)
בזאת:
analogRead(A0) >> 2
אני חושב שיש לה משמעות יותר נכונה של לוותר על שני הביטים הפחות משמעותיים בקריאה
אוריאל
צודק לגמרי, ההצעה שלך תיתן אותה תוצאה בדיוק ויותר מהר. זה מה שקורה כשכותבים תוכניות בשלוש בבוקר אחרי יום ארוך ועמוס!
דלפי החדש (XE2) זו סביבת פיתוח מהממת, אני יכול לדבר עליה שעות, אבל כמובן שלא אתווכח ולא אנסה לשכנע את מי שבוחר לעבוד עם שפות נחותות יותר 🙂
אני חושב שזה גם מקום טוב להסביר את הקונספט של Least Significant Bit ואת המשמעות של לעבור מ10 ביט ל8 ברמה הקונספטואלית ולא רק את הפעולה המתמטית שעושה את זה (לחלק ב4)
כל דבר בשעתו…
analogRead(A0) >> 2
תוכל להסביר מה זה עושה בדיוק?
חיפשתי באתר של ארדואינו אבל לא הבנתי כל כך…
האופרטורים << ו->> "מסיעים" את הביטים שבמספר ימינה או שמאלה.
למשל, אם הערך של x בייצוג בינארי הוא 010011, ונכתוב
y = x >> 1
אז y שווה 001001 (כל הביטים זזו מקום אחד ימינה, הימני ביותר נמחק, ובשמאלי ה"חדש" יש עכשיו 0).
מכיוון שבינארי זה בסיס 2, כל פעולה כזו בעצם מקבילה לחלוקה של המספר בשתיים בלי שארית. הטווח של 0-1023 מיוצג בעשרה ביטים, והטווח 0-255 בשמונה ביטים, ולכן הסעה של שני ביטים ימינה היא כמו חילוק ב-4, שזה בדיוק מה שצריך כדי להמיר את הסקאלה…
מצאתי שיטה אפילו יותר טובה
byte x = analogRead
לא בהקשר הזה! מה שכתבת יכניס ל-X דווקא את 8 הביטים ה"נמוכים" של המדידה, כלומר את השארית מחלוקה שלה ב-256. כשהמדידה מהפוטנציומטר תנוע מ-0 ל-1023, הערך ב-X ינוע ארבע פעמים מ-0 ל-255…
מה זה map? ראיתי את זה בהמון מקומות אבל לא הבנתי כלום…
בעברית פשוטה – טרנספורמציה לינארית 🙂
הפונקציה הזאת לוקחת את הטווח של הסקאלה המקורית (שמיוצג על ידי ערך מינימלי וערך מקסימלי), ו"מותחת" או "מכווצת" אותו לטווח של הסקאלה החדשה. הערך שהיא מחזירה הוא מה שהיית מקבל אם היית מודד אותו הערך המקורי על הסקאלה החדשה.
בהחלט מסקרן