Wii Nunchuk via RFM69HW to Duplo 9203 Remote Control Car Kit using ARM mbed on a FRDM-KL25Z

Dependencies:   CRC FastPWM RFM69 USBDevice WakeUp WiiChuk_compat mbed-rtos mbed tlc59108

Fork of wiiNunchuk_compat by Greg Brush

Committer:
eisd
Date:
Fri Jun 19 13:05:57 2015 +0000
Revision:
4:c9711f0cd097
Parent:
3:9091adbed369
Child:
5:7af5760d7e8f
Rudimentary chuck receiver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gbrush 0:7c98bcd8a245 1 #include "mbed.h"
eisd 1:de8c34c9ccdf 2 #ifndef M_PI
eisd 1:de8c34c9ccdf 3 #define M_PI 3.14159265358979323846
eisd 1:de8c34c9ccdf 4 #endif
eisd 1:de8c34c9ccdf 5
eisd 1:de8c34c9ccdf 6 #include "WiiChuk_compat.hpp"
gbrush 0:7c98bcd8a245 7
eisd 2:04fdd571a385 8 //#include "USBSerial.h"
eisd 2:04fdd571a385 9
eisd 2:04fdd571a385 10 #include "RFM69.h"
eisd 2:04fdd571a385 11 #define GATEWAY_ID 2
eisd 2:04fdd571a385 12 #define NODE_ID 1
eisd 2:04fdd571a385 13 #define NETWORKID 100
gbrush 0:7c98bcd8a245 14
eisd 2:04fdd571a385 15 // Uncomment only one of the following three to match radio frequency
eisd 2:04fdd571a385 16 //#define FREQUENCY RF69_433MHZ
eisd 2:04fdd571a385 17 #define FREQUENCY RF69_868MHZ
eisd 2:04fdd571a385 18 //#define FREQUENCY RF69_915MHZ
eisd 2:04fdd571a385 19
eisd 3:9091adbed369 20 const char *directions[8] = { "XR", "RR", "RX", "FR", "FX", "FF", "XF", "RF" };
eisd 3:9091adbed369 21
eisd 2:04fdd571a385 22 #ifndef USBSerial
eisd 2:04fdd571a385 23 Serial pc(USBTX, USBRX);
eisd 1:de8c34c9ccdf 24 #endif
gbrush 0:7c98bcd8a245 25 int main() {
eisd 1:de8c34c9ccdf 26 #ifndef USBSerial
eisd 1:de8c34c9ccdf 27 pc.baud(115200);
eisd 1:de8c34c9ccdf 28 #endif
gbrush 0:7c98bcd8a245 29
eisd 2:04fdd571a385 30 #ifdef TARGET_KL25Z
eisd 2:04fdd571a385 31 PwmOut r(LED_RED);
eisd 2:04fdd571a385 32 r = 1.0f;
eisd 2:04fdd571a385 33 PwmOut g(LED_GREEN);
eisd 2:04fdd571a385 34 g = 1.0f;
eisd 2:04fdd571a385 35 PwmOut b(LED_BLUE);
eisd 2:04fdd571a385 36 b = 1.0f;
eisd 3:9091adbed369 37 WiiChuck nun(PTE0, PTE1, pc);
eisd 2:04fdd571a385 38 RFM69 radio(PTD2, PTD3, PTC5, PTD0, PTA13);
eisd 2:04fdd571a385 39 #else
eisd 2:04fdd571a385 40 WiiChuck nun(p9, p10, pc);
eisd 2:04fdd571a385 41 #endif
eisd 2:04fdd571a385 42
eisd 4:c9711f0cd097 43 nunchuk n;
eisd 4:c9711f0cd097 44 bool sender = nun.Read(&n.X, &n.Y, &n.aX, &n.aY, &n.aZ, &n.C, &n.Z);
eisd 4:c9711f0cd097 45 if (sender) {
eisd 4:c9711f0cd097 46 pc.printf("chuck attached\r\n");
eisd 4:c9711f0cd097 47 radio.initialize(FREQUENCY, NODE_ID, NETWORKID);
eisd 4:c9711f0cd097 48 } else {
eisd 4:c9711f0cd097 49 pc.printf("chuck unavailable\r\n");
eisd 4:c9711f0cd097 50 radio.initialize(FREQUENCY, GATEWAY_ID, NETWORKID);
eisd 4:c9711f0cd097 51 }
eisd 3:9091adbed369 52 radio.encrypt("0123456789054321");
eisd 2:04fdd571a385 53 //radio.promiscuous(false);
eisd 3:9091adbed369 54 radio.setHighPower(true);
eisd 3:9091adbed369 55 radio.setPowerLevel(20);
eisd 3:9091adbed369 56 radio.rcCalibration();
eisd 2:04fdd571a385 57 //radio.readAllRegs();
eisd 2:04fdd571a385 58 pc.printf("temp %d\r\n", radio.readTemperature(-1));
eisd 1:de8c34c9ccdf 59
eisd 4:c9711f0cd097 60 bool read, central = true;
eisd 1:de8c34c9ccdf 61 while(1) {
eisd 4:c9711f0cd097 62 if (sender)
eisd 4:c9711f0cd097 63 read = nun.Read(&n.X, &n.Y, &n.aX, &n.aY, &n.aZ, &n.C, &n.Z);
eisd 4:c9711f0cd097 64 else {
eisd 4:c9711f0cd097 65 radio.receive();
eisd 4:c9711f0cd097 66 printf("len %d\r\n", radio.DATALEN);
eisd 4:c9711f0cd097 67 read = (radio.DATALEN == sizeof(struct nunchuk));
eisd 4:c9711f0cd097 68 if (read)
eisd 4:c9711f0cd097 69 memcpy((void*)&n, (const void*)radio.DATA, radio.DATALEN);
eisd 4:c9711f0cd097 70 }
eisd 1:de8c34c9ccdf 71 if(read)
eisd 1:de8c34c9ccdf 72 {
eisd 2:04fdd571a385 73 float x = n.X - 128, y = n.Y - 128;
eisd 3:9091adbed369 74 float R = x*x + y*y, p = atan2(y, x) * 4 / M_PI - 0.5;
eisd 1:de8c34c9ccdf 75 int c = 0;
eisd 3:9091adbed369 76 if (p > -4) c = 0;
eisd 3:9091adbed369 77 if (p > -3) c = 1;
eisd 3:9091adbed369 78 if (p > -2) c = 2;
eisd 3:9091adbed369 79 if (p > -1) c = 3;
eisd 3:9091adbed369 80 if (p > 0) c = 4;
eisd 3:9091adbed369 81 if (p > 1) c = 5;
eisd 3:9091adbed369 82 if (p > 2) c = 6;
eisd 3:9091adbed369 83 if (p > 3) c = 7;
eisd 1:de8c34c9ccdf 84
eisd 3:9091adbed369 85 #ifdef DEBUG
eisd 3:9091adbed369 86 pc.printf("x%3d y%3d c%1d z%1d --", n.X, n.Y, n.C, n.Z);
eisd 3:9091adbed369 87 pc.printf("x%d y%d z%d -- %.3f %s \r\n", n.aX, n.aY, n.aZ, R, directions[c]);
eisd 3:9091adbed369 88
eisd 3:9091adbed369 89 //radio.send(GATEWAY_ID, (const void*)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 50, false);
eisd 3:9091adbed369 90 #endif
eisd 4:c9711f0cd097 91 if (sender)
eisd 4:c9711f0cd097 92 radio.send(GATEWAY_ID, (const void*)&n, sizeof(struct nunchuk), false);
eisd 3:9091adbed369 93
eisd 1:de8c34c9ccdf 94 #ifdef TARGET_KL25Z
eisd 3:9091adbed369 95 if (R < 20) {
eisd 3:9091adbed369 96 if (!central) {
eisd 3:9091adbed369 97 pc.printf("central\r\n");
eisd 3:9091adbed369 98 central = true;
eisd 3:9091adbed369 99 }
eisd 1:de8c34c9ccdf 100 r = 1.0f;
eisd 1:de8c34c9ccdf 101 g = 1.0f;
eisd 1:de8c34c9ccdf 102 b = 1.0f;
eisd 1:de8c34c9ccdf 103 } else {
eisd 3:9091adbed369 104 if (central) {
eisd 3:9091adbed369 105 pc.printf("go\r\n");
eisd 3:9091adbed369 106 central = false;
eisd 3:9091adbed369 107 }
eisd 3:9091adbed369 108 R = R/20000;
eisd 1:de8c34c9ccdf 109 float pal[8][3] = {
eisd 1:de8c34c9ccdf 110 { 0, 0, 1 },
eisd 1:de8c34c9ccdf 111 { 0, 1, 1 },
eisd 1:de8c34c9ccdf 112 { 0, 1, 0 },
eisd 1:de8c34c9ccdf 113 { 1, 1, 0 },
eisd 1:de8c34c9ccdf 114 { 1, 0.5, 0 },
eisd 1:de8c34c9ccdf 115 { 1, 0, 0 },
eisd 1:de8c34c9ccdf 116 { 1, 0, 1 },
eisd 1:de8c34c9ccdf 117 { 0.5, 0, 1 },
eisd 1:de8c34c9ccdf 118 };
eisd 1:de8c34c9ccdf 119 r = 1.0f - pal[c][0] * R;
eisd 1:de8c34c9ccdf 120 g = 1.0f - pal[c][1] * R;
eisd 1:de8c34c9ccdf 121 b = 1.0f - pal[c][2] * R;
eisd 1:de8c34c9ccdf 122 }
eisd 1:de8c34c9ccdf 123 #endif
eisd 1:de8c34c9ccdf 124 }
eisd 4:c9711f0cd097 125 else if (sender)
eisd 1:de8c34c9ccdf 126 {
eisd 1:de8c34c9ccdf 127 pc.printf("Error\r\n");
eisd 3:9091adbed369 128 return 0;
eisd 1:de8c34c9ccdf 129 }
eisd 4:c9711f0cd097 130 if (sender)
eisd 4:c9711f0cd097 131 wait(0.01);
eisd 1:de8c34c9ccdf 132 }
eisd 1:de8c34c9ccdf 133 }