RetroPie


 RetroPie es una combinación de múltiples proyectos, incluidos RetroArch , EmulationStation y muchos otros,  cuya finalidad es hacernos accesibles todos los juegos de nuestra infancia  en una Raspberry Pi.

La forma más fácil de instalar RetroPie es generar  una  imagen SD  para arrancar una Raspberry Pi,pero  también se puede instalar manualmente o incluso instalar en otros dispositivos como ordenadores o clones de Raspberry Pi

Instalar Retropie con una imagen  oficiall  nos permite  ahorrar  mucho tiempo pues  es un sistema listo para usar   construido sobre la parte superior del sistema operativo Raspbian . Alternativamente, los usuarios avanzados pueden instalar RetroPie manualmente  como hemos visto en este blog partiendo de una instalación de Raspbian.

Vamos a ver los conceptos básicos para que pueda comenzar a utilizar una tarjeta SD vacía para iniciar por primera vez en EmulationStation.

Empecemos por los requerimientos de hardware:

      • Raspberry Pi (A, A +, B, B +, 2, Zero o 3): para obtener el mejor rendimiento, use un Raspberry Pi 3 Modelo B +
      • Carcasa  para Raspberry Pi  (opcional pero recomendado)
      • Tarjeta MicroSD
      • Lector de tarjetas MicroSD (para instalar retropie desde su computadora)
      • Cable HDMI o cable RCA de 4 polos a 3,5 mm (HDMI funciona mejor)
      • Televisión o monitor de computadora: realmente cualquier pantalla con puertos HDMI o RCA
      • Wifi Dongle o Cable Ethernet (Wifi está integrado en el Pi 3- )
      • Fuente de alimentación micro USB de 5V 2A (2.5A para pi 3)
      • Teclado y mouse USB (para configurar las cosas puede usar SSH )
      • Controlador de juegos USB de su elección

La forma más sencilla de obtener la mayoría de estos componentes es a través de un kit como el Canakit .

Instalación

1-Descargar

Actualmente hay tres  versiones de RetroPie. Hay una versión para Raspberry Pi 0/1 (Modelo A, A +, B, B +) , hay una versión para Raspberry Pi 2/3 y finalmente otra para la Raspberry 4.

Descargue la imagen SD para su versión de Raspberry Pi desde la siguiente página:https://retropie.org.uk/download/

 

Si no está seguro de qué versión de Raspberry Pi tiene, puede contar las frambuesas en el arranque:

Raspberry Pi 0/1 Raspberry Pi 2/3
rpi1 rpi2

Si recibe el error Illegal Instructioncuando se inicia o si solo se inicia en el terminal, eligió la imagen SD incorrecta o la imagen se corrompió en la descarga o extracción.

2-Extraer

Una vez que haya descargado la imagen de su tarjeta SD, debe extraerla utilizando un programa como 7-Zip . Extraerá el archivo .gz descargado y el archivo extraído será un archivo .img .

Para extraer de la línea de comando, puede escribir lo siguiente en una ventana de Terminal, colocando X con la versión que descargó:

gunzip retropie-4.X.X-rpi2_rpi3.img.gz

3- Crear la imagen

Para instalar la imagen RetroPie SD en su tarjeta MicroSD. (Es posible que necesite un lector de tarjetas MicroSD para conectarlo a su ordenador)

    1. Para Windows puede utilizar un Etcher o Win32DiskImager
    2. Para macOS puedes usar Etcher o Apple Pi Baker
    3. Para Linux puede usar el ddcomando o Etcher

 

Nota: RetroPie está construido sobre Raspbian Stretch (un sistema operativo basado en Linux para Raspberry Pi) y, como tal, la partición en la tarjeta SD es EXT4 (un sistema de archivos de Linux) que no es visible en los sistemas Windows, por lo que la tarjeta se mostrará como un tamaño más pequeño de lo habitual y no podrá ver todo en la tarjeta, pero está todo ahí. Podrá acceder al sistema de archivos a través de la red como se describe en la sección de transferencia de roms a continuación.

4-Insertar la tarjeta SD en la Raspberry  y  Configurar controladores

