BME SmartLab
/
_Smart_vacuum_0v2
Remote controlled robot with LEDs and Wemos motor shield
main.cpp@0:51c02b15eb70, 2017-09-27 (annotated)
- Committer:
- Makodan
- Date:
- Wed Sep 27 16:03:48 2017 +0000
- Revision:
- 0:51c02b15eb70
Remote controlled robot with LEDs and Wemos motor shield
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Makodan | 0:51c02b15eb70 | 1 | #include "mbed.h" |
Makodan | 0:51c02b15eb70 | 2 | #include "config.h" |
Makodan | 0:51c02b15eb70 | 3 | #include "main.h" |
Makodan | 0:51c02b15eb70 | 4 | #include "RF24.h" |
Makodan | 0:51c02b15eb70 | 5 | #include "wemos_mc.h" |
Makodan | 0:51c02b15eb70 | 6 | |
Makodan | 0:51c02b15eb70 | 7 | /* |
Makodan | 0:51c02b15eb70 | 8 | * Constructors and pin settings |
Makodan | 0:51c02b15eb70 | 9 | */ |
Makodan | 0:51c02b15eb70 | 10 | DigitalOut myled(ledpin); |
Makodan | 0:51c02b15eb70 | 11 | RF24 radio(spi_MOSI, spi_MISO, spi_SCK, nrf_CE, nrf_CSN ); |
Makodan | 0:51c02b15eb70 | 12 | |
Makodan | 0:51c02b15eb70 | 13 | I2C ms(i2c_sda, i2c_scl); |
Makodan | 0:51c02b15eb70 | 14 | |
Makodan | 0:51c02b15eb70 | 15 | InterruptIn receive(nrf_irq); |
Makodan | 0:51c02b15eb70 | 16 | InterruptIn bumper(bump); |
Makodan | 0:51c02b15eb70 | 17 | //InterruptIn odomet(odom); |
Makodan | 0:51c02b15eb70 | 18 | |
Makodan | 0:51c02b15eb70 | 19 | DigitalOut strip_red(red); |
Makodan | 0:51c02b15eb70 | 20 | DigitalOut strip_blue(green); |
Makodan | 0:51c02b15eb70 | 21 | DigitalOut strip_green(blue); |
Makodan | 0:51c02b15eb70 | 22 | |
Makodan | 0:51c02b15eb70 | 23 | /* |
Makodan | 0:51c02b15eb70 | 24 | * Global variables |
Makodan | 0:51c02b15eb70 | 25 | */ |
Makodan | 0:51c02b15eb70 | 26 | volatile char rec; |
Makodan | 0:51c02b15eb70 | 27 | volatile float _pwm = 0; |
Makodan | 0:51c02b15eb70 | 28 | volatile bool newmsg_flag=0; |
Makodan | 0:51c02b15eb70 | 29 | volatile bool stop_flag=0; |
Makodan | 0:51c02b15eb70 | 30 | volatile dataIN input; |
Makodan | 0:51c02b15eb70 | 31 | volatile uint32_t roll_counter = 0; |
Makodan | 0:51c02b15eb70 | 32 | |
Makodan | 0:51c02b15eb70 | 33 | /* |
Makodan | 0:51c02b15eb70 | 34 | * Private function prototypes |
Makodan | 0:51c02b15eb70 | 35 | */ |
Makodan | 0:51c02b15eb70 | 36 | void RadioSetup(); |
Makodan | 0:51c02b15eb70 | 37 | void change_strip(uint16_t col); |
Makodan | 0:51c02b15eb70 | 38 | void startAnimation(); |
Makodan | 0:51c02b15eb70 | 39 | |
Makodan | 0:51c02b15eb70 | 40 | /* |
Makodan | 0:51c02b15eb70 | 41 | * Interrupt callbacks |
Makodan | 0:51c02b15eb70 | 42 | */ |
Makodan | 0:51c02b15eb70 | 43 | void read_radio(){ |
Makodan | 0:51c02b15eb70 | 44 | dataIN tmp; |
Makodan | 0:51c02b15eb70 | 45 | myled = !myled; |
Makodan | 0:51c02b15eb70 | 46 | radio.read(&tmp,sizeof(tmp)); |
Makodan | 0:51c02b15eb70 | 47 | if(tmp.ID == OWN_ID){ |
Makodan | 0:51c02b15eb70 | 48 | input.dir_L = tmp.dir_L; |
Makodan | 0:51c02b15eb70 | 49 | input.pwm_L = tmp.pwm_L; |
Makodan | 0:51c02b15eb70 | 50 | input.dir_R = tmp.dir_R; |
Makodan | 0:51c02b15eb70 | 51 | input.pwm_R = tmp.pwm_R; |
Makodan | 0:51c02b15eb70 | 52 | input.led = tmp.led; |
Makodan | 0:51c02b15eb70 | 53 | newmsg_flag=1; |
Makodan | 0:51c02b15eb70 | 54 | } |
Makodan | 0:51c02b15eb70 | 55 | } |
Makodan | 0:51c02b15eb70 | 56 | |
Makodan | 0:51c02b15eb70 | 57 | void front_hit(){ |
Makodan | 0:51c02b15eb70 | 58 | //blinking_flag = 1; |
Makodan | 0:51c02b15eb70 | 59 | //blinking_phase = 0; |
Makodan | 0:51c02b15eb70 | 60 | |
Makodan | 0:51c02b15eb70 | 61 | stop_flag=1; |
Makodan | 0:51c02b15eb70 | 62 | } |
Makodan | 0:51c02b15eb70 | 63 | |
Makodan | 0:51c02b15eb70 | 64 | void roll(){ |
Makodan | 0:51c02b15eb70 | 65 | roll_counter++; |
Makodan | 0:51c02b15eb70 | 66 | |
Makodan | 0:51c02b15eb70 | 67 | if(roll_counter % 2) change_strip(GREEN); |
Makodan | 0:51c02b15eb70 | 68 | if(roll_counter % 3) change_strip(OFF); |
Makodan | 0:51c02b15eb70 | 69 | |
Makodan | 0:51c02b15eb70 | 70 | } |
Makodan | 0:51c02b15eb70 | 71 | |
Makodan | 0:51c02b15eb70 | 72 | int main(){ |
Makodan | 0:51c02b15eb70 | 73 | ms.frequency(100000); |
Makodan | 0:51c02b15eb70 | 74 | setfreq(ms, 1000); |
Makodan | 0:51c02b15eb70 | 75 | |
Makodan | 0:51c02b15eb70 | 76 | setmotor(ms, _MOTOR_L, _STOP, 0); |
Makodan | 0:51c02b15eb70 | 77 | setmotor(ms, _MOTOR_R, _STOP, 0); |
Makodan | 0:51c02b15eb70 | 78 | change_strip(OFF); |
Makodan | 0:51c02b15eb70 | 79 | |
Makodan | 0:51c02b15eb70 | 80 | RadioSetup(); |
Makodan | 0:51c02b15eb70 | 81 | radio.startListening(); |
Makodan | 0:51c02b15eb70 | 82 | |
Makodan | 0:51c02b15eb70 | 83 | startAnimation(); |
Makodan | 0:51c02b15eb70 | 84 | |
Makodan | 0:51c02b15eb70 | 85 | receive.fall(&read_radio); |
Makodan | 0:51c02b15eb70 | 86 | bumper.rise(&front_hit); |
Makodan | 0:51c02b15eb70 | 87 | // odomet.rise(&roll); |
Makodan | 0:51c02b15eb70 | 88 | |
Makodan | 0:51c02b15eb70 | 89 | |
Makodan | 0:51c02b15eb70 | 90 | |
Makodan | 0:51c02b15eb70 | 91 | |
Makodan | 0:51c02b15eb70 | 92 | while(1){ |
Makodan | 0:51c02b15eb70 | 93 | |
Makodan | 0:51c02b15eb70 | 94 | if(newmsg_flag == 1){ |
Makodan | 0:51c02b15eb70 | 95 | setmotor(ms, _MOTOR_L, (uint8_t)input.dir_L, input.pwm_L); |
Makodan | 0:51c02b15eb70 | 96 | wait_ms(10); |
Makodan | 0:51c02b15eb70 | 97 | setmotor(ms, _MOTOR_R, (uint8_t)input.dir_R, input.pwm_R); |
Makodan | 0:51c02b15eb70 | 98 | change_strip(input.led); |
Makodan | 0:51c02b15eb70 | 99 | newmsg_flag = 0; |
Makodan | 0:51c02b15eb70 | 100 | } |
Makodan | 0:51c02b15eb70 | 101 | |
Makodan | 0:51c02b15eb70 | 102 | if(stop_flag == 1){ |
Makodan | 0:51c02b15eb70 | 103 | setmotor(ms, _MOTOR_L, _STOP, 0); |
Makodan | 0:51c02b15eb70 | 104 | setmotor(ms, _MOTOR_R, _STOP, 0); |
Makodan | 0:51c02b15eb70 | 105 | change_strip(RED); |
Makodan | 0:51c02b15eb70 | 106 | wait(2); |
Makodan | 0:51c02b15eb70 | 107 | change_strip(OFF); |
Makodan | 0:51c02b15eb70 | 108 | stop_flag = 0; |
Makodan | 0:51c02b15eb70 | 109 | } |
Makodan | 0:51c02b15eb70 | 110 | |
Makodan | 0:51c02b15eb70 | 111 | /* |
Makodan | 0:51c02b15eb70 | 112 | if(blinking_phase<5 && blinking_flag == 1){ |
Makodan | 0:51c02b15eb70 | 113 | change_strip(current_col); |
Makodan | 0:51c02b15eb70 | 114 | wait_ms(250); |
Makodan | 0:51c02b15eb70 | 115 | change_strip(OFF); |
Makodan | 0:51c02b15eb70 | 116 | wait_ms(250); |
Makodan | 0:51c02b15eb70 | 117 | blinking_phase++; |
Makodan | 0:51c02b15eb70 | 118 | } |
Makodan | 0:51c02b15eb70 | 119 | */ |
Makodan | 0:51c02b15eb70 | 120 | |
Makodan | 0:51c02b15eb70 | 121 | } |
Makodan | 0:51c02b15eb70 | 122 | |
Makodan | 0:51c02b15eb70 | 123 | |
Makodan | 0:51c02b15eb70 | 124 | } |
Makodan | 0:51c02b15eb70 | 125 | |
Makodan | 0:51c02b15eb70 | 126 | void RadioSetup(){ |
Makodan | 0:51c02b15eb70 | 127 | |
Makodan | 0:51c02b15eb70 | 128 | radio.begin(); |
Makodan | 0:51c02b15eb70 | 129 | radio.setPALevel(RF24_PA_HIGH); |
Makodan | 0:51c02b15eb70 | 130 | radio.setChannel(RadioChannel); |
Makodan | 0:51c02b15eb70 | 131 | radio.setRetries(0,2); |
Makodan | 0:51c02b15eb70 | 132 | radio.enableDynamicAck(); |
Makodan | 0:51c02b15eb70 | 133 | radio.enableDynamicPayloads(); |
Makodan | 0:51c02b15eb70 | 134 | radio.openReadingPipe(1,DataAddress); |
Makodan | 0:51c02b15eb70 | 135 | radio.maskIRQ(1,1,0); |
Makodan | 0:51c02b15eb70 | 136 | } |
Makodan | 0:51c02b15eb70 | 137 | |
Makodan | 0:51c02b15eb70 | 138 | void change_strip(uint16_t col){ |
Makodan | 0:51c02b15eb70 | 139 | |
Makodan | 0:51c02b15eb70 | 140 | switch(col){ |
Makodan | 0:51c02b15eb70 | 141 | case RED: |
Makodan | 0:51c02b15eb70 | 142 | strip_red = 1; |
Makodan | 0:51c02b15eb70 | 143 | strip_blue = 0; |
Makodan | 0:51c02b15eb70 | 144 | strip_green=0; |
Makodan | 0:51c02b15eb70 | 145 | break; |
Makodan | 0:51c02b15eb70 | 146 | case GREEN: |
Makodan | 0:51c02b15eb70 | 147 | strip_red = 0; |
Makodan | 0:51c02b15eb70 | 148 | strip_blue = 0; |
Makodan | 0:51c02b15eb70 | 149 | strip_green = 1; |
Makodan | 0:51c02b15eb70 | 150 | break; |
Makodan | 0:51c02b15eb70 | 151 | case BLUE: |
Makodan | 0:51c02b15eb70 | 152 | strip_red = 0; |
Makodan | 0:51c02b15eb70 | 153 | strip_blue = 1; |
Makodan | 0:51c02b15eb70 | 154 | strip_green = 0; |
Makodan | 0:51c02b15eb70 | 155 | break; |
Makodan | 0:51c02b15eb70 | 156 | case YELLOW: |
Makodan | 0:51c02b15eb70 | 157 | strip_red = 1; |
Makodan | 0:51c02b15eb70 | 158 | strip_blue = 0; |
Makodan | 0:51c02b15eb70 | 159 | strip_green = 1; |
Makodan | 0:51c02b15eb70 | 160 | break; |
Makodan | 0:51c02b15eb70 | 161 | case MAGENTA: |
Makodan | 0:51c02b15eb70 | 162 | strip_red = 1; |
Makodan | 0:51c02b15eb70 | 163 | strip_blue = 1; |
Makodan | 0:51c02b15eb70 | 164 | strip_green = 0; |
Makodan | 0:51c02b15eb70 | 165 | break; |
Makodan | 0:51c02b15eb70 | 166 | case CYAN: |
Makodan | 0:51c02b15eb70 | 167 | strip_red = 0; |
Makodan | 0:51c02b15eb70 | 168 | strip_blue = 1; |
Makodan | 0:51c02b15eb70 | 169 | strip_green = 1; |
Makodan | 0:51c02b15eb70 | 170 | break; |
Makodan | 0:51c02b15eb70 | 171 | case WHITE: |
Makodan | 0:51c02b15eb70 | 172 | strip_red = 1; |
Makodan | 0:51c02b15eb70 | 173 | strip_blue = 1; |
Makodan | 0:51c02b15eb70 | 174 | strip_green = 1; |
Makodan | 0:51c02b15eb70 | 175 | break; |
Makodan | 0:51c02b15eb70 | 176 | case OFF: |
Makodan | 0:51c02b15eb70 | 177 | strip_red = 0; |
Makodan | 0:51c02b15eb70 | 178 | strip_blue = 0; |
Makodan | 0:51c02b15eb70 | 179 | strip_green = 0; |
Makodan | 0:51c02b15eb70 | 180 | break; |
Makodan | 0:51c02b15eb70 | 181 | } |
Makodan | 0:51c02b15eb70 | 182 | |
Makodan | 0:51c02b15eb70 | 183 | } |
Makodan | 0:51c02b15eb70 | 184 | |
Makodan | 0:51c02b15eb70 | 185 | void startAnimation(){ |
Makodan | 0:51c02b15eb70 | 186 | |
Makodan | 0:51c02b15eb70 | 187 | change_strip(RED); |
Makodan | 0:51c02b15eb70 | 188 | wait_ms(500); |
Makodan | 0:51c02b15eb70 | 189 | change_strip(GREEN); |
Makodan | 0:51c02b15eb70 | 190 | wait_ms(500); |
Makodan | 0:51c02b15eb70 | 191 | change_strip(BLUE); |
Makodan | 0:51c02b15eb70 | 192 | wait_ms(500); |
Makodan | 0:51c02b15eb70 | 193 | change_strip(OFF); |
Makodan | 0:51c02b15eb70 | 194 | |
Makodan | 0:51c02b15eb70 | 195 | } |