Robot 2012

En esta página se podrá encontrar información acerca de la electrónica utilizada en el robot de los talleres realizados entre los meses de noviembre y diciembre de 2012.

Se trata de una placa MBP40 de curuxa.org en la que se han integrado diversos módulos. Los módulos integrados disponen a su vez de unas variables en C ya configuradas facilitando la puesta en marcha del robot.

Módulos

Se trata de una placa principal de Curuxa.org a la que se han integrado diversos módulos. Por lo que la mayoría de esquemas y documentación disponible la web de Curuxa.org es válida para este robot.

  • Placa principal (MBP40): El microcontrolador con sus entradas/salidas (aunque de las 36 iniciales sólo están disponibles 17).
  • Control de motores (MC2A): Es una versión modificada (el original utiliza un L293B/L293NE y nosotros un L298), pese a que el aspecto externo y las características eléctricas son diferentes ambos tienen el mismo circuito y esquema.
  • LED indicador (LTIND-A): La placa tiene 3 LED indicadores (que se controlan desde el microcontrolador). El cuarto LED sólo indica que existe alimentación, no se puede controlar.
  • Pulsadores (SISW-SPST): Pese a que ambos son idénticos, uno de ellos puede generar interrupciones al pulsarse (por software).
  • Sensor blanco/negro (SIBW-1Y): Inicialmente se montarán los 2 sensores centrales y se dará la opción de instalar los 4 restantes (ya que los 4 extras representan entre el 5 y el 10% del coste del robot). Con 2 sensores se puede hacer un velocista y con los 6 un rastreador.
  • Alimentación de 5V (PWR-DD5): No es exactamente el mismo circuito que hay en la web de Curuxa, pero la teoría es idéntica y el componente electrónico (un regulador de tensión 7805) es el mismo.
  • Motores y ruedas: Son componentes comerciales de la marca Pololu.
  • Batería: Una LiPo genérica de 2 celdas y 7.4V.
  • Conectores estándar (Estándares de curuxa.org): El PIN más cercano al microcontrolador es el que lleva la información, y el más alejado la masa. Con estos 17 pines se pueden añadir funcionalidades extra, por ejemplo: Sensor de distancia, altavoz (buzzer) e incluso añadir módulos idénticos a los ya incorporados en la placa (como los LED o los pulsadores). En la web de Curuxa.org se pueden ver todos los módulos disponibles.
conector estandar curuxa
Conector estándar de Curuxa, el 1 siempre hacia el PIC.

Componentes


El número de la imagen del prototipo está en la tabla, cuando hay un guión y un número es para identificarlo en el esqueleto de la programación.

Componente En la PCB Nota de montaje Polaridad
1 Control de motores L298 L298N Parte metálica hacia dentro
2 Regulador de tensión 7805 L7805 Parte metálica hacia dentro
3 Diodo 4007 PWR-D1 Marca hacia arriba
4 Oscilador (reloj) XTAL No
5 Condensadores cerámicos XTCx No
6 Conector de la batería BATERIA MUCHA ATENCIÓN AL ENCHUFAR
7 Interruptor de encendido ON/OFF No
8 Conector ICSP ICSP
9 Conectores estándar de Curuxa Rxy El doble más cerca del micro
10 Botones BotonX No
11 Resistencia (1) del pulsador R3 10k = Marrón-Negro-Naranja No
12 Resistencia (2) del pulsador R4 1k = Marrón-Negro-Rojo No
13 LED LEDx
14 Resistencia del LED R5 470 = Amarillo-Violeta-Marrón No
15 Diodos del control de motores MDx En total son 8
16 Sensor Blanco/Negro (CNY70) 1 al 6 Las letras van hacia afuera No
17 Resistencia (1) del CNY70 R1 220 = Rojo-Rojo-Marrón No
18 Resistencia (2) del CNY70 R2 * 18k = Marrón-Gris-Naranja No
19 Condensador de la alimentación (electrolítico) MC Negativo hacia arriba
20 Microcontrolador PIC16F887 PIC16F887 Marca arriba a la izquierda
21 LED de alimentación ON Usar el LED pequeño
22 Motores MOTORx

Consejo: Cuando no es necesario seguir un orden con los componentes (como es el caso de este circuito) el criterio a seguir será el de poner los componentes por alturas: primero los más bajos (resistencias, diodos), seguir por los de media altura (cristal, conectores y LEDs) y finalizar con los más altos (regulador, el L298 y el condensador electrolítico).

Para los diodos LED y el condensador electrolítico: Una forma de saber cuál es la pata negativa es mirando la longitud de la misma: la corta es el negativo y la larga el positivo.

Además el diodo LED tiene una muesca en el perímetro exterior de plástico, dicha muesca indica el lado negativo y el mejor sistema es mirar el interior del LED pues la parte metálica grande es el negativo (nota: por simplificar se ha denominado positivo/negativo pero en realidad se llama ánodo/cátodo).

* = NOTA: Existe un error en la serigrafía. Arriba del todo, en el centro, hay 2 resistencias marcadas como R2. La de la izquierda es una R1.

Programación

Se proporcionan las variables y la situación de cada elemento que integra la placa del robot. Después los puertos que están libres y al final se verán algunos ejemplos. La descarga del código con el que se puede utilizar con el robot (y en el que ya vienen las variables declaradas) se encuentra al final del texto.

