Programa en Arduino con sensores CNY70 definitivo
//Proyecto cuatrimestral: Eje Movimiento
//del tiempo y las marcas…
//Mariana Pozo
//Maestría en Tecnología y Estética de las Artes Electrónicas
//UNTreF
//Segundo Año  -Agosto 2010-
//Declaración de variables 
int ledPin =  13;    // LED UV conectado al pin digital 13
int M1_A = 7; // Motor 1 entrada A
int M1_B = 8; // Motor 1 entrada B
int M1_Enable = 9; // Motor 1 Enable
int M2_A = 2; // Motor 2 entrada A
int M2_B = 4; // Motor 2 entrada B
int M2_Enable = 3; // Motor 2 Enable
int OPTO_1 = 1; // opto conectado a pin analógico 1
int OPTO_2 = 2; // opto conectado a pin analógico 2
int OPTOVal_1 = 0;//variable para almacenar pin 1 
int OPTOVal_2 = 0;//variable para almacenar pin 2 
int umbral = 500; // variable para el umbral de los sensores
void setup()
{// Inicializa los pines de salida
  Serial.begin(9600);
  
  pinMode(ledPin, OUTPUT);     
  pinMode( M1_A, OUTPUT);     
  pinMode( M1_B, OUTPUT);     
  pinMode(M1_Enable, OUTPUT); 
  pinMode( M2_A, OUTPUT);     
  pinMode( M2_B, OUTPUT);     
  pinMode(M2_Enable, OUTPUT);  
  pinMode(OPTOVal_1, INPUT); //pin para el estado del OPTO 1
  pinMode(OPTOVal_2, INPUT); //pin para el estado del OPTO 2
}
void loop(){
  
 OPTOVal_1 = analogRead(OPTO_1); //lee pin analògico en 1 
 OPTOVal_2 = analogRead(OPTO_2); //lee pin analógico en 2
 digitalWrite(ledPin, HIGH);    // enciende el led
 
if((OPTOVal_1 + OPTOVal_2)/2 < umbral)//si se cumple esta condición
   {
 delay(1000);//espera un segundo
 digitalWrite( M2_A,LOW);
 digitalWrite( M2_B, HIGH); //el motor 2 se pondrá en marcha
 analogWrite(M2_Enable, 255);//a toda velocidad
 digitalWrite(M1_A,LOW);
 digitalWrite(M1_B,LOW);//el motor 1 quedará apagado y el móvil girará sobre sí mismo
 analogWrite(M1_Enable, LOW);//deshabilita el pin Enable del puente H  
   }
  else // si no se cumple la condición
   {
  digitalWrite( M1_A, HIGH);     // Valores ALTO en A y BAJO en B simultáneamente
  digitalWrite( M1_B, LOW);      // hacen girar el motor 1( hacia ADELANTE)
  analogWrite(M1_Enable, 64);    // 
  digitalWrite( M2_A, HIGH);     // Valores ALTO en A y BAJO en B simultáneamente
  digitalWrite( M2_B, LOW);      // hacen girar el motor 2 (hacia ADELANTE)
  analogWrite(M2_Enable, 64);    //El móvil se desplaza en dirección recta
  
  delay(1000);                   // Espera un segundo
  
  
  digitalWrite( M1_A,HIGH );      // Valores ALTO en A y BAJO en B simultáneamente
  digitalWrite( M1_B, LOW );     // hacen girar el motor 1 (hacia ADELANTE)
  analogWrite(M1_Enable, 128);    // a una velocidad moderada (50%)
  digitalWrite( M2_A,HIGH );      // Valores ALTO en A y BAJO en B simultáneamente
  digitalWrite( M2_B,LOW );     // hacen girar el motor 2 (hacia ADELANTE)
  analogWrite(M2_Enable, 64);    // a menos velocidad que motor 1 (25%), cambia la dirección
  
    delay(1000);                   // Espera un segundo
    
  digitalWrite( M1_A,LOW );     // Valores BAJO en A y ALTO en B simultáneamente
  digitalWrite( M1_B,HIGH );      // hacen girar el motor 1( hacia ATRÁS)
  analogWrite(M1_Enable, 50);    // 
  digitalWrite( M2_A,LOW);     // Valores BAJO en A y ALTO en B simultáneamente
  digitalWrite( M2_B, HIGH);      // hacen girar el motor 2 (hacia ATRÁS)
  analogWrite(M2_Enable, 50);    //El móvil CAMBIA EL GIRO y se desplaza en dirección recta con veloc. moderada
  
  delay(1000);
  
  digitalWrite( M1_A,HIGH );      // Valores ALTO en A y BAJO en B simultáneamente
  digitalWrite( M1_B, LOW );     // hacen girar el motor 1 (hacia ADELANTE)
  analogWrite(M1_Enable,20);    // a una velocidad lenta
  digitalWrite( M2_A,HIGH );      // Valores ALTO en A y BAJO en B simultáneamente
  digitalWrite( M2_B,LOW );     // hacen girar el motor 2 (hacia ADELANTE) 
  analogWrite(M2_Enable, 50);    // a más velocidad que motor 1 cambia la dirección 
  
  delay(2000);
  
  digitalWrite( M1_A, LOW);      // Valores BAJO en A y ALTO en B simultaneamente
  digitalWrite( M1_B, HIGH);     // hacen girar el motor 1 (hacia ATRAS)
  analogWrite(M1_Enable, 20);    // a una velocidad lenta
  digitalWrite( M2_A, LOW);      // Valores BAJO en A y ALTO en B simultaneamente
  digitalWrite( M2_B, HIGH);     // hacen girar el motor 2 hacia ATRAS
  analogWrite(M2_Enable, 20);    // a una velocidad lenta, el móvil se desplaza en línea recta
  
  
  delay(3000);                   // Espera unos segundos
  digitalWrite(M1_Enable, LOW);  //deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(M2_Enable, LOW);  //deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(ledPin, LOW);     // apaga el led UV 
   
    }
 }
 
