Sei sulla pagina 1di 3

IES Los Viveros Dpto. Electrnica.

Luis Modesto Gonzlez Lucas

COMUNICACIN ARDUINO VISUAL C++ POR EL CABLE USB


INTRODUCCIN
La placa arduino se instala en el ordenador como un puerto serie, por lo que el acceso ser similar a cualquier otra aplicacin que se comunique con el puerto serie.

CONTROL DEL FLUJO DE DATOS SERIE


Usaremos el control control SerialPort que nos permitir realizar una comunicacin serial utilizando la interfaz RS232 que dispone nuestro ordenador o con un dispositivo USB que implementa la Clase CDC (Emulacin de puerto serial). Al colocar ste control en nuestro formulario, se ubicar en la parte inferior de la ventana de diseo, donde podemos establecer algunas de sus propiedades, como el puerto a utilizar, velocidad, cantidad de bits, bit de paridad, bit de stop, ect.. Muchos de estos ya los podremos dejar fijos o modificarlos en tiempo de ejecucin a partir de la interfaz grfica que desarrollemos.

Ajustamos las propiedades bsicas, en nuestro caso, la velocidad a 9600. El puerto serie, se comportar como un dispositivo de e/s. La operacin completa consistir en: seleccionar un nombre de puerto (PortName) - abrir el puerto, (Open) - realizar la lectura/escritura(Read/Write) - cerrar el puerto(Close) EJEMPLO ESCRITURA
array<byte>^ buffer = gcnew array<byte>(10); buffer[0]=100;//envia un cdigo 100 serialPort1->PortName="COM"+COMPORT; serialPort1->Open(); serialPort1->Write(buffer,0,1); serialPort1->Close();

LECTURA Para la recepcin de datos establecemos que ocurra un evento por parte del puerto serial al recibir un Byte, y all utilizando la propiedad BytesToRead podemos determinar cuntos bytes disponemos para leer. Si hay datos, tenemos varias opciones para realizar la lectura, leer bytes ->ReadByte(), leer cierta cantidad de bytes ->Read(), leer una lnea (hasta recibir salto de lnea) ->ReadLinea() o leer lo que se encuentre en el buffer de recepcin ->ReadExisting (). En
IES Los Viveros Sevilla Dpto. Electrnica. 1

IES Los Viveros Dpto. Electrnica.

Luis Modesto Gonzlez Lucas

nuestro caso leemos lo que hay en el buffer, lo guardamos en un string e invocamos a una funcin que se encarga de escribir los datos en un TextBox. EJEMPLO LECTURA
char a; if(serialPort1->BytesToRead>0) { // Si hay datos a leer... a=serialPort1->ReadChar(); // Leemos 1 carcter.label3->Text=" "+a; }

Cuando manejanos eventos del objeto serialPort, se crean hilos o threads, lo que nos puede originar errores. Para evitarlos, debemos poner esta lnea al comienzo del programa:
CheckForIllegalCrossThreadCalls = 0;

CREANDO UN PROTOCOLO
A la hora de enviar y recibir datos desde y hacia Arduino, debemos crear nuestro propio protocolo. Para ello, crearemos un conjunto de rdenes-respuestas que arduino reciba y ejecute. Por ejemplo, podramos hacer: Cdigo 50 para leer entrada analgica 0. Cdigo 51 para leer entrada analgica 1. .. Cdigo 60 para leer entrada digital 0. Cdigo 61 para leer entrada digital 1. .. Cdigo 70 para escribir en la salida analgica 0; Cdigo 71 para escribir en la salida analgica 1; .. Cdigo 80 para escribir en la salida digital 0; Cdigo 81 para escribir en la salida digital 1; ..

Para finalizar el protocolo, haremos que las lecturas se enven con el cdigo + un guin-+el valor+ retorno de carro. El retorno de carro nos simplificar la tarea de la lectura.

PETICIN DE DATOS (Visual C++).


La peticin de datos, la realizar el programa en visual C. Para ello enviar un cdigo correspondiente a la entrada que quiero leer o asignar. Por ejemplo para leer la entrada analgica 1, haramos:
array<byte>^ buffer = gcnew array<byte>(10);// creo un array buffer[0]=50;//leo entrada analogica 0 serialPort1->Write(buffer,0,1);

Con esto, el programa en arduino, debera responder con el valor de la lectura en dicha entrada. Para poder capturar la respuesta, debemos activar el evento Datareceived, del serialPort, para leer y procesar el dato recibido. El cdigo podra ser:
array<byte>^ buffer = gcnew array<byte>(10);; int cont,x,i,j; cont=serialPort1->BytesToRead; //leo n de bytes en buffer recepcin if(cont>0) { // Si hay datos a leer...
IES Los Viveros Sevilla Dpto. Electrnica. 2

IES Los Viveros Dpto. Electrnica.

Luis Modesto Gonzlez Lucas

b=serialPort1->ReadLine(); // Leemos los datos en buffer cadena=b->Split('-');//busco el primer guion y saco el comando switch ( int::Parse(cadena[0])){ case 50: Proceso del dato recibido, que est en cadena[1] break; .. });//del switch }//del if

ENVIO DE DATOS (Arduino)


En cdigo en Arduino tambin debe entender el protocolo. Para nuestro caso, podra ser:
void loop(){ int lectura; int dato,dato1; //Toma la lectura del ADC if (Serial.available())//Miro si hay datos en el puerto serie { dato=Serial.read(); switch(dato) { case 50:lectura = analogRead(0);Serial.print("50-");Serial.println(lectura);break; case 51:lectura = analogRead(1);Serial.print("51-");Serial.println(lectura);break; //Envia el dato ledo del ADC 0 o del 1 segn el cdigo } //Genera un retardo breve } delay(10); }

El cdigo debera incluir dentro del switch, todas las opciones que yo quiera tener activas

IES Los Viveros

Sevilla

Dpto. Electrnica.