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:
Tue Jun 09 08:48:01 2015 +0000
Revision:
3:9091adbed369
Parent:
2:04fdd571a385
Child:
4:c9711f0cd097
Send nunchuk status by rfm69

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 3:9091adbed369 43 radio.initialize(FREQUENCY, NODE_ID, NETWORKID);
eisd 3:9091adbed369 44 radio.encrypt("0123456789054321");
eisd 2:04fdd571a385 45 //radio.promiscuous(false);
eisd 3:9091adbed369 46 radio.setHighPower(true);
eisd 3:9091adbed369 47 radio.setPowerLevel(20);
eisd 3:9091adbed369 48 radio.rcCalibration();
eisd 2:04fdd571a385 49 //radio.readAllRegs();
eisd 2:04fdd571a385 50 pc.printf("temp %d\r\n", radio.readTemperature(-1));
eisd 1:de8c34c9ccdf 51
eisd 3:9091adbed369 52 bool central = true;
eisd 2:04fdd571a385 53 nunchuk n;
eisd 1:de8c34c9ccdf 54 while(1) {
eisd 3:9091adbed369 55 bool read = nun.Read(&n.X, &n.Y, &n.aX, &n.aY, &n.aZ, &n.C, &n.Z);
eisd 1:de8c34c9ccdf 56 if(read)
eisd 1:de8c34c9ccdf 57 {
eisd 2:04fdd571a385 58 float x = n.X - 128, y = n.Y - 128;
eisd 3:9091adbed369 59 float R = x*x + y*y, p = atan2(y, x) * 4 / M_PI - 0.5;
eisd 1:de8c34c9ccdf 60 int c = 0;
eisd 3:9091adbed369 61 if (p > -4) c = 0;
eisd 3:9091adbed369 62 if (p > -3) c = 1;
eisd 3:9091adbed369 63 if (p > -2) c = 2;
eisd 3:9091adbed369 64 if (p > -1) c = 3;
eisd 3:9091adbed369 65 if (p > 0) c = 4;
eisd 3:9091adbed369 66 if (p > 1) c = 5;
eisd 3:9091adbed369 67 if (p > 2) c = 6;
eisd 3:9091adbed369 68 if (p > 3) c = 7;
eisd 1:de8c34c9ccdf 69
eisd 3:9091adbed369 70 #ifdef DEBUG
eisd 3:9091adbed369 71 pc.printf("x%3d y%3d c%1d z%1d --", n.X, n.Y, n.C, n.Z);
eisd 3:9091adbed369 72 pc.printf("x%d y%d z%d -- %.3f %s \r\n", n.aX, n.aY, n.aZ, R, directions[c]);
eisd 3:9091adbed369 73
eisd 3:9091adbed369 74 //radio.send(GATEWAY_ID, (const void*)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 50, false);
eisd 3:9091adbed369 75 #endif
eisd 3:9091adbed369 76 radio.send(GATEWAY_ID, (const void*)&n, sizeof(struct nunchuk), false);
eisd 3:9091adbed369 77
eisd 1:de8c34c9ccdf 78 #ifdef TARGET_KL25Z
eisd 3:9091adbed369 79 if (R < 20) {
eisd 3:9091adbed369 80 if (!central) {
eisd 3:9091adbed369 81 pc.printf("central\r\n");
eisd 3:9091adbed369 82 central = true;
eisd 3:9091adbed369 83 }
eisd 1:de8c34c9ccdf 84 r = 1.0f;
eisd 1:de8c34c9ccdf 85 g = 1.0f;
eisd 1:de8c34c9ccdf 86 b = 1.0f;
eisd 1:de8c34c9ccdf 87 } else {
eisd 3:9091adbed369 88 if (central) {
eisd 3:9091adbed369 89 pc.printf("go\r\n");
eisd 3:9091adbed369 90 central = false;
eisd 3:9091adbed369 91 }
eisd 3:9091adbed369 92 R = R/20000;
eisd 1:de8c34c9ccdf 93 float pal[8][3] = {
eisd 1:de8c34c9ccdf 94 { 0, 0, 1 },
eisd 1:de8c34c9ccdf 95 { 0, 1, 1 },
eisd 1:de8c34c9ccdf 96 { 0, 1, 0 },
eisd 1:de8c34c9ccdf 97 { 1, 1, 0 },
eisd 1:de8c34c9ccdf 98 { 1, 0.5, 0 },
eisd 1:de8c34c9ccdf 99 { 1, 0, 0 },
eisd 1:de8c34c9ccdf 100 { 1, 0, 1 },
eisd 1:de8c34c9ccdf 101 { 0.5, 0, 1 },
eisd 1:de8c34c9ccdf 102 };
eisd 1:de8c34c9ccdf 103 r = 1.0f - pal[c][0] * R;
eisd 1:de8c34c9ccdf 104 g = 1.0f - pal[c][1] * R;
eisd 1:de8c34c9ccdf 105 b = 1.0f - pal[c][2] * R;
eisd 1:de8c34c9ccdf 106 }
eisd 1:de8c34c9ccdf 107 #endif
eisd 1:de8c34c9ccdf 108 }
eisd 1:de8c34c9ccdf 109 else
eisd 1:de8c34c9ccdf 110 {
eisd 1:de8c34c9ccdf 111 pc.printf("Error\r\n");
eisd 3:9091adbed369 112 return 0;
eisd 1:de8c34c9ccdf 113 }
eisd 3:9091adbed369 114 wait(0.01);
eisd 1:de8c34c9ccdf 115 }
eisd 1:de8c34c9ccdf 116 }