Códigos
Para realizar el códigos del movimiento del cuerpo, se empleo el siguiente código realizado en el programa MIKRO C y armado con ayuda de una tarjeta Miuva, el código utilizado es el siguiente:
int servos[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int inicio;
void servo_valor(char servo_num,int servo_ang)
{
switch (servo_ang)
{
case 0:
PORTB=servos[servo_num-1];
Delay_us(940);
PORTB=0;
Delay_us(15000);
break;
case 15:
PORTB=servos[servo_num-1];
Delay_us(1300);
PORTB=0;
Delay_us(15000);
break;
case 30:
PORTB=servos[servo_num-1];
Delay_us(1660);
PORTB=0;
Delay_us(15000);
break;
case 45:
PORTB=servos[servo_num-1];
Delay_us(2020);
PORTB=0;
Delay_us(15000);
break;
case 60:
PORTB=servos[servo_num-1];
Delay_us(2380);
PORTB=0;
Delay_us(15000);
break;
case 75:
PORTB=servos[servo_num-1];
Delay_us(2740);
PORTB=0;
Delay_us(15000);
break;
case 80:
PORTB=servos[servo_num-1];
Delay_us(2860);
PORTB=0;
Delay_us(15000);
break;
case 90:
PORTB=servos[servo_num-1];
Delay_us(3100);
PORTB=0;
Delay_us(15000);
break;
case 105:
PORTB=servos[servo_num-1];
Delay_us(3400);
PORTB=0;
Delay_us(15000);
break;
case 120:
PORTB=servos[servo_num-1];
Delay_us(3700);
PORTB=0;
Delay_us(15000);
break;
case 135:
PORTB=servos[servo_num-1];
Delay_us(4000);
PORTB=0;
Delay_us(15000);
break;
case 150:
PORTB=servos[servo_num-1];
Delay_us(4300);
PORTB=0;
Delay_us(15000);
break;
case 165:
PORTB=servos[servo_num-1];
Delay_us(4600);
PORTB=0;
Delay_us(15000);
break;
case 180:
PORTB=servos[servo_num-1];
Delay_us(4900);
PORTB=0;
Delay_us(15000);
break;
}
}
void iniciar_Servos()
{
ADCON1=0x0F;
portb=0;
trisb=0;
porta=0;
trisa=1;
//Asignar Servo
for(inicio=1;inicio<=8;inicio++)
{
servo_valor(inicio,45);
}
}
void main() {
iniciar_Servos();
while(1){
if(PORTA.RA0==1)
{
servo_valor(2,45); //mov0
delay_ms(200);
servo_valor(1,45);
delay_ms(200);
servo_valor(3,90);
delay_ms(200);
servo_valor(4,90);
delay_ms(200);
servo_valor(5,180);
delay_ms(200);
servo_valor(6,0);
delay_ms(200);
servo_valor(1,90); //mov1
delay_ms(200);
servo_valor(2,90);
delay_ms(200);
servo_valor(3,80);
delay_ms(200);
servo_valor(4,180);
delay_ms(200);
servo_valor(5,0);
delay_ms(200);
servo_valor(6,0);
delay_ms(200);
servo_valor(2,45); //mov2
delay_ms(200);
servo_valor(1,45);
delay_ms(200);
servo_valor(3,90);
delay_ms(200);
servo_valor(4,90);
delay_ms(200);
servo_valor(5,0);
delay_ms(200);
servo_valor(6,180);
delay_ms(200);
servo_valor(1,0); //mov3
delay_ms(200);
servo_valor(2,90);
delay_ms(200);
servo_valor(3,80);
delay_ms(200);
servo_valor(4,0);
delay_ms(200);
servo_valor(5,0);
delay_ms(200);
servo_valor(6,180);
delay_ms(200);
}
else
{
servo_valor(1,45);
delay_ms(200);
servo_valor(2,45);
delay_ms(200);
servo_valor(3,90);
delay_ms(200);
servo_valor(4,90);
delay_ms(200);
servo_valor(5,180);
delay_ms(200);
servo_valor(6,0);
delay_ms(200);
}
}
}
Para realizar las velas en el sombrero, se realizó un código en ARDUINO UNO, para accionar leds que simulan la flama de una vela. El código es el siguiente:
#define pinLEDA 5
#define pinLEDB 6
#define pinLEDC 7
#define pinLED1 8
#define pinLED2 9
#define pinLED3 10
#define pinLED4 11
#define pinLED5 4
#define pinLED6 13
void setup() {
pinMode(pinLEDA, OUTPUT);
pinMode(pinLEDB, OUTPUT);
pinMode(pinLEDC, OUTPUT);
pinMode(pinLED1, OUTPUT);
pinMode(pinLED2, OUTPUT);
pinMode(pinLED3, OUTPUT);
pinMode(pinLED4, OUTPUT);
pinMode(pinLED5, OUTPUT);
pinMode(pinLED6, OUTPUT);
}
void loop() {
digitalWrite(pinLEDA, HIGH);
digitalWrite(pinLEDB, HIGH);
digitalWrite(pinLEDC, HIGH);
digitalWrite(pinLED1, LOW); // enciende
digitalWrite(pinLED2, HIGH); // apaga
digitalWrite(pinLED3, HIGH); // apaga
digitalWrite(pinLED4, HIGH); // apaga
digitalWrite(pinLED5, HIGH); // apaga
digitalWrite(pinLED6, HIGH); // apaga
delay(500);
digitalWrite(pinLEDA, HIGH);
digitalWrite(pinLEDB, HIGH);
digitalWrite(pinLEDC, HIGH);
digitalWrite(pinLED1, HIGH);
digitalWrite(pinLED2, LOW);
digitalWrite(pinLED3, HIGH);
digitalWrite(pinLED4, HIGH);
digitalWrite(pinLED5, HIGH);
digitalWrite(pinLED6, HIGH);
delay(500);
digitalWrite(pinLEDA, HIGH);
digitalWrite(pinLEDB, HIGH);
digitalWrite(pinLEDC, HIGH);
digitalWrite(pinLED1, HIGH);
digitalWrite(pinLED2, HIGH);
digitalWrite(pinLED3, LOW);
digitalWrite(pinLED4, HIGH);
digitalWrite(pinLED5, HIGH);
digitalWrite(pinLED6, HIGH);
delay(500);
digitalWrite(pinLEDA, HIGH);
digitalWrite(pinLEDB, HIGH);
digitalWrite(pinLEDC, HIGH);
digitalWrite(pinLED1, HIGH);
digitalWrite(pinLED2, HIGH);
digitalWrite(pinLED3, HIGH);
digitalWrite(pinLED4, LOW);
digitalWrite(pinLED5, HIGH);
digitalWrite(pinLED6, HIGH);
delay(500);
digitalWrite(pinLEDA, HIGH);
digitalWrite(pinLEDB, HIGH);
digitalWrite(pinLEDC, HIGH);
digitalWrite(pinLED1, HIGH);
digitalWrite(pinLED2, HIGH);
digitalWrite(pinLED3, HIGH);
digitalWrite(pinLED4, HIGH);
digitalWrite(pinLED5, LOW);
digitalWrite(pinLED6, HIGH);
delay(500);
digitalWrite(pinLEDA, HIGH);
digitalWrite(pinLEDB, HIGH);
digitalWrite(pinLEDC, HIGH);
digitalWrite(pinLED1, HIGH);
digitalWrite(pinLED2, HIGH);
digitalWrite(pinLED3, HIGH);
digitalWrite(pinLED4, HIGH);
digitalWrite(pinLED5, HIGH);
digitalWrite(pinLED6, LOW);
delay(500);
}
Figura 1. Conexión de los leds en una Protoboard como prueba
Vídeo 1. Simulación de las series de leds
Para la música de ambientación que se aplicó en el piano, se usó el siguiente código:
int saltar=0; // Variable que indica el numero de la secuencia a ejecutarse
void setup() {
pinMode(A0, INPUT); //indicamos el pin de entrada
for(int i=2;i<=9;i++){ //indicamos los pines de salida
pinMode(i, OUTPUT);
}
}
void loop() {
if (digitalRead(A0)==HIGH){ //Al presionar el pulsador
saltar++; // Cambia de secuencia
if (saltar>3){ //Solo hay 4 secuencias 0,1,2 y 3 al ser 3 . .
saltar=0; // Vuelve a secuencia 0
}
while (digitalRead(A0)==HIGH){} // Mientras se pulsa no haga nada mas
}
if(saltar==0){ //Si es 1 inicie funcion de secuencia1
secuencia1();
}
if(saltar==1){ //Si es 2 inicie funcion de secuencia2
secuencia2();
}
if(saltar==2){ //Si es 3 inicie funcion de secuencia3
secuencia3();
}
if(saltar==3){ //Si es 4 inicie funcion de secuencia4
secuencia4();
}
}
void secuencia1(){
for (int i=2; i<=9; i++){ //Pin 2 al 9
digitalWrite(i, HIGH); // Prenda pin actual
digitalWrite(i-1,LOW); // Apage el Anterior
delay(50); // retardo entre prender y apagar
}
for (int i=9; i>=2; i--){ //Al contrario de la
digitalWrite(i, LOW); // anterior secuencia va de 9 a 2
digitalWrite(i-1,HIGH);
delay(50);
}
}
void secuencia2(){
int k=11; // inicializo una variable auxiliar K
for(int i=6; i<=9;i++){ //leo de 6 a 9
digitalWrite(i, HIGH); // prendo pin actual
digitalWrite(k-i, HIGH); // prendo pin de la diferencia 11-6 = 5
delay(50); //retardo
}
for(int i=9; i>=2;i--){ // Al contrario de lo anterior
digitalWrite(i, LOW);
digitalWrite(k-i, LOW);
delay(50);
}
}
void secuencia3(){
for(int i=2; i<=9; i++){
digitalWrite(i,HIGH);
delay(50);
}
for(int i=9; i>=2;i--){
digitalWrite(i,LOW);
delay(50);
}
}
void secuencia4(){
int k=11;
for(int i=2; i<=5;i++){
digitalWrite(i,HIGH);
digitalWrite(k-i,LOW);
}
delay(150);
for(int i=2; i<=5;i++){
digitalWrite(i,LOW);
digitalWrite(k-i,HIGH);
}
delay(150);
}

Comentarios
Publicar un comentario