Introducción
¿Necesitas unos pulsadores para tu proyecto con un microcontrolador?
Lo puedes hacer muy fácilmente, simplemente imprimiendo una hoja de papel a la que se fijarán con cinta adhesiva unos cables.
NOTA: Sólo funciona con hojas impresas en impresora de inyección de tinta.
Este proyecto recoje la idea de unos documentos de CienciaRedCreativa:
http://www.cienciaredcreativa.org/informes/electricidad%201.pdf
http://www.cienciaredcreativa.org/informes/electricidad%202.pdf
http://www.cienciaredcreativa.org/informes/electricidad%203.pdf
http://www.cienciaredcreativa.org/informes/electricidad%204.pdf
En estos documentos se demuestra que:
"Las bandas realizadas sobre un papel con una impresora de inyección de tinta son ligeramente conductoras, y que a medida que aumenta la longitud de la banda, la resistencia y que a medida que aumenta el ancho de la banda la resistencia eléctrica disminuye".
Funcionamiento
Aprovechándonos de estas características, podemos imprimir sobre un papel, unas bandas que actúen como un divisor de tensión y si las puenteamos, modificamos el valor del divisor de tensión. Fijándonos en ese valor, podemos definir el pulsador apretado.
En el esquema superior representamos mediante resistencias el valor ohmnico de la banda impresa.
El dibujo impreso es el siguiente:
En esta imagen vemos que hay dos bandas verticales, la primera conectada en sus extremos a 5v y a una entrada analógica de un micro, y la segunda a masa.
Al doblar el papel, las bandas horizontales se solapan, y al pulsar hacen contacto, modificando los valores del divisor de tensión que se crea con la resistencia de las bandas.
Realización
Imprimiremos con una impresora de inyeccion de tinta (en máxima calidad y sólamente en escala de grises) el documento PaperTeclado_00 disponible en el apartado de descargas al final de esta página.
Si dispones de un tester puedes medir la resistencia entre los extremos de una banda; si es menor de 200K funcionará, si nó el convertidor analógico se vuelve inestable. En este caso es necesario añadir más tinta a las bandas. Esto lo puedes hacer imprimiendo sobre la hoja anterior el documento PaperTeclado_00bis,:
NOTAS: En las pruebas que he realizado con una reimpresión de las bandas es suficiente, pero con dos perfecto (80K).
Antes de meter de nuevo la hoja en la impresora, deja un tiempo prudencial que se seque la tinta.
Hacemos dos pequeños cortes en el lateral para los cables:
Para facilitar el pliegue de la hoja, sobre un soporte blando puedes marcar con un bolígrafo las líneas de doblado
La línea de doble punto se pliega hacia arriba, y la punto simple hacia abajo
Fijamos unos cables con cinta autoadhesiva (cello) , primero el de masa (negro):
Después el de señal (azul):
Nota: Fijate sobre todo en que no exista contacto directo entre los dos cables y que la cinta no invada la pista.
Y finalmente el 5v (rojo):
Y una vez de que hemos comprobado que funciona (esto es importante ;-) )
podemos pegarlo definitivamente (siempre aplicando adhesivo en zonas sin tinta) y protegerlo, pegando sobre el teclado un trozo de plástico autoadhesivo transparente (Aironfix).
Si utilizas un Arduino y realizas el siguiente montaje...
... con este programa podrás utilizar el PaperTeclado:
El programa muestra mediante pitidos que tecla se ha pulsado, también envía al terminal serie del PC el código del pulsador.
Para saber que tecla se ha pulsado, previamente hay que conocer que valores lee el micro al pulsar cada tecla, para ello puedes utilizar el propio programa, ya que envía los valores al terminal serie. Los pasos para calibrar el teclado son los siguientes:
Para saber que tecla se ha pulsado, previamente hay que conocer que valores lee el micro al pulsar cada tecla, para ello puedes utilizar el propio programa, ya que envía los valores al terminal serie. Los pasos para calibrar el teclado son los siguientes:
- Con el programa en funcionamiento y el teclado conectado, mira el valor del terminal cuando no se aprieta ninguna tecla, y anota dicho valor.
- Haz lo mismo, apuntando el valor promedio que se lee al pulsar cada tecla.
- Bien con la hoja de cálculo (en el directorio Docs del archivo de descargas), o a mano calcula los valores intermedios entre los anotados (X1+X2)/2.
- Estos valores habrá que colocarlos en el programa en las instrucciones "if" correspondientes.
/*
PaperTeclado
Lee el estado de un teclado compuesto por un divisor de tensión modificable,
realizado con una hoja de papel impresa por un impresora de inyección
de tinta. Mediante pulsadores de papel se cambia la geometría de la pista
de tinta y por lo tanto su resistencia a masa o a 5 voltios.
El programa mostrará mediante pulsaciones de un led colocado entre el pin
13 y masa, la tecla pulsada.
El circuito:
* Salida de señal "PaperTeclado" (cable azul) conectada a la entrada analógica 0
* Cable rojo de "PaperTeclado" a 5v
* Cable negro de "PaperTeclado" a masa. (GND)
* Anodo del LED (pata larga) conectada a la salida digital 13 a través de una
resistecia de 640 Ohmnios.
* Cátodo del LED (pata corta) conectada a masa
* Nota: como la mayoría de Aduinos ya incorporan un LED conectado
al pin 13 en la placa, este led es opcional.
Creado por Iñigo Zuluaga
11-Octubre-2010
http://txapuzas.blogspot.com
*/
int TecladoPin = 0; // Selecciona la entrada para el teclado
int ledPin = 13; // Selecciona el pin del LED
int TecladoValor = 0; // Variable para almacenar el valor analógico del teclado
int Pulsador=0; // Variable que indica el pulsador accionado
int Nlecturas=0; // Variable para almacenar el número de lecturas realizadas
int Margen=5; // Número de veces que hay que leer un mismo valor para aceptarlo
void setup() {
// pinMode(ledPin, OUTPUT); // declara ledPin como salida
pinMode(TecladoPin,INPUT);
// digitalWrite(TecladoPin, LOW); // desactiva la resistencia pullup
Serial.begin(9600); // configura la conexión serie
}
void loop() {
//delay(10);
TecladoValor = analogRead(TecladoPin); // lee el valor analógico del teclado
//delay(10);
Serial.print ("Valor leido: " );
Serial.print (TecladoValor);
Serial.print (", Pulsador: " );
Serial.print (Pulsador);
Serial.print (", Lecturas: " );
Serial.println (Nlecturas );
if (TecladoValor>1000) { // Si el valor leído es mayor que pulsador 3
if (Pulsador==0){ // y no se ha pulsado nada
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=0; // desactiva el pulsador
}
}
else if (TecladoValor>600) { // Si se ha pulsado el 3
if (Pulsador==3){ // y estaba activo el pulsador 3
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 3 pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=3; // activa el pulsador 3
}
}
else if (TecladoValor>350) { // Si se ha pulsado el 2
if (Pulsador==2){ // y estaba activo el pulsador 2
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 2, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=2; // activa el pulsador 2
}
}
else if (TecladoValor<350) { // Si no se ha pulsado el 1
if (Pulsador==1){ // y estaba activo el pulsador 1
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 1 pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=1; // activa el pulsador 1
}
}
if (Nlecturas > Margen) { // Si se ha leído varia veces el mismo valor
for (int cont=0; cont < Pulsador; cont++) { // Repite el Nº depulsador
digitalWrite(ledPin, HIGH); // Enciende el LED
delay(200); // Espera 200 milisegundos
digitalWrite(ledPin, LOW); // Apaga el LED
delay(200); // Espera 200 milisegundos
}
Nlecturas=0;
}
}
En el archivo de descargas dispones de otro documento (PaperTecladoB) con varios tipos de teclados:
Del mismo modo que antes, tal vez necesites recargar de tinta las pistas, para ello reimprime sobre la hoja anterior el documento siguiente (PaperTecladoB_Bis):
Una vez reimpreso podemos hacer los siguientes teclados:
PaperTecladoOnOff.pde
El montaje sería muy similar al anterior el siguiente:
El programa enciende o apaga un led situado en el pin 13 en función de la tecla pulsada. (también envía al terminal serie del PC el código del pulsador.)
/*
PaperTeclado_OnOff
Lee el estado de un teclado compuesto por un divisor de tensión modificable,
realizado con una hoja de papel impresa por un impresora de inyección
de tinta. Mediante pulsadores de papel se cambia la geometría de la pista
de tinta y por lo tanto su resistencia a masa o a 5 voltios.
El programa mostrará mediante pulsaciones de un led colocado entre el pin
13 y masa, la tecla pulsada.
El circuito:
* Salida de señal "PaperTeclado" (cable azul) conectada a la entrada analógica 0
* Cable rojo de "PaperTeclado" a 5v
* Cable negro de "PaperTeclado" a masa. (GND)
* Anodo del LED (pata larga) conectada a la salida digital 13 a través de una
resistecia de 640 Ohmnios.
* Cátodo del LED (pata corta) conectada a masa
* Nota: como la mayoría de Aduinos ya incorporan un LED conectado
al pin 13 en la placa, este led es opcional.
Creado por Iñigo Zuluaga
11-Octubre-2010
http://txapuzas.blogspot.com
*/
int TecladoPin = 0; // Selecciona la entrada para el teclado
int ledPin = 13; // Selecciona el pin del LED
int TecladoValor = 0; // Variable para almacenar el valor analógico del teclado
int Pulsador=0; // Variable que indica el pulsador accionado
int Nlecturas=0; // Variable para almacenar el número de lecturas realizadas
int Margen=2; // Número de veces que hay que leer un mismo valor para aceptarlo
void setup() {
pinMode(ledPin, OUTPUT); // declara ledPin como salida
pinMode(TecladoPin,INPUT);
digitalWrite(TecladoPin, LOW); // desactiva la resistencia pullup
Serial.begin(9600); // configura la conexión serie
}
void loop() {
// delay(10);
TecladoValor = analogRead(TecladoPin); // lee el valor analógico del teclado
// delay(10);
Serial.print ("Valor leido: " );
Serial.print (TecladoValor);
Serial.print (", Pulsador: " );
Serial.print (Pulsador);
Serial.print (", Lecturas: " );
Serial.println (Nlecturas );
if (TecladoValor>600) { // Si se ha pulsado el 1
if (Pulsador==1){ // y estaba activo el pulsador 1
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 1, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=1; // activa el pulsador 1
}
}
else if (TecladoValor>100) { // Si se ha pulsado el 2
if (Pulsador==2){ // y estaba activo el pulsador 2
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 2, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=2; // activa el pulsador 2
}
}
else if (TecladoValor<100) { // Si no se ha pulsado nada
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=0;
}
// delay (500);
if (Nlecturas > Margen) { // Si se ha leído varia veces el mismo valor
if (Pulsador==1){
digitalWrite(ledPin, HIGH); // Enciende el LED
}
if (Pulsador==2){
digitalWrite(ledPin, LOW); // Apaga el LED
}
Nlecturas=0;
Pulsador=0;
}
}
NOTA: La calibración es similar al ejemplo anterior
PaperTecladoN8.pde
La fabricación de éste teclado difiere un poco de los anteriores:
Las pistas se cierran por unos rectángulos que hacen de puente.
Los cables se fijan en el mismo lado del teclado, fíjate que no haya contacto entre ellos.
Pliegas las partes
Y ya tienes el teclado
El montaje es el siguiente:
Y el programa para Arduino...
/*
PaperTeclado_N8
Lee el estado de un teclado de 8 pulsadores compuesto por un divisor de tensión
modificable realizado con una hoja de papel impresa por un impresora de inyección
de tinta. Mediante pulsadores de papel se cambia la geometría de la pista
de tinta y por lo tanto su resistencia a masa o a 5 voltios.
El programa mostrará mediante pulsaciones de un led colocado entre el pin
13 y masa, la tecla pulsada.
El circuito:
* Salida de señal "PaperTeclado" (cable azul) conectada a la entrada analógica 0
* Cable rojo de "PaperTeclado" a 5v
* Cable negro de "PaperTeclado" a masa. (GND)
* Anodo del LED (pata larga) conectada a la salida digital 13 a través de una
resistecia de 640 Ohmnios.
* Cátodo del LED (pata corta) conectada a masa
* Nota: como la mayoría de Aduinos ya incorporan un LED conectado
al pin 13 en la placa, este led es opcional.
Creado por Iñigo Zuluaga
14-Octubre-2010
http://txapuzas.blogspot.com
*/
int TecladoPin = 0; // Selecciona la entrada para el teclado
int ledPin = 13; // Selecciona el pin del LED
int TecladoValor = 0; // Variable para almacenar el valor analógico del teclado
int Pulsador=0; // Variable que indica el pulsador accionado
int Nlecturas=0; // Variable para almacenar el número de lecturas realizadas
int Margen=2; // Número de veces que hay que leer un mismo valor para aceptarlo
void setup() {
pinMode(ledPin, OUTPUT); // declara ledPin como salida
pinMode(TecladoPin,INPUT);
// digitalWrite(TecladoPin, LOW); // desactiva la resistencia pullup
Serial.begin(9600); // configura la conexión serie
}
void loop() {
delay(10);
TecladoValor = analogRead(TecladoPin); // lee el valor analógico del teclado
if (TecladoValor>820) { // Si se ha pulsado el 1
if (Pulsador==1){ // y estaba activo el pulsador 1
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 1, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=1; // activa el pulsador 1
}
}
else if (TecladoValor>740) { // Si se ha pulsado el 2
if (Pulsador==2){ // y estaba activo el pulsador 2
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 2, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=2; // activa el pulsador 2
}
}
else if (TecladoValor>640) { // Si se ha pulsado el 3
if (Pulsador==3){ // y estaba activo el pulsador 3
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 3, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=3; // activa el pulsador 3
}
}
else if (TecladoValor>555) { // Si se ha pulsado el 4
if (Pulsador==4){ // y estaba activo el pulsador 4
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 4, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=4; // activa el pulsador 4
}
}
else if (TecladoValor>490) { // Si no se ha pulsado nada
if (Pulsador==0){ // y antes tampoco
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si no se ha pulsado nada, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=0; // desactiva el pulsador
}
}
else if (TecladoValor>395) { // Si se ha pulsado el 8
if (Pulsador==8){ // y estaba activo el pulsador 8
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 8, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=8; // activa el pulsador 8
}
}
else if (TecladoValor>305) { // Si se ha pulsado el 7
if (Pulsador==7){ // y estaba activo el pulsador 7
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 7, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=7; // activa el pulsador 7
}
}
else if (TecladoValor>210) { // Si se ha pulsado el 6
if (Pulsador==6){ // y estaba activo el pulsador 6
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 6, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=6; // activa el pulsador 6
}
}
else if (TecladoValor<210) { // Si se ha pulsado el 5
if (Pulsador==5){ // y estaba activo el pulsador 5
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 5, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=5; // activa el pulsador 5
}
}
// delay (500);
if (Nlecturas > Margen) { // Si se ha leído varia veces el mismo valor
Serial.print ("Valor leido: " );
Serial.print (TecladoValor);
Serial.print (", Pulsador: " );
Serial.print (Pulsador);
Serial.print (", Lecturas: " );
Serial.println (Nlecturas );
for (int cont=0; cont < Pulsador; cont++) { // Repite el Nº de pulsador
digitalWrite(ledPin, HIGH); // Enciende el LED
delay(200); // Espera 200 milisegundos
digitalWrite(ledPin, LOW); // Apaga el LED
delay(200); // Espera 200 milisegundos
}
}
}
PaperTeclado_N8
Lee el estado de un teclado de 8 pulsadores compuesto por un divisor de tensión
modificable realizado con una hoja de papel impresa por un impresora de inyección
de tinta. Mediante pulsadores de papel se cambia la geometría de la pista
de tinta y por lo tanto su resistencia a masa o a 5 voltios.
El programa mostrará mediante pulsaciones de un led colocado entre el pin
13 y masa, la tecla pulsada.
El circuito:
* Salida de señal "PaperTeclado" (cable azul) conectada a la entrada analógica 0
* Cable rojo de "PaperTeclado" a 5v
* Cable negro de "PaperTeclado" a masa. (GND)
* Anodo del LED (pata larga) conectada a la salida digital 13 a través de una
resistecia de 640 Ohmnios.
* Cátodo del LED (pata corta) conectada a masa
* Nota: como la mayoría de Aduinos ya incorporan un LED conectado
al pin 13 en la placa, este led es opcional.
Creado por Iñigo Zuluaga
14-Octubre-2010
http://txapuzas.blogspot.com
*/
int TecladoPin = 0; // Selecciona la entrada para el teclado
int ledPin = 13; // Selecciona el pin del LED
int TecladoValor = 0; // Variable para almacenar el valor analógico del teclado
int Pulsador=0; // Variable que indica el pulsador accionado
int Nlecturas=0; // Variable para almacenar el número de lecturas realizadas
int Margen=2; // Número de veces que hay que leer un mismo valor para aceptarlo
void setup() {
pinMode(ledPin, OUTPUT); // declara ledPin como salida
pinMode(TecladoPin,INPUT);
// digitalWrite(TecladoPin, LOW); // desactiva la resistencia pullup
Serial.begin(9600); // configura la conexión serie
}
void loop() {
delay(10);
TecladoValor = analogRead(TecladoPin); // lee el valor analógico del teclado
if (TecladoValor>820) { // Si se ha pulsado el 1
if (Pulsador==1){ // y estaba activo el pulsador 1
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 1, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=1; // activa el pulsador 1
}
}
else if (TecladoValor>740) { // Si se ha pulsado el 2
if (Pulsador==2){ // y estaba activo el pulsador 2
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 2, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=2; // activa el pulsador 2
}
}
else if (TecladoValor>640) { // Si se ha pulsado el 3
if (Pulsador==3){ // y estaba activo el pulsador 3
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 3, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=3; // activa el pulsador 3
}
}
else if (TecladoValor>555) { // Si se ha pulsado el 4
if (Pulsador==4){ // y estaba activo el pulsador 4
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 4, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=4; // activa el pulsador 4
}
}
else if (TecladoValor>490) { // Si no se ha pulsado nada
if (Pulsador==0){ // y antes tampoco
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si no se ha pulsado nada, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=0; // desactiva el pulsador
}
}
else if (TecladoValor>395) { // Si se ha pulsado el 8
if (Pulsador==8){ // y estaba activo el pulsador 8
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 8, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=8; // activa el pulsador 8
}
}
else if (TecladoValor>305) { // Si se ha pulsado el 7
if (Pulsador==7){ // y estaba activo el pulsador 7
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 7, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=7; // activa el pulsador 7
}
}
else if (TecladoValor>210) { // Si se ha pulsado el 6
if (Pulsador==6){ // y estaba activo el pulsador 6
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 6, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=6; // activa el pulsador 6
}
}
else if (TecladoValor<210) { // Si se ha pulsado el 5
if (Pulsador==5){ // y estaba activo el pulsador 5
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si se ha pulsado el 5, pero estaba activo otro pulsador
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=5; // activa el pulsador 5
}
}
// delay (500);
if (Nlecturas > Margen) { // Si se ha leído varia veces el mismo valor
Serial.print ("Valor leido: " );
Serial.print (TecladoValor);
Serial.print (", Pulsador: " );
Serial.print (Pulsador);
Serial.print (", Lecturas: " );
Serial.println (Nlecturas );
for (int cont=0; cont < Pulsador; cont++) { // Repite el Nº de pulsador
digitalWrite(ledPin, HIGH); // Enciende el LED
delay(200); // Espera 200 milisegundos
digitalWrite(ledPin, LOW); // Apaga el LED
delay(200); // Espera 200 milisegundos
}
}
}
PaperTecladoRCPiano.pde
Y por último otro ejemplo para pasar el rato: un piano de papel.
Recortamos...
Unimos con cello los cables
Plegamos (fíjate en el sentido de la lengüeta inferior, es para mantener separadas las dos partes del teclado.)
Y ya tenemos nuestro piano.
El montaje será de la siguiente forma:
Necesitarás un altavoz (yo lo conseguí de un ordenador viejo) que se une a la patilla 9 a través de una resistencia de 100 Ohmnios, El otro terminal del altavoz a masa.
El PaperTecladoPiano, como siempre a masa, 5v y la entrada analógica 0.
El programa para Arduino es el siguiente:
/*
PaperTecladoPiano
Lee el estado de un teclado compuesto por un divisor de tensión modificable,
realizado con una hoja de papel impresa por un impresora de inyección
de tinta. Mediante pulsadores de papel se cambia la geometría de la pista
de tinta y por lo tanto su resistencia a masa o a 5 voltios.
El programa emite una nota diferente en funcin de la tecla pulsada.
El circuito:
* Salida de señal "PaperTeclado" (cable azul) conectada a la entrada analógica 0
* Cable rojo de "PaperTeclado" a 5v
* Cable negro de "PaperTeclado" a masa. (GND)
* Un cable del altavoz a la salida digital 8 a través de una resistecia de 100 Ohmnios.
* El otro cable a masa (GND)
Creado por Iñigo Zuluaga
13-Octubre-2010
http://txapuzas.blogspot.com
*/
// Entradas-Salidas
int TecladoPin = 0; // Pin de entrada para el teclado
int AltavozPin = 8; // Pin de salida para el altavoz
// Variables
int TecladoValor = 0; // Variable para almacenar el valor analógico del teclado
int Pulsador=0; // Variable que indica el pulsador accionado
int Nlecturas=0; // Variable para almacenar el número de lecturas realizadas
int Margen=1; // Número de veces que hay que leer un mismo valor para aceptarlo
int Do=262; // Frecuencia de las notas
int Re=294;
int Mi=330;
int Fa=349;
int Sol=392;
int La=440;
int Si=494;
char* Nota="Sol"; // Variable para almacenar la última nota
void setup() {
pinMode(AltavozPin,OUTPUT); // El pin del altavoz como salida
Serial.begin(9600); // configura la conexión serie
}
void loop() {
delay(10);
TecladoValor = analogRead(TecladoPin); // lee el valor analógico del teclado
if (TecladoValor>900) { // Si el valor leído es grande (no se ha pulsado nada)
if (Pulsador==0){ // y estaba activo el pulsador 0
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es Si, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=0; // activa el pulsador 7
}
}
else if (TecladoValor>800) { // Si el valor leído es SI
if (Pulsador==7){ // y estaba activo el pulsador 7
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es Si, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=7; // activa el pulsador 7
}
}
else if (TecladoValor>700) { // Si el valor leído es LA
if (Pulsador==6){ // y estaba activo el pulsador 6
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es LA, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=6; // activa el pulsador 6
}
}
else if (TecladoValor>600) { // Si el valor leído es SOL
if (Pulsador==5){ // y estaba activo el pulsador 5
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es SOL, pero estaba activo otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=5; // activa el pulsador 5
}
}
else if (TecladoValor>500) { // Si el valor leído es FA
if (Pulsador==4){ // y estaba activo el pulsador 4
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es FA, pero estaba activo otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=4; // activa el pulsador 4
}
}
else if (TecladoValor>300) { // Si el valor leído es MI
if (Pulsador==3){ // y estaba activo el pulsador 3
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es MI, pero estaba activo otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=3; // activa el pulsador 3
}
}
else if (TecladoValor>200) { // Si el valor leído es RE
if (Pulsador==2){ // y estaba activo el pulsador 2
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es RE, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=2; // activa el pulsador 2
}
}
else if (TecladoValor<200) { // Si se ha pulsado DO
if (Pulsador==1){ // y estaba activo el pulsador 1
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es DO, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=1; // activa el pulsador 1
}
}
// delay (500);
if (Nlecturas > Margen) { // Si se ha leído varias veces el mismo valor
switch (Pulsador) {
case 1: // Si la tecla pulsada es la 1
tone(AltavozPin,Do); // emite la nota Do
Nota="Do"; // Almacena el nombre
break; // y sale
case 2:
tone(AltavozPin,Re);
Nota="Re";
break;
case 3:
tone(AltavozPin,Mi);
Nota="Mi";
break;
case 4:
tone(AltavozPin,Fa);
Nota="Fa";
break;
case 5:
tone(AltavozPin,Sol);
Nota="Sol";
break;
case 6:
tone(AltavozPin,La);
Nota="La";
break;
case 7:
tone(AltavozPin,Si);
Nota="Si";
break;
default: // Si no se ha pulsado ninguna tecla
noTone(AltavozPin); // apaga el sonido
Nota=" "; // vacía la variable
break; // y sale
}
}
Serial.print ("Valor leido: " ); // muestra en la terminal serie
Serial.print (TecladoValor); // el valor leído
Serial.print (", Nota: " ); // y su nota
Serial.println (Nota); // correspondiente
}
PaperTecladoPiano
Lee el estado de un teclado compuesto por un divisor de tensión modificable,
realizado con una hoja de papel impresa por un impresora de inyección
de tinta. Mediante pulsadores de papel se cambia la geometría de la pista
de tinta y por lo tanto su resistencia a masa o a 5 voltios.
El programa emite una nota diferente en funcin de la tecla pulsada.
El circuito:
* Salida de señal "PaperTeclado" (cable azul) conectada a la entrada analógica 0
* Cable rojo de "PaperTeclado" a 5v
* Cable negro de "PaperTeclado" a masa. (GND)
* Un cable del altavoz a la salida digital 8 a través de una resistecia de 100 Ohmnios.
* El otro cable a masa (GND)
Creado por Iñigo Zuluaga
13-Octubre-2010
http://txapuzas.blogspot.com
*/
// Entradas-Salidas
int TecladoPin = 0; // Pin de entrada para el teclado
int AltavozPin = 8; // Pin de salida para el altavoz
// Variables
int TecladoValor = 0; // Variable para almacenar el valor analógico del teclado
int Pulsador=0; // Variable que indica el pulsador accionado
int Nlecturas=0; // Variable para almacenar el número de lecturas realizadas
int Margen=1; // Número de veces que hay que leer un mismo valor para aceptarlo
int Do=262; // Frecuencia de las notas
int Re=294;
int Mi=330;
int Fa=349;
int Sol=392;
int La=440;
int Si=494;
char* Nota="Sol"; // Variable para almacenar la última nota
void setup() {
pinMode(AltavozPin,OUTPUT); // El pin del altavoz como salida
Serial.begin(9600); // configura la conexión serie
}
void loop() {
delay(10);
TecladoValor = analogRead(TecladoPin); // lee el valor analógico del teclado
if (TecladoValor>900) { // Si el valor leído es grande (no se ha pulsado nada)
if (Pulsador==0){ // y estaba activo el pulsador 0
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es Si, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=0; // activa el pulsador 7
}
}
else if (TecladoValor>800) { // Si el valor leído es SI
if (Pulsador==7){ // y estaba activo el pulsador 7
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es Si, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=7; // activa el pulsador 7
}
}
else if (TecladoValor>700) { // Si el valor leído es LA
if (Pulsador==6){ // y estaba activo el pulsador 6
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es LA, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=6; // activa el pulsador 6
}
}
else if (TecladoValor>600) { // Si el valor leído es SOL
if (Pulsador==5){ // y estaba activo el pulsador 5
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es SOL, pero estaba activo otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=5; // activa el pulsador 5
}
}
else if (TecladoValor>500) { // Si el valor leído es FA
if (Pulsador==4){ // y estaba activo el pulsador 4
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es FA, pero estaba activo otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=4; // activa el pulsador 4
}
}
else if (TecladoValor>300) { // Si el valor leído es MI
if (Pulsador==3){ // y estaba activo el pulsador 3
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es MI, pero estaba activo otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=3; // activa el pulsador 3
}
}
else if (TecladoValor>200) { // Si el valor leído es RE
if (Pulsador==2){ // y estaba activo el pulsador 2
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es RE, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=2; // activa el pulsador 2
}
}
else if (TecladoValor<200) { // Si se ha pulsado DO
if (Pulsador==1){ // y estaba activo el pulsador 1
Nlecturas=Nlecturas+1; // incrementa el contador de lecturas
}
else { // Si es DO, pero estaba activa otra nota
Nlecturas=0; // pone el contador de lecturas a cero
Pulsador=1; // activa el pulsador 1
}
}
// delay (500);
if (Nlecturas > Margen) { // Si se ha leído varias veces el mismo valor
switch (Pulsador) {
case 1: // Si la tecla pulsada es la 1
tone(AltavozPin,Do); // emite la nota Do
Nota="Do"; // Almacena el nombre
break; // y sale
case 2:
tone(AltavozPin,Re);
Nota="Re";
break;
case 3:
tone(AltavozPin,Mi);
Nota="Mi";
break;
case 4:
tone(AltavozPin,Fa);
Nota="Fa";
break;
case 5:
tone(AltavozPin,Sol);
Nota="Sol";
break;
case 6:
tone(AltavozPin,La);
Nota="La";
break;
case 7:
tone(AltavozPin,Si);
Nota="Si";
break;
default: // Si no se ha pulsado ninguna tecla
noTone(AltavozPin); // apaga el sonido
Nota=" "; // vacía la variable
break; // y sale
}
}
Serial.print ("Valor leido: " ); // muestra en la terminal serie
Serial.print (TecladoValor); // el valor leído
Serial.print (", Nota: " ); // y su nota
Serial.println (Nota); // correspondiente
}
NOTA: La calibración es similar a los ejemplos anteriores
Información legal
1. Propiedad intelectual
Todos los derechos de propiedad intelectual del contenido de Txapuzas eléctronicas, están bajo una licencia Creative Commons Share-Alike, cuyo contenido podéis revisar en este enlace.
Por tanto queda permitido copiar, distribuir, comunicar públicamente la obra y hacer obras derivadas de la misma, siempre que se respeten los términos de la licencia arriba reseñada.
3. Actualizaciones y modificaciones de Txapuzas electrónicas
El autor se reserva el derecho a actualizar, modificar o eliminar la información contenida en Txapuzas eléctrónicas, y la configuración o presentación del mismo, en cualquier momento, sin previo aviso, y sin asumir responsabilidad alguna por ello.
4. Indicaciones sobre aspectos técnicos
El autor no asume ninguna responsabilidad que se pueda derivar de problemas técnicos o fallos en los equipos informáticos, que se produzcan a causa de los circuitos e ideas expuestos en el blog de txapuzas electrónicas, así como de los daños que pudieran ocasionar.
El autor se exime de toda responsabilidad ante posibles daños o perjuicios que pueda sufrir el usuario a consecuencia de errores, defectos u omisiones en la información facilitada.
Descargas
El esquema, descripción e imágenes están disponibles en el siguiente enlace:
Notas
Para la realización de este proyecto se han utilizado los programas: Arduino, Inkscape, Openoffice, Gimp, Picasa, Fritzing
Si encuentras algún fallo, se te ocurre alguna mejora, o simplemente quieres hacer algún comentario, te lo agradeceré: Gracias. :-)
Me encanta.
ResponderEliminarUn excelente trabajo. Muy didáctico. Ahora a pensar donde lo aplico.
piniflopa
disculpen pero no me esta saliendo!! :(
ResponderEliminarme parece muy interesante el trabajo, pero cuando intento replicarlo, no me sale!! he impreso con impresora de inyección de tinta y he estado leyendo los datos, la primera de todas mis lecturas me dio muy bien, con ruido en un rango muy definido, imprimi con mas tinta un nuevo documento, pero desde entonces no me ha dado datos definidos!! a parte la resistencia que mido no es menos de 4Mhoms!!
Gracias
Hola anónimo.
ResponderEliminarLa resistencia del paper teclado debe ser menor de 1Mohmnio para poder ser utilizable.
Hay que tener en cuenta que para intentar disminuir la resistencia, la zona de contacto con la banda de tinta debe ser lo más larga posible tanto con el cable, como con el polímetro.(no clavar la punta del tester, si nó apoyarla lateralmente).
Puedes imprimir varias veces sobre el mismo papel el documento, de forma que la cantidad de tinta depositada sobre el papel aumente, con un tester comprobar los valores, y cuando estén alrededor de 1M recortar el paperteclado y construirlo.
O sea que lo que tanto me hizo reir de Golden Boy puede funcionar XD http://26.media.tumblr.com/tumblr_m16cb23RIH1rs62t1o1_500.png
ResponderEliminarhttp://www.bareconductive.com/
ResponderEliminarCapaz que te sirve y podes sacar ideas.
EliminarEnhorabuena!! :) El piano genial
ResponderEliminarExcelente artículo para poder crear un teclado sobre una hoja de papel!
ResponderEliminar