Entrada y salida de datos con Arduino

Este es un pequeño tutorial sobre cómo interconectar el arduino con dispositivos de E/S básicos. Para ello, os presentamos un pequeño proyecto de juego que enseña "las tablas de multiplicar", donde la información se escribe en un teclado y el resultado se muestra en una pantalla LCD.

Para este proyecto vamos a necesitar de los siguientes elementos:

Una placa Arduino compatible con UNO;
Protoboard;
Teclado 4x4;
LCD 2x16;
Potenciómetro 1k;
100 ohmios de resistencia;
5v Piezzo Buzzer;
Cables de puente.
En la foto de abajo podemos ver cómo se montan estos componentes:

Puntos de interés

  • Se necesita la resistencia de 100 ohmios para evitar la distorsión del sonido
  • Es necesario el potenciómetro para ajustar la visibilidad del LCD
  • Los pines analógicos se usan como pines digitales
  • En cuanto al teclado, no serán necesarias resistencias externas debido a que la librería utiliza resistencias pullup internas (activadas a través del software)

El código

El juego de "las tablas de multiplicar" funciona tal que así:

  • El sistema selecciona al azar dos números que se multiplican y los muestra en la pantalla LCD
  • El sistema espera la respuesta del usuario
  • El usuario escribe su respuesta en el teclado y presione la tecla "#"
  • El sistema verifica si la respuesta es correcta o no, y muestra el resultado en la segunda línea de la pantalla LCD a través de emoticonos y sonidos
  • El usuario presiona la tecla "#"
  • El sistema vuelve al paso 1

Aquí puedes ver un vídeo sobre el funcionamiento:

Este sería el código:

/*
 * Data input and output whit Arduino, Keypad 4x4, LCD 2x16 and buzzer
 * 2015, by Jose Augusto Cintra ([email protected])
 */

#include 
#include 
#include "pitches.h" // Musical Notes

//keyPad definitions
const byte numRows= 4; //number of rows on the keypad
const byte numCols= 4; //number of columns on the keypad
char keyMap[numRows][numCols]=
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
  };
byte rowPins[numRows] = {9,8,7,6}; //Rows 0 to 3
byte colPins[numCols]= {5,4,3,2}; //Columns 0 to 3
Keypad keyPad= Keypad(makeKeymap(keyMap), rowPins, colPins, numRows, numCols);

//LCD Display
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

//Buzzer
int buzzPin = 10; //connect a 100ohms resistor on this pin

void setup() {
  lcd.begin(16, 2);
  pinMode(buzzPin,OUTPUT); //Buzzer pin
  randomSeed(analogRead(7));//Starts the random number generator on this analogic pin
}

void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  //Choose two numbers and displays them on the LCD
  int num1 = random(2, 11);
  int num2 = random(2, 11);
  int result = num1 * num2;
  String mult = String(num1) + " x " + String(num2) + " = ";
  lcd.print(mult);
  // Waiting for user response and evaluates the result
  int hit = readVal().toInt();
  lcd.setCursor(0, 1);
  if (result == hit){
    lcd.print(":-)");
    playHappy();
  }
  else {
    lcd.print(":-(     " + String(result));
    playAlarm();
  }
  hit = readVal().toInt(); //Just waiting for you to press any key to continue
}

//Data input: Enter the values and press "#"
String readVal(){
  String myString = "";
  char keyPressed = keyPad.getKey();
  while (keyPressed != '#'){
    keyPressed = keyPad.getKey();
    if ((keyPressed != NO_KEY) && (keyPressed != '#')) {
      myString.concat(keyPressed);
      lcd.print(keyPressed);
      playTone();
      }   
    }  
  return(myString);  
  }

//Success: Play "Happy Birthday"
void playHappy(){
  int melody[] = {NC4,NC4,ND4,NC4,NF4,NE4,
                NC4,NC4,ND4,NC4,NG4,NF4,
                NC4,NC4,NC5,NA4,NF4,NE4,ND4,
                NAS4,NAS4,NA4,NF4,NG4,NF4  
                 };
  int noteDurations[] = {6,12,4,4,4,2,
                       6,12,4,4,4,2,
                       6,12,4,4,4,4,2,
                       6,12,4,4,4,2,    
                       };
  for (int thisNote = 0; thisNote < 12; thisNote++) {
    int noteDuration = 1000/noteDurations[thisNote];
    tone(buzzPin, melody[thisNote],noteDuration);
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(buzzPin);
  }
}

//Error: Play a alarm
void playAlarm(){
for (int thisNote = 150; thisNote < 1000; thisNote += 1)
  {
    tone(buzzPin, thisNote, 10);
    delay(1);
  }
  for (int thisNote = 1000; thisNote > 150; thisNote -= 1)
  {
    tone(buzzPin, thisNote, 10);
    delay(1);
  }
}

//Beeps on key presses
void playTone(){
  tone(buzzPin, 150, 10);
  }

Debes saber que...

  • Las librerías (keypad.h y LiquidCrystal.h) están disponibles en el gestor de librerías de Arduino IDE
  • El archivo pitches.h contiene definiciones de notas musicales utilizadas en la canción "Happy Birthday to You"
  • El array keymap define los caracteres del teclado
  • La función randomSeed inicializa el generador de números aleatorios por el pin analógico A7

Y este ha sido el artículo en el que trataba explicaros cómo manejar la entrada y salida de datos con Arduino, esperamos que te haya gustado y sepas aplicarlo en tus futuros proyectos. Como habrás observado, el código es original de José Augusto Cintra. Ya sabes que si nos quieres proponer un tema que quieres ver reflejado como un tutorial o como una práctica, solo tienes que hacer uso del área de comentarios de un poco más abajo. Por el contrario, si quieres enviarnos tus propios tutoriales, puedes hacerlo a través de la intranet de usuarios que está habilitada para ello, a través del menú Enviar Tutorial. Ya sabes, ayúdanos a crecer con tus conocimientos. ¡Un saludo y feliz código!

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP