Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Wiki_Tecnica
MANUAL TECNICO¶
Para la programación de la tarjeta STM32L476 se utilizó MBED, esta es una plataforma y sistema operativo para dispositivos conectados a Internet basados en microcontroladores ARM Cortex-M de 32 bits. La principal ventaja es que puede compilarse en la nube, es decir desde Internet. MBED se desarrolló pensando en IoT – Internet of Things – El Internet de las Cosas. Además, está enfocado a la programación de sistemas embebidos basados en arquitecturas ARM. Por ejemplo, existen más de 100 tarjetas de desarrollo que se puede elegir. Todas ellas con arquitectura ARM. El compilador que usa MBED está en la “nube”. En otras palabras, se requiere de un explorador web como Chrome, Firefox o Explorer para crear tus aplicaciones y programas.
¿COMO CREAR UN NUEVO PROYECTO EN MBED?¶
Para iniciar a crear el código se debe acceder a la página https://www.mbed.com/en/ en donde encontraran lo siguiente:
Damos click sobre el usuario de allí se despliega la siguiente pagina en donde seleccionamos Sing up
Registramos los datos para crear un usuario.
Una vez creado el usuario ingresamos a la plataforma
Ventana de inicio al programa, seleccione “compiler”
Se abrirá la ventana donde se debe seleccionar la tarjeta a utilizar que en este caso es la STM32L476
Seleccionar tarjeta
Al seleccionar la tarjeta se encontrarán dos ventanas, la primera da una descripción general de la tarjeta y en la segunda se encuentra el “Pinout” de la misma.
Ahora ya está listo para crear su código.
DIAGRAMA DE CONEXIÓN GENERAL¶
Componentes y sus conexiones.¶
Buzzer:¶
Caracteristicas:
• Diametro: Φ12mm
• Alto: 9.5mm
• Voltaje disponible:
Sensor de color TCS3200¶
Características:
• Sensor de colores de alta resolución
• Cuatro grupos de detección: Rojo, verde, azul (RGB) y luz blanca (sin filtro, detecta todas las longitudes de onda)
• Se puede detectar cualquier color cuantificando la intensidad de cada uno de los componentes RGB que posee la luz recibida
• Arreglo de 64 (8x8) fotodiodos (16 para el rojo, 16 para el verde, 16 para el azul y 16 sin ningún filtro)
• Fotodiodos de cada grupo ubicados de manera intercalada para minimizar el efecto de una irradiancia incidente no uniforme
• La salida es una onda cuadrada con ciclo de trabajo del 50% cuya frecuencia es directamente proporcional a la intensidad de la luz (irradiancia) para el color seleccionado
• Color de detección seleccionable mediante S2 y S3
• Escalamiento de la frecuencia de salida configurable mediante S0 y S1 (apagado, 2%, 20% y 100%)
• Frecuencia de salida máxima (@ 100%): 600 kHz típico
• Se comunica directamente con μC y μP u otra lógica
• Salida tri-estado permite conectar múltiples sensores al mismo bus
• Voltaje de alimentación recomendado: 2.7 V a 5.5 V
• Encapsulado: SOIC 8 pines (SMD)
• Producto genuino
Motor NEMA:¶
Caracteristicas:
- 200 pasos por revolution y 1.8º
- 4 cables de 12" de longitud
- Cuerpo de 42mm
- Taladros de montaje a 31mm para M3
- Eje de 5mm de diametro y 24mm de longitud
- 12V DC y 350mA (puede funcionar a voltajes inferiores)
- Par por fase: 2Kg/cm
Board STM32L476RG:¶
Características comunes
o Microcontrolador STM32 en paquete LQFP64
o 1 usuario de LED compartido con Arduino ™
o 1 usuario y 1 pulsadores de reinicio
o Oscilador de cristal de 32.768 kHz
o Conectores de placa:Conector de expansión Arduino ™ Uno V3Cabezales de pines de extensión ST morpho para un acceso completo a todas las E / S STM32
o Opciones flexibles de fuente de alimentación: ST-LINK, USB V BUS o fuentes externas
o Programador / depurador ST-LINK integrado con capacidad de re-enumeración USB: almacenamiento masivo, puerto COM virtual y puerto de depuración
o Bibliotecas de software gratuitas completas y ejemplos disponibles con el paquete MCU STM32Cube
o Apoyo de una amplia variedad de entornos de desarrollo integrado (IDE), incluyendo IAR ™, Keil ® IDE y GCC basadas
o Características específicas del tablero
o SMPS externo para generar suministro de lógica de núcleo V
o 24 MHz HSE
o Conectores de placa:Conector dedicado de experimentación SMPS externoConector USB Micro-AB o Mini-AB para el ST-LINKMIPI ® conector de depuración
o Compatible con Arm ® Mbed Enabled ™
Driver 8825:¶
Características:
Esta placa utiliza el driver DRV8825 de Texas Instrumenst para motores paso a paso bipolares y es ampliamente utilizada con las distintas placas de control de impresoras 3D y Máquinas CNC. Este módulo es pin-compatible con el driver A4988, lo que significa que puede usarse como reemplazo directo de mejor rendimiento. Esto lo hace ideal para su uso con el Shield RAMPS 1.4 y el Shield CNC. Este driver tiene limitación de corriente ajustable, protección contra sobre corriente y seis resoluciones diferentes de microstepping (máx. 1/32). Funciona con voltajes entre 8.2 y 45V y puede entregar hasta 1.5A por fase sin necesidad de disipador, para mayor consumo de corriente de hasta 2,2A se recomienda usar un disipador y ventilación por aire forzado.
• Voltaje Lógico: 3.3V - 5V DC
• Volvaje potencia: 8.2V - 45V DC
• Corriente: 1.5A por bobina (máx. 2.2A)
• Interface de control de STEP y DIRECTION
• 6 resoluciones: full step, half step, 1/4, 1/8, 1/16, 1/32
• El potenciometro te permite limitar la corriente máxima, para poder usar voltajes mas altos y lograr mejor resolución.
• Regulador incluido
• Funciona con sistemas de 3.3 y 5V
• Protección de sobre temperatura, sobrecorriente y voltaje bajo
• Proteccion de corto a tierra, y corto de carga
• PCB de 4 capas
• Pin-compatible con el driver A4988
Sensor HC-SR04¶
Características:
• Los módulos incluyen transmisores ultrasónicos, el receptor y el circuito de control.
• Número de pines:
o VCC: Alimentación +5V (4.5V min – 5.5V max)
o TRIG: Trigger entrada (input) del sensor (TTL)
o ECHO: Echo salida (output) del Sensor (TTL)
o GND
• Corriente de reposo: < 2mA
• Corriente de trabajo: 15mA
• Ángulo de medición: 30º
• Ángulo de medición efectivo: < 15º
• Detección de 2cm a 400cm o 1" a 13 pies (Sirve a más de 4m, pero el fabricante no garantiza una buena medición).
• “Resolución” La precisión puede variar entre los 3mm o 0.3cm.
• Dimensiones: 45mm x 20mm x 15mm
• Frecuencia de trabajo: 40KHz
Explicación del código:¶
/// AGREGAR LIBRERIA ///
- include "mbed.h"
- include "scolor_TCS3200.h"
- include "ultrasonic.h"
/ ASIGNACIÓN DE PINES ///
Serial command(USBTX, USBRX);
AnalogIn analog_M1(A5);
AnalogIn analog_M2(A4);
PwmOut mybuzzer(D9);
DigitalOut stepper_step(PB_8);
DigitalOut steppeer_dir(PB_9);
DigitalOut stepper_step_2(PA_7);
DigitalOut steppeer_dir_2(PA_6);
InterruptIn B1 (USER_BUTTON);
S0, S1, S2, S3, OUT
scolor_TCS3200 scolor(PA_8, PB_10, PB_4, PB_5, PB_3);
void dist(int distance)
{
put code here to happen when the distance is changed
mybuzzer.write(0);
mybuzzer.period_ms(500);
mybuzzer.write(0.5);
wait(2);
mybuzzer.write(0);
}
ultrasonic mu(D2, D8, .1, 1, &dist); Set the trigger pin to D8 and the echo pin to D9
have updates every .1 seconds and a timeout after 1
second, and call dist when the distance changes
// DEFINICIÓN DE TELECOMANDOS///
- define INITCMD 0xFF
- define VELOCITY 5000
- define TONO_1 0x01
- define TONO_2 0x02
- define TONO_3 0x03
- define TONO_4 0x04
- define UP 0x05
- define DOWN 0x06
- define LEFT 0x07
- define RIGTH 0x08
- define VEL 0x09
- define JOS 0x0A
/// DEFINICIÓN DE VARIABLES Y VALORES PARA FRECUENCIA DE BUZZER/////777
- define DO 150
- define RE 200
- define MI 250
- define FA 300
// DEFINICIÓN DE VARIABLES GLOBALES//
uint8_t tip_mov;
uint8_t n_vueltas;
uint8_t STEEP;
float velocidad=500;
uint8_t tiempo;
uint8_t stop=0;
bool enable=0;
bool b=0;
bool leer=0;
bool prueba=0;
float meas_X;
float meas_Y;
Ticker tk1;
Ticker tk2;
///DEFINICIÓN DE FUNCIONES///
void setup_uart();
void mover_steper_nema();
void leer_datos();
void funcion_pasos();
void funcion_pasos_2();
void buzzer_on();
void leer_color();
void funcion_jos();
//EJECUCIÓN DE INTERRUPCIONES///
void ISR_BR(void)
{
stop=0;
leer=1;
}
void f_ISR_BR(void)
{
leer=0;
}
// PROGRAMA PRINCIPAL////
int main() {
setup_uart();
B1.fall(&ISR_BR);
B1.rise(&f_ISR_BR);
mu.startUpdates();start mesuring the distance
while(1){
tk1.attach(&leer_color, 0.5);
leer_datos();
mover_steper_nema();
mu.checkDistance(); call checkDistance() as much as possible, as this is where
the class checks if dist needs to be called.
}
}
///EJECUCIÓN DE FUNCIÓN PARA ASIGANACIÓN DE VELOCIDAD DE COMUNICACIÓN//////
void setup_uart(){
command.baud(115200);
}
/EJECUCIÓN DE FUNCIÓN PARA LEER LOS DATOS RECIBIDOS///7
void leer_datos(){
while(command.getc()!= INITCMD);
tip_mov=command.getc();
n_vueltas=command.getc();
}
///EJECUCIÓN DE FUNCIÓN PARA DEFINIR TIPOS DE MOVIMIENTO SEGÚN VALORES RECIBIDOS///
void mover_steper_nema(){
switch (tip_mov){
case TONO_1:
mybuzzer.write(0);
mybuzzer.period_ms(DO);
buzzer_on();
break;
case TONO_2:
mybuzzer.write(0);
mybuzzer.period_ms(RE);
buzzer_on();
break;
case TONO_3:
mybuzzer.write(0);
mybuzzer.period_ms(MI);
buzzer_on();
break;
case TONO_4:
mybuzzer.write(0);
mybuzzer.period_ms(FA);
buzzer_on();
break;
case UP:
steppeer_dir=1;
steppeer_dir_2=0;
STEEP=200;
funcion_pasos();
break;
case DOWN:
steppeer_dir=0;
steppeer_dir_2=1;
STEEP=200;
funcion_pasos();
break;
case LEFT:
steppeer_dir=1;
steppeer_dir_2=1;
STEEP=50;
funcion_pasos_2();
break;
case RIGTH:
steppeer_dir=0;
steppeer_dir_2=0;
STEEP=50;
funcion_pasos_2();
break;
case VEL:
if (n_vueltas==1)
{velocidad = 250;}
else if (n_vueltas==2)
{velocidad = 500;}
else if (n_vueltas==3)
{velocidad = 750;}
break;
case JOS:
if (n_vueltas==1)
{stop=1;}
funcion_jos();
if (n_vueltas==2)
{stop=0;}
break;
}
}
// EJECUCIÓN DE SUBFUNCIONES LLAMADAS DESDE FUNCIÓN MOVER STEEPER MOTOR////
// EJECUCIÓN PARA MOVIMIENTOS DE MOTOR N VUELTAS/////
void funcion_pasos()
{ wait_us(velocidad);
for (int a=0; a<n_vueltas; a++){
for(int i=0; i<STEEP; i++)
{if (leer ==0){
stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
printf("i");
}
}
}
// EJECUCIÓN PARA MOVIMIENTOS DE MOTOR IZQUIERDA Y DERECHA///
void funcion_pasos_2()
{ wait_us(velocidad);
for(int i=0; i<STEEP; i++)
{if (leer ==0){
stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
}
}
// EJECUCIÓN PARA LEER COLOR/////
void leer_color(){
long red = scolor.ReadRed();
long green = scolor.ReadGreen();
long blue = scolor.ReadBlue();
long clear = scolor.ReadClear();
if (red>=5 and red <=21) lee el rojo----
{
if (green >=50 and green<=63)
{
if (blue>=43 and blue <=55)
{
command.putc(0xfe);
command.putc(0x01);
}
}
}
if (red >=5 and red<=65) lee el verde --------
{
if (green>=43 and green <=47)
{
if (blue>=55 and blue <=60)
{
command.putc(0xfe);
command.putc(0x03);
}
}
}
if (red >=5 and red <=70) lee el azul--------
{
if (green>=37 and green <=41)
{
if (blue>=21 and blue <=25)
{
command.putc(0xfe);
command.putc(0x02);
}
}
}
if (red >=5 and red <=15) lee el amarillo--------
{
if (green>=4 and green <=15)
{
if (blue>=24 and blue <=38)
{
command.putc(0xfe);
command.putc(0x04);
}
}
}
if (red <=25) lectura errada--------
{
if (green <=25)
{
if (blue <=25)
{
command.putc(0xfe);
command.putc(0x00);
}
}
}
}
// EJECUCIÓN PARA ACTIVAR BUZZER N SEGUNDOS/////
void buzzer_on()
{ tiempo = n_vueltas;
mybuzzer.write(0.5);
wait(tiempo);
mybuzzer.write(0);
}
// EJECUCIÓN FUNCIÓN PARA ACTIVAR MODO JOYSTICK/////
void funcion_jos()
{
while (stop) {
meas_X=analog_M1.read();
meas_Y=analog_M2.read();
wait(1);
if (meas_X>=0.8)
{prueba=0;
steppeer_dir=1;
steppeer_dir_2=0;
wait_us(2000);
STEEP+=200;
for(int i=0; i<STEEP; i++)
{
stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
}
if (meas_X<=0.2)
{steppeer_dir=0;
steppeer_dir_2=1;
STEEP+=200;
for(int i=0; i<STEEP; i++)
{ stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
}
if (meas_Y>=0.8)
{steppeer_dir=1;
steppeer_dir_2=1;
STEEP=50;
for(int i=0; i<STEEP; i++)
{ stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
}
if (meas_Y<=0.2)
{steppeer_dir=0;
steppeer_dir_2=0;
STEEP=50;
for(int i=0; i<STEEP; i++)
{ stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
} } } }
MANUAL DE USUARIO¶
Descripción General: A continuación, se hará la descripción paso a paso para lograr implementar el movimiento de dos motores NEMA en diferentes sentidos, la lectura de colores primarios y distinción por un sonido característico del buzzer. Nuestro carro robot luego de ensamblado lograra moverse los pasos que sean solicitados por el usuario hacia adelante, atrás, derecha e izquierda, detectara los colores primarios y según el color el buzzer ejecutara un sonido diferente por color. Explicación en las telemetrías.
Recomendaciones generales:
• No manipules el sensor, driver o la board con las manos húmedas.
• Verificar la corriente del driver y ajustar antes de iniciar la conexión con el NEMA17.
Ejecutables:
• MBED
• COOLTERM
Lo primero que debes de tener en cuenta es conocer las principales características de cada uno de los elementos a utilizar (Para esto diríjase al manual técnico). También las cantidades a usar:
• 1 Buzer
• 1 Sensor de color TCS3200
• 2 Motores NEMA
• 1 Board STM32L476RG
• 1 Driver 8825
• 2 Sensores HC-SR04
Luego de conocer las características y funciones de cada uno de los componentes debes de compilar el siguiente código en tu board STM32L476RG:
/// AGREGAR LIBRERIA ///
- include "mbed.h"
- include "scolor_TCS3200.h"
- include "ultrasonic.h"
/ ASIGNACIÓN DE PINES ///
Serial command(USBTX, USBRX);
AnalogIn analog_M1(A5);
AnalogIn analog_M2(A4);
PwmOut mybuzzer(D9);
DigitalOut stepper_step(PB_8);
DigitalOut steppeer_dir(PB_9);
DigitalOut stepper_step_2(PA_7);
DigitalOut steppeer_dir_2(PA_6);
InterruptIn B1 (USER_BUTTON);
S0, S1, S2, S3, OUT
scolor_TCS3200 scolor(PA_8, PB_10, PB_4, PB_5, PB_3);
void dist(int distance)
{
put code here to happen when the distance is changed
mybuzzer.write(0);
mybuzzer.period_ms(500);
mybuzzer.write(0.5);
wait(2);
mybuzzer.write(0);
}
ultrasonic mu(D2, D8, .1, 1, &dist); Set the trigger pin to D8 and the echo pin to D9
have updates every .1 seconds and a timeout after 1
second, and call dist when the distance changes
// DEFINICIÓN DE TELECOMANDOS///
- define INITCMD 0xFF
- define VELOCITY 5000
- define TONO_1 0x01
- define TONO_2 0x02
- define TONO_3 0x03
- define TONO_4 0x04
- define UP 0x05
- define DOWN 0x06
- define LEFT 0x07
- define RIGTH 0x08
- define VEL 0x09
- define JOS 0x0A
/// DEFINICIÓN DE VARIABLES Y VALORES PARA FRECUENCIA DE BUZZER/////777
- define DO 150
- define RE 200
- define MI 250
- define FA 300
// DEFINICIÓN DE VARIABLES GLOBALES//
uint8_t tip_mov;
uint8_t n_vueltas;
uint8_t STEEP;
float velocidad=500;
uint8_t tiempo;
uint8_t stop=0;
bool enable=0;
bool b=0;
bool leer=0;
bool prueba=0;
float meas_X;
float meas_Y;
Ticker tk1;
Ticker tk2;
///DEFINICIÓN DE FUNCIONES///
void setup_uart();
void mover_steper_nema();
void leer_datos();
void funcion_pasos();
void funcion_pasos_2();
void buzzer_on();
void leer_color();
void funcion_jos();
//EJECUCIÓN DE INTERRUPCIONES///
void ISR_BR(void)
{
stop=0;
leer=1;
}
void f_ISR_BR(void)
{
leer=0;
}
// PROGRAMA PRINCIPAL////
int main() {
setup_uart();
B1.fall(&ISR_BR);
B1.rise(&f_ISR_BR);
mu.startUpdates();start mesuring the distance
while(1){
tk1.attach(&leer_color, 0.5);
leer_datos();
mover_steper_nema();
mu.checkDistance(); call checkDistance() as much as possible, as this is where
the class checks if dist needs to be called.
}
}
///EJECUCIÓN DE FUNCIÓN PARA ASIGANACIÓN DE VELOCIDAD DE COMUNICACIÓN//////
void setup_uart(){
command.baud(115200);
}
/EJECUCIÓN DE FUNCIÓN PARA LEER LOS DATOS RECIBIDOS///7
void leer_datos(){
while(command.getc()!= INITCMD);
tip_mov=command.getc();
n_vueltas=command.getc();
}
///EJECUCIÓN DE FUNCIÓN PARA DEFINIR TIPOS DE MOVIMIENTO SEGÚN VALORES RECIBIDOS///
void mover_steper_nema(){
switch (tip_mov){
case TONO_1:
mybuzzer.write(0);
mybuzzer.period_ms(DO);
buzzer_on();
break;
case TONO_2:
mybuzzer.write(0);
mybuzzer.period_ms(RE);
buzzer_on();
break;
case TONO_3:
mybuzzer.write(0);
mybuzzer.period_ms(MI);
buzzer_on();
break;
case TONO_4:
mybuzzer.write(0);
mybuzzer.period_ms(FA);
buzzer_on();
break;
case UP:
steppeer_dir=1;
steppeer_dir_2=0;
STEEP=200;
funcion_pasos();
break;
case DOWN:
steppeer_dir=0;
steppeer_dir_2=1;
STEEP=200;
funcion_pasos();
break;
case LEFT:
steppeer_dir=1;
steppeer_dir_2=1;
STEEP=50;
funcion_pasos_2();
break;
case RIGTH:
steppeer_dir=0;
steppeer_dir_2=0;
STEEP=50;
funcion_pasos_2();
break;
case VEL:
if (n_vueltas==1)
{velocidad = 250;}
else if (n_vueltas==2)
{velocidad = 500;}
else if (n_vueltas==3)
{velocidad = 750;}
break;
case JOS:
if (n_vueltas==1)
{stop=1;}
funcion_jos();
if (n_vueltas==2)
{stop=0;}
break;
}
}
// EJECUCIÓN DE SUBFUNCIONES LLAMADAS DESDE FUNCIÓN MOVER STEEPER MOTOR////
// EJECUCIÓN PARA MOVIMIENTOS DE MOTOR N VUELTAS/////
void funcion_pasos()
{ wait_us(velocidad);
for (int a=0; a<n_vueltas; a++){
for(int i=0; i<STEEP; i++)
{if (leer ==0){
stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
printf("i");
}
}
}
// EJECUCIÓN PARA MOVIMIENTOS DE MOTOR IZQUIERDA Y DERECHA///
void funcion_pasos_2()
{ wait_us(velocidad);
for(int i=0; i<STEEP; i++)
{if (leer ==0){
stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
}
}
// EJECUCIÓN PARA LEER COLOR/////
void leer_color(){
long red = scolor.ReadRed();
long green = scolor.ReadGreen();
long blue = scolor.ReadBlue();
long clear = scolor.ReadClear();
if (red>=5 and red <=21) lee el rojo----
{
if (green >=50 and green<=63)
{
if (blue>=43 and blue <=55)
{
command.putc(0xfe);
command.putc(0x01);
}
}
}
if (red >=5 and red<=65) lee el verde --------
{
if (green>=43 and green <=47)
{
if (blue>=55 and blue <=60)
{
command.putc(0xfe);
command.putc(0x03);
}
}
}
if (red >=5 and red <=70) lee el azul--------
{
if (green>=37 and green <=41)
{
if (blue>=21 and blue <=25)
{
command.putc(0xfe);
command.putc(0x02);
}
}
}
if (red >=5 and red <=15) lee el amarillo--------
{
if (green>=4 and green <=15)
{
if (blue>=24 and blue <=38)
{
command.putc(0xfe);
command.putc(0x04);
}
}
}
if (red <=25) lectura errada--------
{
if (green <=25)
{
if (blue <=25)
{
command.putc(0xfe);
command.putc(0x00);
}
}
}
}
// EJECUCIÓN PARA ACTIVAR BUZZER N SEGUNDOS/////
void buzzer_on()
{ tiempo = n_vueltas;
mybuzzer.write(0.5);
wait(tiempo);
mybuzzer.write(0);
}
// EJECUCIÓN FUNCIÓN PARA ACTIVAR MODO JOYSTICK/////
void funcion_jos()
{
while (stop) {
meas_X=analog_M1.read();
meas_Y=analog_M2.read();
wait(1);
if (meas_X>=0.8)
{prueba=0;
steppeer_dir=1;
steppeer_dir_2=0;
wait_us(2000);
STEEP+=200;
for(int i=0; i<STEEP; i++)
{
stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
}
if (meas_X<=0.2)
{steppeer_dir=0;
steppeer_dir_2=1;
STEEP+=200;
for(int i=0; i<STEEP; i++)
{ stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
}
if (meas_Y>=0.8)
{steppeer_dir=1;
steppeer_dir_2=1;
STEEP=50;
for(int i=0; i<STEEP; i++)
{ stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
}
}
if (meas_Y<=0.2)
{steppeer_dir=0;
steppeer_dir_2=0;
STEEP=50;
for(int i=0; i<STEEP; i++)
{ stepper_step=1;
stepper_step_2=1;
wait_us(velocidad);
stepper_step=0;
stepper_step_2=0;
wait_us(velocidad);
} } } }
Para compilar el código debes usar MBED, es una herramienta que funciona con internet, para esto (diríjase al manual técnico).
COOLTERM¶
Es una sencilla aplicación que permite tener una terminal para los puertos serie, su menú de configuración está muy completo, permitiendo elegir desde una lista los puertos disponibles y seleccionar su velocidad y demás parámetros; despliega los datos recibidos tanto en ascii como en hexadecimal. Sin duda una gran aplicación para los que hacemos uso de este protocolo constantemente para conexión del ordenador con microcontroladores, módulos USB-serial, GPS, controladores de servos, etc. Lo mejor de todo está bajo una licencia freeware y es multiplataforma. Con CoolTerm se logrará generar las señales necesarias para que el programa ejecute las funciones.
Para obtener coolterm debemos ingresar a la siguiente página http://freeware.the-meiers.org/
La descarga se realiza de acuerdo al sistema operativo de la computadora en donde se trabaje.
El Coolterm se descarga en una carpeta comprimida en donde se debe seleccionar el ejecutable.
Seleccionar ejecutar.
Seleccionamos “Connect”
Abrir “Options” y determinar el puerto que varía según el dispositivo, además, definimos el budrate o la velocidad de la CPU que será de “115200”.
Luego damos click en “Connect” y luego en “Clear Data”, para inicializar el programa.
Luego damos “CTRL+T”, se abrirá la ventanilla que permite enviar la telemetría y damos clic en "HEX" (Hexadecimal), que indica el tipo de carácter que se va a enviar.
Escribimos “FF” que es el comando que inicia el programa.
Dele click en “Send”, para enviar el comando hexadecimal y automáticamente el buzzer sonará con frecuencias diferentes de acuerdo al color censado o si no tiene filtro y nuestros motores ejecutaran el movimiento que según nuestra telemetría este definido.
La siguiente tabla indica cada comando impreso con su definición y de la manera en la que digitando en hexadecimal en coolterm obtendrás la acción que desees ejecute tu robot:
Driver 8825¶
Te preguntaras para que utilizar un driver para el motor NEMA17 y es por lo siguiente, Los drivers actúan como una válvula que controla la corriente de los motores. Cuando la board manda la señal, el driver permite pasar la corriente desde nuestra fuente de alimentación a la bobina del motor. De esta forma, el driver separa la corriente que alimenta la board (normalmente de 5V), de la corriente que circula por las bobinas de los motores (normalmente de 12V)
STM32L476R¶
Este es el componente principal que debes de tener en cuenta, aquí podrás almacenar el código para que nuestro sistema funcione. La board se encarga de enviar la señal a los demás componentes (Motores, sensor de color y buzzer), a medida que avancemos te indicaremos la conexión de la board a cada uno de los componentes. Recuerda que la board va conectada a tui computador por medio de cable USB.
Sensor de color TSC3200¶
Algo importante que debes de saber, es que, la frecuencia entregada por el sensor TCS3200 es mayor cuanta mayor luminosidad se detecte. La matriz de fotodiodos permite promediar el valor medido para compensar diferencias de color en la superficie muestreada así como disponer de filtros de color (en el modelo de color RGB) que, al ir alternando su estado, sirven para distinguir cada componente.
Buzzer¶
El buzzer es un transductor electroacústico que produce un sonido o zumbido continuo o intermitente de un mismo tono (generalmente agudo). En este caso según el color que tu sensor identifique, el buzzer realizara un sonido característico.
Motor NEMA17¶
Debes de tener en cuenta lo siguiente para tus motores NEMA17
• Tamaño: 42 mm x 38 mm cuadrados, sin incluir el eje (NEMA 17)
• Peso: 285g (10 onzas)
• Diámetro: 5 mm
• Pasos por revolución: 200
• Corriente: 1.68A por bobina
• Voltaje: 2.7 V
• Resistencia: 1.65 Ohm por bobina
• Torque: 3.7Kg-cm (51 onzas-in)
• Inductancia: 3.2 mH por bobina
• Longitud del cable: 30.48 cm
Sensor Ultrasonido¶
Este sensor te permite medir distancia por ultrasonido en un rango de 2 a 450 cm. Destaca por su pequeño tamaño, bajo consumo energético, buena precisión y excelente precio. El sensor HC-SR04 es el más utilizado dentro de los sensores de tipo ultrasonido, principalmente por la cantidad de información y proyectos disponibles en la web. De igual forma es el más empleado en proyectos de robótica como robots laberinto o sumo, y en proyectos de automatización como sistemas de medición de nivel o distancia
De esta manera conectaras los componentes a la board.