آردوینو آموزش آردوینو پروژه های آردوینو

آموزش اتصال کنترلر کنسول بازی نینتندو Nintendo Wii Nunchuk به آردوینو

Nintendo-Wii-Nunchuk-Arduino-UNO-digispark
نوشته شده توسط محمد صالح مهدوی راد

با سلام خدمت تمامی دوستداران و دنبال کنندگان دیجی اسپارک ! در این آموزش قصد دارم نحوه اتصال کنترلر wii nunchuk را به برد آردوینو Arduino توضیح بدهم. با این کار می‌توانید طیف گسترده‌ای از ربات‌ها را کنترل کنید یا کارهای خلاقانه دیگه را انجام بدید. مثلا یک ربات را به صورت کامل با این گجت کنترل کنید. یا اینکه یک سری کارهای منزل از جمله باز کردن در، یا آبیاری و… را بدون نیاز به حرکت، با این گجت انجام دهید. گجت Nintendo Wii Nunchuk نوعی جوی استیک و ابزار حرکتی است. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 

آموزش اتصال کنترلر کنسول بازی نینتندو 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 آردوینو متصل کنید.

آموزش اتصال کنترلر کنسول بازی نینتندو Nintendo Wii Nunchuk به آردوینو دیجی اسپارک

 

فراخوانی کتابخانه آردوینو

در این آموزش از کتابخانه 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);

}

مرحله آخر هم تست کردن کنترلر و برسی خروجی در سریال مانیتور آردویینو است. سریال مانیتور را باز کنید و شگفت زنده شوید. حالا می‌توانید کد را بر اساس نیاز خود ویرایش و به راحتی از این کنترلر استفاده کنید.

آموزش اتصال کنترلر کنسول بازی نینتندو Nintendo Wii Nunchuk به آردوینو -دیجی اسپارک

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد.

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

محمد صالح مهدوی راد

از کودکی به کیت های الکترونیک علاقه مند بودم . به مرور زمان با میکرو آشنا شدم که اوایل با AVR و اکنون با برد های آردوینو کار میکنم !

علاقمند به مباحث IOT و برد های کنترل صنعتی هستم ...

تبادل نظر و رفع عیب با ثبت دیدگاه

۶ دیدگاه