MiniZ: Utilizar la electrónica.              


Esta es la base para un robot velocista para los próximos concursos (Cosmobot 2009 si hay suerte y lo tenemos), se tratra de un coche rc escala 1:28 igual que el usado en ablana, pero esta vez un modelo más nuevo, un miniz mr02, y como es de esperar bastante más caro, 140 euros lo que viene en la foto. La principal diferencia sobre el modelo anterior (mr 015) es que es más bajo, las pilas no están puestas dos a dos en cada lado, si no una detrás de otra a la misma altura, lo que baja el centro de gravedad.

Con el anterior miniz se hizo una electrónica nueva, esta vez voy a intentar reutilizar la electrónica,  lo que evitará tener que construir un puente en H para el control del motor y añadir la electrónica de control para el motor del servo. El principal problema es que no tenemos el esquema eléctrico (ni la paciencia suficiente para dibujarlo) por lo que nunca sabremos donde estamos tocando.

La electrónica del coche es un pcb, que se encarga de recibir la señal de la emisora y convertirla en una velocidad y sentido para el motor y en un ángulo de giro para las ruedas delanteras, al desmontar la tapa azul nos encontramos con lo siguiente:

Electrónica del coche:


Cara de debajo, (cristal removido de su zócalo):


Lo primero es identificar los chips que hay en este pcb, en el de arriba vemos un 31136G, que es un receptor de radio, se encargara de recibir la señal de nuestra emisora. En la placa de abajo tenemos 2 x3004 y 2x3010 dos a dos en cada lado, estos son  parejas de transistores Fets que se encargan de formar dos puentes en H, uno para controlar el motor en sentido y velocidad que mueve al coche y el otro para controlar el motor de dirección, éste se puede ver en la parte delantera en el centro, junto con sus engranajes, potenciometro para su realimentación y el salvaservo, la pieza negra arriba delante que se encarga de evitar que los golpes en las ruedas rompan algún engranaje.

Identificados los chips y sus funciones sólo nos queda uno donde mirar, el que está abajo a la derecha en la última foto, es un microcontrolador pic 12c509a, tanto oír que los pics sólo se usan a nivel aficionado y en el primer coche de estos que abrimos nos encontramos con uno, y estos japoneses tontos no son. 

Es un micro de ocho bits con ocho patas, dos son de alimentación y las otras seis restantes forman un puerto de entrada y salida con sus distintos periféricos, por lo que si queremos descubrir como funciona esta electrónica sin dibujar el esquema lo mejor es observar este microcontrolador. Otra cosa a observar y como vamos a comprobar luego es la falta de un cristal u oscilador externo, fiandose de la eficacia del interno en cuánto a tiempos se refiere, y aquí la exactitud es importante.

Para observar las señales en el pic a falta de 4 brazos lo mejor es soldar unos cables a cada pata, ya que sujetar la sonda del osciloscopio, al mismo tiempo que se maneja éste y la emisora del coche para ver las señales es complicado. Para soldar en estos tamaños lo mejor que yo he encontrado es el soldador de 11w de JBC con la punta de 0.5 mm, y como cable el que se usa para chipear consolas.

Soldadura de cables al pic:


Yo no tengo ni idea del mundo del radiocontrol, por lo que para alguien que venga de este mundo saber como funciona este circuito puede ser básico, por lo que en mi caso me decidí a observar todas las señales e intentar hacerme una idea de su funcionamiento que aún no sé si es correcta, por lo que voy a poner las señales observadas en cada pin, ya que puedo estar equivocado y sin un esquema todo son suposiciones...

