كان لدى الكثير منهم هذه اللعبة في مرحلة الطفولة ، وقد قمنا بالسيطرة عليها بمقبضين دوارين. حتى ذلك الحين ، كان من الممكن إرفاق محركين DC مع التروس والتحكم فيهما من الأزرار. والآن أصبح من الممكن تكييف عصا التحكم. وهو ما فعله مؤلف Instructables تحت اسم millerman4487.
جميع المكونات محلية الصنع وضع على ورقة من الورق المقوى:
ولكن كان يجب طباعة جزأين متطابقين - وهما محولات لتوصيل التروس بمقابض Magic Screen. يبدو أن أي من المحولات:
وبالتالي فإنه يتصل بصندوق التروس (ربما يتطلب ذلك تدفئة المحول قليلاً باستخدام مجفف الشعر):
ملف STL.
الرسم البياني الكهربائي للهيكل موضح أدناه:
لا يوجد سوى مكون واحد غير مفهوم عليه - شريحة L293D. يحتوي على جسرين يسمى H ، يمكن لكل منهما عكس المحرك المتصل به. يظهر أسفل اللوحة أي الاستنتاجات اردوينو قم بتوصيل أي من دبابيس موصل عصا تحكم Wii Nunchuck. يمكن إعادة كتابة الرسم أدناه للعمل مع أي أنواع أخرى من عصا التحكم ، في شكلها الحالي سيكون مطلوبًا.
# تشمل
#if (ARDUINO & GT ؛ = 100)
# تشمل
#else
# تشمل
// # تحديد Wire.write (x) Wire.send (x)
// # معرف Wire.read () Wire.receive ()
#endif
uint8_t ثابتة nunchuck_buf [6] ؛ // مصفوفة لتخزين بيانات nunchuck ،
// يستخدم دبابيس المنفذ C (تناظري) كطاقة وأرض لـ Nunchuck
nunchuck_setpowerpins الفراغ الثابت () {
# تحديد pwrpin PORTC3
# تحديد gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin) ؛
PORTC & = ~ _BV (gndpin) ؛
PORTC | = _BV (pwrpin) ؛
تأخير (100) ؛ // انتظر حتى تستقر الأشياء
}}
// تهيئة نظام I2C ، والانضمام إلى ناقل I2C ،
// وأخبر nunchuck بأننا نتحدث إليه
nunchuck_init الفراغ الثابت () {
Wire.begin () ؛ // join حافلة i2c على أنها رئيسية
Wire.beginTransmission (0x52) ؛ // الإرسال إلى الجهاز 0x52
#if (ARDUINO & GT ؛ = 100)
Wire.write ((uint8_t) 0x40) ؛ // يرسل عنوان الذاكرة
Wire.write ((uint8_t) 0x00) ؛ // يرسل مرسلة صفر.
#else
Wire.send ((uint8_t) 0x40) ؛ // يرسل عنوان الذاكرة
Wire.send ((uint8_t) 0x00) ؛ // يرسل مرسلة صفر.
#endif
Wire.endTransmission ()؛ // توقف الإرسال
}}
// إرسال طلب بيانات إلى nunchuck
// كان "send_zero ()"
nunchuck_send_request () {
Wire.beginTransmission (0x52) ؛ // الإرسال إلى الجهاز 0x52
#if (ARDUINO & GT ؛ = 100)
Wire.write ((uint8_t) 0x00) ؛ // يرسل بايت واحد
#else
Wire.send ((uint8_t) 0x00) ؛ // يرسل بايت واحد
#endif
Wire.endTransmission ()؛ // توقف الإرسال
}}
// ترميز البيانات لتنسيق معظم برامج تشغيل wiimote باستثناء
// مطلوب فقط إذا كنت تستخدم أحد برامج تشغيل wiimote العادية
حرف ثابت nunchuk_decode_byte (حرف x) {
x = (x ^ 0x17) + 0x17 ؛
العودة س ؛
}}
// تلقي البيانات مرة أخرى من nunchuck ،
// يعرض 1 عند القراءة الناجحة. إرجاع 0 عند الفشل
ثابت nunchuck_get_data () {
int cnt = 0 ؛
Wire.requestFrom (0x52 ، 6) ؛ // طلب بيانات من nunchuck
بينما (Wire.available ()) {
// استقبال بايت كعدد صحيح
#if (ARDUINO & GT ؛ = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ()) ،
#else
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.receive ()) ؛
#endif
cnt ++ ؛
}}
nunchuck_send_request () ؛ // إرسال طلب حمولة البيانات التالية
// إذا تلقينا البايتات الست ، فانتقل إلى طباعتها
if (cnt & gt؛ = 5) {
العودة 1 ؛ // النجاح
}}
العودة 0 ؛ // الفشل
}}
// اطبع بيانات الإدخال التي تلقيناها
// تسريع البيانات بطول 10 بت
// لذلك نقرأ 8 بتات ، ثم يجب أن نضيف
// في آخر 2 بت. لهذا السبب أنا
// اضربهم في 2 * 2
nunchuck_print_data الفراغ الثابت () {
ثابت int i = 0 ؛
int joy_x_axis = nunchuck_buf [0] ،
int joy_y_axis = nunchuck_buf [1] ؛
int speed_x_axis = nunchuck_buf [2] ؛ // * 2 * 2 ؛
int speed_y_axis = nunchuck_buf [3] ؛ // * 2 * 2 ؛
int speed_z_axis = nunchuck_buf [4] ؛ // * 2 * 2 ؛
int z_button = 0 ؛
int c_button = 0 ؛
// byte nunchuck_buf [5] يحتوي على بت لأزرار z و c
// يحتوي أيضًا على أقل البتات أهمية لبيانات مقياس التسارع
// لذلك علينا التحقق من كل بت بايت outbuf [5]
if ((nunchuck_buf [5] & gt؛ & gt؛ 0) & 1)
z_button = 1 ؛
if ((nunchuck_buf [5] & gt؛ & gt؛ 1) & 1)
c_button = 1 ؛
إذا ((nunchuck_buf [5] & gt؛ & gt؛ 2) & 1)
speed_x_axis + = 1 ؛
إذا ((nunchuck_buf [5] & gt؛ & gt؛ 3) & 1)
speed_x_axis + = 2 ؛
إذا ((nunchuck_buf [5] & gt؛ & gt؛ 4) & 1)
speed_y_axis + = 1 ؛
إذا ((nunchuck_buf [5] & gt؛ & gt؛ 5) & 1)
speed_y_axis + = 2 ؛
if ((nunchuck_buf [5] & gt؛ & gt؛ 6) & 1)
speed_z_axis + = 1 ؛
إذا ((nunchuck_buf [5] & gt؛ & gt؛ 7) & 1)
speed_z_axis + = 2 ؛
Serial.print (i، DEC) ؛
Serial.print ("\ t") ؛
Serial.print ("الفرح:") ؛
Serial.print (joy_x_axis، DEC) ؛
Serial.print ("،") ؛
Serial.print (joy_y_axis، DEC) ؛
Serial.print ("\ t") ؛
Serial.print ("acc:") ؛
Serial.print (accel_x_axis ، DEC) ؛
Serial.print ("،") ؛
Serial.print (accel_y_axis، DEC) ؛
Serial.print ("،") ؛
Serial.print (accel_z_axis، DEC) ؛
Serial.print ("\ t") ؛
Serial.print ("but:") ؛
Serial.print (z_button، DEC) ؛
Serial.print ("،") ؛
Serial.print (c_button، DEC) ؛
Serial.print ("\ r \ n") ؛ // newline
ط ++ ؛
}}
// تُرجع حالة zbutton: 1 = مضغوط ، 0 = غير مضغوط
ثابت nunchuck_zbutton () {
العودة ((nunchuck_buf [5] & gt؛ & gt؛ 0) & 1)؟ 0-1 // voodoo
}}
// تُرجع حالة zbutton: 1 = مضغوط ، 0 = غير مضغوط
ثابت nunchuck_cbutton () {
العودة ((nunchuck_buf [5] & gt؛ & gt؛ 1) & 1)؟ 0-1 // voodoo
}}
// تُرجع قيمة ذراع تحكم المحور س
ثابت int nunchuck_joyx () {
return nunchuck_buf [0] ؛
}}
// تُرجع قيمة ذراع تحكم المحور الصادي
ثابت int nunchuck_joyy () {
return nunchuck_buf [1] ؛
}}
// يعرض قيمة مقياس تسارع المحور س
ثابت int nunchuck_accelx () {
return nunchuck_buf [2] ؛ // FIXME: هذا يترك 2 بت من البيانات
}}
// تُرجع قيمة مقياس تسارع المحور ص
ثابت nunchuck_accely () {
return nunchuck_buf [3] ؛ // FIXME: هذا يترك 2 بت من البيانات
}}
// يعرض قيمة مقياس تسارع المحور z
ثابت int nunchuck_accelz () {
return nunchuck_buf [4] ؛ // FIXME: هذا يترك 2 بت من البيانات
}}
int loop_cnt = 0 ؛
byte joyx و joyy و zbut و cbut و accx و accy و accz ؛
vprint _print () {
Serial.print ("\ tX Joy:") ؛
Serial.print (خريطة (joyx، 15، 221، 0، 255)) ؛
Serial.print ("\ tY Joy:") ؛
Serial.println (خريطة (جوي ، 29 ، 229 ، 0 ، 255)) ؛
}}
int joyx1 = 129 ؛ // 15-221
int joyy1 = 124 ؛ // 29-229
إعداد باطل () {
Serial.begin (9600) ؛
nunchuck_setpowerpins () ؛
nunchuck_init () ؛ // أرسل مصافحة التهيئة
Serial.println ("Wii Nunchuck Ready") ؛
pinMode (3 ، OUTPUT) ؛
pinMode (5 ، OUTPUT) ؛
pinMode (6 ، OUTPUT) ؛
pinMode (9 ، OUTPUT) ؛
// type () ،
}}
حلقة فارغة () {
إذا كان (loop_cnt & gt؛ 10) {// كل 100 ميللي ثانية تحصل على بيانات جديدة
loop_cnt = 0 ؛
nunchuck_get_data () ؛
zbut = nunchuck_zbutton () ،
joyx = nunchuck_joyx () ، // 15-221
جوي = nunchuck_joyy () ؛ // 29-229
_print () ؛
}}
loop_cnt ++ ؛
if (zbut == 1) {
اكتب () ؛
zbut = 0 ؛
}}
آخر {
if (joyx & gt؛ (joyx1 + 20)) {
int speed1 = map (joyx - joyx1، 0، 80، 40، 255) ؛
speed1 = تقييد (speed1 ، 0 ، 255) ؛
analogWrite (6 ، 0) ؛
analogWrite (9 ، speed1) ؛
}}
آخر إذا (joyx & lt؛ (joyx1 - 20)) {
int speed2 = map (joyx1 - joyx، 0، 90، 40، 255) ؛
السرعة 2 = التقييد (السرعة 2 ، 0 ، 255) ؛
analogWrite (6 ، speed2) ؛
analogWrite (9 ، 0) ؛
}}
آخر {
analogWrite (6 ، 0) ؛
analogWrite (9 ، 0) ؛
}}
if (joyy & gt؛ (joyy1 + 20)) {
int speed3 = خريطة (جوي - جوي 1 ، 0 ، 80 ، 40 ، 255) ؛
speed3 = تقييد (speed3 ، 0 ، 255) ؛
analogWrite (3 ، 0) ؛
analogWrite (5 ، speed3) ؛
}}
آخر إذا (جوي & لتر ؛ (جوي 1 - 20)) {
int speed4 = map (joyy1 - joyy، 0، 90، 40، 255) ؛
speed4 = تقييد (speed4، 0، 255) ؛
analogWrite (3 ، speed4) ؛
analogWrite (5 ، 0) ؛
}}
آخر {
analogWrite (3 ، 0) ؛
analogWrite (5 ، 0) ؛
}}
}}
تأخير (1) ؛
}}
نوع باطل () {
int rltime = 200 ؛
// digitalWrite (6، 1)؛ // Origin
// digitalWrite (9، 0)؛
// digitalWrite (3، 1) ؛
// digitalWrite (5، 0)؛
// تأخير (1000) ؛
// H ===============
// digitalWrite (3، 0)؛ // wait
// digitalWrite (5، 0)؛
// digitalWrite (6، 0)؛
// digitalWrite (9، 0)؛
// تأخير (250) ؛
// digitalWrite (3، 0)؛ // up
الكتابة الرقمية (5 ، 1) ؛
تأخير (500) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (3 ، 1) ؛ // down
// digitalWrite (5، 0)؛
تأخير (250) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
// digitalWrite (6، 0)؛ // right
الكتابة الرقمية (9 ، 1) ؛
التأخير (rltime) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
// digitalWrite (3، 0)؛ // up
الكتابة الرقمية (5 ، 1) ؛
تأخير (250) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (3 ، 1) ؛ // down
// digitalWrite (5، 0)؛
تأخير (500) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
// digitalWrite (6، 0)؛ // right
الكتابة الرقمية (9 ، 1) ؛
التأخير (rltime) ؛
// I ==========================
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (3 ، 0) ؛ // up
الكتابة الرقمية (5 ، 1) ؛
تأخير (500) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (6 ، 0) ؛ // right
الكتابة الرقمية (9 ، 1) ؛
تأخير (100) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (6 ، 1) ؛ // يسار
الكتابة الرقمية (9 ، 0) ؛
التأخير (rltime) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (6 ، 0) ؛ // right
الكتابة الرقمية (9 ، 1) ؛
تأخير (100) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (3 ، 1) ؛ // down
الكتابة الرقمية (5 ، 0) ؛
تأخير (500) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (6 ، 0) ؛ // right
الكتابة الرقمية (9 ، 1) ؛
تأخير (100) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
الكتابة الرقمية (6 ، 1) ؛ // يسار
الكتابة الرقمية (9 ، 0) ؛
التأخير (rltime) ؛
الكتابة الرقمية (3 ، 0) ؛ // انتظر
الكتابة الرقمية (5 ، 0) ؛
الكتابة الرقمية (6 ، 0) ؛
الكتابة الرقمية (9 ، 0) ؛
تأخير (250) ؛
}}
بعد التشغيل ، يبدأ الجهاز الذي تم تجميعه بشكل صحيح في العمل فورًا. Nunchuck هي عصا تحكم تناظرية ، بحيث يمكنك التحكم ليس فقط في الاتجاه ، ولكن أيضًا في سرعة الحركة. يتولى Arduino التحكم في سرعة PWM. إذا حدثت الحركة على طول أي من المحاور في الاتجاه المعاكس ، فيجب عكس المحرك المقابل. من خلال وضع المؤشر تقريبًا في منتصف الشاشة والضغط على الزر Z ، يمكنك جعل الجهاز يكتب كلمة HI تلقائيًا.