Presentación - Desde Argentina

PRESENTACIÓN
Hola a toda la comunidad arduinera, me llamo Marcos y soy de a provincia de Córdoba en Argentina. Tengo 22 y estudio Diseño y Producción Audiovisual.
Desde hace tiempo me interesa y soy usuario el software libre, ultimamente trato de acercar estos intereses a mi campo de acción y es ahí en donde descubro a Reactivision, Processing y recientemente Arduino.
Es sorprendente la convergencia de todos estas tecnologías y la potencialidad al momento de generar un entorno interactivo.
Con menos conocimientos de electrónica que de programación (y se bastante poco :stuck_out_tongue: ) mande a pedir un Arduino. Ahora estoy a la espera pero no puedo aguantar mas.
Por el momento me recorrí todas las casas de computación de mi ciudad pidiéndoles que me guarden todos sus desechos de hardware. Entre las partes de discos rígidos y lectoras de CD se me ocurrió armar un pequeño "robot" buscador de luz.

Acá les dejo el código para que me digan que le puedo cambiar.
Los ingredientes son:

  • 1x Arduino
  • 1x Carcasa de lectora de CD
  • 2x Motor de disco rigido con su disco como rueda
  • 2x Sensor de luz (creo que LDR :-? )
  • 1x LED para indicar el proceso
////////////////////////////////////////
////////////////////////////////////////
////                                        ////
////  BICHILUZbot v0.0.0.0.1b  ////
////                                        ////
////////////////////////////////////////
////////////////////////////////////////


int i_motor[] = {3,4,5};  //array con los contacos del motor izquierdo
int d_motor[] = {6,7,8};  //array con los contacos del motor izquierdo
int velocidad = 1; //multiplicador de la velocidad
int botArranque = 9; //Inicia y reinicia la busqueda
int ledBuscando = 10;  //Se enciende cuando encuentra una fuente de luz
int i_ojo = 4;//sensor de luz izquierdo
int d_ojo = 5;//sensor de luz derecho
int activo = 0;
int l_izq = 0;
int l_der = 0;
int umbral = 100; //diferencia suficiente en los sensores para considerar un giro
int pista = 200; //suficiente luz como para considerarla un indicio
int encontrada = 1000; //luz suficiente para considerar terminado el programa

void setup(){
 pinMode(botArranque, INPUT);
 pinMode(ledBuscando, OUTPUT);
 for(int i=0; i <3; i++){ pinMode(i_motor[i], OUTPUT); pinMode(d_motor[i], OUTPUT);}
}

void loop() {
  if(activo == 0){
  activo = digitalRead(botArranque);  //espera a que apretemos el boton de arranque para inciar
  }
  else{ //aca es en donde comienza la magia :-)
    digitalWrite(ledBuscando, HIGH);
    l_izq = analogRead(i_ojo); // la luz que recive el sensor de luz izquierdo
    l_der = analogRead(d_ojo); // la luz que recive el sensor de luz derecho
   
    if((l_izq >= encontrada) && (l_der >= encontrada)){
    activo = 0;
    digitalWrite(ledBuscando, LOW);
    }
    else{
      //analiza si necesita girar, continuar o parar la busqueda
      if((l_izq > l_der ) && ((l_der - l_izq) > umbral)){        
        girar(d_motor, velocidad);//gira a la izquieda
      }
      else{
        if((l_der > l_izq ) && ((l_izq - l_der) > umbral)){
          girar(i_motor, velocidad);//gira a la derecha
        }
        else {
           if((l_izq > pista) || (l_der > pista)){
            andar(i_motor,d_motor,velocidad);//sigue el indicio de luz
           }
           else { //gira abiertamente hacia la derecha en del indicio de luz
             girar(i_motor, velocidad/2);
             girar(i_motor, velocidad/2);
             girar(d_motor, velocidad);
           }
        }
      }
    }
  }
}


//Dar una vuelta a uno de los motores motor paso a paso
void girar(int motor[], int velocidad){ //datos sobre que motor va a andar y a que velocidad
   for(int i=0; i <3; i++){ //
     if(i==0){digitalWrite(motor[2], LOW);} else //si es el primer punto apaga el 3 punto, sino apaga el anterior
     digitalWrite(motor[i], HIGH);//activa el punto correspondiente a la etapa
     delay(10*velocidad); //espera hasta pasar al siguiente punto
   }
}

//Hace andar los dos motores paso a paso al mismo tiempo
void andar(int motor1[],int motor2[],int velocidad){
   for(int i=0; i <3; i++){ //
     if(i==0){digitalWrite(motor1[2], LOW); digitalWrite(motor2[2], LOW);} else //si es el primer punto apaga el 3 punto, sino apaga el anterior
     digitalWrite(motor1[i], HIGH);//activa el punto correspondiente a la etapa
     digitalWrite(motor2[i], HIGH);//activa el punto correspondiente a la etapa
     delay(10*velocidad); //espera hasta pasar al siguiente punto
   }
 
}

No tengo ni idea de si va a andar o no, solo espero que me llegue este maravilloso pedaso de libertad para probar. Con respecto a los valores analógicos no tengo ni idea de que puede entregar cada componente, pero eso se arregla a prueba y error.

Saludos a todos

Hola

No hace mucho una de mis alumnas hizo algo parecido, igual te resulta de utilidad http://complubot.educa.madrid.org/proyectos/ardusoccerbot/ardusoccerbot_index.php

Un saludo:

Eduardo

Efectivamente complubot, el codigo es mucho mas claro, corto y eficiente, ya lo adaptaré a mis motores paso a paso. Muchas gracias por tu respuesta. Y felicitciones por tu trabajo.