Los pines 1 y 8 son los de alimentación, si medimos en estos nos encontraremos que el pic funciona a 3 V, cosa a tener en cuenta, ya que este voltaje nos dará los umbrales para nivel alto y bajo de los puertos de entrada y salida, y también nos dirá cuál es la tensión máxima que podemos conectar en esos puertos. Me éxplico, si vamos a utilizar un microcontrolador funcionando a 5 voltios para manejar este pic, un puerto de salida a nivel alto estará aproximadamente en 5V, por lo que si lo pinchamos directamente al micro del coche, nos lo podemos cargar, ya que el nivel  máximo soportado por este micro con Vcc de 3V puede ser menor a los 5V de salida del otro microcontrolador. Por lo que mejor en estos casos es revisar el datasheert de la lógica para comprobar los niveles de tensiones e intensidades máximas soportadas y los niveles de umbral del 1 y el 0 (niveles a los que se considera que tenemos un 1 o un 0 en la entrada de cada pata del microcontrolador).

Empezando por la pata 2 (gpio5) nos encontramos con una señal que aparece cuando giramos la rueda de dirección de la emisora.



Con la rueda al máximo tenemos la señal anterior, y con una posición intermedia entre reposo y máximo la siguiente:



Una señal igual aparece en  pin 5 (gpio2) cuando giramos el mando en el otro sentido, por lo que empezando las suposiciones, supongo que estas señales son para controlar un puente en H mediante pwm, al girar al máximo el tope del motor de dirección es mecánico y la señal de pwm le sigue ordenando al motor que gire. Esto valdría para usar la electrónica en distintos diseños de coche donde puede haber distintos máximos y mínimos del ángulo de giro de las ruedas de dirección. La señal de la posición media no es una señal pwm, aquí el pwm sólo aparece hasta que se alcanza la posición deseada por el motor de dirección, y luego se ven pequeños pulsos (cortos intervalos de pwm) para mantener esa posición ante cualquier cambio. Si esto es así debemos tener una señal de realimentación, que indique al microcontrolador cuál es la posición del motor de dirección para que este sepa cuando ha alcanzado la posición deseada y también para que pueda corregir posibles cambios.

En el pin3 encontramos una señal que cambia con el mando de dirección y que tiene toda la pinta de ser la realimentación anterior.

Giro máximo de la rueda:



Rueda en reposo:



Giro máximo en el otro sentido.


Vemos una señal en rampa de 62.5 Hz, donde según la posición de la rueda de la emisora varía el ancho del pulso, por lo que es de suponer que esta señal indica la la situación del motor alargandose o acortandose.

Es decir los pines 2,3 y 5 se encargaría de controlar el motor de dirección del coche, haciendolo girar en un sentido o en otro mediante señales pwm que controlan el puente en H hasta alcanzar la posición deseada que la conocemos mediante la señal de realimentación.

Los pines 6 y 7 del pic se encargan del otro puente en H para controlar el motor de velocidad., cuando pulsamos el mando de acelerar en un sentido nos encontramos con una señal pwm de 600 Hz;



Esta señal tiene un duty (ancho de pulso) de 0 a 100%, cuando lo pulsamos en el otro sentido la señal anterior se pone a 0 y en el otro pin (7 o 6) aparece la misma señal pwm, un puente en H tiene dos entradas, si activamos una en un sentido y desactivamos la otra, el motor gira en un sentido. Si ahora desactivamos la que teníamos activada y activamos la desactivada el motor gira en sentido inverso, y si activamos las dos el puente en H frena al motor manteniendo ambos bornes del motor a la misma tensión. La velocidad del motor se controla variando el ancho de pulso de la señal que activa una de las entradas.

El efecto de freno también lo realiza el pic y es algo que tendremos que tener en cuenta ya que en nuestro diseño final lo vamos a utilizar, no usarlo sería como montarse en un coche sin frenos, nos obligaría a ir mucho más despacio. Cuando pulsamos el mando de la emisora en un sentido (hacía delante) y repentinamente lo pulsamos hacía el otro sentido, el pic pones los pines 6 y 7 a 1, lo que conseguiría detener el motor.

Sólo nos queda una pata en el pic, y ésta debe de utilizarse para recibir la señal de la emisorta a través del receptor de FM que encontramos en la placa, por lo que si miramos las pistas vemos como esta pata del pic va conectada al circuito receptor de FM, pasando antes por un filtro RC pasobajo.