4-Video en correspondencia con el programa para dos motores con sensores.
PRUEBA 4
Programa simple de prueba sin sensores para 2 motores de corriente continua.
int ledPin =  13;    // LED conectado al pin digital 13
int M1_A = 7; // Motor 1 entrada A
int M1_B = 8; // Motor 1 entrada B
int M1_Enable = 9; // Motor 1 Enable
int M2_A = 2; // Motor 2 entrada A
int M2_B = 4; // Motor 2 entrada B
int M2_Enable = 3; // Motor 2 Enable
void setup()
{// Inicializa los pines de salida
  pinMode(ledPin, OUTPUT);     
  pinMode( M1_A, OUTPUT);     
  pinMode( M1_B, OUTPUT);     
  pinMode(M1_Enable, OUTPUT); 
  pinMode( M2_A, OUTPUT);     
  pinMode( M2_B, OUTPUT);     
  pinMode(M2_Enable, OUTPUT);   
}
void loop(){
  digitalWrite(ledPin, HIGH);    // enciende el led
  digitalWrite( M1_A, HIGH);     // Valores ALTO en A y BAJO en B simultaneamente
  digitalWrite( M1_B, LOW);      // hacen girar el motor 1 hacia ADELANTE
  analogWrite(M1_Enable, 20);    // 
 
  digitalWrite( M2_A, HIGH);     // Valores ALTO en A y BAJO en B simultaneamente
  digitalWrite( M2_B, LOW);      // hacen girar el motor 1 hacia ADELANTE
  analogWrite(M2_Enable, 80);    //cambia la dirección
  delay(3000);                   // Espera unos segundos
  digitalWrite(M1_Enable, LOW);  //deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(M2_Enable, LOW);  //deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(ledPin, LOW);     // apaga el led
  delay(1000);                   // Espera un segundo
  digitalWrite(ledPin, HIGH);    // enciende el led
  digitalWrite( M1_A, LOW);      // Valores BAJO en A y ALTO en B simultaneamente
  digitalWrite( M1_B, HIGH);     // hacen girar el motor 1 hacia ATRAS
  analogWrite(M1_Enable, 128);    // a una velocidad moderada (50%)
  digitalWrite( M2_A, LOW);      // Valores BAJO en A y ALTO en B simultaneamente
  digitalWrite( M2_B, HIGH);     // hacen girar el motor 2 hacia ATRAS
  analogWrite(M2_Enable, 128);    // a una velocidad moderada (50%)
  delay(3000);                   // Espera unos segundos
  digitalWrite(M1_Enable, LOW);  //deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(M2_Enable, LOW);  //deshabilita el pin Enable del puente H (el motor se detiene )
  digitalWrite(ledPin, LOW);     // apaga el led
  delay(1000);                   // Espera un segundo
}
PRUEBA 3
3-Video en correspondencia con el programa para dos motores sin sensores.
PRUEBA 2
2-Ahora está ok. Un motor gira para adelante y para atrás alternativamente con el enable del puente H.
PRUEBA 1
1-Comencé por la práctica más simple. Mover un motor para un lado y para el otro alternativamente, pero el pin del enable del puente H no estaba en el pin 9 del micro, por ende, giró solo para atrás:"E pur si muove"
Decidí subir al blog todas las instancias del proceso, aún aquellas que no tuvieron resultado favorable.
 
Bien. Ahora, hay que apoyarlo sobre las ruedas y que salga caminando !!
ResponderEliminar