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.
You are viewing an older revision! See the latest version
Homepage
PRIMER CORTE - SISTEMAS EMBEBIDOS. Universidad ECCI
DISEÑO Y PROGRAMACION DE UN PICCOLO¶
Piccolo es un CNC portable que nos sirve para dibujar en 2D, formas o figuras que le pidamos, trabaja en base a movimientos de 3 servo motores que nos permiten realizar el dibujo por medio de una herramienta de dibujo, esta puede ser un lápiz, marcador, bolígrafo, etc.
PROGRAMACION PICCOLO¶
main.cpp
#include "mbed.h"
#define POSMAX 50 // en milimetros
#define POSDRAW 30 // en milimetros
#define BAUD 9600 // Configuracion de baudios
#define MEM_SIZE 10
#define MEM_TYPE uint32_t
#define CM_EJECUTAR 0xff
#define CM_GUARDAR 0xfe
#define CM_VERTEX2D 0xfd
#define CM_DRAW 0xfc
#define CM_NODRAW 0xfb
#define CM_STOP 0xfa
#define CM_END 0xf0
PwmOut ServoX(PB_3); //D3
PwmOut ServoY(PB_4); //D5
PwmOut ServoZ(PB_10); //D6
MEM_TYPE buffer[MEM_SIZE];
Serial pc(USBTX,USBRX); // Comunicación Serial
uint8_t posx_old=0; // posición anterior del eje X
uint8_t posy_old=0; // posición anterior del eje Y
uint8_t ss_time=100; // tiempo de espera para moverse 1 mm en microsegundos
int mem_head;
int mem_tail;
uint8_t full;
uint8_t mem_put(MEM_TYPE data)
{
if (full)
return 1;
buffer[mem_head] = data;
mem_head += 1;
if (mem_head == MEM_SIZE)
full =1;
return 0;
}
uint8_t mem_get(MEM_TYPE* data)
{
if (mem_head == 0)
return 1;
if (mem_head == mem_tail)
return 1;
*data = buffer[mem_tail];
mem_tail += 1;
return 0;
}
void mem_free()
{
mem_head=0;
full=0;
}
void sstime(uint8_t x, uint8_t y)
{
double dx=abs(x-posx_old);
double dy=abs(y-posy_old);
double dist= sqrt(dx*dx+dy*dy);
wait_ms((int)(ss_time*dist));
posx_old = x;
posy_old= y;
}
int coord2pulse(float coord) // conversión de coordenadas en X y Y
{
if(0 <= coord <= POSMAX)
return int(700+coord*1900/50);
return 700;
}
void vertex2d(uint8_t x, uint8_t y) // Funcion de llamado de conversiones X y Y
{
int pulseX = coord2pulse(x);
int pulseY = coord2pulse(y);
ServoX.pulsewidth_us(pulseX);
ServoY.pulsewidth_us(pulseY);
sstime(x,y);
wait_ms(ss_time);
}
void draw() // Función para enviarle la posicion de dibujo a Z, lo mueve hacia abajo.
{
int pulseZ=coord2pulse(POSDRAW);
ServoZ.pulsewidth_us(pulseZ);
pc.printf(" Dibujando...");
wait_ms(ss_time*2);
}
void nodraw() // Función para enviarle la posicion de no dibujar a Z, lo mueve hacia arriba.
{
int pulseZ=coord2pulse(0);
ServoZ.pulsewidth_us(pulseZ);
pc.printf(" Dibujo Terminado...");
wait_ms(ss_time*2);
}
void ejecutar(){
pc.printf("se esta ejecutando el dibujo...");
// ubicar acà el codigo
}
void guardar(){
pc.printf("se inicia el comado de guardar..");
// ubicar acà el codigo
}
void init_serial() // configuracion de baudios a pc
{
pc.baud(BAUD);
}
void init_servos() // configuracion de periodo
{
ServoX.period_ms(20);
ServoY.period_ms(20);
ServoZ.period_ms(20);
}
void init_draw(float x, float y)
{
vertex2d (x,y);
wait_ms(ss_time);
draw();
}
void home()
{
nodraw();
vertex2d(0,0);
pc.printf("Posicion Home");
wait_ms(ss_time);
}
void put_sstime(uint8_t vtime)
{
ss_time=vtime;
}
int main() {
init_servos();
init_serial();
int posx=0;
int posy=0;
draw();
while(1)
{
wait(1);
vertex2d(posx,posy);
posx+=5;
posy+=5;
if (posx > POSMAX and posy > POSMAX)
{
posx=0;
posy=0;
nodraw();
}
}
}
Pablo Lopez - Felipe Gomez - Steev Blanco