תוכן עניינים:

אקדח אור מדויק ל- Wiimote ל- PI פטל: 9 שלבים (עם תמונות)
אקדח אור מדויק ל- Wiimote ל- PI פטל: 9 שלבים (עם תמונות)

וִידֵאוֹ: אקדח אור מדויק ל- Wiimote ל- PI פטל: 9 שלבים (עם תמונות)

וִידֵאוֹ: אקדח אור מדויק ל- Wiimote ל- PI פטל: 9 שלבים (עם תמונות)
וִידֵאוֹ: ארקאס - מערכת טכנולוגית חדשה מבית אלביט מערכות 2024, יולי
Anonim
אקדח אור מדויק Wiimote עבור פטל PI
אקדח אור מדויק Wiimote עבור פטל PI
אקדח אור מדויק של Wiimote עבור פטל PI
אקדח אור מדויק של Wiimote עבור פטל PI

בדרך כלל, ה- Wii Remote המשמש כאקדח קל אינו מדויק מספיק למשחקי רטרו כמו NES Duck Hunt, מכיוון שלט ה- Wii למעשה לא בוחר את הנקודה בטלוויזיה שאליה היא מכוונת. זה לא יכול! בשלט ה- Wii Remote יש מצלמת אינפרא אדום בחזית שרואה את שורת נוריות האינפרא אדום בסרגל החיישנים, אך היא אינה יכולה לדעת עד כמה הטלוויזיה רחוקה (או לאיזה כיוון) היא מהבר או עד כמה הטלוויזיה גדולה. אמולטורים ומשחקים עוקפים את זה על ידי הצגת שערות צולבות או אינדיקטור מיקוד אחר, אבל זו לא חווית ירי קליעה מדויקת.

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

החומרה לפרויקט זה פשוטה. ישנם ארבעה נוריות אינפרא אדום במארזים פשוטים המודפסים בתלת-ממד הניתנים להדבקה בחלק העליון והתחתון של בית הטלוויזיה ולחבר אותם למטען USB. בנוסף, למקרה שאין לך בית אקדח Wii, יש לי ידית פשוטה מודפסת תלת מימד ומראות שניתן לחבר לשלט ה- Wii (אם כי כדי לחסוך בפלסטיק, הכנתי את שלי לכלאיים בין עץ לבין פלסטיק מודפס בתלת מימד).

התוכנה המבוססת על פיתון הייתה קשה יותר לייצור מהחומרה וכיום היא לינוקס בלבד. הוא מכייל את הנורות ואת שלט ה- Wii ולאחר מכן משתמש בחישובי הומוגרפיה כדי לחקות עכבר אבסולוטי שעובד די טוב באמולטור ה- NES fceumm של Retroarch (וכנראה כמה אמולטורים אחרים) ב- Raspberry PI 3B+שלי.

אספקה

  • שלט Wii
  • ארבע נוריות אינפרא אדום 940 ננומטר 5 מ"מ
  • כבל USB ישן עם תקע מסוג A עובד
  • Raspberry PI 3 או מחשב לינוקס אחר עם תמיכה ב- Bluetooth
  • מדפסת תלת מימד ונימה (אופציונלי)

שלב 1: שרשרת LED אינפרא אדום

שרשרת LED אינפרא אדום
שרשרת LED אינפרא אדום
שרשרת LED אינפרא אדום
שרשרת LED אינפרא אדום

קבל כבל USB ישן עם שקע זכר מסוג A (בדרך כלל כבלי הטעינה של הטלפון שלי נשברים בקצה המיקרו USB, כך שיש לי שאריות כבלים עם שקע זכר מסוג A).. למעשה, זה אפילו בסדר אם כבלי הנתונים שבור כל עוד קווי החשמל עובדים. חותכים את הקצה השני. בתיאוריה הכבל האדום צריך להיות +5V והשחור צריך להיות טחון, אבל בדוק אותו בעזרת מולטימטר (חבר אותו למטען ולאחר מכן בדוק את המתח בין החוטים האדומים לשחורים).

