0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Wii nunchuk手柄連接Arduino控制伺服電機(jī)的方法

科技觀察員 ? 來源:八色木 ? 作者:八色木 ? 2022-04-08 15:23 ? 次閱讀

簡介

偶然在箱子里發(fā)現(xiàn)一個舊的Wii Nunchuk手柄,又叫“雙節(jié)棍”手柄,我想它是否可以用來控制Arduino,查閱了相關(guān)資料,確定Nunchuk手柄支持I2C方式連接到Arduino, 通過不斷地研究深入,最后從todbot.com等網(wǎng)站上找到了相關(guān)的控制Will nunchuk的代碼,于是就將代碼移植過來,實現(xiàn)了 Will nunchuk 對伺服電機(jī)的控制!

Wii Nunchuk接口定義

把Wii Nunchuk和Arduino連接起來有幾種方法,我們可以買一個Wii nunchuk的適配器,或者像剪斷連接線,確保手柄再不需要和Wii連接使用了。本文采用了剪斷線的方法,剪線之后再焊接了插針到nunchuk的連線,這樣就可以和面包板更好的連接了。下圖是Wii Nunchuk的接口定義 。

poYBAGJP4taAOa2nAAMXX52N1qE428.png

Wii Nunchuk手柄接口定義

Wii Nunchuk連接Arduino

手柄白線 (GND) –》 Arduino GND

手柄紅線 ( +5V ) –》 Arduino 5V

手柄綠線 (SDA) –》 模擬引腳 4 或者 專用的 SDA pin

手柄黃線 (SCL) –》 模擬引腳 5 或者 專用的 SCL pin

連接伺服電機(jī)到Arduino

poYBAGJP4tuADlPXAAMXvm4xpy8233.png

雙軸舵機(jī)云臺

Servo 1 (x-axis)

舵機(jī)棕線 (GND) –》 Arduino GND

舵機(jī)紅線 (5V) –》 Arduino 5V

舵機(jī)黃線 (data/Signal) –》 Arduino Pin 10

Servo 2 (y-axis)

舵機(jī)棕線 (GND) –》 Arduino GND

舵機(jī)紅線 (5V) –》 Arduino 5V

舵機(jī)黃線 (data/Signal) –》 Arduino Pin 9

pYYBAGJP4uGAbA5rAAMlzNxsffM429.png

舵機(jī)云臺連接Arduino UNO

連接全部組件

poYBAGJP4ueAGQctAAZchJpezHg401.png

代碼部分

使用Arduino IDE上傳代碼前,需要兩個標(biāo)準(zhǔn)庫: Wire.h 、 Servo.h 。

代碼的執(zhí)行順序如下:

初始化Nunchuk手柄的I2C接口;

初始化伺服系統(tǒng) ;

讀取Nunchuk手柄的數(shù)據(jù);

根據(jù)讀取得 Nunchuk 手柄的實時數(shù)據(jù)控制伺服電機(jī)運動。

完整代碼如下:

/*

* NunchuckPrint

* 2007 Tod E. Kurt, http://todbot.com/blog/

* Change log:

*

* Mark Tashiro - Changed Wire.read to Wire.write

* Changed Wire.receive to Wire.read

* Added code for servos

*/

#include

#include

Servo servoLeft; // Define left servo

Servo servoRight; // Define right servo

static uint8_t nunchuck_buf[6]; // array to store nunchuck data,

void setup()

{

Serial.begin(19200);

servoLeft.attach(10); // Set left servo to digital pin 10

servoRight.attach(9); // Set right servo to digital pin 9

nunchuck_setpowerpins(); // use analog pins 2&3 as fake gnd & pwr

nunchuck_init(); // send the initilization handshake

Serial.print ("Finished setup\n");

}

void loop()

{

nunchuck_get_data();

// map nunchuk data to a servo data point

int x_axis = map(nunchuck_buf[0], 23, 222, 180, 0);

int y_axis = map(nunchuck_buf[1], 32, 231, 0, 180);

//move servo to desired position based on Wii nunchuk reading

servoLeft.write(x_axis);

servoRight.write(y_axis);

// un-comment next line to print data to serial monitor

// nunchuck_print_data();

}

//

// Nunchuck functions

//

// Uses port C (analog in) pins as power & ground for Nunchuck

static void nunchuck_setpowerpins()

{

#define pwrpin PORTC3

#define gndpin PORTC2

DDRC |= _BV(pwrpin) | _BV(gndpin);

PORTC &=~ _BV(gndpin);

PORTC |= _BV(pwrpin);

delay(100); // wait for things to stabilize

}

// initialize the I2C system, join the I2C bus,

// and tell the nunchuck we're talking to it

void nunchuck_init()

{

Wire.begin(); // join i2c bus as master

Wire.beginTransmission(0x52); // transmit to device 0x52

Wire.write(0x40); // sends memory address

Wire.write(0x00); // sends sent a zero.

Wire.endTransmission(); // stop transmitting

}

// Send a request for data to the nunchuck

// was "send_zero()"

void nunchuck_send_request()

{

Wire.beginTransmission(0x52); // transmit to device 0x52

Wire.write(0x00); // sends one byte

Wire.endTransmission(); // stop transmitting

}

// Receive data back from the nunchuck,

int nunchuck_get_data()

{

int cnt=0;

Wire.requestFrom (0x52, 6); // request data from nunchuck

while (Wire.available ()) {

// receive byte as an integer

nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.read());

cnt++;

}

nunchuck_send_request(); // send request for next data payload

// If we recieved the 6 bytes, then go print them

if (cnt >= 5) {

return 1; // success

}

return 0; //failure

}

// Print the input data we have recieved

// accel data is 10 bits long

// so we read 8 bits, then we have to add

// on the last 2 bits. That is why I

// multiply them by 2 * 2

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]; // * 2 * 2;

int accel_y_axis = nunchuck_buf[3]; // * 2 * 2;

int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;

int z_button = 0;

int c_button = 0;

// byte nunchuck_buf[5] contains bits for z and c buttons

// it also contains the least significant bits for the accelerometer data

// so we have to check each bit of byte outbuf[5]

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 += 2;

if ((nunchuck_buf[5] >> 3) & 1)

accel_x_axis += 1;

if ((nunchuck_buf[5] >> 4) & 1)

accel_y_axis += 2;

if ((nunchuck_buf[5] >> 5) & 1)

accel_y_axis += 1;

if ((nunchuck_buf[5] >> 6) & 1)

accel_z_axis += 2;

if ((nunchuck_buf[5] >> 7) & 1)

accel_z_axis += 1;

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"); // newline

i++;

}

// Encode data to format that most wiimote drivers except

// only needed if you use one of the regular wiimote drivers

char nunchuk_decode_byte (char x)

