Dependencies:   N5110 mbed

Committer:
jordaahh
Date:
Sun Apr 12 13:46:53 2015 +0000
Revision:
3:11cbc2945fd7
Parent:
2:98a51d3c2e44
Child:
4:7350adf1d7ec
Cause object to move upwards, but leaves a trail. Need to get object to move in other directions and with no trail.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jordaahh 0:a28ad0db4228 1 /* Joystick
jordaahh 0:a28ad0db4228 2
jordaahh 0:a28ad0db4228 3 Example code of how to read a joystick
jordaahh 0:a28ad0db4228 4
jordaahh 0:a28ad0db4228 5 https://www.sparkfun.com/products/9032
jordaahh 0:a28ad0db4228 6
jordaahh 0:a28ad0db4228 7 Craig A. Evans
jordaahh 0:a28ad0db4228 8 7 March 2015
jordaahh 0:a28ad0db4228 9 */
jordaahh 0:a28ad0db4228 10
jordaahh 0:a28ad0db4228 11 #include "mbed.h"
jordaahh 1:3b741adc82ea 12 #include "N5110.h"
jordaahh 1:3b741adc82ea 13
jordaahh 0:a28ad0db4228 14 // change this to alter tolerance of joystick direction
jordaahh 0:a28ad0db4228 15 #define DIRECTION_TOLERANCE 0.05
jordaahh 0:a28ad0db4228 16
jordaahh 0:a28ad0db4228 17 // connections for joystick
jordaahh 0:a28ad0db4228 18 DigitalIn button(p15);
jordaahh 0:a28ad0db4228 19 AnalogIn xPot(p16);
jordaahh 0:a28ad0db4228 20 AnalogIn yPot(p17);
jordaahh 1:3b741adc82ea 21
jordaahh 1:3b741adc82ea 22 // LCD connections
jordaahh 1:3b741adc82ea 23 //vcc, sce, rst, dc, mosi, clk, led
jordaahh 1:3b741adc82ea 24 N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
jordaahh 1:3b741adc82ea 25
jordaahh 2:98a51d3c2e44 26 // LCD dimentions
jordaahh 2:98a51d3c2e44 27 int nx= 84; //screen is 84 pixels across
jordaahh 2:98a51d3c2e44 28 int ny= 48; // by 48 pixels downwards
jordaahh 2:98a51d3c2e44 29 int i;
jordaahh 2:98a51d3c2e44 30 int j;
jordaahh 2:98a51d3c2e44 31
jordaahh 3:11cbc2945fd7 32 // next generation statement
jordaahh 3:11cbc2945fd7 33 int temp[84][48]= {0};
jordaahh 3:11cbc2945fd7 34
jordaahh 1:3b741adc82ea 35 // Output to screen LED's (backlights)
jordaahh 1:3b741adc82ea 36 PwmOut PWM(p26);
jordaahh 1:3b741adc82ea 37
jordaahh 0:a28ad0db4228 38 // timer to regularly read the joystick
jordaahh 0:a28ad0db4228 39 Ticker pollJoystick;
jordaahh 0:a28ad0db4228 40 // Serial for debug
jordaahh 0:a28ad0db4228 41 Serial serial(USBTX,USBRX);
jordaahh 0:a28ad0db4228 42
jordaahh 0:a28ad0db4228 43 // create enumerated type (0,1,2,3 etc. for direction)
jordaahh 0:a28ad0db4228 44 // could be extended for diagonals etc.
jordaahh 0:a28ad0db4228 45 enum DirectionName {
jordaahh 0:a28ad0db4228 46 UP,
jordaahh 0:a28ad0db4228 47 DOWN,
jordaahh 0:a28ad0db4228 48 LEFT,
jordaahh 0:a28ad0db4228 49 RIGHT,
jordaahh 0:a28ad0db4228 50 CENTRE,
jordaahh 0:a28ad0db4228 51 UNKNOWN
jordaahh 0:a28ad0db4228 52 };
jordaahh 0:a28ad0db4228 53
jordaahh 0:a28ad0db4228 54 // struct for Joystick
jordaahh 0:a28ad0db4228 55 typedef struct JoyStick Joystick;
jordaahh 0:a28ad0db4228 56 struct JoyStick {
jordaahh 0:a28ad0db4228 57 float x; // current x value
jordaahh 0:a28ad0db4228 58 float x0; // 'centred' x value
jordaahh 0:a28ad0db4228 59 float y; // current y value
jordaahh 0:a28ad0db4228 60 float y0; // 'centred' y value
jordaahh 0:a28ad0db4228 61 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
jordaahh 0:a28ad0db4228 62 DirectionName direction; // current direction
jordaahh 0:a28ad0db4228 63 };
jordaahh 0:a28ad0db4228 64 // create struct variable
jordaahh 0:a28ad0db4228 65 Joystick joystick;
jordaahh 0:a28ad0db4228 66
jordaahh 0:a28ad0db4228 67 int printFlag = 0;
jordaahh 0:a28ad0db4228 68
jordaahh 0:a28ad0db4228 69 // function prototypes
jordaahh 0:a28ad0db4228 70 void calibrateJoystick();
jordaahh 0:a28ad0db4228 71 void updateJoystick();
jordaahh 3:11cbc2945fd7 72 void playerObject();
jordaahh 3:11cbc2945fd7 73 void clearCells();
jordaahh 3:11cbc2945fd7 74 void moveUp();
jordaahh 3:11cbc2945fd7 75 void getPixels();
jordaahh 3:11cbc2945fd7 76 void rules();
jordaahh 0:a28ad0db4228 77
jordaahh 0:a28ad0db4228 78 int main()
jordaahh 0:a28ad0db4228 79 {
jordaahh 1:3b741adc82ea 80 lcd.init();
jordaahh 3:11cbc2945fd7 81 playerObject();
jordaahh 0:a28ad0db4228 82 calibrateJoystick(); // get centred values of joystick
jordaahh 0:a28ad0db4228 83 pollJoystick.attach(&updateJoystick,1.0/10.0); // read joystick 10 times per second
jordaahh 0:a28ad0db4228 84
jordaahh 0:a28ad0db4228 85 while(1) {
jordaahh 0:a28ad0db4228 86
jordaahh 3:11cbc2945fd7 87 if (printFlag) { // if flag set, clear flag and implicate joystick functions
jordaahh 0:a28ad0db4228 88 printFlag = 0;
jordaahh 0:a28ad0db4228 89
jordaahh 0:a28ad0db4228 90 // check joystick direction
jordaahh 0:a28ad0db4228 91 if (joystick.direction == UP)
jordaahh 3:11cbc2945fd7 92 moveUp();
jordaahh 0:a28ad0db4228 93 if (joystick.direction == DOWN)
jordaahh 3:11cbc2945fd7 94 lcd.printString("DOWN",1,1);
jordaahh 0:a28ad0db4228 95 if (joystick.direction == LEFT)
jordaahh 0:a28ad0db4228 96 serial.printf(" LEFT\n");
jordaahh 0:a28ad0db4228 97 if (joystick.direction == RIGHT)
jordaahh 0:a28ad0db4228 98 serial.printf(" RIGHT\n");
jordaahh 0:a28ad0db4228 99 if (joystick.direction == CENTRE)
jordaahh 0:a28ad0db4228 100 serial.printf(" CENTRE\n");
jordaahh 0:a28ad0db4228 101 if (joystick.direction == UNKNOWN)
jordaahh 0:a28ad0db4228 102 serial.printf(" Unsupported direction\n");
jordaahh 0:a28ad0db4228 103
jordaahh 0:a28ad0db4228 104 }
jordaahh 0:a28ad0db4228 105 }
jordaahh 0:a28ad0db4228 106 }
jordaahh 0:a28ad0db4228 107
jordaahh 0:a28ad0db4228 108 // read default positions of the joystick to calibrate later readings
jordaahh 0:a28ad0db4228 109 void calibrateJoystick()
jordaahh 0:a28ad0db4228 110 {
jordaahh 0:a28ad0db4228 111 button.mode(PullDown);
jordaahh 0:a28ad0db4228 112 // must not move during calibration
jordaahh 0:a28ad0db4228 113 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
jordaahh 0:a28ad0db4228 114 joystick.y0 = yPot;
jordaahh 0:a28ad0db4228 115 }
jordaahh 0:a28ad0db4228 116 void updateJoystick()
jordaahh 0:a28ad0db4228 117 {
jordaahh 0:a28ad0db4228 118 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
jordaahh 0:a28ad0db4228 119 joystick.x = xPot - joystick.x0;
jordaahh 0:a28ad0db4228 120 joystick.y = yPot - joystick.y0;
jordaahh 0:a28ad0db4228 121 // read button state
jordaahh 0:a28ad0db4228 122 joystick.button = button;
jordaahh 0:a28ad0db4228 123
jordaahh 0:a28ad0db4228 124 // calculate direction depending on x,y values
jordaahh 0:a28ad0db4228 125 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
jordaahh 0:a28ad0db4228 126 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 127 joystick.direction = CENTRE;
jordaahh 0:a28ad0db4228 128 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 129 joystick.direction = UP;
jordaahh 0:a28ad0db4228 130 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 131 joystick.direction = DOWN;
jordaahh 0:a28ad0db4228 132 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 133 joystick.direction = RIGHT;
jordaahh 0:a28ad0db4228 134 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 135 joystick.direction = LEFT;
jordaahh 0:a28ad0db4228 136 } else {
jordaahh 0:a28ad0db4228 137 joystick.direction = UNKNOWN;
jordaahh 0:a28ad0db4228 138 }
jordaahh 0:a28ad0db4228 139
jordaahh 0:a28ad0db4228 140 // set flag for printing
jordaahh 0:a28ad0db4228 141 printFlag = 1;
jordaahh 3:11cbc2945fd7 142 }
jordaahh 3:11cbc2945fd7 143
jordaahh 3:11cbc2945fd7 144 // Displays small square at the bottom of the lcd screen
jordaahh 3:11cbc2945fd7 145 void playerObject()
jordaahh 3:11cbc2945fd7 146 {
jordaahh 3:11cbc2945fd7 147 lcd.setXYAddress(0,0);
jordaahh 3:11cbc2945fd7 148 for (int i=0; i<nx; i++) {
jordaahh 3:11cbc2945fd7 149 for (int j=0; j<ny; j++) {
jordaahh 3:11cbc2945fd7 150 lcd.setPixel(41,43);
jordaahh 3:11cbc2945fd7 151 lcd.setPixel(42,43);
jordaahh 3:11cbc2945fd7 152 lcd.setPixel(40,42);
jordaahh 3:11cbc2945fd7 153 lcd.setPixel(41,42);
jordaahh 3:11cbc2945fd7 154 lcd.setPixel(42,42);
jordaahh 3:11cbc2945fd7 155 lcd.setPixel(43,42);
jordaahh 3:11cbc2945fd7 156 lcd.setPixel(39,41);
jordaahh 3:11cbc2945fd7 157 lcd.setPixel(40,41);
jordaahh 3:11cbc2945fd7 158 lcd.setPixel(41,41);
jordaahh 3:11cbc2945fd7 159 lcd.setPixel(42,41);
jordaahh 3:11cbc2945fd7 160 lcd.setPixel(43,41);
jordaahh 3:11cbc2945fd7 161 lcd.setPixel(44,41);
jordaahh 3:11cbc2945fd7 162 lcd.setPixel(39,40);
jordaahh 3:11cbc2945fd7 163 lcd.setPixel(40,40);
jordaahh 3:11cbc2945fd7 164 lcd.setPixel(41,40);
jordaahh 3:11cbc2945fd7 165 lcd.setPixel(42,40);
jordaahh 3:11cbc2945fd7 166 lcd.setPixel(43,40);
jordaahh 3:11cbc2945fd7 167 lcd.setPixel(44,40);
jordaahh 3:11cbc2945fd7 168 lcd.setPixel(40,39);
jordaahh 3:11cbc2945fd7 169 lcd.setPixel(41,39);
jordaahh 3:11cbc2945fd7 170 lcd.setPixel(42,39);
jordaahh 3:11cbc2945fd7 171 lcd.setPixel(43,39);
jordaahh 3:11cbc2945fd7 172 lcd.setPixel(41,38);
jordaahh 3:11cbc2945fd7 173 lcd.setPixel(42,38);
jordaahh 3:11cbc2945fd7 174 lcd.refresh();
jordaahh 3:11cbc2945fd7 175 }
jordaahh 3:11cbc2945fd7 176 }
jordaahh 3:11cbc2945fd7 177 }
jordaahh 3:11cbc2945fd7 178
jordaahh 3:11cbc2945fd7 179 void clearCells() // turns all cells on the display off
jordaahh 3:11cbc2945fd7 180 {
jordaahh 3:11cbc2945fd7 181 // loop through cells, and clear
jordaahh 3:11cbc2945fd7 182 for (int i = 0; i < nx ; i++) {
jordaahh 3:11cbc2945fd7 183 for (int j = 0; j < ny ; j++) {
jordaahh 3:11cbc2945fd7 184 lcd.clearPixel(i,j);
jordaahh 3:11cbc2945fd7 185 }
jordaahh 3:11cbc2945fd7 186 }
jordaahh 3:11cbc2945fd7 187 lcd.refresh(); // must refresh to write buffer display
jordaahh 3:11cbc2945fd7 188
jordaahh 3:11cbc2945fd7 189 }
jordaahh 3:11cbc2945fd7 190
jordaahh 3:11cbc2945fd7 191 void getPixels() // selects pixels for each new generation
jordaahh 3:11cbc2945fd7 192 {
jordaahh 3:11cbc2945fd7 193 lcd.setXYAddress(0,0);
jordaahh 3:11cbc2945fd7 194 for(int i=1; i<nx-1; i++) {
jordaahh 3:11cbc2945fd7 195 for(int j=1; j<ny-1; j++) {
jordaahh 3:11cbc2945fd7 196 int n= 0;
jordaahh 3:11cbc2945fd7 197 if (lcd.getPixel(i-1,j-1))
jordaahh 3:11cbc2945fd7 198 n++;
jordaahh 3:11cbc2945fd7 199 if (lcd.getPixel(i-1,j))
jordaahh 3:11cbc2945fd7 200 n++;
jordaahh 3:11cbc2945fd7 201 if (lcd.getPixel(i-1,j+1))
jordaahh 3:11cbc2945fd7 202 n++;
jordaahh 3:11cbc2945fd7 203 if (lcd.getPixel(i,j-1))
jordaahh 3:11cbc2945fd7 204 n++;
jordaahh 3:11cbc2945fd7 205 if (lcd.getPixel(i+1,j-1))
jordaahh 3:11cbc2945fd7 206 n++;
jordaahh 3:11cbc2945fd7 207 if (lcd.getPixel(i+1,j))
jordaahh 3:11cbc2945fd7 208 n++;
jordaahh 3:11cbc2945fd7 209 if (lcd.getPixel(i+1,j+1))
jordaahh 3:11cbc2945fd7 210 n++;
jordaahh 3:11cbc2945fd7 211 if (lcd.getPixel(i,j+1))
jordaahh 3:11cbc2945fd7 212 n++;
jordaahh 3:11cbc2945fd7 213
jordaahh 3:11cbc2945fd7 214 if(n>3) { // if number of neighbours is less than 2 or more than 3 label pixel (i, j) as 'dead'
jordaahh 3:11cbc2945fd7 215 temp[i][j]=lcd.getPixel(i,j);
jordaahh 3:11cbc2945fd7 216 }
jordaahh 3:11cbc2945fd7 217 }
jordaahh 3:11cbc2945fd7 218 }
jordaahh 3:11cbc2945fd7 219 lcd.refresh();
jordaahh 3:11cbc2945fd7 220 }
jordaahh 3:11cbc2945fd7 221
jordaahh 3:11cbc2945fd7 222 void rules()// Places pixels for each new generation
jordaahh 3:11cbc2945fd7 223 {
jordaahh 3:11cbc2945fd7 224 lcd.setXYAddress(0,0); // set origin to (0,0)
jordaahh 3:11cbc2945fd7 225 for (int i=0; i<nx; i++) {
jordaahh 3:11cbc2945fd7 226 for(int j=0; j<ny; j++) {
jordaahh 3:11cbc2945fd7 227 if (temp[i][j]) { // if the cell is labelled as 'alive'
jordaahh 3:11cbc2945fd7 228 lcd.setPixel(i,j-1); // allow centre pixel to be on
jordaahh 3:11cbc2945fd7 229 lcd.clearPixel(i,j);
jordaahh 3:11cbc2945fd7 230 }
jordaahh 3:11cbc2945fd7 231 }
jordaahh 3:11cbc2945fd7 232 }
jordaahh 3:11cbc2945fd7 233 lcd.refresh();
jordaahh 3:11cbc2945fd7 234 }
jordaahh 3:11cbc2945fd7 235
jordaahh 3:11cbc2945fd7 236 void moveUp() // moves player object up
jordaahh 3:11cbc2945fd7 237 {
jordaahh 3:11cbc2945fd7 238 rules();
jordaahh 3:11cbc2945fd7 239 getPixels();
jordaahh 3:11cbc2945fd7 240 }
jordaahh 3:11cbc2945fd7 241