Variables del robot

El listado de variables que ya vienen nombradas es el siguiente, los TRIS de estas variables también se encuentran configurados en la plantilla del programa y por lo tanto no es necesario modificarlos:

Programa Micro Tipo
Boton1 RA 4 Entrada
Boton2 RB 0 Entrada
LED1 RA 5 Salida
LED2 RE 0 Salida
LED3 RC 0 Salida
M1Enable RC 2 Salida
M1In1 RD 0 Salida
M1In2 RD 1 Salida
M2Enable RC 1 Salida
M2In1 RD 2 Salida
M2In2 RD 3 Salida
Sensor1 RE 2 Entrada
Sensor2 RE 1 Entrada
Sensor3 RD 4 Entrada
Sensor4 RD 5 Entrada
Sensor6 RD 6 Entrada
Sensor5 RD 7 Entrada

Puertos disponibles

Y quedando libres los siguientes puertos del microcontrolador (las variables se llaman Rxy, por ejemplo «RB1«). Los marcados con una X están en la anterior tabla:

0 1 2 3 4 5 6 7
Puerto A RA0 RA1 RA2 RA3 x x x x
Puerto B x RB1 RB2 RB3 RB4 RB5 RB6 RB7
Puerto C x x x RC3 RC4 RC5 RC6 RC7
Puerto D x x x x x x x x
Puerto E x x x RE3

NOTA: El puerto E sólo tiene 4 puertos, es decir no existe más allá del RE3.
NOTA 2: RA6 y RA7 los utiliza el cristal externo, por eso no están disponibles.

Por defecto todos los puertos vienen configurados como entradas por lo tanto, si se quiere usar alguno de los puertos como salidas hay que cambiar el valor de su TRISxy asociado, siguiendo con el ejemplo anterior: «TRISB1=0″ para que fuese una salida. Existe una regla nemotécnica: 1 como la I de input (entrada) y 0 como la o de output. Más ejemplos:

TRISB1 = 1;   //Puerto B1 es una entrada, se podría conectar un botón.
TRISE3 = 0;   //Puerto E3 es una salida, es decir, podría controlar un LED.

Motores

Desde la versión 2 del esqueleto del robot existe la función Motores(): Para simplificar el trabajo con el PWM se han añadido a las cabeceras del programa la configuración necesaria y compactada en una función que se utilizará de la siguiente manera:

Motores(PWM,Número,LetraMovimiento);
  • PWM = Valor entre 0 y 1024
  • Número = Puede ser 0, 1 o 2 y es para indicar si se va a actuar sobre el Motor1 o el Motor2 (si es 0 significará los 2 motores a la vez).
  • LetraMovimiento = Los valores posibles son (incluidas las comillas):
    • ‘A’ => Avanzar
    • ‘R’ => Retroceder
    • ‘F’ => Frenar (motor bloqueado eléctricamente, consume energía)
    • ‘L’ => Liberar (desactiva/apaga el motor, no hay consumo)

Nota: En los casos Frenar/Liberar es indiferente el valor del PWM pues la función internamente lo modifica por el valor 0.

Otras funciones de motores

También se dispone de diversas funciones para controlar los motores de una forma más «digital», pues en lugar de utilizar el PWM se envía al motor el 100% de la energía.

Aviso: esta opción sólo funcionará si se escogió utilizar la versión sin PWM.

//Cada motor por separado
 //MIAvanzar()      MDAvanzar()
 //MIRetroceder()   MDRetroceder()
 //MIDetener()      MDDetener()
 //MIFrenar()       MDFrenar()

 //Ambos motores a la vez
 //GirarIzquierda()  GirarDerecha()
 //RotarIzquierda()  RotarDerecha()
 // Avanzar()        Retroceder()
 // Detener()        Frenar()

Ejemplos de código

El siguiente ejemplo enciende y apaga el LED3 cada segundo:

int main(){
   configuracion_inicial();
   while(1){

      LED3 = !LED3;
      delay_ms(1000);

   }//FIN bucle infinito
}//FIN main()

Este código mueve el robot hacia delante mientras los sensores 3 y 4 «vean» una superficie blanca:

int main(){
   configuracion_inicial();
   while(1){

      if (Sensor3 == BLANCO && Sensor4 == BLANCO){
         Avanzar();
      }

   }//FIN bucle infinito
}//FIN main()

Al pulsar el Boton1 se encenderá el LED1, y al pulsar el Boton2 se apagará:

int main(){
   configuracion_inicial();
   while(1){

      if (!Boton1){
         delay_ms(55); //Evitar rebotes del botón
         LED1=1;
      }//Fin Boton1

      if (!Boton2){
         delay_ms(55); //Evitar rebotes del botón
         LED1=0;
      }//Fin Boton2

   }//FIN bucle infinito
}//FIN main()

Aquí si el sensor3 está sobre una superficie negra encenderá el LED1, ídem para el sensor4 y el LED2:

int main(){
   configuracion_inicial();
   while(1){

      if (sensor3==NEGRO){
         LED1=1;
      }else{
         LED1=0;
      }

      if (sensor4==NEGRO){
         LED2=1;
      }else{
         LED2=0;
      }

   }//FIN bucle infinito
}//FIN main()

Enlaces de interés