PitMotor

Scheda motore basata sul L293D (Scheda Motore del Pit)

La scheda serve per controllare un piccolo rover con due ruote indipendenti e avere la possibilità di utilizzare gli altri pin di Arduino per i controlli e per montare un sensore a ultrasuoni per evitare gli ostacoli (questo sara uno sviluppo futuro).

Ai lati sono presenti anche due ponticelli da utilizzare per attivare o meno i motori. Se on il motore è attivo. Questi sono collegati ai pin 4 e 2 di Arduino. Se necessitano ulteriori pin per altri sviluppi. Si possono liberare i pin (cambiare i ponticelli) e alimentare direttamente il ponte H con VCC.

 

ozio_gallery_jgallery

 

Cosa serve:

  • IC L293D (ponte H)
  • Arduino Mini
  • 1838B IR ricevitore infrarossi
  • HC-SR04 - sensore di distanza ad ultrasuoni
  • Telecomando di apparecchiatura rotta
  • stagno
  • resistenze
  • condensatore
  • pin header

Download:

Codice Sorgente:


/*
PitMotor03.ino - Sketch di controllo di una Rover con due motori
                 ZappocoS dicembre 2014 - gennaio 2015 
PitMotor08 --> shield di controllo di due motori tramite Arduino Pro Mini
Modifica e sviluppo dello:
Sketch per il controllo bidirezionale della velocità di
due motori DC collegati a un driver L293.
Pier Calderan - Luglio 2013
*/
/* libreria per IR */
#include "IRremote.h"
int receiver = 11;          // pin segnale del ricevitore IR a Arduino digital pin ~5 (PWM)
IRrecv irrecv(receiver);    // create instance of 'irrecv'
decode_results results;     // create instance of 'decode_results'
const int spuntoDelay  =  20;   // durata dello spunto
// motore 1      
const int enable1Pin =  2; // 7;   // porta digitale       per il pin  1 (1,2EN)
const int motor1Pin  =  8; // 8;   // porta digitale       per il pin  2 (1A) --> direzione della rotazione
const int motor2Pin  =  9; // 9;   // porta digitale (PWM) per il pin  7 (2A) --> velocità  della rotazione
// motore 2 
const int enable2Pin =  4; // 4;   // porta digitale       per il pin  9 (3,4EN)
const int motor3Pin  =  7; // 2;   // porta digitale       per il pin 10 (3A) --> direzione della rotazione
const int motor4Pin  =  6; // 5;   // porta digitale (PWM) per il pin 15 (4A) --> velocità  della rotazione
int direction1 = HIGH;
int direction2 = HIGH;
int deltaSpeed1 = 50;
int deltaSpeed2 = 50;
int speed1 = 2 * deltaSpeed1;
int speed2 = 2 * deltaSpeed2;
int spuntoFlag = false;
void setup() {
      Serial.begin(9600);
      Serial.println("PitMotor Test");
      Serial.println("revised by Zappoco 12/2014");  
      Serial.println("--------------------------");  
      Serial.println("");  
      // motore 1 
      pinMode(enable1Pin, OUTPUT);
      pinMode(motor1Pin, OUTPUT);
      pinMode(motor2Pin, OUTPUT);
      // motore 2 
      pinMode(enable2Pin, OUTPUT);
      pinMode(motor3Pin, OUTPUT);
      pinMode(motor4Pin, OUTPUT);
      // abilitazione dei due motori:
      // digitalWrite(enable1Pin, HIGH); // --> per liberare un pin puo essere alimentato direttamente 5V
      // digitalWrite(enable2Pin, HIGH); // --> per liberare un pin puo essere alimentato direttamente 5V
      irrecv.enableIRIn();            // fa partire il ricevitore infrarossi
}
void loop() {
  if (irrecv.decode(&results))        // il ricevitore ha ricevuto un segnale IR ?
  {
    Serial.println(results.value, HEX);  //UN Comment to see raw values
    translateIR(); 
    irrecv.resume(); // riceve il prossimo valore
  }  
  // PitMotor (direction1, speed1, direction2, speed2);
  delay (400);
}
// void PitMotor (int direction1, int speed1, int direction2, int speed2)
void PitMotor ()   // usa le variabili globali
{
    //  controllo delle velocità massime
    if (speed1 > 255) { speed1 = 255 ;}  
    if (speed1 < 0)   { speed1 = 0 ; }  
    if (speed2 > 255) { speed2 = 255;  }  
    if (speed2 < 0)   { speed2 = 0 ; }  
    // se l'interruttore 1 è chiuso il motore gira verso sinistra
    if (direction1 == HIGH) 
    {
      Serial.println("Motor1    : avanti");
      Serial.print("speed1    : ");
      Serial.println(speed1);
      digitalWrite(motor1Pin, HIGH); 
      if (spuntoFlag == true  || speed1 <=60 ){
        Serial.println("          : spunto");
        analogWrite(motor2Pin, 0);           // spunto
        delay(spuntoDelay);          
      }
      analogWrite(motor2Pin, 255-speed1);  // mantiene i valori con la rotazione invertita
    }
    // se l'interruttore 1 è aperto il motore gira verso destra
    else {
      Serial.println("Motor1    : indietro");
      Serial.print("speed1    : ");
      Serial.println(speed1);
      digitalWrite(motor1Pin, LOW);  
      if (spuntoFlag == true  || speed1 <=60 ){
        Serial.println("          : spunto");
        analogWrite(motor2Pin, 255);           // spunto
        delay(spuntoDelay);          
      }
      analogWrite(motor2Pin, speed1);
    }
    // se l'interruttore 2 è chiuso il motore gira verso sinistra
    if (direction2 == HIGH) 
    {
      Serial.println("Motor2    : avanti");
      Serial.print("speed2    : ");
      Serial.println(speed2);
      digitalWrite(motor3Pin, HIGH);
      if (spuntoFlag == true || speed2 <=60 ){
        Serial.println("          : spunto");
        analogWrite(motor4Pin, 0);           // spunto
        delay(spuntoDelay);    
      }      
      analogWrite(motor4Pin, 255-speed2); // mantiene i valori con la rotazione invertita
    }
    // se l'interruttore 2 è aperto il motore gira verso destra
    else {
      Serial.println("Motor2    : indietro");
      Serial.print("speed2    : ");
      Serial.println(speed2);
      digitalWrite(motor3Pin, LOW);  
      if (spuntoFlag == true || speed2 <=60 ){
        Serial.println("          : spunto");
        analogWrite(motor4Pin, 255);           // spunto
        delay(spuntoDelay);         
      }
      analogWrite(motor4Pin, speed2);
    }
    Serial.println("  ");    
    Serial.println(" ---------------------------  ");    
    Serial.println("  ");    
}
/*-----( Declare User-written Functions )-----*/
void translateIR() // takes action based on IR code received
// describing KEYES Remote IR codes 
// DIGIQUEST 7310T
{
  switch(results.value)
  {
  // - riga 1
  case 0xFD9A65:   Serial.println(" StanBy");
  case 0x15629B25: Serial.println(" StanBy");
       Serial.println(" Motor 2 - OFF");
       digitalWrite(enable2Pin, LOW); // spegne motore 2
       break;
  case 0xFD1AE5:   Serial.println(" Info"); 
  case 0xBBB54321: Serial.println(" Info");
       Serial.println(" Motor 2 - ON");
       digitalWrite(enable2Pin, HIGH); // accende motore 2
       spuntoFlag = true;
       PitMotor ();
       break;
  case 0xFD18E7:   Serial.println(" SubTitle");
  case 0xC76EF4E5: Serial.println(" SubTitle");
       Serial.println(" Motor 1 - ON");
       digitalWrite(enable1Pin, HIGH); // accende motore 1
       spuntoFlag = true;
       PitMotor ();
       break;
  case 0xFD9867:   Serial.println(" Mute");
  case 0x57E346E1: Serial.println(" Mute");
       Serial.println(" Motor 1 - OFF");
       digitalWrite(enable1Pin, LOW);  // spegne motore 1
       break;
  // - canali e volume
  case 0xFDB24D:   Serial.println(" CH +");
  case 0x13F0CDE5: Serial.println(" CH +");
       speed1 = speed1 + deltaSpeed1;
       speed2 = speed2 + deltaSpeed2;
       PitMotor ();
       break;
  case 0xFD8A75:   Serial.println(" CH -");
  case 0x2CD8C901: Serial.println(" CH -");
       speed1 = speed1 - deltaSpeed1;
       speed2 = speed2 - deltaSpeed2;
       PitMotor ();
       break;
  case 0xFD708F:   Serial.println(" RECALL");
  case 0x6BFD8B01: Serial.println(" RECALL");
       Serial.println(" Motor 1 - ON");
       digitalWrite(enable1Pin, HIGH); // accende motore 1
       Serial.println(" Motor 2 - ON");
       digitalWrite(enable2Pin, HIGH); // accende motore 2
       spuntoFlag = true;
       PitMotor ();
       break;
  case 0xFD48B7:   Serial.println(" PAUSE");
  case 0x986FB325: Serial.println(" PAUSE");
       Serial.println(" Motor 1 - OFF");
       digitalWrite(enable1Pin, LOW); // spegne motore 1
       Serial.println(" Motor 2 - OFF");
       digitalWrite(enable2Pin, LOW);  // spegne motore 2
       break;
  case 0xFDB04F:   Serial.println(" VOL +");
  case 0x42640C99: Serial.println(" VOL +");
       speed1 = speed1 + deltaSpeed1;
       speed2 = speed2 + deltaSpeed2;
       PitMotor ();       
       break;
  case 0xFD8877:   Serial.println(" VOL -");
  case 0x6F5974BD: Serial.println(" VOL -");
       speed1 = speed1 - deltaSpeed1;
       speed2 = speed2 - deltaSpeed2;
       PitMotor ();
       break;
  case 0xFDA25D:   Serial.println(" MENU");
  case 0xCEBE4CC1: Serial.println(" MENU");
       speed1 = speed1 + deltaSpeed1 / 2;
       speed2 = speed2 - deltaSpeed2 / 2;
       direction1 = HIGH;
       direction2 = HIGH;
       spuntoFlag = true;
       PitMotor ();       
       break;
  case 0xFDA05F:   Serial.println(" EXIT");
  case 0xA6B913BD: Serial.println(" EXIT");
       speed1 = speed1 - deltaSpeed1 / 2;
       speed2 = speed2 + deltaSpeed2 / 2;
       direction1 = HIGH;
       direction2 = HIGH;
       spuntoFlag = true;
       PitMotor ();       
       break;
  // - spostamenti
  case 0xFD609F:   Serial.println(" FORWARD");
  case 0xD0529225: Serial.println(" FORWARD");
       speed1 = (speed1 + speed2) / 2;
       if (speed1 == 0) {
         speed1 = deltaSpeed1;
         speed2 = deltaSpeed2;
       }
       direction1 = HIGH;
       direction2 = HIGH;
       spuntoFlag = true;
       PitMotor ();
       break;
  case 0xFD5AA5:   Serial.println(" LEFT");
  case 0xC806D53D: Serial.println(" LEFT");
       speed1 = speed1 + deltaSpeed1;
       speed2 = speed2;
       PitMotor ();       
       break;
  case 0xFD58A7:   Serial.println(" -OK-");
  case 0x90C35B01: Serial.println(" -OK-");
       speed1 = 0;
       speed2 = 0;
       PitMotor ();
       break;
  case 0xFDD827:   Serial.println(" RIGHT");
  case 0xD035B645: Serial.println(" RIGHT");
       speed1 = speed1;
       speed2 = speed2 + deltaSpeed2;
       PitMotor ();       
       break;
  case 0xFD6897:   Serial.println(" REVERSE"); 
  case 0x85E09D61: Serial.println(" REVERSE");
       speed1 = (speed1 + speed2) / 2;
       if (speed1 == 0) {
         speed1 = deltaSpeed1;
         speed2 = deltaSpeed2;
       }
       direction1 = LOW;
       direction2 = LOW;
       spuntoFlag = true;
       PitMotor ();
       break;
  case 0xFDAA55:   Serial.println(" EPG");
  case 0x73A3CEBD: Serial.println(" EPG"); 
       speed1 = speed1 + deltaSpeed1 / 2;
       speed2 = speed2 - deltaSpeed2 / 2;
       direction1 = LOW;
       direction2 = LOW;
       spuntoFlag = true;
       PitMotor ();       
       break;
  case 0xFDA857:   Serial.println(" FAV");
  case 0x25802501: Serial.println(" FAV"); 
       speed1 = speed1 - deltaSpeed1 / 2;
       speed2 = speed2 + deltaSpeed2 / 2;
       direction1 = LOW;
       direction2 = LOW;
       spuntoFlag = true;
       PitMotor ();       
       break;
  case 0xFDC837:   Serial.println(" PAGE +");
  case 0xE7ABE421: Serial.println(" PAGE +");   break;
  case 0xFDE817:   Serial.println(" PAGE -");
  case 0xD51CCE5D: Serial.println(" PAGE -");    break;
  // OK -- Numeri
  case 0xFD4AB5:   Serial.println(" 1");
  case 0xCFB32D61: Serial.println(" 1");    break;
  case 0xFD0AF5:   Serial.println(" 2");
  case 0xD32B70FD: Serial.println(" 2");    break;
  case 0xFD08F7:   Serial.println(" 3");
  case 0xDEE522C1: Serial.println(" 3");    break;
  case 0xFD6A95:   Serial.println(" 4");
  case 0x9D3D4D25: Serial.println(" 4");    break;
  case 0xFD2AD5:   Serial.println(" 5");
  case 0xE32F7CC1: Serial.println(" 5");    break;
  case 0xFD28D7:   Serial.println(" 6");
  case 0xCBD2CCFD: Serial.println(" 6");    break;
  case 0xFD728D:   Serial.println(" 7");
  case 0x74514645: Serial.println(" 7");
       deltaSpeed2 = deltaSpeed2 + 1; 
       speed2 = speed2 + 1;
       PitMotor ();       
       break;
  case 0xFD32CD:   Serial.println(" 8");
  case 0xBA4375E1: Serial.println(" 8");
       deltaSpeed2 = deltaSpeed2 - 1; 
       speed2 = speed2 - 1;
       PitMotor ();       
       break;
  case 0xFD30CF:   Serial.println(" 9");
  case 0xB1EFBA9D: Serial.println(" 9");
       deltaSpeed1 = deltaSpeed1 - 1; 
       speed1 = speed1 - 1;
       PitMotor ();       
       break;
  case 0xFDF00F:   Serial.println(" 0");
  case 0x6539FA7D: Serial.println(" 0");
       deltaSpeed1 = deltaSpeed1 + 1; 
       speed1 = speed1 + 1;
       PitMotor ();       
       break;
  // OK -- ultime righe
  case 0xFD52AD:   Serial.println(" AUDIO");
  case 0x168E56C1: Serial.println(" AUDIO");  break;
  case 0xFD12ED:   Serial.println(" LANG");
  case 0xA3CC4A5:  Serial.println(" LANG");  break;
  case 0xFD10EF:   Serial.println(" TV/RADIO");
  case 0x1E90961:  Serial.println(" TV/RADIO");  break;
  case 0xFDD02F:   Serial.println(" TTX");
  case 0xAAFCAC1:  Serial.println(" TTX");  break;
  case 0xFD629D:   Serial.println(" ROSSO");
  case 0x2F1EC521: Serial.println(" ROSSO");  break;
  case 0xFD22DD:   Serial.println(" VERDE");
  case 0x7510F4BD: Serial.println(" VERDE");  break;
  case 0xFD20DF:   Serial.println(" GIALLO");
  case 0x1644C1C1: Serial.println(" GIALLO");  break;
  case 0xFDE01F:   Serial.println(" BLU");
  case 0xC98F01A1: Serial.println(" BLU");  break;
  default: 
    Serial.println(" other button   ");
  }// End Case
  spuntoFlag = false;
  //Serial.print("spuntoFlag :");
  //Serial.println(spuntoFlag);
  delay(500); // Do not get immediate repeat
} //END translateIR
/* ( THE END ) */


 

ZappocoS, gennaio 2015