consiglio su primo codice scritto

ciao ragazzi

per quelli che mi conoscono sul forum sono lieto di dire che ho risolto tutti i problemi relativi al post pilotare scheda motori

ovviamente ho fatto da solo seguendo varie guide illustrative sui vari comandi

volevo dei consigli sul codice che vi posto
dove ho apportato diverse modifiche perche il programma funzionava ma era molto lento alla risposta dei comandi

adesso va decisamente meglio dopo le modifiche
pero volevo lo stesso un controllo da parte vostra se possibile
e una domanda che mi preme farla e' : e possibile renderlo ancora piu' reattivo ?

grazie anticipatamente

#include <SoftwareSerial.h>

#include <Servo.h>

char val;

int pinDIR = 12; 	// Pin 12 -  dir 
int pinPWM = 11;	// Pin 11 -  pwm 
SoftwareSerial mySerial(9, 10); // imposto i pin per la comunicazione seriale
// Collegare i pin nel seguente modo: RX=>10 TX=>9
int valoreFade = 0;

Servo myservo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created
unsigned long time;
unsigned long letturadati;


void setup()
{  
  mySerial.begin(38400); // open serial port to receive data
  myservo.attach(5);  // attaches the servo on pin 9 to the servo object
 // steering in central position
  myservo.write(90);
  time=millis();
  servotime1=millis();
  mototime1=millis();
  letturadati=millis();
  // initialize the digital pins as output
  pinMode(pinDIR, OUTPUT);
  pinMode(pinPWM, OUTPUT);
  }
 

  
 // look for the newline. That's the end of your  sentence:
  void loop()
{  
  time=millis();
   if(time>servotime1+100){
  
      
      val = mySerial.read();         // read it and store it in 'val'
      
      switch(val){      
      
    case 'a' : 
       myservo.write(120);              // tell servo to go to position in variable 'pos'
       break; 
       
    case 'b' :
      myservo.write(150);              // tell servo to go to position in variable 'pos'
       break;   
      
    case 'c' :       
       myservo.write(180);              // tell servo to go to position in variable 'pos'
       break;  
      
    
          case 'd' :       
       myservo.write(60);              // tell servo to go to position in variable 'pos'
       break; 
      
          case 'e' :       
       myservo.write(30);              // tell servo to go to position in variable 'pos'
       break; 
      
          case 'f' :       
       myservo.write(0);              // tell servo to go to position in variable 'pos'
       break; 
       
                
          case '0' :       
     myservo.write(90);              // tell servo to go to position in variable 'pos'
        break;
       
      case 'ST':       
       analogWrite(pinPWM, 0); // 
     break;
  
      case 'F':       
     digitalWrite(pinDIR, HIGH);
     analogWrite(pinPWM, 100); // dove x = valore da 0 a 255 ( 0=fermo , 255=max velocità )
     break;
     
     case 'B':       
     digitalWrite(pinDIR, LOW);
     analogWrite(pinPWM, 100); // dove x = valore da 0 a 255 ( 0=fermo , 255=max velocità )
     break;
     
     
      letturadati=millis();
  }
  
}
}
 case 'ST':

la variable no puó assumere due lettere

Non ha senso leggere alla ceca la seriale. Succederá spesso che non ci sono dati. controlla prima con serial.available() se ci sono dati.

Considera anche il caso quando la variabile switch non ha un valore aspettato.

Ciao Uwe

ciao uwe

avevo provato con serial.available() ma la reazione hai comandi risultava molto lenta
quindi l'ho eliminato

forse l'avevo inserito in modo sbagliato ? non lo so

il case "ST" e solo provvisorio perche verra sostituito da una singola lettera

mi consigli su dove inserire il serial.available() ? magari cosi provo nuovamente

il case "ST" e solo provvisorio perche verra sostituito da una singola lettera

Anche se è "provvisorio", non può funzionare perché lo switch..case funziona solo con valori numerici o equivalenti. I char sono equivalenti ai numeri ma possono ovviamente (sennò non si chiamerebbero "carattere" come tipo dati) assumere un unico carattere.

Serial.available() non dovrebbe portarti via molto tempo di elaborazione. In pratica non fa altro che controllare se nel buffer seriale è stato memorizzato qualcosa in arrivo dal computer e rispondere con il numero di byte in memoria. Lo dovresti porre prima della lettura del buffer seriale:

void loop() {  
  time=millis();
  if(time>servotime1+100){
    if (Serial.available()) {      
      val = mySerial.read();         // read it and store it in 'val'
      .... ecc...
    }
  }
}

Oppure fare un unico check:

void loop() {  
  time=millis();
  if((time>servotime1+100) && (Serial.available()) {      
    val = mySerial.read();         // read it and store it in 'val'
    .... ecc...
  }
}

Domanda: perché fai il controllo ogni 100 ms? Per dar modo al motore di posizionarsi?
Però così fai leggere i dati ogni 100 ms anche se il motore non è stato posizionato. Io toglierei quel check e metterei solo il controllo su Serial.available e poi inserireri un eventuale delay solo in caso tu debba spostare il motore.

Ciao leo
Si i 100ms sono per dare il tempo al motore

Avevo provato solo con serial available e con delay
Ma la risposta hai comandi risulta molto lenta
Garantito

Così ho trovato una guida si Google di Vittorio zappala lezione 2 che spiega che anche con il delay si ha una lettura della seriale ogni secondo più il delay che imposti
Teoricamente sarebbe 1000 + (delay100) per un totale di 1100 ms

Quindi la reazione capisci che può avere un secondo di ritardo che sembra poco ma non lo è ve lo garantisco

Così ho provato in questo modo è ti posso garantire che il ritardo si riduce drasticamente portando Arduino alla lettura dei dati quasi istantanea

Posto la guida seguita

corso:
Così ho trovato una guida si Google di Vittorio zappala lezione 2 che spiega che anche con il delay si ha una lettura della seriale ogni secondo più il delay che imposti
Teoricamente sarebbe 1000 + (delay100) per un totale di 1100 ms

Io vedo nel codice della prima pagina un bel delay(1000) per cui sospetto che tu abbia frainteso la questione che la Serial.read impieghi 1 secondo ad essere eseguita, bensì che in quel codice venga eseguita ogni 1000 ms, che è una cosa ben diversa :wink: :wink: