Nurbol Nurdaulet / Mbed 2 deprecated 2sensors_2servo_22_11_11
Committer:
Nurbol
Date:
Tue Nov 22 15:37:21 2011 +0000
Revision:
0:e5b9c99f23f2
Child:
1:9b749b30afc9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nurbol 0:e5b9c99f23f2 1 //
Nurbol 0:e5b9c99f23f2 2 // COM_test : program to communicate via a COM port to a PC/laptop
Nurbol 0:e5b9c99f23f2 3 // ========
Nurbol 0:e5b9c99f23f2 4 //
Nurbol 0:e5b9c99f23f2 5 // Description
Nurbol 0:e5b9c99f23f2 6 // Program to receive ASCII format commands through a virtual COM port and
Nurbol 0:e5b9c99f23f2 7 // after executing the command return some data (optional, depending on
Nurbol 0:e5b9c99f23f2 8 // the command) and a status value.
Nurbol 0:e5b9c99f23f2 9 // The program understands two possible commands :
Nurbol 0:e5b9c99f23f2 10 // "s i j" : move servo 'i (0 to 5) to postion 'j' (0 to 90)
Nurbol 0:e5b9c99f23f2 11 // "r" : read the 'i' parameter of the last "s" command
Nurbol 0:e5b9c99f23f2 12 //
Nurbol 0:e5b9c99f23f2 13 // Version : 1.0
Nurbol 0:e5b9c99f23f2 14 // Author : Jim Herd
Nurbol 0:e5b9c99f23f2 15 // Date : 5th Oct 2011
Nurbol 0:e5b9c99f23f2 16 //
Nurbol 0:e5b9c99f23f2 17 #include "mbed.h"
Nurbol 0:e5b9c99f23f2 18 #include "MCP23017.h"
Nurbol 0:e5b9c99f23f2 19 #include "WattBob_TextLCD.h"
Nurbol 0:e5b9c99f23f2 20 #include "cmd_io.h"
Nurbol 0:e5b9c99f23f2 21 #include "globals.h"
Nurbol 0:e5b9c99f23f2 22
Nurbol 0:e5b9c99f23f2 23
Nurbol 0:e5b9c99f23f2 24
Nurbol 0:e5b9c99f23f2 25 Ticker timer1p;
Nurbol 0:e5b9c99f23f2 26 Ticker timer2p;
Nurbol 0:e5b9c99f23f2 27 Ticker timercounter1p;
Nurbol 0:e5b9c99f23f2 28 Ticker timercounter2p;
Nurbol 0:e5b9c99f23f2 29
Nurbol 0:e5b9c99f23f2 30
Nurbol 0:e5b9c99f23f2 31 AnalogIn sensor1(p15);
Nurbol 0:e5b9c99f23f2 32 AnalogIn sensor2(p16);
Nurbol 0:e5b9c99f23f2 33 AnalogOut valueLED1(p18);
Nurbol 0:e5b9c99f23f2 34 DigitalOut valueLED2(p25);
Nurbol 0:e5b9c99f23f2 35
Nurbol 0:e5b9c99f23f2 36
Nurbol 0:e5b9c99f23f2 37 DigitalOut led1(LED1);
Nurbol 0:e5b9c99f23f2 38 DigitalOut led2(LED2);
Nurbol 0:e5b9c99f23f2 39 DigitalOut led3(LED3);
Nurbol 0:e5b9c99f23f2 40 DigitalOut led4(LED4);
Nurbol 0:e5b9c99f23f2 41
Nurbol 0:e5b9c99f23f2 42 DigitalOut clk(p24);
Nurbol 0:e5b9c99f23f2 43
Nurbol 0:e5b9c99f23f2 44 AnalogIn counter1p(p19);
Nurbol 0:e5b9c99f23f2 45 AnalogIn counter2p(p20);
Nurbol 0:e5b9c99f23f2 46
Nurbol 0:e5b9c99f23f2 47
Nurbol 0:e5b9c99f23f2 48
Nurbol 0:e5b9c99f23f2 49
Nurbol 0:e5b9c99f23f2 50
Nurbol 0:e5b9c99f23f2 51 //******************************************************************************
Nurbol 0:e5b9c99f23f2 52 // declare functions
Nurbol 0:e5b9c99f23f2 53 //
Nurbol 0:e5b9c99f23f2 54 void sensor1p (void);
Nurbol 0:e5b9c99f23f2 55 void sensor2p (void);
Nurbol 0:e5b9c99f23f2 56 void counter1 (void);
Nurbol 0:e5b9c99f23f2 57 void counter2 (void);
Nurbol 0:e5b9c99f23f2 58
Nurbol 0:e5b9c99f23f2 59 //
Nurbol 0:e5b9c99f23f2 60 //
Nurbol 0:e5b9c99f23f2 61 // 2. five servo outputs
Nurbol 0:e5b9c99f23f2 62 //
Nurbol 0:e5b9c99f23f2 63
Nurbol 0:e5b9c99f23f2 64 PwmOut servo_0(p26);
Nurbol 0:e5b9c99f23f2 65 //PwmOut servo_1(p25);
Nurbol 0:e5b9c99f23f2 66 //PwmOut servo_2(p24);
Nurbol 0:e5b9c99f23f2 67 //PwmOut servo_3(p23);
Nurbol 0:e5b9c99f23f2 68 PwmOut servo_4(p22);
Nurbol 0:e5b9c99f23f2 69 PwmOut servo_5(p21);
Nurbol 0:e5b9c99f23f2 70
Nurbol 0:e5b9c99f23f2 71 //
Nurbol 0:e5b9c99f23f2 72 // 3. objects necessary to use the 2*16 character MBED display
Nurbol 0:e5b9c99f23f2 73 //
Nurbol 0:e5b9c99f23f2 74 MCP23017 *par_port;
Nurbol 0:e5b9c99f23f2 75 WattBob_TextLCD *lcd;
Nurbol 0:e5b9c99f23f2 76 //
Nurbol 0:e5b9c99f23f2 77 // 4. Virtual COM port over USB link to laptop/PC
Nurbol 0:e5b9c99f23f2 78 //
Nurbol 0:e5b9c99f23f2 79 Serial pc(USBTX, USBRX);
Nurbol 0:e5b9c99f23f2 80
Nurbol 0:e5b9c99f23f2 81 //******************************************************************************
Nurbol 0:e5b9c99f23f2 82 // Defined GLOBAL variables and structures
Nurbol 0:e5b9c99f23f2 83 //
Nurbol 0:e5b9c99f23f2 84 CMD_STRUCT ext_cmd, commandcounter2; // structure to hold command data
Nurbol 0:e5b9c99f23f2 85 STAT_STRUCT ext_stat; // structure to hold status reply
Nurbol 0:e5b9c99f23f2 86 //CMD_STRUCT commandcounter2;
Nurbol 0:e5b9c99f23f2 87
Nurbol 0:e5b9c99f23f2 88 uint32_t last_servo; // store for last servo number
Nurbol 0:e5b9c99f23f2 89
Nurbol 0:e5b9c99f23f2 90 //************************************************************************
Nurbol 0:e5b9c99f23f2 91 //************************************************************************
Nurbol 0:e5b9c99f23f2 92 // init_sys : initialise the system
Nurbol 0:e5b9c99f23f2 93 // ========
Nurbol 0:e5b9c99f23f2 94 //
Nurbol 0:e5b9c99f23f2 95 // 1. Configure 2*16 character display
Nurbol 0:e5b9c99f23f2 96 // 2. Print "COM test" string
Nurbol 0:e5b9c99f23f2 97 // 3. initialise relevant global variables
Nurbol 0:e5b9c99f23f2 98 // 4. set COM port baud rate to 19200 bits per second
Nurbol 0:e5b9c99f23f2 99 //
Nurbol 0:e5b9c99f23f2 100 void init_sys(void) {
Nurbol 0:e5b9c99f23f2 101
Nurbol 0:e5b9c99f23f2 102 par_port = new MCP23017(p9, p10, 0x40);
Nurbol 0:e5b9c99f23f2 103 lcd = new WattBob_TextLCD(par_port);
Nurbol 0:e5b9c99f23f2 104
Nurbol 0:e5b9c99f23f2 105 par_port->write_bit(1,BL_BIT); // turn LCD backlight ON
Nurbol 0:e5b9c99f23f2 106 lcd->cls();
Nurbol 0:e5b9c99f23f2 107 lcd->locate(0,0);
Nurbol 0:e5b9c99f23f2 108 lcd->printf("COM ");
Nurbol 0:e5b9c99f23f2 109
Nurbol 0:e5b9c99f23f2 110 servo_0.period(0.020); // servo requires a 20ms period, common for all 5 servo objects
Nurbol 0:e5b9c99f23f2 111 last_servo = SERVO_UNKNOWN;
Nurbol 0:e5b9c99f23f2 112 pc.baud(19200);
Nurbol 0:e5b9c99f23f2 113
Nurbol 0:e5b9c99f23f2 114 servo_0.pulsewidth_us(1000 + (0 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 115 servo_4.pulsewidth_us(1000 + (25 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 116 servo_5.pulsewidth_us(1000 + (0 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 117
Nurbol 0:e5b9c99f23f2 118 return;
Nurbol 0:e5b9c99f23f2 119 } // end init_sys
Nurbol 0:e5b9c99f23f2 120
Nurbol 0:e5b9c99f23f2 121 //************************************************************************
Nurbol 0:e5b9c99f23f2 122 // process_cmd : decode and execute command
Nurbol 0:e5b9c99f23f2 123 // ===========
Nurbol 0:e5b9c99f23f2 124 uint32_t process_cmd(CMD_STRUCT *command)
Nurbol 0:e5b9c99f23f2 125 {
Nurbol 0:e5b9c99f23f2 126 int32_t pulse_width;
Nurbol 0:e5b9c99f23f2 127
Nurbol 0:e5b9c99f23f2 128 switch (command->cmd_code) {
Nurbol 0:e5b9c99f23f2 129 //
Nurbol 0:e5b9c99f23f2 130 // move a servo
Nurbol 0:e5b9c99f23f2 131 //
Nurbol 0:e5b9c99f23f2 132 case SERVO_CMD :
Nurbol 0:e5b9c99f23f2 133 command->nos_data = 0; // no data to be returned
Nurbol 0:e5b9c99f23f2 134 //
Nurbol 0:e5b9c99f23f2 135 // check that parameters are OK
Nurbol 0:e5b9c99f23f2 136 //
Nurbol 0:e5b9c99f23f2 137 if (command->nos_params != 2) { // check for 2 parameters
Nurbol 0:e5b9c99f23f2 138 command->result_status = CMD_BAD_NUMBER_OF_PARAMETERS;
Nurbol 0:e5b9c99f23f2 139 break;
Nurbol 0:e5b9c99f23f2 140 }
Nurbol 0:e5b9c99f23f2 141 if (command->param[0] > MAX_SERVO_NUMBER ) { // check servo number
Nurbol 0:e5b9c99f23f2 142 command->result_status = CMD_BAD_SERVO_NUMBER;
Nurbol 0:e5b9c99f23f2 143 break;
Nurbol 0:e5b9c99f23f2 144 }
Nurbol 0:e5b9c99f23f2 145 if ((command->param[1] < MIN_SERVO_ANGLE) ||
Nurbol 0:e5b9c99f23f2 146 (command->param[1] > MAX_SERVO_ANGLE) ) {
Nurbol 0:e5b9c99f23f2 147 command->result_status = CMD_BAD_SERVO_VALUE;
Nurbol 0:e5b9c99f23f2 148 break;
Nurbol 0:e5b9c99f23f2 149 }
Nurbol 0:e5b9c99f23f2 150 if ((command->param[0] == 4) && (command->param[1] == 0)) {
Nurbol 0:e5b9c99f23f2 151 pulse_width = 0; // convert angle to pulse width
Nurbol 0:e5b9c99f23f2 152 }
Nurbol 0:e5b9c99f23f2 153 else{
Nurbol 0:e5b9c99f23f2 154 pulse_width = 1000 + (command->param[1] * 1000) / MAX_SERVO_ANGLE; // convert angle to pulse width
Nurbol 0:e5b9c99f23f2 155 }
Nurbol 0:e5b9c99f23f2 156
Nurbol 0:e5b9c99f23f2 157
Nurbol 0:e5b9c99f23f2 158
Nurbol 0:e5b9c99f23f2 159 //
Nurbol 0:e5b9c99f23f2 160 // implement servo move to all 5 servos
Nurbol 0:e5b9c99f23f2 161 //
Nurbol 0:e5b9c99f23f2 162 switch (command->param[0]) {
Nurbol 0:e5b9c99f23f2 163 case 0 : servo_0.pulsewidth_us(pulse_width); break;
Nurbol 0:e5b9c99f23f2 164 // case 1 : servo_1.pulsewidth_us(pulse_width); break;
Nurbol 0:e5b9c99f23f2 165 // case 2 : servo_2.pulsewidth_us(pulse_width); break;
Nurbol 0:e5b9c99f23f2 166 // case 3 : servo_3.pulsewidth_us(pulse_width); break;
Nurbol 0:e5b9c99f23f2 167 case 4 : servo_4.pulsewidth_us(pulse_width); break;
Nurbol 0:e5b9c99f23f2 168 // case 5 : servo_5.pulsewidth_us(pulse_width); break;
Nurbol 0:e5b9c99f23f2 169
Nurbol 0:e5b9c99f23f2 170 }
Nurbol 0:e5b9c99f23f2 171 last_servo = command->param[0];
Nurbol 0:e5b9c99f23f2 172 break;
Nurbol 0:e5b9c99f23f2 173 //
Nurbol 0:e5b9c99f23f2 174 // return last servo number
Nurbol 0:e5b9c99f23f2 175 //
Nurbol 0:e5b9c99f23f2 176 case READ_CMD :
Nurbol 0:e5b9c99f23f2 177 command->nos_data = 2; // no data to be returned
Nurbol 0:e5b9c99f23f2 178 command->result_data[0] = valueLED1;
Nurbol 0:e5b9c99f23f2 179 command->result_data[1] = valueLED2;
Nurbol 0:e5b9c99f23f2 180 break;
Nurbol 0:e5b9c99f23f2 181 //
Nurbol 0:e5b9c99f23f2 182 // catch any problems
Nurbol 0:e5b9c99f23f2 183 //
Nurbol 0:e5b9c99f23f2 184 default:
Nurbol 0:e5b9c99f23f2 185 command->nos_data = 0; // no data to be returned
Nurbol 0:e5b9c99f23f2 186 command->result_status = CMD_BAD_SERVO_VALUE;
Nurbol 0:e5b9c99f23f2 187 break;
Nurbol 0:e5b9c99f23f2 188 }
Nurbol 0:e5b9c99f23f2 189 return OK;
Nurbol 0:e5b9c99f23f2 190 }
Nurbol 0:e5b9c99f23f2 191
Nurbol 0:e5b9c99f23f2 192 //************************************************************************
Nurbol 0:e5b9c99f23f2 193
Nurbol 0:e5b9c99f23f2 194 //function to send value on the FPGA when 1p is detected
Nurbol 0:e5b9c99f23f2 195 void sensor1p (void){
Nurbol 0:e5b9c99f23f2 196 clk = !clk;
Nurbol 0:e5b9c99f23f2 197 wait(0.01);
Nurbol 0:e5b9c99f23f2 198 sensor1.read();
Nurbol 0:e5b9c99f23f2 199 if(sensor1 > 0.5) {
Nurbol 0:e5b9c99f23f2 200 led1 = 1;
Nurbol 0:e5b9c99f23f2 201 valueLED1 = 1;
Nurbol 0:e5b9c99f23f2 202 }
Nurbol 0:e5b9c99f23f2 203 else if(sensor1 < 0.5){
Nurbol 0:e5b9c99f23f2 204 led1 = 0;
Nurbol 0:e5b9c99f23f2 205 valueLED1 = 0;
Nurbol 0:e5b9c99f23f2 206 }
Nurbol 0:e5b9c99f23f2 207 }
Nurbol 0:e5b9c99f23f2 208
Nurbol 0:e5b9c99f23f2 209 //function to send value on the FPGA when 2p is detected
Nurbol 0:e5b9c99f23f2 210 void sensor2p (){
Nurbol 0:e5b9c99f23f2 211 sensor2.read();
Nurbol 0:e5b9c99f23f2 212 if(sensor2 > 0.5) {
Nurbol 0:e5b9c99f23f2 213 led2 = 1;
Nurbol 0:e5b9c99f23f2 214 valueLED2 = 1;
Nurbol 0:e5b9c99f23f2 215 }
Nurbol 0:e5b9c99f23f2 216 else if(sensor2 < 0.5){
Nurbol 0:e5b9c99f23f2 217 led2 = 0;
Nurbol 0:e5b9c99f23f2 218 valueLED2 = 0;
Nurbol 0:e5b9c99f23f2 219 }
Nurbol 0:e5b9c99f23f2 220 }
Nurbol 0:e5b9c99f23f2 221
Nurbol 0:e5b9c99f23f2 222 //function to move servo when we have counter1p equal to 10
Nurbol 0:e5b9c99f23f2 223 void counter1 (){
Nurbol 0:e5b9c99f23f2 224 if(counter1p > 0.5){
Nurbol 0:e5b9c99f23f2 225 led3 = 1;
Nurbol 0:e5b9c99f23f2 226 servo_4.pulsewidth_us(0);
Nurbol 0:e5b9c99f23f2 227 wait(1);
Nurbol 0:e5b9c99f23f2 228 servo_0.pulsewidth_us(1000 + (200 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 229 }
Nurbol 0:e5b9c99f23f2 230 else{
Nurbol 0:e5b9c99f23f2 231 led3 = 0;
Nurbol 0:e5b9c99f23f2 232 servo_0.pulsewidth_us(1000 + (0 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 233 if(counter2p < 0.5){
Nurbol 0:e5b9c99f23f2 234 servo_4.pulsewidth_us(1000 + (25 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 235 }
Nurbol 0:e5b9c99f23f2 236 }
Nurbol 0:e5b9c99f23f2 237 }
Nurbol 0:e5b9c99f23f2 238
Nurbol 0:e5b9c99f23f2 239 //function to move servo when we have counter2p equal to 5
Nurbol 0:e5b9c99f23f2 240 void counter2(){
Nurbol 0:e5b9c99f23f2 241 if(counter2p > 0.5){
Nurbol 0:e5b9c99f23f2 242 led4 = 1;
Nurbol 0:e5b9c99f23f2 243 servo_4.pulsewidth_us(0);
Nurbol 0:e5b9c99f23f2 244 wait(1);
Nurbol 0:e5b9c99f23f2 245 servo_5.pulsewidth_us(1000 + (200 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 246 }
Nurbol 0:e5b9c99f23f2 247 else{
Nurbol 0:e5b9c99f23f2 248 led4 = 0;
Nurbol 0:e5b9c99f23f2 249 servo_5.pulsewidth_us(1000 + (0 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 250 if(counter1p < 0.5){
Nurbol 0:e5b9c99f23f2 251 servo_4.pulsewidth_us(1000 + (25 * 1000) / 90);
Nurbol 0:e5b9c99f23f2 252 }
Nurbol 0:e5b9c99f23f2 253 }
Nurbol 0:e5b9c99f23f2 254 }
Nurbol 0:e5b9c99f23f2 255
Nurbol 0:e5b9c99f23f2 256
Nurbol 0:e5b9c99f23f2 257
Nurbol 0:e5b9c99f23f2 258
Nurbol 0:e5b9c99f23f2 259 //************************************************************************
Nurbol 0:e5b9c99f23f2 260 //
Nurbol 0:e5b9c99f23f2 261 int main() {
Nurbol 0:e5b9c99f23f2 262
Nurbol 0:e5b9c99f23f2 263 valueLED1=0;
Nurbol 0:e5b9c99f23f2 264 valueLED2=0;
Nurbol 0:e5b9c99f23f2 265 clk=0;
Nurbol 0:e5b9c99f23f2 266 init_sys();
Nurbol 0:e5b9c99f23f2 267
Nurbol 0:e5b9c99f23f2 268 FOREVER {
Nurbol 0:e5b9c99f23f2 269
Nurbol 0:e5b9c99f23f2 270 timer2p.attach(&sensor2p, 0.1); //function sensor2p is reading all the 0.1 ms
Nurbol 0:e5b9c99f23f2 271 timer1p.attach(&sensor1p, 0.1); //function sensor1p is reading all the 0.1 ms
Nurbol 0:e5b9c99f23f2 272 timercounter2p.attach(&counter2, 0.1); //function counter2 is reading all the 0.1 ms
Nurbol 0:e5b9c99f23f2 273 timercounter1p.attach(&counter1, 0.1); //function counter1 is reading all the 0.1 ms
Nurbol 0:e5b9c99f23f2 274
Nurbol 0:e5b9c99f23f2 275 clk = !clk;
Nurbol 0:e5b9c99f23f2 276 wait(0.01);
Nurbol 0:e5b9c99f23f2 277
Nurbol 0:e5b9c99f23f2 278 get_cmd(&ext_cmd);
Nurbol 0:e5b9c99f23f2 279 //
Nurbol 0:e5b9c99f23f2 280 // Check status of read command activity and return an error status if there was a problem
Nurbol 0:e5b9c99f23f2 281 // If there is a problem, then return status code only and wait for next command.
Nurbol 0:e5b9c99f23f2 282 //
Nurbol 0:e5b9c99f23f2 283 if (ext_cmd.result_status != OK){
Nurbol 0:e5b9c99f23f2 284 send_status(ext_cmd.result_status);
Nurbol 0:e5b9c99f23f2 285 continue;
Nurbol 0:e5b9c99f23f2 286 }
Nurbol 0:e5b9c99f23f2 287 //
Nurbol 0:e5b9c99f23f2 288 // Parse command and return an error staus if there is a problem
Nurbol 0:e5b9c99f23f2 289 // If there is a problem, then return status code only and wait for next command.
Nurbol 0:e5b9c99f23f2 290 //
Nurbol 0:e5b9c99f23f2 291 parse_cmd(&ext_cmd);
Nurbol 0:e5b9c99f23f2 292 lcd->locate(1,0); lcd->printf(ext_cmd.cmd_str);
Nurbol 0:e5b9c99f23f2 293 if ((ext_cmd.result_status != OK) && (ext_cmd.cmd_code != TEXT_CMD)){
Nurbol 0:e5b9c99f23f2 294 lcd->locate(1,0); lcd->printf("parse : error");
Nurbol 0:e5b9c99f23f2 295 send_status(ext_cmd.result_status);
Nurbol 0:e5b9c99f23f2 296 continue;
Nurbol 0:e5b9c99f23f2 297 }
Nurbol 0:e5b9c99f23f2 298 //
Nurbol 0:e5b9c99f23f2 299 // Execute command and return an error staus if there is a problem
Nurbol 0:e5b9c99f23f2 300 //
Nurbol 0:e5b9c99f23f2 301 process_cmd(&ext_cmd);
Nurbol 0:e5b9c99f23f2 302 reply_to_cmd(&ext_cmd);
Nurbol 0:e5b9c99f23f2 303
Nurbol 0:e5b9c99f23f2 304
Nurbol 0:e5b9c99f23f2 305
Nurbol 0:e5b9c99f23f2 306 }
Nurbol 0:e5b9c99f23f2 307
Nurbol 0:e5b9c99f23f2 308 }
Nurbol 0:e5b9c99f23f2 309
Nurbol 0:e5b9c99f23f2 310
Nurbol 0:e5b9c99f23f2 311
Nurbol 0:e5b9c99f23f2 312
Nurbol 0:e5b9c99f23f2 313
Nurbol 0:e5b9c99f23f2 314
Nurbol 0:e5b9c99f23f2 315
Nurbol 0:e5b9c99f23f2 316
Nurbol 0:e5b9c99f23f2 317