eLab Team / Mbed 2 deprecated LaLaBox

Dependencies:   mbed CREALIB

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?

UserRevisionLine numberNew 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 }