1 | #include <Wire.h>
|
2 | #include <string.h>
|
3 |
|
4 | #undef int
|
5 | #include <stdio.h>
|
6 |
|
7 | uint8_t outbuf[6]; // array to store arduino output
|
8 | int cnt = 0;
|
9 | int ledPin = 13;
|
10 |
|
11 | void
|
12 | setup ()
|
13 | {
|
14 | beginSerial (19200); //----------------------------------------<<< Das hier scheint falsch zu sein
|
15 | Serial.print ("Finished setup\n");
|
16 | Wire.begin (); // join i2c bus with address 0x52
|
17 | nunchuck_init (); // send the initilization handshake
|
18 | }
|
19 |
|
20 | void
|
21 | nunchuck_init ()
|
22 | {
|
23 | Wire.beginTransmission (0x52); // transmit to device 0x52
|
24 | Wire.send (0x40); // sends memory address
|
25 | Wire.send (0x00); // sends sent a zero.
|
26 | Wire.endTransmission (); // stop transmitting
|
27 | }
|
28 |
|
29 | void
|
30 | send_zero ()
|
31 | {
|
32 | Wire.beginTransmission (0x52); // transmit to device 0x52
|
33 | Wire.send (0x00); // sends one byte
|
34 | Wire.endTransmission (); // stop transmitting
|
35 | }
|
36 |
|
37 | void
|
38 | loop ()
|
39 | {
|
40 | Wire.requestFrom (0x52, 6); // request data from nunchuck
|
41 | while (Wire.available ())
|
42 | {
|
43 | outbuf[cnt] = nunchuk_decode_byte (Wire.receive ()); // receive byte as an integer
|
44 | digitalWrite (ledPin, HIGH); // sets the LED on
|
45 | cnt++;
|
46 | }
|
47 |
|
48 | // If we recieved the 6 bytes, then go print them
|
49 | if (cnt >= 5)
|
50 | {
|
51 | print ();
|
52 | }
|
53 |
|
54 | cnt = 0;
|
55 | send_zero (); // send the request for next bytes
|
56 | delay (100);
|
57 | }
|
58 |
|
59 | // Print the input data we have recieved
|
60 | // accel data is 10 bits long
|
61 | // so we read 8 bits, then we have to add
|
62 | // on the last 2 bits. That is why I
|
63 | // multiply them by 2 * 2
|
64 | void
|
65 | print ()
|
66 | {
|
67 | int joy_x_axis = outbuf[0];
|
68 | int joy_y_axis = outbuf[1];
|
69 | int accel_x_axis = outbuf[2] * 2 * 2;
|
70 | int accel_y_axis = outbuf[3] * 2 * 2;
|
71 | int accel_z_axis = outbuf[4] * 2 * 2;
|
72 |
|
73 | int z_button = 0;
|
74 | int c_button = 0;
|
75 |
|
76 | // byte outbuf[5] contains bits for z and c buttons
|
77 | // it also contains the least significant bits for the accelerometer data
|
78 | // so we have to check each bit of byte outbuf[5]
|
79 | if ((outbuf[5] >> 0) & 1)
|
80 | {
|
81 | z_button = 1;
|
82 | }
|
83 | if ((outbuf[5] >> 1) & 1)
|
84 | {
|
85 | c_button = 1;
|
86 | }
|
87 |
|
88 | if ((outbuf[5] >> 2) & 1)
|
89 | {
|
90 | accel_x_axis += 2;
|
91 | }
|
92 | if ((outbuf[5] >> 3) & 1)
|
93 | {
|
94 | accel_x_axis += 1;
|
95 | }
|
96 |
|
97 | if ((outbuf[5] >> 4) & 1)
|
98 | {
|
99 | accel_y_axis += 2;
|
100 | }
|
101 | if ((outbuf[5] >> 5) & 1)
|
102 | {
|
103 | accel_y_axis += 1;
|
104 | }
|
105 |
|
106 | if ((outbuf[5] >> 6) & 1)
|
107 | {
|
108 | accel_z_axis += 2;
|
109 | }
|
110 | if ((outbuf[5] >> 7) & 1)
|
111 | {
|
112 | accel_z_axis += 1;
|
113 | }
|
114 |
|
115 | Serial.print (joy_x_axis, DEC);
|
116 | Serial.print ("\t");
|
117 |
|
118 | Serial.print (joy_y_axis, DEC);
|
119 | Serial.print ("\t");
|
120 |
|
121 | Serial.print (accel_x_axis, DEC);
|
122 | Serial.print ("\t");
|
123 |
|
124 | Serial.print (accel_y_axis, DEC);
|
125 | Serial.print ("\t");
|
126 |
|
127 | Serial.print (accel_z_axis, DEC);
|
128 | Serial.print ("\t");
|
129 |
|
130 | Serial.print (z_button, DEC);
|
131 | Serial.print ("\t");
|
132 |
|
133 | Serial.print (c_button, DEC);
|
134 | Serial.print ("\t");
|
135 |
|
136 | Serial.print ("\r\n");
|
137 | }
|
138 |
|
139 | // Encode data to format that most wiimote drivers except
|
140 | // only needed if you use one of the regular wiimote drivers
|
141 | char
|
142 | nunchuk_decode_byte (char x)
|
143 | {
|
144 | x = (x ^ 0x17) + 0x17;
|
145 | return x;
|
146 | }
|