Vi piace il mio braccio?? :D

Nuovi aggiornamenti..

byte pwm_1 = 3; //Pin Velocità motore 1
byte pwm_2 = 11; //Pin Velocità motore 2
byte pwm_3 = 5; //Pin Velocità motore 3
byte pwm_4 = 6; //Pin Velocità motore 3
byte pwm_5 = 10; //Pin Velocità motore 4
byte dir_1 = 12; //Pin Direzione motore 1
byte dir_2 = 13; //Pin Direzione motore 2
byte dir_3 = 8; //Pin Direzione motore 3
byte dir_4 = 9; //Pin Direzione motore 4
byte dir_5a = 2; //Pin Direzione moore 5
byte dir_5b = 7; //Pin Direzione motore 5
byte stato_1 = 0; //Stato direzione morore 1
byte stato_2 = 0; //Stato direzione morore 2
byte stato_3 = 0; //Stato direzione morore 3
byte stato_4 = 0; //Stato direzione morore 4
byte stato_5 = 0; //Stato direzione morore 5
byte command = 0; //Comando per movimento
byte pwm_speed = 255; // Velocità motori
unsigned long time_pause = 0; //parametro per pausa
boolean esci = false; //uscita da ciclo while

void setup()
{
  // Inizio comunicazione seriale a 9600
  Serial.begin(9600);
  pinMode(pwm_1, OUTPUT);
  pinMode(pwm_2, OUTPUT);
  pinMode(pwm_3, OUTPUT);
  pinMode(pwm_4, OUTPUT);
  pinMode(dir_1, OUTPUT);   
  pinMode(dir_2, OUTPUT);
  pinMode(dir_3, OUTPUT);
  pinMode(dir_4, OUTPUT);
}

void loop()
{
  if (Serial.available() > 0) { //Se sono presenti dati nel buffer
    leggi_seriale(); //li leggo con la funzione
  }
  switch (command) { //Switch sul comando
  case 'q':
    clear_command();
    if (stato_1 == 0) 
    { 
      pausa(); 
      analogWrite(pwm_1, pwm_speed);
      digitalWrite(dir_1, LOW); 
      Serial.println("Chiude pinza");
      stato_1 = 1;
      break; 
    }
    else if (stato_1 == 1)
    {
      pausa();
      analogWrite(pwm_1, pwm_speed);
      digitalWrite(dir_1, HIGH);
      Serial.println("Apre pinza");
      stato_1 = 0;
      break;  
    }
  case 'w':
    clear_command();  
    if (stato_2 == 0) 
    {  
      pausa();
      analogWrite(pwm_2, pwm_speed);
      digitalWrite(dir_2, LOW); 
      Serial.println("Scende braccio 1");
      stato_2 = 1;
      break; 
    }
    else if (stato_2 == 1)
    {
      pausa();
      analogWrite(pwm_2, pwm_speed);
      digitalWrite(dir_2, HIGH);
      Serial.println("Sale braccio 1");
      stato_2 = 0;
      break;  
    }
  case 'e':
    clear_command();  
    if (stato_3 == 0) 
    { 
      pausa(); 
      analogWrite(pwm_3, pwm_speed);
      digitalWrite(dir_3, LOW); 
      Serial.println("Sale braccio 2");
      stato_3 = 1;
      break; 
    }
    else if (stato_3 == 1)
    {
      pausa();
      analogWrite(pwm_3, pwm_speed);
      digitalWrite(dir_3, HIGH);
      Serial.println("Scende braccio 2");
      stato_3 = 0;
      break;  
    }
  case 'r': 
    clear_command();  
    if (stato_4 == 0) 
    { 
      pausa();
      analogWrite(pwm_4, pwm_speed);
      digitalWrite(dir_4, LOW); 
      Serial.println("Scende braccio 3");
      stato_4 = 1; 
      break; 
    }
    else if (stato_4 == 1)
    {
      pausa();
      analogWrite(pwm_4, pwm_speed);
      digitalWrite(dir_4, HIGH);
      Serial.println("Sale braccio 3");
      stato_4 = 0;
      break;  
    }
  case 't': 
    clear_command();  
    if (stato_5 == 0) 
    { 
      pausa(); 
      analogWrite(pwm_5, pwm_speed);
      digitalWrite(dir_5a, LOW);
      digitalWrite(dir_5b, HIGH); 
      Serial.println("Gira a destra");
      stato_5 = 1;
      break; 
    }
    else if (stato_5 == 1)
    {
      pausa();
      analogWrite(pwm_5, pwm_speed);
      digitalWrite(dir_5a, HIGH);
      digitalWrite(dir_5b, LOW); 
      Serial.println("Gira a sinistra");
      stato_5 = 0;
      break;   
    }
  case '1':
    pausa();
    clear_command();
    analogWrite(pwm_1, 0);
    analogWrite(pwm_2, 0);
    analogWrite(pwm_3, 0);
    analogWrite(pwm_4, 0);
    analogWrite(pwm_5, 0);
    Serial.println("Stop!");
    break;
  case 's':
    clear_command();
    Serial.print ("Pwm impostato a: ");
    Serial.println (pwm_speed, DEC);
    break;
  case 'a':
    clear_command();
    delay(250);
    break;
  }
}

