หลายคนมีของเล่นนี้ในวัยเด็กเราควบคุมด้วยปุ่มหมุนสองตัว ถึงอย่างนั้นมันก็เป็นไปได้ที่จะต่อมอเตอร์ DC สองตัวเข้ากับเกียร์และควบคุมมันจากปุ่มต่างๆ และสำหรับตอนนี้มันเป็นไปได้ที่จะปรับจอยสติ๊ก ซึ่งเป็นสิ่งที่ผู้เขียน Instructables ทำภายใต้ชื่อเล่น millerman4487
ส่วนประกอบทั้งหมด ทำที่บ้าน เขาวางบนแผ่นกระดาษแข็ง:
แต่จะต้องมีการพิมพ์สองส่วนที่เหมือนกัน - นี่คืออะแดปเตอร์สำหรับเชื่อมต่อเกียร์กับที่จับ Magic Screen ดูเหมือนว่าอะแดปเตอร์ใด ๆ :
ดังนั้นจึงเชื่อมต่อกับกระปุกเกียร์ (อาจต้องใช้อะแดปเตอร์กับเครื่องเป่าผม)
ไฟล์ STL
แผนภาพไฟฟ้าของโครงสร้างดังแสดงด้านล่าง:
มีส่วนประกอบที่เข้าใจไม่ได้เพียงชิ้นเดียวนั่นคือชิป L293D มันประกอบไปด้วยสองสะพานที่เรียกว่า H-bridges ซึ่งแต่ละอันสามารถย้อนกลับมอเตอร์ที่เชื่อมต่อกับมัน ด้านล่างของกระดานแสดงว่าข้อสรุปใด Arduino เชื่อมต่อหมุดตัวใดตัวหนึ่งของตัวเชื่อมต่อจอยสติ๊ก Wii Nunchuck ภาพร่างด้านล่างสามารถเขียนใหม่เพื่อทำงานกับก้านควบคุมชนิดอื่น ๆ ในรูปแบบปัจจุบันที่จะต้องใช้
#include
#if (ARDUINO & gt; = 100)
#include
# อื่น
#include
// # define Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
endif #
uint8_t คงที่ nunchuck_buf [6]; // array เพื่อเก็บข้อมูล nunchuck
// ใช้พอร์ต C (อนาล็อกเป็น) พินเป็น Power & Ground สำหรับ Nunchuck
โมฆะคงที่ nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
ล่าช้า (100); // รอให้สิ่งต่าง ๆ มีเสถียรภาพ
}
// เริ่มต้นระบบ I2C เข้าร่วม I2C บัส
// และบอกกระบองที่เรากำลังพูดถึงอยู่
โมฆะคงที่ nunchuck_init () {
Wire.begin (); // เข้าร่วม i2c bus ในฐานะมาสเตอร์
Wire.beginTransmission (0x52); // ส่งไปยังอุปกรณ์ 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // ส่งที่อยู่หน่วยความจำ
Wire.write ((uint8_t) 0x00); // ส่งส่งค่าศูนย์
# อื่น
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); // ส่งหนึ่งไบต์
# อื่น
Wire.send ((uint8_t) 0x00); // ส่งหนึ่งไบต์
endif #
Wire.endTransmission (); // หยุดการส่งสัญญาณ
}
// เข้ารหัสข้อมูลเพื่อจัดรูปแบบที่ไดรเวอร์ Wiiote ส่วนใหญ่ยกเว้น
// จำเป็นเฉพาะเมื่อคุณใช้ไดรเวอร์ wiimote ปกติอย่างใดอย่างหนึ่ง
ถ่านแบบคงที่ nunchuk_decode_byte (ถ่าน x) {
x = (x ^ 0x17) + 0x17;
ส่งคืน x
}
// รับข้อมูลกลับจาก nunchuck
// คืนค่า 1 เมื่ออ่านสำเร็จ ส่งคืนค่า 0 เมื่อล้มเหลว
int คงที่ nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // ขอข้อมูลจาก nunchuck
ในขณะที่ (Wire.available ()) {
// รับ byte เป็นจำนวนเต็ม
#if (ARDUINO & gt; = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ());
# อื่น
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.receive ());
endif #
cnt ++;
}
nunchuck_send_request (); // ส่งคำขอสำหรับ data payload ถัดไป
// ถ้าเราได้รับ 6 ไบต์จากนั้นไปพิมพ์มัน
ถ้า (cnt & gt; = 5) {
คืน 1 // ความสำเร็จ
}
กลับ 0 // ความล้มเหลว
}
// พิมพ์ข้อมูลอินพุตที่เราได้รับ
// ข้อมูล accel มีความยาว 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 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] มีบิตสำหรับปุ่ม z และ c
// มันมีบิตที่สำคัญน้อยที่สุดสำหรับข้อมูล accelerometer
// ดังนั้นเราต้องตรวจสอบ byte outbuf แต่ละบิต [5]
ถ้า ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_button = 1;
ถ้า ((nunchuck_buf [5] & gt; & gt; 1) & 1)
c_button = 1;
ถ้า ((nunchuck_buf [5] & gt; & gt; 2) & 1)
accel_x_axis + = 1;
ถ้า ((nunchuck_buf [5] & gt; & gt; 3) & 1)
accel_x_axis + = 2;
ถ้า ((nunchuck_buf [5] & gt; & gt; 4) & 1)
accel_y_axis + = 1;
ถ้า ((nunchuck_buf [5] & gt; & gt; 5) & 1)
accel_y_axis + = 2;
ถ้า ((nunchuck_buf [5] & gt; & gt; 6) & 1)
accel_z_axis + = 1;
ถ้า ((nunchuck_buf [5] & gt; & gt; 7) & 1)
accel_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"); // ขึ้นบรรทัดใหม่
ฉัน ++;
}
// ส่งกลับสถานะ zbutton: 1 = กด, 0 = ไม่ได้กด
int คงที่ nunchuck_zbutton () {
ส่งคืน ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0: 1; // voodoo
}
// ส่งกลับสถานะ zbutton: 1 = กด, 0 = ไม่ได้กด
int คงที่ nunchuck_cbutton () {
ส่งคืน ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0: 1; // voodoo
}
// คืนค่าจอยสติ๊กแบบแกน x
int คงที่ nunchuck_joyx () {
return nunchuck_buf [0];
}
// คืนค่าจอยสติ๊กแบบแกน y
int คงที่ nunchuck_joyy () {
return nunchuck_buf [1];
}
// ส่งกลับค่าของ accelerometer x- แกน
int คงที่ nunchuck_accelx () {
ส่งคืน nunchuck_buf [2]; // FIXME: นี่เป็นข้อมูล 2 บิต
}
// ส่งคืนค่า y-axis accelerometer
int คงที่ nunchuck_accely () {
return nunchuck_buf [3]; // FIXME: นี่เป็นข้อมูล 2 บิต
}
// ส่งกลับค่าของ accelerometer z- แกน
int คงที่ nunchuck_accelz () {
ส่งคืน nunchuck_buf [4]; // FIXME: นี่เป็นข้อมูล 2 บิต
}
int loop_cnt = 0;
ไบต์ joyx, ความสุข, zbut, cbut, accx, accy, accz;
void _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 ();
}
void loop () {
if (loop_cnt & gt; 10) {// ทุก ๆ 100 msecs รับข้อมูลใหม่
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
joyy = nunchuck_joyy (); // 29 - 229
_print ();
}
loop_cnt ++;
if (zbut == 1) {
ประเภท ();
zbut = 0;
}
อื่น {
ถ้า (joyx & gt; (joyx1 + 20)) {
int speed1 = แผนที่ (joyx - joyx1, 0, 80, 40, 255);
speed1 = ข้อ จำกัด (speed1, 0, 255);
analogWrite (6, 0);
analogWrite (9, speed1);
}
อื่นถ้า (joyx & lt; (joyx1 - 20)) {
int speed2 = แผนที่ (joyx1 - joyx, 0, 90, 40, 255);
speed2 = ข้อ จำกัด (speed2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
อื่น {
analogWrite (6, 0);
analogWrite (9, 0);
}
ถ้า (joyy & gt; (joyy1 + 20)) {
int speed3 = แผนที่ (joyy - joyy1, 0, 80, 40, 255);
speed3 = ข้อ จำกัด (speed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, ความเร็ว 3);
}
อื่นถ้า (joyy & lt; (joyy1 - 20)) {
int speed4 = แผนที่ (joyy1 - joyy, 0, 90, 40, 255);
speed4 = ข้อ จำกัด (speed4, 0, 255);
analogWrite (3, ความเร็ว 4);
analogWrite (5, 0);
}
อื่น {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
ล่าช้า (1);
}
ประเภทโมฆะ () {
int rltime = 200;
// digitalWrite (6, 1); // ต้นกำเนิด
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// ล่าช้า (1,000);
// H ===============
// digitalWrite (3, 0); // รอ
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// ล่าช้า (250);
// digitalWrite (3, 0); // ขึ้น
digitalWrite (5, 1);
ล่าช้า (500);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (3, 1); // down
// digitalWrite (5, 0);
ล่าช้า (250);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
// digitalWrite (6, 0); // ขวา
digitalWrite (9, 1);
ความล่าช้า (rltime);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
// digitalWrite (3, 0); // ขึ้น
digitalWrite (5, 1);
ล่าช้า (250);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (3, 1); // down
// digitalWrite (5, 0);
ล่าช้า (500);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
// digitalWrite (6, 0); // ขวา
digitalWrite (9, 1);
ความล่าช้า (rltime);
// ฉัน ==========================
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (3, 0); // ขึ้น
digitalWrite (5, 1);
ล่าช้า (500);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (6, 0); // ขวา
digitalWrite (9, 1);
ล่าช้า (100);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (6, 1); // ซ้าย
digitalWrite (9, 0);
ความล่าช้า (rltime);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (6, 0); // ขวา
digitalWrite (9, 1);
ล่าช้า (100);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (3, 1); // down
digitalWrite (5, 0);
ล่าช้า (500);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (6, 0); // ขวา
digitalWrite (9, 1);
ล่าช้า (100);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
digitalWrite (6, 1); // ซ้าย
digitalWrite (9, 0);
ความล่าช้า (rltime);
digitalWrite (3, 0); // รอ
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
ล่าช้า (250);
}
หลังจากเปิดอุปกรณ์ที่ประกอบอย่างถูกต้องจะเริ่มทำงานทันที Nunchuck เป็นจอยสติ๊กแบบอะนาล็อกดังนั้นคุณสามารถควบคุมทิศทางไม่เพียง แต่ยังความเร็วของการเคลื่อนไหว Arduino ใช้การควบคุมความเร็ว PWM หากการเคลื่อนที่ตามแกนใด ๆ เกิดขึ้นในทิศทางตรงกันข้ามจะต้องสลับมอเตอร์ที่เกี่ยวข้อง โดยการวางเคอร์เซอร์ไว้ที่กึ่งกลางหน้าจอและกดปุ่ม Z คุณสามารถทำให้อุปกรณ์เขียนคำ HI โดยอัตโนมัติ