Motore DC direzione e velocità con Arduino e Potenziometro – Risposta

Inizialmente questo articolo era stato scritto al volo per dare una risposta al commento di Enrico, che voleva pilotare un motore dc controllandone velocità e direzione tramite un potenziometro. Data la sua semplicità di comprensione e realizzazione, credo che lo schema ed il codice siano sufficienti.
Il circuito si rifà all’articolo L298N pilotare un motore DC con Arduino.

Lo schema:

Schema dei collegamenti per questo esempio

Schema dei collegamenti per questo esempio

Ingredienti:

Il codice:

/*
 * Autore  : Andrea Lombardo
 * Web     : http://www.lombardoandrea.com
 */ 

 //definizione dei pin
static int pinDirezioneMarcia = A0; //pin analogico deputato a leggere i valori del potenziometro
static int mA = 12; //pin digitale per determinare gli stati logici da inviare al modulo
static int mB = 13; //pin digitale per determinare gli stati logici da inviare al modulo
static int pinPotenza = 11; //pin digitale tramite il quale inviare un segnale di tipo PWM tramite la funzione analgWrite()

//variabili usate per gestire e mostrare i valori di operaizone
int accelerazione;
int potenza;  //valore in uscita dal pin 11

void setup() {
  //inizializzo la comunicazione seriale cosi da mostrare i valori nel Mointor Seriale
  Serial.begin(9600);

  //inizializzo variabili
  accelerazione = 0;
  potenza = 0;

  //definisco tipologia pin
  pinMode(pinDirezioneMarcia, INPUT); //input in quanto legge il valore analogico del pin A0
  pinMode(mA, OUTPUT); //output perche' definisce lo stato logico del pin IN1 del modulo L298N
  pinMode(mB, OUTPUT); //output perche' definisce lo stato logico del pin IN2 del modulo L298N
  pinMode(pinPotenza, OUTPUT);  //output perche' definisce il valore PWM del pin EN1 del modulo L298N

  //pullDown sensore pinDirezioneMarcia
  digitalWrite(pinDirezioneMarcia, LOW);

  //Definisco il senso di marcia del motore
  /*
    mA |   mB  | Evento
    -----|-------|----------------------
    LOW  | LOW   | fermo
    LOW  | HIGH  | Movimento in un senso
    HIGH | LOW   | Movimento senso opposto
    HIGH | HIGH  | Fermo
  */

  digitalWrite(mA, LOW);
  digitalWrite(mB, HIGH);

}


void loop() {

  //leggo il valore analogico del potenziometro sul pin A0.
  int valorePotenziometro = analogRead(pinDirezioneMarcia);

  /*
    Il range dei valori analogici e' da 0 a 1023 mentre il range dei valori PWM  e' da 0 a 255
    per mantenere questa proporzionalita' eseguo la mappatura dei valori
  */
  int valoreMappato = map(valorePotenziometro, 0, 1023, 0, 255);
  determinaMovimento(valoreMappato);
}

void determinaMovimento(int valoreMappato) {
  String direzione = "";
  if (valoreMappato <= 121) {
    //vai in un senso
    digitalWrite(mA, LOW);
    digitalWrite(mB, HIGH);
    potenza = map(valoreMappato, 0, 121, 255, 0);
    direzione = "DIETRO";
  } else if (valoreMappato >= 135) {
    //vai nell'altro
    digitalWrite(mA, HIGH);
    digitalWrite(mB, LOW);
    potenza = map(valoreMappato, 135, 255, 0, 255);
    direzione = "AVANTI";
  } else if (valoreMappato > 121 && valoreMappato < 135) {
    //ferma il motore
    digitalWrite(mA, LOW);
    digitalWrite(mB, LOW);
    direzione = "FERMO";
    valoreMappato = 0;
  }

  //Invio i dati letti al Monitro seriale, cosi da poterli vedere a video
  Serial.print("Accelerazione = ");
  Serial.print(potenza);
  Serial.print(" - direzione = ");
  Serial.println(direzione);

  analogWrite(pinPotenza, potenza);
}
    Come sempre

  • Assicurati che tutti i collegamenti siano corretti;
  • Ricordati di impostare la porta COM del tuo Arduino;
  • Imposta la stessa velocità seriale definita in Serial.begin(9600), nel Monitor Seriale
  • E ricorda che io non mi assumo nessuna responsabilità per eventuali danni o disastri che causi 😀

Prodotti Amazon




Approfondimenti

Ricerche che hanno riportato a questa pagina:
%d blogger hanno fatto clic su Mi Piace per questo: