Nhiều người đã có món đồ chơi này từ thời thơ ấu, chúng tôi điều khiển nó bằng hai núm xoay. Thậm chí sau đó, có thể gắn hai động cơ DC với bánh răng vào nó và điều khiển chúng từ các nút. Và bây giờ, điều này đã trở nên khả thi để điều chỉnh cần điều khiển. Đó là những gì tác giả của Instructables đã làm với biệt danh millerman4487.
Nhưng hai phần giống hệt nhau đã được in - đây là những bộ điều hợp để kết nối các bánh răng với tay cầm Magic Screen. Nó trông giống như bất kỳ bộ điều hợp nào:
Và do đó, nó kết nối với hộp số (có lẽ điều này sẽ yêu cầu làm ấm nhẹ bộ chuyển đổi bằng máy sấy tóc):
Tập tin STL.
Chỉ có một thành phần không thể hiểu được trên đó - chip L293D. Nó chứa hai cái gọi là cầu H, mỗi cầu có thể đảo ngược động cơ được kết nối với nó. Dưới bảng nó được hiển thị kết luận nào
Kết nối chân nào của đầu nối cần điều khiển Wii Nunchuck. Bản phác thảo dưới đây có thể được viết lại để làm việc với bất kỳ loại cần điều khiển nào khác, ở dạng hiện tại, nó sẽ được yêu cầu.
#incolee
#if (ARDUINO & gt; = 100)
#incolee
#else
#incolee
// # xác định Wire.write (x) Wire.send (x)
// # xác định Wire.read () Wire.receive ()
#endif
uint8_t nunchuck_buf tĩnh [6]; // mảng để lưu trữ dữ liệu nunchuck,
// Sử dụng chân cổng C (analog in) làm nguồn & nối đất cho Nunchuck
void void nunchuck_setpowerpin () {
#define viết PORTC3
#define gndpin PORTC2
DDRC | = _BV (viết tay) | _BV (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (viết tay);
độ trễ (100); // chờ mọi thứ ổn định
}
// khởi tạo hệ thống I2C, tham gia bus I2C,
// và nói với nunchuck chúng ta đang nói chuyện với nó
void void nunchuck_init () {
Dây.begin (); // tham gia i2c bus với tư cách là chủ
Wire.beginTransmission (0x52); // truyền tới thiết bị 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // gửi địa chỉ bộ nhớ
Wire.write ((uint8_t) 0x00); // gửi gửi không.
#else
Wire.send ((uint8_t) 0x40); // gửi địa chỉ bộ nhớ
Wire.send ((uint8_t) 0x00); // gửi gửi không.
#endif
Wire.endTransmission (); // dừng truyền
}
// Gửi yêu cầu dữ liệu đến nunchuck
// là "send_zero ()"
void void nunchuck_send numquest () {
Wire.beginTransmission (0x52); // truyền tới thiết bị 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00); // gửi một byte
#else
Wire.send ((uint8_t) 0x00); // gửi một byte
#endif
Wire.endTransmission (); // dừng truyền
}
// Mã hóa dữ liệu để định dạng hầu hết các trình điều khiển wiimote ngoại trừ
// chỉ cần nếu bạn sử dụng một trong các trình điều khiển wiimote thông thường
char char nunchuk_decode_byte (char x) {
x = (x ^ 0x17) + 0x17;
trả lại x;
}
// Nhận lại dữ liệu từ nunchuck,
// trả về 1 khi đọc thành công. trả về 0 khi thất bại
int int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // yêu cầu dữ liệu từ nunchuck
while (Wire.av Available ()) {
// nhận byte dưới dạng số nguyên
#if (ARDUINO & gt; = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ());
#else
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.receive ());
#endif
cnt ++;
}
nunchuck_send numquest (); // gửi yêu cầu cho tải trọng dữ liệu tiếp theo
// Nếu chúng tôi nhận được 6 byte, sau đó đi in chúng
if (cnt & gt; = 5) {
trả lại 1; // thành công
}
trả về 0; // thất bại
}
// In dữ liệu đầu vào mà chúng tôi đã nhận được
// dữ liệu accel dài 10 bit
// vì vậy chúng tôi đọc 8 bit, sau đó chúng tôi phải thêm
// trên 2 bit cuối cùng. Đó là lý do tại sao tôi
// nhân chúng với 2 * 2
void void nunchuck_print_data () {
tĩnh 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] chứa bit cho các nút z và c
// nó cũng chứa các bit quan trọng nhất cho dữ liệu gia tốc
// vì vậy chúng ta phải kiểm tra từng bit của byte outbuf [5]
if ((nunchuck_buf [5] & gt; & gt; 0) & 1)
z_button = 1;
if ((nunchuck_buf [5] & gt; & gt; 1) & 1)
c_button = 1;
if ((nunchuck_buf [5] & gt; & gt; 2) & 1)
accel_x_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 3) & 1)
accel_x_axis + = 2;
if ((nunchuck_buf [5] & gt; & gt; 4) & 1)
accel_y_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 5) & 1)
accel_y_axis + = 2;
if ((nunchuck_buf [5] & gt; & gt; 6) & 1)
accel_z_axis + = 1;
if ((nunchuck_buf [5] & gt; & gt; 7) & 1)
accel_z_axis + = 2;
Số sê-ri (i, DEC);
Số sê-ri ("\ t");
Serial.print ("niềm vui:");
Nối tiếp.print (joy_x_axis, DEC);
Nối tiếp.print (",");
Nối tiếp.print (joy_y_axis, DEC);
Số sê-ri ("\ t");
Serial.print ("acc:");
Nối tiếp.print (accel_x_axis, DEC);
Nối tiếp.print (",");
Nối tiếp.print (accel_y_axis, DEC);
Nối tiếp.print (",");
Nối tiếp.print (accel_z_axis, DEC);
Số sê-ri ("\ t");
Serial.print ("nhưng:");
Serial.print (z_button, DEC);
Nối tiếp.print (",");
Nối tiếp.print (c_button, DEC);
Số sê-ri ("\ r \ n"); // dòng mới
i ++;
}
// trả về trạng thái zbutton: 1 = nhấn, 0 = không nhấn
int int nunchuck_zbutton () {
trả lại ((nunchuck_buf [5] & gt; & gt; 0) & 1)? 0-1 // voodoo
}
// trả về trạng thái zbutton: 1 = nhấn, 0 = không nhấn
int int nunchuck_cbutton () {
trả lại ((nunchuck_buf [5] & gt; & gt; 1) & 1)? 0-1 // voodoo
}
// trả về giá trị của cần điều khiển trục x
int int nunchuck_joyx () {
trả về nunchuck_buf [0];
}
// trả về giá trị của cần điều khiển trục y
int int nunchuck_joyy () {
trả về nunchuck_buf [1];
}
// trả về giá trị của gia tốc kế trục x
int int nunchuck_accelx () {
trả về nunchuck_buf [2]; // CỐ ĐỊNH: điều này để lại 2 bit dữ liệu
}
// trả về giá trị của gia tốc kế trục y
int int nunchuck_accely () {
trả về nunchuck_buf [3]; // CỐ ĐỊNH: điều này để lại 2 bit dữ liệu
}
// trả về giá trị của gia tốc kế trục z
int int nunchuck_accelz () {
trả về nunchuck_buf [4]; // CỐ ĐỊNH: điều này để lại 2 bit dữ liệu
}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
void _print () {
Nối tiếp ("\ tX Joy:");
Serial.print (bản đồ (joyx, 15, 221, 0, 255));
Nối tiếp ("\ tY Joy:");
Serial.println (bản đồ (vui vẻ, 29, 229, 0, 255));
}
int joyx1 = 129; // 15 - 221
int joyy1 = 124; // 29 - 229
void setup () {
Nối tiếp.begin (9600);
nunchuck_setpowerpin ();
nunchuck_init (); // gửi cái bắt tay khởi tạo
Serial.println ("Sẵn sàng cho Wii Nunchuck");
pinMode (3, ĐẦU RA);
pinMode (5, ĐẦU RA);
pinMode (6, ĐẦU RA);
pinMode (9, ĐẦU RA);
// loại ();
}
void loop () {
if (loop_cnt & gt; 10) {// cứ sau 100 ms nhận được dữ liệu mới
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15 - 221
niềm vui = nunchuck_joyy (); // 29 - 229
_print ();
}
loop_cnt ++;
if (zbut == 1) {
loại ();
zbut = 0;
}
khác {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = map (joyx - joyx1, 0, 80, 40, 255);
speed1 = constrain (speed1, 0, 255);
analogWrite (6, 0);
analogWrite (9, speed1);
}
khác nếu (joyx & lt; (joyx1 - 20)) {
int speed2 = map (joyx1 - joyx, 0, 90, 40, 255);
speed2 = constrain (speed2, 0, 255);
analogWrite (6, speed2);
analogWrite (9, 0);
}
khác {
analogWrite (6, 0);
analogWrite (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = map (joyy - joyy1, 0, 80, 40, 255);
speed3 = constrain (speed3, 0, 255);
analogWrite (3, 0);
analogWrite (5, speed3);
}
khác nếu (joyy & lt; (joyy1 - 20)) {
int speed4 = map (joyy1 - joyy, 0, 90, 40, 255);
speed4 = constrain (speed4, 0, 255);
analogWrite (3, speed4);
analogWrite (5, 0);
}
khác {
analogWrite (3, 0);
analogWrite (5, 0);
}
}
trì hoãn (1);
}
khoảng trống loại () {
int rltime = 200;
// kỹ thuật sốWrite (6, 1); // nguồn gốc
// kỹ thuật sốWrite (9, 0);
// kỹ thuật sốWrite (3, 1);
// kỹ thuật sốWrite (5, 0);
// độ trễ (1000);
// H ===============
// kỹ thuật sốWrite (3, 0); // chờ
// kỹ thuật sốWrite (5, 0);
// kỹ thuật sốWrite (6, 0);
// kỹ thuật sốWrite (9, 0);
// độ trễ (250);
// kỹ thuật sốWrite (3, 0); // lên
kỹ thuật sốWrite (5, 1);
độ trễ (500);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
digitalWrite (3, 1); // xuống
// kỹ thuật sốWrite (5, 0);
trì hoãn (250);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
// kỹ thuật sốWrite (6, 0); // phải
kỹ thuật sốWrite (9, 1);
trì hoãn (rltime);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
// kỹ thuật sốWrite (3, 0); // lên
kỹ thuật sốWrite (5, 1);
trì hoãn (250);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
digitalWrite (3, 1); // xuống
// kỹ thuật sốWrite (5, 0);
độ trễ (500);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
// kỹ thuật sốWrite (6, 0); // phải
kỹ thuật sốWrite (9, 1);
trì hoãn (rltime);
// Tôi ==========================
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
kỹ thuật sốWrite (3, 0); // lên
kỹ thuật sốWrite (5, 1);
độ trễ (500);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
kỹ thuật sốWrite (6, 0); // phải
kỹ thuật sốWrite (9, 1);
độ trễ (100);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
kỹ thuật sốWrite (6, 1); // trái
kỹ thuật sốWrite (9, 0);
trì hoãn (rltime);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
kỹ thuật sốWrite (6, 0); // phải
kỹ thuật sốWrite (9, 1);
độ trễ (100);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
digitalWrite (3, 1); // xuống
kỹ thuật sốWrite (5, 0);
độ trễ (500);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
kỹ thuật sốWrite (6, 0); // phải
kỹ thuật sốWrite (9, 1);
độ trễ (100);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
kỹ thuật sốWrite (6, 1); // trái
kỹ thuật sốWrite (9, 0);
trì hoãn (rltime);
digitalWrite (3, 0); // chờ
kỹ thuật sốWrite (5, 0);
kỹ thuật sốWrite (6, 0);
kỹ thuật sốWrite (9, 0);
trì hoãn (250);
}
Sau khi bật, một thiết bị được lắp ráp chính xác bắt đầu hoạt động ngay lập tức. Nunchuck là một phím điều khiển tương tự, vì vậy bạn có thể điều khiển không chỉ hướng mà còn cả tốc độ di chuyển. Arduino chiếm quyền điều khiển tốc độ PWM. Nếu chuyển động dọc theo bất kỳ trục nào xảy ra theo hướng ngược lại, động cơ tương ứng phải được đảo ngược. Bằng cách đặt con trỏ ở giữa màn hình và nhấn nút Z, bạn có thể khiến thiết bị tự động viết chữ HI.