Proyectos
 

Emulación CDC RS-232 USB

Microchip permite mediante la programación de sus PIC realizar uno o varios puertos COM virtuales e incluso la realización de USB 2.0 real mediante la CDC (Comunication Device Class).

En este proyecto realizaremos la emulación de un puerto RS232 en nuestro ordenador. Debido a la enorme facilidad de programar un puerto serie 232 mediante los compiladores Visual C++, Visual Basic y Delphi, esta aplicación del PIC se nos hace especialmente apetecible, ya que podemos programar por ejemplo en Visual basic una aplicación con comunicación RS232 pero en realizad estamos sacando nuestros datos a través de un puerto USB a la máxima velocidad de 1 Mb/seg.

Realizaremos este ejemplo para poder sustituir al hardware del proyecto Enlace radio de datos que se realizó con un chip FTDI, al cual no le hace falta programación.

Siguiendo este ejemplo de aplicación podremos tener un chat entre dos ordenadores mediante dos micros de microchip y los módulos de radio Easy Radio.

Es recomendable que antes de empezar a empaparnos de ideas sobre la emulación VCP a través de microchip os paséis por el siguiente enlace:

Enlace radio de datos.

Fundamentos

Los microcontroladores de la casa microchip nos ofrecen numerosas y distintas aplicaciones para la realización de tareas sencillas a bajo coste, desde programación de diagramas de estados, hasta comunicación TCP/IP, pasando por USB y otras muchas aplicaciones interesantes como Modbus, I2C, SD Card, etc...

Pero para ello lo primero es conseguir un programador de estos integrados. Los podemos conseguir caseros desde 50€ en numerosas páginas web, o incluso realizarlos nosotros mismos por un precio de 10€. Podemos encontrar también programadores oficiales a un coste de más de 80€ en la web oficial de Microchip.

Material necesario

Material necesario

Protoboard, microcontrolador y componentes electrónicos

Cuter y cables

Cable USB / Mini-USB

Programador de PIC 18F4550

Teoría

Vamos a usar un PIC 18F4550 que emule un puerto serie virtual (Virtual Comp Port "VCP"), aunque también se puede usar un PIC 18F2550, el cual configuraremos a nuestro gusto, donde le podremos poner el nombre de la empresa que queramos y el nombre de identificación de éste.

También hay que configurar dos parámetros esenciales en todo dispositivo que son el VID e ID.

VID (Vendor ID):

Es el identificador de la empresa. Cada empresa tiene un identificador, el cual puede vender diferentes productos a los que se les incluye el ID.

ID (Product ID):

Es el identificador del producto. Por tanto un dispositivo tendrá un VID e ID fijos que les hace únicos con lo que no pueden sufrir incompatibilidad con otros dispositivos.

 

Estos son únicos para cada dispositivo que existe en el mercado, ya que si hubiese en nuestro ordenador dos dispositivos con el mismo VID/ID causarían conflictos entre ellos, impidiendo el correcto funcionamiento de ambos.

¿Entonces cómo se soluciona que no haya conflictos entre dos dispositivos con la enorme cantidad de éstos en el mercado informático y electrónico?

La respuesta es muy sencilla, pagando para tener nuestro único e indivisible VID/ID, claro está que para trastear en casa no vamos a comprar un identificador para nuestro dispositivo, pero si queremos comercializarlo no nos quedará otra que comprar una "licencia".

Construcción

Primero ADVERTIR que el esquemático está realizado con un 18F4550 TQFP con lo que la numeración de las patillas difiere al integrado DIP (cucaracha). Lo que no difiere es el nombre o funcionalidad de éstas.

Aquí podéis encontrar la versión en OrCAD del esquemático más abajo en el punto Download de este mismo enlace.


Esquemático


Panorámica conexión 18F4550 DIP al portátil mediante USB

Una vez realizada la placa o cablearla en nuestra protoboard, incorporarémos a ésta el módulo de RF de easyRadio.


Módulo EasyRadio


Líneas de anlace mínimo para la comunicación según programa CCS en PIC encapsulado DIP

De este módulo cabe destacar su fiabililidad a la hora de hacer la recepción de los paquetes enviados, ya que usa en su interior el protocolo de transmisión de errores CRC, asegurándonos así de que los paquetes recibidos son exactamente iguales a los enviados.

Tienen un alcance al aire libre de al menos 300 metros utilizando un cable normal de 16.5 cm pudiendo conseguir distancias de algo más de un kilómetro con alguna antena comercial. Podéis ver un artículo relacionado con los conectores de las antenas en:

Diferencia entre conectores SMA y RP-SMA de RF.

También es recomendable ver las actualizaciones de los módulos y los datasheet del transceptor de datos EasyRadio:

Pincha aquí para ir a la web EasyRadio.

Programación PIC

La programación del PIC la hemos realizado a través de la aplicación CCS denominada PIC C Compiler, ya que en nuestra opinión es uno, por no decir el mejor y más sencillo complidor en C para microcontroladores.

