servos matriz

Dependencies:   mbed

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

/media/uploads/miguelmstein/20170427_151521.jpg 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 Advanced Serial Port Terminal para Windows.

El código es autoria de los desarrolladores del proyecto tomando como referencia el proyecto anteriormente 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>>

  1. 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);

DigitalOut A(PB_8); DigitalOut B(PB_9); DigitalOut C(PA_5); DigitalOut D(PA_6); DigitalIn dir(PC_13);

PwmOut mypwm(PA_0); PwmOut mypwm1(PA_1); PwmOut mypwm2(PB_0);

Serial command(USBTX, USBRX);

define registros de matriz MAX7219

  1. define max7219_reg_noop 0x00
  2. define max7219_reg_digit0 0x01
  3. define max7219_reg_digit1 0x02
  4. define max7219_reg_digit2 0x03
  5. define max7219_reg_digit3 0x04
  6. define max7219_reg_digit4 0x05
  7. define max7219_reg_digit5 0x06
  8. define max7219_reg_digit6 0x07
  9. define max7219_reg_digit7 0x08
  10. define max7219_reg_decodeMode 0x09
  11. define max7219_reg_intensity 0x0a
  12. define max7219_reg_scanLimit 0x0b
  13. define max7219_reg_shutdown 0x0c
  14. define max7219_reg_displayTest 0x0f
  1. define LOW 0
  2. define HIGH 1
  1. define DEBUG 1

*************** COMANDO MOVER MOTOR |POS 1|POS 2|POS 3|POS 4| POS 5| | < | #M | , | #°G | > | #M -> indica el motor que se va a mover #°G -> indica los grados a mover del servomotor <,> -> inicio, separdor y fin de comando el inicio de comando no se almacena en el buffer *****************

VARIABLES PARA DEFINIR EL COMMANDO

  1. define BUFF_SIZE 8
  2. define COMM_NUM_MOTOR 0
  3. define COMM_SEPARADOR 1
  4. define COMM_GRADOS_MOTOR 2
  5. define COMM_NUM_MOTOR1 3
  6. define COMM_GRADOS_MOTOR1 4
  7. define COMM_NUM_MOTOR2 5
  8. define COMM_GRADOS_MOTOR2 6

uint8_t buffer_command[BUFF_SIZE]={0,0,0,0,0,0};

void print_num(uint8_t val)

{ if (val <10) command.putc(val+0x30); else command.putc(val-9+0x40);

} void print_bin2hex (uint8_t val) { command.printf(" 0x"); print_num(val>>4); print_num(val&0x0f);

}

TODO : TIMEOUT UART SERIAL void Read_command() { for (uint8_t i=0; i<BUFF_SIZE;i++) buffer_command[i]=command.getc();

}

void echo_command() { for (uint8_t i=0; i<BUFF_SIZE;i++) print_bin2hex(buffer_command[i]);

}

uint8_t check_command() { if (buffer_command[BUFF_SIZE-1]== '>' && buffer_command[COMM_SEPARADOR]==','){

  1. if DEBUG command.printf("\nMover Motor:"); print_bin2hex(buffer_command[COMM_NUM_MOTOR]); command.printf(" -> "); print_bin2hex(buffer_command[COMM_GRADOS_MOTOR]); command.printf("N grados \n");
  2. endif return 1; }
  3. if DEBUG command.printf("\n ERROR COMANDO -> "); echo_command();
  4. endif return 0;

}

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 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);

}

maxOne(max7219_reg_intensity, 0x03 & 0x0f); con el primer registro se cambia intensidad luminica de la matriz. rango: 0x00 a 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 CUg(){

maxOne(1,0); maxOne(2,240); maxOne(3,144); maxOne(4,240); maxOne(5,130); maxOne(6,242); maxOne(7,135); maxOne(8,2);

}

void NUg(){

maxOne(1,2); maxOne(2,247); maxOne(3,146); maxOne(4,242); maxOne(5,130); maxOne(6,242); maxOne(7,135); maxOne(8,2);

}

void COUg(){

maxOne(1,2); maxOne(2,247); maxOne(3,146); maxOne(4,242); maxOne(5,128); maxOne(6,240); maxOne(7,128); maxOne(8,0);

}

