Nurbol Nurdaulet / Mbed 2 deprecated 2sensors_1servo

Dependencies:   mbed WattBob_TextLCD

Committer:
Nurbol
Date:
Wed Nov 09 18:47:08 2011 +0000
Revision:
0:9035375a3acc

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nurbol 0:9035375a3acc 1 //
Nurbol 0:9035375a3acc 2 // COM_test : program to communicate via a COM port to a PC/laptop
Nurbol 0:9035375a3acc 3 // ========
Nurbol 0:9035375a3acc 4 //
Nurbol 0:9035375a3acc 5 // Description
Nurbol 0:9035375a3acc 6 // Program to receive ASCII format commands through a virtual COM port and
Nurbol 0:9035375a3acc 7 // after executing the command return some data (optional, depending on
Nurbol 0:9035375a3acc 8 // the command) and a status value.
Nurbol 0:9035375a3acc 9 // The program understands two possible commands :
Nurbol 0:9035375a3acc 10 // "s i j" : move servo 'i (0 to 5) to postion 'j' (0 to 90)
Nurbol 0:9035375a3acc 11 // "r" : read the 'i' parameter of the last "s" command
Nurbol 0:9035375a3acc 12 //
Nurbol 0:9035375a3acc 13 // Version : 1.0
Nurbol 0:9035375a3acc 14 // Author : Jim Herd
Nurbol 0:9035375a3acc 15 // Date : 5th Oct 2011
Nurbol 0:9035375a3acc 16 //
Nurbol 0:9035375a3acc 17 #include "mbed.h"
Nurbol 0:9035375a3acc 18 #include "MCP23017.h"
Nurbol 0:9035375a3acc 19 #include "WattBob_TextLCD.h"
Nurbol 0:9035375a3acc 20 #include "cmd_io.h"
Nurbol 0:9035375a3acc 21 #include "globals.h"
Nurbol 0:9035375a3acc 22
Nurbol 0:9035375a3acc 23
Nurbol 0:9035375a3acc 24 AnalogIn sensor1(p15);
Nurbol 0:9035375a3acc 25 AnalogIn sensor2(p16);
Nurbol 0:9035375a3acc 26 AnalogOut valueLED1(p18);
Nurbol 0:9035375a3acc 27 DigitalOut valueLED2(p25);
Nurbol 0:9035375a3acc 28 DigitalOut led1(LED1);
Nurbol 0:9035375a3acc 29 DigitalOut led2(LED2);
Nurbol 0:9035375a3acc 30 DigitalOut clk(p24);
Nurbol 0:9035375a3acc 31
Nurbol 0:9035375a3acc 32
Nurbol 0:9035375a3acc 33
Nurbol 0:9035375a3acc 34 //******************************************************************************
Nurbol 0:9035375a3acc 35 // declare set of system objects
Nurbol 0:9035375a3acc 36 //
Nurbol 0:9035375a3acc 37
Nurbol 0:9035375a3acc 38 //
Nurbol 0:9035375a3acc 39 //
Nurbol 0:9035375a3acc 40 // 2. five servo outputs
Nurbol 0:9035375a3acc 41 //
Nurbol 0:9035375a3acc 42
Nurbol 0:9035375a3acc 43 PwmOut servo_0(p26);
Nurbol 0:9035375a3acc 44 //PwmOut servo_1(p25);
Nurbol 0:9035375a3acc 45 //PwmOut servo_2(p24);
Nurbol 0:9035375a3acc 46 //PwmOut servo_3(p23);
Nurbol 0:9035375a3acc 47 //PwmOut servo_4(p22);
Nurbol 0:9035375a3acc 48 //PwmOut servo_5(p21);
Nurbol 0:9035375a3acc 49
Nurbol 0:9035375a3acc 50 //
Nurbol 0:9035375a3acc 51 // 3. objects necessary to use the 2*16 character MBED display
Nurbol 0:9035375a3acc 52 //
Nurbol 0:9035375a3acc 53 MCP23017 *par_port;
Nurbol 0:9035375a3acc 54 WattBob_TextLCD *lcd;
Nurbol 0:9035375a3acc 55 //
Nurbol 0:9035375a3acc 56 // 4. Virtual COM port over USB link to laptop/PC
Nurbol 0:9035375a3acc 57 //
Nurbol 0:9035375a3acc 58 Serial pc(USBTX, USBRX);
Nurbol 0:9035375a3acc 59
Nurbol 0:9035375a3acc 60 //******************************************************************************
Nurbol 0:9035375a3acc 61 // Defined GLOBAL variables and structures
Nurbol 0:9035375a3acc 62 //
Nurbol 0:9035375a3acc 63 CMD_STRUCT ext_cmd; // structure to hold command data
Nurbol 0:9035375a3acc 64 STAT_STRUCT ext_stat; // structure to hold status reply
Nurbol 0:9035375a3acc 65
Nurbol 0:9035375a3acc 66 uint32_t last_servo; // store for last servo number
Nurbol 0:9035375a3acc 67
Nurbol 0:9035375a3acc 68 //************************************************************************
Nurbol 0:9035375a3acc 69 //************************************************************************
Nurbol 0:9035375a3acc 70 // init_sys : initialise the system
Nurbol 0:9035375a3acc 71 // ========
Nurbol 0:9035375a3acc 72 //
Nurbol 0:9035375a3acc 73 // 1. Configure 2*16 character display
Nurbol 0:9035375a3acc 74 // 2. Print "COM test" string
Nurbol 0:9035375a3acc 75 // 3. initialise relevant global variables
Nurbol 0:9035375a3acc 76 // 4. set COM port baud rate to 19200 bits per second
Nurbol 0:9035375a3acc 77 //
Nurbol 0:9035375a3acc 78 void init_sys(void) {
Nurbol 0:9035375a3acc 79
Nurbol 0:9035375a3acc 80 par_port = new MCP23017(p9, p10, 0x40);
Nurbol 0:9035375a3acc 81 lcd = new WattBob_TextLCD(par_port);
Nurbol 0:9035375a3acc 82
Nurbol 0:9035375a3acc 83 par_port->write_bit(1,BL_BIT); // turn LCD backlight ON
Nurbol 0:9035375a3acc 84 lcd->cls();
Nurbol 0:9035375a3acc 85 lcd->locate(0,0);
Nurbol 0:9035375a3acc 86 lcd->printf("COM ");
Nurbol 0:9035375a3acc 87
Nurbol 0:9035375a3acc 88 servo_0.period(0.020); // servo requires a 20ms period, common for all 5 servo objects
Nurbol 0:9035375a3acc 89 last_servo = SERVO_UNKNOWN;
Nurbol 0:9035375a3acc 90 pc.baud(19200);
Nurbol 0:9035375a3acc 91
Nurbol 0:9035375a3acc 92 return;
Nurbol 0:9035375a3acc 93 } // end init_sys
Nurbol 0:9035375a3acc 94
Nurbol 0:9035375a3acc 95 //************************************************************************
Nurbol 0:9035375a3acc 96 // process_cmd : decode and execute command
Nurbol 0:9035375a3acc 97 // ===========
Nurbol 0:9035375a3acc 98 uint32_t process_cmd(CMD_STRUCT *command)
Nurbol 0:9035375a3acc 99 {
Nurbol 0:9035375a3acc 100 int32_t pulse_width;
Nurbol 0:9035375a3acc 101
Nurbol 0:9035375a3acc 102 switch (command->cmd_code) {
Nurbol 0:9035375a3acc 103 //
Nurbol 0:9035375a3acc 104 // move a servo
Nurbol 0:9035375a3acc 105 //
Nurbol 0:9035375a3acc 106 case SERVO_CMD :
Nurbol 0:9035375a3acc 107 command->nos_data = 0; // no data to be returned
Nurbol 0:9035375a3acc 108 //
Nurbol 0:9035375a3acc 109 // check that parameters are OK
Nurbol 0:9035375a3acc 110 //
Nurbol 0:9035375a3acc 111 if (command->nos_params != 2) { // check for 2 parameters
Nurbol 0:9035375a3acc 112 command->result_status = CMD_BAD_NUMBER_OF_PARAMETERS;
Nurbol 0:9035375a3acc 113 break;
Nurbol 0:9035375a3acc 114 }
Nurbol 0:9035375a3acc 115 if (command->param[0] > MAX_SERVO_NUMBER ) { // check servo number
Nurbol 0:9035375a3acc 116 command->result_status = CMD_BAD_SERVO_NUMBER;
Nurbol 0:9035375a3acc 117 break;
Nurbol 0:9035375a3acc 118 }
Nurbol 0:9035375a3acc 119 if ((command->param[1] < MIN_SERVO_ANGLE) ||
Nurbol 0:9035375a3acc 120 (command->param[1] > MAX_SERVO_ANGLE) ) {
Nurbol 0:9035375a3acc 121 command->result_status = CMD_BAD_SERVO_VALUE;
Nurbol 0:9035375a3acc 122 break;
Nurbol 0:9035375a3acc 123 }
Nurbol 0:9035375a3acc 124 pulse_width = 1000 + (command->param[1] * 1000) / MAX_SERVO_ANGLE; // convert angle to pulse width
Nurbol 0:9035375a3acc 125 //
Nurbol 0:9035375a3acc 126 // implement servo move to all 5 servos
Nurbol 0:9035375a3acc 127 //
Nurbol 0:9035375a3acc 128 switch (command->param[0]) {
Nurbol 0:9035375a3acc 129 case 0 : servo_0.pulsewidth_us(pulse_width); break;
Nurbol 0:9035375a3acc 130 //case 1 : servo_1.pulsewidth_us(pulse_width); break;
Nurbol 0:9035375a3acc 131 //case 2 : servo_2.pulsewidth_us(pulse_width); break;
Nurbol 0:9035375a3acc 132 //case 3 : servo_3.pulsewidth_us(pulse_width); break;
Nurbol 0:9035375a3acc 133 //case 4 : servo_4.pulsewidth_us(pulse_width); break;
Nurbol 0:9035375a3acc 134 //case 5 : servo_5.pulsewidth_us(pulse_width); break;
Nurbol 0:9035375a3acc 135
Nurbol 0:9035375a3acc 136 }
Nurbol 0:9035375a3acc 137 last_servo = command->param[0];
Nurbol 0:9035375a3acc 138 break;
Nurbol 0:9035375a3acc 139 //
Nurbol 0:9035375a3acc 140 // return last servo number
Nurbol 0:9035375a3acc 141 //
Nurbol 0:9035375a3acc 142 case READ_CMD :
Nurbol 0:9035375a3acc 143 command->nos_data = 1; // no data to be returned
Nurbol 0:9035375a3acc 144 command->result_data[0] = last_servo;
Nurbol 0:9035375a3acc 145 break;
Nurbol 0:9035375a3acc 146 //
Nurbol 0:9035375a3acc 147 // catch any problems
Nurbol 0:9035375a3acc 148 //
Nurbol 0:9035375a3acc 149 default:
Nurbol 0:9035375a3acc 150 command->nos_data = 0; // no data to be returned
Nurbol 0:9035375a3acc 151 command->result_status = CMD_BAD_SERVO_VALUE;
Nurbol 0:9035375a3acc 152 break;
Nurbol 0:9035375a3acc 153 }
Nurbol 0:9035375a3acc 154 return OK;
Nurbol 0:9035375a3acc 155 }
Nurbol 0:9035375a3acc 156
Nurbol 0:9035375a3acc 157 //************************************************************************
Nurbol 0:9035375a3acc 158 //************************************************************************
Nurbol 0:9035375a3acc 159 //
Nurbol 0:9035375a3acc 160 int main() {
Nurbol 0:9035375a3acc 161 valueLED1=0;
Nurbol 0:9035375a3acc 162 valueLED2=0;
Nurbol 0:9035375a3acc 163 clk=0;
Nurbol 0:9035375a3acc 164 init_sys();
Nurbol 0:9035375a3acc 165 FOREVER {
Nurbol 0:9035375a3acc 166 get_cmd(&ext_cmd);
Nurbol 0:9035375a3acc 167 //
Nurbol 0:9035375a3acc 168 // Check status of read command activity and return an error status if there was a problem
Nurbol 0:9035375a3acc 169 // If there is a problem, then return status code only and wait for next command.
Nurbol 0:9035375a3acc 170 //
Nurbol 0:9035375a3acc 171 if (ext_cmd.result_status != OK){
Nurbol 0:9035375a3acc 172 send_status(ext_cmd.result_status);
Nurbol 0:9035375a3acc 173 continue;
Nurbol 0:9035375a3acc 174 }
Nurbol 0:9035375a3acc 175 //
Nurbol 0:9035375a3acc 176 // Parse command and return an error staus if there is a problem
Nurbol 0:9035375a3acc 177 // If there is a problem, then return status code only and wait for next command.
Nurbol 0:9035375a3acc 178 //
Nurbol 0:9035375a3acc 179 parse_cmd(&ext_cmd);
Nurbol 0:9035375a3acc 180 lcd->locate(1,0); lcd->printf(ext_cmd.cmd_str);
Nurbol 0:9035375a3acc 181 if ((ext_cmd.result_status != OK) && (ext_cmd.cmd_code != TEXT_CMD)){
Nurbol 0:9035375a3acc 182 lcd->locate(1,0); lcd->printf("parse : error");
Nurbol 0:9035375a3acc 183 send_status(ext_cmd.result_status);
Nurbol 0:9035375a3acc 184 continue;
Nurbol 0:9035375a3acc 185 }
Nurbol 0:9035375a3acc 186 //
Nurbol 0:9035375a3acc 187 // Execute command and return an error staus if there is a problem
Nurbol 0:9035375a3acc 188 //
Nurbol 0:9035375a3acc 189 process_cmd(&ext_cmd);
Nurbol 0:9035375a3acc 190 reply_to_cmd(&ext_cmd);
Nurbol 0:9035375a3acc 191
Nurbol 0:9035375a3acc 192
Nurbol 0:9035375a3acc 193 //program for 2 sensors
Nurbol 0:9035375a3acc 194
Nurbol 0:9035375a3acc 195
Nurbol 0:9035375a3acc 196 clk = !clk;
Nurbol 0:9035375a3acc 197
Nurbol 0:9035375a3acc 198 wait(0.01);
Nurbol 0:9035375a3acc 199
Nurbol 0:9035375a3acc 200 sensor1.read();
Nurbol 0:9035375a3acc 201 sensor2.read();
Nurbol 0:9035375a3acc 202
Nurbol 0:9035375a3acc 203 if(sensor1 > 0.5) {
Nurbol 0:9035375a3acc 204 led1 = 1;
Nurbol 0:9035375a3acc 205 valueLED1 = 1;
Nurbol 0:9035375a3acc 206 }
Nurbol 0:9035375a3acc 207 else if(sensor1 < 0.5){
Nurbol 0:9035375a3acc 208 led1 = 0;
Nurbol 0:9035375a3acc 209 valueLED1 = 0;
Nurbol 0:9035375a3acc 210 }
Nurbol 0:9035375a3acc 211
Nurbol 0:9035375a3acc 212
Nurbol 0:9035375a3acc 213 if(sensor2 > 0.5) {
Nurbol 0:9035375a3acc 214 led2 = 1;
Nurbol 0:9035375a3acc 215 valueLED2 = 1;
Nurbol 0:9035375a3acc 216 }
Nurbol 0:9035375a3acc 217 else if(sensor2 < 0.5){
Nurbol 0:9035375a3acc 218 led2 = 0;
Nurbol 0:9035375a3acc 219 valueLED2 = 0;
Nurbol 0:9035375a3acc 220 }
Nurbol 0:9035375a3acc 221 }
Nurbol 0:9035375a3acc 222
Nurbol 0:9035375a3acc 223 }