Autor: Patricio Aros Erices
Compentecia: Aprendizaje autónomo
Palabras Clave:
NXC,
Lego(MindStorm)
Este proyecto era realizado completamente por nosotros y desarrollado a manera de nuestros parametros establecidos, aun asi con un orden comun de un trabajo serio.
Contexto: Para un recital de rock que se efectuará en una fecha determinada, le asignan construir una guitarra robot, que le permita tocar un sonido grueso y envolvente. Como el guitarrista de la banda no posee conocimientos de música, deberá diseñar un robot que sea fácil de usar. Para esto, deberá cumplir con las siguientes características:
· Para esta actividad, se requiere manejar las estructuras de datos Arreglos (Arrays) y Archivos, y manejo de tareas concurrentes.
· Debe contar con 8 acordes básicos (o notas musicales): Do, Re, Re sostenido, Mi, Sol, Sol sostenido, La y La menor.
· Las notas musicales deberán ser mostradas en pantalla cada vez que sea pulsada.
· Cada acorde deberá contar con su propia tarea, que finalmente será ejecutado en orden.
· Al final de tocar la melodía, deberá ser almacenada en un fichero txt para posteriormente ser visto más tarde (WriteLnString).
A continuación problemas que iban surgiendo a travez del desarrollo o más bien como podrias realizar la actividad de manera más comun o simple.
1) Diferenciar las notas:
Solución: Se guardó cada nota en un rango de distancia detectada por el sensor de proximidad.
Ejemplo:
if(Notas[j]>=10&&Notas[j]<12){ // verifica las distacias para asignar las notas
cadena= "La";
cadena=nota+cadena; // se une los strig cadena y nota para generar una frase : la nota es "la".
cadena = cadena + linea;
WriteLnString(punteroArchivo, cadena, bytesEscritos); //Escribe la nota definifa dentro del archivo
}
2) Reproducir un sonido similar a una guitarra eléctrica.
Solución: Se importaron archivos de extensión “.rso”dentro del ladrillo, luego se llama a través del código NXC.
Ejemplo:
while(true){
if(ButtonPressed(BTNCENTER, false)){ //verifica si el boton central es presionado
if(SensorUS(IN_4)<=12){
PlayFileEx("Guitar_A_high.rso", 7,0); //Reproduce el un archivo .rso con maximo volumen
Wait(300); //durante 3 milisegundos
Notas[i]= SensorUS(IN_4); //guarda el valor entregado por el sensor de proximidad dentro del arreglo.
i++;
3) Llevar un registro de las últimas 5 notas tocadas por la guitarra
Solución: Se creó u n archivo llamado “notas.txt”en el cual guardamos a través de arreglos las últimas 5 notas registradas:
Extracto del código:
DeleteFile("Notas.txt"); //borra archivo
CreateFile("Notas.txt", tam, punteroArchivo); //Crea un nuevo archivo
WriteLnString(punteroArchivo, "Notas", bytesEscritos);// Escribe en el archivo
for(j=0; j < ArrayLen(Notas); j++) //recorre el arreglo para definir la nota.
{if(Notas[j]>=10&&Notas[j]<12){ // verifica las distacias para asignar las notas
cadena= "La";
cadena=nota+cadena; // se une los strig cadena y nota para generar una frase : la nota es "la".
cadena = cadena + linea;
WriteLnString(punteroArchivo, cadena, bytesEscritos); //Escribe la nota definifa dentro del archivo
}
if(Notas[j]>=12&&Notas[j]<14){
cadena= "Do";
cadena=nota+cadena;
cadena = cadena + linea;
WriteLnString(punteroArchivo, cadena, bytesEscritos);
Teniendo mas o menos la base de como poder realizar el proyecto, se comenzo haciendo una especie de pseudocodigo que debia ser lo más explicativo posible logrando algo como lo siguiente, al final de este segmento de pseudodigo encontraran el codigo fuente usado:
//Pseudocódigo
subrutina TraspasarArchivo(){
crear archivo;
escribir en el archivo;
guardar notas en una cadena;
guardar cadena en archivo;
si(Distancia>=12 && Distancia<14){
cadena="Do"
guardar cadena en archvio;
}
si(Distancia>=14 && Distancia<16){
cadena="Re"
guardar cadena en archvio;
}
si(Distancia>=16 && Distancia<18){
cadena="Re#"
guardar cadena en archvio;
}
si(Distancia>=18 && Distancia<20){
cadena="Mi"
guardar cadena en archvio;
}
si(Distancia>=20 && Distancia<22){
cadena="Sol"
guardar cadena en archvio;
}
si(Distancia>=22 && Distancia<24){
cadena="Sol#"
guardar cadena en archvio;
}
si(Distancia>=24 && Distancia<26){
cadena="Lam"
guardar cadena en archvio;
}
}
Cerrar archivo;
}
tarea la(){
mientras sea(verdadero){
si(Boton central es presionado) {
si(Sensor Proximidad <=12) {
Reproducir sonido;
durante 3 milisegundos;
guardar distancia en arreglo;
}
}
}
}
tarea DO(){
mientras sea(verdadero){
si(Boton central es presionado) {
si(Sensor Proximidad>12 y <=14) {
Reproducir sonido;
durante 3 milisegundos;
guardar distancia en arreglo;
}
}
}
tarea re(){
mientras sea(verdadero){
si(Boton central es presionado) {
si(Sensor Proximidad>14 y <=16) {
Reproducir sonido;
durante 3 milisegundos;
guardar distancia en arreglo;
}
}
}
tarea resostenido(){
mientras sea(verdadero){
si(Boton central es presionado) {
si(Sensor Proximidad>16 y <=18) {
Reproducir sonido;
durante 3 milisegundos;
guardar distancia en arreglo;
}
}
}
tarea mi(){
mientras sea(verdadero){
si(Boton central es presionado) {
si(Sensor Proximidad>18 y <=20) {
Reproducir sonido;
durante 3 milisegundos;
guardar distancia en arreglo;
}
}
}
tarea sol(){
mientras sea(verdadero){
si(Boton central es presionado) {
si(Sensor Proximidad>20 y <=22) {
Reproducir sonido;
durante 3 milisegundos;
guardar distancia en arreglo;
}
}
}
tarea solsostenido(){
mientras sea(verdadero){
si(Boton central es presionado) {
si(Sensor Proximidad>22 y <=24) {
Reproducir sonido;
durante 3 milisegundos;
guardar distancia en arreglo;
}
}
}
tarea lamenor(){
mientras sea(verdadero){
si(Boton central es presionado) {
si(Sensor Proximidad>24 ) {
Reproducir sonido;
durante 3 milisegundos;
guardar distancia en arreglo;
}
}
}
subtarea imprimir(){
Llama sub TraspasarArchivo();
Limpia la pantalla;
Abre nuestro archivo;
Revisa que todo este correcto;
Si (es correcto?)
Imprime en pantalla;
Espera 5 segundos;
Cierra el archivo;
}
tarea archivo(){
mientras sea(verdadero){
si(El boton izquierdo es presionado)
{imprimir();
}
}
}
ejecutar tareas(){
Encender sensor proximidad(puerto_4);
preceder(la,DO,re,resostenido,mi,sol,solsostenido,lamenor,archivo)
}
}
}
Reflexión
Logrando terminar el proyecto, fue una experiencia genial y un tanto agotadora por el hecho de que debiamos realizar todo el trabajo de ver o crear el contexto y realizar la actividad más o menos a la par, es así como tambien aprendimos a travez de estudios en internet y usando como ejemplos diferentes actividades publicada por profesores llegamos a una actividad completa, cabe mencionar que debiamos hacer uso de programas externos como es el Software original de lego mindstorm que era para poner nuevos sonidos dentro del ladrillo NXT y lograr poner las notas musicales en el mismo, y aplicando gran cantidad de nuevas sentencias como lo eran algunos para poder usar los botones del mismo NXT sin hacer uso de otros sensores como los de tacto o similar. Una actividad que deja gran sabiduria y que puede transformarse en un ejemplo para actividades futuras.