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

Controllo velocità e direzione di un motore DC con Arduino, vediamo come!
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:

/*
 * Controllo velocità e direzione di un motore DC con Arduino
 * 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 😀

Trovi su Amazon




Approfondimenti

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