{

x = (x ^ 0x17) + 0x17;

return x;

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 伺服電機(jī)
    +關(guān)注

    關(guān)注

    85

    文章

    2048

    瀏覽量

    57875
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6469

    瀏覽量

    187091
收藏 人收藏

    評論

    相關(guān)推薦

    如何使用Arduino的藍(lán)牙控制伺服電機(jī)

    使用伺服電機(jī)在機(jī)器人技術(shù)中很常見,以實現(xiàn)精確控制。在這里,在本教程中,我們將向您展示如何通過藍(lán)牙連接伺服
    發(fā)表于 11-16 16:19 ?3558次閱讀
    如何使用<b class='flag-5'>Arduino</b>的藍(lán)牙<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b>

    如何使用Arduino控制多個伺服電機(jī)

    在這里,我們將向您展示如何使用Arduino控制多個伺服電機(jī)。將多個伺服電機(jī)
    的頭像 發(fā)表于 11-16 17:19 ?6341次閱讀
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>控制</b>多個<b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b>

    如何使用Arduino和ESP8266實現(xiàn)網(wǎng)頁控制伺服電機(jī)

    使用Arduino和ESP8266模塊通過網(wǎng)頁控制伺服電機(jī)。在本篇文章中,我們將實現(xiàn)通過網(wǎng)頁控制伺服
    發(fā)表于 06-28 08:09

    如何使用Arduino開發(fā)板控制多臺伺服電機(jī)

    使用Arduino開發(fā)板控制一臺或兩臺伺服電機(jī)非常容易實現(xiàn),但是如果我們想要控制多臺伺服
    發(fā)表于 06-28 08:01

    如何使用Arduino開發(fā)板通過藍(lán)牙方式控制伺服電機(jī)

    在機(jī)器人中使用伺服電機(jī)進(jìn)行精確控制很常見。在本文中,我們將向您展示如何使用Arduino UNO開發(fā)板無線連接一個
    發(fā)表于 06-28 08:01

    arduino連接ps2手柄控制智能小車實踐記錄

    首先感謝參考鏈接:感謝參考鏈接:https://www.cnblogs.com/hxxhdaily/p/12592043.html前篇鏈接-arduino連接ps2手柄控制智能小車實踐
    發(fā)表于 06-29 07:23

    伺服電機(jī)控制Arduino平臺

    什么是伺服電機(jī)?它們是如何起作用的?(基本駕駛方法和技術(shù))如何選擇伺服電機(jī)應(yīng)用Arduino平臺
    發(fā)表于 05-02 15:37 ?23次下載

    使用Arduino Uno和POT控制伺服電機(jī)

    電子發(fā)燒友網(wǎng)站提供《使用Arduino Uno和POT控制伺服電機(jī).zip》資料免費下載
    發(fā)表于 11-10 14:19 ?0次下載
    使用<b class='flag-5'>Arduino</b> Uno和POT<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b>

    基于Arduino UNO的手勢控制伺服電機(jī)

    電機(jī)旋轉(zhuǎn) 180 度。通過跟蹤,伺服器只會在食指抬起而其他手指保持閉合時才會轉(zhuǎn)動。這可以在具有多個伺服器的許多項目中實現(xiàn),但在這種情況下,我們堅持使用一個伺服器。
    發(fā)表于 12-21 11:26 ?0次下載

    Arduino/Android藍(lán)牙多伺服電機(jī)控制

    電子發(fā)燒友網(wǎng)站提供《Arduino/Android藍(lán)牙多伺服電機(jī)控制.zip》資料免費下載
    發(fā)表于 02-08 15:14 ?0次下載
    <b class='flag-5'>Arduino</b>/Android藍(lán)牙多<b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b><b class='flag-5'>控制</b>

    使用Arduino開發(fā)板控制伺服電機(jī)

    大多數(shù)情況下,直流電機(jī)控制控制方法都是非常簡單的(只需要連接電源和地)。伺服
    發(fā)表于 05-06 10:15 ?0次下載
    使用<b class='flag-5'>Arduino</b>開發(fā)板<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b>

    Arduino控制伺服電機(jī)的超級簡單方法

    電子發(fā)燒友網(wǎng)站提供《用Arduino控制伺服電機(jī)的超級簡單方法.zip》資料免費下載
    發(fā)表于 06-28 09:51 ?0次下載
    用<b class='flag-5'>Arduino</b><b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b>的超級簡單<b class='flag-5'>方法</b>

    伺服電機(jī)連接Arduino

    電子發(fā)燒友網(wǎng)站提供《將伺服電機(jī)連接Arduino.zip》資料免費下載
    發(fā)表于 06-28 09:38 ?1次下載
    將<b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b><b class='flag-5'>連接</b>到<b class='flag-5'>Arduino</b>

    如何使用操縱桿和Arduino控制伺服電機(jī)

    在這篇文章中,我們將學(xué)習(xí)如何使用操縱桿和Arduino控制伺服電機(jī)。我們將看到有關(guān)操縱桿,其銷,其結(jié)構(gòu)和工作的概述。我們將從操縱桿中提取有用的數(shù)據(jù),這些數(shù)據(jù)將成為
    的頭像 發(fā)表于 07-27 11:47 ?1807次閱讀
    如何使用操縱桿和<b class='flag-5'>Arduino</b><b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b>

    如何使用Arduino UNO板和電位器控制伺服電機(jī)

    在本Arduino伺服電機(jī)教程中,您將學(xué)習(xí)如何使用Arduino UNO板和電位器控制伺服
    的頭像 發(fā)表于 02-11 10:11 ?2829次閱讀
    如何使用<b class='flag-5'>Arduino</b> UNO板和電位器<b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>電機(jī)</b>