servos matriz
You are viewing an older revision! See the latest version
Homepage
FUNCIONAMIENTO DE SERVOMOTORES Y MOTOR PASO A PASO CON INDICADOR EN MATRIZ 8X8 CON COMUNICACION SERIAL¶
MATERIALES¶
- Tarjeta nucleo STM32F446RE
- Servomotores
- Motor paso a paso
- Tarjeta controladora de motor paso a paso ULN2003APG
- Matriz 8X8 con controlador MAX7219
- Jumpers
- Protoboard
Materiales
PROCEDIMIENTO¶
Se procede a conectar los servomotores a las salidas PWM de la tarjeta. El PINOUT esta definido en el código. Para el motor paso a paso se declaran 4 salidas digitales cualesquiera. La matriz se conecta a los pines de CLOCK, SSEL y MOSI.
Advertencia: Para alimentar los servo motores y el motor paso a paso se utilizo un fuente externa de 5V con tierra común a la tarjeta. La matriz si esta alimentada por la tarjeta.
El código muestra en la matriz la dirección y el número del motor el cual esta funcionando. Los datos de entrada van por serial utilizando el programa PUTTY para windows 8.
El código es autoria de los desarrolladores del proyecto tomando como referencia el proyecto anteriormetne publicado de funcionamiento de una matriz 8X8 con SPI, además del código de protocolo de comunicación serial y el funcionamiento de los servomotores extraidos del siguiente desarrollador. https://developer.mbed.org/users/fabeltranm/
Anotaciones y explicaciones en el código mismo
<</codigo>>
- include "mbed.h" <<#include "mbed.h"
PC_12: DIN, PC_10: CLK, PA_15: LOAD/CS SPI max72_spi(PC_12, NC, PC_10); DigitalOut load1(PA_15); DigitalOut load2(PC_3);
PwmOut mypwm(PA_0); PwmOut mypwm1(PA_1);
define registros de matriz MAX7219
- define max7219_reg_noop 0x00
- define max7219_reg_digit0 0x01
- define max7219_reg_digit1 0x02
- define max7219_reg_digit2 0x03
- define max7219_reg_digit3 0x04
- define max7219_reg_digit4 0x05
- define max7219_reg_digit5 0x06
- define max7219_reg_digit6 0x07
- define max7219_reg_digit7 0x08
- define max7219_reg_decodeMode 0x09
- define max7219_reg_intensity 0x0a
- define max7219_reg_scanLimit 0x0b
- define max7219_reg_shutdown 0x0c
- define max7219_reg_displayTest 0x0f
- define LOW 0
- define HIGH 1
void maxOne( int reg, int col) { maxSingle es la funcion facil para usar una sola matriz max7219 load1 = LOW; comienza max72_spi.write(reg); especifica registro max72_spi.write(col); coloca datos load1 = HIGH; acegura que los datos estan cargados(en el cambio en alto de LOAD/CS) }
void maxTwo( int reg, int col) { maxSingle es la funcion facil para usar una sola matriz max7219 load2 = LOW; comienza max72_spi.write(reg); especifica registro max72_spi.write(col); coloca datos load2 = HIGH; acegura que los datos estan cargados(en el cambio en alto de LOAD/CS) }
void setup () { iniciacion de la matriz MAX7219 configuracion SPI : 8 bits, modo 0 max72_spi.format(8, 0); maxOne(max7219_reg_scanLimit, 0x07); maxOne(max7219_reg_decodeMode, 0x00); usando una matriz led (sin digitos) maxOne(max7219_reg_shutdown, 0x01); no para modo apagado
for (int e=1; e<=8; e++) { registros vacios, apaga todos los LEDs maxOne(e,0); maxTwo(e,0); }
maxOne(max7219_reg_intensity, 0x03 & 0x0f); con el primer registro se cambia intensidad luminica de la matriz. rango: 0x00 a 0x0f maxTwo(max7219_reg_intensity, 0x03 & 0x0f); }
//////
void AN() {
maxOne(1,158); maxOne(2,69); maxOne(3,37); maxOne(4,30); maxOne(5,248); maxOne(6,36); maxOne(7,66); maxOne(8,241);
}
void derecha(int grado) {
if (grado==1520){
mypwm.pulsewidth_us(grado); 180 grados
maxOne(1,114); maxOne(2,87); maxOne(3,242); maxOne(4,2); maxOne(5,242); maxOne(6,146); maxOne(7,151); maxOne(8,242); }
else if (grado<1520){
mypwm.pulsewidth_us(grado); 0 grados
maxOne(1,0); maxOne(2,0); maxOne(3,248); maxOne(4,138); maxOne(5,138); maxOne(6,250); maxOne(7,7); maxOne(8,2); }
else{
mypwm.pulsewidth_us(grado);
maxOne(1,250); maxOne(2,7); maxOne(3,250); maxOne(4,170); maxOne(5,250); maxOne(6,248); maxOne(7,136); maxOne(8,248); }
}
void izquierda(int grado) {
mypwm1.pulsewidth_us(640); 0 grados
maxOne(1,0); maxOne(2,0); maxOne(3,248); maxOne(4,138); maxOne(5,138); maxOne(6,250); maxOne(7,7); maxOne(8,2);
}
int main() {
mypwm.period_ms(20); setup (); while (1){
derecha(2500);
} }