Mynput: Game controller for Color Quest.

Dependencies:   Adafruit_NeoPixel MMA8451Q PinDetect_KL25Z USBDevice mbed

Fork of idd_hw3 by IDD HW3

Committer:
bkim54
Date:
Sat Sep 19 01:11:12 2015 +0000
Revision:
4:0527cd963c14
Parent:
3:888c255f87a7
Child:
5:f547509e5583
put in chest LED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bkim54 0:d307eb0be182 1 #include "mbed.h"
bkim54 0:d307eb0be182 2 #include "MMA8451Q.h"
bkim54 0:d307eb0be182 3 #include "Timer.h"
bkim54 1:1f45953fccf9 4 #include "USBKeyboard.h"
bkim54 1:1f45953fccf9 5 #include "PinDetect.h"
bkim54 3:888c255f87a7 6 #include "PololuLedStrip.h"
bkim54 0:d307eb0be182 7
bkim54 0:d307eb0be182 8 // define I2C Pins and address for KL25Z. Taken from default sample code.
bkim54 0:d307eb0be182 9 PinName const SDA = PTE25;
bkim54 0:d307eb0be182 10 PinName const SCL = PTE24;
bkim54 0:d307eb0be182 11 Timer timer;
bkim54 0:d307eb0be182 12 int timer_begin;
bkim54 3:888c255f87a7 13
bkim54 4:0527cd963c14 14 #define WRIST_LED_COUNT 16
bkim54 4:0527cd963c14 15 #define CHEST_LED_COUNT 24
bkim54 0:d307eb0be182 16 #define MMA8451_I2C_ADDRESS (0x1d<<1)
bkim54 0:d307eb0be182 17
bkim54 1:1f45953fccf9 18 #define LEAN_LEFT_THRESH -0.4
bkim54 1:1f45953fccf9 19 #define LEAN_RIGHT_THRESH 0.4
bkim54 4:0527cd963c14 20 #define LEAN_BACK_THRESH 0.5
bkim54 1:1f45953fccf9 21 #define JUMP_THRESH 0.4
bkim54 4:0527cd963c14 22 #define LASER_THRESH 0.4
bkim54 4:0527cd963c14 23 #define SHIELD_THRESH 0.41
bkim54 1:1f45953fccf9 24 const char LEFT = 'A';
bkim54 1:1f45953fccf9 25 const char RIGHT = 'D';
bkim54 1:1f45953fccf9 26 const char LASER = 'J';
bkim54 1:1f45953fccf9 27 const char SHIELD = 'K';
bkim54 1:1f45953fccf9 28 const char SLOW = 'L';
bkim54 1:1f45953fccf9 29 const char ENTER = '\n';
bkim54 1:1f45953fccf9 30 const char SPACE = ' ';
bkim54 0:d307eb0be182 31
bkim54 0:d307eb0be182 32 //serial connection to PC via USB
bkim54 0:d307eb0be182 33 Serial pc(USBTX, USBRX);
bkim54 0:d307eb0be182 34
bkim54 3:888c255f87a7 35 PololuLedStrip wristLedStrip(D6);
bkim54 3:888c255f87a7 36 PololuLedStrip chestLedStrip(D7);
bkim54 3:888c255f87a7 37
bkim54 4:0527cd963c14 38 //rgb_color colors[WRIST_LED_COUNT];
bkim54 3:888c255f87a7 39
bkim54 1:1f45953fccf9 40 USBKeyboard keyboard;
bkim54 2:bab0105de714 41 AnalogIn rightArm(A0);
bkim54 1:1f45953fccf9 42 AnalogIn wrist(A2);
bkim54 1:1f45953fccf9 43 PinDetect on_off(D15);
bkim54 1:1f45953fccf9 44 bool on = false;
bkim54 1:1f45953fccf9 45
bkim54 1:1f45953fccf9 46
bkim54 1:1f45953fccf9 47 void on_off_pressed() {
bkim54 1:1f45953fccf9 48 on = !on;
bkim54 1:1f45953fccf9 49 }
bkim54 3:888c255f87a7 50
bkim54 3:888c255f87a7 51 rgb_color getColor( char color, int intensity ) {
bkim54 3:888c255f87a7 52 rgb_color pixelColor;
bkim54 3:888c255f87a7 53 switch (color) {
bkim54 3:888c255f87a7 54 case 'r':
bkim54 3:888c255f87a7 55 pixelColor = (rgb_color){ intensity, 0, 0 };
bkim54 3:888c255f87a7 56 break;
bkim54 3:888c255f87a7 57 case 'g':
bkim54 3:888c255f87a7 58 pixelColor = (rgb_color){ 0, intensity, 0 };
bkim54 3:888c255f87a7 59 break;
bkim54 3:888c255f87a7 60 case 'b':
bkim54 3:888c255f87a7 61 pixelColor = (rgb_color){ 0, 0, intensity };
bkim54 3:888c255f87a7 62 break;
bkim54 3:888c255f87a7 63 case 'w':
bkim54 3:888c255f87a7 64 pixelColor = (rgb_color){ intensity, intensity, intensity};
bkim54 3:888c255f87a7 65 break;
bkim54 3:888c255f87a7 66 default:
bkim54 3:888c255f87a7 67 pixelColor = (rgb_color){ 0, 0 , intensity };
bkim54 3:888c255f87a7 68 break;
bkim54 3:888c255f87a7 69 }
bkim54 3:888c255f87a7 70 return pixelColor;
bkim54 3:888c255f87a7 71 }
bkim54 4:0527cd963c14 72 /*
bkim54 3:888c255f87a7 73 void cleanRing() {
bkim54 3:888c255f87a7 74 for(uint32_t i = 0; i < LED_COUNT; i++) {
bkim54 3:888c255f87a7 75 colors[i] = (rgb_color){ 0, 0, 0 };
bkim54 3:888c255f87a7 76 }
bkim54 3:888c255f87a7 77 wristLedStrip.write(colors, LED_COUNT);
bkim54 3:888c255f87a7 78 }
bkim54 4:0527cd963c14 79 */
bkim54 3:888c255f87a7 80
bkim54 4:0527cd963c14 81 void pulse(char color, PololuLedStrip led, int led_count) {
bkim54 4:0527cd963c14 82 rgb_color colors[led_count];
bkim54 3:888c255f87a7 83 // Update the colors array.
bkim54 3:888c255f87a7 84 for( int j = 0; j < 255; j++) {
bkim54 4:0527cd963c14 85 for( uint32_t i = 0; i < led_count; i++ ) {
bkim54 3:888c255f87a7 86 colors[i] = getColor(color, j);
bkim54 3:888c255f87a7 87 }
bkim54 4:0527cd963c14 88 led.write(colors, led_count);
bkim54 3:888c255f87a7 89 }
bkim54 3:888c255f87a7 90 //wait_ms(100);
bkim54 3:888c255f87a7 91 }
bkim54 3:888c255f87a7 92
bkim54 0:d307eb0be182 93 int main(void)
bkim54 0:d307eb0be182 94 {
bkim54 0:d307eb0be182 95 //configure on-board I2C accelerometer on KL25Z
bkim54 0:d307eb0be182 96 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
bkim54 0:d307eb0be182 97 //map read acceleration to PWM output on red status LED
bkim54 0:d307eb0be182 98 PwmOut rled(LED_RED);
bkim54 1:1f45953fccf9 99 float x,y,z;
bkim54 1:1f45953fccf9 100
bkim54 1:1f45953fccf9 101 on_off.attach_asserted(&on_off_pressed);
bkim54 1:1f45953fccf9 102 on_off.setAssertValue(0); //pins are PullUp, so there activelow buttons.
bkim54 1:1f45953fccf9 103 on_off.setSampleFrequency(); // Defaults to 20ms.
bkim54 1:1f45953fccf9 104
bkim54 0:d307eb0be182 105 timer.start();
bkim54 0:d307eb0be182 106 timer_begin = timer.read_ms();
bkim54 2:bab0105de714 107 pc.printf("helllo\n");
bkim54 3:888c255f87a7 108 //pulse();
bkim54 0:d307eb0be182 109 while (true) {
bkim54 1:1f45953fccf9 110 if (on) {
bkim54 1:1f45953fccf9 111 x = acc.getAccX();
bkim54 1:1f45953fccf9 112 y = acc.getAccY();
bkim54 1:1f45953fccf9 113 z = acc.getAccZ();
bkim54 1:1f45953fccf9 114
bkim54 4:0527cd963c14 115 if ( x > LEAN_RIGHT_THRESH ) {
bkim54 1:1f45953fccf9 116 pc.printf("Lean right\n");
bkim54 1:1f45953fccf9 117 keyboard.putc(RIGHT);
bkim54 4:0527cd963c14 118 } else if (x < LEAN_LEFT_THRESH) {
bkim54 1:1f45953fccf9 119 pc.printf("Lean left\n");
bkim54 1:1f45953fccf9 120 keyboard.putc(LEFT);
bkim54 1:1f45953fccf9 121 }
bkim54 1:1f45953fccf9 122
bkim54 4:0527cd963c14 123 if( y < JUMP_THRESH && timer.read_ms() - timer_begin > 300 ) {
bkim54 1:1f45953fccf9 124 timer_begin = timer.read_ms();
bkim54 1:1f45953fccf9 125 pc.printf("Jump\n");
bkim54 1:1f45953fccf9 126 keyboard.putc(ENTER);
bkim54 1:1f45953fccf9 127 keyboard.putc(SPACE);
bkim54 1:1f45953fccf9 128 }
bkim54 4:0527cd963c14 129 if(wrist.read() < LASER_THRESH) {
bkim54 2:bab0105de714 130 pc.printf("Shoot\n");
bkim54 1:1f45953fccf9 131 keyboard.putc(LASER);
bkim54 4:0527cd963c14 132 pulse('r', wristLedStrip, WRIST_LED_COUNT);
bkim54 4:0527cd963c14 133 pulse('r', chestLedStrip, CHEST_LED_COUNT);
bkim54 3:888c255f87a7 134 }
bkim54 4:0527cd963c14 135 else if(rightArm.read() < SHIELD_THRESH) {
bkim54 1:1f45953fccf9 136 pc.printf("Shield\n");
bkim54 1:1f45953fccf9 137 keyboard.putc(SHIELD);
bkim54 4:0527cd963c14 138 pulse('g', wristLedStrip, WRIST_LED_COUNT);
bkim54 4:0527cd963c14 139 pulse('g', chestLedStrip, CHEST_LED_COUNT);
bkim54 3:888c255f87a7 140 }
bkim54 4:0527cd963c14 141 else if ( z > LEAN_BACK_THRESH) {
bkim54 3:888c255f87a7 142 pc.printf("Leaning back\n");
bkim54 3:888c255f87a7 143 keyboard.putc(SLOW);
bkim54 4:0527cd963c14 144 pulse('b', wristLedStrip, WRIST_LED_COUNT);
bkim54 4:0527cd963c14 145 pulse('b', chestLedStrip, CHEST_LED_COUNT);
bkim54 3:888c255f87a7 146 } else{
bkim54 4:0527cd963c14 147 pulse('w', wristLedStrip, WRIST_LED_COUNT);
bkim54 4:0527cd963c14 148 pulse('w', chestLedStrip, CHEST_LED_COUNT);
bkim54 1:1f45953fccf9 149 }
bkim54 0:d307eb0be182 150 }
bkim54 0:d307eb0be182 151 }
bkim54 0:d307eb0be182 152 }