Shield MODKIT
MotoProto
Test Motori
ultimo aggiornamento 29 marzo 2014


JLCPCB - 10 PCB per $ 2 (100 * 100 mm, 2-layer)
Il più grande produttore di PCB in Cina, oltre 600.000 clienti e oltre 10.000 ordini online al giorno
Produzione veloce in sole 24 ore e preventivo online gratuito: https://jlcpcb.com/quote


Lo Shield Modkit MotoProto  per Arduino rende facile il controllo di due motori DC tramite l'integrato L298 (massima corrente 2A per motore) e un display LCD 16X2 caratteri .
Nell'esempio si è testata la scheda per il comando di due motoriduttori inseriti all'interno di una base robotica tipo Rover 5


Programma test H-Bridge

Schema della sezione driver dei motori

Il circuito pilota del motore è basato sull'integrato  H-bridge L298  che può pilotare motori con assorbimento sino a 2A per canale. La scheda è alimentata dalla stessa linea Vin proveniente dalla scheda Arduino, include dei LED blu e gialli per indicare la direzione attiva, e tutte le linee in uscita sono protette da diodi Schottky tipo MBRA140

Schema della sezione LCD

Il circuito pilota display prevede la modalità a 4 bit (DB4…DB7), modalità che permette di collegare solo 7 pin, invece che 11. Vediamo come sono connessi

LCD RS →  

 pin digitale 6

LCD R/W →  

 GND

LCD Enable →  

 pin digitale 7

LCD D4 →  

 pin digitale 8

LCD D5 →  

 pin digitale 9

LCD D6 →  

 pin digitale 10

LCD D7 →  

 pin digitale 11

Oltre a è presente il collegamento all'alimentazione e al trimmer per la regolazione del contrasto. I pin D0, D1, D2, D3 sono posti a massa.
Nel circuito è inoltre presente il collegamento per l'accensione dell'eventuale retroilluminazione.      E' inoltre visualizzato nello schema il pulsante S2, a disposizione per eventuale interazione con il programma.   Tale pulsante non è dotato di resistenza di pull-up o pull-down.

 

/*
 MotoPropto_motore_LCD_test.pde
 Il programma permette il test della parte controllo
 motore. Sul display LCD dello shield, viene mostrato 
 il comando in esecuzione.
 
 Vengono utilizzati i seguenti pin
 Pin +5V     -> Alimentazione logica
 Pin GND     -> Alimentazione
 Pin Vin     -> Alimentazione motori 
 Pin 2       -> Direzione Motore A
 Pin 3       -> PWM - Velocità Motore A
 Pin 4       -> Direzione Motore B
 Pin 5       -> PWM - Velocità Motore B
 Pin 6       -> LCD RS
 Pin 7       -> LCD Enable
 Pin 8       -> LCD D4
 Pin 9       -> LCD D5
 Pin 10      -> LCD D6
 Pin 11      -> LCD D7
 Pin 12      -> Pulsante
 Pin 13      -> Led su scheda
 
 Creato il 26/11/2011
 da Adriano Gandolfo <https://www.adrirobot.it>
 This example code is in the public domain.
 */

// include il codice della libreria:
#include <LiquidCrystal.h>

// inizializzare la libreria con i numeri dei pin interfaccia
LiquidCrystal lcd(6, 7, 8, 9, 10, 11);

int M1_PWM = 3;  //PWM controllo velocità per motore 1 - pin digitale 3 
int M2_PWM = 5;  //PWM controllo velocità per motore 2 - pin digitale 3 
int M1 = 2;      //Controllo direzione per motore 1 - pin digitale 2
int M2 = 4;      //Controllo direzione per motore 2 - pin digitale 4

int speed_val(255);        //imposta velocità - valore massimo
const int buttonPin = 12;  // Numero della porta a cui è collegato il pulsante
const int ledPin =  13;    // Numero della porta a cui è collegato il led
int buttonState = 0;       // Variable per la lettura dello stato del pulsante

void setup()
{
  pinMode(M1_PWM, OUTPUT);  //Imposta i pin come uscite
  pinMode(M2_PWM, OUTPUT);
  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT);

  pinMode(ledPin, OUTPUT);       // Inizializza il pin del LED come uscita     
  pinMode(buttonPin, INPUT);     // Inizializza il pin del pulsante come ingresso 
  digitalWrite(buttonPin, HIGH); // Attiva resistenza di pull-up

  // ferma per default entambi i motori
  M1_stop();
  M2_stop();
  delay(500);

  // Imposta lcd per 16 caratteri per 2 linee
  lcd.begin(16, 2);
  // Scrittura prima linea
  lcd.print("Test H-bridge");
  lcd.setCursor(0, 1);
  lcd.print ("Robot FERMO!");
  delay(500);
}

void loop()
{
  lcd.setCursor(0, 1);
  lcd.print ("Premi un tasto");
  // Controlla se il pulsante è premuto.
  // Se è premuto il livello è basso
  // collegato a GND
   buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {         
    // Accende il LED ed esegue il programma:       
    digitalWrite(ledPin, HIGH);  

    // Robot AVANTI
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("Robot AVANTI    ");
    delay (1000);
    M1_avanti(speed_val);
    M2_avanti(speed_val);
    delay (1000);
    M1_stop();
    M2_stop();
    delay (2000);

    // Robot INDIETRO
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("Robot INDIETRO  ");
    delay (1000);
    M1_indietro(speed_val);
    M2_indietro(speed_val);
    delay (1000);
    M1_stop();
    M2_stop();
    delay (2000);

    // Robot DESTRA
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("Robot DESTRA    ");
    delay (1000);
    M1_avanti(speed_val);
    M2_indietro(speed_val);
    delay (1000);
    M1_stop();
    M2_stop();
    delay (2000);

    // Robot SINSITRA
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("Robot SINISTRA  ");
    delay (1000);
    M1_indietro(speed_val);
    M2_avanti(speed_val);
    delay (1000);
    M1_stop();
    M2_stop();
    delay (2000);
  }
  else {    
    // Spegne il LED:
    digitalWrite(ledPin, LOW); 
  }
}

/////////// Impostazione motori ////////////////

void M1_indietro(int x){
  digitalWrite(M1, LOW);
  analogWrite(M1_PWM, x);
}

void M1_avanti(int x){
  digitalWrite(M1, HIGH);
  analogWrite(M1_PWM, x);
}

void M1_stop(){
  digitalWrite(M1_PWM, LOW);
}

void M2_avanti(int y){
  digitalWrite(M2, LOW);
  analogWrite(M2_PWM, y);
}

void M2_indietro(int y){
  digitalWrite(M2, HIGH);
  analogWrite(M2_PWM, y);
}

void M2_stop(){
  digitalWrite(M2_PWM, LOW);
}

 

Elenco revisioni
29/03/2015 Realizzata pagina singola
28/11/2011 Emissione preliminare