Uan vez creada la imagen ,  insertaremos la microsd   en la Raspberry  , conectaremos los perifericos  y alimentaremos esta 

En el primer arranque, su sistema de archivos se expandirá automáticamente, luego se le dará la bienvenida con la siguiente pantalla: este menú configurará sus controles para Emuladores de Emulationstation y RetroArch:

pantalla de bienvenida

Mantenga presionado cualquier botón en su teclado o gamepad y el nombre aparecerá en la parte inferior y luego se abrirá en un menú de configuración:

bienvenidospantallajuegopadname

Siga las instrucciones en pantalla para configurar tu gamepad. Si se queda sin botones, mantenga presionado un botón para omitir cada botón no utilizado. Cuando llegue a OK presione el botón que ha configurado como “A” .

bienvenidopantallajuegoconfigura

Si desea configurar más de un controlador, puede hacerlo desde el menú de inicio de emulationstation.

Consulte los siguientes diagramas para referencia:

Controlador SNES
snes_controller
Controlador XBox 360
xbox360_controller
Controlador PS3
ps3_controller

Tecla de acceso directo

El botón Hotkey le permite presionarlo en combinación con otro botón para acceder a funciones como guardar, cargar y salir de emuladores. Se sugiere utilizar el botón Seleccionar como tecla de acceso rápido. El siguiente cuadro muestra las combinaciones de teclas de acceso rápido predeterminadas. Por ejemplo, si elige Seleccionar como su tecla de acceso rápido, eso significa que mantiene presionada la tecla Seleccionar mientras presiona el otro botón para ejecutar el comando.

Nota Las combinaciones de teclas rápidas son específicas de los emuladores basados ​​en retroarch / libretro.

Combinación de teclas de acceso rápido Acción
Tecla de acceso directo + Inicio Salida
Tecla de acceso directo + hombro derecho Salvar
Tecla de acceso directo + hombro izquierdo Carga
Tecla de acceso directo + derecha Aumento de la ranura del estado de entrada
Tecla de acceso directo + izquierda Disminución de la ranura del estado de entrada
Tecla de acceso directo + X Menú RGUI
Tecla de acceso directo + B Reiniciar

EmulationStation

¿Dónde están los sistemas?
Cuando vea EmulationStation por primera vez, es posible que se pregunte por qué no ve sistemas como SNES o Game Boy (no se preocupe), están instalados en el sistema, las roms solo deben agregarse a sus respectivas carpetas de rom antes de que sean visibles. La transferencia de roms se describe en los siguientes pasos.
primer arranque

Wifi

Si desea utilizar wifi para transferir roms a través de la red en lugar de una memoria USB o un cable Ethernet, deberá configurar su wifi- que también se puede hacer desde el menú Retropie en la estación de emulación:

Conéctese a la red Wifi:
wifi1
Elija su SSID de una lista:
wifi2
Escriba su contraseña de Wifi (puede tomar un momento conectarse)
wifi3
Una vez configurado, verá su dirección IP
wifi4

Para más opciones de configuración de WiFi, vea esta página AQUÍ

Instalar emuladores adicionales

En RetroPie 4.0+, no todo está instalado por defecto. Las imágenes prefabricadas contienen los mejores emuladores de trabajo para cada sistema compatible con el hardware. Esto debería cubrir todo lo que la mayoría de los usuarios estarían haciendo. Puertos como terremoto y fatalidad y algunos otros emuladores como ScummVM se pueden instalar más tarde.

El software se puede instalar desde el script RetroPie-Setup, al que se puede acceder desde el menú RetroPie en EmulationStation. Una vez allí, puede navegar hasta “Administrar paquetes”, donde verá varias secciones. En cada sección hay listas de paquetes que se pueden instalar (y mostrará lo que está instalado actualmente). Los paquetes adicionales estables se encuentran en la sección “Opcional”, con más paquetes inestables listados en experimental. Los paquetes se ordenan primero por tipo (emuladores / núcleos de libretro / puertos), luego alfabéticamente. Al seleccionar un paquete, puede elegir instalarlo o eliminarlo. Algunos paquetes también tienen configuraciones adicionales.

Transfiriendo Roms

