精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

簡介

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

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

連接伺服電機到Arduino

poYBAGJP4tuADlPXAAMXvm4xpy8233.png

雙軸舵機云臺

Servo 1 (x-axis)

舵機棕線 (GND) –》 Arduino GND

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

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

Servo 2 (y-axis)

舵機棕線 (GND) –》 Arduino GND

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

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

pYYBAGJP4uGAbA5rAAMlzNxsffM429.png

舵機云臺連接Arduino UNO

連接全部組件

poYBAGJP4ueAGQctAAZchJpezHg401.png

代碼部分

使用Arduino IDE上傳代碼前,需要兩個標準庫: Wire.h 、 Servo.h 。

代碼的執行順序如下:

初始化Nunchuk手柄的I2C接口;

初始化伺服系統 ;

讀取Nunchuk手柄的數據;

根據讀取得 Nunchuk 手柄的實時數據控制伺服電機運動。

完整代碼如下:

/*

* 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;

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 伺服電機
    +關注

    關注

    85

    文章

    2003

    瀏覽量

    57298
  • Arduino
    +關注

    關注

    187

    文章

    6453

    瀏覽量

    185915
收藏 人收藏

    評論

    相關推薦

    如何使用Arduino的藍牙控制伺服電機

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

    如何使用Arduino控制多個伺服電機

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

    如何使用Arduino和ESP8266實現網頁控制伺服電機

    使用Arduino和ESP8266模塊通過網頁控制伺服電機。在本篇文章中,我們將實現通過網頁控制伺服
    發表于 06-28 08:09

    如何使用Arduino開發板控制多臺伺服電機

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

    如何使用Arduino開發板通過藍牙方式控制伺服電機

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

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

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

    伺服電機控制Arduino平臺

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

    使用Arduino Uno和POT控制伺服電機

    電子發燒友網站提供《使用Arduino Uno和POT控制伺服電機.zip》資料免費下載
    發表于 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'>電機</b>

    基于Arduino UNO的手勢控制伺服電機

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

    Arduino/Android藍牙多伺服電機控制

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

    使用Arduino開發板控制伺服電機

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

    Arduino控制伺服電機的超級簡單方法

    電子發燒友網站提供《用Arduino控制伺服電機的超級簡單方法.zip》資料免費下載
    發表于 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'>電機</b>的超級簡單<b class='flag-5'>方法</b>

    伺服電機連接Arduino

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

    如何使用操縱桿和Arduino控制伺服電機

    在這篇文章中,我們將學習如何使用操縱桿和Arduino控制伺服電機。我們將看到有關操縱桿,其銷,其結構和工作的概述。我們將從操縱桿中提取有用的數據,這些數據將成為
    的頭像 發表于 07-27 11:47 ?1606次閱讀
    如何使用操縱桿和<b class='flag-5'>Arduino</b><b class='flag-5'>控制</b><b class='flag-5'>伺服</b><b class='flag-5'>電機</b>

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

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