IES Los Viveros Dpto. Electrónica. Luis Modesto González Lucas COMUNICACIÓN ARDUINO VISUAL C++ POR EL CABLE USB INTRODUCCIÓN La placa arduino se instala en el ordenador como un puerto serie, por lo que el acceso será similar a cualquier otra aplicación que se comunique con el puerto serie. CONTROL DEL FLUJO DE DATOS SERIE Usaremos el control control SerialPort que nos permitirá realizar una comunicación serial utilizando la interfaz RS232 que dispone nuestro ordenador o con un dispositivo USB que implementa la Clase CDC (Emulación de puerto serial). Al colocar éste control en nuestro formulario, se ubicará en la parte inferior de la ventana de diseño, 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 ejecución a partir de la interfaz gráfica que desarrollemos. Ajustamos las propiedades básicas, en nuestro caso, la velocidad a 9600. El puerto serie, se comportará como un dispositivo de e/s. La operación 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 código 100 serialPort1->PortName="COM"+COMPORT; serialPort1->Open(); serialPort1->Write(buffer,0,1); serialPort1->Close(); LECTURA Para la recepción de datos establecemos que ocurra un evento por parte del puerto serial al recibir un Byte, y allí utilizando la propiedad BytesToRead podemos determinar cuántos 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 línea (hasta recibir salto de línea) ->ReadLinea() o leer lo que se encuentre en el buffer de recepción ->ReadExisting (). En IES Los Viveros Sevilla Dpto. Electrónica. 1 IES Los Viveros Dpto. Electrónica. Luis Modesto González Lucas nuestro caso leemos lo que hay en el buffer, lo guardamos en un string e invocamos a una función 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 carácter.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 línea 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, podríamos hacer: Código 50 para leer entrada analógica 0. Código 51 para leer entrada analógica 1. .. Código 60 para leer entrada digital 0. Código 61 para leer entrada digital 1. .. Código 70 para escribir en la salida analógica 0; Código 71 para escribir en la salida analógica 1; .. Código 80 para escribir en la salida digital 0; Código 81 para escribir en la salida digital 1; .. Para finalizar el protocolo, haremos que las lecturas se envíen con el código + un guión”-“+el valor+ retorno de carro. El retorno de carro nos simplificará la tarea de la lectura. PETICIÓN DE DATOS (Visual C++). La petición de datos, la realizará el programa en visual C. Para ello enviará un código correspondiente a la entrada que quiero leer o asignar. Por ejemplo para leer la entrada analógica 1, haríamos: 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, debería 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 código podría ser: array<byte>^ buffer = gcnew array<byte>(10);; int cont,x,i,j; cont=serialPort1->BytesToRead; //leo nº de bytes en buffer recepción if(cont>0) { // Si hay datos a leer... IES Los Viveros Sevilla Dpto. Electrónica. 2 IES Los Viveros Dpto. Electrónica. Luis Modesto González 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 código en Arduino también debe entender el protocolo. Para nuestro caso, podría 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 leído del ADC 0 o del 1 según el código } //Genera un retardo breve } delay(10); } El código debería incluir dentro del switch, todas las opciones que yo quiera tener activas IES Los Viveros Sevilla Dpto. Electrónica. 3