Si miramos con el osciloscopio en el pin 4 encontramos la siguiente señal.



Una señal de 62.5 Hz (16 ms) con el mando en reposo, si no nos acercamos más no vemos mucho, centrandonos en la parte alta de la señal tenemos lo siguiente:



Son tres señales separadas 1.5 ms con el mando en reposo, y estas son las encargadas de dar al pic la velocidad, sentido y dirección que debe mandar a los puentes en H a través de señales de pwm. Si pulsamos la rueda de dirección de la emisora observamos como aumenta o disminuye el espacio (tiempo) entre la primera y la segunda señal, variando su distancia entre 1 y 2 ms en función del ángulo de giro de la rueda de la emisora.

1 ms de diferencia.


2 ms de diferencia.


Si tocamos el botón de velocidad ocurre lo mismo, la distancia (tiempo) entre la señal 2 y 3 cambia, bajando hasta 1 ms para el máximo en un sentido y 2 ms en el máximo del otro sentido.

1 ms.


2 ms.


Si nos vamos al pin7 del receptor de FM encontramos la siguiente señal, que se corresponde con la vista en la pata 4 del pic una vez que ha pasado por el filtro RC pasobajo, se puede observar el efecto del condensador en las vistas en el pin4 del pic.



Esta es la señal que vamos a generar con nuestro microcontrolador externo para sustituir a la emisora, crearemos una señal periódica de 62.5 Hz, el inicio de esta señal serán las 3 señales vistas con un tiempo variable entre ellas según el sentido, dirección y velocidad que queramos.

Para ello lo primero debemos modificar el cricuito que nos encontramos en el coche, quitando la señal de la emisora de la pata del pic, para ello lo más rápido y fácil es cortar la pista que va desde el circuito receptor de FM al pin 4 del pic, y soldar un cable a esta pista por el que entrará la señal que creemos con nuestro micro externo.

Donde cortar:


La pista que viene del receptor de fm es la que entra en la vía que está justo donde pone D2, por lo que cortaremos aquí, y tenemos la vía para meter el cable y soldarlo ahí quedando bien sujeto, más no se puede pedir. Para ello raparemos con un objeto afilado (yo lo he hecho con un punzon que uso para los pcbs) sobre la pista hasta que se vea el cobre, y procederemos a cortarla con cuidado de no llevarnos ninguna otra pista por delante.

Pista cortada:


Una vez hecho esto debemos soldar un cable, pero esto mejor lo haremos en la otra cara, ya que es la que queda por arriba del coche al levantar la tapa y es más fácil sacarlo. El cable será el de chipear consolas que venden en cualquier tienda de estas, pelaremos la puntita y lo metemos detro de la via para soldarlo a ésta.

El punto donde hacerlo es en la vía a la derecha de R7 (es la que teníamos en la otra cara).


Cable soldado. Cortar el cable sobrante por la otra cara....


Removemos el cable blanco de la antena, ya que no lo necesitamos para nada y su hueco nos sirve para sacar el cable amarillo que hemos soldado. Si queremos volver a utilizar este circuito para sun función original pues con puentear la pista y quitar el cable es suficiente, ya que la electrónica de estos coches no es barata, anda por lo 50 dolares, así que en España lo mismo cuesta mas de 50 euros.

Si vamos a utilizar distinta alimentación para el microcontrolador externo debemos soldar un cable a la masa de la pila, para unir con la masa de nuestro micro externo y que ambos tengan la misma referencia de tensiones como he hecho en esta prueba, aunque en el diseño final por razones de peso y espacio ambos deberán compartir la misma batería como en velocista ablana del Cosmobot 2008. El micro externo va alimentado con 5V, por lo que la señal al cable amarillo se coge de un divisor de tensión (Rs del mismo valor) para no meterle voltios de más.

Imagen del coche cerrado con el cable de señal y tierra conectado al micro externo:


Como se ve con un sólo pin vamos a controlar toda la base del coche, por lo que aquí tenemos una de las ventajas de reutilizar la electrónica que nos viene con el coche.

