Etch a Sketch on the uLCD screen with wheel encoders as the knobs.

Dependencies:   4DGL-uLCD-SE mbed

Committer:
simplyellow
Date:
Tue Mar 14 07:21:49 2017 +0000
Revision:
2:8752f5af08a4
Parent:
1:876e9cc9088b
Final version of etch a sketch;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simplyellow 0:c1245c18d07e 1 #include "mbed.h"
simplyellow 2:8752f5af08a4 2 #include "uLCD_4DGL.h"
simplyellow 0:c1245c18d07e 3
simplyellow 2:8752f5af08a4 4 //left wheel parameters
simplyellow 1:876e9cc9088b 5 InterruptIn leftchA(p26);
simplyellow 1:876e9cc9088b 6 InterruptIn leftchB(p25);
simplyellow 1:876e9cc9088b 7 int leftChanA;
simplyellow 1:876e9cc9088b 8 int leftChanB;
simplyellow 1:876e9cc9088b 9 int leftCurrState;
simplyellow 1:876e9cc9088b 10 int leftPrevState;
simplyellow 1:876e9cc9088b 11 int leftChange;
simplyellow 2:8752f5af08a4 12 volatile int count1 = 0;
simplyellow 0:c1245c18d07e 13
simplyellow 2:8752f5af08a4 14 //right wheel parameters
simplyellow 1:876e9cc9088b 15 InterruptIn rightchA(p13);
simplyellow 1:876e9cc9088b 16 InterruptIn rightchB(p14);
simplyellow 1:876e9cc9088b 17 int rightChanA;
simplyellow 1:876e9cc9088b 18 int rightChanB;
simplyellow 1:876e9cc9088b 19 int rightCurrState;
simplyellow 1:876e9cc9088b 20 int rightPrevState;
simplyellow 1:876e9cc9088b 21 int rightChange;
simplyellow 1:876e9cc9088b 22 volatile int count2 = 0;
simplyellow 0:c1245c18d07e 23
simplyellow 2:8752f5af08a4 24 //etch a sketch cursor positions
simplyellow 2:8752f5af08a4 25 int x;
simplyellow 2:8752f5af08a4 26 int y;
simplyellow 2:8752f5af08a4 27 int oldx;
simplyellow 2:8752f5af08a4 28 int oldy;
simplyellow 2:8752f5af08a4 29
simplyellow 2:8752f5af08a4 30 uLCD_4DGL uLCD(p9,p10,p11);
simplyellow 2:8752f5af08a4 31
simplyellow 2:8752f5af08a4 32 //clearing screen control
simplyellow 2:8752f5af08a4 33 InterruptIn cls(p21);
simplyellow 2:8752f5af08a4 34 DigitalOut led1(LED1); //flashes to indicate clear
simplyellow 0:c1245c18d07e 35
simplyellow 2:8752f5af08a4 36 //drawing control
simplyellow 2:8752f5af08a4 37 InterruptIn pen(p22);
simplyellow 2:8752f5af08a4 38 bool capOn = true;
simplyellow 2:8752f5af08a4 39 DigitalOut led2(LED2); //on when drawing is turned off
simplyellow 2:8752f5af08a4 40
simplyellow 2:8752f5af08a4 41 //bluetooth color control
simplyellow 2:8752f5af08a4 42 Serial bluemod(p28, p27);
simplyellow 2:8752f5af08a4 43 int color = 0xFF0000; // default red
simplyellow 2:8752f5af08a4 44 volatile char bred = 0;
simplyellow 2:8752f5af08a4 45 volatile char bgreen = 0;
simplyellow 2:8752f5af08a4 46 volatile char bblue = 0;
simplyellow 2:8752f5af08a4 47 Ticker t;
simplyellow 2:8752f5af08a4 48
simplyellow 2:8752f5af08a4 49 //toothbrush motor vibrates during usage
simplyellow 2:8752f5af08a4 50 DigitalOut haptic(p20);
simplyellow 0:c1245c18d07e 51
simplyellow 0:c1245c18d07e 52 /*
simplyellow 2:8752f5af08a4 53 * example 01 <- 11
simplyellow 2:8752f5af08a4 54 * change = (11&01 = 01) ^ (01&10 = 00>>1) = 1
simplyellow 2:8752f5af08a4 55 * example 10 -> 00
simplyellow 2:8752f5af08a4 56 * change = (10&01 = 00) ^ (00&10 = 00>>1) = 0
simplyellow 2:8752f5af08a4 57 * Implemented barebones version of "QEI.h" by Aaron Berk for the sake of
simplyellow 2:8752f5af08a4 58 * understanding the concept of X4 encoding
simplyellow 2:8752f5af08a4 59 * 00 01 11 10 00
simplyellow 2:8752f5af08a4 60 * 4 different states
simplyellow 0:c1245c18d07e 61 */
simplyellow 0:c1245c18d07e 62
simplyellow 2:8752f5af08a4 63 /*
simplyellow 2:8752f5af08a4 64 * Calculate the number of pulses recorded by the left wheel
simplyellow 2:8752f5af08a4 65 */
simplyellow 1:876e9cc9088b 66 void encode1() {
simplyellow 1:876e9cc9088b 67 leftChange = 0;
simplyellow 1:876e9cc9088b 68 leftChanA = leftchA.read();
simplyellow 1:876e9cc9088b 69 leftChanB = leftchB.read();
simplyellow 1:876e9cc9088b 70 leftCurrState = (leftChanA << 1) | (leftChanB);
simplyellow 1:876e9cc9088b 71 if (((leftCurrState ^ leftPrevState) != 0x3) && (leftCurrState != leftPrevState)) {
simplyellow 1:876e9cc9088b 72 leftChange = (leftPrevState & 0x1) ^ ((leftCurrState & 0x2) >> 1);
simplyellow 1:876e9cc9088b 73 if (leftChange == 0) {
simplyellow 1:876e9cc9088b 74 leftChange = -1;
simplyellow 1:876e9cc9088b 75 }
simplyellow 1:876e9cc9088b 76 count1 += leftChange;
simplyellow 1:876e9cc9088b 77 }
simplyellow 1:876e9cc9088b 78 leftPrevState = leftCurrState;
simplyellow 1:876e9cc9088b 79 }
simplyellow 1:876e9cc9088b 80
simplyellow 2:8752f5af08a4 81 /*
simplyellow 2:8752f5af08a4 82 * Calculate the number of pulses recorded by the right wheel
simplyellow 2:8752f5af08a4 83 */
simplyellow 1:876e9cc9088b 84 void encode2() {
simplyellow 1:876e9cc9088b 85 rightChange = 0;
simplyellow 1:876e9cc9088b 86 rightChanA = rightchA.read();
simplyellow 1:876e9cc9088b 87 rightChanB = rightchB.read();
simplyellow 1:876e9cc9088b 88 rightCurrState = (rightChanA << 1) | (rightChanB);
simplyellow 1:876e9cc9088b 89 if (((rightCurrState ^ rightPrevState) != 0x3) && (rightCurrState != rightPrevState)) {
simplyellow 1:876e9cc9088b 90 rightChange = (rightPrevState & 0x1) ^ ((rightCurrState & 0x2) >> 1);
simplyellow 1:876e9cc9088b 91 if (rightChange == 0) {
simplyellow 1:876e9cc9088b 92 rightChange = -1;
simplyellow 0:c1245c18d07e 93 }
simplyellow 1:876e9cc9088b 94 count2 += rightChange;
simplyellow 0:c1245c18d07e 95 }
simplyellow 1:876e9cc9088b 96 rightPrevState = rightCurrState;
simplyellow 0:c1245c18d07e 97 }
simplyellow 1:876e9cc9088b 98
simplyellow 2:8752f5af08a4 99 /*
simplyellow 2:8752f5af08a4 100 * Clear the LCD screen with a pushbutton
simplyellow 2:8752f5af08a4 101 */
simplyellow 0:c1245c18d07e 102 void clear() {
simplyellow 2:8752f5af08a4 103 uLCD.cls();
simplyellow 2:8752f5af08a4 104 led1 = 1;
simplyellow 2:8752f5af08a4 105 wait(0.1);
simplyellow 2:8752f5af08a4 106 led1 = 0;
simplyellow 2:8752f5af08a4 107 wait(0.1);
simplyellow 2:8752f5af08a4 108 }
simplyellow 2:8752f5af08a4 109
simplyellow 2:8752f5af08a4 110 /*
simplyellow 2:8752f5af08a4 111 * Toggle the drawing on the LCD screen
simplyellow 2:8752f5af08a4 112 */
simplyellow 2:8752f5af08a4 113 void cap() {
simplyellow 2:8752f5af08a4 114 capOn = !capOn;
simplyellow 2:8752f5af08a4 115 if(!capOn) {
simplyellow 2:8752f5af08a4 116 led2 = 1;
simplyellow 2:8752f5af08a4 117 } else {
simplyellow 2:8752f5af08a4 118 led2 = 0;
simplyellow 2:8752f5af08a4 119 }
simplyellow 0:c1245c18d07e 120 }
simplyellow 0:c1245c18d07e 121
simplyellow 2:8752f5af08a4 122 /*
simplyellow 2:8752f5af08a4 123 * Change the color of the Etch A Sketch 'ink' using bluetooth input
simplyellow 2:8752f5af08a4 124 */
simplyellow 2:8752f5af08a4 125 void colorChange() {
simplyellow 2:8752f5af08a4 126 while(bluemod.readable()) {
simplyellow 2:8752f5af08a4 127 if(bluemod.getc()=='!') {
simplyellow 2:8752f5af08a4 128 if(bluemod.getc()=='C') {
simplyellow 2:8752f5af08a4 129 bred = bluemod.getc();
simplyellow 2:8752f5af08a4 130 bgreen = bluemod.getc();
simplyellow 2:8752f5af08a4 131 bblue = bluemod.getc();
simplyellow 2:8752f5af08a4 132 if (bluemod.getc()==char(~('!' + 'C' + bred + bgreen + bblue))) {
simplyellow 2:8752f5af08a4 133 color = (bred << 16 | bgreen << 8 | bblue);
simplyellow 2:8752f5af08a4 134 }
simplyellow 2:8752f5af08a4 135 }
simplyellow 2:8752f5af08a4 136 }
simplyellow 2:8752f5af08a4 137 }
simplyellow 2:8752f5af08a4 138 }
simplyellow 2:8752f5af08a4 139
simplyellow 2:8752f5af08a4 140 /*
simplyellow 2:8752f5af08a4 141 * Set up pull-ups, initial states, and interrupts on the two wheels and
simplyellow 2:8752f5af08a4 142 * hall sensors
simplyellow 2:8752f5af08a4 143 */
simplyellow 1:876e9cc9088b 144 void setupEncoder() {
simplyellow 1:876e9cc9088b 145 leftchA.mode(PullUp);
simplyellow 1:876e9cc9088b 146 leftchB.mode(PullUp);
simplyellow 1:876e9cc9088b 147 rightchA.mode(PullUp);
simplyellow 1:876e9cc9088b 148 rightchB.mode(PullUp);
simplyellow 1:876e9cc9088b 149
simplyellow 1:876e9cc9088b 150 leftChanA = leftchA.read();
simplyellow 1:876e9cc9088b 151 leftChanB = leftchB.read();
simplyellow 1:876e9cc9088b 152 rightChanA = rightchA.read();
simplyellow 1:876e9cc9088b 153 rightChanB = rightchB.read();
simplyellow 0:c1245c18d07e 154
simplyellow 1:876e9cc9088b 155 leftCurrState = (leftChanA << 1) | (leftChanB);
simplyellow 1:876e9cc9088b 156 leftPrevState = leftCurrState;
simplyellow 1:876e9cc9088b 157 rightCurrState = (rightChanA << 1) | (rightChanB);
simplyellow 1:876e9cc9088b 158 rightPrevState = rightCurrState;
simplyellow 0:c1245c18d07e 159
simplyellow 1:876e9cc9088b 160 leftchA.rise(&encode1);
simplyellow 1:876e9cc9088b 161 leftchA.fall(&encode1);
simplyellow 1:876e9cc9088b 162 leftchB.rise(&encode1);
simplyellow 1:876e9cc9088b 163 leftchB.fall(&encode1);
simplyellow 0:c1245c18d07e 164
simplyellow 1:876e9cc9088b 165 rightchA.rise(&encode2);
simplyellow 1:876e9cc9088b 166 rightchA.fall(&encode2);
simplyellow 1:876e9cc9088b 167 rightchB.rise(&encode2);
simplyellow 1:876e9cc9088b 168 rightchB.fall(&encode2);
simplyellow 1:876e9cc9088b 169 }
simplyellow 1:876e9cc9088b 170
simplyellow 1:876e9cc9088b 171 int main() {
simplyellow 2:8752f5af08a4 172 //set up features
simplyellow 1:876e9cc9088b 173 setupEncoder();
simplyellow 2:8752f5af08a4 174 cls.mode(PullUp);
simplyellow 2:8752f5af08a4 175 cls.fall(&clear);
simplyellow 2:8752f5af08a4 176 pen.mode(PullUp);
simplyellow 2:8752f5af08a4 177 pen.fall(&cap);
simplyellow 2:8752f5af08a4 178 t.attach(&colorChange, 0.0625);
simplyellow 2:8752f5af08a4 179
simplyellow 2:8752f5af08a4 180 //set up LCD
simplyellow 2:8752f5af08a4 181 uLCD.baudrate(300000);
simplyellow 2:8752f5af08a4 182 uLCD.background_color(BLACK);
simplyellow 2:8752f5af08a4 183 uLCD.cls();
simplyellow 2:8752f5af08a4 184
simplyellow 2:8752f5af08a4 185 //set up cursor positions
simplyellow 2:8752f5af08a4 186 //for the wheels, +/- counts of 1280 will get you to the edge of screen
simplyellow 2:8752f5af08a4 187 x = 64;
simplyellow 2:8752f5af08a4 188 y = 64;
simplyellow 2:8752f5af08a4 189 oldx = x;
simplyellow 2:8752f5af08a4 190 oldy = y;
simplyellow 2:8752f5af08a4 191 uLCD.pixel(x, y, color);
simplyellow 2:8752f5af08a4 192
simplyellow 0:c1245c18d07e 193 while(1) {
simplyellow 2:8752f5af08a4 194 //converting counts to LCD coordinates
simplyellow 2:8752f5af08a4 195 oldx = x;
simplyellow 2:8752f5af08a4 196 oldy = y;
simplyellow 2:8752f5af08a4 197 x = 64+count1/20;
simplyellow 2:8752f5af08a4 198 y = 64+count2/20;
simplyellow 2:8752f5af08a4 199 //if cursor moves, motor vibrates
simplyellow 2:8752f5af08a4 200 if(x!=oldx || y!=oldy) {
simplyellow 2:8752f5af08a4 201 haptic = 1;
simplyellow 2:8752f5af08a4 202 wait(0.05);
simplyellow 2:8752f5af08a4 203 } else {
simplyellow 2:8752f5af08a4 204 haptic = 0;
simplyellow 2:8752f5af08a4 205 }
simplyellow 2:8752f5af08a4 206 //if pen is activated, draw is
simplyellow 2:8752f5af08a4 207 if(capOn) {
simplyellow 2:8752f5af08a4 208 uLCD.pixel(x, y, color);
simplyellow 2:8752f5af08a4 209 }
simplyellow 0:c1245c18d07e 210 }
simplyellow 0:c1245c18d07e 211 }