# emulador teclado de PC con microcontrolador



## cris3D (Mar 2, 2011)

que tal,

en estos días se me ocurrió algo, quiero conectar un micro a la PC (PS2 o USB) y presionar pulsadores a manera del teclado convencional, osea que yo designe un pulsador y la compu lo reconozca como una tecla (ejemplo TAB, Ctrl, n, F1, 4 etc...)

estoy lo quiero para mandarle comandos al virtualDJ mediante pulsadores, así no tengo que tener el teclado y puedo personalizar un panel. 

Encontré por ahí un integrado que lo hace, este se usa para el MAME y así poder conectar los botones y palancas de una estación de videojuegos,

http://www.jesusda.com/projects/mandorecreativa/index.html

actualmente tengo algunos micros pic, atmel y freescale, pero recurro al foro para sugerencias y orientación, ademas que quede una referencia para quien le pueda servir (una vez terminado) 

saludos


----------



## josb86 (Mar 4, 2011)

la verdad no tengo ni idea pero voy a seguir el post me podría servir para un emulador de pedalera


----------



## cris3D (Mar 4, 2011)

pues he encontrado muchs información y caminos a seguir, ayer estaba probando pero no funciono un driver, espero tener algún resultado prometedor para el fin de semana, seguramente te podrás armar tu pedalera 

http://www.instructables.com/id/Arcade-Button-MIDI-Controller/   -- tuto completo
http://cal.freeshell.org/2010/03/more-about-my-midi-mixer/        --algunas recomendaciones (driver)
http://www.spikenzielabs.com/SpikenzieLabs/Serial_MIDI.html     -- software para proccesing
http://sites.google.com/site/carlkenner/glovepie                           -- emulador de puertos
download.yamaha.com/usb_midi/index.html                              --driver, no lo probe
http://korg-usb-midi-driver-tools-for-windows.software.informer.com/   --driver, no lo probe
http://tonelabst-usb-midi-driver-setup-for-wind.software.informer.com/ 
http://www.italentshare.com/pinguinoforum/viewtopic.php?f=17&t=62   --info de CDC en pinguino
http://www.muchotrasto.com/EmulacionCDCRS-232USB.php            --VCP con PIC
http://www.microchip.com/forums/m235427.aspx                            --open source projects
http://www.instructables.com/id/USB-Midi-Device-from-old-Gamepad/step16/Install-Software/   -- control midi con control pad

haber que te animas a probar, estamos en contacto!


----------



## curioso207 (Mar 8, 2011)

checa la pagina freescale.com hay una aplicacion con un micro crreo que era un hc05 o hc08 y viene elcodigo y el esquematico la conexion es tipo mini diin


----------



## cris3D (Mar 8, 2011)

@curioso,
 fijate que encontre una solución, solo que no he no tenido tiempo de postear, pero lo tratare de redactar y poner un video , si tienes mas info sobre eso que me dices por fas!, y pues también lo intento con un freescale, tengo por ahi dos tarjetas de desarollo , asi tendria los ejemplos con arduino, pinguino y freescale(ino) ..


----------



## curioso207 (Mar 9, 2011)

aqui esta una aplicacion y la verdad esta muy completa y es por usb

http://cache.freescale.com/files/microcontrollers/doc/ref_manual/USBSAG.pdf?fsrch=1&sr=1

saludos


----------



## cris3D (Mar 22, 2011)

bien la solución que utilice es la siguiente:

Con ayuda de un arduino y su com virtual,

uso este soft para la conversión del com virtual a MIDI
http://www.spikenzielabs.com/SpikenzieLabs/Serial_MIDI.html

y este para enrutarlo con Virtual Dj
http://www.midiox.com/index.htm?http://www.midiox.com/myoke.htm

esta combinación corre perfectamente

un codigo de ejemplo esta en esta pagina, 

http://www.instructables.com/id/Arcade-Button-MIDI-Controller/

Ahora mi meta es hacerlo con pinguino, en cuanto tenga resultados lo posteare con el nuevo codigo (aunque sera muy similar )

saludos!


----------



## cris3D (Abr 11, 2011)

ahi les va el primer codigo de test, funciona con PINGUINO + keypad lib


```
// Keypad library test. 
// --------------------------------------------- 
// Translated from arduino keypad examples. 
// Description: 
//    This routine captures the key pressed and 
//    send characted as a midi command. 
#include "keypad.c" 
#include <stdlib.h> 
#include <string.h> 
#define ROWS  4 //four rows 
#define COLS  4 //three columns 
char mykeys[ROWS][COLS] = { 
        { 1 , 2 , 3 , 10}, 
        { 4 , 5 , 6 , 11}, 
        { 7 , 8 , 9 , 12}, 
        { 0 , 15, 14, 13}}; 
uchar rowPines[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of 
the keypad 
uchar colPines[COLS] = {7, 6, 5, 4}; //connect to the column pinouts 
of the keypad 
u8 key[3]; 
void com(){ 
        CONTROL_LINE=1; //command to connect terminal 
        if (CONTROL_LINE) { digitalWrite(12,HIGH);   //on if connected 
   }else {digitalWrite(12,LOW); delay(500); } 
} 

void setup() { 
// initialice your keypad: 
keypad.init(makeKeymap(mykeys), rowPines, colPines, ROWS, COLS); 
pinMode(12,OUTPUT);  //led to check if a terminal is connected 
//initialice your serial port: 
//Serial.begin(9600); 
} 

void loop() { 
        com(); 
        key[0]=0x90; 
        key[1]=keypad.getKey(); 
        key[2]=0x10; 
  if (key[1] != NO_KEY){ 
        if (CONTROL_LINE) CDC.print(key,strlen(key)-1); 
        delay(100); 
  }
```
cualquier duda ahi me dicen