מכיוון של נוריות אינפרא אדום יש ירידה במתח של 1.2-1.3V, רק הלחמתי ארבע מהן בלולאה בסדרה לכבל ה- USB. וודא שהחוטים שאתה הלחמה ארוכים מספיק בכדי שתוכל לשים נוריות בתחתית הטלוויזיה ושניים בחלק העליון, עם כמות הגונה של שטח אופקי בין נוריות LED (בערך 10 אינץ 'בערך).

ליתר דיוק כדי להפוך את לולאת ה- LED:

  • הלחם את הצד המינוס (קתודה, רגל קצרה יותר, עם קצה שטוח) של הלד הראשון לחוט USB +5V
  • חבר את הצד החיובי של ה- LED הראשון (אנודה, רגל ארוכה יותר, עם קצה עגול) לצד המינוס של ה- LED השני
  • חזור על הפעולה כדי להצטרף לנורית השנייה לשלישית והשלישית לרביעית
  • לאחר מכן חבר את הצד החיובי של ה- LED הרביעי עם חוט לחוט ה- USB הארקה.

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

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

שלב 2: התחבר לטלוויזיה

צרף לטלוויזיה
צרף לטלוויזיה
צרף לטלוויזיה
צרף לטלוויזיה
צרף לטלוויזיה
צרף לטלוויזיה

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

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

שלב 3: התקן תוכנה

כרגע התוכנה היא לינוקס בלבד. ההתקנה הבאה מיועדת ל- Raspberry PI 3 עם Raspbian Stretch. מערכות לינוקס אחרות ידרשו כמה שינויים. בדגמים קודמים תזדקק לדונגל בלוטות 'ותצטרך להריץ זאת גם משורת פקודה:

sudo get-apt להתקין bluetooth

שלב א ': udev

לאחר מכן, צור קובץ ב- /etc/udev/rules.d/wiimote.rules המכיל את השורה היחידה:

KERNEL == "uinput", MODE = "0666"

תוכל לעשות זאת, למשל, בעזרת עורך טקסט או על ידי הקלדת השורות הבאות בשורת הפקודה:

sudo sh -c 'echo KERNEL == / "uinput \", MODE = / "0666 \"> /etc/udev/rules.d/wiimote.rules'

ואז הפעל מחדש את udev:

sudo /etc/init.d/udev הפעלה מחדש

שלב ב ': cwiid

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

אפשרות B1: בנה את עצמך

תקליטור ~

git שיבוט https://github.com/arpruss/cwiid-1 autoconf./configure make -C libcwiid sudo make -C libcwiid התקן make -C python sudo make -C python install

למרבה הצער, יש סיכוי די טוב לפספס חבורה של דברים הדרושים לבניית זה, ו-./configure יתלונן. אתה יכול להסתכל על כל הדברים שהוא מתלונן עליהם ולהריץ את sudo apt install על כולם.

אפשרות B2: השתמש בקבצים הבינאריים שלי

תקליטור ~

wget https://github.com/arpruss/cwiid-1/releases/download/0.0.1/cwiid-rpi.tar.gz tar zxvf cwiid-rpi.tar.gz cd cwiid sudo לבצע התקנה

שלב ג ': ספריות פייתון

לבסוף, קבל חומר תמיכה עבור סקריפט הפיתון של lightgun שלי:

sudo pip3 התקן uinput numpy pygame opencv-python

sudo apt-get install libatlas-base-dev sudo apt-get install libjasper-dev sudo apt-get install libqtgui4 sudo apt-get install python3-pyqt5

שלב ד: lightgun.py

לבסוף, קבל את סקריפט הפיתון של lightgun שלי:

תקליטור ~

שיבוט git

אם הכל הלך כשורה, כעת יש לך ~/lightgun.py שבו תוכל להשתמש כדי לכייל את האקדח.

שלב 4: כיול חלק א ': מרכז המצלמה

כיול חלק א ': מרכז המצלמה
כיול חלק א ': מרכז המצלמה
כיול חלק א ': מרכז המצלמה
כיול חלק א ': מרכז המצלמה
כיול חלק א ': מרכז המצלמה
כיול חלק א ': מרכז המצלמה

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

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

הפעל את נוריות ה- LED שלך וודא שה- Raspberry PI או מחשב אחר מוצג בטלוויזיה. חבר מקלדת (זה לא יעבוד באמצעות ssh) או השתמש ב- VNC. לאחר מכן הפעל:

python3 ~/lightgun/lightgun.py -M

אם הכל ילך כשורה, תקבל תצוגה במסך מלא שתבקש ממך ללחוץ על 1+2 בשלט ה- Wii. לעשות את זה. אורות יהבהבו בשלט ה- Wii, ואז האורות 1 ו -4 יישארו דולקים. תוכלו גם לראות מלבן ירוק קטן בחלקו העליון של המסך, עם נוף מהמצלמה מרחוק Wii. כוון את שלט ה- Wii לעבר הנורות, ואם הכל ילך כשורה, תראה את ארבע הלדים המספרים 1 עד 4.

עכשיו אתה צריך למצוא משטח מוצק עם קצה חד, כמו שולחן קפה, שאפשר להצביע עליו על מסך הטלוויזיה ושהוא יכול לאפשר לשלט ה- Wii לראות את כל הלדים עם שלט ה- Wii מיושר מול הקצה. התחל על ידי יישור של השלט הרחוק של Wii כלפי מעלה, כשהצד של השלט מיושר כלפי קצה פני השטח, וודא שכל ארבע הלדים נראים. לאחר מכן לחץ על רווח במקלדת (או צרף Nunchuck ולחץ על C אם זה נוח יותר). לאחר מכן תתבקש לסובב את שלט ה- Wii. כעת, וודא שהוא מורם 10.5 מ מ מעל פני השטח שלך, באמצעות כלי הכיול או משהו אחר, וקרוב לאותו המיקום כמו קודם (למשל, מיושר על אותו קצה המשטח שלך). הקש שוב על רווח.

אם הכל ילך כשורה, כעת תלך לשלב כיול ה- LED. כן, זה מסובך! אבל יהיה לך אקדח מדויק מאוד. זה רק המחיר.

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

שלב 5: כיול שלב ב ': נוריות

כיול שלב ב ': נוריות
כיול שלב ב ': נוריות
כיול שלב ב ': נוריות
כיול שלב ב ': נוריות

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

עבור כל אחד מארבעת החצים מסביב לקצה, בצע זאת:

  1. לחץ על שמאל/ימין ב- Wiimote כדי להזיז את החצים עד שהם מצביעים בצורה המדויקת ביותר לעבר הנורית המקבילה;
  2. לחץ למעלה/למטה ב- Wiimote כדי לשנות את אורך החץ עד שאורך החץ תואם את המרחק בין הנורית לקצה צג הטלוויזיה; במילים אחרות, אורך החץ צריך להיות שווה למרחק מקצה החץ לנורית.

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

לבסוף, יש חץ חמישי, שמופיע רק כאשר אתה לוחץ על + מחץ הלד הרביעי או - מהראשון (ולגמרי כברירת מחדל יש אורך אפס, כך שזה רק פיקסל). חץ זה מתאים את המרחק מעל המצלמה של שלט ה- Wii הצילום יירשם. הבעיה היא זו: אתה תראה לאורך המשטח העליון של שלט ה- Wii. אבל המצלמה למעשה ממוקמת במרחק מסוים מתחת לפני השטח הזה, באמצע המלבן השחור בחזית שלט ה- Wii. אם נרשום את הצילומים שאליהם המצלמה מצביעה, הם היו רשומים בערך 8 מ מ מתחת לפני השטח העליון של שלט ה- Wii. תוכל לבדוק זאת על ידי ציון כי כאשר אתה צופה לאורך המשטח העליון, מרכז השערות הצולבות מוסתר על ידי המצלמה.

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

לחץ על HOME בשלט ה- Wii כדי לצאת מהכיול ולשמור את כל הנתונים בספריית ~/.wiilightgun.

שלב 6: בדוק והשתמש

בדיקה ושימוש
בדיקה ושימוש
בדיקה ושימוש
בדיקה ושימוש
בדיקה ושימוש
בדיקה ושימוש

אתה בטח רוצה לנסות את האקדח הקל שלך עכשיו. פשוט הפעל באמולטור מסוף (או סקריפט):

python3 ~/lightgun/lightgun.py -t

יהיה עליך ללחוץ על כפתורי 1+2 בו זמנית, ואחרי זה אם הכל ילך כשורה, כל עוד lightgun.py פועל, האקדח יחקה עכבר אבסולוטי עם שני כפתורים. כפתור ההדק הוא לחצן העכבר 1, ולחצן A הוא לחצן העכבר 2. לחץ על ctrl-c כדי לצאת.

כעת עליך להגדיר רק את אמולטורים ו/או המשחקים שלך לעבודה עם עכבר מוחלט. למרבה הצער, זה לא תמיד יהיה כל כך קל.

דבר אחד מהנה שאתה יכול לנסות הוא אופנתי של צילום הברווזים-ברווזים של אימינמינאז:

תקליטור ~

שיבוט git https://github.com/arpruss/duck-duck-shoot cd duck-duck-shoot python play_game.py

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

אם אתה מתחיל את המשחקים שלך עם סקריפט, תוכל לערוך את החלק שמפעיל את המשחק או אמולטור כדי לומר:

python3 ~/lightgun/lightgun.py -t -B 30 "פקודה להפעלת המשחק"

לאחר מכן במהלך 30 השניות הראשונות לביצוע המשחק (מכאן האפשרות -B 30), תוכל לחבר את האקדח שלך על ידי לחיצה ארוכה על 1+2.

אגב, התסריט lightgun.py יכול לשמש גם למשחקי Wii מרחוק כלליים עם Retroarch. פשוט הוסף את האפשרות -o ופונקציות האקדח יכבו, ובמקום זה מרחוק ה- Wii יפעל אופקית, כאשר שלושת הכפתורים יהיו 1, 2 ו- B בהתאמה. ישנן פונקציות אחרות הקשורות ברטרוארך במיפויים של lightgun.py שתגלו על ידי קריאת הקוד. לדוגמה, מקש המינוס פועל כמשמרת, ויחד עם ה- dpad שולט על שמירה וטעינה (למעלה/למטה = שנה מספר שמירה; שמאל = שחזור; ימין = שמור).

שלב 7: ידית אקדח וכיוון

ידית אקדח וכיוונה
ידית אקדח וכיוונה
ידית אקדח וכיוונה
ידית אקדח וכיוונה
ידית אקדח וכיוונה
ידית אקדח וכיוונה

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

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

למראה, התמקד בעיניך במראות. יישר את חבטת המראה הקדמי בין בליטות המראה האחורי כך שחלל האוויר משניהם יהיה שווה ושלוש הבליטות בולטות באותה מידה. לאחר מכן יישר את אמצע המטרה עם החלק העליון של הבליטות.

הערה: גובה הבליטות מעט לא שוויוני, כאשר הבליטה של המראה הקדמי מעט נמוכה יותר, על מנת לפצות על גובה הבליטות עצמן כשאתה רואה לאורכן במרחק של 2.5 מטר (המרחק שלי לטלוויזיה). אם יש לך מרחק שונה באופן משמעותי לטלוויזיה, תוכל להכניס זאת לקבצי OpenSCAD. התאמה זו עשויה להיות מתחת לסובלנות המדפסת, בכל מקרה. כמו כן, אם לא ביצעת את ההתאמה האנכית בתוכנה, תוכל להוסיף עוד התאמה למראות התוכנה על ידי הגדרת extraSightAdjust למשהו בסביבות -8 (במילימטרים).

שלב 8: כיול III (אופציונלי): התאמה עדינה

אם אתה רוצה אפילו יותר דיוק, אתה יכול להריץ:

python3 ~/lightgun/lightgun.py -d

(להדגמה) ובדוק היטב אם המראות תואמים את השערות הצולבות. אם הם לא עושים זאת, צא וערוך ידנית ~/.wiilightgun/wiimotecalibration, וצבט מעט את קואורדינטות x ו- y של מרכז המצלמה כדי להתאים את הראייה. למשל, האקדח שלי ירה מעט ימינה, כך שבסופו של דבר שיניתי את קואורדינטת x מ -529 ל -525. המספרים של כולם כנראה יהיו שונים.

שלב 9: נספח: האלגוריתם

נספח: האלגוריתם
נספח: האלגוריתם

קוד אמולציית העכבר פועל בערך באופן הבא.

  • לחיצה על כפתור העיבוד.
  • קבל נתונים מהמצלמה והתאם לכיול מרכז המצלמה.
  • אם פחות משלוש נוריות נראות במצלמה:

    שמור על מיקום העכבר האחרון

  • אם נראים שלושה או ארבעה נוריות LED:

    • השתמש בנתוני מד התאוצה של Wiimote כדי לקבל את הכיוון של Wiimote ולזהות איזו תמונת מצלמת LED מתאימה לאיזו נורית פיזית.
    • אם נראים ארבע נוריות LED:

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

      • השתמש ב- OpenCV כדי לפתור את בעיית ה- P3P בין תמונות מצלמת ה- LED לבין מיקומי ה- LED הפיזיים. זה יוצר עד ארבעה פתרונות.
      • אם הצליח:

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

        שמור על מיקום העכבר האחרון

מוּמלָץ: