![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Etch a Sketch on the uLCD screen with wheel encoders as the knobs.
Dependencies: 4DGL-uLCD-SE mbed
main.cpp@2:8752f5af08a4, 2017-03-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |