Electric Skateboard using Wi-Fi controller.

Dependencies:   Servo WizFi250Interface mbed

Committer:
kaizen
Date:
Wed Nov 18 23:12:23 2015 +0000
Revision:
2:5f0fc1edfc19
Parent:
1:a710607c27cd
Changed Antenna option for skateboard

Who changed what in which revision?

UserRevisionLine numberNew 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 2:5f0fc1edfc19 57 wizfi250.setAntMode(WizFi250::UFL);
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 }