Debido a la naturaleza / complejidad de la Ley de Derechos de Autor / Propiedad Intelectual, que difiere significativamente de un país a otro, los ROM no se pueden proporcionar con RetroPie y deben ser proporcionados por el usuario. Solo debes tener ROM de juegos que poseas.

Hay tres métodos principales para transferir roms:

USB

  • (asegúrese de que su USB esté formateado en FAT32 o NTFS)
  • primero crea una carpeta llamada retropieen tu memoria USB
  • conéctelo al pi y espere a que termine de parpadear
  • desconecte el USB y conéctelo a una computadora
  • agregar las roms a sus respectivas carpetas (en la retropie/romscarpeta)
  • conéctelo nuevamente a la Raspberry Pi
  • espera a que termine de parpadear
  • actualizar emulationstation seleccionando reiniciar emulationstation en el menú de inicio

Vea este video como referencia:

Transferencia de ROM usando una unidad USB

SFTP

NOTA : debe habilitar SSH para que SFTP funcione.

  • Con cable (necesita cable de ethernet)
  • Inalámbrico (necesita dongle wifi) Hay muchos programas SFTP, para Windows, muchas personas usan WinSCP para Mac, puede usar algo como Cyberduck
winscp

Nombre de usuario predeterminado: pi

Contraseña predeterminada: raspberry

También puede iniciar sesión como root si desea cambiar más archivos que solo las roms, pero primero debe habilitar la contraseña de root 

Acciones de samba

  • si en Windows escriba \\retropieen la carpeta de la computadora. También puede reemplazar retropiecon la dirección IP de su Raspberry Pi
samba
  • si en MAC OS X abre Finder, selecciona el menú “Ir” y “Conectar al servidor …”. Escriba smb://retropiesmb://retropie.localy presione “Conectar”. Luego elija Invitado y presione “Conectar” nuevamente.

AUDIO

En general, el audio RetroPie funcionará de inmediato sin ningún ajuste, pero si tiene problemas de audio.  Lo más probable es que necesite visitar la página de Problemas de sonido si está utilizando un dispositivo de audio USB o si está utilizando un dispositivo de audio complementario RPi HAT del mercado de accesorios (como una tarjeta de sonido Justboom).

¡A JUGAR!

Después de agregar sus roms, debe reiniciar la estación de emulación para que se muestren. Puede reiniciar emulationstation desde el menú de inicio, o reiniciando su pi con sudo reboot.

Consulte el resto de los documentos para obtener información más detallada sobre emuladores individuales, configuraciones avanzadas, etc. Si aún no puede resolverlo, la comunidad de RetroPie es muy útil en el foro .

El Proyecto RetroPie es mantenido principalmente por unos pocos desarrolladores que desarrollan el proyecto en su tiempo libre.  A medida que se familiarice con RetroPie, pague y ayude a otros en el foro. El Proyecto RetroPie existe  debido a las numerosas contribuciones de la comunidad.

Como emular un mando con Arduino


A veces   puede ser  interesante emular del comportamiento  de un mando infrarrojo  con el fin de automatizar procesos  que de otra manera  seria mucho mas complejo . Como ejemplo típico de dispositivos que podemos controlar vía infrarojos, hablamos de  reproductores de cámaras, televisores, DVD, VCR, lectores de blueray, equipos de sonidos, descodificadores  y  un largo etcétera 

Aunque pueda parecer descabellado repetir las mismas señales desde una placa Arduino , lo cierto  es que no es descabellado querer emular este comportamiento , porque  podemos  hacer cosas  que seria muy dificultoso  sin la ayuda del procesamiento de señales de infrarojos como por ejemplo  encender automáticamente  el Aire Acondicionado  cuando la temperatura  suba un determinado valor , o se desconecte a una determinadas horas ,  se apague  cuando no haya movimiento  y un largo  etcétera 

Como paso previo  debemos analizar las señales infrarrojas emitidas por el mando usado para el control de ese dispositivo  por lo que deberemos averiguar  cómo recibir los códigos y luego una vez conocidas intentar ver como transmitirlas.

