domingo, 16 de junio de 2019

LABORATORIO NRO.16

LABORATORIO NRO.15

 


MÚSICA CON ARDUINO



1. COMPETENCIA ESPECIFICA DE LA SESIÓN

  • Programación de Tonos musicales. 
  • Creación de nuevos bloques.

2. MARCO TEÓRICO 

2.1 TEORÍA MUSICAL

¿Cómo funciona el cifrado americano?

Es realmente muy sencillo de comprender, veamos una comparación de las notas del piano con cifrado americano 

 

Ejemplo de cifrado americano y las notas del piano 

Escala de Do 

Nomenclatura latina: Do Re Mi Fa Sol La Si Do


Cifrado Americano: C D E F G A B C 

Como vemos, a cada nota se le asigna una letra. Una vez realizada la comparación, es fácil notar que el cifrado americano simplemente comienza por la nota de La (A). 
Cifrado americano

A  B  C  D  E  F  G

La Si Do Re Mi Fa Sol

 
Vamos a hacer uso de la instrucción tone cuyos argumentos son el pin de salida al cual tenemos conectado el zumbador, la frecuencia de la señal que vamos a generar y que es la que variará la nota y la duración en milisegundos (opcional). Con varias instrucciones tone podremos hacer música con Arduino. 
tone(pin, frecuencia)
tone(pin, frecuencia, tiempo) 
El pin de salida debe ser de tipo PWM ya que debemos poder variar su frecuencia. En Arduino Uno, Mini y Nano podrán ser 3, 5, 6, 9, 10 y 11
La frecuencia adecuada para cada nota la tenéis en una tabla al final del tutorial. 
 
El tiempo es la duración de la nota. Cada figura tendrá un tiempo determinado por el tiempo de la negra (t),de tal manera que una blanca durará doble que una negra y una corchea la mitad. La relación de los tiempos de las figuras es fija, pero el tempo lo vamos a marcar nosotros. Si no declaramos el tiempo en la instrucción tone deberemos hacer un delay con la duración y utilizar la instrución noTone posteriormente.
Por ejemplo si establecemos que una negra sea 1 segundo nos quedaría lo siguiente: 
 


Utilizaremos la instrucción noTone si no indicamos un tiempo en la instrucción tone. Esta instrucción indica que se deje de emitir la señal por el pin indicado. 
noTone(pin) 
Con esto ya podemos generar música con Arduino o notas musicales sueltas.
Debemos conectar el zumbador con su patilla marcada como negativa a masa (GND) y la patilla marcada como positiva a nuestro pin con posibilidad de salida PWM. No te preocupes si lo conectas al revés, simplemente no funcionará y tendrás que cambiarlo, pero no habrá humo en tu lugar de trabajo.
Este puede ser un ejemplo para hacer sonar una semicorchea Do de la 4ª octava (según los timepos de ejemplo de la tabla de arriba) a través del pin 3: 
void setup()
{

pinMode(3, OUTPUT); // Fija el pin 3 como salida.
}
void loop()
{

tone(3, 261.63, 250); // Lanza señal a 261,63Hz por el pin 3 durante 250ms.
}
 
Este bucle sería equivalente a poner: 
void loop()
{

tone(3, 261.63); // Lanza señal a 261,63Hz por el pin 3.
delay(250); // Espera 250ms.
noTone(3); // Dejamos de emitir la señal.
}
 
