ATENCIÓN: Está página está desactualizada, se mantiene en el servidor de Arduino.cc a título ilustrativo y cómo documentación, sin embargo, no es posible editarla y no se harán modificaciones de la misma. Es posible que haya caracteres que no se muestren de la forma apropiada, no se hará nada por editarlos

Para más información visite http://arduino.es

Montaje 11: Robot multiuso

Requisitos: Chasis del robot, circuito de potencia

Planteamiento: Todos en uno.

Presentación de: Cómo integrar varios programas en uno de forma que se puedan seleccionar individualmente.

Pulsando el final de carrera seleccionamos o movimiento preprogramado o siguelíneas o fototropo en este orden.

Basta con incorporar todas las declaraciones de variables y todos los procedimientos y funciones de los tres programas, cuidando de que no se repitan nombres si realizan funciones distintas. Luego ponemos el contenido de cada bucle principal dentro de su propio procedimiento.

Hay que incorporar un mecanismo de selección, y lo hacemos con un procedimiento inicial, en el void setup( ) que cuenta las pulsaciones del final de carrera.

Como el fototropo es igual que una parte del siguelíneas, salvo la definición de las variable “nivel”y el valor de la variable “sens”, para evitar repetir código usamos el del siguelíneas con la indicación, mediante un if, de cambiar la definición de “nivel” si se selecciona el fototropo. La duplicidad de valores en la variable “sens” se resuelve fácilmente duplicando los nombres.

Variantes:

  • Haz lo mismo para el caso de los robots que usan el driver 293D y el que usa motores paso a paso. Ten cuidado con diferenciar todas las pulsaciones que se hacen al comienzo de cada programa.

CÓDIGO FUENTE

 Copyright (C) 2006  Juan Carlos Alonso de Mena
 This program is free software; you can redistribute it and/or modify it under the terms
 of the GNU General Public License as published by the Free Software Foundation;
 See the GNU General Public License for more details?

 int motori =6;
 int motord =8;
 int fotod =4;
 int fotoi =5;
 int medida1=0;
 int medida2=0;
 int diferencia=10;
 int media=50;
 int sens=0.01;
 int puls = 2; 
 int c=1;
 int n=0;
 int m=0;
 int unidist=10;
 int unigrado=0.1;
 int movimientos[]={0,2,0,3,0,3,0,2,0,3,0,3,0,2,0,2,0,3,0};
 int distancias[]={20,0,10,0,10,0,30,0,20,0,20,0,30,0,10,0,10,0,20};
 int angulos[]={0,8/3,0,8/3,0,8,0,16/3,0,16,0,16/3,0,8,0,8/3,0,8/3,0};
 int dist=0;
 int ang=0;
 int seleccion=0; 

 void compruebaluz(){
   medida1=analogRead(fotoi);
   medida2=analogRead(fotod);
   diferencia =abs(10*(medida1 - medida2));
   media=10*(medida1+medida2)/2;
 } 
 void resetea (){
   c =c*(-1);
 }
 void compruebatoque(){
   if(digitalRead(puls) == HIGH){  // si se pulsa el pulsador(normalmente abierto)
     delay(200);
     resetea();
   }
 }   
 void avanza(){
   digitalWrite(motori,LOW);
   digitalWrite(motord,LOW);
 }
 void retrocede(){
   digitalWrite(motori,HIGH);
   digitalWrite(motord,HIGH);
 }  
 void giraderecha(){
   digitalWrite(motori,LOW);
   digitalWrite(motord,HIGH);
 }
 void giraizquierda(){
   digitalWrite(motori,HIGH);
   digitalWrite(motord,LOW);
 }
 void evitaobstaculo(){
   for (n=0; n<8;n++){
     retrocede();
     delay(100);
   }
   for (n=0;n<8;n++){
     giraderecha();
     delay(100);
   }
 }  
 void fototropo(){
   compruebatoque();
    if (c ==-1){
      evitaobstaculo();
      resetea();
    }      
    compruebaluz();
    if (medida1>=medida2){
      if(diferencia>media*sens){
        giraizquierda();
      }
      else{
        for(n=0;n<5;n++){
          avanza();
          delay(100);
        }
      } 
    }
    else{
      if(diferencia>media*sens){
        giraderecha();
      }
      else{
        for(n=0;n<5;n++){
          avanza();
          delay(100);
        }
      }
    }
  }   
 void adelante(int dist){
   for(n=0;n<dist;n++){
     avanza();
     delay(100);
   }
 }
 void atras(int dist){
   for(n=0;n<dist;n++){
     retrocede();
     delay(100);
   }
  }  
 void derecha(int ang){
   for(n=0;n<ang;n++){
     giraderecha();
     delay(100);
   }
 } 
 void izquierda(int ang){
   for(n=0;n<ang;n++){
     giraizquierda();
     delay(100);
   }
 }
 void preprogramado(){
   //printString("  COMIENZO  ");
   digitalWrite(13,HIGH);
   delay(3000);
   digitalWrite(13,LOW);
   for(m=0;m<19;m++){
     dist=distancias[m];
     ang=angulos[m];
     if(movimientos[m]==0){
       // printString("   adelante  ");
       adelante(dist);
     }
     if(movimientos[m]==1){
       //printString("   atras  ");
       atras(dist);
     }
     if(movimientos[m]==3){
       //printString("   izquierda  ");
       izquierda(angulos[m]);
     }
     if(movimientos[m]==2){
       // printString("   derecha  ");
       derecha(angulos[m]);
     }
   }
   while(m>=18){
     giraderecha();
   }
 }
 void selecciona(){
   while(digitalRead(puls)==LOW){
   }
   while(digitalRead(puls)==HIGH){
     digitalWrite(13,HIGH);
     delay(200);
     seleccion=seleccion+1;
     digitalWrite(13,LOW);
     delay(500);
   }
 }
 void setup(){
   pinMode(motori,OUTPUT);
   pinMode(motord,OUTPUT);
   pinMode(puls,INPUT);
   pinMode(4,OUTPUT);
   pinMode(5,OUTPUT);
   selecciona();

} void loop(){

  if(seleccion==2){
     preprogramado();
   }        
   if(seleccion==1){
     fototropo();
   }  
   if(seleccion>2){
     seleccion=2;
   }
 }

Volver?

  Copyright (c) 2006  Juan Carlos Alonso de Mena

  Permission is granted to copy, distribute and/or modify this document under the terms of 
 the GNU Free Documentation License, Version 1.2 or any later version published by the
 Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no
 Back-Cover Texts.  A copy of the license is included in the section entitled 
 GNU Free Documentation License?.