Ciao a tutti,
ho un problema con un programmino che sto eseguendo con Arduino Uno.
ho realizzato uno script che legge da seriale delle stringhe (es. 01,1), fa il parsing e in base a quanto letto attiva o disattiva dei relè di una shield relay arduino.
ho poi fatto un script in bash che scrive sulla seriale di arduino queste stringhe in maniera sequenziale e che vado a richiamare tramite cygwin o realterm.
funziona tutto ma ho un problema con la seriale all'avvio:
Se stacco l'USB di arduino e lo riconnetto, dal terminale quando vado a richiamare un script bash non attiva nessuna uscita di arduino. Solo se entro nell'IDE di arduino, apro il monitor seriale di arduino, lo chiudo e riprovo a dare il comando via cygwin allora tutto funziona.
void(* resetFunc) (void) = 0;
#include <string.h> // classe necessaria per subString
String letturaSeriale;
String pinSerial;
String statusPin;
int pinInt;
int pin[16]={2,3,4,5,6,7,8,9,10,11,12,13,A0,A1,A2,A3};
int statusPinInt;
int ch=16; // numero di relay - 2
String reset_str="reset";
void setup()
{
for (int i=0; i<ch; i++){
pinMode(pin[i], OUTPUT);
digitalWrite(pin[i], HIGH);
}
Serial.setTimeout(100);
Serial.begin(9600);
while (!Serial);
}
void loop() {
if (Serial.available()){
// lettura da seriale della stringa di dati passata da script
letturaSeriale = Serial.readString();
Serial.println(letturaSeriale);
if (letturaSeriale.indexOf(reset_str)!=-1){
Serial.println(letturaSeriale);
Serial.println("Riavvio in corso...");
delay(50);
resetFunc();
}
else{
// lettura della sottostringa contenente il pin da manipolare
pinSerial= letturaSeriale.substring(0,2);
// conversione del valore da Stringa a Int
pinInt=pinSerial.toInt();
Serial.println(pinInt);
// lettura della sottostringa contenente lo stato del pin
statusPin= letturaSeriale.substring(3,4);
// conversione del valore da Stringa a Int
statusPinInt=statusPin.toInt();
// verifica dello stato della variabile "stato pin" e imposta pin
if (statusPinInt == 1){
digitalWrite(pin[pinInt], LOW); //attivo basso
Serial.println("Command completed LED turned ON");
}
if (statusPinInt == 0){
digitalWrite(pin[pinInt], HIGH); //spento alto
Serial.println("Command completed LED turned OFF");
}
Serial.println(pin[pinInt]);
}
}
}
Questo il codice che ho fatto. Ho provato anche con un reset iniziale ma nulla (effettivamente se la seriale non è pronta, probabilmente neanche lo riceve).
Se forzo all'avvio un reset tramite pulsante di reset lo stesso non funziona. devo per forza aprire il monitor seriale.
chi mi può dare un consiglio?
echo Avvio della prova per il dispositivo
echo "200 201">$ARDUINO_PORT
echo reset>$ARDUINO_PORT
sleep $tSlow
#accensione dispositivo
echo 1: Accensione dispostivo
echo $pwr,$HIGH>$ARDUINO_PORT
sleep $tLong
questo uno spezzone dello script bash