----------



## cris3D (May 13, 2011)

algunas fotos del proyecto terminado 

https://picasaweb.google.com/cramso/PinguinoFigther?authkey=Gv1sRgCKGr6vOEsOPZjQE#


----------



## Fortivo (May 16, 2011)

Hola amigos , me adjunto al equipo para seguir el proyecto y ayudar en lo que pueda, porque realmente quiero realizar un midi pad para mi equipo de sonido.

Cris3D amigo te quedo genial , vamos como el profecional que toca este amigo dj.





por lo que veo mejor empezar a aprender adruino , porque primero gastaría menos componentes y todo seria mucho mas fácil ¡¡

Muchas gracias , les contare como va.

 un saludo amigos.


----------



## cris3D (May 17, 2011)

asi es, se ahorra bastante, utilice la plataforma PINGUINO (similiar  a arduino ),  revisala haber si te gusta, en cuanto a costo creo yo que este podría salir mucho mas barato, solo es el chip 2 capacitores el cristal, 1 led una resistencia y un interruptor

www.pinguino.cc

y pues si de hecho la idea me surgió debido a que vi ese video hace un par de meses, y pues como ves empeze preguntando por un emulador de teclado y termine en un controlador MIDI,

también tengo un arduino por ahi si gustas lo podemos continuar con ese, si gustas formamos un plan de trabajo  , tengo algunas ideas que no he hecho


----------



## Fortivo (May 29, 2011)

cris3D dijo:


> asi es, se ahorra bastante, utilice la plataforma PINGUINO (similiar  a arduino ),  revisala haber si te gusta, en cuanto a costo creo yo que este podría salir mucho mas barato, solo es el chip 2 capacitores el cristal, 1 led una resistencia y un interruptor
> 
> www.pinguino.cc
> 
> ...



Hola amigo¡ pues no estaría mal pero realmente no he programado nunca a pic ((bueno si lo utilice, pero en clase con robot de estos prefabricados  )) , pero como dicen la union hace la fuerza ¡¡¡ por mi me apunto, que tengo un equipo y me hace falta hacer un controlador midi para traktor pro 2 (controlar los efectos y los loops) por cierto una pregunta : con este controlador pinguino o similar, ?¿ puedo controlar potenciómetros ?¿ porque no se si haz utilizado el traktor alguna vez, los efectos se activan por un pulsador pero se regula con un potenciómetro , el potenciometro te da el tiempo del efecto mas su aceleración o equivalente.

Un saludo , estaremos por aquí si lo deseas.
Cuídate.


----------



## cris3D (May 30, 2011)

pues este en especial tiene su propia forma de ser programado, una vez que le programas (con un programador externo) el bootloader le seguiras programando por medio del usb a traves de su IDE,

y claro que se pueden utilizar los potenciometros, ahi tengo el codigo 


```
// test pot midi control without delay	
#include <stdlib.h>
#include <string.h>

s8 last=0;    //to save the last analog value sent
u8 cadena[2]; //to send midi command

void txcdc(){
	if(CONTROL_LINE) CDC.print(cadena,strlen(cadena)); 
}  // send midi comamnd use "if" if use W7 or Wxp

void setup(){
	cadena[0]=0xB0;  //control command 
	cadena[1]=0x07;  //comand for volume
}

void loop(){ CONTROL_LINE=1; //if use Wxp or W7
cadena[2]=analogRead(13)/8;  // analog values can be between 0-127
if((last-cadena[2])>3 || (last-cadena[2])<-3 ){txcdc(); last=cadena[2];} 
}  // if pot value changes by 3 then midi command is sent
```

saludos!!


----------



## Fortivo (May 30, 2011)

cris3D dijo:


> pues este en especial tiene su propia forma de ser programado, una vez que le programas (con un programador externo) el bootloader le seguiras programando por medio del usb a traves de su IDE,
> 
> y claro que se pueden utilizar los potenciometros, ahi tengo el codigo
> 
> ...



Ok amigo esto esta perfecto, voy a meterle mano a la obra y realizar un midi para el traktor aver que tal sale, muchas gracias te seguiré informando.

saludossss cuidese


----------



## cris3D (May 30, 2011)

de nada! estoy pendiente de tu avance, yo intentare mejorar mi controlador, lo uso para el virtual Dj y va perfecto, aun no he incorporado el potenciometro en un controlador completo, pero pronto lo haré.


----------



