RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.
El módulo SD21 permite el control de 21 servos de forma totalmente independiente. En este proyecto vamos a comunicar mediante bus I2C la controladora de servos con el PIC 16F876A. Aunque el número de servos puede ser 21 y el programa mostrado está definido para el control de todos ellos, aquí se van a emplear tan solo 3 como muestra del funcionamiento.
Como ejemplo demostrativo moveremos el servo 1 en diferentes posiciones a la velocidad máxima. Posteriormente moveremos el servo 2 en otras tantas posiciones pero a una velocidad más reducida. Y finalmente los servos 1 al 3 simultáneamente.
El módulo dispone de 2 entradas de tensión de alimentación. Por un lado, entrada de entre 6 y 7,2v para alimentación de los servos. Por otro lado, alimentación de 5v para el resto de la electrónica. Pero permite la obtención de los 5v a partir de la tensión de alimentación de los servos mediante el puenteo de dos pines. Estos mismos 5v los vamos a emplear para alimentar el PIC y todo el resto de electrónica externa al módulo.
En el SD21 hay 2 registros de lectura. Estos son los registros 64 y 65. El registro 64 proporciona la versión del firmware del SD21:
registro = 64; //Registro SD21 de valor versión
i2c_start(); // Comienzo de la comunicación I2C...
i2c_write(SD21_ID);//...con la dirección I2c del SD21...
i2c_write(registro);//...apuntando al registro de versión
i2c_start(); // Reinicio
i2c_write(SD21_ID+1);// Cambio a función de lectura
lectura = i2c_read();// En lectura información leída
i2c_stop (); // Finalización de la transmisión
version = lectura;//En version la versión de firmware
El registro 65 proporciona el valor de la tensión de alimentación. Para obtener el valor real habrá que multiplicar su contenido por 0,039:
registro = 65; //Registro SD21 de valor de tensión
i2c_start(); // Comienzo de la comunicación I2C...
i2c_write(SD21_ID);//...con la dirección I2c del SD21...
i2c_write(registro);//...apuntando al registro de voltaje
i2c_start(); // Reinicio
i2c_write(SD21_ID+1);// Cambio a función de lectura
lectura = i2c_read();// En lectura información leída
i2c_stop (); // Finalización de la transmisión
voltaje= lectura*0.039; //En voltaje valor de tensión
El resto de registros, 3 por cada servo, controlan la velocidad y posición de cada uno de ellos:
#defineservo1 0 num_servo = servo1;//Acceso al registro 0 del SD21 velocidad = 0; //Velocidad máxima posicion = 2400; //A la posición +90º
i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(SD21_ID);//...con la dirección del SD21...
i2c_write(num_servo);//...apuntando al registro de nº de servo
i2c_write(velocidad);//velocidad
i2c_write(posicion);//Parte baja de Posición
i2c_write(posicion>>8);//Parte alta de posición
i2c_stop ();//Finalización de la transmisión
La orientación del servo a -90º (ó 0º en una referencia 0-180) se obtiene cargando los registros de posición con el valor 600, 1500 para la posición 0º (90º en una referencia 0-180) y 2400 para +90º (180º en una referencia 0-180). El resto de posiciones son igualmente proporcionales y bastaría aumentar en 10 el valor de una posición concreta por cada grado de más que se desee.
2 comentarios:
perdona, como consigo la libreria sd21 para proteus
Miguel.
EL SD21 no es simulable en proteus.
Publicar un comentario