Primera entrega Alvaro Cortes Nelson Posada Cristian Montero Edison Ahumada

Dependencies:   mbed

Homepage

SISTEMAS EMBEBIDOS PICCOLO PRIMER CORTE

INTRODUCCIÓN

En el siguiente documento se describe el ensamble y programación usada para un robot de tres ejes, que nos brinda la posibilidad de dibujar figuras geométricas en 2D, generando movimientos en los tres ejes de coordenadas X, Y, Z, por medio de servomotores, con ayuda de la plataforma de programación Mbed se da conocer el código creado con la serie de instrucciones para darle los diferentes comandos de movimiento y así hacer posible el dibujo de piezas geométricas.

DESCRIPCIÓN DEL ENSAMBLE

Es un sistema de dibujo por coordenadas, el cual está compuesto por los tres ejes principales Y, X y Z controlados por servomotores, el diseño fue extraído de la página http://piccolo.cc/ y por medio de cortadora láser es envían a cortar sus diferentes partes dichas partes fueron cortadas en acrílico de 3 mm. El sistema de coordenados Z está compuesto por 11 partes que unen el piñón ya ensamblado con el servomotor y una pieza tipo cadenilla donde el piñón Z tendrá un desplazamiento 10 cm. Los servomotores del eje X, Y están ubicados paralelamente, el servomotor en X está 2 cm más arriba que el servomotor en Y esto con el fin de ubicar sus respectivas cadenillas una encima de la otra y no tener problemas de que se vayan a chocar cuando se estén desplazando en sus respectivos ejes.

DESARROLLO. El piccolo para este primer corte tenía como entrega principal, tener la capacidad de dibujar un punto, un cuadrado, un círculo y una línea. Para el desarrollo e implementación de este sistema, nos apoyamos en la plataforma de programación llamado ARM MBED, el cual es un sistema operativo que se programa utilizando el IDE un editor de código en línea y compilador gratuito. La programación empieza llamando la librería mbeb.h y declarando los puertos que vamos a usar, para enviar la señal a nuestro sistema de coordenadas X,Y , Z, como programación adicional se declararon puertos digitales, para cada una de nuestras figuras geométricas esto con el fin de tener acceso a nuestras funciones enviándole una señal digital de 1 para que esta se comience a ejecutar. Enseguida realizamos una regla de 3 para programar nuestras coordenadas en pulsos de 750, después declaramos nuestro void vertex2d, función principal donde se establecen los tres sistemas de coordenadas en float o sistema decimal, después de tener declarada nuestra función vertex2d , implementamos dos void uno para la máxima posición que puede tener el servomotor en número binario de 0 a 255 y un home o posición inicial donde partirá el piccolo a dibujar. Teniendo ya esta estructura comenzamos con las funciones para que realice nuestros respectivas necesidades. Primero el punto es una función fácil donde se declara la posición en x y Y donde vamos a realizar el punto enseguida por la posición en Z bien sea arriba antes de hacer el punto y abajo cuando ya definimos un lugar en nuestro sistema de coordenadas X,Y. La línea funciona básicamente con el mismo principio del punto, se declara un punto de inicio y un punto de fin y dependiendo la línea que se requiera recta o en diagonal se sitúan los puntos X,Y. El cuadrado necesita una variable más llamada longitud la cual nos define el tamaño del cuadrado, esta variable se suma a la posición inicial en la cual queramos que se ubique nuestro piccolo, desplazándose por los ejes X,Y. El circulo funciona por medio con cuatro ciclos for uno para cada cuadrante del circulo es decir para un cuarto de circulo, para poder lograr estos cuatros de círculos, los vamos a realizar con la función del circulo r2=x2+y2, despejando una de las variables en nuestro caso Y utilizamos la función POW, para elevar la función a 1/2, enseguida definimos dos variables i y j para que se operen con las variables X inicial, x final esto con i y con j utilizara la variable final Y2 despejada y operada en la función del círculo, por ultimo unimos los 4 for dependiendo si la posición es positiva o negativa, dibujándolos un círculo con un tamaño designado por el usuario, simplemente modificando el radio.

CODIGO

  1. include "mbed.h"
  2. define MAXPOS 255

PwmOut servoX(PB_3); PwmOut servoY(PB_4); PwmOut servoZ(PB_10);

DigitalIn botoncirculo(PA_0); DigitalIn botonmediocirculo(PA_1); DigitalIn botonpunto(PB_0); DigitalIn botonlinea(PC_1); DigitalIn botoncuadrado(PC_0);

float xvalue, yvalue, xiline,yiline,xfline,yfline; int xisquare, yisquare,lenght,xlado,ylado; double i,j,r;

int coord2pulse(float coord) { if(0 <= coord <= MAXPOS) return int(coord*1000/150+750); return 750; }

void vertex2d(float x, float y, float z){

int pulseX = coord2pulse(x); int pulseY = coord2pulse(y); int pulseZ = coord2pulse(z); servoX.pulsewidth_us(pulseX); servoY.pulsewidth_us(pulseY); servoZ.pulsewidth_us(pulseZ); }

