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.
Fork of 01-04EntregaPrimerCorte by
Revision 0:89b318e49395, committed 2018-03-17
- Comitter:
- fabeltranm
- Date:
- Sat Mar 17 00:57:56 2018 +0000
- Child:
- 1:4aaa6fd6956a
- Commit message:
- ok codigo
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/draw.cpp Sat Mar 17 00:57:56 2018 +0000
@@ -0,0 +1,81 @@
+
+#include "draw.h"
+#include "mbed.h"
+#include "math.h"
+
+
+PwmOut myServoZ(PB_3);
+PwmOut myServoX(PB_4);
+PwmOut myServoY(PB_5);
+
+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=50; // tiempo de espera para moverse 1 mm en microsegundos
+
+void put_sstime(uint8_t vtime){
+ ss_time=vtime;
+
+}
+
+int coord2us(float coord)
+{
+ if(0 <= coord <= MAXPOS)
+ return int(750+coord*1900/50);// u6
+ return 750;
+
+}
+
+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;
+
+ }
+
+void draw(){
+myServoZ.pulsewidth_us(coord2us(POSDRAW));
+wait_ms(ss_time*10);
+}
+
+void nodraw(){
+myServoZ.pulsewidth_us(coord2us(POSNODRAW));
+wait_ms(ss_time*10);
+}
+
+
+void vertex2d(uint8_t x, uint8_t y){
+
+ int pulseX = coord2us(x);
+ int pulseY = coord2us(y);
+
+ myServoX.pulsewidth_us(pulseX);
+ myServoY.pulsewidth_us(pulseY);
+
+ sstime(x,y);
+
+}
+
+void initdraw(float x, float y){
+ vertex2d (x,y);
+ draw();
+}
+
+void home(){
+ nodraw();
+ vertex2d(0 ,0);
+}
+
+
+
+void init_servo()
+{
+ myServoX.period_ms(20);
+ myServoY.period_ms(20);
+ myServoZ.period_ms(20);
+
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/draw.h Sat Mar 17 00:57:56 2018 +0000 @@ -0,0 +1,20 @@ +#ifndef DRAW_H +#define DRAW_H + +#include "mbed.h" + +#define MAXPOS 50 // en milimetros +#define POSDRAW 50 +#define POSNODRAW 10 + + +void init_servo(); +void draw(); +void nodraw(); +void vertex2d(uint8_t x, uint8_t y); + +void home(); +void initdraw(float x, float y); +void put_sstime(uint8_t vtime); + +#endif // DRAW_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sat Mar 17 00:57:56 2018 +0000
@@ -0,0 +1,137 @@
+#include "mbed.h"
+
+#include "main.h"
+
+
+
+/*
+El sitema tiene tres estados:
+1. Standby: estado que indica que esta en espera de un telecomando (Ejecutar 0 guardar)
+2. Drawing: estado en donde el piccolo eejecuta las ordenes giardadas en el array
+ de memora hasta encontrar el comando CM_STOP
+3. Saving: estado donde el sistema recibe lso datos y lso almacena en memoria acorde
+ a los comandos de 0xfd, oxfc, 0xfb,0cfa, se sake de este modo cuado se recibe
+ el comando CM_STOP
+
+todo telecomando debe finalizar con el dato CM_END
+*/
+
+
+Serial command(USBTX, USBRX);
+
+
+
+int main() {
+ init_servo();
+ init_serial();
+ draw();
+ nodraw();
+ home();
+ debug_m("inicio \n");
+ uint32_t read_cc;
+ while(1)
+ {
+ read_cc=read_command();
+ switch (read_cc) {
+ case CM_DRAWING: drawing(); break;
+ case CM_SAVING: saving(); break;
+ default: debug_m("error de comando. \nSe espera 0xFEF0 o 0xFFF0 \n");break ;
+ }
+ }
+}
+
+
+
+uint32_t read_command()
+{
+ // retorna los byte recibidos concatenados en un entero, se reciben maximo 4 bytes,
+ // recibe hasta que encuetra un fin de comando "CM_END".
+ // Ejemplo: para el comando drawing se
+ // espera un byte, por lo que al recibir 0xFF y 0xF0 la funcióm retorna el 0xff
+ // siempre y cuando se reciba el fin de dato F0 de lo contrario retorna un cero
+ // para el caso del comando vertex2d se espera recibir 3 bytes, 1 del comando
+ // y dos bytes para x y y, se retorna la concatenación de los tres bytes siempre y
+ // cuando el cuarto byte sea CM_END de lo contrario retorna un cero
+
+ uint32_t val=0;
+ uint8_t cnt=0;
+
+ char endc=command.getc();
+
+ while(endc != CM_END && cnt <4) {
+ if(endc!=CM_END)
+ val=((val<<8) +endc);
+ endc=command.getc();
+ cnt++;
+ }
+ if(endc==CM_END)
+ return val;
+ return 0; //al retornar 0 indica que no se recibe el comando
+}
+void init_serial()
+{
+ command.baud(9600);
+}
+
+
+void drawing(){
+ // la funcion se ejecuta siemrpe y cuando exista datos validos para leer de
+ // memoria
+ debug_m("se esta ejecutando el dibujo... \n");
+
+ uint8_t error=0;
+ MEM_TYPE dato;
+
+ tail_reset();
+
+ while(error==0){
+ error = mem_get(&dato);
+ if (error==0) {
+ switch (dato) {
+ case CM_DRAW:
+ debug_m("-> Baja Z\n");
+ draw();
+ break ;
+ case CM_NODRAW:
+ debug_m("-> Sube Z\n");
+ nodraw();
+ break ;
+ default:
+ int y = (uint8_t)(dato);
+ int x = (uint8_t)(dato>>8);
+ char ncomm = (uint8_t)(dato>>16);
+
+ if (ncomm == CM_VERTEX2D) {
+ debug_m("-> Mover piccolo x a %d y y a %d \n",x,x, y);
+ vertex2d(x,y);
+ }else
+ debug_m("-> ERROR DE COMMANDO: %d %d %d \n " ,ncomm,x,y,y);
+ break;
+ }
+ }
+ }
+
+ debug_m("fin del comando dibujar..\n");
+
+}
+
+
+void saving(){
+ debug_m("se inicia el comado guardar..\n");
+
+ MEM_TYPE dato=0;
+ mem_free();
+ while(dato !=CM_STOP){
+ dato = read_command();
+ if (dato !=CM_STOP)
+ mem_put(dato);
+ }
+ debug_m("fin del comado guardar..\n");
+
+}
+
+void debug_m(char *s , ... ){
+ #if DEBUG
+ command.printf(s);
+ #endif
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Sat Mar 17 00:57:56 2018 +0000 @@ -0,0 +1,59 @@ +#ifndef MAIN_H +#define MAIN_H + + +#include "draw.h" +#include "memory.h" +//****************************************************************************** +// Desarrollado por ferney beltran fbeltran@ecci.edu.co +//****************************************************************************** + +//***************************************************************************** +// COMANDOS +// |POS_0|POS_1|POS_2| POS_3 | +// | #C | a | b | c | +// +// #C -> Indica el comando FF, FE, ... +// a -> es el fin de comando F0 en otros casos es el valor de la coord X +//b -> Coordenada Y +// c -> fin de comando F0 + +// Nota: El fin de comando no se almacena +//****************************************************************************** + +/* +prueba 1 +ff f0 + +prueba 2 +fe f0 fd 00 00 f0 fc f0 fd 00 32 f0 fd 32 32 f0 fd 32 00 f0 fd 00 00 f0 fb f0 fa f0 +ff f0 + +prueba 3 +fe f0 fd 00 00 f0 fc f0 fd 00 0A f0 fd 32 0A f0 fd 32 14 f0 fd 00 14 f0 fd 00 1E f0 fd 32 1E f0 fd 32 28 f0 fd 00 28 f0 fa f0 +ff f0 + + + +*/ + +#define DEBUG 1 + + +void debug_m(char *s , ... ); +uint32_t read_command(); +void init_serial(); +void drawing(); +void saving(); + + +/********************* PARAMETROS PARA DEFINIR EL COMMANDO ******************/ +#define CM_DRAWING 0xff +#define CM_SAVING 0xfe +#define CM_VERTEX2D 0xfd +#define CM_DRAW 0xfc +#define CM_NODRAW 0xfb +#define CM_STOP 0xfa +#define CM_END 0xf0 + +#endif // MAIN_H \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Mar 17 00:57:56 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/aa5281ff4a02 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/memory.cpp Sat Mar 17 00:57:56 2018 +0000
@@ -0,0 +1,46 @@
+#include "mbed.h"
+#include "memory.h"
+
+int mem_head = 0;
+int mem_tail = 0;
+uint8_t full = 0;
+
+MEM_TYPE buffer[MEM_SIZE];
+
+void tail_reset()
+{
+ mem_tail=0;
+}
+
+void mem_free()
+{
+ mem_head=0;
+ full=0;
+}
+
+
+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;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/memory.h Sat Mar 17 00:57:56 2018 +0000 @@ -0,0 +1,18 @@ +#ifndef MEMORY_ARRAY_H +#define MEMORY_ARRAY_H + +#include "mbed.h" + +#define MEM_SIZE 10 +#define MEM_TYPE uint32_t + + + +void tail_reset(); +void mem_free(); +uint8_t mem_put(MEM_TYPE data); +uint8_t mem_get(MEM_TYPE* data); + + + +#endif // MEMORY_H \ No newline at end of file
