Birçoğunda bu oyuncak vardı, iki döner düğme ile kontrol ettik. O zaman bile, dişlilere sahip iki DC motoru bağlamak ve düğmelerden kontrol etmek mümkün oldu. Ve şimdi bunun için oyun çubuklarını uyarlamak mümkün hale geldi. Instructables'ın yazarı millerman4487 takma adı altında yaptı.
Ancak iki özdeş parçanın basılması gerekiyordu - bunlar, Sihirli Ekran tutamaçlarına dişliler bağlamak için adaptörler. Adaptörlerden herhangi birine benziyor:
Ve böylece şanzımana bağlanır (belki de adaptörün saç kurutma makinesi ile hafifçe ısıtılması gerekir):
STL dosyası.
Üzerinde sadece bir anlaşılmaz bileşen var - L293D yongası. Her biri kendisine bağlı motoru tersine çevirebilen iki H köprüsü içerir. Yönetim kurulunun altında hangi sonuçların olduğu gösterilmiştir.
Wii Nunchuck kumanda kolu konnektörünün hangi pimlerinden birini bağlayın. Aşağıdaki çizim, başka herhangi bir oyun çubuğu türüyle çalışmak için yeniden yazılabilir, mevcut haliyle gerekli olacaktır.
#include
#if (ARDUINO & = 100)
#include
#else
#include
// # define Wire.write (x) Wire.send (x)
// # define Wire.read () Wire.receive ()
#endif
statik uint8_t nunchuck_buf [6]; // nunchuck verilerini depolamak için dizi,
// Nunchuck için bağlantı noktası C (analog giriş) pimlerini güç ve toprak olarak kullanır
statik boşluk nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _BV (gndpin);
PORTC & = ~ BV (gndpin);
PORTC | = _BV (pwrpin);
gecikme (100); // şeylerin dengelenmesini bekleyin
}
// I2C sistemini başlatın, I2C veriyoluna katılın,
// ve nunchuck'a onunla konuştuğumuzu söyle
statik boşluk nunchuck_init () {
Wire.begin (); // i2c veriyoluna master olarak katılın
Wire.beginTransmission (0x52); // 0x52 cihazına aktar
#if (ARDUINO & = 100)
Wire.write ((uint8_t) 0x40); // bellek adresi gönderir
Wire.write ((uint8_t) 0x00); // bir sıfır gönderdi.
#else
Wire.send ((uint8_t) 0x40); // bellek adresi gönderir
Wire.send ((uint8_t) 0x00); // bir sıfır gönderdi.
#endif
Wire.endTransmission (); // iletimi durdur
}
// Nunchuck'a veri talebi gönderin
// "send_zero ()" idi
statik boşluk nunchuck_send_request () {
Wire.beginTransmission (0x52); // 0x52 cihazına aktar
#if (ARDUINO & = 100)
Wire.write ((uint8_t) 0x00); // bir bayt gönderir
#else
Wire.send ((uint8_t) 0x00); // bir bayt gönderir
#endif
Wire.endTransmission (); // iletimi durdur
}
// Verileri, çoğu kablosuz sürücünün
// yalnızca normal wiimote sürücülerinden birini kullanıyorsanız gereklidir
statik karakter nunchuk_decode_byte (karakter x) {
x = (x ^ 0x17) + 0x17;
dönüş x;
}
// Nunchuck'tan veri al,
// başarıyla okunduğunda 1 döndürür. hata durumunda 0 döndürür
static int nunchuck_get_data () {
int cnt = 0;
Wire.requestFrom (0x52, 6); // nunchuck'tan veri iste
while (Wire.available ()) {
// tamsayı olarak bayt al
#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 (); // sonraki veri yükü için istek gönder
// 6 bayt alırsak, onları yazdırmaya gidelim
eğer (cnt & gt; = 5) {
dönüş 1; // başarı
}
dönüş 0; // hata
}
// Aldığımız giriş verilerini yazdırın
// hız verisi 10 bit uzunluğunda
// bu yüzden 8 bit okuduk, sonra eklemeliyiz
// son 2 bitte. Bu yüzden ben
// bunları 2 * 2 ile çarpın
statik boşluk nunchuck_print_data () {
statik 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 ve c düğmeleri için bitler içeriyor
// ivmeölçer verileri için en az anlamlı bitleri de içerir
// bu yüzden her bit bayt outbuf'unu kontrol etmeliyiz [5]
eğer ((nunchuck_buf [5]> 0) & 1)
z_button = 1;
eğer ((nunchuck_buf [5]> 1) & 1)
c_button = 1;
eğer ((nunchuck_buf [5]> 2) & 1)
accel_x_axis + = 1;
eğer ((nunchuck_buf [5] & 3) & 1)
accel_x_axis + = 2;
eğer ((nunchuck_buf [5] & 4) & 1)
accel_y_axis + = 1;
eğer ((nunchuck_buf [5] & 5) & 1)
accel_y_axis + = 2;
eğer ((nunchuck_buf [5]> 6) & 1)
accel_z_axis + = 1;
eğer ((nunchuck_buf [5]> 7) & 1)
accel_z_axis + = 2;
Seri.print (i, DEC);
Serial.print ("\ t");
Serial.print ("sevinç:");
Seri.print (joy_x_axis, DEC);
Serial.print (",");
Seri.print (joy_y_axis, DEC);
Serial.print ("\ t");
Serial.print ("acc:");
Seri.print (accel_x_axis, DEC);
Serial.print (",");
Seri.print (accel_y_axis, DEC);
Serial.print (",");
Seri.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"); // satırsonu
i ++;
}
// zdüğmesi durumunu döndürür: 1 = basılı, 0 = basılı değil
static int nunchuck_zbutton () {
dönüş ((nunchuck_buf [5]> 0) & 1)? 0: 1; // vudu
}
// zdüğmesi durumunu döndürür: 1 = basılı, 0 = basılı değil
static int nunchuck_cbutton () {
dönüş ((nunchuck_buf [5]> 1) & 1)? 0: 1; // vudu
}
// x ekseni kumanda kolunun değerini döndürür
static int nunchuck_joyx () {
dönüş nunchuck_buf [0];
}
// y ekseni joystick'in değerini döndürür
static int nunchuck_joyy () {
dönüş nunchuck_buf [1];
}
// x ekseni ivmeölçerin değerini döndürür
statik int nunchuck_accelx () {
dönüş nunchuck_buf [2]; // FIXME: verilerin 2 biti kalıyor
}
// y ekseni ivmeölçerin değerini döndürür
statik int nunchuck_accely () {
dönüş nunchuck_buf [3]; // FIXME: verilerin 2 biti kalıyor
}
// z ekseni ivmeölçerin değerini döndürür
statik int nunchuck_accelz () {
dönüş nunchuck_buf [4]; // FIXME: verilerin 2 biti kalıyor
}
int loop_cnt = 0;
bayt joyx, neşeli, zbut, cbut, accx, accy, accz;
void _print () {
Serial.print ("\ tX Joy:");
Serial.print (harita (joyx, 15, 221, 0, 255));
Serial.print ("\ tY Joy:");
Serial.println (harita (sevinç, 29, 229, 0, 255));
}
int sevinçx1 = 129; // 15-222
int joyy1 = 124; // 29-2229
void setup () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // başlatma el sıkışmasını gönderin
Serial.println ("Wii Nunchuck Ready");
pinMode (3, ÇIKIŞ);
pinMode (5, ÇIKIŞ);
pinMode (6, ÇIKIŞ);
pinMode (9, ÇIKIŞ);
// type ();
}
void loop () {
if (loop_cnt & gt; 10) {// her 100 ms'de bir yeni veri alırsa
loop_cnt = 0;
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15-222
joyy = nunchuck_joyy (); // 29-2229
_print ();
}
loop_cnt ++;
if (zbut == 1) {
type ();
zbut = 0;
}
başka {
if (joyx & gt; (joyx1 + 20)) {
int speed1 = harita (joyx - joyx1, 0, 80, 40, 255);
hız1 = kısıtlama (hız1, 0, 255);
analog Yazma (6, 0);
analogWrite (9; hız1);
}
else if (joyx & lt; (joyx1-20)) {
int speed2 = harita (joyx1 - joyx, 0, 90, 40, 255);
hız2 = kısıtlama (hız2; 0, 255);
analogWrite (6; hız2);
analog Yazma (9, 0);
}
başka {
analog Yazma (6, 0);
analog Yazma (9, 0);
}
if (joyy & gt; (joyy1 + 20)) {
int speed3 = harita (sevinçli - sevinçli1, 0, 80, 40, 255);
hız3 = kısıtlama (hız3; 0, 255);
analogWrite (3, 0);
analogWrite (5, hız3);
}
else if (sevinçli & lt; (sevinçli1-20)) {
int speed4 = harita (joyy1 - joyy, 0, 90, 40, 255);
hız4 = kısıtlama (hız4, 0, 255);
analogWrite (3, hız4);
analog Yazma (5, 0);
}
başka {
analogWrite (3, 0);
analog Yazma (5, 0);
}
}
gecikme (1);
}
void type () {
int rltime = 200;
// digitalWrite (6, 1); // kökeni
// digitalWrite (9, 0);
// digitalWrite (3, 1);
// digitalWrite (5, 0);
// gecikme (1000);
// H ===============
// digitalWrite (3, 0); // bekleyin
// digitalWrite (5, 0);
// digitalWrite (6, 0);
// digitalWrite (9, 0);
// gecikme (250);
// digitalWrite (3, 0); // yukarı
digitalWrite (5, 1);
gecikme (500);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (3, 1); // aşağı
// digitalWrite (5, 0);
gecikme (250);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
// digitalWrite (6, 0); // sağ
digitalWrite (9, 1);
gecikme (çalışma süresi);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
// digitalWrite (3, 0); // yukarı
digitalWrite (5, 1);
gecikme (250);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (3, 1); // aşağı
// digitalWrite (5, 0);
gecikme (500);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
// digitalWrite (6, 0); // sağ
digitalWrite (9, 1);
gecikme (çalışma süresi);
// Ben ==========================
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (3, 0); // yukarı
digitalWrite (5, 1);
gecikme (500);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (6, 0); // sağ
digitalWrite (9, 1);
gecikme (100);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (6, 1); // sol
digitalWrite (9, 0);
gecikme (çalışma süresi);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (6, 0); // sağ
digitalWrite (9, 1);
gecikme (100);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (3, 1); // aşağı
digitalWrite (5, 0);
gecikme (500);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (6, 0); // sağ
digitalWrite (9, 1);
gecikme (100);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
digitalWrite (6, 1); // sol
digitalWrite (9, 0);
gecikme (çalışma süresi);
digitalWrite (3, 0); // bekleyin
digitalWrite (5, 0);
digitalWrite (6, 0);
digitalWrite (9, 0);
gecikme (250);
}
Açıldıktan sonra, doğru monte edilmiş bir cihaz hemen çalışmaya başlar. Nunchuck analog bir joystick olduğundan, yalnızca yönü değil, aynı zamanda hareket hızını da kontrol edebilirsiniz. Arduino, PWM hız kontrolünü devralır. Eksenlerden herhangi biri boyunca hareket ters yönde gerçekleşirse, karşılık gelen motor tersine çevrilmelidir. İmleci yaklaşık olarak ekranın ortasına getirip Z düğmesine basarak, cihazın otomatik olarak HI kelimesini yazmasını sağlayabilirsiniz.