Primera entrega Alvaro Cortes Nelson Posada Cristian Montero Edison Ahumada

Dependencies:   mbed

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;

Committer:
Edisonap
Date:
Sat Sep 09 12:39:55 2017 +0000
Revision:
0:61aa07cffde9
Proyecto primer Corte ; Edison Ahumada; Alvaro Cortes ; Cristian Montero; Nelson Posada

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Edisonap 0:61aa07cffde9 1 #include "mbed.h"
Edisonap 0:61aa07cffde9 2 #define MAXPOS 255
Edisonap 0:61aa07cffde9 3
Edisonap 0:61aa07cffde9 4 PwmOut servoX(PB_3);
Edisonap 0:61aa07cffde9 5 PwmOut servoY(PB_4);
Edisonap 0:61aa07cffde9 6 PwmOut servoZ(PB_5);
Edisonap 0:61aa07cffde9 7 DigitalIn botonpunto(PB_0);
Edisonap 0:61aa07cffde9 8 DigitalIn botonlinea(PC_1);
Edisonap 0:61aa07cffde9 9 DigitalIn botoncuadrado(PC_0);
Edisonap 0:61aa07cffde9 10 float xvalue, yvalue, xiline,yiline,xfline,yfline;
Edisonap 0:61aa07cffde9 11 int xisquare, yisquare,lenght,xlado,ylado;
Edisonap 0:61aa07cffde9 12
Edisonap 0:61aa07cffde9 13
Edisonap 0:61aa07cffde9 14 int coord2pulse(float coord)
Edisonap 0:61aa07cffde9 15 {
Edisonap 0:61aa07cffde9 16 if(0 <= coord <= MAXPOS)
Edisonap 0:61aa07cffde9 17 return int(coord*1000/150+750);
Edisonap 0:61aa07cffde9 18 return 750;
Edisonap 0:61aa07cffde9 19 }
Edisonap 0:61aa07cffde9 20
Edisonap 0:61aa07cffde9 21
Edisonap 0:61aa07cffde9 22 void vertex2d(float x, float y, float z){
Edisonap 0:61aa07cffde9 23
Edisonap 0:61aa07cffde9 24 int pulseX = coord2pulse(x);
Edisonap 0:61aa07cffde9 25 int pulseY = coord2pulse(y);
Edisonap 0:61aa07cffde9 26 int pulseZ = coord2pulse(z);
Edisonap 0:61aa07cffde9 27 servoX.pulsewidth_us(pulseX);
Edisonap 0:61aa07cffde9 28 servoY.pulsewidth_us(pulseY);
Edisonap 0:61aa07cffde9 29 servoZ.pulsewidth_us(pulseZ);
Edisonap 0:61aa07cffde9 30 }
Edisonap 0:61aa07cffde9 31
Edisonap 0:61aa07cffde9 32
Edisonap 0:61aa07cffde9 33 void maxpos()
Edisonap 0:61aa07cffde9 34 {
Edisonap 0:61aa07cffde9 35 vertex2d(255 ,255,255);
Edisonap 0:61aa07cffde9 36 }
Edisonap 0:61aa07cffde9 37
Edisonap 0:61aa07cffde9 38 void home()
Edisonap 0:61aa07cffde9 39 {
Edisonap 0:61aa07cffde9 40 vertex2d(255,255,242);
Edisonap 0:61aa07cffde9 41 wait_ms(600);
Edisonap 0:61aa07cffde9 42 }
Edisonap 0:61aa07cffde9 43
Edisonap 0:61aa07cffde9 44 void punto()
Edisonap 0:61aa07cffde9 45 {
Edisonap 0:61aa07cffde9 46 xvalue = 100;
Edisonap 0:61aa07cffde9 47 yvalue = 100;
Edisonap 0:61aa07cffde9 48
Edisonap 0:61aa07cffde9 49 vertex2d(xvalue,yvalue,242);
Edisonap 0:61aa07cffde9 50 wait_ms(600);
Edisonap 0:61aa07cffde9 51 vertex2d(xvalue,yvalue,180);
Edisonap 0:61aa07cffde9 52 wait_ms(600);
Edisonap 0:61aa07cffde9 53 }
Edisonap 0:61aa07cffde9 54
Edisonap 0:61aa07cffde9 55 void linea()
Edisonap 0:61aa07cffde9 56 {
Edisonap 0:61aa07cffde9 57
Edisonap 0:61aa07cffde9 58 xiline = 250;
Edisonap 0:61aa07cffde9 59 yiline = 250;
Edisonap 0:61aa07cffde9 60 xfline = 10;
Edisonap 0:61aa07cffde9 61 yfline = 10;
Edisonap 0:61aa07cffde9 62
Edisonap 0:61aa07cffde9 63 vertex2d(xiline,yiline,242);
Edisonap 0:61aa07cffde9 64 wait_ms(600);
Edisonap 0:61aa07cffde9 65 vertex2d(xiline,yiline,180);
Edisonap 0:61aa07cffde9 66 wait_ms(600);
Edisonap 0:61aa07cffde9 67 vertex2d(xfline,yfline,180);
Edisonap 0:61aa07cffde9 68 wait_ms(600);
Edisonap 0:61aa07cffde9 69 }
Edisonap 0:61aa07cffde9 70
Edisonap 0:61aa07cffde9 71 void cuadrado(){
Edisonap 0:61aa07cffde9 72
Edisonap 0:61aa07cffde9 73 xisquare = 10;
Edisonap 0:61aa07cffde9 74 yisquare = 10;
Edisonap 0:61aa07cffde9 75 lenght = 200;
Edisonap 0:61aa07cffde9 76
Edisonap 0:61aa07cffde9 77
Edisonap 0:61aa07cffde9 78 xlado = lenght + xisquare;
Edisonap 0:61aa07cffde9 79 ylado = lenght + yisquare;
Edisonap 0:61aa07cffde9 80
Edisonap 0:61aa07cffde9 81 vertex2d(xisquare,yisquare,242);
Edisonap 0:61aa07cffde9 82 wait_ms(600);
Edisonap 0:61aa07cffde9 83 vertex2d(xisquare,yisquare,180);
Edisonap 0:61aa07cffde9 84 wait_ms(600);
Edisonap 0:61aa07cffde9 85 vertex2d(xlado,yisquare,180);
Edisonap 0:61aa07cffde9 86 wait_ms(600);
Edisonap 0:61aa07cffde9 87 vertex2d(xlado,ylado,180);
Edisonap 0:61aa07cffde9 88 wait_ms(600);
Edisonap 0:61aa07cffde9 89 vertex2d(xisquare,ylado,180);
Edisonap 0:61aa07cffde9 90 wait_ms(600);
Edisonap 0:61aa07cffde9 91 vertex2d(xisquare,yisquare,180);
Edisonap 0:61aa07cffde9 92 wait_ms(600);
Edisonap 0:61aa07cffde9 93 }
Edisonap 0:61aa07cffde9 94
Edisonap 0:61aa07cffde9 95 //void circle(){
Edisonap 0:61aa07cffde9 96
Edisonap 0:61aa07cffde9 97 // for(
Edisonap 0:61aa07cffde9 98
Edisonap 0:61aa07cffde9 99
Edisonap 0:61aa07cffde9 100 int main() {
Edisonap 0:61aa07cffde9 101
Edisonap 0:61aa07cffde9 102 while(1) {
Edisonap 0:61aa07cffde9 103
Edisonap 0:61aa07cffde9 104 // configurar periodo
Edisonap 0:61aa07cffde9 105 servoX.period_ms(20);
Edisonap 0:61aa07cffde9 106 servoY.period_ms(20);
Edisonap 0:61aa07cffde9 107 servoZ.period_ms(20);
Edisonap 0:61aa07cffde9 108
Edisonap 0:61aa07cffde9 109 home();
Edisonap 0:61aa07cffde9 110 wait(1);
Edisonap 0:61aa07cffde9 111
Edisonap 0:61aa07cffde9 112 if (botonpunto == 1) {
Edisonap 0:61aa07cffde9 113 punto();
Edisonap 0:61aa07cffde9 114 wait(1);
Edisonap 0:61aa07cffde9 115 }
Edisonap 0:61aa07cffde9 116
Edisonap 0:61aa07cffde9 117 if (botonlinea == 1) {
Edisonap 0:61aa07cffde9 118
Edisonap 0:61aa07cffde9 119 linea();
Edisonap 0:61aa07cffde9 120 wait(1);
Edisonap 0:61aa07cffde9 121 }
Edisonap 0:61aa07cffde9 122
Edisonap 0:61aa07cffde9 123 if (botoncuadrado == 1) {
Edisonap 0:61aa07cffde9 124 cuadrado();
Edisonap 0:61aa07cffde9 125 wait(1);
Edisonap 0:61aa07cffde9 126 }
Edisonap 0:61aa07cffde9 127
Edisonap 0:61aa07cffde9 128 }
Edisonap 0:61aa07cffde9 129 }