Nurbol Nurdaulet / Mbed 2 deprecated 2sensors_2servo
Committer:
Nurbol
Date:
Thu Nov 10 11:47:25 2011 +0000
Revision:
0:2b10383306a2
Child:
1:0b0b7e0b6712

        

Who changed what in which revision?

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