void CDg(){

maxOne(1,0); maxOne(2,240); maxOne(3,144); maxOne(4,240); maxOne(5,146); maxOne(6,210); maxOne(7,183); maxOne(8,2);

}

void NDg(){

maxOne(1,2); maxOne(2,247); maxOne(3,146); maxOne(4,242); maxOne(5,146); maxOne(6,210); maxOne(7,183); maxOne(8,2);

}

void CODg(){

maxOne(1,2); maxOne(2,247); maxOne(3,146); maxOne(4,242); maxOne(5,144); maxOne(6,208); maxOne(7,176); maxOne(8,0);

}

void CRg(){

maxOne(1,0); maxOne(2,248); maxOne(3,136); maxOne(4,248); maxOne(5,138); maxOne(6,170); maxOne(7,223); maxOne(8,2);

}

void NRg(){

maxOne(1,2); maxOne(2,255); maxOne(3,138); maxOne(4,250); maxOne(5,138); maxOne(6,170); maxOne(7,223); maxOne(8,2);

}

void CORg(){

maxOne(1,2); maxOne(2,255); maxOne(3,138); maxOne(4,250); maxOne(5,136); maxOne(6,168); maxOne(7,216); maxOne(8,0);

}

void PASOD(){

maxOne(1,0); maxOne(2,240); maxOne(3,144); maxOne(4,240); maxOne(5,114); maxOne(6,66); maxOne(7,247); maxOne(8,2);

}

void PASOI(){

maxOne(1,2); maxOne(2,247); maxOne(3,146); maxOne(4,242); maxOne(5,112); maxOne(6,64); maxOne(7,240); maxOne(8,0);

}

void command_motor(uint8_t nm,uint8_t grado) {

unsigned int g = grado*10+640;

if (nm==0x01){

if (grado==0x5a){

mypwm.pulsewidth_us(g);

NUg();

}

else if (grado<0x5a){

mypwm.pulsewidth_us(g);

CUg();

}

else{

mypwm.pulsewidth_us(g);

COUg(); }

}

else if (nm==0x02){

if (grado==0x5a){

mypwm1.pulsewidth_us(g);

NDg();

}

else if (grado<0x5a){

mypwm1.pulsewidth_us(g);

CDg();

}

else{

mypwm1.pulsewidth_us(g);

CODg(); }

}

else if (nm==0x03){

if (grado==0x5a){

mypwm2.pulsewidth_us(g);

NRg();

}

else if (grado<0x5a){

mypwm2.pulsewidth_us(g);

CRg();

}

else{

mypwm2.pulsewidth_us(g);

CORg(); }

}

else if(nm==0x04){

unsigned int p = grado*10;

if(dir==0x01){

PASOD();

for(int i=0; i<p; i++){

A=1; B=0; C=0; D=0; wait_us(950); A=1; B=1; C=0; D=0; wait_us(950); A=0; B=1; C=0; D=0; wait_us(950); A=0; B=1; C=1; D=0; wait_us(950); A=0; B=0; C=1; D=0; wait_us(950); A=0; B=0; C=1; D=1; wait_us(950); A=0; B=0; C=0; D=1; wait_us(950); A=1; B=0; C=0; D=1; wait_us(950); } }

else{

PASOI();

for(int i=0; i<p; i++){

A=0; B=0; C=0; D=1; wait_us(950); A=0; B=0; C=1; D=1; wait_us(950); A=0; B=0; C=1; D=0; wait_us(950); A=0; B=1; C=1; D=0; wait_us(950); A=0; B=1; C=0; D=0; wait_us(950); A=1; B=1; C=0; D=0; wait_us(950); A=1; B=0; C=0; D=0; wait_us(950); A=1; B=0; C=0; D=1; wait_us(950); } }

}

}

int main() {

  1. if DEBUG command.printf("Brandon\n");
  2. else command.printf("inicio sin debug\n");
  3. endif uint8_t val;

mypwm.period_ms(20); mypwm1.period_ms(20); mypwm2.period_ms(20); setup (); while (1){

val=command.getc(); if (val== '<'){ Read_command(); if (check_command()){ command_motor(buffer_command[COMM_NUM_MOTOR],buffer_command[COMM_GRADOS_MOTOR]); command_motor(buffer_command[COMM_NUM_MOTOR1],buffer_command[COMM_GRADOS_MOTOR1]); command_motor(buffer_command[COMM_NUM_MOTOR2],buffer_command[COMM_GRADOS_MOTOR2]);

} }

} }