Para nuestra tarea necesitamos :

  • 1 x Arduino (cualquier versión sirve  siempre que pueda procesar señales  “PWM” )
  • 1 x LED IR   (usted puede conseguir éstos de cualquier TV remoto)
  • 1 x receptor IR (usted puede conseguir éstos de cualquier TV remoto)

 

Preparación para recibir señales

Para el análisis  de las señales infrarrojas  producidas por el mando del  dispositivo a controlar en primer lugar necesitaremos  un receptor de infrarrojos ,   que bien  puede proceder de   uno reciclado de cualquier viejo proyecto que ya no utilice  o bien adquirido específicamente  en el comercio

Una interesante opción son los famosos kits para Arduino que integran por unos 4€  todo los necesario para habilitar la comunicación en los dos sentidos  gracias a un led IRDa, un receptor IRDA  y un mando para pruebas.

Kit Modulo Receptor Infrarojo IR Protocolo Nec con Mando a Distancia Arduino

Como sugerencia  para captar el código correcto , deberíamos poner el receptor IR y el mando en una caja opaca  o algo que sea oscuro  lo cual  asegurará que habrá el mínimo de interferencias y  podremos tener el código más claro para que no tengamos que programar  nuestro  Arduino  muchas veces para una simple tarea. También, asegúrese de que estar alejados de personas viendo la televisión.

Realmente el circuito es bastante sencillo pues únicamente tendremos que alimentar con 5v DC  ( que podemos tomar directamente desde nuestro Arduino )   y luego conectar la salida del receptor digital al pin digital A2 de Arduino

 

Picture of Preparing to Receive Signals

Una vez montado el simple circuito del receptor de infrarrojo es hora de  subir el programa a su Arduino  para  poder descodificar la señal infrarroja .

