Académique Documents
Professionnel Documents
Culture Documents
###############################################
###############################################
####################################
// #
LIBRERIAS
#
//
###############################################
###############################################
####################################
#include <stdlib.h> // Funciones para gestin de memoria dinmica, control
de procesos y otras
#include <Servo.h> // Funciones predefinidas para trabajar con servos
//
###############################################
###############################################
####################################
// #
DECLARACIONES
#
//
###############################################
###############################################
####################################
//#define CALIBRACION // Para calibrar el robot
//
###############################################
###############################################
####################################
// #
FUNCIONES
#
//
###############################################
###############################################
####################################
void setup(){
servoElevador.attach(SERVOELEVADORPIN); // Asocia el servo al pin 5
servoIzquierdo.attach(SERVOIZQUIERDOPIN); // Asocia el servo al pin 6
servoDerecho.attach(SERVODERECHOPIN); // Asocia el servo al pin 7
ir_a(75.2, 47);
moverElevador(1);
delay(1000); // Esperamos un poco
}
void loop() {
if (servoElevador.attached() && servoIzquierdo.attached() &&
servoDerecho.attached()) { // Comprobamos que los SERVOS esten asociados a
los PINES
#ifdef CALIBRACION
calibrar(); // LLamada a la funcion de calibracion
#else
escribirPalabra(); // Llamada a la funcion que escribe la palabra
#endif
} else {
printf("\nERROR: Al menos un servomotor no esta conectado. \n");
}
// Desactivamos los servos
servoElevador.detach();
servoIzquierdo.detach();
servoDerecho.detach();
}
void escribirPalabra() {
int posicionCaracter; // Posicion que ocupa el caracter dentro de la
palabra
int coordY; // Varia dependiendo de la posicion de la letra, debido a que las
ultimas tienen una desviacion que hay que corregir mediante software
for (posicionCaracter = 0 ; posicionCaracter < palabra.length() ;
posicionCaracter++) {
if(posicionCaracter<4){
coordY = 25;
}else{
coordY = 28;
}
escribirCaracter(coordX, coordY, palabra[posicionCaracter], escala); //
Llamada a la funcion que dibuja la letra
coordX+=10; // La siguiente letra debe escribirse en la siguiente
posicion
}
}
void calibrar() {
// Esta funcion se utiliza para calibrar los brazos del robot.
// Los brazos de los servos tienen que tener 90 grados entre los movimientos
que hacemos
ir_a(-3, 29.2);
delay(500);
ir_a(74.1, 28);
delay(500);
}
MAX 20
|
|
|
|
|
15
|
|
|
|
|
10
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------- EJE X
(0,0)
12 MAX
*/
// Las letras se empiezan en el 2 porque sino al dibujarlas se solapararian
switch (letra) {
case 'A':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 7 * escala, coordY + 20 * escala);
ir_a(coordX + 12 * escala, coordY + 0 * escala);
moverElevador(1);
ir_a(coordX + 4 * escala, coordY + 5 * escala);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 5 * escala);
moverElevador(1);
break;
case 'B':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
ir_a(coordX + 12 * escala, coordY + 15 * escala);
ir_a(coordX + 2 * escala, coordY + 10 * escala);
ir_a(coordX + 12 * escala, coordY + 5 * escala);
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(1);
break;
case 'C':
ir_a(coordX + 12 * escala, coordY + 15 * escala);
moverElevador(0);
ir_a(coordX + 7 * escala, coordY + 20 * escala);
ir_a(coordX + 2 * escala, coordY + 15 * escala);
ir_a(coordX + 2 * escala, coordY + 5 * escala);
ir_a(coordX + 7 * escala, coordY + 0 * escala);
ir_a(coordX + 12 * escala, coordY + 5 * escala);
moverElevador(1);
break;
case 'D':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 12 * escala);
ir_a(coordX + 10 * escala, coordY + 8 * escala);
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(1);
break;
case 'E':
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 0 * escala);
moverElevador(1);
ir_a(coordX + 1 * escala, coordY + 10 * escala);
moverElevador(0);
ir_a(coordX + 8 * escala, coordY + 10 * escala);
moverElevador(1);
break;
case 'F':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(1);
ir_a(coordX + 2 * escala, coordY + 12 * escala);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 12 * escala);
moverElevador(1);
break;
case 'G':
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
case 'H':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 0 * escala);
moverElevador(1);
ir_a(coordX + 12 * escala, coordY + 10 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 10 * escala);
moverElevador(1);
break;
case 'I':
ir_a(coordX + 3 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 11 * escala, coordY + 0 * escala);
moverElevador(1);
ir_a(coordX + 7 * escala, coordY + 0 * escala);
moverElevador(0);
case 'J':
ir_a(coordX + 2 * escala, coordY + 8 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 0 * escala);
ir_a(coordX + 8 * escala, coordY + 0 * escala);
ir_a(coordX + 8 * escala, coordY + 20 * escala);
moverElevador(1);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
break;
case 'K':
ir_a(coordX + 10+ escala, coordY + 18 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 10 * escala);
ir_a(coordX + 10 * escala, coordY + 2 * escala);
moverElevador(1);
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
break;
case 'L':
ir_a(coordX + 12 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
break;
case 'M':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
ir_a(coordX + 7 * escala, coordY + 10 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
ir_a(coordX + 12 * escala, coordY + 0 * escala);
moverElevador(1);
break;
case 'N':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 0 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 20 * escala);
moverElevador(1);
break;
case 'O':
ir_a(coordX + 2 * escala, coordY + 5 * escala);
moverElevador(0);
ir_a(coordX + 4 * escala, coordY + 0 * escala);
ir_a(coordX + 10 * escala, coordY + 0 * escala);
ir_a(coordX + 12 * escala, coordY + 5 * escala);
ir_a(coordX + 12 * escala, coordY + 15 * escala);
ir_a(coordX + 10 * escala, coordY + 20 * escala);
ir_a(coordX + 4 * escala, coordY + 20 * escala);
ir_a(coordX + 2 * escala, coordY + 15 * escala);
ir_a(coordX + 2 * escala, coordY + 5 * escala);
moverElevador(1);
break;
case 'P':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
ir_a(coordX + 12 * escala, coordY + 14 * escala);
case 'Q':
ir_a(coordX + 2 * escala, coordY + 8 * escala);
moverElevador(0);
ir_a(coordX + 5 * escala, coordY + 3 * escala);
ir_a(coordX + 10 * escala, coordY + 3 * escala);
ir_a(coordX + 12 * escala, coordY + 8 * escala);
ir_a(coordX + 12 * escala, coordY + 18 * escala);
ir_a(coordX + 10 * escala, coordY + 20 * escala);
ir_a(coordX + 5 * escala, coordY + 20 * escala);
ir_a(coordX + 2 * escala, coordY + 18 * escala);
ir_a(coordX + 2 * escala, coordY + 8 * escala);
moverElevador(1);
ir_a(coordX + 7 * escala, coordY + 10 * escala);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 0 * escala);
moverElevador(1);
break;
case 'R':
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
ir_a(coordX + 12 * escala, coordY + 14 * escala);
case 'S':
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
ir_a(coordX + 2 * escala, coordY + 10 * escala);
ir_a(coordX + 12 * escala, coordY + 10 * escala);
ir_a(coordX + 12 * escala, coordY + 0 * escala);
ir_a(coordX + 2 * escala, coordY + 0 * escala);
moverElevador(1);
break;
case 'T':
ir_a(coordX + 7 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 7 * escala, coordY + 20 * escala);
moverElevador(1);
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(1);
break;
case 'U':
case 'V':
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 6 * escala, coordY + 0 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(1);
break;
case 'W':
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 4 * escala, coordY + 0 * escala);
ir_a(coordX + 7 * escala, coordY + 10 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 0 * escala);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(1);
break;
case 'X':
ir_a(coordX + 4 * escala, coordY + 0 * escala);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 20 * escala);
moverElevador(1);
ir_a(coordX + 4 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 10 * escala, coordY + 0 * escala);
moverElevador(1);
break;
case 'Y':
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(0);
ir_a(coordX + 7 * escala, coordY + 10 * escala);
moverElevador(1);
moverElevador(0);
ir_a(coordX + 12 * escala, coordY + 20 * escala);
moverElevador(1);
ir_a(coordX + 7 * escala, coordY + 10 * escala);
moverElevador(0);
ir_a(coordX + 7 * escala, coordY + 0 * escala);
moverElevador(1);
break;
case 'Z':
ir_a(coordX + 2 * escala, coordY + 20 * escala);
moverElevador(0);
switch (senial) {
case 0: // Escribir
if (posElevador >= DESACTIVARELEVADOR) {
while (posElevador >= DESACTIVARELEVADOR) {
posElevador--;
servoElevador.writeMicroseconds(posElevador);
delayMicroseconds(VELOCIDADELEVADOR);
}
} else {
while (posElevador <= DESACTIVARELEVADOR) {
posElevador++;
servoElevador.writeMicroseconds(posElevador);
delayMicroseconds(VELOCIDADELEVADOR);
}
}
break;
if (r < 1)
r = 1;
int i;
for (i = 0; i <= r; i++) {
// Dibujamos la linea punto a punto hasta la distancia calculada
generarMovimientosParaEscribirEn(ultimaX + (i * distanciaX / r), ultimaY
+ (i * distanciaY / r));
}
// Actualizamos la variable que guarda la ultima posicion escrita
ultimaX = posicionX;
ultimaY = posicionY;
}