Para probar su funcionamiento necesitamos de un microcontrolador y varios botones, en esta ocasión (aunque el diseño del velocista tengo intención de realizarlo con un Atmega16) al tener un 12c509a pues no me he podido resistir a usar otro 12 de microchip... un 12f683, he preferido programar en ensamblador al tener que manejar tiempos de microsegundos, por suerte ha funcionado a la primera, pero si hay que ajustar los tiempos del micro para la salida yo prefiero hacerlo en asm...

Vamos a generar la señal anterior vista en la emisora, el umbral de Ton del 12c509a a 3V anda por los 1.5 V, lo que en el Pin4 del pic nos da un Ton de 200 uS para el primer pulso y 150 uS para los dos restantes en las señales observadas. Escribiendo esto me he dado cuenta de una cosa que debo cambiar, pero de momento lo dejo así ya que ha funcionado. Mi intención inicial era quitar R7 y soldar ahí mejor que cortar la pista, pero si quiero volver a utilizar la placa con su emisora me es más fácil puentear la pista que encontrar donde deje R7.. o darme el viaje a la tienda a por una. Por lo que había calculado un Ton para el visto en el pin del pic, que ahora es afectado por el efecto de carga del condensador (del RC) al entrar antes de la R y no después. Así que mejor hacerlo de aproximadamente 400uS como el que se ve en el pin de la emisora.

Para generar la señal periódica lo vamos a hacer mediante una interrupción usando un timer del pic, así nos aseguraremos de que el 12c509a reciba siempre su señal cuando la necesita, para ello uso el timer2, el 12f683 es el único que lo lleva de los 12 de microchip, la ventaja de usar este timer es que contamos con un registro de 8 bits (PR2) en el que decimos al pic hasta que valor debe contar, una vez que el valor de la cuenta sea igual a la de este registro salta el flag de interrupción. Esto nos permite conseguir el periodo buscado (16 ms en nuestro caso) con mucha facilidad.



Utilizamos el reloj interno del pic, configurado a 4 MHz. La entrada al prescaler es este reloj de 4 MHz / 4 como indica en la figura, luego tenemos una entrada de un 1 MHz, o lo que es lo mismo, TMR2 se incrementará en uno cada 1 uS, si usamos el prescaler lo que hacemos es aumentar el tiempo, si ponemos un valor de 4 en éste, TMR2 se incrementará en uno cada 4 uS.

En PR2 metemos el valor que debe alcanzar TMR2 para que active el flag de interrupción, vamos a poner 250. Cuando alcance el valor 250 saltará, y para que se incrementará en uno tenían que pasar 4 uS, luego tardará 4*250 uS= 1 ms. Necesitamos un periódo de 16 ms, y aquí utilizamos el postscaler, dandole el valor 1:16 hace que necesitemos 16 valores iguales de TMR2 y PR2 (es decir 16 cuentas) para que active el flag de interrupción. Luego si una cuenta se realizaba en 1 ms ahora necesitaremos 16 ms, con lo que tenemos el periódo deseado.

Los delays de las 3 señales (los Ton y distancias entre ellas que dan la velocidad, sentido y dirección) las hacemos por soft al ser de 200 uS a 2 mS, por lo que el pic tiene entre 14 y 10 ms aproximadamente para ejecutar el resto del programa, para nuestra prueba más que de sobra. En este tiempo lo que haremos será modificar el valor de los registros que se encargan de la duración de los delays por soft dependiendo de que botones se pulsen, un botón suma 50 uS por pulsación al tiempo entre las señales 1 y 2, y otro botón resta 50 uS a este tiempo. Lo mismo se hace con dos botones para el tiempo entre las señales 2 y 3. Un quinto botón pone el tiempo entre las tres señales en el incial de 1.5 ms dejando los dos motores en reposo.

Los registros asociados a los botones deben variar el valor del delay entre 0 y 500 uS, siendo 0 el punto de reposo para los motores de velocidad y dirección y 500 uS el valor máximo de ambos, en este caso lo he hecho en 10 pasos de 50 uS hacía cada lado, corrigiendo al valor máximo cuando se sobrepasas este al pulasar el botón.

