Electric Skateboard using Wi-Fi controller.
Dependencies: Servo WizFi250Interface mbed
main.cpp@1:a710607c27cd, 2015-10-29 (annotated)
- Committer:
- kaizen
- Date:
- Thu Oct 29 06:52:12 2015 +0000
- Revision:
- 1:a710607c27cd
- Parent:
- 0:aca1f2f5443d
- Child:
- 2:5f0fc1edfc19
modified pwm value
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kaizen | 0:aca1f2f5443d | 1 | #include "mbed.h" |
kaizen | 0:aca1f2f5443d | 2 | #include "Servo.h" |
kaizen | 0:aca1f2f5443d | 3 | #include "WizFi250Interface.h" |
kaizen | 0:aca1f2f5443d | 4 | |
kaizen | 0:aca1f2f5443d | 5 | #define SECURE WizFi250::SEC_WPA2_MIXED |
kaizen | 0:aca1f2f5443d | 6 | #define SSID "Kaizen_Skate" |
kaizen | 0:aca1f2f5443d | 7 | #define PASS "qwertyuiop" |
kaizen | 0:aca1f2f5443d | 8 | |
kaizen | 0:aca1f2f5443d | 9 | #define SERVER_PORT 5000 |
kaizen | 0:aca1f2f5443d | 10 | #define STOP_MOTOR 50 |
kaizen | 0:aca1f2f5443d | 11 | |
kaizen | 0:aca1f2f5443d | 12 | |
kaizen | 0:aca1f2f5443d | 13 | #if defined(TARGET_WIZwiki_W7500P) |
kaizen | 0:aca1f2f5443d | 14 | WizFi250Interface wizfi250(PC_2,PC_3,PC_13,PC_14,PC_12,NC,115200); |
kaizen | 0:aca1f2f5443d | 15 | Serial pc(USBTX, USBRX); |
kaizen | 0:aca1f2f5443d | 16 | Servo motor_speed(PC_8); // it used to percentage value ( 0 ~ 1 ) |
kaizen | 0:aca1f2f5443d | 17 | DigitalOut green_led(LED2); |
kaizen | 0:aca1f2f5443d | 18 | DigitalOut red_led(LED1); |
kaizen | 0:aca1f2f5443d | 19 | DigitalOut blue_led(LED3); |
kaizen | 0:aca1f2f5443d | 20 | #endif |
kaizen | 0:aca1f2f5443d | 21 | |
kaizen | 0:aca1f2f5443d | 22 | #define START_MSG "START" |
kaizen | 0:aca1f2f5443d | 23 | #define END_MSG "END\n" |
kaizen | 0:aca1f2f5443d | 24 | #define CONTROL_UP "UPXX" |
kaizen | 0:aca1f2f5443d | 25 | #define CONTROL_DOWN "DOWN" |
kaizen | 0:aca1f2f5443d | 26 | #define CONTROL_CRUISER "CRUI" |
kaizen | 0:aca1f2f5443d | 27 | #define CONTROL_STOP "STOP" |
kaizen | 0:aca1f2f5443d | 28 | |
kaizen | 0:aca1f2f5443d | 29 | #define STATUS_CMD_OK "OKXX" |
kaizen | 0:aca1f2f5443d | 30 | #define STATUS_CMD_FAIL "FAIL" |
kaizen | 0:aca1f2f5443d | 31 | |
kaizen | 0:aca1f2f5443d | 32 | #define CONTROL_MSG_SIZE 19 |
kaizen | 0:aca1f2f5443d | 33 | |
kaizen | 0:aca1f2f5443d | 34 | // Control Pkt Format : START,CONTROL,SPEED_VALUE,END |
kaizen | 0:aca1f2f5443d | 35 | // START,UPXX,500,END |
kaizen | 0:aca1f2f5443d | 36 | // Status Pkt Format : START,CONTROL,SPEED_VALUE,STATUS,END |
kaizen | 0:aca1f2f5443d | 37 | |
kaizen | 0:aca1f2f5443d | 38 | struct control_pkt{ |
kaizen | 0:aca1f2f5443d | 39 | char start_msg[6]; |
kaizen | 0:aca1f2f5443d | 40 | char control_msg[5]; |
kaizen | 0:aca1f2f5443d | 41 | char speed_msg[4]; |
kaizen | 0:aca1f2f5443d | 42 | char end_msg[4]; |
kaizen | 0:aca1f2f5443d | 43 | }; |
kaizen | 0:aca1f2f5443d | 44 | void parse(char buffer[], int *j, char *string); |
kaizen | 0:aca1f2f5443d | 45 | |
kaizen | 0:aca1f2f5443d | 46 | int main() { |
kaizen | 0:aca1f2f5443d | 47 | int recv_cnt,j; |
kaizen | 0:aca1f2f5443d | 48 | volatile float speed_value = 0.5; |
kaizen | 0:aca1f2f5443d | 49 | char recv_control_msg[100]; |
kaizen | 0:aca1f2f5443d | 50 | char status_msg[100]; |
kaizen | 0:aca1f2f5443d | 51 | control_pkt control; |
kaizen | 0:aca1f2f5443d | 52 | |
kaizen | 0:aca1f2f5443d | 53 | pc.baud(115200); |
kaizen | 0:aca1f2f5443d | 54 | green_led = 1; red_led = 1; blue_led = 1; |
kaizen | 0:aca1f2f5443d | 55 | |
kaizen | 0:aca1f2f5443d | 56 | wizfi250.init(); |
kaizen | 0:aca1f2f5443d | 57 | wizfi250.setAntMode(WizFi250::PCB); |
kaizen | 0:aca1f2f5443d | 58 | wizfi250.setAddress("192.168.100.2","255.255.255.0","192.168.100.1"); |
kaizen | 0:aca1f2f5443d | 59 | if ( wizfi250.connect(SECURE, SSID, PASS, WizFi250::WM_AP)) |
kaizen | 0:aca1f2f5443d | 60 | { |
kaizen | 0:aca1f2f5443d | 61 | red_led = 0; |
kaizen | 0:aca1f2f5443d | 62 | return -1; |
kaizen | 0:aca1f2f5443d | 63 | } |
kaizen | 0:aca1f2f5443d | 64 | printf("IP Address is %s\r\n", wizfi250.getIPAddress()); |
kaizen | 0:aca1f2f5443d | 65 | green_led = 0; red_led = 0; blue_led = 0; |
kaizen | 0:aca1f2f5443d | 66 | |
kaizen | 0:aca1f2f5443d | 67 | TCPSocketServer server; |
kaizen | 0:aca1f2f5443d | 68 | TCPSocketConnection client; |
kaizen | 0:aca1f2f5443d | 69 | |
kaizen | 0:aca1f2f5443d | 70 | while(true) |
kaizen | 0:aca1f2f5443d | 71 | { |
kaizen | 0:aca1f2f5443d | 72 | if( client.is_connected() == false ) |
kaizen | 0:aca1f2f5443d | 73 | { |
kaizen | 0:aca1f2f5443d | 74 | green_led = 1; red_led = 1; blue_led = 0; |
kaizen | 0:aca1f2f5443d | 75 | client.close(); |
kaizen | 0:aca1f2f5443d | 76 | server.close(); |
kaizen | 0:aca1f2f5443d | 77 | |
kaizen | 0:aca1f2f5443d | 78 | if(speed_value == 0.5) |
kaizen | 0:aca1f2f5443d | 79 | { |
kaizen | 0:aca1f2f5443d | 80 | server.bind(SERVER_PORT); |
kaizen | 0:aca1f2f5443d | 81 | server.listen(); |
kaizen | 0:aca1f2f5443d | 82 | |
kaizen | 0:aca1f2f5443d | 83 | printf("\nWait for new connection...\r\n"); |
kaizen | 0:aca1f2f5443d | 84 | server.accept(client); |
kaizen | 0:aca1f2f5443d | 85 | client.set_blocking(false, 1500); |
kaizen | 0:aca1f2f5443d | 86 | } |
kaizen | 1:a710607c27cd | 87 | else if(speed_value <= 0.4) |
kaizen | 0:aca1f2f5443d | 88 | { |
kaizen | 0:aca1f2f5443d | 89 | printf("Speed decrease +\r\n"); |
kaizen | 1:a710607c27cd | 90 | |
kaizen | 1:a710607c27cd | 91 | speed_value = 0.5; |
kaizen | 0:aca1f2f5443d | 92 | motor_speed = speed_value; |
kaizen | 1:a710607c27cd | 93 | // wait(0.5); |
kaizen | 1:a710607c27cd | 94 | // speed_value = 0.57; |
kaizen | 1:a710607c27cd | 95 | // motor_speed = speed_value; |
kaizen | 1:a710607c27cd | 96 | // wait(5); |
kaizen | 1:a710607c27cd | 97 | // speed_value = 0.5; |
kaizen | 1:a710607c27cd | 98 | // motor_speed = speed_value; |
kaizen | 0:aca1f2f5443d | 99 | } |
kaizen | 1:a710607c27cd | 100 | else |
kaizen | 0:aca1f2f5443d | 101 | { |
kaizen | 0:aca1f2f5443d | 102 | printf("Speed decrease -\r\n"); |
kaizen | 1:a710607c27cd | 103 | speed_value = 0.5; motor_speed = speed_value; |
kaizen | 1:a710607c27cd | 104 | // wait(0.5); |
kaizen | 1:a710607c27cd | 105 | // speed_value = 0.41; motor_speed = speed_value; |
kaizen | 1:a710607c27cd | 106 | // wait(2); |
kaizen | 1:a710607c27cd | 107 | // speed_value = 0.35; motor_speed = speed_value; |
kaizen | 1:a710607c27cd | 108 | // wait(2); |
kaizen | 1:a710607c27cd | 109 | // speed_value = 0.41; motor_speed = speed_value; |
kaizen | 1:a710607c27cd | 110 | // wait(2); |
kaizen | 1:a710607c27cd | 111 | // speed_value = 0.5; motor_speed = speed_value; |
kaizen | 1:a710607c27cd | 112 | // wait(2); |
kaizen | 0:aca1f2f5443d | 113 | } |
kaizen | 0:aca1f2f5443d | 114 | } |
kaizen | 0:aca1f2f5443d | 115 | else |
kaizen | 0:aca1f2f5443d | 116 | { |
kaizen | 0:aca1f2f5443d | 117 | motor_speed = speed_value; |
kaizen | 0:aca1f2f5443d | 118 | |
kaizen | 0:aca1f2f5443d | 119 | green_led = 0; red_led = 1; blue_led = 1; |
kaizen | 0:aca1f2f5443d | 120 | //recv_cnt = client.receive_all((char*)recv_control_msg, sizeof(control)-1); |
kaizen | 0:aca1f2f5443d | 121 | recv_cnt = client.receive_all((char*)recv_control_msg, sizeof(control)); |
kaizen | 0:aca1f2f5443d | 122 | |
kaizen | 0:aca1f2f5443d | 123 | j=0; |
kaizen | 0:aca1f2f5443d | 124 | parse(recv_control_msg, &j, control.start_msg); |
kaizen | 0:aca1f2f5443d | 125 | parse(recv_control_msg, &j, control.control_msg); |
kaizen | 0:aca1f2f5443d | 126 | parse(recv_control_msg, &j, control.speed_msg); |
kaizen | 0:aca1f2f5443d | 127 | parse(recv_control_msg, &j, control.end_msg); |
kaizen | 0:aca1f2f5443d | 128 | |
kaizen | 0:aca1f2f5443d | 129 | if(recv_cnt > 0) |
kaizen | 0:aca1f2f5443d | 130 | { |
kaizen | 0:aca1f2f5443d | 131 | if( (strncmp(control.start_msg,START_MSG,sizeof(control.start_msg)) != 0) || |
kaizen | 0:aca1f2f5443d | 132 | (strncmp(control.end_msg,END_MSG,sizeof(control.end_msg)) != 0) ) |
kaizen | 0:aca1f2f5443d | 133 | { |
kaizen | 0:aca1f2f5443d | 134 | printf("TEST Error\r\n"); |
kaizen | 0:aca1f2f5443d | 135 | sprintf(status_msg,"%s,%03d,%s,%s\n",START_MSG,int(speed_value*100),STATUS_CMD_FAIL,END_MSG); |
kaizen | 0:aca1f2f5443d | 136 | client.send_all((char*)status_msg,strlen(status_msg)); |
kaizen | 0:aca1f2f5443d | 137 | continue; |
kaizen | 0:aca1f2f5443d | 138 | } |
kaizen | 0:aca1f2f5443d | 139 | |
kaizen | 0:aca1f2f5443d | 140 | if( strncmp(control.control_msg,CONTROL_UP,sizeof(control.control_msg)) == 0 ) |
kaizen | 0:aca1f2f5443d | 141 | { |
kaizen | 0:aca1f2f5443d | 142 | speed_value += 0.05; |
kaizen | 0:aca1f2f5443d | 143 | motor_speed = speed_value; |
kaizen | 0:aca1f2f5443d | 144 | printf("TEST UP %f\r\n",speed_value); |
kaizen | 0:aca1f2f5443d | 145 | } |
kaizen | 0:aca1f2f5443d | 146 | else if( strncmp(control.control_msg,CONTROL_DOWN,sizeof(control.control_msg)) == 0) |
kaizen | 0:aca1f2f5443d | 147 | { |
kaizen | 0:aca1f2f5443d | 148 | speed_value -= 0.05; |
kaizen | 0:aca1f2f5443d | 149 | motor_speed = speed_value; |
kaizen | 0:aca1f2f5443d | 150 | printf("TEST DOWN %f\r\n",speed_value); |
kaizen | 0:aca1f2f5443d | 151 | } |
kaizen | 0:aca1f2f5443d | 152 | else if( strncmp(control.control_msg,CONTROL_CRUISER,sizeof(control.control_msg)) == 0) |
kaizen | 0:aca1f2f5443d | 153 | { |
kaizen | 0:aca1f2f5443d | 154 | printf("TEST CRUISER\r\n"); |
kaizen | 0:aca1f2f5443d | 155 | speed_value = (float)(atoi(control.speed_msg)) / 100; |
kaizen | 0:aca1f2f5443d | 156 | motor_speed = speed_value; |
kaizen | 0:aca1f2f5443d | 157 | } |
kaizen | 0:aca1f2f5443d | 158 | else if( strncmp(control.control_msg,CONTROL_STOP,sizeof(control.control_msg)) == 0) |
kaizen | 0:aca1f2f5443d | 159 | { |
kaizen | 1:a710607c27cd | 160 | printf("TEST STOP\r\n"); |
kaizen | 0:aca1f2f5443d | 161 | speed_value = 0.5; |
kaizen | 0:aca1f2f5443d | 162 | motor_speed = speed_value; |
kaizen | 0:aca1f2f5443d | 163 | } |
kaizen | 0:aca1f2f5443d | 164 | else |
kaizen | 0:aca1f2f5443d | 165 | { |
kaizen | 0:aca1f2f5443d | 166 | printf("TEST Error 1-2\r\n"); |
kaizen | 0:aca1f2f5443d | 167 | sprintf(status_msg,"%s,%03d,%s,%s\n",START_MSG,int(speed_value*100),STATUS_CMD_FAIL,END_MSG); |
kaizen | 0:aca1f2f5443d | 168 | client.send_all((char*)status_msg,strlen(status_msg)); |
kaizen | 0:aca1f2f5443d | 169 | continue; |
kaizen | 0:aca1f2f5443d | 170 | } |
kaizen | 0:aca1f2f5443d | 171 | |
kaizen | 0:aca1f2f5443d | 172 | sprintf(status_msg,"%s,%03d,%s,%s\n",START_MSG,int(speed_value*100),STATUS_CMD_OK,END_MSG); |
kaizen | 0:aca1f2f5443d | 173 | client.send_all((char*)status_msg,strlen(status_msg)); |
kaizen | 0:aca1f2f5443d | 174 | } |
kaizen | 0:aca1f2f5443d | 175 | else |
kaizen | 0:aca1f2f5443d | 176 | { |
kaizen | 0:aca1f2f5443d | 177 | sprintf(status_msg,"%s,%03d,%s,%s\n",START_MSG,int(speed_value*100),STATUS_CMD_OK,END_MSG); |
kaizen | 0:aca1f2f5443d | 178 | client.send_all((char*)status_msg,strlen(status_msg)); |
kaizen | 0:aca1f2f5443d | 179 | } |
kaizen | 0:aca1f2f5443d | 180 | } |
kaizen | 0:aca1f2f5443d | 181 | }// while |
kaizen | 0:aca1f2f5443d | 182 | } |
kaizen | 0:aca1f2f5443d | 183 | |
kaizen | 0:aca1f2f5443d | 184 | void parse(char buffer[], int *j, char *string) { |
kaizen | 0:aca1f2f5443d | 185 | //extracts next location string data item from buffer |
kaizen | 0:aca1f2f5443d | 186 | int i=0; |
kaizen | 0:aca1f2f5443d | 187 | for (i=0; i<=strlen(buffer); i++) { //TOTAL SIZE OF RETURNED DATA |
kaizen | 0:aca1f2f5443d | 188 | if ((buffer[*j+i] == ',')||(buffer[*j+i] == '\0' )) { //IF comma or end of string |
kaizen | 0:aca1f2f5443d | 189 | //comma is the string field delimiter |
kaizen | 0:aca1f2f5443d | 190 | string[i]=0; //SETS END OF SRTRING TO 0 |
kaizen | 0:aca1f2f5443d | 191 | *j=*j+i+1; //UPDATES to 1 after comma seperated value |
kaizen | 0:aca1f2f5443d | 192 | break; |
kaizen | 0:aca1f2f5443d | 193 | } else string[i]=buffer[*j+i]; //Keep adding to the string |
kaizen | 0:aca1f2f5443d | 194 | } |
kaizen | 0:aca1f2f5443d | 195 | } |