Go Down

Topic: Programmazione motore (Read 918 times) previous topic - next topic

xandrer93

Salve, sto cercando di fare la programmazione di un motore che cambi velocità e direzione in base ai valori che rileva un sensore (ir) ma non riesco a farli cambiare la velocità gradualmente. Con il codice che sto provando cambia la velocità gradualmente ma la riprende da 0 ad ogni valore che rileva il sensore. Quello che non riesco a capire è come farli  mantenere una velocità fino a quando non si avvicina ad un oggetto. Mi potreste aiutare? grazie in anticipo.
Questo è il codice con cui ho provato:
Code: [Select]

int Velocita = 125;
int x = 5;
int motore_avanti = 10;
int motore_indietro = 11;
int sensorIR = A0;                                
int val = 0;
int distance = 0;

void setup(){

 pinMode(motore_avanti, OUTPUT);
 pinMode(motore_indietro, OUTPUT);
 pinMode ( sensorIR, INPUT);
 Serial.begin(9600);
}

void loop() {
 
           // Sensore IR
           
 val = analogRead (sensorIR);
 distance = 2076/(val-11);
 
           // Motore
    for (Velocita = 0; Velocita < 255 ; Velocita = Velocita + x){
      if (val <= 65){
     analogWrite(motore_avanti, Velocita);
     digitalWrite (motore_indietro, LOW);
      }
      else if ( val >= 77){
        analogWrite (motore_indietro, Velocita);
        digitalWrite (motore_avanti, LOW);
      }
      Serial.println (Velocita);
  }
}

MadeInItaly

sarebbe MOOLTO più semplice utilizzare un potenziometro da 10k ma visto che lo comandi a distanza  8) 8)
hai provato ad utilizzare (se utilizzi un telecomando di una televisione) i tasti del volume?
se invece usi un radiocomando per le macchinine quello ha una molla che riporta il joystick nella posizione neutra cioè potenza allo 0% quindi dovresti tenere tu la levetta sollevata dalla posizione neutra e decidere TU la potenza ok ?
ciao, MII

xandrer93


sarebbe MOOLTO più semplice utilizzare un potenziometro da 10k ma visto che lo comandi a distanza  8) 8)
hai provato ad utilizzare (se utilizzi un telecomando di una televisione) i tasti del volume?
se invece usi un radiocomando per le macchinine quello ha una molla che riporta il joystick nella posizione neutra cioè potenza allo 0% quindi dovresti tenere tu la levetta sollevata dalla posizione neutra e decidere TU la potenza ok ?
ciao, MII

Il motore sarebbe il motore di una machina (telecomandata), solo che voglio farla autonoma e quindi senza telecomandi o altri controlli esterni, per ora l'unica cosa di controllo esterno ho l'applicazione di android con qualle la accendo e la spengo, se riesco a risolvere questo problema e se mi resta tempo cerchero di farle anche il controllo manuale sempre attraverso l'applicazione. E' un progetto che voglio portare all'esame.

MadeInItaly

Se usi un sensore di distanza devi dargli una velocità fissa perché se va troppo veloce il sensore non fa in tempo a "capire" la distanza e quindi si schianta  :smiley-mr-green:
È vero potresti utilizzare il delay per far aumentare la velocità ma come ti ho detto è meglio utilizzare una velocità fissa.
Ciao

xandrer93

Nel codice di sopra mi sono dimenticato di metterlo, ma ora per fare le simulazioni per finire la programmazione ho messo un delay di 500. Riguardo alla velocità so che potrei usare una velocità fissa ma vorrei farlo più "realistica" :D non so se mi spiego, cioè con una macchina vera quando hai un ostacolo davanti non ti fermi del tutto prima rallenti e poi lo aggiri, più o meno questa cosa vorrei fare :D

xandrer93

comunque ho risolto il problema, ho usato per la partenza:
Code: [Select]

if ( val < 65 ) {
    Velocita = map (val, 0, 1023, 255, 0);
    analogWrite (motore_avanti, Velocita);
    digitalWrite (motore_indietro, LOW);
  }

e per andare indietro:
Code: [Select]

if ( val >= 169 ) {
    Velocita = map (val, 0, 1023, 0, 255);
    analogWrite (motore_indietro, Velocita);
    digitalWrite (motore_avanti, LOW);
  }

Go Up