Paso 17: Actualizar :) Protocolo de comunicación serial
Porque la parte de conexión de mi código era no tan buena y visto que el coche reciba sólo 1 de 5 paquetes de datos que remoto enviar me tryd a hacer algún tipo de protocolo para el coche y el mando a distancia envían solicitudes y dan respuesta si los datos han sido completados o cosas así y también comprobar el estado de conexión e intente volver a conectar si desconecta.
En la parte de hardware que añadió 3 led del mando a distancia, uno indica el estado de la conexión y los otros 2 al enviar o recibir datos, los leds están conectados a los pines digitales 3
Lado remoto conectar la función:
void connect(){ if(Serial.available() > 0){ byte first = Serial.read(); if(first == request_connect){ Serial.flush(); Serial.write(ok); connect_accepted = 1; } if (first == request_data && connect_accepted == 1){ connected = 1; connect_accepted = 0; Send_data(); } } }
Receiver(Car) lado conectar la función:
void connect(){ if(Serial.available() > 0){ if(Serial.read() == ok){ connected = 1; delay(10); Serial.write(request_data); Serial.flush(); } } else{ delay(100); Serial.write(request_connect); } }
Como se puede ver el coche enviar el request_connect hasta el control remoto envía un "ok" luego los sistemas del coche la conexión y enviar la solicitud de datos. El control remoto sólo esperar la request_connect y eliminar el resto de datos en serie que pueden estar disponibles (porque el coche acaba de enviar request_data cada 100ms hasta que obtiene la autorización), enviar "ok" y conjuntos de connect_accepted, justo sólo cuando recibe la request_data establece la verdadera conexión y comienza envío de datos.
Función de conexión lado remoto
void communication(){ if (connected){digitalWrite(ledConnected,HIGH);} //light up the connec led else {digitalWrite(ledConnected, LOW);} if (running){ //running, you can set it to false when you make some setins in the remote menus if(!connected){ last_time_recived = millis(); connect(); } if(connected){ if (Serial.available() > 0){ int first_byte = Serial.read(); lcd.setCursor(0,5); //debug lcd.print(first_byte); //debug switch (first_byte) { case request_data: last_time_recived = millis(); Send_data(); digitalWrite(ledSend, HIGH); //light up the send led break; case incomming: last_time_recived = millis(); Recive_data(); digitalWrite(ledRecive, HIGH); //light up the receive led break; case recived_ok: //case you get a recive ok feedback send request data last_time_recived = millis(); Serial.write(request_data); break; case err_max_packet_overflow: //case the car say you send too many bytes last_time_recived = millis(); Serial.flush(); lcd.setCursor(0,5); //debug lcd.print("RRerr_max_packet"); //debug Send_data(); break; case err_data_overflow: //case the car say you send too many values last_time_recived = millis(); Serial.flush(); lcd.setCursor(0,6); //debug lcd.print("RRerr_data_"); //debug Send_data(); break; default: Serial.flush(); } } } } }
El receptor communication() es casi lo mismo, voy a poner todo el código en un archivo.
Send_data() lado remoto
void Send_data(){ Serial.write(incomming); // send a head's up so the car can go to recive_data() Serial.write(nr_data_send); //nr of data to send (if more it will send a too many values error) Serial.write(throttle); // sending the values Serial.write(break_); Serial.write(stear); Serial.write(EEPROMReadInt(76)); // read from the eprom the value Serial.write(EEPROMReadInt(72)); }
Receive_data() lado remoto
void Recive_data(){ if(Serial.available() > 0){ while (Serial.available() > 0) { packets[Cur_Packet_Index++] = Serial.read(); //saveing the data in an array the array must be delay(2); //long enough to store all the data if (Cur_Packet_Index >= MaxPacketNum){ //send too many byte error Serial.write(err_max_packet_overflow); Serial.flush(); lcd.setCursor(0,5); //debug lcd.print("err_max_packet"); //debug Cur_Packet_Index = 0; break; } } if(packets[0] != Cur_Packet_Index - 1){ //send too many values error Serial.write(err_data_overflow); Serial.flush(); lcd.setCursor(0,6); //debug lcd.print("err_data_"); //debug } else{ //save the values if no error car_bat_motor = packets[1]; car_bat_controler = packets[2]; RPM = packets[3]; last_time_recived = millis(); // set the time reference for time out connection Serial.write(recived_ok); } Cur_Packet_Index = 0; } }
Os pongo aquí el control remoto y los archivos del coche, actualizados y también a los archivos de la comunicación para el receptor que un mando a distancia y usted puede encontrar todos ellos en google drive aquí