Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Arduino: Sensores de linea

El circuito (realizado con Fritzing):

Utiliza la libreria TocaMelodia, pero puede eliminarse fácilmente comentado las lineas correspondientes.

/*
 * Este programa lee dos sensores de seguimiento (tracking sensor)
 * e indica la ruta a seguir
 *
 * 2014 - Guimi (http://guimi.net)
 */

#include <TocaMelodia.h>


// VARIABLES
//----------
const byte sensorIzq=3; // Constante que indica el pin del sensor Izquierdo
const byte sensorDer=2; // Constante que indica el pin del sensor Derecho
const byte altavoz=4; // Constante que indica el pin del altavoz

byte valorIzq=0; // Variable para guardar el valor del sensor Izquierdo [0 Negro; 1 Blanco]
byte valorDer=0; // Variable para guardar el valor del sensor Derecho [0 Negro; 1 Blanco]

byte estado=0; // 0 en marcha; 1 finalizado
byte direccion=0; // Variable que indica la direccion a seguir
                  // 0 - Quieto
                  // 1 - Izquierda
                  // 2 - Delante
                  // 3 - Derecha
                  // 9 - Final

TocaMelodia tocaMelodia(altavoz);

// FUNCION SETUP
//--------------
void setup(){
  // Definimos cada pin como entrada o salida
  pinMode(sensorIzq,INPUT);
  pinMode(sensorDer,INPUT);

  // Preparamos la comunicacion mediante el puerto serie
  Serial.begin(9600);
  
  tocaMelodia.toca(MELODIA_FANFARRIA);
}


// FUNCION LOOP
//-------------
void loop(){
  // Mientras el estado sea funcionando
  while (estado = 0) {
    // Leemos el valor de los sensores [0-1]
    valorIzq=digitalRead(sensorIzq);
    valorDer=digitalRead(sensorDer);
  
    // Mostramos informacion  
    Serial.print("Izquierda:");
    Serial.print(valorIzq);
    Serial.print("; Derecha:");
    Serial.print(valorDer);
  
    // Establecemos direccion en base a las lecturas
    if (valorIzq && valorDer) { movimiento(2); } // Delante
    else if (valorIzq && !valorDer) { movimiento(3); } // Derecha
    else if (!valorIzq && valorDer) { movimiento(1); } // Izquierda
    else {movimiento(0);} // Quieto
      
    // Esperamos un tiempo de reaccion para los componentes
    delay(50);
  }

  //while(1); // Bucle infinito para parar el programa
}

void movimiento(byte direccion) {
  Serial.print("; Direccion:");
  switch(direccion){
    case 0:
      Serial.println("Quieto");
      tocaMelodia.toca(MELODIA_PODER_PERRUNO);
      delay(2000);
      estado=1;
      break;
    case 1:
      Serial.println("Izquierda");
      break;
    case 2:
      Serial.println("Delante");
      break;
    case 3:
      Serial.println("Derecha");
      break;
  } 
}