פרויקט OMG WTF LOL הינו מערכת משולבת ארדואינו-מחשב שחוסכת לנו זמן יקר (ומאמץ אצבעות) בהקלדת מילים, משפטים ו/או צירופי מקשים שכיחים. המערכת כוללת לוח לחצנים, אשר לחיצה על כל אחד מהם מקלידה עבורנו למחשב – לדפדפן או לכל יישום אחר שאנחנו עובדים בו – צירוף מקשים אחר. את צירופי המקשים אפשר להגדיר כרצוננו מראש. כאן, לצורך ההדגמה, השתמשתי בשלושת הביטויים החשובים ביותר עבור הגולש הממוצע ברשת:
את לוח המקשים אפשר להחליף כמובן בכל אמצעי קלט אחר – לחצן בודד, פדלים, חיישן מרחק אולטרסוני, מד מתח… העיקר שהארדואינו יוכל לקרוא ממנו מידע ולהפוך אותו למספר. המספר הזה נשלח דרך החיבור הטורי (Serial) אל המחשב, שם מאזינה לו תוכנה שכתבתי. התוכנה הזו קולטת את המספרים שמגיעים מהארדואינו ו"מקלידה" וירטואלית, בתגובה, רצפי מקשים שהוגדרו מראש עבור כל מספר. ההקלדה הזו מחקה בצורה מושלמת קלט שמגיע מהמקלדת האמתית, ולכן מה שמוקלד מגיע ישירות לתוכנה שנמצאת בפוקוס כרגע: מעבד תמלילים, דפדפן ובתיאוריה אפילו משחקי מחשב.
דוגמאות שימושיות יותר מ-OMG, WTF ו-LOL יכולות להיות, למשל
- פדל ימני ושמאלי שמבצעים פעולות העתק והדבק, או מעבר מאנגלית לעברית ולהיפך
- הזנה אוטומטית של שם משתמש לאתר, מקש Tab למעבר לשדה הסיסמה, והסיסמה
- הקלדה של ביטויים מסובכים שחוזרים פעמים רבות ו/או שקל להתבלבל בהם
- קומבינציות מקשים לפעולות מיוחדת במשחקי מחשב
יש אמנם לוחות שמסוגלים לחקות בכוחות עצמם מקלדת (כגון Arduino Leonardo או Teensy), אך כאן אפשר להשתמש בכל ארדואינו שרוצים – ויש גם יתרון נוסף, שאפשר לנהל את רצפי המקשים בקלות מתוך התוכנה בצד המחשב, בלי צורך לשנות ולהעלות קוד מחדש למיקרו-בקר. מצד שני, החיסרון של המערכת הזו הוא שאי אפשר לחבר את החומרה למחשב חדש ולהתחיל ישר לעבוד: צריך להתקין בו קודם את התוכנה שלו ולהפעיל אותה.
צד הארדואינו
קוד הארדואינו והחומרה שהכנתי לצורך ההדגמה בסיסיים מאד: לפינים 2-4 של הארדואינו חיברתי קלט משלושה מקשים בלבד. לכל פין הופעל נגד Pull-up פנימי, כך שהקלט יהיה HIGH כשהמקש אינו לחוץ ו-LOW כשכן. הקוד סורק את הפינים שוב ושוב ומחפש קלט LOW. כשהוא מוצא כזה, הוא ממתין מספר אלפיות שניה ובודק שוב (Debounce). אם המקש אכן לחוץ, הוא בודק אם זה מקש שונה ממה שהיה לחוץ קודם. הבדיקה הזו מונעת מצב שבו לחיצה אחת ארוכה תתפרש כהרבה לחיצות רצופות. הבדיקה עברה בהצלחה? הקוד המתאים נשלח דרך החיבור הטורי למחשב.
byte lastKey = 255; void setup() { for (byte j = 2; j <= 4; j++) { pinMode(j, INPUT); digitalWrite(j, HIGH); // Activate pull-up resistor } Serial.begin(9600); } void loop() { byte key = 0; // Scan input pins for (byte j = 2; j <= 4; j++) { if (digitalRead(j) == LOW) { // Debounce delay(5); if (digitalRead(j) == LOW) key = j - 1; } } // Did the key state change? if (key != lastKey) { lastKey = key; if (key) Serial.write(key); } }
צד המחשב
התוכנה נכתבה בשפת Object Pascal בסביבת הפיתוח Lazarus החינמית-בקוד-פתוח. התקשורת הטורית בוצעה בעזרת Synaser, חלק מספריית התקשורת הנרחבת Synapse (שגם היא בחינם, ואין קשר למודולי התקשורת שהזכרתי לפני שני פוסטים). בדומה לחיבור הסריאלי שביצעתי בסביבת הפיתוח דלפי, גם כאן פעולת החיבור פשוטה מאד. אם נתעלם מהצורך לזהות את הפורט הנכון ולבדוק אם יש שגיאות, כל מה שקשור לחיבור הטורי מצטמצם למשהו כזה:
var sPort : TBlockSerial; //... sPort := TBlockSerial.Create; sPort.Connect('COM3'); sPort.Config(9600, 8, 'N', SB1, false, false); //... case sPort.RecvByte(1) of 1 : OMG; 2 : WTF; 3 : LOL; end;
שלוש הפרוצדורות שמוזכרות בסוף הן אלה ששולחות את רצפי האותיות למקלדת הווירטואלית. ההעברה הזו מתבצעת בעזרת הספריה MouseAndKeyInput שמגיעה עם Lazarus. הפקודות שלה מאפשרות לדמות גם הקלדה רגילה וגם החזקה של מקשים לחוצים. לרוע המזל, הפונקציה שמשמשת לשליחת מחרוזות לא נותנת בדיוק את התוצאה הצפויה אינטואיטיבית, וצריך ללמוד את הקודים הרלווטיים לסוגי התווים השונים. למשל, הפקודה
KeyInput.Press('OMG');
שולחת למעשה את האותיות הקטנות omg. לכן, הפונקציה שכתבתי מדמה לחיצה ממושכת על מקש Shift תוך כדי כתיבה:
procedure KeyInString(s : string); begin KeyInput.Down(VK_SHIFT); KeyInput.Press(s); KeyInput.Up(VK_SHIFT); end; procedure OMG; begin KeyInString('OMG '); end;
כלומר, הסיפור הזה לא מובן מאליו, ומצד שני לא מסובך אחרי שמבינים את הפרנציפ.
זו, בקווים כלליים, כל התוכנה שעושה את מה שראיתם בסרטון. צריך פשוט להריץ אותה, למזער – והיא תאזין לחיבור הטורי ברקע ותגיב לפקודות ממנו בלי שנרגיש שהיא שם. התוכנית לעתיד הקרוב היא לכתוב גרסה משוכללת יותר, שמזהה אוטומטית את הפורט שבו נמצא הארדואינו, ומאפשרת למשתמש לקבוע את התגובות השונות לקודים השונים שנשלחים ממנו.
אתה יכול להעלות את התוכנה שלך?
אתה יכול להעלות את התוכנה שלך?
כי אני רוצה לעשות משהו בסגנון
התוכנה מופיעה בפוסט עצמו…
זה כל התוכנה?
ועכשיו פשוט להוריד לזרוס ולהריץ את התוכנה?
לא, תצטרך לעשות עוד קצת עבודת הכנה… אבל לתפיסתי מי שמעתיק ומריץ קוד כמו שהוא לא לומד מזה שום דבר, אז בעיקרון אני לא מפיץ פתרונות שלמים.
הגדר עבודת הכנה
(אני יחסית מתחיל בעסק אז יהיה לי קצת קשה)
להתקין לזרוס וללמוד קצת שפת פסקל… יישום כזה הוא לא באמת מקום טוב להתחיל בו. הנה פוסט קצת ישן אבל עדיין רלוונטי על התקנת לזרוס ותכנות ראשוני בו: https://www.idogendel.com/whitebyte/archives/975
אבל התוכנה כל העיקר שלה בפוסט, כן?
כל המידע הדרוש מופיע, אם אתה יודע מה אתה עושה… אבל שוב, copy-paste לא יפתור לך את הבעיה.
כמה שאלות:
1. יש אפשרות לבצע את הפעולה דרך כניסת usb? (בינינו אין הרבה מחשבים היום שמגיעים עם כניסה סריאלית)
2. מאיפה השגת את השלט עצמו?
1. זה מבוצע דרך USB – אני מתייחס אליו כסריאל כי זה פרוטוקול התקשורת, אך הוא ממומש על גבי חיבור ה-USB של הארדואינו למחשב.
2. זה לא שלט אלא לוח מקשים מסוג בסיסי וזול מאד – חפש למשל באיביי keypad matrix.