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.
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:
- PitMotor Schema PDF - top
- PitMotor Schema PDF - bottom
- PitMotor Schema Fritzing
- PitMotor Sketch Arduino
- PitIR Receiver Schema Fritzing
- Datasheet IR receiver
- Datasheet L293 Motor Driver (Ponte H)
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