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.
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.
Nº | Componente | En la PCB | Nota de montaje | Polaridad |
1 | Control de motores L298 | L298N | Parte metálica hacia dentro | Sí |
2 | Regulador de tensión 7805 | L7805 | Parte metálica hacia dentro | Sí |
3 | Diodo 4007 | PWR-D1 | Marca hacia arriba | Sí |
4 | Oscilador (reloj) | XTAL | No | |
5 | Condensadores cerámicos | XTCx | No | |
6 | Conector de la batería | BATERIA | MUCHA ATENCIÓN AL ENCHUFAR | Sí |
7 | Interruptor de encendido | ON/OFF | No | |
8 | Conector ICSP | ICSP | Sí | |
9 | Conectores estándar de Curuxa | Rxy | El doble más cerca del micro | Sí |
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 | Sí | |
14 | Resistencia del LED | R5 | 470 = Amarillo-Violeta-Marrón | No |
15 | Diodos del control de motores | MDx | En total son 8 | Sí |
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 | Sí |
20 | Microcontrolador PIC16F887 | PIC16F887 | Marca arriba a la izquierda | Sí |
21 | LED de alimentación | ON | Usar el LED pequeño | Sí |
22 | Motores | MOTORx | Sí |
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
- Descarga del MPLab IDE: Programa clásico de Microchip para programar PICs.
- Descarga del MPLab X IDE: Versión más moderna de la suite de Microchip.
- Página oficial del PIC16F887: Web del fabricante.
- Hoja técnica (Datasheet) del microcontrolador PIC16F887, es un PDF de algo más de 4MB.
- Demo del compilador CCS: Funcional durante 45 días (descarga directa, 33MB).
- Descarga el esqueleto del robot 2012: Ficheros en los que se puede añadir el código del robot (versión 1).