Hola a todos,
hace mucho tiempo estoy registrado en este foro pero sólo lo había utilizado como referencia y búsqueda de información. Ahora lo necesito para pedir ayuda e ideas para un proyecto que llevo desarrollando hace un tiempo.
Tengo un robot "robosapien" que compré a buen precio y pretendo hacerlo "tocar batería". Me explico: encontré una página con la comunicación entre el robot y el control remoto (
http://www.aibohack.com/robosap/ir_codes.htm), usando esto puedo enviar comandos al robot directamente con un pic. Eso ya lo probé y funciona. El resto es enviar mensajes MIDI de batería al PIC y, según el mensaje recibido, envío un comando de movimiento al robot.
Lo que no sé hacer en este momento es la etapa midi. Según la especificación eléctrica MIDI, se necesita un optoacoplador entre el PIC y el conector para aislar los circuitos (
https://www.midi.org/specifications/item/midi-din-electrical-specification). Lamentablemente, en el lugar donde vivo no los venden y sólo pude rescatar uno PC123 de una fuente de poder de impresora, con el cual hice la prueba y no funciona, no sé si es por el circuito o por la programación.
Bueno, ahora las dudas: la primera que tengo es que en el circuito del optoacoplador, al haber un 1 lógico en la entrada MIDI, sale un 0 hacia el PIC, es esto correcto? La otra duda es respecto a la programación. Les dejo el código que hice para testear la entrada MIDI, que básicamente enciende 3 leds, uno por defecto y los otros 2 al recibir un mensaje específico en el canal 10:
MAIN
;INICIALIZACION
BSF STATUS, RP0 ;BANK 1
BCF TRISB,0 ;SE HABILITA PIN 0 PUERTO B COMO SALIDA
BCF TRISB,1 ;SE HABILITA PIN 1 PUERTO B COMO SALIDA
BCF TRISB,2 ;SE HABILITA PIN 2 PUERTO B COMO SALIDA
BSF TRISC,7 ;ENTRADA SERIAL
MOVLW 0X09 ;SET BAUD RATE (20M/64(9+1)=31250)
MOVWF SPBRG
BCF TXSTA,SYNC ;ASYNCHRONOUS
BCF TXSTA,BRGH
BCF STATUS, RP0 ;BANK 0
BSF RCSTA,SPEN ;SE HABILITA PUERTO SERIAL
BSF RCSTA,CREN ;SE HABILITA RECEPCION
CLRF PORTB
BSF PORTB,2
LOOP
BTFSS PIR1,RCIF ;SE ESPERA BYTE DE ESTADO
GOTO LOOP
MOVF RCREG,W ;VALOR RECIBIDO QUEDA EN REGISTRO RCREG (BANK0)
MOVWF TEMP
CLRF RCREG ;SE VACIA RCREG Y RCIF=0
MOVLW 0X99 ;BYTE DE ESTADO: CANAL 10, NOTE ON
SUBWF TEMP
BTFSS STATUS,Z ;SI SON IGUALES, SALTA Y ESPERA BYTE DE DATOS. SI NO, VUELVE AL LOOP
GOTO LOOP
BSF PORTB,0
BTFSS PIR1,RCIF ;SE ESPERA BYTE DE DATOS
GOTO LOOP
MOVF RCREG,W ;VALOR RECIBIDO QUEDA EN REGISTRO RCSTA (BANK0)
MOVWF TEMP
CLRF RCREG ;SE VACIA RCREG Y RCIF=0
MOVLW 0X24 ;BYTE DE DATOS: Bass Drum 1 (35 DECIMAL)
SUBWF TEMP
BTFSS STATUS,Z ;SI SON IGUALES, SALTA Y MANDA COMANDO A ROBOT. SI NO, VUELVE AL LOOP
GOTO LOOP
BSF PORTB,0
END
Espero que a alguien le interese el proyecto y me pueda orientar.
Desde ya, muchas gracias.
Saludos desde Punta Arenas, Chile.