## Fortivo (May 30, 2011)

cris3D dijo:


> de nada! estoy pendiente de tu avance, yo intentare mejorar mi controlador, lo uso para el virtual Dj y va perfecto, aun no he incorporado el potenciómetro en un controlador completo, pero pronto lo haré.



ok amigo yo también uso el virtual dj con una mesa modificada ( la hércules e2 pro ) , pero... como realizo mucho scrach , el virtual dj por mucho que se regule se corta en las secuencias de frenado, el tractor no y suena mejor los scrach . pero como tu necesito un midi con potenciómetros para manejar los efectos y los loops.

te iré avisando y enseñando los pasos realizados.

un saludo.


----------



## cris3D (Jul 1, 2011)

que tal, comunidad,


```
/* 
Segundo intento para configuracion de un MIDI controller,
basicamente tienes que cambiar 2 variables:
buttons: numero de botones
pins:  los pines donde los conectaras

npots: numero de potenciometros
pinpot: los pines donde los conectaras 

ya lo probe con Virtual DJ y funciona bien :)
ahora lo que hay que hacer es ponerlo a funcionar en serio para 
saber si truena o no a dar uso rudo.. espero tus comentarios mejoras..
y demas.. espero retomar mi controlador a base de un teclado matricial y
dejarlo como este :D

por cierto.. hay que probarlo usando mas y menos botones.. con 3 anda bien..
pero son todos los que tengo xD .. asi que.. te libero mi alpha test :D
*/
#include <stdlib.h>
#include <string.h>

//#DEFINE PIC18F4550	// Si utilizas este modelo

#define buttons	3 	// define el numero de botones a utilizar
#define npots	2 		// define el numero de potenciometros a utilizar
							// estos numeros deben ser iguales que el numero de pines y pots declarados
					
u8 pins[buttons]= {7,1,4}; 	// se declaran los pines de pinguino a los cuales
										// estaran conectados los botones, ejemplo:
										// boton 1: conectado al pin 0 de pinguino
										// boton 2: conectado al pin 1 de pinguino etc
										// si se desea conectar mas, actualizar "define botones"	
											
u8 epin[buttons];				// variable para guardar el estado del pin			
u8 lastepin[buttons];		// variable auxiliar para guardar el estado anterior de epin
 
u8 pinpot[npots]= {13,14};	// se declaran los pines de pinguino en los cuales conectaras tus pots
									
u8 vpot[npots];				// aqui se guardaran los valores de los pots
u8 lastvpot[npots]; 			// variable auxiliara para guardar el valor anterior de los pots

u8 gap= 3;						// esta variable es para que el pot mande valores solo si la 
									// el valor actual supera al anterior
void midicmd(u8 cmd, u8 pitch, u8 velocity){
u8 command[3];				// variable para mandar el comando midi
	command[0]= cmd;
	command[1]= pitch;
	command[2]= velocity & 0x7F;
	CDC.print(command,3);
}
 
void checkpots(){
u8 k;
	for(k=0;k<npots;k++){
		vpot[k]= analogRead(pinpot[k])/8;	// los valores varian entre 0-127
		if( (lastvpot[k]-vpot[k]) > gap || (lastvpot[k]-vpot[k]) < -gap ){
			midicmd(0xB0 | k ,0x7,vpot[k]);	// modificamos el canal segun el pot
			lastvpot[k]=vpot[k];
		}
	}	// en el if se calcula la diferencia entre el valor actual y al anterior
}		// para mandar un valor solo cuando este sea diferente deacuerdo a gap (3)
 
void checkstate(){
u8 j;
	for(j=0;j<buttons;j++){
		epin[j]= digitalRead(pins[j]); // se lee el estado del pin y se guarda en epin
		// compara el estado actual de epin con el anterior lastepin
		if (epin[j] != lastepin[j]) {
		// si el estado cambio se verifica en que sentido lo hizo
			if (epin[j] == HIGH) {
			// si hubo un cambio y ahora esta en HIGH
			//quiere decir que paso de LOW a HIGH
				midicmd(0x90,pins[j]+1,0x45);	//manda el comando a volumen medio
			} else {
			// si hubo un cambio y ahora esta enLOW
			//quiere decir que paso de HIGH a LOW
				midicmd(0x80,pins[j]+1,0x45);	//apaga el comando
			}
		}
		lastepin[j]= epin[j];	// se guarda el estado actual en lastepin 
	}									// para la siguiente iteracion
}
 
void setup(){
u8 i;
	for(i=0;i<buttons;i++){
		pinMode(pins[i],INPUT); // los botones se declaran como entradas digitales
		epin[i]= 0;					// se inicializa esta variable con 0's
		lastepin[i]= 0;			
	}
}

void loop(){ CONTROL_LINE= 1;	//para asegurar que el CDC este funcionando (solo en WXP o W7)
	checkstate(); 					// mandamos verficar el estado de los botones
	checkpots();					// verificamos los potenciometros
}
```


----------



## Fortivo (Jul 3, 2011)

ok amigo cuando tenga un rato libre lo probare a ver que tal ¡¡

saludos


----------

