با سلام خدمت تمامی دوستداران و دنبال کنندگان دیجی اسپارک ! در این آموزش قصد دارم نحوه اتصال کنترلر wii nunchuk را به برد آردوینو Arduino توضیح بدهم. با این کار میتوانید طیف گستردهای از رباتها را کنترل کنید یا کارهای خلاقانه دیگه را انجام بدید. مثلا یک ربات را به صورت کامل با این گجت کنترل کنید. یا اینکه یک سری کارهای منزل از جمله باز کردن در، یا آبیاری و… را بدون نیاز به حرکت، با این گجت انجام دهید. گجت Nintendo Wii Nunchuk نوعی جوی استیک و ابزار حرکتی است. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
کنترل حرکتی Wii Nunchuk چیست؟
در سال ۲۰۰۶ نیتندو کنسول نسل هفتمی خود را با نام Wii عرضه کرد. این کنسول بازی به خوبی توانست موفقیتهای قبلی این شرکت ژاپنی را ادامه دهد. این کنسول از کنترل حرکتی به نام wii remote بود بهره میبرد. کنترل حرکتی wii nunchuk یک ابزار برای کترلر بازیها با جوی استیک JoyStick آنالوگ بود و به صورت ماژولار میتوانستید به ریموت خود اضافه کنید. در ادامه این آموزش باحال نحوه ارتباط این کنترلر را با برد آردینو Arduino آموزش خواهم داد.
اتصالات ماژول Wii Nunchuk به آردوینو
خروجی این کنترلر به صورت سوکت دارای ۶ پین میباشد. که ما به ۴ پین نیاز داریم. مطابق تصویر پینها را متصل میکنیم:
سوکت را روبه روی خود بگیرد به طوری که فرو رفتگی آن بالا باشد
پین سمت چپ ماژول Wii Nunchuk بالا را به A5 آردوینو متصل کنید.
پین سمت چپ پایین ماژول Wii Nunchuk را به A3 آردوینو متصل کنید.
پین سمت راست بالا ماژول Wii Nunchuk را به A2 آردوینو متصل کنید.
پین سمت راست پایین ماژول Wii Nunchuk را به A4 آردوینو متصل کنید.
فراخوانی کتابخانه آردوینو
در این آموزش از کتابخانه Wire.h استفاده کردهام. معمولا به صورت پیشفرض در کامپایلر آردوینو Arduino IDE موجود است. در صورتی که نیاز به نصب این کتابخانه داشتید، میتوانید از پست آموزش نصب کتابخانه در نرم افزار آردوینو Arduino استفاده کنید.
کد برنامه Wii Nunchuk با آردوینو
#include <Wire.h> //فراخوانی کتابخانه ها #if (ARDUINO >= 100) #include <Arduino.h> #else #include <WProgram.h> #endif static uint8_t nunchuck_buf[6]; //ایجاد آرایه برای ذخیره کردن دیتای نانچک // در این قسمت ما پورت c رو برای تامین پاور و گرند نانچک تنظیم میکنیم static void nunchuck_setpowerpins() { #define pwrpin PORTC3 #define gndpin PORTC2 DDRC |= _BV(pwrpin) | _BV(gndpin); PORTC &= ~ _BV(gndpin); PORTC |= _BV(pwrpin); delay(100); // تاخیر زمانی برای انجام شدن تنظیمات فوق } // تنظیم کردن ارتباط i2c // و برقراری ارتباط با نانچک static void nunchuck_init() { Wire.begin(); // پیوستن به I2c به عنوان master Wire.beginTransmission(0x52);// ارسال اولین پیام به نانچک #if (ARDUINO >= 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();// پایان ارسال اطلاعات } // در این قسمت ما درخواست ارسال اطلاعات به نانچک میدهیم static void nunchuck_send_request() { Wire.beginTransmission(0x52);// شروع ارسال #if (ARDUINO >= 100) Wire.write((uint8_t)0x00);// ارسال یک بایت #else Wire.send((uint8_t)0x00);// ارسال یک بایت #endif Wire.endTransmission();// پایان ارسال } // دیکد کردن اطلاعات static char nunchuk_decode_byte (char x) { x = (x ^ 0x17) + 0x17; return x; } // دریافت پاسخ از نانچک // بازگردانی ۱ در صورت موفق بودن و ۰ در صورت نا موفق بودن static int nunchuck_get_data() { int cnt = 0; Wire.requestFrom (0x52, 6);// درخواست داده از نانچک while (Wire.available ()) { // دریافت یک بایت در قالب integer #if (ARDUINO >= 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 >= 5) { return 1; // موقق } return 0; //نا موفق } // پرینت اطلاعات دریافتی static void nunchuck_print_data() { static int i = 0; int joy_x_axis = nunchuck_buf[0]; int joy_y_axis = nunchuck_buf[1]; int accel_x_axis = nunchuck_buf[2]; int accel_y_axis = nunchuck_buf[3]; int accel_z_axis = nunchuck_buf[4]; int z_button = 0; int c_button = 0; if ((nunchuck_buf[5] >> 0) & 1) z_button = 1; if ((nunchuck_buf[5] >> 1) & 1) c_button = 1; if ((nunchuck_buf[5] >> 2) & 1) accel_x_axis += 1; if ((nunchuck_buf[5] >> 3) & 1) accel_x_axis += 2; if ((nunchuck_buf[5] >> 4) & 1) accel_y_axis += 1; if ((nunchuck_buf[5] >> 5) & 1) accel_y_axis += 2; if ((nunchuck_buf[5] >> 6) & 1) accel_z_axis += 1; if ((nunchuck_buf[5] >> 7) & 1) accel_z_axis += 2; Serial.print(i, DEC); Serial.print("\t"); Serial.print("joy:"); 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"); i++; } // برسی وضعیت دکمه z ! // ۱ = فشرده شده // ۰ = فشرده نشده static int nunchuck_zbutton() { return ((nunchuck_buf[5] >> 0) & 1) ? 0 : 1; } // برسی وضعیت دکمه c ! // ۱ = فشرده شده // ۰ = فشرده نشده static int nunchuck_cbutton() { return ((nunchuck_buf[5] >> 1) & 1) ? 0 : 1; // voodoo } // بازگردانی مقدار x-axis joystick static int nunchuck_joyx() { return nunchuck_buf[0]; } // بازگردانی مقدار y-axis joystick static int nunchuck_joyy() { return nunchuck_buf[1]; } // مقدار شتابسنج محور x static int nunchuck_accelx() { return nunchuck_buf[2]; } // مقدار شتابسنج محور y static int nunchuck_accely() { return nunchuck_buf[3]; } // مقدار شتابسنج محور z static int nunchuck_accelz() { return nunchuck_buf[4]; } int loop_cnt = 0; byte joyx, joyy, zbut, cbut, accx, accy, accz; void _print() { Serial.print("Z Button: "); Serial.print(zbut); Serial.print("\tC Button: "); Serial.print(cbut); Serial.print("\tX Joy: "); Serial.print(map(joyx, 15, 221, 0, 255)); Serial.print("\tY Joy: "); Serial.print(map(joyy, 29, 229, 0, 255)); Serial.print("\tX Accel: "); Serial.print(accx); Serial.print("\tY Accel: "); Serial.print(accy); Serial.println("\tZ Accel: "); } void setup() { Serial.begin(9600); nunchuck_setpowerpins(); // تنظیم پایه های vcc , gnd nunchuck_init(); // برقراری ارتباط اولیه (handshake) Serial.println("Wii Nunchuck Ready"); } void loop() { if ( loop_cnt > 10 ) { // دریافت اطلاعات جدید هر ۱۰۰ میلی ثانیه loop_cnt = 0; nunchuck_get_data(); zbut = nunchuck_zbutton(); // 0 - 1 cbut = nunchuck_cbutton(); // 0 - 1 joyx = nunchuck_joyx(); // 15 - 221 joyy = nunchuck_joyy(); // 29 - 229 accx = nunchuck_accelx(); // 70 - 182 accy = nunchuck_accely(); // 65 - 173 accz = nunchuck_accelz(); // 0 - 255 _print(); // چاپ اطلاعات دریافتی در سریال مانیتور } loop_cnt++; delay(1); }
مرحله آخر هم تست کردن کنترلر و برسی خروجی در سریال مانیتور آردویینو است. سریال مانیتور را باز کنید و شگفت زنده شوید. حالا میتوانید کد را بر اساس نیاز خود ویرایش و به راحتی از این کنترلر استفاده کنید.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام خسته نباشید قطعات از کجا باید تهیه کنم
سلام ! در مورد برد آردوینو و کابل های اتصال میتونید به سایت دانشجو کیت مراجعه کنید : http://www.daneshjookit.com
و درمورد نانچک هم گوگل کنید ، هم به صورت آنلاین و هم حضوری از فروشگاه های فروش کنسول و لوازم جانبی قابل تهیه است .
ببخشید یک سوال ازتون داشتم
کد این پروژه چی میشه
درب هوشمند(تشخیص اینکه چند نفر واردوچند نفر از درب خارج می شوند به همراه دوعددماژول tcrt5000 که مادون قرمزه)
با تشکر
با سلام
ضمن تشکر از توجه شما، کاربر گرامی لطفا سوالات مرتبط با پست آموزشی را مطرح کنید. اول اینکه اینجا مکانی برای دریافت کدهای رایگان پروژه نیست. نکته دوم و مهمتر رسالت دیجی اسپارک آموزش به شما کاربران است. لطفا سوالتان را در پست آموزش ماژول تشخیص مانع IR Tracking Module پکیج ۳۷ سنسور آردوینو مطرح بفرمایید.
سلام
امکانش هست از جوی استیک کامپیوتر که با یو اس بی متصل میشه استفاده کرد؟
با سلام
ممنون از توجه شما، برای این منظور میتوانید از شیلد USB Host موجود در فروشگاه استفاده نمایید.