void leggi_seriale(){
  byte cont = 0;
  char char_in[10];
  esci = false;
  if (Serial.available()>0) {
    command = Serial.read();
    delay(2);
  }
  while (esci == false) {
    if (Serial.available()>0) {
      char_in[cont] = Serial.read();
      if (char_in[cont] != ';') {
        cont ++;
      }
      else {
        char_in[cont] == '/0';
        esci = true;
        //break;
      }
      delay(2);
    }
  }
  if (command == 'p') {
    clear_command();
    if (cont <= 3 ) {
      pwm_speed = atoi(char_in);
      Serial.print("Velocità pwm impostata a: ");
      Serial.println(pwm_speed, DEC);
    }
    else if (cont > 3 ) {
      Serial.println("Parametri accettati 0-255");
      cont = 0;
    }
    else {
      time_pause = atoi(char_in);
    }
  }
  cont = 0;
}

void pausa(){
  delay(time_pause);
  time_pause=0;
}

void clear_command(){
  command = 0;
}

Ho corretto la parte riguardante la lettura dalla seriale. In questo modo è stato raggruppato il comando per l'impostazione del pwm perchè usava la stessa identica procedura! Ho portato la pulizia del comando ricevuto in una funzione, cos' da scriverlo una sola volta! In questo modo sono passato da circa 6,8k del primo sketch a 4.1k di questo!!

Io ti posto la mia proposta :wink:
Prova a vedere se ti è chiaro cosa ho scritto.
Caso mai lo commentiamo assieme :wink:

edit:
Binary sketch size: 2960 bytes (of a 30720 byte maximum)

Braccio.zip (2.93 KB)

Dai, così non vale.. Dovresti prendertela con quella della tua età!! Aahahah!! :smiley:
Scerzi a parte... Penso di averci capito poco, o quasi niente. Direi a partire da tutto.. Mi sà proprio che devo studiare il C prima di arrivare a tanto! Se avessi la pazienza di spiegarlo te ne sarei grato, altrimenti cerco di capirlo da solo con calma! In ogni caso vorrei capire, non copiare!

ha ha ha ha
A parte lo studiarsi la programmazione in c/c++ che ti consiglio caldamente.
I comandi per i motori sono di 3 tipi.
Li ho messi dentro 3 funzioni.
Poi la funzione che legge da seriale, converte al volo i numeri, senza passare per funzioni precostituite (occupando meno spazio, non utilizzando array d'appoggio). (E' solo un'embrione di parser, forse funziona :wink: ) Arduino è a casa, e non ho la possibilità di verificare il tutto dall'ufficio.
In ogni caso.

  1. Organizzo la memoria con i riferimenti alle funzioni da chiamare.
  2. Chiamo le operazioni in funzione del codice numerico che esce (tramite Token.Command) dalla seriale.
    Nulla di complesso. Solo riorganizzato il codice, senza ridondanza di istruzioni :wink:

Facciamo prima se mi chiedi i singoli punti :smiley:

Allora.. Adesso devo uscire quindi fino a stasera, se sarò a casa non se ne parla! Poi guarderò meglio e con più attenzione!!