Señales del pic que imitan a la emisora, se repiten cada 16 ms.

1.5ms 1.5ms


1ms 1.5ms


1ms 1ms


2ms 2ms


Adjuntó el código del pic en el que se deben modificar el valor de los delays al Ton visto en el pin del circuito FM en lugar del Ton visto en el pic aunque ha funcionado todo como se esperaba.

Video del funcionamiento.


Para cualquier dudar, suposición erronea que haya hecho, por favor.. 

Gracias.





Código PIC.

;**********************************************************************************************
;
; Programa para simular la señal de la emisora de un miniz
; www.jmnlab.com sept 2008
; Reloj interno 4 MHz
;
;**********************************************************************************************

#include <p12F683.inc>

    __config    _FCMEN_OFF & _IESO_OFF & _BOD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT

;******************************* DEFINICIONES***************************************************

#DEFINE ACELERAR GPIO,0
#DEFINE DECELERAR GPIO,1
#DEFINE DERECHA GPIO,2
#DEFINE IZQUIERDA GPIO,3
#DEFINE CENTRO GPIO,4
#DEFINE SALIDA GPIO,5


;****************************** REGISTROS RAM ***************************************************

    cblock 0x20
GIRAR_R
VELOCIDAD_R
GIRAR_RD
VELOCIDAD_RD
TON1_R
TON2_R 
CONTROL_B 
CONTROL_B2 
    endc


;**************************** POSICIONES *********************************************************

    ORG 0               
    GOTO Start          
  
    ORG 4
    GOTO ISR

    ORG 5                ; Salta el vector de interrupción 04

Start                    ; Inicio del programa
  
;****************** Registros *******************************************************************

    BCF STATUS, RP0 ;Bank0   

    CLRF GPIO ;Init GPIO
    MOVLW B'00000111'
    MOVWF CMCON0 ;digital I/O

    MOVLW B'01111101' ;TMR2 on, pres 1:1, posts 1:4
    MOVWF T2CON

    MOVLW B'11000000'
    MOVWF INTCON
    BCF PIR1, TMR2IF ;Habilitamos interrupciones

    BSF STATUS, RP0  ;Bank1

    CLRF ANSEL
  
    MOVLW B'00011111' ;Set 011111
    MOVWF TRISIO

    MOVLW B'11111010' ;PR2=250
    MOVWF PR2

    MOVLW B'00000010'
    MOVWF PIE1        ;Interrupción del timer2 habilitada

    BCF STATUS, RP0 ;Bank0   

;************************ Inicializar RAM *****************************************************

    CLRF CONTROL_B   ;|X|X|X|C|De|Iz|A+|A-|
    CLRF CONTROL_B2  ;|X|X|X|C|De|Iz|A+|A-|


    MOVLW D'135'        ;Max: 185 Med: 135  Min: 85
    MOVWF VELOCIDAD_R

    MOVLW D'130'        ;Max: 180 Med: 130  Min: 80
    MOVWF GIRAR_R
       

;************************ Leer Botones ********************************************************
;************Si es 1 salta, si es cero asigna un cero al registro de control.******************
LOOP_BOTONES

    BTFSC DECELERAR
    CALL  C_DECELERAR
    BTFSS DECELERAR
    BCF CONTROL_B,0


    BTFSC ACELERAR
    CALL C_ACELERAR
    BTFSS ACELERAR
    BCF CONTROL_B,1


    BTFSC DERECHA
    CALL C_DERECHA
    BTFSS DERECHA
    BCF CONTROL_B,2


    BTFSC IZQUIERDA
    CALL C_IZQUIERDA
    BTFSS IZQUIERDA
    BCF CONTROL_B,3

    BTFSC CENTRO
    CALL C_CENTRO
    BTFSS CENTRO
    BCF CONTROL_B,4

    MOVFW CONTROL_B
    MOVWF CONTROL_B2