Committer:
miguelmstein
Date:
Thu Apr 27 19:56:04 2017 +0000
Revision:
0:84edf6b90d7e
Child:
1:101a20f9eed2
servos matriz

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miguelmstein 0:84edf6b90d7e 1 #include "mbed.h"
miguelmstein 0:84edf6b90d7e 2
miguelmstein 0:84edf6b90d7e 3 // PC_12: DIN, PC_10: CLK, PA_15: LOAD/CS
miguelmstein 0:84edf6b90d7e 4 SPI max72_spi(PC_12, NC, PC_10);
miguelmstein 0:84edf6b90d7e 5 DigitalOut load1(PA_15);
miguelmstein 0:84edf6b90d7e 6 DigitalOut load2(PC_3);
miguelmstein 0:84edf6b90d7e 7
miguelmstein 0:84edf6b90d7e 8 PwmOut mypwm(PA_0);
miguelmstein 0:84edf6b90d7e 9 PwmOut mypwm1(PA_1);
miguelmstein 0:84edf6b90d7e 10
miguelmstein 0:84edf6b90d7e 11 // define registros de matriz MAX7219
miguelmstein 0:84edf6b90d7e 12 #define max7219_reg_noop 0x00
miguelmstein 0:84edf6b90d7e 13 #define max7219_reg_digit0 0x01
miguelmstein 0:84edf6b90d7e 14 #define max7219_reg_digit1 0x02
miguelmstein 0:84edf6b90d7e 15 #define max7219_reg_digit2 0x03
miguelmstein 0:84edf6b90d7e 16 #define max7219_reg_digit3 0x04
miguelmstein 0:84edf6b90d7e 17 #define max7219_reg_digit4 0x05
miguelmstein 0:84edf6b90d7e 18 #define max7219_reg_digit5 0x06
miguelmstein 0:84edf6b90d7e 19 #define max7219_reg_digit6 0x07
miguelmstein 0:84edf6b90d7e 20 #define max7219_reg_digit7 0x08
miguelmstein 0:84edf6b90d7e 21 #define max7219_reg_decodeMode 0x09
miguelmstein 0:84edf6b90d7e 22 #define max7219_reg_intensity 0x0a
miguelmstein 0:84edf6b90d7e 23 #define max7219_reg_scanLimit 0x0b
miguelmstein 0:84edf6b90d7e 24 #define max7219_reg_shutdown 0x0c
miguelmstein 0:84edf6b90d7e 25 #define max7219_reg_displayTest 0x0f
miguelmstein 0:84edf6b90d7e 26
miguelmstein 0:84edf6b90d7e 27 #define LOW 0
miguelmstein 0:84edf6b90d7e 28 #define HIGH 1
miguelmstein 0:84edf6b90d7e 29
miguelmstein 0:84edf6b90d7e 30 void maxOne( int reg, int col) {
miguelmstein 0:84edf6b90d7e 31 //maxSingle es la funcion facil para usar una sola matriz max7219
miguelmstein 0:84edf6b90d7e 32 load1 = LOW; // comienza
miguelmstein 0:84edf6b90d7e 33 max72_spi.write(reg); // especifica registro
miguelmstein 0:84edf6b90d7e 34 max72_spi.write(col); // coloca datos
miguelmstein 0:84edf6b90d7e 35 load1 = HIGH; // acegura que los datos estan cargados(en el cambio en alto de LOAD/CS)
miguelmstein 0:84edf6b90d7e 36 }
miguelmstein 0:84edf6b90d7e 37
miguelmstein 0:84edf6b90d7e 38 void maxTwo( int reg, int col) {
miguelmstein 0:84edf6b90d7e 39 //maxSingle es la funcion facil para usar una sola matriz max7219
miguelmstein 0:84edf6b90d7e 40 load2 = LOW; // comienza
miguelmstein 0:84edf6b90d7e 41 max72_spi.write(reg); // especifica registro
miguelmstein 0:84edf6b90d7e 42 max72_spi.write(col); // coloca datos
miguelmstein 0:84edf6b90d7e 43 load2 = HIGH; // acegura que los datos estan cargados(en el cambio en alto de LOAD/CS)
miguelmstein 0:84edf6b90d7e 44 }
miguelmstein 0:84edf6b90d7e 45
miguelmstein 0:84edf6b90d7e 46 void setup () {
miguelmstein 0:84edf6b90d7e 47 // iniciacion de la matriz MAX7219
miguelmstein 0:84edf6b90d7e 48 // configuracion SPI : 8 bits, modo 0
miguelmstein 0:84edf6b90d7e 49 max72_spi.format(8, 0);
miguelmstein 0:84edf6b90d7e 50 maxOne(max7219_reg_scanLimit, 0x07);
miguelmstein 0:84edf6b90d7e 51 maxOne(max7219_reg_decodeMode, 0x00); // usando una matriz led (sin digitos)
miguelmstein 0:84edf6b90d7e 52 maxOne(max7219_reg_shutdown, 0x01); // no para modo apagado
miguelmstein 0:84edf6b90d7e 53
miguelmstein 0:84edf6b90d7e 54
miguelmstein 0:84edf6b90d7e 55
miguelmstein 0:84edf6b90d7e 56
miguelmstein 0:84edf6b90d7e 57 for (int e=1; e<=8; e++) { // registros vacios, apaga todos los LEDs
miguelmstein 0:84edf6b90d7e 58 maxOne(e,0);
miguelmstein 0:84edf6b90d7e 59 maxTwo(e,0);
miguelmstein 0:84edf6b90d7e 60 }
miguelmstein 0:84edf6b90d7e 61
miguelmstein 0:84edf6b90d7e 62 maxOne(max7219_reg_intensity, 0x03 & 0x0f); // con el primer registro se cambia intensidad luminica de la matriz. rango: 0x00 a 0x0f
miguelmstein 0:84edf6b90d7e 63 maxTwo(max7219_reg_intensity, 0x03 & 0x0f);
miguelmstein 0:84edf6b90d7e 64 }
miguelmstein 0:84edf6b90d7e 65
miguelmstein 0:84edf6b90d7e 66 //////////////////////////////
miguelmstein 0:84edf6b90d7e 67
miguelmstein 0:84edf6b90d7e 68 void AN() {
miguelmstein 0:84edf6b90d7e 69
miguelmstein 0:84edf6b90d7e 70 maxOne(1,158);
miguelmstein 0:84edf6b90d7e 71 maxOne(2,69);
miguelmstein 0:84edf6b90d7e 72 maxOne(3,37);
miguelmstein 0:84edf6b90d7e 73 maxOne(4,30);
miguelmstein 0:84edf6b90d7e 74 maxOne(5,248);
miguelmstein 0:84edf6b90d7e 75 maxOne(6,36);
miguelmstein 0:84edf6b90d7e 76 maxOne(7,66);
miguelmstein 0:84edf6b90d7e 77 maxOne(8,241);
miguelmstein 0:84edf6b90d7e 78
miguelmstein 0:84edf6b90d7e 79 }
miguelmstein 0:84edf6b90d7e 80
miguelmstein 0:84edf6b90d7e 81 void derecha(int grado) {
miguelmstein 0:84edf6b90d7e 82
miguelmstein 0:84edf6b90d7e 83 if (grado==1520){
miguelmstein 0:84edf6b90d7e 84
miguelmstein 0:84edf6b90d7e 85 mypwm.pulsewidth_us(grado); //180 grados
miguelmstein 0:84edf6b90d7e 86
miguelmstein 0:84edf6b90d7e 87
miguelmstein 0:84edf6b90d7e 88
miguelmstein 0:84edf6b90d7e 89 maxOne(1,114);
miguelmstein 0:84edf6b90d7e 90 maxOne(2,87);
miguelmstein 0:84edf6b90d7e 91 maxOne(3,242);
miguelmstein 0:84edf6b90d7e 92 maxOne(4,2);
miguelmstein 0:84edf6b90d7e 93 maxOne(5,242);
miguelmstein 0:84edf6b90d7e 94 maxOne(6,146);
miguelmstein 0:84edf6b90d7e 95 maxOne(7,151);
miguelmstein 0:84edf6b90d7e 96 maxOne(8,242);
miguelmstein 0:84edf6b90d7e 97 }
miguelmstein 0:84edf6b90d7e 98
miguelmstein 0:84edf6b90d7e 99 else if (grado<1520){
miguelmstein 0:84edf6b90d7e 100
miguelmstein 0:84edf6b90d7e 101 mypwm.pulsewidth_us(grado); //0 grados
miguelmstein 0:84edf6b90d7e 102
miguelmstein 0:84edf6b90d7e 103
miguelmstein 0:84edf6b90d7e 104
miguelmstein 0:84edf6b90d7e 105 maxOne(1,0);
miguelmstein 0:84edf6b90d7e 106 maxOne(2,0);
miguelmstein 0:84edf6b90d7e 107 maxOne(3,248);
miguelmstein 0:84edf6b90d7e 108 maxOne(4,138);
miguelmstein 0:84edf6b90d7e 109 maxOne(5,138);
miguelmstein 0:84edf6b90d7e 110 maxOne(6,250);
miguelmstein 0:84edf6b90d7e 111 maxOne(7,7);
miguelmstein 0:84edf6b90d7e 112 maxOne(8,2);
miguelmstein 0:84edf6b90d7e 113 }
miguelmstein 0:84edf6b90d7e 114
miguelmstein 0:84edf6b90d7e 115 else{
miguelmstein 0:84edf6b90d7e 116
miguelmstein 0:84edf6b90d7e 117 mypwm.pulsewidth_us(grado);
miguelmstein 0:84edf6b90d7e 118
miguelmstein 0:84edf6b90d7e 119 maxOne(1,250);
miguelmstein 0:84edf6b90d7e 120 maxOne(2,7);
miguelmstein 0:84edf6b90d7e 121 maxOne(3,250);
miguelmstein 0:84edf6b90d7e 122 maxOne(4,170);
miguelmstein 0:84edf6b90d7e 123 maxOne(5,250);
miguelmstein 0:84edf6b90d7e 124 maxOne(6,248);
miguelmstein 0:84edf6b90d7e 125 maxOne(7,136);
miguelmstein 0:84edf6b90d7e 126 maxOne(8,248);
miguelmstein 0:84edf6b90d7e 127 }
miguelmstein 0:84edf6b90d7e 128
miguelmstein 0:84edf6b90d7e 129
miguelmstein 0:84edf6b90d7e 130
miguelmstein 0:84edf6b90d7e 131 }
miguelmstein 0:84edf6b90d7e 132
miguelmstein 0:84edf6b90d7e 133 void izquierda(int grado) {
miguelmstein 0:84edf6b90d7e 134
miguelmstein 0:84edf6b90d7e 135 mypwm1.pulsewidth_us(640); //0 grados
miguelmstein 0:84edf6b90d7e 136
miguelmstein 0:84edf6b90d7e 137
miguelmstein 0:84edf6b90d7e 138
miguelmstein 0:84edf6b90d7e 139 maxOne(1,0);
miguelmstein 0:84edf6b90d7e 140 maxOne(2,0);
miguelmstein 0:84edf6b90d7e 141 maxOne(3,248);
miguelmstein 0:84edf6b90d7e 142 maxOne(4,138);
miguelmstein 0:84edf6b90d7e 143 maxOne(5,138);
miguelmstein 0:84edf6b90d7e 144 maxOne(6,250);
miguelmstein 0:84edf6b90d7e 145 maxOne(7,7);
miguelmstein 0:84edf6b90d7e 146 maxOne(8,2);
miguelmstein 0:84edf6b90d7e 147
miguelmstein 0:84edf6b90d7e 148
miguelmstein 0:84edf6b90d7e 149 }
miguelmstein 0:84edf6b90d7e 150
miguelmstein 0:84edf6b90d7e 151
miguelmstein 0:84edf6b90d7e 152 int main() {
miguelmstein 0:84edf6b90d7e 153
miguelmstein 0:84edf6b90d7e 154 mypwm.period_ms(20);
miguelmstein 0:84edf6b90d7e 155 setup ();
miguelmstein 0:84edf6b90d7e 156 while (1){
miguelmstein 0:84edf6b90d7e 157
miguelmstein 0:84edf6b90d7e 158
miguelmstein 0:84edf6b90d7e 159 derecha(2500);
miguelmstein 0:84edf6b90d7e 160
miguelmstein 0:84edf6b90d7e 161
miguelmstein 0:84edf6b90d7e 162
miguelmstein 0:84edf6b90d7e 163 }
miguelmstein 0:84edf6b90d7e 164 }