emulador teclado de PC con microcontrolador

#1
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
 
#2
la verdad no tengo ni idea pero voy a seguir el post me podría servir para un emulador de pedalera
 
#3
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 :D

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!
 
#4
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
 
#5
@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) .. :LOL:
 
#7
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!
 
#8
ahi les va el primer codigo de test, funciona con PINGUINO + keypad lib

PHP:
// 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
 
Última edición por un moderador:
#10
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.
 
Última edición:
#11
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 :D , tengo algunas ideas que no he hecho :)
 
Última edición:
#12
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 empece preguntando por un emulador de teclado y termine en un controlador MIDI,

también tengo un arduino por ahí si gustas lo podemos continuar con ese, si gustas formamos un plan de trabajo :D , tengo algunas ideas que no he hecho :)
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 :D )) , 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.
 
#13
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

PHP:
// 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!!
 
Última edición por un moderador:
#14
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!!
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
 
#15
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é.
 
#16
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.
 
#17
que tal, comunidad,

PHP:
/* 
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
}
 
Última edición por un moderador:

Temas similares

Arriba