El siguiente programa utiliza el Arduino y un PNA4602 para descifrar IR recibido lo cual se  puede utilizar para hacer un receptor de infrarrojos. (buscando un código en particular) o transmisor (pulsando un LED IR a ~ 38KHz para el duraciones detectadas,

Este código es de dominio público (visite http://www.ladyada.net y adafruit.com), pero en esta ocasión se ha traducido para que sea mas legible y fácil de entender:


// Necesitamos usar los métodos de lectura de pin ‘raw’  porque el tiempo es muy importante aquí y el digitalRead () es un  procedimiento s más lento!

#define IRpin_PIN PIND
#define IRpin 2

// el pulso máximo que escucharemos: 65 milisegundos es mucho tiempo
#define MAXPULSE 65000

// lo que debería ser nuestra resolución de tiempo, más grande es mejor ya que es más ‘preciso’ – pero demasiado grande y no se conseguirá  tiempo exacto
#define RESOLUTION 20

// almacenaremos hasta 100 pares de pulsos (esto son muchos )
uint16_t pulses[100][2]; // par es pulso alto  y bajo 
uint8_t currentpulse = 0; // indice para pulsos que estamos almacenando

void setup(void)

{
Serial.begin(9600);
Serial.println(“Ready to decode IR!”);
}

void loop(void)

{

// tiempo de almacenamiento temporal
uint16_t highpulse, lowpulse;

//empezar sin pulso 
highpulse = lowpulse = 0;

//esto es demasiado lento!
while (IRpin_PIN & (1 << IRpin)) {
// pin esta a nivel alto

// continúa otros microsegundos
highpulse++;
delayMicroseconds(RESOLUTION);

// Si el pulso es demasiado largo, ‘se agotó el tiempo’ – o bien nada / se recibió o el código está terminado, así que imprima lo que  hemos obtenido hasta ahora, y luego reiniciamos
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
// no nos detuvimos, así que escondamos la lectura
pulses[currentpulse][0] = highpulse;

// lo mismo que arriba
while (! (IRpin_PIN & _BV(IRpin))) {
// pin esta aun bajo
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
printpulses();
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;

// leemos un pulso alto-bajo con éxito, ¡continuamos!
currentpulse++;
}

void printpulses(void) {
Serial.println(“\n\r\n\rReceived: \n\rOFF \tON”);
for (uint8_t i = 0; i < currentpulse; i++) {
Serial.print(pulses[i][0] * RESOLUTION, DEC);
Serial.print(” usec, “);
Serial.print(pulses[i][1] * RESOLUTION, DEC);
Serial.println(” usec”);
}
}


Una vez que hemos subido el código anterior  y  todo está configurado correctamente, abrir el serial monitor haciendo clic en el botón en el programa de Arduino que es el botón de un círculo en la imagen y  ya estára en marcha así que ahora usted necesitará encontrar un control remoto que desee usar para controlar algo con Arduino

El proceso  esquemáticamente  a seguir es el siguiente :

  1. Encontrar el mando a distancia del dispositivo  que quiere controla
  2. Ejecutar el código del  receptor anteriormente citado
  3. Presione el botón del mando cuyo  código desea obtener 
  4. Ver el Monitor Serial
  5. Pegar el todo el código del monitor serie  en un editor de texto 
  6. Repetir los paso 3, 4 6  con todos los botones del mando que desee descodificar 

 Interpretando las señales

Una vez siga la secuencia de paso anteriores recibirá un montón de números seguidos por “usecs” o “usec”.
Asegúrese de que ha copiado la señal que se desea formateando la salida para más fácil referencia.

Se verá algo como esto:
500 usec, 300 usec
600 usec, usec 1200

Pero habrá números mucho más que eso.

Ahora en el programa emisor  verá esto bastantes veces:

delayMicroseconds();
pulseIR();

Es decir tenemos que  tomar el primer número y poner paréntesis en delayMicroseconds(“here”); el  valor obtenido en el monitor
y a su vez   tomar el segundo número de la misma línea como el de la delayMicroseconds()  valorar y poner en el paréntesis de pulseIR(); valor.

Veamos otro ejemplo .Si conseguimos esto en el monitor serial:

OFF ON
1660 usec, usec 580
1640 usec, usec 560

Ahroa para poner los  correspondiente valores en sus áreas correspondientes lo haremos asi :

delayMicroseconds(1660);
pulseIR(580);
delayMicroseconds(1640);
pulseIR(560);

Como puede apreciar ,la  tarea de transcripción  es muy fácil.

Una vez que tenga los códigos que desee, abra un nuevo  archivo IR_SEND.pde en el programa de Arduino y luego tendremos que  poner  los valores que tiene del monitor de serie entre paréntesis haciéndolo  del mismo modo  que hemos visto anteriormente .

Ahora, una vez que tenemos los códigos que desea y haya cargado el programa con la señal que desea enviar, todo lo que tiene que hacer es conectar el LED IR al pin 13 y luego a tierra  No necesita la resistencia si tiene un Duemilanove Arduino porque tiene una resistencia integrada para PIN 13, por lo que no tiene que preocuparse.


Como ejemplo veamos este código cuando se presiona el botón para subir el canal en un  control remoto de Comcast. . Aquí está el código de Serial Monitor: Recibido:

OFF  ON
36328 usec, 280 usec
820 usec, 300 usec
1580 usec, 320 usec
640 usec, 240 usec
2740 usec, 240 usec
1280 usec, 240 usec
1240 usec, 240 usec
1120 usec, 240 usec
2600 usec, 240 usec
12740 usec, 240 usec
840 usec, 240 usec
980 usec, 240 usec
700 usec, 240 usec
700 usec, 240 usec
720 usec, 240 usec
2460 usec, 260 usec
700 usec, 240 usec
700 usec, 240 usec
14904 usec, 260 usec
820 usec, 240 usec
1660 usec, 240 usec
700 usec, 260 usec
2740 usec, 240 usec
1240 usec, 240 usec
1260 usec, 240 usec
1100 usec, 240 usec
2620 usec, 240 usec
12720 usec, 260 usec
840 usec, 220 usec
2080 usec, 240 usec
1780 usec, 260 usec
700 usec, 240 usec
700 usec, 240 usec
2480 usec, 240 usec
700 usec, 240 usec
700 usec, 240 usec

Aquí está el código realizado a partir de los datos en bruto anteriores  pero no se  asociado al código  

En el siguiente  programa   se ha introducido  un detalla original ; Arduino cambiará el canal cada diez segundos para que se puedan hacer otras cosas , Por ejemplo mientras se ve televisión y esta haciendo otras cosa  así  no tendrá que cambiar el canal de modo que el sw  recorrerá los canales para que tenga las manos libres. (todos sabemos que presionar un botón es tan difícil, ¿por qué no hacerlo de forma automática?)

 

He aquí el programa realizado por Wally_Z:


int IRledPin =  13;    // LED conectado al pin digital 13

// El método setup () se ejecuta una vez, cuando comienza el boceto

void setup()   {               
  // initializa  el pin como salida :
  pinMode(IRledPin, OUTPUT);     

  Serial.begin(9600);
}

void loop()                    
{
  SendChannelUpCode();

  delay(20*1000);  // espera veinte segundos (20 segundos * 1000 milisegundos) Cambia este valor para diferentes intervalos.

}

// Este procedimiento envía un pulso de 38KHz al IRledPin  para un cierto  numero de microsegundos. Usaremos esto siempre que tengamos que enviar códigos.

void pulseIR(long microsecs)

{
  // contaremos desde la cantidad de microsegundos que se nos dice que esperemos

  cli();  // esto apaga cualquier interrupción de fond

  while (microsecs > 0) {
   // 38 kHz tiene aproximadamente 13 microsegundos de alto y 13 microsegundos de bajo
   digitalWrite(IRledPin, HIGH);  //Esto lleva alrededor de 3 microsegundos
   delayMicroseconds(10);         // esperar 10 microseconds
   digitalWrite(IRledPin, LOW);   // esto toma sobre 3 microseconds
   delayMicroseconds(10);         // esperar   10 microseconds

   // asi que  26 microseconds  todo junto
   microsecs -= 26;
  }

  sei();  // esto devuelve el control
}

void SendChannelUpCode()

{
  // Este es el código para CHANNEL + para TV COMCAST.
 
  delayMicroseconds(36328);      //Tiempo libre (columna IZQUIERDA)      
  pulseIR(280);                               //Tiempo en (columna DERECHA) <——- NO MEZCLAR ESTOS ARRIBA
  delayMicroseconds(820);
  pulseIR(300);
  delayMicroseconds(1580);
  pulseIR(320);
  delayMicroseconds(640);
  pulseIR(240);
  delayMicroseconds(1280);
  pulseIR(240);
  delayMicroseconds(1240);
  pulseIR(240);
  delayMicroseconds(1120);
  pulseIR(240);
  delayMicroseconds(2600);
  pulseIR(240);
  delayMicroseconds(12740);
  pulseIR(240);
  delayMicroseconds(840);
  pulseIR(240);
  delayMicroseconds(980);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(720);
  pulseIR(240);
  delayMicroseconds(2460);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(14904);
  pulseIR(240);
  delayMicroseconds(820);
  pulseIR(240);
  delayMicroseconds(1600);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(260);
  delayMicroseconds(2740);
  pulseIR(240);
  delayMicroseconds(1240);
  pulseIR(240);
  delayMicroseconds(1260);
  pulseIR(240);
  delayMicroseconds(1100);
  pulseIR(240);
  delayMicroseconds(2620);
  pulseIR(240);
  delayMicroseconds(12720);
  pulseIR(260);
  delayMicroseconds(840);
  pulseIR(220);
  delayMicroseconds(2080);
  pulseIR(240);
  delayMicroseconds(1780);
  pulseIR(260);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(2480);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
  delayMicroseconds(700);
  pulseIR(240);
}

 

Via Instrucables.com

 

 

 

Proyecto de navidad: construya un piano con teclas de frutas


No espere poder realizar una sonata para piano de Beethoven en este proyecto , pero  hoy vamos a cambiar de registro  en cuanto los contenidos que compartimos en este blog ,   enfocándonos en  un proyecto  muy sencillo  pensado sobre  para que los mas pequeños aprendan electrónica  y programación de un modo divertido   usando la excusa   del  las frutas para activar 8 notas  ¡y, no se preocupe si no tiene plátanos en este momento también  debería funcionar con cualquier fruta o verdura !.


El fundamento del circuito es a realmente  sencillo  pues basta  conectar a  cada fruta con una resistencia de 2,2 Mohmios ( o similar ) a una entrada analógica diferente y usar una referencia de GND como polo común    y con esto ya tenemos  junto con cualquier Arduino los fundamentos para hacer el piano frutal pues la electricidad  fluyera cuando toquemos la fruta para cerrar el circuito y, cuando lo haga, lo leeremos desde  una  Placa Arduino  pudiendo desencadenar un evento  que en este caso, sera  reproducir una nota  que sacáramos por un pin digital

Es decir cuando , usando un  pin digital de  Arduino configurado como entrada, si lo conectamos  a  un objeto con cierta resistencia , esto hará que la resistencia entre esta  y masa se desplace hacia GND (es decir a 0 V) porque el circuito está completo , el programa  leerá ese valor binario ( es decir un cero lógico)  y este evento provocara   que  Arduino reproduzca  una nota.

Para hacer el piano  de frutas  necesitará:

  • Una placa Arduino, puede usar Arduino  UNO pero también puede usar cualquier placa compatible  procedente del mercado oriental .
  • Ocho  resistencias de alto valor  de  2,2 Mega ohmios, aunque  debería funcionar con cualquier valor  entre 1 Mega-ohmios  y 10 Mega-ohmios . Si no tiene  estos valores también puede asociar varias en serie o en paralelo  hasta obtener  valores parecidos (al usar 8 entradas al menos necesitaremos pues 8 resistencias)
  • Una resistencia de 220 ohmios para no proteger  el altavoz ,( si es un altavoz de 1W  o mas puede  prescindir de esta).
  • Un altavoz de 8 ohmios.
  •  Idealmente una placa de prueba para  conectar fácilmente los cables y las resistencias al Arduino.
  • Cables rígidos  para las conexiones.
  • !Su fruta o verdura favorita!( cuanto mas agua tenga mejores resultados obtendremos)

En cuanto al circuito , vamos a usar un Arduino Uno  configurando los pines digitales 2,3,4,5,6,7 y 8, como entradas digitales  y el pin digital 12 como salida digital.  También se puede usar cualquier placa compatible  con Arduino  procedente del mercado oriental y por supuesto también   una placa  Netduino en  todas sus variantes ( tendra que adaptar el sw)

El circuito es  muy sencillo  pues  consintiendo básicamente   en   8  entradas      y una   salida.   A las entradas digitales conectaremos 8  resistencias de pull-up de 2,2 Meg Ohm entres estas y VCC(+5V), conexión esta ultima que obtendremos directamente de la propia placa de Arduino. Como se puede deducir,  estas  entradas digitales se conectan   a  una fruta  clavando el hilo en esta . Cuando tocamos esta  fruta ,al estar conectada  a  una entrada de Arduino , llevaremos  a nivel lógico BAJO etas   al conectar  a tierra cada fruta  que a su vez esta  conectada a cada entrada digital.

El circuito se complementa con una resistencia de  220 ohmios, conectada desde el pin 12 a un altavoz de 8 ohmios. Esta resistencia perfectamente se puede suprimir si conecta directamente un altavoz  y no un amplificador   

En cuanto al sketh o programa para nuestro Arduino vamos a usar el ejemplo de E.Ballew escrito en Junio de 2018 que toma prestados  las librerías de tono de Tom Igoe (puede ver mas  ejemplos  en http://arduino.cc/en/Tutorial/Tone ) utilizando  sus archivos pitches.h  con una  clausula  include     para las frecuencias de las notas.

Este código implementa una sola octava de un piano simple, es decir solo reproduce  8 sonidos diferentes .

En primer lugar en el bloque Setup  se definen los pines de entradas digitales  asi como sus correspondientes notas para lo cual se define una matriz  unidimensional llamada  digInput   

int digInput[] = { 2, 3, 4, 5, 6, 7, 8, 9 };

También se define  cual va a ser el pin digital que va a usarse como salida  para conectar el altavoz ( el pin 12)

int toneOut = 12;

Definida el array  de los pines digitales  que usaremos como entrada digital  y la variable para el pin digital de salida    simplemente  toca asignar esta como entradas   mediante la clausula  pinMode(xx INPUT )  recorriendo el array  con un  bucle for  . También para  terminar definiremos  la salida  con la clausula pinMode(yy, OUTPUT);  resultando el siguiente código:

void setup() { ;

 for (int i = 0; i < numKeys; i++)

{ pinMode(digInput[i], INPUT);

}

pinMode(toneOut, OUTPUT); }


En cuanto al   bucle principal  leemos  mediante bucle el estado de las 8 teclas de frutas mediante la instrucción sensorVal = digitalRead(digInput[j])    ,  de modo   que si detectamos un nivel bajo   reproducimos la nota asociadas a  esa tecla  mediante la instrucción  tone(toneOut, myNote[j]); 

Asimismo  debemos  evitar  falso sonidos  para lo cual  incrementaremos la variable kepressed ,que inicializamos a cero en cada pasada del bucle para  silenciar el altavoz en cuanto sepamos que no se ha pulsado ninguna fruta  

int keypressed = 0;

……

if (sensorVal == LOW)

{ ++keypressed;

// increment keypressed

digitalWrite(13, HIGH);

tone(toneOut, myNote[j]);

}

if (keypressed == 0) { noTone(toneOut); }


También  a  efectos de depuración   realizamos un retardo entre cada interacción de 250ms  mediante la clausula  delay(250);

Al  bucle principal  ademas   efectos de depuración se añade una salida a de monitor en serie (que deberemos configurar  a 9600  baudios   )  , para probar los 8 niveles lógicos correspondientes   a las 8 entradas binarias .


El código final resultante  de  todas las consideraciones anteriores es el siguiente:

#include "pitches.h"

int numKeys = 8;
int digInput[] = { 2, 3, 4, 5, 6, 7, 8, 9 };
int myNote[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 };
int toneOut = 12;

void setup() {
  // arrnacar conexion serie
  Serial.begin(9600);
  // Configurar  pines  digitales como entrada 
  for (int i = 0; i < numKeys; i++) {
    pinMode(digInput[i], INPUT);
  }
  pinMode(toneOut, OUTPUT);
}

void loop() {
  
  int keypressed = 0;
  for (int j = 0; j < numKeys; j++) {
    int sensorVal = digitalRead(digInput[j]);
    String outStr = String("K");
      outStr = String(outStr + j);
      outStr = String(outStr + ": ");
      outStr = String(outStr + sensorVal);
    if (sensorVal == LOW) {
      ++keypressed;  // incrementar keypressed
      digitalWrite(13, HIGH);
      tone(toneOut, myNote[j]);
    }
    //outStr = String(outStr + ":");
    //outStr = String(outStr + keypressed);
    Serial.print(outStr);
    Serial.print("\t");
  }
  Serial.println("");
  if (keypressed == 0) {
    noTone(toneOut);
  }
  delay(250);
}






Fichero pitches.h

/*************************************************
* Public Constants
*************************************************/


#define NOTE_C4 262

#define NOTE_D4 294

#define NOTE_E4 330
#define NOTE_F4 349

#define NOTE_G4 392

#define NOTE_A4 440

#define NOTE_B4 494
#define NOTE_C5 523

Obviamente una vez hayamos depurado el circuito no necesitamos la salida por consola del estado de las entrada binarias , por lo que el programa puede quedar reducido las
siguientes lineas:


#include “pitches.h”

int numKeys = 8;
int digInput[] = { 2, 3, 4, 5, 6, 7, 8, 9 };
int myNote[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 };
int toneOut = 12;

void setup() {
for (int i = 0; i < numKeys; i++) {
pinMode(digInput[i], INPUT);
}
pinMode(toneOut, OUTPUT);
}

void loop() {
int keypressed = 0;
for (int j = 0; j < numKeys; j++) {
int sensorVal = digitalRead(digInput[j]);
if (sensorVal == LOW) {
++keypressed; 
digitalWrite(13, HIGH);
tone(toneOut, myNote[j]);
}
}
if (keypressed == 0) {
noTone(toneOut);
}
delay(250);
}









Por cierto el concepto , aunque sirve para emular un mini órgano también puede servir para emular un miniteclado , un pulsador especial , o cualquir cosa que ncesiste ser activado mediante algo diferente