4.6 Programación de puerto USB
Carlos Iván Hernández Sánchez | 18112361
Carlos Iván Hernández Sánchez | 18112361
En lenguaje ensamblador, la importancia del Bus de Serie Universal radica en la utilización y el control de los dispositivos periféricos de la computadora. Aunque los objetivos de la utilización de este puerto son importantes, programar este puerto con ensamblador siempre ha resultado una tarea difícil, por lo cual se empezaron a utilizar lenguajes de programación de alto nivel para hacer uso de este puerto.
En tareas mas especificas, se puede realizar la programación de este puerto utilizando una interfaz de conexión del puerto USB , convirtiendo los datos a una entrada serial. Uno de los métodos mas utilizados para el control de este puerto , es la utilización de microcontroladores PIC. Los PIC son una familia de microcontroladores programables desarrollador por Microchip Technology Inc.
Los microcontroladores PIC son programables y se utiliza el lenguaje ensamblador para ello, cada PIC tiene un juego de instrucciones utilizables con las que se puede programar y aunque la sintaxis no es exactamente igual, son bastante similares por lo que un programador que sepa ensamblador puede fácilmente programar microcontroladores.
Una de las placas programables integradas con un microcontrolador muy potentes es Arduino. La cual es muy útil para una infinidad de proyectos posibles, programadas con lenguaje de alto nivel.
CARACTERISTICAS FISICAS PARA CONTROL DEL BUS DE SERIE UNIVERSAL
El interfaz USB en el ordenador nos permite tener un puerto serie virtual que usamos para conectar con Arduino. Además de comunicación, USB es un interfaz de alimentación.
Físicamente un USB tiene 4 pines:
Como todo producto, el USB tuvo una fase de testing y prototipado previa al lanzamiento que consistió en un proceso de desarrollo hasta alcanzar la versión 1.0 que finalmente fue lanzada en 1996. Estas versiones que nosotros nunca llegamos a utilizar fueron:
USB 0.7: lanzado en noviembre de 1994.
USB 0.8: lanzado en diciembre de 1994.
USB 0.9: lanzado en abril de 1995.
USB 0.99: lanzado en agosto de 1996.
USB 1.0 a 2.0: los dos cables pueden tanto emitir como recibir, pero no al mismo tiempo. Es lo que conocemos como half dúplex. Su intensidad de salida es de 500 mAh.
USB 3.0 en adelante: el número de cables se aumenta a cuatro y esto permite enviar y recibir datos simultáneamente: dos para cada función. Esto sería full dúplex. Su intensidad es de 900 mAh.
Se observan los dos pines de datos D+ y D- . Los cuales utilizaremos para mandar información.
Aunque la mayoría de pc’s ya ofrecen protección interna se incorpora un fusible rearmadle de intensidad máxima 500mA con la intención de proteger tanto la placa Arduino como el bus USB de sobrecargas y cortocircuitos. Si circula una intensidad mayor a 500mA por el bus USB (Intensidad máxima de funcionamiento), el fusible salta rompiendo la conexión de la alimentación. Podemos probar esto cortocircuitando GND y 5V en Arduino.
En el caso del USB el 0 y 1 se distingue por la diferencia de voltaje entre D+ y D-
La forma que tenemos de comunicar Arduino con el ordenador y para programarlo es mediante el USB. Casi todos los Arduinos y compatibles tienen un interfaz USB y sino usaremos un cable FTDI que nos hará la función de convertirnos el interfaz serie de la UART de Arduino a un interfaz USB. No confundir con lo visto anteriormente de uso del ICSP para programar, puesto que en ese caso programamos directamente la MCU sin necesidad de un bootloader.
CONTROL DE LEDS A TRAVES DEL PUERTO USB TIPO B PARA ENCENDER LEDS CON ATMEGA328P DE ARDUINO
//PROGRAMACION DEL PUERTO SERIAL USB CON ARDUINO
//CONTROL DE LEDS
//CARLOS IVAN HERNANDEZ SANCHEZ
void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT); //SE CONFIGURA EL PIN 13 COMO E/S
pinMode(12,OUTPUT); //SE CONFIGURA EL PIN 12 COMO E/S
}
void loop()
{
while(Serial.available() > 0)
{
String cadena = Serial.readStringUntil('\n');
cadena = cadena.substring(0, cadena.length());
Serial.println("Cadena: " + cadena); //SE CONFIGURAN LOS MENSAJES ENTRANTES
if(cadena == "modo1") // IF PARA LA SELECCION DEL MODO 1
{
digitalWrite(13, HIGH); // SE MANDA UN ESTADO LOGICO 1 AL PIN 5
digitalWrite(12, LOW); // SE MANDA UN ESTADO LOGICO 0 AL PIN 4
Serial.println("Led 1 Encendido"); // SE IMPRIME EL MENSAJE DE LED ENCENDIDO
Serial.println("Led 2 Apagado"); // SE IMPRIME EL MENSAJE DE LED APAGADO
}
else if(cadena == "modo2") // IF PARA LA SELECCION DEL MODO 2
{
digitalWrite(12, HIGH); // SE MANDA UN ESTADO LOGICO 1 AL PIN 4
digitalWrite(13, LOW); // SE MANDA UN ESTADO LOGICO 1 AL PIN 5
Serial.println("Led 1 Apagado"); // SE IMPRIME EL MENSAJE DE LED ENCENDIDO
Serial.println("Led 2 Encendido"); // SE IMPRIME EL MENSAJE DE LED APAGADO
}
Serial.println();
cadena = "";
}
}
El diagrama del circuito es el siguiente:
Como se puede observar. A través de la terminal serial COM1 de USB podemos mandar ordenes de ejecución:
Circuito implementado:
De esta manera se puede controlar el puerto USB y ser programado para redirigir el trafico de datos.