El código principal para crear nuestro VCP es el siguiente además de convertirlo en emisor / receptor para nuestra aplicación chat

#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)
#USE RS232(BAUD=19200, XMIT=PIN_A4, RCV=PIN_A5, stream=RF)

#include <usb_cdc.h>
#include <usb_desc_cdc.h>

char c,d;

void main() {

usb_cdc_init();
usb_init(); //inicializamos el USB

while (!usb_cdc_connected()) {}
while (true)
{
usb_task();
if(usb_enumerated())
{
if (usb_cdc_kbhit())
{
c = usb_cdc_getc();
putc(c,RF);
}

if (kbhit(RF))
{
d=getc(RF);
usb_cdc_putc(d);
}
}
}
}

Creamos un puerto serie mediante software mediante la línea de código:

#USE RS232(BAUD=19200, XMIT=PIN_A4, RCV=PIN_A5, stream=RF)

donde su identificador es RF

Por lo que tenemos dos comunicaciones, una producida por el usb y otra producida por RF ya que nuestro módulo de RF se comunica mediante UART a través de protocolo 232.

La programación se resume en que cada caracter que le llegue al PIC por el USB ( c ) lo transmita al módulo de RF y cada caracter que le llegue al PIC por el módulo de RF ( d ) lo transmita al USB.

Una cuestión muy importante es el PLL del PIC

Necesitamos que a nuestro micro le lleguen sólo 4MHz por lo que hay que usar un prescaler. Para ello en CCS se usa la sentencia PLLX, donde X significa la división de nuestro clock. Así pues si tenemos un cristal de 20MHz, el prescaler tendrá que ser 20 : 4 = 5 ->PLL5. Si por el contrario nuestro cristal es de 12MHz sería PLLl3.

Ahora bien, ¿Dónde personalizamos nuestro dispositivo?.

Esta se realiza en el archivo usb_desc_cdc.h en las siguientes líneas de código.

.....
.....
.....

const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
//starts of with device configuration. only one possible
USB_DESC_DEVICE_LEN, //the length of this report ==0
0x01, //the constant DEVICE (DEVICE 0x01) ==1
0x10,0x01, //usb version in bcd ==2,3
0x02, //class code. 0x02=Communication Device Class ==4
0x00, //subclass code ==5
0x00, //protocol code ==6
USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7

0xD8,0x04, //vendor id (0x04D8 is Microchip)//Aqui se cambia el VID, VID = 04D8
0x0A,0x00, //product id // Aquí se cambia el ID, ID = 000A

0x00,0x01, //device release number ==12,13
0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below) ==14
0x02, //index of string descriptor of the product ==15
0x00, //index of string descriptor of serial number ==16
USB_NUM_CONFIGURATIONS //number of possible configurations ==17

.....
.....
.....

Hacer notar que la numeración hexadecimal de la descripción del VID / ID va al revés, es decir, el primero número hex. será el último y viceversa.

.....
.....
.....

char const USB_STRING_DESC[]={
//string 0
4, //length of string index
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
0x09,0x04, //Microsoft Defined for US-English
//string 1
8, //length of string index (número de letras + 1)*2->(3 + 1)*2=4*2=8
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'J',0,
'V',0,
'R',0,
//string 2
34, //length of string index (número de letras + 1)*2->(16 + 1)*2=17*2=34
USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
'V',0,
'C',0,
'P',0,
' ',0,
'M',0,
'U',0,
'C',0,
'H',0,
'O',0,
' ',0,
'T',0,
'R',0,
'A',0,
'S',0,
'T',0,
'O',0
};

#ENDIF

La longitud de la cadena tiene que ser exacta, sino saldrán caracteres que no tienen que ver con nuestro dispositivo si el número de la cadena es mayor o se suprimirán caracteres si el número de la cadena es inferior, para ello hay una fórmula muy sencilla que es:

(Número de letras + 1)*2 = longitud a poner

Ejemplo en string1 queremos poner JVR, esta tiene 3 caracteres por tanto:

longitud a poner = ( 3 + 1 ) + 2 = 4 + 2 = 8

Es recomendable cambiar la velocidad de comunicación del CRC desde el PIC (baudRate) ya que así nos aseguraremos de no tener error alguno en nuestro dispositivo. Esto lo podemos realizar desde el archivo usb_cdc.h cambiando la siguiente línea de código en la función void usb_cdc_init(void):

.....
.....
.....

