PROGRAMMA DA REVISOINARE

salve, qualcuno di voi che se ne intende potrebbe controllare questo programma? funziona tutto, ha giusto qualche bug in modalità automatica, che a volte non esce ma per il resto va tutto.

poi per l alimentazione userò una batteria 12v 27ampere, secondo voi basta?
grazie mille

#include <SoftwareSerial.h>
#include <Servo.h> 
#define echoPin 2                            // Pin to receive echo pulse
#define trigPin 3

 SoftwareSerial BluetoothSerial = SoftwareSerial(0, 1); //si richiama il modulo bluetooth
 Servo myservo;
 
 const int input1m1 = 9; //input1 per il motore 1
 const int input2m1 = 10;//input2 per il motore 2
 const int enablem1 = 11;//regolatore motore 1
 char marcia;
 int velmotore = 0;
 int i;
 
  
void setup() {
   Serial.begin(9600);
   BluetoothSerial.begin(9600);  //si stabliscono le variabii generali
   pinMode(echoPin, INPUT);// set echopin input
   pinMode(trigPin, OUTPUT); // set pin trigger output
   pinMode(input1m1, OUTPUT);
   pinMode(input2m1, OUTPUT);
   pinMode(enablem1, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);
   myservo.attach(13);  // attaches the servo on pin 9 to the servo object 
  myservo.write(120);
}

void loop() {
 if (BluetoothSerial.available()){
    marcia=BluetoothSerial.read(); //vengono lette le marce e di conseguenza la velocità

 if(marcia=='1'){
    velmotore = 25;
    }
    
     if(marcia=='2'){
    velmotore = 51;
    }
    
     if(marcia=='3'){
    velmotore = 76;
    }
    
     if(marcia=='4'){
    velmotore = 102;
    }
    
     if(marcia=='5'){
    velmotore = 127;
    }
    
     if(marcia=='6'){
    velmotore = 153;
    }
    
     if(marcia=='7'){
    velmotore = 178;
    }
    
     if(marcia=='8'){
    velmotore = 204;
    }
    
     if(marcia=='9'){
    velmotore = 229;
    }
    
     if(marcia=='q'){
    velmotore = 254;
    }
    
if(marcia== 'U'){
    do
 {
    digitalWrite(trigPin, LOW);// si imposta il trigpin spento per 2 microsecondi
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);//invia per 10 microsecondi un segnale
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);// si spegne il trigpin
  int distance = pulseIn(echoPin, HIGH); // si legge il segnale (distanza in tempo <x>)
  distance= distance/58;
   if((distance>30)&&(distance!=0)){  // a volte arrivano degli zeri e quelli non li devo prendere in considerazione
    digitalWrite(input1m1,HIGH); // accendo il motore
    digitalWrite(input2m1,LOW);
    analogWrite(enablem1, 200);
   }
   if((distance<30)&&(distance!=0)){
      analogWrite(enablem1, 0);  //il motore si ferma e indica col cicalino l'arresto
      digitalWrite(7,HIGH);
      delay(500);
      digitalWrite(7,LOW);
      delay(500);
   }

    if(BluetoothSerial.available() && BluetoothSerial.read()=='u') {goto fuori;}
  } while(marcia=='U');
}
fuori:
if(marcia=='W'){                //luci
  digitalWrite(6,HIGH);
}  
if(marcia=='w'){
  digitalWrite(6,LOW);
}

if(marcia=='V'){             //clacson
  digitalWrite(7,HIGH);
}  
if(marcia=='v'){
  digitalWrite(7,LOW);
}  
   
if(marcia=='X'){             //4 frecce
  do{
  digitalWrite(8,HIGH);
  delay(750);
  digitalWrite(8,LOW);
  delay(750);
  if(BluetoothSerial.available() && BluetoothSerial.read()=='x') {digitalWrite(8,LOW);}
}while(marcia=='X');
}

