Estoy usando un programa Python para enviar un mensaje a través de un puerto serie a Arduino. Este mensaje contiene el número de pin del pin y si debe ser HIGH
o LOW
. Por ejemplo: enviar 2H\n
debe establecer el pin 2 a HIGH
.
pins
array asigna los números de pin en los mensajes al número de pin real de arduino. 1H
corresponde al pin 22 en Arduinio Mega.
Al enviar manualmente un mensaje a la vez, las cosas funcionan bien. Sin embargo, cuando Python envía una serie de 30 mensajes de este tipo uno tras otro en un bucle sin retrasos, el pin 1 siempre se atasca en el valor que se establezca en la primera serie de mensajes.
Ejemplo:
1L\n
2H\n
3H\n
4H\n
5H\n
...
seguido de
1H\n
2H\n
3H\n
4H\n
5H\n
...
hará que el pin 1 se atasque en LOW
cuando debería estar alto.
En arduino, este es el código que analiza el mensaje y establece los valores de pin.
void setPinValues(String message) {
for(int i = 1; i <= sizeof(pins) / sizeof(pins[0]); i++ ) {
String pinNumber = String(i);
if( message == pinNumber + "H\n" ) {
pinValues[i] = HIGH;
}
if( message == pinNumber + "L\n" ) {
pinValues[i] = LOW;
}
}
}
void loop(){
if( Serial.available() > 0 ) {
received = Serial.read();
message += received;
if(received == '\n') {
// Set pin values
setPinValues(message);
// Write to pins
for (int i = 1; i <= sizeof(pins) / sizeof(pins[0]); i++) {
digitalWrite(pins[i], pinValues[i]);
}
// Clear buffer
message = "";
}
}
}
Arduino Mega se comunica con el sistema Windows 8 x64 a través de USB utilizando una velocidad de transmisión de 57600. Cuando se utiliza una velocidad de transmisión de 9600, este problema no se ve.
Además, a una velocidad en baudios de 57600, si tuviera que reemplazar setPinValues
con el siguiente código, el pin 1 está correctamente activado y desactivado.
void setPinValues(String message) {
for(int i = 1; i <= sizeof(pins) / sizeof(pins[0]); i++ ) {
if( message == String(1) + "H\n" ) {
pinValues[1] = HIGH;
}
if( message == String(1) + "L\n" ) {
pinValues[1] = LOW;
}
if( message == String(2) + "H\n" ) {
pinValues[2] = HIGH;
}
if( message == String(2) + "L\n" ) {
pinValues[2] = LOW;
}
if( message == String(3) + "H\n" ) {
pinValues[3] = HIGH;
}
if( message == String(3) + "L\n" ) {
pinValues[3] = LOW;
}
}
}
¿Las dos versiones de setPinValues
hacen lo mismo? ¿Por qué la reducción de la velocidad de transmisión evita el problema? No puedo usar una velocidad en baudios más baja porque el búfer USB se llena y las cosas se vuelven más lentas.
Para comparar el último carácter H
o L
:
String pinValueString = message.substring(message.length() - 1);
char pinValueBuffer[2];
pinValueString.toCharArray(pinValueBuffer,2);
if(pinValueBuffer[0] == 'H') {
digitalWrite(pins[pinNumber], HIGH);
}