void usb_cdc_init(void) {
usb_cdc_line_coding.dwDTERrate=19200; //BaudRate que vamos a usar
usb_cdc_line_coding.bCharFormat=0;
usb_cdc_line_coding.bParityType=0;
usb_cdc_line_coding.bDataBits=8;

.....
.....
.....

Instalación PIC

Para que nuestro dispositivo sea detectado por el ordenador lo primero que tenemos que hacer es configurar nuestro driver. Para ello abriremos con el archivo mchpcdc.inf que se encuentra en la url

...\ VCP Microchip \ Drivers VCP \ win_2k_winxp \ mchpcdc.inf

Contiene lo siguiente:

; Windows USB CDC ACM Setup File
; Copyright (c) 2000 Microsoft Corporation
; Copyright (C) 2004 Microchip Technology Inc.

[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%MCHP%
LayoutFile=layout.inf
DriverVer=08/17/2001,5.1.2600.0

[Manufacturer]
%MFGNAME%=DeviceList

[DestinationDirs]
DefaultDestDir=12

[SourceDisksFiles]

[SourceDisksNames]

[DeviceList]
;Aquí deberemos de poner el mismo VID e ID //que hemos programado en el micro de lo controrio los drivers no ;serán detectados. VID = 04D8, ID=000A
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000A

;------------------------------------------------------------------------------
; Windows 2000/XP Sections
;------------------------------------------------------------------------------

[DriverInstall.nt]
CopyFiles=DriverCopyFiles
AddReg=DriverInstall.nt.AddReg

[DriverCopyFiles]
usbser.sys,,,0x20

[DriverInstall.nt.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[DriverInstall.nt.Services]
AddService=usbser, 0x00000002, DriverService

[DriverService]
DisplayName=%SERVICE%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\usbser.sys

;------------------------------------------------------------------------------
; String Definitions
;------------------------------------------------------------------------------

[Strings]
;Aquí pondremos la información de nuestro dispositivo
MCHP="www.MuchoTrasto.com"
MFGNAME="www.MuchoTrasto.com"
DESCRIPTION="Puerto de comunicaciones"
SERVICE="USB RS-232 Emulation Driver"

Una vez configurado el driver a nuestro gusto, pasaremos a la instalación del puerto de comunicaciones virtual.

Lo primero será conectar nuestro dispositivo a algún puerto usb libre que tengamos. Nada más conectar el usb al ordenador aparecerá el asistente para hardware nuevo encontrado, si este nos pregunta conectarnos a Windows Update le diremos "No por el momento" y pulsaremos siguiente.

A continuación seleccionaremos "Instalar desde una lista o ubicación específica (avanzada)" y pulsamos siguiente.

Seleccionaremos "Buscar el controlador más adecuado en estas ubicaciones", "Incluir esta ubicación en la búsqueda", para a continuación pulsar sobre el botón con la etiqueta "Examinar".

Aparecerá un explorador de windows donde iremos a los archivos bajados de la sección de download "Drivers CRC Muchotrasto" y accederemos a la url:

...\ VCP Microchip \ Drivers VCP \ win_2k_winxp

Pulsaremos sobre el botón "Aceptar" del explorador y a continuación al botón "Siguiente" de la ventana del asistente.

Buscará el dispositivo en pocos segundos ya que hemos puesto la ubicación exacta donde encontrarlo

Le daremos a continuar a la advertencia de Windows...

Y ya habremos instalado nuestro dispositivo correctamente con lo que pulsamos el botón "Finalizar"

Para asegurarnos que nuestro puerto serie de comunicaciones ha sido correctamente instalado tendremos que acceder al administrador de dispositivos que se encuentra en:

Inicio -> Panel de Control -> Sistema -> Hardware -> Administrador de dispositivos

Si expandimos Puertos (COM & LPT) y a continuación hacemos doble click sobre Puerto de comunicaciones (COM8) veremos los datos de nuestro dispositivo.

Fabricante: www.MuchoTrasto.com

Ubicación: Ubicación 0 (VCP MUCHO TRASTO)

Podemos cambiar el puerto por defecto que crea nuestro ordenador, es decir a nosotros por ejemplo nos ha creado el COM8 por lo que si queremos cambiarlo a COM4, tendremos que acceder a la pestaña "Configuración de puerto" y luego pulsamos sobre el botón "Opciones avanzadas". Seleccionaremos en el slider con etiqueta "Número de puerto COM" el que creamos conveniente en nuestro caso COM4 y pulsamos sobre Aceptar.

Si nos fijamos y vamos a la pestaña detalles dentro de las propiedades de Puerto de comunicaciones y seleccionamos en el slider Id. de instancia de dispositivo, veremos el VID e ID que hemos programado en el microcontrolador.

Programación PC

Para comprobar que nuestro enlace radio funciona perfectamente hemos realizado una aplicación en Delphi, el cual es un chat para comunicarse entre dos pc de forma sencilla, con tan sólo seleccionar las características del puerto virtual que nuestro PIC ha creado.


Captura del chat en Delphi

Más adelante podréis encontrar este ejemplo de aplicación explicado y desarrollado en la sección de programación tanto en Visual C++ , Visual basic y Delphi. Por el momento podéis descargaros el ejecutable más adelante.

Download

Esquemático en OrCAD.

Proyecto PIC en CCS.

Drivers CRC Muchotrasto.

Ejecutable Chat en Delphi.

 
 



Inicio | Foro | FAQ | MapaWeb | BuscadorWeb