OMG WTF LOL

פרויקט 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;

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

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

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

אתה יכול להעלות את התוכנה שלך?

אתה יכול להעלות את התוכנה שלך?
כי אני רוצה לעשות משהו בסגנון

זה כל התוכנה?
ועכשיו פשוט להוריד לזרוס ולהריץ את התוכנה?

הגדר עבודת הכנה
(אני יחסית מתחיל בעסק אז יהיה לי קצת קשה)

אבל התוכנה כל העיקר שלה בפוסט, כן?

כמה שאלות:
1. יש אפשרות לבצע את הפעולה דרך כניסת usb? (בינינו אין הרבה מחשבים היום שמגיעים עם כניסה סריאלית)
2. מאיפה השגת את השלט עצמו?