Autor Tema: Ayuda y sugerencias para nuevo proyecto robot/midi  (Leído 2007 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado fjam_rock

  • PIC10
  • *
  • Mensajes: 11
Ayuda y sugerencias para nuevo proyecto robot/midi
« en: 02 de Mayo de 2016, 21:49:43 »
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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda y sugerencias para nuevo proyecto robot/midi
« Respuesta #1 en: 03 de Mayo de 2016, 07:31:00 »
Citar
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?

Es correcto, al activarse el led del optoacoplador  el transistor se satura pasando a una tension de su colector cercana a 0V, al momento de poner un 0 en el led del optoacoplador, el transistor no conduce y la resistencia de pull-up lo pone en 1.

Por lo que veo es una UART, si del otro extremo ( receptor ) tambien existe un opto como en el transmisor, la señal se invertiria nuevamente quedando como la original.

Respecto al MIDI, yo jamas lo use, ni tampoco lei como es que se transmite, no sabia que era por UART. Tenes que asegurarte si o si que el optoacoplador pueda llegar a la velocidad que estas buscando.

Mirando el codigo no puedo extenderme demasiado sin saber el PIC que estas usando. Pero si vas a tener recepcion por UART, lo mejor es utilizar interrupciones. Sino lo mas seguro es que tengas problemas.

Esto no hace falta:

Código: ASM
  1. CLRF   RCREG      ;SE VACIA RCREG Y RCIF=0

Al hacer el MOVF de RCREG, ya estas sacando el dato y borrando el RCIF ( si es que no hay nada ), no es que queda alli y tenes que borrarlo.
Otro posible problema esta aca:

Código: ASM
  1. BTFSS   STATUS,Z   ;SI SON IGUALES, SALTA Y ESPERA BYTE DE DATOS. SI NO, VUELVE AL LOOP
  2.    GOTO   LOOP
  3.    BSF      PORTB,0
  4.    BTFSS   PIR1,RCIF   ;SE ESPERA BYTE DE DATOS
  5.    GOTO   LOOP

Recibiste un dato, pasaron 11 ciclos ( algunas instrucciones consumen 2 cuando saltan ) y estas preguntando por si llego otro, es un gran problema por que realmente tenes que esperar que llegue!, no llegan instantaneamente al micro, y el micro va mucho mas rapido que la UART, tal ves iba recibiendo el 2do bit ahi entonces no puso en 1 el RCIF.

No entendi bien que quisiste hacer, el codigo pide que si o si se reciban los 2 datos seguidos ( 0x99 y 0x24 ) o son 2 codigos distintos y segun lo que se reciba actuas acorde al mismo?

Desconectado fjam_rock

  • PIC10
  • *
  • Mensajes: 11
Re:Ayuda y sugerencias para nuevo proyecto robot/midi
« Respuesta #2 en: 03 de Mayo de 2016, 11:22:34 »
Hola,

en primer lugar, muchas gracias por responder.
Ahora, volviendo al tema en cuestión, como dices:

Por lo que veo es una UART, si del otro extremo ( receptor ) tambien existe un opto como en el transmisor, la señal se invertiria nuevamente quedando como la original.

Efectivamente es una UART. Del otro extremo no hay un opto. He trabajado con módulos MIDI OUT y funciona bien utilizando sólo una resistencia a la salida desde el PIC.

Es correcto, al activarse el led del optoacoplador  el transistor se satura pasando a una tension de su colector cercana a 0V, al momento de poner un 0 en el led del optoacoplador, el transistor no conduce y la resistencia de pull-up lo pone en 1.

No debería pasar eso cuando el transistor está en corte? De todas formas, me tiene confundido que se invierta la señal de entrada.

Respecto al MIDI, yo jamas lo use, ni tampoco lei como es que se transmite, no sabia que era por UART. Tenes que asegurarte si o si que el optoacoplador pueda llegar a la velocidad que estas buscando.

Por lo que he visto, el opto que estoy usando es muy lento, intentaré encontrar uno mejor.

Mirando el codigo no puedo extenderme demasiado sin saber el PIC que estas usando. Pero si vas a tener recepcion por UART, lo mejor es utilizar interrupciones. Sino lo mas seguro es que tengas problemas.

Esto no hace falta:

Código: ASM
  1. CLRF   RCREG      ;SE VACIA RCREG Y RCIF=0

Al hacer el MOVF de RCREG, ya estas sacando el dato y borrando el RCIF ( si es que no hay nada ), no es que queda alli y tenes que borrarlo.
Otro posible problema esta aca:

Código: ASM
  1. BTFSS   STATUS,Z   ;SI SON IGUALES, SALTA Y ESPERA BYTE DE DATOS. SI NO, VUELVE AL LOOP
  2.    GOTO   LOOP
  3.    BSF      PORTB,0
  4.    BTFSS   PIR1,RCIF   ;SE ESPERA BYTE DE DATOS
  5.    GOTO   LOOP

Recibiste un dato, pasaron 11 ciclos ( algunas instrucciones consumen 2 cuando saltan ) y estas preguntando por si llego otro, es un gran problema por que realmente tenes que esperar que llegue!, no llegan instantaneamente al micro, y el micro va mucho mas rapido que la UART, tal ves iba recibiendo el 2do bit ahi entonces no puso en 1 el RCIF.

No entendi bien que quisiste hacer, el codigo pide que si o si se reciban los 2 datos seguidos ( 0x99 y 0x24 ) o son 2 codigos distintos y segun lo que se reciba actuas acorde al mismo?


Se me olvidó comentar que estoy usando un PIC 16F877 a 20 MHz.
Tienes razón con lo de los 11 ciclos, lo corregiré. De todas formas, si el circuito de recepción estuviera funcionando, se debería activar el bit 0 del puerto B al recibir el primer byte.

Saludos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda y sugerencias para nuevo proyecto robot/midi
« Respuesta #3 en: 03 de Mayo de 2016, 14:44:28 »
Citar
No debería pasar eso cuando el transistor está en corte? De todas formas, me tiene confundido que se invierta la señal de entrada.

Cuando se satura el transistor, deja pasar la corriente, es decir su Vce cae a lo que es el Vce(sat) especificado en el datasheet, esto es cuando en la base hay una señal lo suficientemente fuerte que en este caso va a ser provista por el led (cuando circule una corriente por el mismo),

Cuando esta en Corte, es decir no circula corriente por el transistor ( Ic ) Vce va a ser proxima a la cual alimenta a la resistencia de pull-up, al no conducir y la Vce es "alta" termina siendo un 1 como salida del opto, y esto ocurre cuando no hay exitacion en la base, es decir no hay corriente circulando por el diodo.

Citar
Tienes razón con lo de los 11 ciclos, lo corregiré. De todas formas, si el circuito de recepción estuviera funcionando, se debería activar el bit 0 del puerto B al recibir el primer byte.

Si el primero deberia activarse, el tema es que no se como se maneja el MIDI, apesar que siempre lo escuche como nunca tuve necesidad de hacer algo con este, siempre quedo de lado, asi que en esa parte no te puedo ayudar tal como habia dicho al comienzo de mi otro post, en el caso de programacion del micro o funcionamiento si podria.

Desconectado fjam_rock

  • PIC10
  • *
  • Mensajes: 11
Re:Ayuda y sugerencias para nuevo proyecto robot/midi
« Respuesta #4 en: 10 de Mayo de 2016, 20:47:16 »
Cuando se satura el transistor, deja pasar la corriente, es decir su Vce cae a lo que es el Vce(sat) especificado en el datasheet, esto es cuando en la base hay una señal lo suficientemente fuerte que en este caso va a ser provista por el led (cuando circule una corriente por el mismo),

Cuando esta en Corte, es decir no circula corriente por el transistor ( Ic ) Vce va a ser proxima a la cual alimenta a la resistencia de pull-up, al no conducir y la Vce es "alta" termina siendo un 1 como salida del opto, y esto ocurre cuando no hay exitacion en la base, es decir no hay corriente circulando por el diodo.

En resumen, cuando la señal MIDI que se va a recibir está en 1, se activa el led del optoacoplador, se satura el transistor y a la salida va a haber un voltaje bajo, cercano a 0V. Por otro lado, cuando se recibe una señal en 0, no circula corriente, el transistor estará en corte y la salida será cercana a 5V debido a la resistencia de pull-up. De acuerdo a esto, se invierte la señal MIDI al entrar al PIC... esto es lo que me complica.

Citar
Si el primero deberia activarse, el tema es que no se como se maneja el MIDI, apesar que siempre lo escuche como nunca tuve necesidad de hacer algo con este, siempre quedo de lado, asi que en esa parte no te puedo ayudar tal como habia dicho al comienzo de mi otro post, en el caso de programacion del micro o funcionamiento si podria.

Los mensajes MIDI se transmiten de a 1, 2 o 3 bytes, según el tipo de mensaje. El primer byte enviado es de estado y el o los siguientes, de dato. En el caso mío, quiero recibir un byte de estado y luego uno de datos, esa es la razón por la cual al recibir el primer byte (de estado) dejo una espera hasta recibir el de datos.

Respecto al optoacoplador, he hecho pruebas con distintos tipos, según mi limitada disponibilidad. Probé con un 4n26 y un pc817 y no he logrado recibir nada en el PIC. Modifiqué la rutina para que al recibir un byte en el puerto serial se active un pin del Puerto B, pero éste no cambia... alguna sugerencia? Gracias.

Saludos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda y sugerencias para nuevo proyecto robot/midi
« Respuesta #5 en: 10 de Mayo de 2016, 22:12:08 »
Citar
En resumen, cuando la señal MIDI que se va a recibir está en 1, se activa el led del optoacoplador, se satura el transistor y a la salida va a haber un voltaje bajo, cercano a 0V. Por otro lado, cuando se recibe una señal en 0, no circula corriente, el transistor estará en corte y la salida será cercana a 5V debido a la resistencia de pull-up. De acuerdo a esto, se invierte la señal MIDI al entrar al PIC... esto es lo que me complica.

Segun el diagrama que pasaste es una señal diferencial, con lo cual "invertir" los pines que van al conector invertiria la señal ( si es que no se invirtio antes al dibujar el diagrama ).

Citar
alguna sugerencia? Gracias.

Como te lo habia anunciado desde el comienzo, no estoy informado sobre como es que se maneja, tension, etc del MIDI, asi que en eso no te puedo ayudar en exactamente eso.

Teniendo un osciloscopio, podrias llegar a visualizar si es que esta llegando algo, tal ves la corriente que llega al diodo led es poca y no llega a saturarlo. Podrias tratar de buscar algun receptor diferencial RS232 ( o uno para RS485 que suelen venir ya diferenciales ) y que suelen tener salidas negadas como no negadas, o de ultima que tenga salida sea como sea. Un half-duplex bastaria para solo la recepcion.

Este no necesita la misma corriente que el opto, y no vas a tener problemas de velocidad.
Todo esto suponiendo que lo unico a realizar es la conversion de diferencial a TTL que maneja el micro.
« Última modificación: 10 de Mayo de 2016, 22:17:44 por KILLERJC »


 

anything