Si la música con Arduino que queremos crear es una melodía relativamente larga lo mejor es utilizar arrays para almacenar todas las notas (frecuencias) y todos los tiempos. 
Primero definimos los arrays: 
long DO=523.25, //definimos las frecuencias de las notas
DoS=554.37,
RE=587.33,
RES=622.25,
MI=659.26,
FA=698.46,
FAS=739.99,
SOL=783.99,
SOLS=830.61,
LA=880,
LAS=932.33,
SI=987.77,
RE2=1174.66,
FAS2=1479.98,
PAU=30000; //pausa
int melodia[] = {SI, RE2, SI, RE2, PAU, SI, LA, SI, SI, SI, PAU, RE2, SI, SI, PAU, RE2, PAU, RE2, RE2, PAU, SI, RE2, SI, RE2, PAU,
SI, LA, SI, SI, SI, PAU, RE2, SI, SI, PAU, RE2, PAU, RE2, RE2, PAU, RE2, PAU, SI, RE2, PAU, SI, RE2, PAU, SI, RE2,
PAU, SI, PAU, RE2, SI, LA, SI, PAU, RE2,PAU, SI, RE2, PAU, SI, RE2, PAU, SI, RE2, PAU, SI, PAU, RE2, SI, LA, SI,
PAU, FAS2, PAU, RE2, FAS2, PAU, RE2, FAS2, PAU, RE2 ,FAS2, PAU, RE2, FAS2, PAU, RE2, LA, SOLS, SI, PAU, FAS2, PAU,
RE2, FAS2, PAU, RE2, FAS2, PAU, RE2, FAS2, PAU, RE2, FAS2, PAU, RE2, LA, SI, SI
};
int d=1000, e=500, m=250, c=125;
//definimos los tiempos de doble, entera, media y cuarta
int duracionNota[] = {m, m, m, m, e, c, m, m, c, m, e, m, m, m, e, m, m, m, m, d, m, m, m, m, e, c, m, m, c, m, e, m, m, m, e, m, m, m, m, d,
m, m, m, m, m, m, m, m, m, m, m, m, c, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m,
m, m, m, m, m, m, m, m, m, m, m, m, c, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m,
};
En el bucle incluiremos los arrays dentro de la función tone:
for (int notaActual = 0; notaActual < 112; notaActual++) { //va a repetir las 112 notas
tone(11, melodia[notaActual]); //da el tono a la frecuencia de la nota en ese momento
delay(duracionNota[notaActual]);//se mantiene con la nota el tiempo definido para esa nota
noTone(11); //finaliza la melodía
}


3. MATERIALES Y EQUIPO





4. EVIDENCIAS DE TAREAS DE LABORATORIO





VÍDEO



5. OBSERVACIONES
*El sonido del ETS -7000 nos daba algunos ruidos ,no tan agradables 
*Para que el sonido suene mejor solo tenemos que modificar (medio,uncuarto,etc)
*Algunos pines de no hacian buen contacto ,asi que tubimos que utilizar el arduino de nuestro compañero 


6. CONCLUSIONES
*Se logro hacer las canciones de star wars y del titanic
*Se pudo relizar el orden de los sonidos para que pueda salir los sonidos requeridos 
*Se entendió el funcionamiento del sistema americano para poder realizar  la canción 





7. FOTO GRUPAL



viernes, 7 de junio de 2019

LABORATORIO NRO.14

 


CONTADORES DIGITALES CON ARDUINO





1. COMPETENCIA ESPECIFICA DE LA SESION

  • Programación de sensores digitales con Arduino.
  • Programación de actuadores digitales con Arduino.
  • Implementación de proyecto con sensores y actuadores digitales.
2. MARCO TEÓRICO

    2.1 PROGRAMACIÓN ARDUINO
La estructura de un programa en Arduino puede llegar a ser muy diferente en función de la complejidad de la aplicación que queramos crear, pero como en la mayoría de lenguajes de programación esta estructura está formada por funciones, sentencias, bucles y otros elementos que conforman la estructura de programa.
2.1.1 Funciones  
Una función es un bloque de código con un nombre y un conjunto de estamentos que son ejecutados cuando se llama a dicha función. Las funciones de usuario se crean para realizar tareas repetitivas reduciendo de esa manera el tamaño del programa.  
Las funciones están asociadas a un tipo de valor "type", este es el valor que devolverá la función una vez termine su ejecución. 
type nombreFunción (parámetros)
{
  Estamentos o instrucciones;
}  
Si la función no devuelve ningún valor, se le asignará el tipo "void" o función vacía.  
No es obligatorio pasarles parámetros a la función, se pueden crear funciones independientes que obtengan sus propios parámetros para trabajar. 
Ejemplo de función:  
/* Define la función "multiplicar" a la que se le pasarán los 2 números que se deseen multiplicar devolviendo un valor entero (int). */  
int multiplicar (int x, int y)  //función multiplicar  
{
 int resultado;  //declara la variable donde se almacena el resultado resultado =    x * y;  //ejecuta la operación de multiplicar  
  return resultado;  //devuelve el resultado de la multiplicación  
}  
Para hacer uso de la función anterior, tan solo habrá que llamarla desde cualquier parte del programa. Esta llamada a la función se realiza de la siguiente manera:  
void loop()
{
  int i =2;
  int j =3;
  int k;  
   k = multiplicación(i, j);  //llama a la función multiplicación pasándole los                                     //parámetros "i" y "j"  
}  
En Arduino los programas pueden estar compuestos por infinidad de funciones, pero existe una estructura básica que deben de cumplir todos los programas.
Esta estructura básica, está formada por dos funciones totalmente necesarias para la ejecución del programa, la función setup() y loop().  
A) Setup ()  
La función setup() se invoca una sola vez al comienzo del programa. Esta función se usa para realizar la configuración inicial, dentro de esta configuración podemos establecer el modo de trabajo de los pines o inicializar la comunicación serie entre otras cosas.  
void setup()
{
  Estamentos o instrucciones;
}  
B)Loop ()  
La función loop() es la función principal dentro del programa. Esta función se va a
ejecutar continuamente de manera cíclica, ejecutando todas las instrucciones
que se encuentren en su interior.  
void loop()
{
  Estamentos o instrucciones;
}  
Además de las funciones principales, existen otros elementos de la estructura de programa que ayudan a definir, delimitar, estructurar y a hacer más claro el
contenido del programa.  
2.1.2 Llaves {}  
Las llaves definen el principio y el final de un bloque de instrucciones. Se usan para delimitar el inicio y fin de funciones como setup()o para delimitar el alcance de los bucles y condicionales del programa.  
funcion()
{
  Estamentos o instrucciones;
}  
2.1.3 Punto y coma ;  
El punto y coma ";" se utiliza para definir el final de una instrucción y separarla de la siguiente. Si no colocamos punto y coma, el programa va a interpretar mal las instrucciones y se va a producir un error de compilación.  
digitalWrite (10, HIGH); 
El error más común a la hora de programar suele ser olvidar poner punto y coma al final de la instrucción.  
2.1.4 Bloque de comentarios /*...*/  
Los bloques de comentarios son áreas de texto que nos ayudan a describir o comentar un programa, estos bloques serán ignorados a la hora de compilar el programa en nuestro Arduino.  
/*El bloque de comentario ayuda
al programador a describir el programa
*/  
Se pueden introducir todas las líneas de texto que se deseen siempre que se encuentren entre los caracteres /*...*/. 
Se recomienda el uso de bloques de comentarios siempre que se pueda, ya que ayudan a la comprensión del programa a personas ajenas al mismo, además, estos comentarios no van a ocupar espacio de programa, ya que son ignorados a la hora de compilar.  
2.1.5 Línea de comentarios //  
La línea de comentarios tienen la misma función que los bloques de comentarios, la única diferencia es que las líneas de comentarios suelen usarse para comentar instrucciones ya que solo afectan a una línea.  
int x = 10;  //declara la variable 'x' como tipo entero de valor 13  
2.1.6 Variables 
Las variables son elementos donde se almacenan valores numéricos que serán usados por el programa. Como su nombre indica, las variables van a cambiar de valor con la evolución del programa y nos van a permitir crear la lógica del programa en función de estos cambios. 
int variable_entrada = 0;  //declara una variable y le asigna el valor 0variable_entrada = analogRead(2);  //la variable toma el valor de la entrada analógica 2 
Una variable debe ser declarada y opcionalmente asignarle un valor antes de ser usada por el programa, si no hemos declarado la variable o lo hemos hecho con posterioridad a su uso va a dar un error al compilar el programa. 
Es recomendable asignarle un valor inicial a las variables para no tener un valor indeterminado que pudiera ocasionar algún error a la hora de la ejecución del programa. 
Cuando se asignen nombres a las variables, se deben de usar nombres que identifiquen claramente a dichas variables, para ello se usan nombres como "pulsador", "led", "entrada_1".... esto va a ayudar a hacer un código legible y fácil de entender. 
A) Utilización de las variables

