UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE ESTUDIOS SUPERIORES CUAUTITLÁN CENTRO DE FÍSICA APLICADA Y TECNOLOGÍA AVANZADA DIVISIÓN DE INGENIERÍA Y TECNOLOGÍA LICENCIATURA EN TECNOLOGÍA QUINTO CONGRESO DE TECNOLOGÍA. 1 AL 3 DE JUNIO 2015 IN-16 Interfaz de comunicación humano-máquina II Alfredo Sánchez Martínez, David Tinoco Varela, José Isaac Sánchez Guerra * RESUMEN Se desarrolló una interfaz humano-máquina capaz de ejecutar acciones dependiendo de la interacción con el usuario. Para hacerlo, se requirió de una plataforma que contara con el IDE de Arduino y el entorno Processing. En Processing se ejecutaron las acciones, mientras que Arduino proporcionaba los comandos. ABSTRACT A human-machine interface able to perform actions depending on user interaction was developed. To do so, a platform that had the Arduino and Processing environment was required. The actions were executed in Processing, while Arduino provided the commands. Palabras claves: Interfaz, Arduino, Processing, Sensores ANTECEDENTES Se desea controlar el ordenador mediante un dispositivo periférico que funcione como interfaz. INTRODUCCIÓN Arduino es un sistema de prototipado que forma parte del colectivo conocido como Hardware de sistemas abiertos, que significa que toda la información necesaria para el diseño y la producción del sistema está disponible bajo una licencia Creative Commons, que permite a terceros fabricar la placa base por su cuenta. El entorno de desarrollo se puede obtener libremente de Internet, así como las librerías de programación. configurados y se prefirió utilizar el sistema operativo Windows, porque es más fácil de instalar el IDE de Processing. Construcción del prototipo: Los sensores empleados fueron módulos plásticos que contienen un fototransistor y un LED infrarrojo. Cada LED infrarrojo se conectó a una resistencia de 330 ohms, porque a una entrada de 5 volts, la intensidad de corriente con dicha resistencia es de 15mA. La intensidad máxima que toleran los LEDs en polarización directa es de 20mA. De este modo, se tiene la mejor luminosidad, pero no se corre el riesgo de alcanzar el valor máximo. El fototransistor se conectó en serie a una resistencia de 100 kilo ohms, de modo que cuando el fotodiodo fuera activado por la luz, no hubiera una caída de voltaje importante, que impidiera que la compuerta NAND funcionara, pero que cuando no fuera activado por la incidencia de luz, la corriente parásita que pudiera encontrarse ahí, tuviera una forma de llegar a tierra, y así, no hubiera interferencia con la compuerta lógica NAND que se conectó en el nodo entre el fototransistor y la resistencia. Se emplearon compuertas NAND con la finalidad de acondicionar la señal, ya que la señal de salida del sensor es analógica, pero el microcontrolador requiere una señal de entrada digital. La compuerta nos evita caer en rangos no definidos para el microcontrolador, que pudieran causar problemas. De modo que lo que se obtuvo fue un circuito de acoplamiento. Los cinco módulos se conectaron de esta forma, como muestra el diagrama de la Figura 1. Este sistema resulta muy útil para la construcción de prototipos, porque resulta muy fácil de programar e implementar. Ahorra tiempo, ya que los circuitos de acoplamiento y de acondicionamiento para el microcontrolador ya vienen integrados. En este caso, el puerto USB integrado que se usa para programar la tarjeta resulta de mucha utilidad para establecer comunicación en serie con el ordenador. DESARROLLO Como plataforma de desarrollo, se utilizó un ordenador con la IDE de Arduino y de Prcessing instaladas, los puertos de comunicación * Institución, Escuela, Departamento, Correo electrónico. Información de adscripción del autores y coautores del artículo Figura 1. Esquema de circuito de acoplamiento con los puertos del controlador Arduino. Una vez armado el arreglo de sensores, se incorporó al controlador Arduino como se muestra en la figura 2. Se dejaron libres los puertos que soportan señales PWM, porque son útiles para utilizar módulos digitales. PAGINA 1 DE 4 UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE ESTUDIOS SUPERIORES CUAUTITLÁN CENTRO DE FÍSICA APLICADA Y TECNOLOGÍA AVANZADA DIVISIÓN DE INGENIERÍA Y TECNOLOGÍA LICENCIATURA EN TECNOLOGÍA QUINTO CONGRESO DE TECNOLOGÍA. 1 AL 3 DE JUNIO 2015 Los puertos 0 y 1 deben quedar despejados, porque son los que el sistema emplea para la comunicación serial con el ordenador. Se programó el Arduino y se presionó el botón de RESET. Para verificar el funcionamiento del programa, se abre el monitor serial en el IDE de Arduino, haciendo click en su icono, como se muestra en la figura 3. Figura 3. Ubicación del icono del monitor serial. Si se ve el texto programado, es que el equipo funciona correctamente. Figura 2. Esquema del bus de conexiones con el controlador Arduino Codificación de los “sketches” Un “sketch” es la manera coloquial de denominar los programas realizados en Arduino y en Processing. El programa deberá inicializar la conexión serial mediante el siguiente código: void { //iniciar comunicaciones Serial.begin(9600); } setup() con un baud rate de 9600 El ‘baud rate’ es la tasa de transferencia de la información. Se tuvo cuidado con esta cantidad para que la información que se recibiera fuera legible. Lo que va adentro de “void setup()” solamente se ejecutará una vez. Una vez inicializada la comunicación serial, se podrá escribir el resto del código. Para probar la placa Arduino que se tenía disponible, se utilizó el siguiente código: void { Serial.println("Hello, delay(100); } loop() world!"); Lo que va dentro de “void loop()” es la parte del programa que se repite una y otra vez. En este caso, se imprime la frase “Hello, world!”, muy popular, y se espera 100 milisegundos. El retraso es para evitar congestionar la línea y agotar los recursos del ordenador, y para que podamos apreciar la aparición de las líneas Figura 4. Texto mostrado en el monitor serial. Se hizo un código nuevo para transmitir la información que nos interesa. De momento, se programó una función, pero se pueden implementar más. int s1 = 2; int s2 = 4; int s3 = 7; int s4 = 8; int s5 = 12; void setup() { pinMode(s1, INPUT); pinMode(s2, INPUT); pinMode(s3, INPUT); pinMode(s4, INPUT); pinMode(s5, INPUT); Serial.begin(9600); } void loop() { if (digitalRead(s1) == HIGH && digitalRead(s2) == LOW && digitalRead (s3) == LOW && digitalRead (s4) == LOW && digitalRead(s5) == HIGH { Serial.println(“1”); delay(100); } else { Serial.println(“0”); delay(100); } } En la parte de Processing, se tiene que importar la librería “Serial”. Para ello se elige, en el menú “Sketch”, submenú “Import PAGINA 2 DE 4 UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE ESTUDIOS SUPERIORES CUAUTITLÁN CENTRO DE FÍSICA APLICADA Y TECNOLOGÍA AVANZADA DIVISIÓN DE INGENIERÍA Y TECNOLOGÍA LICENCIATURA EN TECNOLOGÍA QUINTO CONGRESO DE TECNOLOGÍA. 1 AL 3 DE JUNIO 2015 Library…”, la opción “serial”. Automáticamente se añadirá una línea al sketch como resultado: import processing.serial.*; Se deberá crear un objeto a partir de la clase Serial Serial myPort; Y también se deberá crear una variable para guardar toda la información enviada por el puerto serial String val; Se debe especificar el nombre del puerto, dependiendo del que esté en uso actualmente. String portName = Serial.list()[0]; myPort = new Serial(this, portName, 9600); Se empleó el código del tutorial para probar la comunicación. void draw() { if ( myPort.available() > 0) { // If data is available, val = myPort.readStringUntil('\n'); // read it and store it in val } println(val); //print it out in the console } Un vez que se conoció cómo establecer la conexión serial, se preparó la interfaz de salida en Processing, para darle al usuario una retroalimentación de lo que está sucediendo. Se preparó un código de prueba para ver cómo se comporta la suite de Processing. En lugar de usar la conexión serial, se usó el mouse de la computadora, para simplificar el proceso de pruebas y no tener mucho código que pudiera dejar de funcionar. int telState = 0; //estado de actividad del telefono int pts; //estado previo del telefono int cts; //estado actual del telefono int tchg; //cambio de estado del telefono void setup() { size(120,120); background(0); } void draw() { if (mousePressed){ pts=cts; cts=1; } tchg=pts-cts; if (tchg == -1) { if (telState == 0) { telState=1; } else if (telState == 1) { telState=2; } else { telState=1; } } if (telState == 0) { fill(0); } else if (telState == 2) { fill(200,0,0); } else { fill(0,150,100); } ellipse(60, 60, 80, 80); delay(100); } void mouseReleased() { pts=cts; cts=0; } El funcionamiento es sencillo, el programa está a la espera de un cambio. Este cambio se interpreta como que el usuario hace la señal de usar el teléfono. La función de teléfono es representada por un círculo verde. Cuando el usuario hace la señal nuevamente, está indicando que quiere colgar, y el teléfono cambia de estado a un teléfono colgado, representado por un círculo rojo. Ya que la representación gráfica funcionó, se unen los códigos de Processing: import processing.serial.*; Serial myPort; String val; String portName = Serial.list()[0]; myPort = new Serial(this, portName, 9600); int pushButton; int telState = 0; //estado de actividad del telefono int pts; //estado previo del telefono int cts; //estado actual del telefono int tchg; //cambio de estado del telefono void setup() { size(120,120); background(0); } void draw() { if ( myPort.available() > 0) { Como el arduino nos manda la información en Strings, la tendremos que convertir a int, que es el tipo de datos con el que estamos trabajando. PAGINA 3 DE 4 UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE ESTUDIOS SUPERIORES CUAUTITLÁN CENTRO DE FÍSICA APLICADA Y TECNOLOGÍA AVANZADA DIVISIÓN DE INGENIERÍA Y TECNOLOGÍA LICENCIATURA EN TECNOLOGÍA QUINTO CONGRESO DE TECNOLOGÍA. 1 AL 3 DE JUNIO 2015 val = myPort.readStringUntil('\n'); pushButton=Integer.parseInt(val); } if (pushButton == 1){ pts=cts; cts=1; } else if(pushButton == 0) { pts=cts; cts=0; } Processing 2.0.. string to int. En Processing Forum [en línea]. [Fecha de consulta 8 de mayo 2015]. Disponible en: http://forum.processing.org/two/discussion/2217/processing-2-0string-to-int tchg=pts-cts; if (tchg == -1) { if (telState == 0) { telState=1; } else if (telState == 1) { telState=2; } else { telState=1; } } if (telState == 0) { fill(0); } else if (telState == 2) { fill(200,0,0); } else { fill(0,150,100); } ellipse(60, 60, 80, 80); delay(100); } RESULTADOS: La comunicación entre el Arduino y la plataforma fue exitosa. La interfaz queda abierta para un posterior desarrollo CONCLUSIONES: El desarrollo del trabajo se vio enormemente beneficiado por la gran cantidad de información disponible. Debido a que se emplearon programas de Software Libre, la documentación provino incluso de otros usuarios. La ventaja que tiene el prototipado con Arduino es que es sencilla, pero se pueden realizar grandes proyectos. FUENTES: Monk, Simon. 12 Proyectos Arduino Android: Controle Arduino Con Su Teléfono Inteligente O Su Tableta. Madrid: Estribor, 2013. Craft, Brock. Arduino Projects for Dummies. United States: For Dummies, 2013. Connecting Arduino to Processing. En Sparkfun [en línea]. [Fecha de consulta 8 de mayo 2015]. Disponible en: https://learn.sparkfun.com/tutorials/connecting-arduino-toprocessing PAGINA 4 DE 4
© Copyright 2024