;************* Comprobar si excede el max o min y corregir. ************************************

    MOVLW D'70'
    SUBWF GIRAR_R,0  ;Cero Z=1
    BTFSC STATUS,Z
    CALL CARGAR_80

    MOVLW D'190'
    SUBWF GIRAR_R,0
    BTFSC STATUS,Z
    CALL CARGAR_180

    MOVLW D'75'
    SUBWF VELOCIDAD_R,0  ;Cero Z=1
    BTFSC STATUS,Z
    CALL CARGAR_85

    MOVLW D'195'
    SUBWF VELOCIDAD_R,0
    BTFSC STATUS,Z
    CALL CARGAR_185


    GOTO LOOP_BOTONES

;****************************** SUBRUTINAS BOTONES **********************************************
;******** Si no ha cambiado el botón vuelve, si ha cambiado suma o resta diez. ******************

C_DECELERAR
    BSF CONTROL_B,0
    BTFSC CONTROL_B2,0
    RETURN
   
    MOVLW D'5'
    SUBWF VELOCIDAD_R,1
    RETURN

C_ACELERAR
    BSF CONTROL_B,1
    BTFSC CONTROL_B2,1
    RETURN

    MOVLW D'5'
    ADDWF VELOCIDAD_R,1
    RETURN

C_DERECHA
    BSF CONTROL_B,2
    BTFSC CONTROL_B2,2
    RETURN

    MOVLW D'5'
    SUBWF GIRAR_R,1
    RETURN

C_IZQUIERDA
    BSF CONTROL_B,3
    BTFSC CONTROL_B2,3
    RETURN

    MOVLW D'5'
    ADDWF GIRAR_R,1
    RETURN

C_CENTRO
    BSF CONTROL_B,4
    BTFSC CONTROL_B2,4
    RETURN

    MOVLW D'130'
    MOVWF GIRAR_R
    MOVLW D'135'
    MOVWF VELOCIDAD_R
    RETURN

CARGAR_80
    MOVLW D'80'
    MOVWF GIRAR_R
    RETURN

CARGAR_180
    MOVLW D'180'
    MOVWF GIRAR_R
    RETURN

CARGAR_85
    MOVLW D'85'
    MOVWF VELOCIDAD_R
    RETURN

CARGAR_185
    MOVLW D'185'
    MOVWF VELOCIDAD_R
    RETURN



;****************************** SUBRUTINAS SEÑAL ************************************************
ISR
 
    BCF PIR1, TMR2IF ;Limpio el flag del timer2


    BSF GPIO,5
    CALL TON1
    BCF GPIO,5
    CALL GIRAR
    BSF GPIO,5
    CALL TON2
    BCF GPIO,5
    CALL VELOCIDAD
    BSF GPIO,5
    CALL TON2
    BCF GPIO,5


    RETFIE

TON1 ;199 uS
    MOVLW D'65'
    MOVWF TON1_R
TON1_LOOP
    DECFSZ   TON1_R,f    ; 3*65
    GOTO    TON1_LOOP  
    RETURN

TON2 ;148 uS
    MOVLW D'48'
    MOVWF TON2_R
TON2_LOOP
    DECFSZ   TON2_R,f    ; 3*48
    GOTO    TON2_LOOP  
    RETURN

VELOCIDAD ;1350 uS
    MOVFW VELOCIDAD_R
    MOVWF VELOCIDAD_RD
VELOCIDAD_LOOP
    NOP
    NOP
    NOP   
    NOP
    NOP
    NOP
    NOP
    DECFSZ   VELOCIDAD_RD,f    ; 10*135
    GOTO    VELOCIDAD_LOOP  
    RETURN

GIRAR ;1300 uS
    MOVFW GIRAR_R
    MOVWF GIRAR_RD
GIRAR_LOOP
    NOP
    NOP
    NOP   
    NOP
    NOP
    NOP
    NOP
    DECFSZ   GIRAR_RD,f    ; 10*130
    GOTO    GIRAR_LOOP  
    RETURN

    END