Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@26:bf432a28d0c6, 2019-05-13 (annotated)
- Committer:
- fbd38
- Date:
- Mon May 13 08:42:21 2019 +0000
- Revision:
- 26:bf432a28d0c6
- Parent:
- 25:3d3ebfd0a73f
CreaLaser 01, pour philippe
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fbd38 | 16:8ae70f0b8fca | 1 | /* |
fbd38 | 26:bf432a28d0c6 | 2 | * CreaLASER program |
fbd38 | 16:8ae70f0b8fca | 3 | * |
fbd38 | 26:bf432a28d0c6 | 4 | * Version 1.0, Fevrier 11, 2019 |
fbd38 | 26:bf432a28d0c6 | 5 | * for Nucleo32: F303 |
fbd38 | 25:3d3ebfd0a73f | 6 | * |
fbd38 | 16:8ae70f0b8fca | 7 | */ |
fbd38 | 25:3d3ebfd0a73f | 8 | |
fbd38 | 25:3d3ebfd0a73f | 9 | #define DEBUG_MODE 3 // 0= no Debug, 1 = BT only, 2 = PC only, 3 = BT + PC |
garphil | 14:839ab5f50d40 | 10 | #include "Crealab.h" |
garphil | 12:60c531df03fd | 11 | Serial bt_uart(PA_9, PA_10); |
garphil | 17:04c9b524dd94 | 12 | Serial pc_uart(USBTX, USBRX); |
fbd38 | 16:8ae70f0b8fca | 13 | |
garphil | 20:cdbc31a89c7f | 14 | // ---------------- Local global variables -------------- |
fbd38 | 26:bf432a28d0c6 | 15 | char ExecCommand; // Command to be execute |
fbd38 | 26:bf432a28d0c6 | 16 | float AbsolutePosLaser = 0; |
fbd38 | 26:bf432a28d0c6 | 17 | float AbsolutePosPrisme = 0; |
fbd38 | 26:bf432a28d0c6 | 18 | float RelativePosLaser = 0; |
fbd38 | 26:bf432a28d0c6 | 19 | float RelativePosPrisme = 0; |
fbd38 | 26:bf432a28d0c6 | 20 | float ZeroPosLaser = 0; |
fbd38 | 26:bf432a28d0c6 | 21 | float ZeroPosPrisme = 0; |
fbd38 | 26:bf432a28d0c6 | 22 | // Virtual target in the Upper Corner |
fbd38 | 26:bf432a28d0c6 | 23 | float TargetPosLaser = 37; |
fbd38 | 26:bf432a28d0c6 | 24 | float TargetPosPrisme = -14.0; |
garphil | 2:050f12806bc5 | 25 | // ---------------- PIN DEFINITIONS --------------------- |
fbd38 | 26:bf432a28d0c6 | 26 | DigitalOut myled(LED1); // Blinking LED |
fbd38 | 26:bf432a28d0c6 | 27 | // --- Define the Servos |
fbd38 | 26:bf432a28d0c6 | 28 | AsyncServo LaserGun(PA_11); |
fbd38 | 26:bf432a28d0c6 | 29 | AsyncServo Prisme(PA_8); |
fbd38 | 26:bf432a28d0c6 | 30 | DigitalIn FireButton(PB_5, PullUp); |
fbd38 | 26:bf432a28d0c6 | 31 | // --- Define the Laser beam |
fbd38 | 26:bf432a28d0c6 | 32 | PwmOut LaserLED(PA_12); |
fbd38 | 26:bf432a28d0c6 | 33 | #define DEFAULT_LASER 0.2 |
fbd38 | 26:bf432a28d0c6 | 34 | DigitalIn PhotoDiode(PA_1); |
fbd38 | 26:bf432a28d0c6 | 35 | // ---------------- Musics -------------- |
fbd38 | 26:bf432a28d0c6 | 36 | // Music song_greensleaves("Greensleaves:d=4,o=5,b=140:g,2a#,c6,d.6,8d#6,d6,2c6,a,f.,8g,a,2a#,g,g.,8f,g,2a,f,2d,g,2a#,c6,d.6,8e6,d6,2c6,a,f.,8g,a,a#.,8a,g,f#.,8e,f#,2g"); |
fbd38 | 26:bf432a28d0c6 | 37 | // Music song_lightmyfire("LightMyFire:d=4,o=5,b=140:8b,16g,16a,8b,8d6,8c6,8b,8a,8g,8a,16f,16a,8c6,8f6,16d6,16c6,16a#,16g,8g#,8g,8g#,16g,16a,8b,8c#6,16b,16a,16g,16f,8e,8f,1a,a"); |
fbd38 | 26:bf432a28d0c6 | 38 | // Music song_xfile("Xfiles:d=4,o=5,b=140:e,b,a,b,d6,2b."); |
fbd38 | 26:bf432a28d0c6 | 39 | // PIN for the Buzzer |
fbd38 | 26:bf432a28d0c6 | 40 | // Buzzer buzzer(PB_0); |
fbd38 | 26:bf432a28d0c6 | 41 | // Note la("A#4",50); //the sound |
fbd38 | 26:bf432a28d0c6 | 42 | |
fbd38 | 26:bf432a28d0c6 | 43 | //--- SPI Multiplexed Display |
fbd38 | 26:bf432a28d0c6 | 44 | SPI Display(PA_7, NC, PA_5); // 8 digit 7 Segment Serial Multiplexed DISPLAY using SPI |
fbd38 | 26:bf432a28d0c6 | 45 | //------------------------------------------------------------- |
fbd38 | 26:bf432a28d0c6 | 46 | |
fbd38 | 26:bf432a28d0c6 | 47 | // --- Define the display and the Messages |
fbd38 | 26:bf432a28d0c6 | 48 | Ticker DisplayTimer; // Display is managed by Timer IT |
fbd38 | 26:bf432a28d0c6 | 49 | volatile int DisplayDate[8] = {2, 0, 1, 9, 0, 2, 1, 2 }; // Default Date |
fbd38 | 26:bf432a28d0c6 | 50 | volatile int DisplayIndex = 0; // Index for Display |
fbd38 | 26:bf432a28d0c6 | 51 | volatile int DisplayBlink = 0; // Display Blinking |
fbd38 | 26:bf432a28d0c6 | 52 | volatile int DisplayDot5 = 1; // Display Dot on time |
fbd38 | 26:bf432a28d0c6 | 53 | #define DISPLAY_US 500 |
fbd38 | 26:bf432a28d0c6 | 54 | int BlinkHalfPeriod_us = 200000/DISPLAY_US; // Blinking Period is us |
fbd38 | 26:bf432a28d0c6 | 55 | int BlinkIndex = 0; |
fbd38 | 26:bf432a28d0c6 | 56 | |
fbd38 | 26:bf432a28d0c6 | 57 | // --- Clear Display |
fbd38 | 26:bf432a28d0c6 | 58 | void ClearDisplay() |
fbd38 | 26:bf432a28d0c6 | 59 | { |
fbd38 | 26:bf432a28d0c6 | 60 | Display.write(0x0000); |
fbd38 | 26:bf432a28d0c6 | 61 | } |
fbd38 | 26:bf432a28d0c6 | 62 | |
fbd38 | 26:bf432a28d0c6 | 63 | // --- Write one digit at one location |
fbd38 | 26:bf432a28d0c6 | 64 | void DigitDisplay(uint32_t val, uint32_t dot, uint32_t digit) |
fbd38 | 26:bf432a28d0c6 | 65 | { |
fbd38 | 26:bf432a28d0c6 | 66 | const uint32_t SevenSeg[26] = { |
fbd38 | 26:bf432a28d0c6 | 67 | // dp, G, F, E, D, C, B, A |
fbd38 | 26:bf432a28d0c6 | 68 | //0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 (negative logic) |
fbd38 | 26:bf432a28d0c6 | 69 | // -- Chiffres |
fbd38 | 26:bf432a28d0c6 | 70 | 0x40, // 0 |
fbd38 | 26:bf432a28d0c6 | 71 | 0x79, // 1 |
fbd38 | 26:bf432a28d0c6 | 72 | 0x24, // 2 |
fbd38 | 26:bf432a28d0c6 | 73 | 0x30, // 3 |
fbd38 | 26:bf432a28d0c6 | 74 | 0x19, // 4 |
fbd38 | 26:bf432a28d0c6 | 75 | 0x12, // 5 |
fbd38 | 26:bf432a28d0c6 | 76 | 0x02, // 6 |
fbd38 | 26:bf432a28d0c6 | 77 | 0x78, // 7 |
fbd38 | 26:bf432a28d0c6 | 78 | 0x00, // 8 |
fbd38 | 26:bf432a28d0c6 | 79 | 0x18, // 9 |
fbd38 | 26:bf432a28d0c6 | 80 | // -- Won |
fbd38 | 26:bf432a28d0c6 | 81 | 0x43, //W1 |
fbd38 | 26:bf432a28d0c6 | 82 | 0x61, //W2 |
fbd38 | 26:bf432a28d0c6 | 83 | 0x23, //o |
fbd38 | 26:bf432a28d0c6 | 84 | 0x2B, //n |
fbd38 | 26:bf432a28d0c6 | 85 | // -- LoST |
fbd38 | 26:bf432a28d0c6 | 86 | 0x47, //L |
fbd38 | 26:bf432a28d0c6 | 87 | 0x23, //o |
fbd38 | 26:bf432a28d0c6 | 88 | 0x12, //S |
fbd38 | 26:bf432a28d0c6 | 89 | 0x07, //T |
fbd38 | 26:bf432a28d0c6 | 90 | // -- CodE |
fbd38 | 26:bf432a28d0c6 | 91 | 0x46, //C |
fbd38 | 26:bf432a28d0c6 | 92 | 0x23, //o |
fbd38 | 26:bf432a28d0c6 | 93 | 0x21, //d |
fbd38 | 26:bf432a28d0c6 | 94 | 0x06, //E |
fbd38 | 26:bf432a28d0c6 | 95 | // -- Empty |
fbd38 | 26:bf432a28d0c6 | 96 | 0x7F, // Empty |
fbd38 | 26:bf432a28d0c6 | 97 | 0x77, // _ |
fbd38 | 26:bf432a28d0c6 | 98 | 0x3F, // - |
fbd38 | 26:bf432a28d0c6 | 99 | 0x0C // P |
fbd38 | 26:bf432a28d0c6 | 100 | }; |
fbd38 | 26:bf432a28d0c6 | 101 | const uint32_t PosSeg[8] = { |
fbd38 | 26:bf432a28d0c6 | 102 | 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, |
fbd38 | 26:bf432a28d0c6 | 103 | }; |
fbd38 | 26:bf432a28d0c6 | 104 | if (dot) { |
fbd38 | 26:bf432a28d0c6 | 105 | Display.write((SevenSeg[val]<<8)| PosSeg[digit]); |
fbd38 | 26:bf432a28d0c6 | 106 | } |
fbd38 | 26:bf432a28d0c6 | 107 | else { |
fbd38 | 26:bf432a28d0c6 | 108 | Display.write((SevenSeg[val]<<8)| PosSeg[digit] | 0x8000); |
fbd38 | 26:bf432a28d0c6 | 109 | } |
fbd38 | 26:bf432a28d0c6 | 110 | } |
garphil | 20:cdbc31a89c7f | 111 | |
fbd38 | 26:bf432a28d0c6 | 112 | void DisplayITHandler() |
fbd38 | 26:bf432a28d0c6 | 113 | { |
fbd38 | 26:bf432a28d0c6 | 114 | if (DisplayBlink) { |
fbd38 | 26:bf432a28d0c6 | 115 | if (BlinkIndex < BlinkHalfPeriod_us) { |
fbd38 | 26:bf432a28d0c6 | 116 | // Display date |
fbd38 | 26:bf432a28d0c6 | 117 | DigitDisplay(DisplayDate[DisplayIndex], (DisplayIndex==5)&&DisplayDot5, DisplayIndex); |
fbd38 | 26:bf432a28d0c6 | 118 | DisplayIndex = (DisplayIndex+1)%8; |
fbd38 | 26:bf432a28d0c6 | 119 | } |
fbd38 | 26:bf432a28d0c6 | 120 | else { |
fbd38 | 26:bf432a28d0c6 | 121 | ClearDisplay(); |
fbd38 | 26:bf432a28d0c6 | 122 | } |
fbd38 | 26:bf432a28d0c6 | 123 | // Increment Blink Index |
fbd38 | 26:bf432a28d0c6 | 124 | BlinkIndex = (BlinkIndex++) % (2*BlinkHalfPeriod_us); |
fbd38 | 26:bf432a28d0c6 | 125 | } |
fbd38 | 26:bf432a28d0c6 | 126 | else { |
fbd38 | 26:bf432a28d0c6 | 127 | DigitDisplay(DisplayDate[DisplayIndex], (DisplayIndex==5)&&DisplayDot5, DisplayIndex); |
fbd38 | 26:bf432a28d0c6 | 128 | DisplayIndex = (DisplayIndex+1)%8; |
fbd38 | 26:bf432a28d0c6 | 129 | } |
fbd38 | 26:bf432a28d0c6 | 130 | } |
fbd38 | 26:bf432a28d0c6 | 131 | |
fbd38 | 26:bf432a28d0c6 | 132 | void DisplayWon() |
fbd38 | 26:bf432a28d0c6 | 133 | { |
fbd38 | 26:bf432a28d0c6 | 134 | DisplayDate[0] = 10; |
fbd38 | 26:bf432a28d0c6 | 135 | DisplayDate[1] = 11; |
fbd38 | 26:bf432a28d0c6 | 136 | DisplayDate[2] = 12; |
fbd38 | 26:bf432a28d0c6 | 137 | DisplayDate[3] = 13; |
fbd38 | 26:bf432a28d0c6 | 138 | DisplayBlink=1; |
fbd38 | 26:bf432a28d0c6 | 139 | DisplayDate[4] = 22; |
fbd38 | 26:bf432a28d0c6 | 140 | DisplayDate[5] = 22; |
fbd38 | 26:bf432a28d0c6 | 141 | DisplayDate[6] = 22; |
fbd38 | 26:bf432a28d0c6 | 142 | DisplayDate[7] = 22; |
fbd38 | 26:bf432a28d0c6 | 143 | DisplayDot5=0; |
fbd38 | 26:bf432a28d0c6 | 144 | } |
fbd38 | 26:bf432a28d0c6 | 145 | |
fbd38 | 26:bf432a28d0c6 | 146 | void DisplayCode() |
fbd38 | 26:bf432a28d0c6 | 147 | { |
fbd38 | 26:bf432a28d0c6 | 148 | DisplayDate[0] = 18; |
fbd38 | 26:bf432a28d0c6 | 149 | DisplayDate[1] = 19; |
fbd38 | 26:bf432a28d0c6 | 150 | DisplayDate[2] = 20; |
fbd38 | 26:bf432a28d0c6 | 151 | DisplayDate[3] = 21; |
fbd38 | 26:bf432a28d0c6 | 152 | DisplayBlink=0; |
fbd38 | 26:bf432a28d0c6 | 153 | DisplayDate[4] = 2; |
fbd38 | 26:bf432a28d0c6 | 154 | DisplayDate[5] = 23; |
fbd38 | 26:bf432a28d0c6 | 155 | DisplayDate[6] = 23; |
fbd38 | 26:bf432a28d0c6 | 156 | DisplayDate[7] = 23; |
fbd38 | 26:bf432a28d0c6 | 157 | DisplayDot5=0; |
fbd38 | 26:bf432a28d0c6 | 158 | } |
garphil | 20:cdbc31a89c7f | 159 | |
fbd38 | 26:bf432a28d0c6 | 160 | void DisplayLost() |
fbd38 | 26:bf432a28d0c6 | 161 | { |
fbd38 | 26:bf432a28d0c6 | 162 | DisplayDate[0] = 14; |
fbd38 | 26:bf432a28d0c6 | 163 | DisplayDate[1] = 15; |
fbd38 | 26:bf432a28d0c6 | 164 | DisplayDate[2] = 16; |
fbd38 | 26:bf432a28d0c6 | 165 | DisplayDate[3] = 17; |
fbd38 | 26:bf432a28d0c6 | 166 | DisplayBlink=1; |
fbd38 | 26:bf432a28d0c6 | 167 | DisplayDate[4] = 22; |
fbd38 | 26:bf432a28d0c6 | 168 | DisplayDate[5] = 22; |
fbd38 | 26:bf432a28d0c6 | 169 | DisplayDate[6] = 22; |
fbd38 | 26:bf432a28d0c6 | 170 | DisplayDate[7] = 22; |
fbd38 | 26:bf432a28d0c6 | 171 | DisplayDot5=0; |
fbd38 | 26:bf432a28d0c6 | 172 | } |
fbd38 | 26:bf432a28d0c6 | 173 | |
fbd38 | 26:bf432a28d0c6 | 174 | void DisplayFire() |
fbd38 | 26:bf432a28d0c6 | 175 | { |
fbd38 | 26:bf432a28d0c6 | 176 | DisplayDate[0] = 24; |
fbd38 | 26:bf432a28d0c6 | 177 | DisplayDate[1] = 24; |
fbd38 | 26:bf432a28d0c6 | 178 | DisplayDate[2] = 24; |
fbd38 | 26:bf432a28d0c6 | 179 | DisplayDate[3] = 24; |
fbd38 | 26:bf432a28d0c6 | 180 | DisplayBlink=1; |
fbd38 | 26:bf432a28d0c6 | 181 | DisplayDate[4] = 24; |
fbd38 | 26:bf432a28d0c6 | 182 | DisplayDate[5] = 24; |
fbd38 | 26:bf432a28d0c6 | 183 | DisplayDate[6] = 24; |
fbd38 | 26:bf432a28d0c6 | 184 | DisplayDate[7] = 24; |
fbd38 | 26:bf432a28d0c6 | 185 | DisplayDot5=0; |
fbd38 | 26:bf432a28d0c6 | 186 | } |
fbd38 | 26:bf432a28d0c6 | 187 | |
fbd38 | 26:bf432a28d0c6 | 188 | void DisplayRelativePosition() |
fbd38 | 26:bf432a28d0c6 | 189 | { |
fbd38 | 26:bf432a28d0c6 | 190 | int32_t ir; |
fbd38 | 26:bf432a28d0c6 | 191 | // Display Prisme Angle |
fbd38 | 26:bf432a28d0c6 | 192 | DisplayDate[0] = 25; // P |
fbd38 | 26:bf432a28d0c6 | 193 | ir = int(AbsolutePosPrisme - ZeroPosPrisme); |
fbd38 | 26:bf432a28d0c6 | 194 | if (ir>=0) DisplayDate[1] = 22; // Empty |
fbd38 | 26:bf432a28d0c6 | 195 | else { |
fbd38 | 26:bf432a28d0c6 | 196 | DisplayDate[1] = 24; // - sign |
fbd38 | 26:bf432a28d0c6 | 197 | ir=-ir; |
fbd38 | 26:bf432a28d0c6 | 198 | } |
fbd38 | 26:bf432a28d0c6 | 199 | DisplayDate[2] = ir / 10; |
fbd38 | 26:bf432a28d0c6 | 200 | DisplayDate[3] = ir % 10; |
fbd38 | 26:bf432a28d0c6 | 201 | // Display Laser Angle |
fbd38 | 26:bf432a28d0c6 | 202 | DisplayDate[4] = 14; // L |
fbd38 | 26:bf432a28d0c6 | 203 | ir = int(AbsolutePosLaser - ZeroPosLaser); |
fbd38 | 26:bf432a28d0c6 | 204 | if (ir>=0) DisplayDate[5] = 22; // Empty |
fbd38 | 26:bf432a28d0c6 | 205 | else { |
fbd38 | 26:bf432a28d0c6 | 206 | DisplayDate[5] = 24; // - sign |
fbd38 | 26:bf432a28d0c6 | 207 | ir=-ir; |
fbd38 | 26:bf432a28d0c6 | 208 | } |
fbd38 | 26:bf432a28d0c6 | 209 | DisplayDate[6] = ir / 10; |
fbd38 | 26:bf432a28d0c6 | 210 | DisplayDate[7] = ir % 10; |
fbd38 | 26:bf432a28d0c6 | 211 | DisplayDot5=0; |
fbd38 | 26:bf432a28d0c6 | 212 | DisplayBlink=0; |
fbd38 | 26:bf432a28d0c6 | 213 | } |
fbd38 | 25:3d3ebfd0a73f | 214 | // ------------ Process ---------------------------------- |
garphil | 20:cdbc31a89c7f | 215 | void help() // Display list of Commands |
garphil | 20:cdbc31a89c7f | 216 | { |
garphil | 20:cdbc31a89c7f | 217 | DEBUG("List of commands:\n\r"); |
garphil | 20:cdbc31a89c7f | 218 | DEBUG(" h --> Help, display list of cammands\n\r"); |
garphil | 20:cdbc31a89c7f | 219 | } |
garphil | 2:050f12806bc5 | 220 | |
fbd38 | 25:3d3ebfd0a73f | 221 | /* Message */ |
fbd38 | 25:3d3ebfd0a73f | 222 | void message() |
fbd38 | 25:3d3ebfd0a73f | 223 | { |
fbd38 | 26:bf432a28d0c6 | 224 | DEBUG("-----------------------------------------------------\n\r"); |
fbd38 | 26:bf432a28d0c6 | 225 | DEBUG("----- CreaLASER version 1.0 -----\n\r"); |
fbd38 | 26:bf432a28d0c6 | 226 | DEBUG("----- faite par fbd38 le 11 Fevrier 2019 -----\n\r"); |
fbd38 | 26:bf432a28d0c6 | 227 | DEBUG("-----------------------------------------------------\n\r"); |
fbd38 | 26:bf432a28d0c6 | 228 | } |
fbd38 | 26:bf432a28d0c6 | 229 | |
fbd38 | 26:bf432a28d0c6 | 230 | void Fire() |
fbd38 | 26:bf432a28d0c6 | 231 | { |
fbd38 | 26:bf432a28d0c6 | 232 | float epsi = 2.0; |
fbd38 | 26:bf432a28d0c6 | 233 | // Make some noise |
fbd38 | 26:bf432a28d0c6 | 234 | // PLAY_MUSIC(song_xfile,buzzer); |
fbd38 | 26:bf432a28d0c6 | 235 | DisplayFire(); |
fbd38 | 26:bf432a28d0c6 | 236 | LaserLED=1.0; |
fbd38 | 26:bf432a28d0c6 | 237 | wait(2); |
fbd38 | 26:bf432a28d0c6 | 238 | if (((abs(TargetPosLaser - AbsolutePosLaser) < epsi) |
fbd38 | 26:bf432a28d0c6 | 239 | && (abs(TargetPosPrisme - AbsolutePosPrisme) < epsi)) |
fbd38 | 26:bf432a28d0c6 | 240 | || (PhotoDiode)) { |
fbd38 | 26:bf432a28d0c6 | 241 | // --- WINNER |
fbd38 | 26:bf432a28d0c6 | 242 | DisplayWon(); |
fbd38 | 26:bf432a28d0c6 | 243 | // PLAY_MUSIC(song_lightmyfire,buzzer); |
fbd38 | 26:bf432a28d0c6 | 244 | wait(2); |
fbd38 | 26:bf432a28d0c6 | 245 | DisplayCode(); |
fbd38 | 26:bf432a28d0c6 | 246 | wait(10); |
fbd38 | 26:bf432a28d0c6 | 247 | } |
fbd38 | 26:bf432a28d0c6 | 248 | else { |
fbd38 | 26:bf432a28d0c6 | 249 | DisplayLost(); |
fbd38 | 26:bf432a28d0c6 | 250 | // PLAY_MUSIC(song_greensleaves,buzzer); |
fbd38 | 26:bf432a28d0c6 | 251 | } |
fbd38 | 26:bf432a28d0c6 | 252 | wait(3); |
fbd38 | 26:bf432a28d0c6 | 253 | LaserLED=DEFAULT_LASER; |
fbd38 | 26:bf432a28d0c6 | 254 | // Set back all servos to zero |
fbd38 | 26:bf432a28d0c6 | 255 | AbsolutePosPrisme = ZeroPosPrisme; |
fbd38 | 26:bf432a28d0c6 | 256 | AbsolutePosLaser = ZeroPosLaser; |
fbd38 | 26:bf432a28d0c6 | 257 | Prisme.position(AbsolutePosPrisme); |
fbd38 | 26:bf432a28d0c6 | 258 | wait(1); |
fbd38 | 26:bf432a28d0c6 | 259 | LaserGun.position(AbsolutePosLaser); |
fbd38 | 26:bf432a28d0c6 | 260 | } |
fbd38 | 26:bf432a28d0c6 | 261 | |
fbd38 | 26:bf432a28d0c6 | 262 | void StoreZeroPosition() |
fbd38 | 26:bf432a28d0c6 | 263 | { |
fbd38 | 26:bf432a28d0c6 | 264 | ZeroPosLaser = AbsolutePosLaser; |
fbd38 | 26:bf432a28d0c6 | 265 | ZeroPosPrisme = AbsolutePosPrisme; |
fbd38 | 26:bf432a28d0c6 | 266 | } |
fbd38 | 26:bf432a28d0c6 | 267 | |
fbd38 | 26:bf432a28d0c6 | 268 | void StoreTargetPosition() |
fbd38 | 26:bf432a28d0c6 | 269 | { |
fbd38 | 26:bf432a28d0c6 | 270 | TargetPosLaser = AbsolutePosLaser; |
fbd38 | 26:bf432a28d0c6 | 271 | TargetPosPrisme = AbsolutePosPrisme; |
fbd38 | 26:bf432a28d0c6 | 272 | } |
fbd38 | 26:bf432a28d0c6 | 273 | |
fbd38 | 26:bf432a28d0c6 | 274 | void ReturnAbsolutePosition() |
fbd38 | 26:bf432a28d0c6 | 275 | { |
fbd38 | 26:bf432a28d0c6 | 276 | char bt_text[128]; |
fbd38 | 26:bf432a28d0c6 | 277 | sprintf(bt_text, "*L%4.0f**P%4.0f*", AbsolutePosLaser, AbsolutePosPrisme); |
fbd38 | 26:bf432a28d0c6 | 278 | DEBUG(bt_text); |
fbd38 | 26:bf432a28d0c6 | 279 | } |
fbd38 | 26:bf432a28d0c6 | 280 | |
fbd38 | 26:bf432a28d0c6 | 281 | void RotateRelative() |
fbd38 | 26:bf432a28d0c6 | 282 | { |
fbd38 | 26:bf432a28d0c6 | 283 | // Parse the servo |
fbd38 | 26:bf432a28d0c6 | 284 | char c; |
fbd38 | 26:bf432a28d0c6 | 285 | char AngleStr[4]=""; |
fbd38 | 26:bf432a28d0c6 | 286 | float Angle; |
fbd38 | 26:bf432a28d0c6 | 287 | float Amax=90.0; |
fbd38 | 26:bf432a28d0c6 | 288 | float Amin=-90.0; |
fbd38 | 26:bf432a28d0c6 | 289 | int i,j; |
fbd38 | 26:bf432a28d0c6 | 290 | int servo_type = 0; // 1=Laser, 2=Prisme |
fbd38 | 26:bf432a28d0c6 | 291 | while (! bt_uart.readable()) /* Wait */; |
fbd38 | 26:bf432a28d0c6 | 292 | c=bt_uart.getc(); |
fbd38 | 26:bf432a28d0c6 | 293 | pc_uart.printf("%c", c); |
fbd38 | 26:bf432a28d0c6 | 294 | if ((c == 'a') || (c == 'A')) servo_type=1; // Laser |
fbd38 | 26:bf432a28d0c6 | 295 | if ((c == 'b') || (c == 'B')) servo_type=2; // Prisme |
fbd38 | 26:bf432a28d0c6 | 296 | for (i=j=0; i<4; i++) { |
fbd38 | 26:bf432a28d0c6 | 297 | while (! bt_uart.readable()) /* Wait */; |
fbd38 | 26:bf432a28d0c6 | 298 | c=bt_uart.getc(); |
fbd38 | 26:bf432a28d0c6 | 299 | pc_uart.printf("%c", c); |
fbd38 | 26:bf432a28d0c6 | 300 | if ((c != ' ') && (c != ',')) { |
fbd38 | 26:bf432a28d0c6 | 301 | AngleStr[j++] = c; |
fbd38 | 26:bf432a28d0c6 | 302 | AngleStr[j] = 0; |
fbd38 | 26:bf432a28d0c6 | 303 | } |
fbd38 | 26:bf432a28d0c6 | 304 | if ( c == ',') i=4; |
fbd38 | 26:bf432a28d0c6 | 305 | } |
fbd38 | 26:bf432a28d0c6 | 306 | pc_uart.printf(" Angle String %s", AngleStr); |
fbd38 | 26:bf432a28d0c6 | 307 | sscanf(AngleStr, "%f", &Angle); |
fbd38 | 26:bf432a28d0c6 | 308 | pc_uart.printf(" Angle Float %4.1f", Angle); |
fbd38 | 26:bf432a28d0c6 | 309 | if (Angle > Amax) Angle = Amax; |
fbd38 | 26:bf432a28d0c6 | 310 | if (Angle < Amin) Angle = Amin; |
fbd38 | 26:bf432a28d0c6 | 311 | if (servo_type == 1) { |
fbd38 | 26:bf432a28d0c6 | 312 | RelativePosLaser = Angle; |
fbd38 | 26:bf432a28d0c6 | 313 | AbsolutePosLaser = RelativePosLaser + ZeroPosLaser; |
fbd38 | 26:bf432a28d0c6 | 314 | if (AbsolutePosLaser > Amax) AbsolutePosLaser = Amax; |
fbd38 | 26:bf432a28d0c6 | 315 | if (AbsolutePosLaser < Amin) AbsolutePosLaser = Amin; |
fbd38 | 26:bf432a28d0c6 | 316 | LaserGun.position(AbsolutePosLaser); |
fbd38 | 26:bf432a28d0c6 | 317 | } |
fbd38 | 26:bf432a28d0c6 | 318 | if (servo_type == 2) { |
fbd38 | 26:bf432a28d0c6 | 319 | RelativePosPrisme = Angle; |
fbd38 | 26:bf432a28d0c6 | 320 | AbsolutePosPrisme = RelativePosPrisme + ZeroPosPrisme; |
fbd38 | 26:bf432a28d0c6 | 321 | if (AbsolutePosPrisme > Amax) AbsolutePosPrisme = Amax; |
fbd38 | 26:bf432a28d0c6 | 322 | if (AbsolutePosPrisme < Amin) AbsolutePosPrisme = Amin; |
fbd38 | 26:bf432a28d0c6 | 323 | Prisme.position(AbsolutePosPrisme); |
fbd38 | 26:bf432a28d0c6 | 324 | } |
fbd38 | 26:bf432a28d0c6 | 325 | wait(0.1); |
fbd38 | 26:bf432a28d0c6 | 326 | } |
fbd38 | 26:bf432a28d0c6 | 327 | |
fbd38 | 26:bf432a28d0c6 | 328 | void RotateIncremetal() |
fbd38 | 26:bf432a28d0c6 | 329 | { |
fbd38 | 26:bf432a28d0c6 | 330 | // Parse the servo |
fbd38 | 26:bf432a28d0c6 | 331 | char c; |
fbd38 | 26:bf432a28d0c6 | 332 | float Amax=90.0; |
fbd38 | 26:bf432a28d0c6 | 333 | float Amin=-90.0; |
fbd38 | 26:bf432a28d0c6 | 334 | float Angle=1.0; // Increment for manual adjustement |
fbd38 | 26:bf432a28d0c6 | 335 | while (! bt_uart.readable()) /* Wait */; |
fbd38 | 26:bf432a28d0c6 | 336 | c=bt_uart.getc(); |
fbd38 | 26:bf432a28d0c6 | 337 | // pc_uart.printf("%c", c); |
fbd38 | 26:bf432a28d0c6 | 338 | if (c=='a') { |
fbd38 | 26:bf432a28d0c6 | 339 | AbsolutePosLaser += Angle; |
fbd38 | 26:bf432a28d0c6 | 340 | if (AbsolutePosLaser > Amax) AbsolutePosLaser = Amax; |
fbd38 | 26:bf432a28d0c6 | 341 | LaserGun.position(AbsolutePosLaser); |
fbd38 | 26:bf432a28d0c6 | 342 | } |
fbd38 | 26:bf432a28d0c6 | 343 | if (c=='b') { |
fbd38 | 26:bf432a28d0c6 | 344 | AbsolutePosPrisme += Angle; |
fbd38 | 26:bf432a28d0c6 | 345 | if (AbsolutePosPrisme > Amax) AbsolutePosPrisme = Amax; |
fbd38 | 26:bf432a28d0c6 | 346 | Prisme.position(AbsolutePosPrisme); |
fbd38 | 26:bf432a28d0c6 | 347 | } |
fbd38 | 26:bf432a28d0c6 | 348 | if (c=='z') { |
fbd38 | 26:bf432a28d0c6 | 349 | AbsolutePosLaser -= Angle; |
fbd38 | 26:bf432a28d0c6 | 350 | if (AbsolutePosLaser < Amin) AbsolutePosLaser = Amin; |
fbd38 | 26:bf432a28d0c6 | 351 | LaserGun.position(AbsolutePosLaser); |
fbd38 | 26:bf432a28d0c6 | 352 | } |
fbd38 | 26:bf432a28d0c6 | 353 | if (c=='n') { |
fbd38 | 26:bf432a28d0c6 | 354 | AbsolutePosPrisme -= Angle; |
fbd38 | 26:bf432a28d0c6 | 355 | if (AbsolutePosPrisme < Amin) AbsolutePosPrisme = Amin; |
fbd38 | 26:bf432a28d0c6 | 356 | Prisme.position(AbsolutePosPrisme); |
fbd38 | 26:bf432a28d0c6 | 357 | } |
fbd38 | 26:bf432a28d0c6 | 358 | wait(0.1); |
garphil | 20:cdbc31a89c7f | 359 | } |
garphil | 5:f62e799558c3 | 360 | |
fbd38 | 16:8ae70f0b8fca | 361 | /* Main Routine */ |
fbd38 | 16:8ae70f0b8fca | 362 | int main() |
fbd38 | 16:8ae70f0b8fca | 363 | { |
garphil | 1:ab4c9a0a5374 | 364 | myled = 1; // To see something is alive |
garphil | 20:cdbc31a89c7f | 365 | bool flaghelp; |
fbd38 | 25:3d3ebfd0a73f | 366 | // -- Uncomment to program the HC-06 Module |
fbd38 | 26:bf432a28d0c6 | 367 | // DEBUG("AT+NAMECreaLASER01"); |
fbd38 | 25:3d3ebfd0a73f | 368 | // wait(10); |
fbd38 | 26:bf432a28d0c6 | 369 | DEBUG("-----------------------------------------------------\n\r"); |
fbd38 | 26:bf432a28d0c6 | 370 | DEBUG("----- CreaLASER version 1.0 -----\n\r"); |
fbd38 | 26:bf432a28d0c6 | 371 | DEBUG("----- faite par fbd38 le 11 Fevrier 2019 -----\n\r"); |
fbd38 | 26:bf432a28d0c6 | 372 | DEBUG("-----------------------------------------------------\n\r"); |
fbd38 | 25:3d3ebfd0a73f | 373 | // DEBUG("SystemCoreClock = %d Hz =\n\r", SystemCoreClock); |
fbd38 | 25:3d3ebfd0a73f | 374 | // DEBUG("Wait 2s\n\r"); |
garphil | 20:cdbc31a89c7f | 375 | myled = 0; // Real stuff starts here |
fbd38 | 26:bf432a28d0c6 | 376 | // Initializethe The Display SPI |
fbd38 | 26:bf432a28d0c6 | 377 | Display.format(16,0); |
fbd38 | 26:bf432a28d0c6 | 378 | // Display.frequency(50000); |
fbd38 | 26:bf432a28d0c6 | 379 | ClearDisplay(); |
fbd38 | 26:bf432a28d0c6 | 380 | // Define the Display IT Task every 10ms |
fbd38 | 26:bf432a28d0c6 | 381 | DisplayTimer.attach_us(&DisplayITHandler, DISPLAY_US); // Attache the Motor routine to the timer |
fbd38 | 26:bf432a28d0c6 | 382 | // Play a single tone |
fbd38 | 26:bf432a28d0c6 | 383 | // PLAY_NOTE(la, buzzer); |
fbd38 | 26:bf432a28d0c6 | 384 | // Set all servos to zero |
fbd38 | 26:bf432a28d0c6 | 385 | wait(0.1); |
fbd38 | 26:bf432a28d0c6 | 386 | Prisme.position(AbsolutePosPrisme); |
fbd38 | 26:bf432a28d0c6 | 387 | wait(1); |
fbd38 | 26:bf432a28d0c6 | 388 | LaserGun.position(AbsolutePosLaser); |
fbd38 | 26:bf432a28d0c6 | 389 | // Set default Laser Power |
fbd38 | 26:bf432a28d0c6 | 390 | LaserLED=DEFAULT_LASER; |
fbd38 | 26:bf432a28d0c6 | 391 | // |
garphil | 20:cdbc31a89c7f | 392 | while(1) { |
fbd38 | 25:3d3ebfd0a73f | 393 | ExecCommand='-'; // Clear The Command List |
fbd38 | 25:3d3ebfd0a73f | 394 | /* Wait Until some command is in the pipe |
fbd38 | 25:3d3ebfd0a73f | 395 | */ |
fbd38 | 25:3d3ebfd0a73f | 396 | if (bt_uart.readable()) { |
fbd38 | 26:bf432a28d0c6 | 397 | ExecCommand=bt_uart.getc(); |
fbd38 | 25:3d3ebfd0a73f | 398 | } |
fbd38 | 26:bf432a28d0c6 | 399 | else { |
fbd38 | 26:bf432a28d0c6 | 400 | // Check UI |
fbd38 | 26:bf432a28d0c6 | 401 | if (FireButton == 0) ExecCommand = 'F'; |
fbd38 | 25:3d3ebfd0a73f | 402 | } |
fbd38 | 25:3d3ebfd0a73f | 403 | // ------ Test according with the receved command |
fbd38 | 25:3d3ebfd0a73f | 404 | if (ExecCommand!='-') { |
fbd38 | 25:3d3ebfd0a73f | 405 | DEBUG("Commande Recue: [%c]", ExecCommand); |
fbd38 | 25:3d3ebfd0a73f | 406 | flaghelp = false; |
fbd38 | 25:3d3ebfd0a73f | 407 | switch (ExecCommand) { |
fbd38 | 25:3d3ebfd0a73f | 408 | case 'h': |
fbd38 | 25:3d3ebfd0a73f | 409 | help(); |
fbd38 | 25:3d3ebfd0a73f | 410 | flaghelp=true; |
fbd38 | 26:bf432a28d0c6 | 411 | CASE('P', "Rotate Relative 'P[a/b]angle,' (Angle signed integer -90, 90)", RotateRelative(); ) |
fbd38 | 26:bf432a28d0c6 | 412 | CASE('F', " FIRE ", Fire(); ) |
fbd38 | 26:bf432a28d0c6 | 413 | // - commans used by Degug and Calibration |
fbd38 | 26:bf432a28d0c6 | 414 | CASE('-', "------------- Degug Only Commands --------------", message(); ) |
fbd38 | 26:bf432a28d0c6 | 415 | CASE('L', "Laser ON", LaserLED=1.0; ) |
fbd38 | 26:bf432a28d0c6 | 416 | CASE('l', "Laser low power", LaserLED=DEFAULT_LASER; ) |
fbd38 | 26:bf432a28d0c6 | 417 | CASE('z', "Laser OFF", LaserLED=0.0; ) |
fbd38 | 26:bf432a28d0c6 | 418 | CASE('r', "Rotate Incremental 'r[a/z/b/n]' (a/z for laser +,-; b/n for prisme +/-)", RotateIncremetal(); ) |
fbd38 | 26:bf432a28d0c6 | 419 | CASE('S', "Store Zero Position", StoreZeroPosition(); ) |
fbd38 | 26:bf432a28d0c6 | 420 | CASE('T', "Store Target Position", StoreTargetPosition(); ) |
fbd38 | 26:bf432a28d0c6 | 421 | CASE('!', "Return Absolute Position", ReturnAbsolutePosition(); ) |
fbd38 | 26:bf432a28d0c6 | 422 | CASE('W', "Display Won", DisplayWon(); ) |
fbd38 | 26:bf432a28d0c6 | 423 | CASE('w', "Display Lost", DisplayLost(); ) |
fbd38 | 26:bf432a28d0c6 | 424 | CASE('C', "Display Code", DisplayCode(); ) |
fbd38 | 25:3d3ebfd0a73f | 425 | CASE('?', "Mistery", message(); ) |
garphil | 20:cdbc31a89c7f | 426 | |
fbd38 | 25:3d3ebfd0a73f | 427 | default : |
fbd38 | 25:3d3ebfd0a73f | 428 | DEBUG("invalid command; use: 'h' for help()"); |
fbd38 | 25:3d3ebfd0a73f | 429 | } |
fbd38 | 26:bf432a28d0c6 | 430 | DisplayRelativePosition(); |
garphil | 20:cdbc31a89c7f | 431 | } |
fbd38 | 26:bf432a28d0c6 | 432 | // Check Photodiode |
fbd38 | 26:bf432a28d0c6 | 433 | if (PhotoDiode) { |
fbd38 | 26:bf432a28d0c6 | 434 | myled=1; |
fbd38 | 26:bf432a28d0c6 | 435 | DisplayDot5=1; |
fbd38 | 26:bf432a28d0c6 | 436 | } |
fbd38 | 26:bf432a28d0c6 | 437 | else { |
fbd38 | 26:bf432a28d0c6 | 438 | myled=0; |
fbd38 | 26:bf432a28d0c6 | 439 | DisplayDot5=0; |
fbd38 | 26:bf432a28d0c6 | 440 | } |
garphil | 20:cdbc31a89c7f | 441 | } |
garphil | 20:cdbc31a89c7f | 442 | } |