if(marcia=='F'){
     digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
     digitalWrite(input2m1, LOW);
     analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     Serial.print("avanti");
  }
  
  else{
   analogWrite(enablem1, 0); //senza comando il motore si ferma
}
  
  if(marcia=='B'){
  digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
  digitalWrite(input2m1, HIGH);
  analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
  }
  if(marcia=='L'){
      myservo.write(70);
     }
     else{
      myservo.write(120);
     }
     if(marcia=='R'){
      myservo.write(190);
     }
     
     if(marcia=='G'){                //AVANTI A SINISTRA
     digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
     digitalWrite(input2m1, LOW);
     analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     myservo.write(70);
  }
  
  if(marcia=='I'){                     //AVANTI A DESTRA
     digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
     digitalWrite(input2m1, LOW);
     analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     myservo.write(190);
  }
  
  if(marcia=='H'){             //DIETRO A SINISTRA
     digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
  digitalWrite(input2m1, HIGH);
  analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     myservo.write(190);
  }
  if(marcia=='J'){
     digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
  digitalWrite(input2m1, HIGH);
  analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     myservo.write(70);
  }
}
}

è perfetto!

grazie. ma come mai quando esce dalla modalità automatica ogni tanto non esegue il comando? o meglio l istruzione gli arriva ma non la esegue, bisogna insistere inviando il comando a volte.

p.s.: uso arduino uno

Ok vedo che non sono molto ferrato in materia di sarcasmo, cerco di essere piu chiaro. Non avendo idea di cosa deve fare il tuo programma, quale HW è stato messo a disposizione e come è stato collegato, è impossibile dirti se lo sketch va bene oppure no.

Attenzione che potrebbe passare di qui l'utente che ha in calce
"Usare il GOTO in C è ammettere la propria sconfitta come programmatore" :slight_smile: :slight_smile:

dove hai preso quel programma?
non mi dire "non sono un programmatore", perchè non sei nemmeno un copiatore ..... :slight_smile:

sicuro di usare correttamente il pulsein e i debounce?
Però come detto senza logica descritta dell'hardware è come dire ad un architetto "fammi una casa con tetto e qualche finestra ... se ci riesci anche una porta"

Che Arduino hai? presumo un arduino UNO o MEGA

SoftwareSerial BluetoothSerial = SoftwareSerial(0, 1);

Perché usi i pin della seriale Hardware con la seriale emulata via software?

do
 {
...
if(BluetoothSerial.available() && BluetoothSerial.read()=='u') {goto fuori;}
  } while(marcia=='U');

Qua il goto é inutile. Il while uscirabbe comunque se scrivi "marcia=='u';" al posto del goto

Togli quei delay

Ciao Uwe

allora rispondendo in ordine:
1-il programma serve a controllare un auto radiocomandata. riceve impulsi dal modulo bluetooth che la fanno muovere, ho messo un commento ad ogni funzione cercando di essere il più chiaro possibile. le funzioni sono : LUCI, CLACSON, AVANTI, DIETRO, DESTRA, SINISTRA, MOD. AUTOMATICA (in pratica serve a far evitare gli ostacoli)

da premettere questo prima che inserissi le funzioni del servomotore (che fa curvare l auto), l uscita dalla modalità automatica andava egregiamente

2-non sono un copiatore seriale questo è vero, ma nemmeno un programmatore tanto è vero che non so che siano i pulsein e i debounce

3-uso arduino UNO (come ho scritto sopra)

4-la 'softwareserial' mi serve perche ho attaccato un modulo bluetooth, al quale collego i pin TX e RX ad arduino (TX-RX e RX-TX), ho se non mi sbaglio è cosi ce si collegano

5-i delay mi servono per controllare continuamente se ci siano ostacoli

Ok, mi ricordo il progetto.

Clash230:
4-la 'softwareserial' mi serve perche ho attaccato un modulo bluetooth, al quale collego i pin TX e RX ad arduino (TX-RX e RX-TX), ho se non mi sbaglio è cosi ce si collegano

La softserial è una libreria che ha funzione di simulare una porta seriale UART, non ha senso simularla esattamente sugli stessi pin dove è presente un modulo UART HW, usa la classe Serial.

ok per il resto va tutto bene?