Las variables pueden ser declaradas en diferentes lugares del programa, en función del lugar donde sean declaradas, las variables van a ser de tipo global o local, determinando esto el ámbito de aplicación o la capacidad de ciertas partes del programa para hacer uso de las mismas  
Una variable global es aquella que puede ser vista y utilizada por cualquier función y estamento de un programa. Las variables globales se declaran al comienzo del programa, antes de la función setup().
Una variable local es aquella que se define dentro de una función o como parte de un bucle. Solo será visible y podrá utilizarse dentro de la función o bucle donde es declarada.

La existencia de variables globales y locales, permite el uso de variables con el mismo nombre en partes diferentes del programa, estas variables podrán almacenar valores distintos sin que se produzca ningún conflicto, ya que a las variables locales solo tendrán acceso las funciones donde se declaren dichas variables. 

Ejemplo de variables globales y locales: 

int led = 10;  //"led" es una variable global visible para cualquier función
void setup()
{
 pinMode (led, OUTPUT);  //establece el pin "led" como salida
}
void loop ()
{  float valor;  //"valor" es una variable local solo visible dentro de            "loop"
  for (int i=0; i<20; i++)  //"i" es una variable local usada por el bucle      for
  {
    digitalWrite (led, HIGH);  //uso de la variable global "led"
  } 
         }
B)Tipos de variables 
A la hora de usar una variable dentro del programa debemos de pararnos a pensar que información o qué tipo de operaciones vamos a aplicar a estas variables y en función de esto asignarle un tipo u otro. Debemos de asegurarnos que el tipo de variable que estemos usando tiene rango suficiente para almacenar los datos sin llegar a ser desproporcionada, ya que usar variables grandes va a consumir más recursos de memoria.

*char: el tipo "char" se utiliza para almacenar caracteres en formato ASCII
 
*float: el tipo "float" se utiliza para datos con decimales, aunque cuenta con 32bit's, tan  solo tiene una precisión de 7 dígitos en sus decimales.
3. MATERIALES Y EQUIPO





4. EVIDENCIA DE TAREAS EN LABORATORIO
4.1 PRIMER EJERCICIO

4.2 SEGUNDO EJERCICIO

4.3 TERCER EJERCICIO




 VÍDEO


5. OBSERVACIONES
  • Se observo que el juego blockly games puzzle es una introducción al arduino ,y se puede decir que ya estamos programando en forma de diverción
  • Se aprecio que en el laboratorio debiamos establecer bien nuestra programacion para que el numero podriera aumentar y disminuir
  • Se tubo algunos problemas al realizar el ultimo trabajo po el cual necesitabamos   el comando "if.."

6. CONCLUSIONES

  • Se logro hacer la programación de sensores digitales con Arduino.
  • Se pudo hacer  la programación de actuadores digitales con Arduino.
  • Se pudo Implementar  el proyecto con sensores y actuadores digitales
  • Se logró hacer contar y descontar con la programación 

7. FOTO GRUPAL


                       

lunes, 3 de junio de 2019

LABORATORIO N.RO 13



PROGRAMACIÓN GRÁFICA DE ARDUINO






1. COMPETENCIA ESPECIFICA DE LA SESION:

  • Programar la tarjeta ARDUINO UNO utilizando un lenguaje gráfico y comparar con lenguaje de texto. 
  • Conocer el entorno de mBlock y todas sus posibilidades. 
  • Realizar programación básica utilizando software mencionado.

2. MARCO TEÓRICO:

    2.1 ARDUINO

Arduino es una plataforma de desarrollo basada en una placa electrónica de hardware libre que incorpora un microcontrolador re-programable y una serie de pines hembra, los que permiten establecer conexiones entre el microcontrolador y los diferentes sensores y actuadores de una manera muy sencilla (principalmente con cables dupont).







Una placa electrónica es una PCB (“Printed Circuit Board”, “Placa de Circuito Impreso” en español). Las PCBs superficies planas fabricadas en un material no conductor, la cual costa de distintas capas de material conductor. Una PCB es la forma más compacta y estable de construir un circuito electrónico. Así que la placa Arduino no es más que una PCB que implementa un determinado diseño de circuitería interna, de esta forma el usuario final no se debe preocupar por las conexiones eléctricas que necesita el microcontrolador para funcionar, y puede empezar directamente a desarrollar las diferentes aplicaciones electrónicas que necesite.




PCB de un Arduino UNO

Cuando hablamos de “Arduino” deberíamos especificar el modelo concreto, ya que se han fabricado diferentes modelos de placas Arduino oficiales, cada una pensada con un propósito diferente y características variadas (como el tamaño físico, número de pines E/S, modelo del microcontrolador, etc). A pesar de las varias placas que existen todas pertenecen a la misma familia (microcontroladores AVR marca Atmel), esto significa que comparten la mayoría de sus características de software, como arquitectura, librerías y documentación.




Diferentes modelos de placas Arduino

    2.2 MBLOCK

mBlock es un entorno gráfico de programación por bloque para Arduino, que permite introducir de forma sencilla la programación y robótica en el aula.
mBlock se compone de 5 partes principalmente: 
A) Grupo de instrucciones clasificadas por colores en las siguientes categorías:
  • Movimiento: Conjunto de instrucciones relacionadas con el control de los pines de la tarjeta de Arduino, así como el control del movimiento de cualquier personaje del escenario.
  • Apariencia: Instrucciones orientadas a modificar el aspecto de los personajes de nuestra aplicación. Para el caso de Arduino, es un conjunto de instrucciones que apenas se utiliza.
  • Sonido: Conjunto de instrucciones relacionadas con la elaboración de aplicaciones musicales, emitiendo sonidos y notas musicales.
  • Lápiz: Scratch nos ofrece la posibilidad de que los personajes dejen un rastro durante sus movimientos por el escenario como si arrastrase un lápiz durante su trayectoria.
  • Control: Las instrucciones incluídas en esta sección son impresindibles para crear la lógica de nuestros programas. Incluyen condicionales, bucles y llamadas de procedimientos.
  • Sensores: Instrucciones de iteración con el ratón, el teclado, sonidos y los personajes.
  • Operadores: operaciones matemáticas, lógicas y con cadenas de texto.
  • Variables: Instrucciones para el almacenamiento y gestión de datos. 
B) Instrucciones de programación: Las instrucciones de cada grupo corresponden a instrucciones de programación. 
C) Editor: Es la parte principal donde estructuramos y programamos nuestro programa. 
  • Programas: Se compone de todas las instrucciones que hace funcionar el código que programemos.
  • Disfraces: Cada objeto puede tener diferentes apariencias o disfraces para utilizar a lo largo de nuestro programa.
  • Sonido: También es posible añadir o grabar sonidos y guardarlos para futuros usos.
D) Escenario o ventana principal: Es el resultado de nuestro programa. 
E) Objetos y sprites: Distinguimos principalmente los objetos de tipo Arduino y Sprites. 
  • Los objetos de tipo arduino son aquellos que interactuán con Arduino.
  • Los sprites son similares al entorno de scratch y no interactúan con Arduino. 
    2.3 BLOCKY GAMES
Blockly Games es una serie de juegos educativos que enseñan programación. Está diseñado para niños que no han tenido experiencia previa con la programación de computadoras. Al final de estos juegos, los jugadores están listos para usar lenguajes convencionales basados ​​en texto.  
    
Puzzle es una introducción rápida a las formas de Blockly y cómo las piezas se unen.
Maze es una introducción a los bucles y condicionales. Comienza de manera simple, pero cada nivel es más desafiante que el anterior.
Bird es una inmersión profunda en condicionales. El flujo de control se explora con condiciones cada vez más complejas.
La tortuga es una inmersión profunda en bucles. Usa bucles anidados para pintar una imagen. Luego publica tu arte para que el mundo lo vea.
La película es una introducción a las ecuaciones matemáticas. Usa las matemáticas para animar una película. Luego publica tu película para que la vea el mundo.
La música es una introducción a las funciones. Usa las funciones para componer música. Luego publica tu música para que el mundo la escuche.
Pond Tutor introduce la programación basada en texto. Los niveles cambian de un lado a otro entre bloques y JavaScript real en un editor de texto.
Pond es un concurso abierto para programar el pato más inteligente. Utilice bloques o JavaScript.

Blockly Games es un proyecto de Google para animar a los programadores del mañana. Los juegos están diseñados para ser a su propio ritmo y autoaprendizaje. Siéntase libre de usar Blockly Games tanto dentro como fuera del aula. Todo el código es de código abierto.
3. MATERIALES Y EQUIPO 
  • IDE Arduino y mBlock instalado. 
  • Tarjeta ARDUINO UNO • Componentes accesorios. 
  • Guía de Laboratorio. El trabajo se desarrolla de manera GRUPAL. 
  • PC con Software de simulación.
4. EVIDENCIA DE TAREAS EN LABORATORIO:






VIDEO











5. OBSERVACIONES:

  • Los problemas planteados de Blocky games son en general fácil de realizar.
  • El programa mBLOCK tiene diversas variantes, es decir programas parecidos.
  • Tubimos algunos inconbenientes con el arduino ya que aveces mandaba  no mandaba la señal a los leds



6. CONCLUSIONES
  • Utilizando un lenguaje gráfico y comparandolo con lenguaje de texto, programamos con éxito la tarjeta ARDUINO UNO.
  • Aprendimos sobre el funcionamiento del entorno de mBlock y todas sus posibilidades. 
  • Realizamos satisfactoriamente la programación básica utilizando software mencionado.
7. FOTO GRUPAL:














martes, 21 de mayo de 2019

LABORATORIO NRO. 12

CONTADOR EN ANILLO Y MATRIZ DE
LEDS
(EJERCICIO)

COMPETENCIA ESPECIFICA DE LA SESIÓN

 -Implementación de Registros en Serie
 -Contador en Anillo con Registro serie
 -Identificación de terminales y prueba de Matriz de Leds

MARCO TEORICO

El contador en anillo es un registro de desplazamiento que tiene su salida conectada a la entrada. Normalmente se implementa con flip-flops con entradas de PRESET y CLEAR, conectados en cascada y disparados de forma síncrona. Por lo tanto, un contador en anillo es un contador síncrono. 

 \begin{figure}\centering
\epsfig{file=Contadores/contador_anillo.eps,width=10cm}\end{figure}

En contador en anillo funciona pasándose de flip-flop a flip-flop un único bit. Esto quiere decir que, en cualquier instante del proceso de conteo, sólo un flip-flop tiene su salida Q=1. Esto provoca que el contador en anillo sea el contador más fácil de decodificar. De hecho, sabiendo que el flip-flop está a uno, conocemos en que estado se encuentra el contador.

Tabla de estados de un contador en anillo de 4 bits.

Pulso Q3 Q2 Q1 Q0
0 0 0 0 1
1 0 0 1 0
2 0 1 0 0
3 1 0 0 0

El principal inconveniente del contador en anillo es que para procesar n estados necesita n flip-flops. Sin embargo, no necesita lógica añadida, ni para construir el siguiente estado, ni para decodificar el estado. Debido a ésto último, el contador en anillo es (junto con el contador Johnson) el más rápido que podemos construir, presentando una frecuencia máxima de funcionamiento
Evidencias del laboratorio 




VIDEO





OBSERVACIONES

  • El circuito no vario demasiado si lo comparamos con el anterior realizado
  • Implementamos un circuito adicional para que funcione como clock
  • Se uso una considerable cantidad de cables macho macho.
  • Usamos la simulación en Proteus para comprobar nuestros cálculos. 

CONCLUSIONES

  • Logramos hacer el circuito combinacional necesario para la secuencia solicitada.
  • Implementamos correctamente el circuito combinacional en físico.
  • La frecuencia para que no se perciba el encendido y apago de los leds fue la adecuada, por lo cual la imagen se ve encendida constantemente.
  • Obtuvimos un resultado exitoso ya que la figura formada por los leds era la misma que el profesor nos mostro.















LABORATORIO NRO.16