void maxpos() { vertex2d(255,255,255); }

void home() { (255,255,255 ); wait_ms(600); }

void punto() { xvalue = 50; yvalue = 50;

vertex2d(xvalue,yvalue,100); wait_ms(600); vertex2d(xvalue,yvalue,242); wait_ms(600); }

void linea() {

xiline = 250; yiline = 250; xfline = 10; yfline = 10;

vertex2d(xiline,yiline,242); wait_ms(600); vertex2d(xiline,yiline,180); wait_ms(600); vertex2d(xfline,yfline,180); wait_ms(600); }

void cuadrado(){

xisquare = 10; yisquare = 10; lenght = 200;

xlado = lenght + xisquare; ylado = lenght + yisquare;

vertex2d(xisquare,yisquare,242); wait_ms(600); vertex2d(xisquare,yisquare,180); wait_ms(600); vertex2d(xlado,yisquare,180); wait_ms(600); vertex2d(xlado,ylado,180); wait_ms(600); vertex2d(xisquare,ylado,180); wait_ms(600); vertex2d(xisquare,yisquare,180); wait_ms(600); }

void circulo() { double x1=125,x2,y1=125,y2; vertex2d(x1 ,y1,240); wait(2); r=100;

wait_ms(600);

for (x2=0;x2<=r;x2++){ y2= pow(((r*r)-(x2*x2)),0.5); i= x2+x1; j=y1+y2; vertex2d(i ,j,180) ; wait_ms(45); }

for ( x2=r;x2>=0;x2){ y2= pow(((r*r)-(x2*x2)),0.5); i= x2+x1; j= y1 - y2; vertex2d(i ,j,180) ; wait_ms(45); }

for ( x2=0;x2<=r;x2++){ y2= pow(((r*r)-(x2*x2)),0.5); i= x1- x2; j= y1 - y2; vertex2d(i ,j,180) ; wait_ms(45); }

for ( x2=r;x2>=0;x2){ y2= pow(((r*r)-(x2*x2)),0.5); i= x1-x2; j=y1+y2; vertex2d(i ,j,180) ; wait_ms(45); }

vertex2d(i ,j,240) ; wait_ms(600);

if(x2==r) { home(); wait(1); }

} void medio(){ double x1=125,x2,y1=0,y2; vertex2d(x1 ,y1,240); wait(2); r=100;

wait_ms(600);

for (x2=0;x2<=r;x2++){ y2= pow(((r*r)-(x2*x2)),0.5); i= x2+x1; j= y1+y2; vertex2d(i ,j,180) ; wait_ms(60); }

for (x2=r;x2>=0;x2){ y2= pow(((r*r)-(x2*x2)),0.5); i= x2+x1; j= y1 - y2; vertex2d(i ,j,180) ; wait_ms(45); }}

void mediocirculo()

{ double x1=125,x2,y1=0,y2; vertex2d(x1 ,y1,240); wait(2); r=100;

wait_ms(600);

for (x2=0;x2<=r;x2++){ y2= pow(((r*r)-(x2*x2)),0.5); i= x2+x1; j= y1+y2; vertex2d(i ,j,180) ; wait_ms(60); }

for (x2=r;x2>=0;x2){ y2= pow(((r*r)-(x2*x2)),0.5); i= x2+x1; j= y1 - y2; vertex2d(i ,j,180) ; wait_ms(45); }

vertex2d(i ,j,240) ; wait_ms(600);

if(x2==r) { home(); wait(1); }

}

int main() {

while(1) {

configurar periodo servoX.period_ms(20); servoY.period_ms(20); servoZ.period_ms(20);

home(); wait(1);

if (botonpunto == 1) { punto(); wait(1); }

if (botonlinea == 1) {

linea(); wait(1); }

if (botoncuadrado == 1) { cuadrado(); wait(1); }

if (botoncirculo == 1) { circulo(); wait(1); } if (botonmediocirculo == 1) { mediocirculo(); wait(1); } medio ();

} }

Conclusiones

Por medio de la plataforma de programación Mbed logramos plasmar un código en un núcleo STM32F446 que nos proporcionó una alternativa flexible para desarrollar las diferentes líneas de código necesarias en las diferentes figuras realizadas. Gracias a la serie de instrucciones matemáticas que logramos aplicar en el código y plasmándolas en el sistema de coordenadas creamos variables las cuales se modifican a nuestro antojo según el requerimiento de la figura. Con la ayuda de los pulsos generados por las diferentes líneas del código y enviadas luego a los servomotores, modelamos los diferentes movientes en los tres ejes de coordenadas.

BIBLIOGRAFIA

https://github.com/DiatomStudio/Piccolo/wiki/Piccolo-Assembly-Instructions http://piccolo.cc/ https://os.mbed.com/compiler/#nav:/Piccoloprimercorte/main.cpp;


All wikipages