[PH]
Dependencies: IRremouteAndButton QuadDisplayMy LIS3MDL_my sMotor
main.cpp@1:b24bac622a37, 2021-05-17 (annotated)
- Committer:
- allesh
- Date:
- Mon May 17 07:17:06 2021 +0000
- Revision:
- 1:b24bac622a37
- Parent:
- 0:eb99909151eb
placeholder;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ankazwork | 0:eb99909151eb | 1 | #include "mbed.h" |
ankazwork | 0:eb99909151eb | 2 | #include "platform/mbed_thread.h" |
ankazwork | 0:eb99909151eb | 3 | #include "UserButton.h" |
ankazwork | 0:eb99909151eb | 4 | #include "sMotor.h" |
ankazwork | 0:eb99909151eb | 5 | #include "lis3mdl_class.h" |
ankazwork | 0:eb99909151eb | 6 | #include "QuadDisplay2.h" |
ankazwork | 0:eb99909151eb | 7 | |
ankazwork | 0:eb99909151eb | 8 | /**************************************************************** |
ankazwork | 0:eb99909151eb | 9 | * Definitions |
ankazwork | 0:eb99909151eb | 10 | ****************************************************************/ |
ankazwork | 0:eb99909151eb | 11 | |
ankazwork | 0:eb99909151eb | 12 | // Blinking rate in milliseconds |
ankazwork | 0:eb99909151eb | 13 | #define step_speed 1500 |
ankazwork | 0:eb99909151eb | 14 | #define POINTS 1 |
ankazwork | 0:eb99909151eb | 15 | #define M_PI 3.14159265358979323846 |
ankazwork | 0:eb99909151eb | 16 | #define RADIAN M_PI/180.0 |
ankazwork | 0:eb99909151eb | 17 | |
ankazwork | 0:eb99909151eb | 18 | /**************************************************************** |
ankazwork | 0:eb99909151eb | 19 | * Prototypes |
ankazwork | 0:eb99909151eb | 20 | *****************************************************************/ |
ankazwork | 0:eb99909151eb | 21 | |
ankazwork | 0:eb99909151eb | 22 | void Ini(); |
ankazwork | 0:eb99909151eb | 23 | void HowManyClicks(); |
ankazwork | 0:eb99909151eb | 24 | void proximityR_isr(); |
ankazwork | 0:eb99909151eb | 25 | void proximityF_isr(); |
ankazwork | 0:eb99909151eb | 26 | //----------------------- |
ankazwork | 0:eb99909151eb | 27 | void polling_sensors_isr(); |
ankazwork | 0:eb99909151eb | 28 | void sensors_task(); |
allesh | 1:b24bac622a37 | 29 | void FrameTimeoutCW_isr(); |
allesh | 1:b24bac622a37 | 30 | void FrameTimeoutCCW_isr(); |
allesh | 1:b24bac622a37 | 31 | void BounceTimeoutCW_isr(); |
allesh | 1:b24bac622a37 | 32 | void BounceTimeoutCCW_isr(); |
allesh | 1:b24bac622a37 | 33 | void CW_switch_isr(); |
allesh | 1:b24bac622a37 | 34 | void CCW_switch_isr(); |
ankazwork | 0:eb99909151eb | 35 | //----------------------- |
allesh | 1:b24bac622a37 | 36 | //void clk_speed_isr(); |
ankazwork | 0:eb99909151eb | 37 | /***************************************************************** |
ankazwork | 0:eb99909151eb | 38 | * Interface |
ankazwork | 0:eb99909151eb | 39 | ******************************************************************/ |
ankazwork | 0:eb99909151eb | 40 | |
ankazwork | 0:eb99909151eb | 41 | DigitalOut led1(LED1); |
allesh | 1:b24bac622a37 | 42 | InterruptIn CW_switch(D10); |
allesh | 1:b24bac622a37 | 43 | InterruptIn CCW_switch(D11); |
ankazwork | 0:eb99909151eb | 44 | //--- |
ankazwork | 0:eb99909151eb | 45 | RawSerial pc(USBTX, USBRX); |
ankazwork | 0:eb99909151eb | 46 | DevI2C devI2c(D14,D15); |
ankazwork | 0:eb99909151eb | 47 | LIS3MDL magnetometer(&devI2c,LIS3MDL_M_MEMS_ADDRESS_LOW); |
ankazwork | 0:eb99909151eb | 48 | DigitalOut led2(A0); |
ankazwork | 0:eb99909151eb | 49 | SPI spi(D4, D5, D3); |
ankazwork | 0:eb99909151eb | 50 | QuadDisplayMy display(&spi,D6); |
ankazwork | 0:eb99909151eb | 51 | //--- |
ankazwork | 0:eb99909151eb | 52 | sMotor motor(A5, A4, A3, A2); // creates new stepper motor: IN1, IN2, IN3, IN4 |
allesh | 1:b24bac622a37 | 53 | InterruptIn BlueBatton(USER_BUTTON); |
ankazwork | 0:eb99909151eb | 54 | |
ankazwork | 0:eb99909151eb | 55 | /***************************************************************** |
ankazwork | 0:eb99909151eb | 56 | * Time |
ankazwork | 0:eb99909151eb | 57 | ******************************************************************/ |
allesh | 1:b24bac622a37 | 58 | Ticker polling_sensors; |
ankazwork | 0:eb99909151eb | 59 | //Ticker clk_speed; |
allesh | 1:b24bac622a37 | 60 | Timeout FrameTimeoutCW; |
allesh | 1:b24bac622a37 | 61 | Timeout BounceTimeoutCW; |
allesh | 1:b24bac622a37 | 62 | Timeout FrameTimeoutCCW; |
allesh | 1:b24bac622a37 | 63 | Timeout BounceTimeoutCCW; |
allesh | 1:b24bac622a37 | 64 | |
ankazwork | 0:eb99909151eb | 65 | /**************************************************************** |
ankazwork | 0:eb99909151eb | 66 | * Threads |
ankazwork | 0:eb99909151eb | 67 | ****************************************************************/ |
allesh | 1:b24bac622a37 | 68 | Thread sensor_daemon; |
ankazwork | 0:eb99909151eb | 69 | |
ankazwork | 0:eb99909151eb | 70 | /***************************************************************** |
ankazwork | 0:eb99909151eb | 71 | * Global variables |
ankazwork | 0:eb99909151eb | 72 | ******************************************************************/ |
ankazwork | 0:eb99909151eb | 73 | |
ankazwork | 0:eb99909151eb | 74 | |
ankazwork | 0:eb99909151eb | 75 | //---------------- |
ankazwork | 0:eb99909151eb | 76 | uint8_t button_event; |
ankazwork | 0:eb99909151eb | 77 | uint8_t mode=0; |
ankazwork | 0:eb99909151eb | 78 | uint8_t RotateDir; |
ankazwork | 0:eb99909151eb | 79 | uint16_t RotateSpeed; |
allesh | 1:b24bac622a37 | 80 | |
ankazwork | 0:eb99909151eb | 81 | //---------------- |
ankazwork | 0:eb99909151eb | 82 | uint8_t SensorsEn=1; |
ankazwork | 0:eb99909151eb | 83 | |
ankazwork | 0:eb99909151eb | 84 | int16_t M[3]; |
ankazwork | 0:eb99909151eb | 85 | uint8_t point; |
ankazwork | 0:eb99909151eb | 86 | uint32_t rotate_cnt; |
ankazwork | 0:eb99909151eb | 87 | //--------- |
allesh | 1:b24bac622a37 | 88 | uint8_t DebounceCW=0; |
allesh | 1:b24bac622a37 | 89 | uint8_t cntCW=0; |
allesh | 1:b24bac622a37 | 90 | uint8_t NewCWMode=0; |
allesh | 1:b24bac622a37 | 91 | uint8_t DebounceCCW=0; |
allesh | 1:b24bac622a37 | 92 | uint8_t cntCCW=0; |
allesh | 1:b24bac622a37 | 93 | uint8_t NewCCWMode=0; |
ankazwork | 0:eb99909151eb | 94 | //------------------ |
ankazwork | 0:eb99909151eb | 95 | |
ankazwork | 0:eb99909151eb | 96 | /****************************************************************** |
ankazwork | 0:eb99909151eb | 97 | * Main |
ankazwork | 0:eb99909151eb | 98 | ******************************************************************/ |
ankazwork | 0:eb99909151eb | 99 | int main() |
ankazwork | 0:eb99909151eb | 100 | { |
ankazwork | 0:eb99909151eb | 101 | // Initialise the digital pin LED1 as an output |
ankazwork | 0:eb99909151eb | 102 | |
ankazwork | 0:eb99909151eb | 103 | Ini(); |
ankazwork | 0:eb99909151eb | 104 | |
ankazwork | 0:eb99909151eb | 105 | while (true) { |
ankazwork | 0:eb99909151eb | 106 | //led = !led; |
ankazwork | 0:eb99909151eb | 107 | HowManyClicks(); |
ankazwork | 0:eb99909151eb | 108 | if (mode){ |
ankazwork | 0:eb99909151eb | 109 | |
ankazwork | 0:eb99909151eb | 110 | } |
ankazwork | 0:eb99909151eb | 111 | if (point){ |
ankazwork | 0:eb99909151eb | 112 | motor.step(POINTS, RotateDir, RotateSpeed); |
ankazwork | 0:eb99909151eb | 113 | }else |
ankazwork | 0:eb99909151eb | 114 | wait_us(step_speed); |
ankazwork | 0:eb99909151eb | 115 | |
ankazwork | 0:eb99909151eb | 116 | //thread_sleep_for(BLINKING_RATE_MS); |
ankazwork | 0:eb99909151eb | 117 | } |
ankazwork | 0:eb99909151eb | 118 | } |
ankazwork | 0:eb99909151eb | 119 | |
ankazwork | 0:eb99909151eb | 120 | /********************************************************** |
ankazwork | 0:eb99909151eb | 121 | * Functions |
ankazwork | 0:eb99909151eb | 122 | ***********************************************************/ |
ankazwork | 0:eb99909151eb | 123 | void Ini() |
ankazwork | 0:eb99909151eb | 124 | { |
ankazwork | 0:eb99909151eb | 125 | pc.baud(115200); |
ankazwork | 0:eb99909151eb | 126 | ButtonIni(&BlueBatton); |
allesh | 1:b24bac622a37 | 127 | //button_event_ind=button_event=0; |
ankazwork | 0:eb99909151eb | 128 | |
ankazwork | 0:eb99909151eb | 129 | |
ankazwork | 0:eb99909151eb | 130 | //-------------- |
ankazwork | 0:eb99909151eb | 131 | |
ankazwork | 0:eb99909151eb | 132 | sensor_daemon.start(sensors_task); |
ankazwork | 0:eb99909151eb | 133 | SensorsEn=1; |
ankazwork | 0:eb99909151eb | 134 | polling_sensors.attach(&polling_sensors_isr, 0.4); |
allesh | 1:b24bac622a37 | 135 | //clk_speed.attach(&clk_speed_isr, 0.01); |
ankazwork | 0:eb99909151eb | 136 | mode=0; |
ankazwork | 0:eb99909151eb | 137 | point=0; |
ankazwork | 0:eb99909151eb | 138 | RotateSpeed=step_speed; |
ankazwork | 0:eb99909151eb | 139 | rotate_cnt=0; |
allesh | 1:b24bac622a37 | 140 | CW_switch.fall(&CW_switch_isr); |
allesh | 1:b24bac622a37 | 141 | CCW_switch.fall(&CCW_switch_isr); |
ankazwork | 0:eb99909151eb | 142 | } |
ankazwork | 0:eb99909151eb | 143 | |
ankazwork | 0:eb99909151eb | 144 | //------------------ |
ankazwork | 0:eb99909151eb | 145 | void HowManyClicks() |
ankazwork | 0:eb99909151eb | 146 | { |
allesh | 1:b24bac622a37 | 147 | WhatButtonMode(&button_event); |
ankazwork | 0:eb99909151eb | 148 | if(button_event) { |
ankazwork | 0:eb99909151eb | 149 | switch (button_event) { |
ankazwork | 0:eb99909151eb | 150 | case 1: |
ankazwork | 0:eb99909151eb | 151 | mode=0; |
ankazwork | 0:eb99909151eb | 152 | point=0; |
ankazwork | 0:eb99909151eb | 153 | break; |
ankazwork | 0:eb99909151eb | 154 | case 2: |
ankazwork | 0:eb99909151eb | 155 | mode=1; |
allesh | 1:b24bac622a37 | 156 | point=1; |
allesh | 1:b24bac622a37 | 157 | RotateDir=0; |
allesh | 1:b24bac622a37 | 158 | RotateSpeed=step_speed; |
ankazwork | 0:eb99909151eb | 159 | break; |
ankazwork | 0:eb99909151eb | 160 | case 3: |
ankazwork | 0:eb99909151eb | 161 | mode=2; |
ankazwork | 0:eb99909151eb | 162 | point=0; |
ankazwork | 0:eb99909151eb | 163 | //RotateDir=0; |
ankazwork | 0:eb99909151eb | 164 | //RotateSpeed=step_speed; |
ankazwork | 0:eb99909151eb | 165 | break; |
ankazwork | 0:eb99909151eb | 166 | case 4: |
ankazwork | 0:eb99909151eb | 167 | mode=3; |
ankazwork | 0:eb99909151eb | 168 | point=0; |
ankazwork | 0:eb99909151eb | 169 | //RotateDir=1; |
ankazwork | 0:eb99909151eb | 170 | //RotateSpeed=step_speed; |
ankazwork | 0:eb99909151eb | 171 | break; |
ankazwork | 0:eb99909151eb | 172 | case 5: |
ankazwork | 0:eb99909151eb | 173 | mode=4; |
ankazwork | 0:eb99909151eb | 174 | point=0; |
ankazwork | 0:eb99909151eb | 175 | //RotateSpeed=step_speed*2; |
ankazwork | 0:eb99909151eb | 176 | //RotateDir=0; |
ankazwork | 0:eb99909151eb | 177 | break; |
ankazwork | 0:eb99909151eb | 178 | case 6: |
ankazwork | 0:eb99909151eb | 179 | mode=5; |
ankazwork | 0:eb99909151eb | 180 | point=1; |
ankazwork | 0:eb99909151eb | 181 | RotateSpeed=step_speed*2; |
ankazwork | 0:eb99909151eb | 182 | RotateDir=1; |
ankazwork | 0:eb99909151eb | 183 | break; |
ankazwork | 0:eb99909151eb | 184 | case 7: |
ankazwork | 0:eb99909151eb | 185 | |
ankazwork | 0:eb99909151eb | 186 | break; |
ankazwork | 0:eb99909151eb | 187 | |
ankazwork | 0:eb99909151eb | 188 | default: |
ankazwork | 0:eb99909151eb | 189 | break; |
ankazwork | 0:eb99909151eb | 190 | } |
ankazwork | 0:eb99909151eb | 191 | button_event=0; |
ankazwork | 0:eb99909151eb | 192 | } |
ankazwork | 0:eb99909151eb | 193 | } |
ankazwork | 0:eb99909151eb | 194 | |
ankazwork | 0:eb99909151eb | 195 | //----------------- |
ankazwork | 0:eb99909151eb | 196 | void sensors_task() |
ankazwork | 0:eb99909151eb | 197 | { |
ankazwork | 0:eb99909151eb | 198 | int status; |
ankazwork | 0:eb99909151eb | 199 | char text[5]; |
ankazwork | 0:eb99909151eb | 200 | int32_t dif; |
ankazwork | 0:eb99909151eb | 201 | |
ankazwork | 0:eb99909151eb | 202 | while (true) { |
ankazwork | 0:eb99909151eb | 203 | ThisThread::flags_wait_any(0x1,true); |
ankazwork | 0:eb99909151eb | 204 | SensorsEn=0; |
allesh | 1:b24bac622a37 | 205 | |
ankazwork | 0:eb99909151eb | 206 | switch(mode){ |
ankazwork | 0:eb99909151eb | 207 | case 0: |
allesh | 1:b24bac622a37 | 208 | // sprintf(text,"c%3d",distance_c); |
ankazwork | 0:eb99909151eb | 209 | break; |
ankazwork | 0:eb99909151eb | 210 | case 1: |
allesh | 1:b24bac622a37 | 211 | //sprintf(text,"l%3d", distance_l); |
ankazwork | 0:eb99909151eb | 212 | break; |
ankazwork | 0:eb99909151eb | 213 | case 2: |
allesh | 1:b24bac622a37 | 214 | //sprintf(text,"r%3d", distance_r); |
ankazwork | 0:eb99909151eb | 215 | break; |
ankazwork | 0:eb99909151eb | 216 | case 3: |
allesh | 1:b24bac622a37 | 217 | |
ankazwork | 0:eb99909151eb | 218 | break; |
ankazwork | 0:eb99909151eb | 219 | case 4: |
allesh | 1:b24bac622a37 | 220 | //sprintf(text,"%d",G[0]); |
ankazwork | 0:eb99909151eb | 221 | break; |
ankazwork | 0:eb99909151eb | 222 | case 5: |
allesh | 1:b24bac622a37 | 223 | //sprintf(text,"%d",dur_time); |
ankazwork | 0:eb99909151eb | 224 | break; |
ankazwork | 0:eb99909151eb | 225 | default: |
ankazwork | 0:eb99909151eb | 226 | sprintf(text,"----"); |
ankazwork | 0:eb99909151eb | 227 | break; |
allesh | 1:b24bac622a37 | 228 | } |
ankazwork | 0:eb99909151eb | 229 | SensorsEn=1; |
ankazwork | 0:eb99909151eb | 230 | } |
ankazwork | 0:eb99909151eb | 231 | } |
ankazwork | 0:eb99909151eb | 232 | |
ankazwork | 0:eb99909151eb | 233 | /********************************************************** |
ankazwork | 0:eb99909151eb | 234 | * Interrupt Service Routines |
ankazwork | 0:eb99909151eb | 235 | ***********************************************************/ |
allesh | 1:b24bac622a37 | 236 | void FrameTimeoutCW_isr() |
ankazwork | 0:eb99909151eb | 237 | { |
allesh | 1:b24bac622a37 | 238 | NewCWMode=cnt; |
allesh | 1:b24bac622a37 | 239 | cntCW=0; |
allesh | 1:b24bac622a37 | 240 | } |
allesh | 1:b24bac622a37 | 241 | |
ankazwork | 0:eb99909151eb | 242 | //--------------------- |
allesh | 1:b24bac622a37 | 243 | void BounceTimeoutCW_isr() |
allesh | 1:b24bac622a37 | 244 | { |
allesh | 1:b24bac622a37 | 245 | DebounceCW=0; |
allesh | 1:b24bac622a37 | 246 | |
allesh | 1:b24bac622a37 | 247 | } |
ankazwork | 0:eb99909151eb | 248 | |
allesh | 1:b24bac622a37 | 249 | void FrameTimeoutCCW_isr() |
allesh | 1:b24bac622a37 | 250 | { |
allesh | 1:b24bac622a37 | 251 | NewCCWMode=cnt; |
allesh | 1:b24bac622a37 | 252 | cntCCW=0; |
allesh | 1:b24bac622a37 | 253 | } |
allesh | 1:b24bac622a37 | 254 | |
allesh | 1:b24bac622a37 | 255 | //--------------------- |
allesh | 1:b24bac622a37 | 256 | void BounceTimeoutCCW_isr() |
allesh | 1:b24bac622a37 | 257 | { |
allesh | 1:b24bac622a37 | 258 | DebounceCCW=0; |
allesh | 1:b24bac622a37 | 259 | |
allesh | 1:b24bac622a37 | 260 | } |
ankazwork | 0:eb99909151eb | 261 | //--------------------- |
ankazwork | 0:eb99909151eb | 262 | void polling_sensors_isr() |
ankazwork | 0:eb99909151eb | 263 | { |
ankazwork | 0:eb99909151eb | 264 | if (SensorsEn){ |
ankazwork | 0:eb99909151eb | 265 | sensor_daemon.flags_set(0x1); |
allesh | 1:b24bac622a37 | 266 | led1 = !led1; |
ankazwork | 0:eb99909151eb | 267 | } |
ankazwork | 0:eb99909151eb | 268 | } |
allesh | 1:b24bac622a37 | 269 | void CW_switch_isr() |
allesh | 1:b24bac622a37 | 270 | { |
allesh | 1:b24bac622a37 | 271 | if(DebounceCW==0){ |
allesh | 1:b24bac622a37 | 272 | DebounceCW=1; |
allesh | 1:b24bac622a37 | 273 | cntCW++; |
allesh | 1:b24bac622a37 | 274 | FrameTimeoutCW.detach(); |
allesh | 1:b24bac622a37 | 275 | FrameTimeoutCW.attach(FrameTimeoutCW_isr,1.0); |
allesh | 1:b24bac622a37 | 276 | BounceTimeoutCW.attach(BounceTimeoutCW_isr,0.2); |
allesh | 1:b24bac622a37 | 277 | } |
allesh | 1:b24bac622a37 | 278 | } |
allesh | 1:b24bac622a37 | 279 | void CCW_switch_isr() |
allesh | 1:b24bac622a37 | 280 | { |
allesh | 1:b24bac622a37 | 281 | if(DebounceCCW==0){ |
allesh | 1:b24bac622a37 | 282 | DebounceCCW=1; |
allesh | 1:b24bac622a37 | 283 | cntCCW++; |
allesh | 1:b24bac622a37 | 284 | FrameTimeoutCCW.detach(); |
allesh | 1:b24bac622a37 | 285 | FrameTimeoutCCW.attach(FrameTimeoutCCW_isr,1.0); |
allesh | 1:b24bac622a37 | 286 | BounceTimeoutCCW.attach(BounceTimeoutCCW_isr,0.2); |
allesh | 1:b24bac622a37 | 287 | } |
allesh | 1:b24bac622a37 | 288 | } |
ankazwork | 0:eb99909151eb | 289 | //--------------------------------- |
allesh | 1:b24bac622a37 | 290 | /*void clk_speed_isr() |
ankazwork | 0:eb99909151eb | 291 | { |
ankazwork | 0:eb99909151eb | 292 | rotate_cnt++; |
ankazwork | 0:eb99909151eb | 293 | if (rotate_cnt>10) |
ankazwork | 0:eb99909151eb | 294 | dur_time_en=1; |
allesh | 1:b24bac622a37 | 295 | }*/ |