Download comunicación arduino visual c++ por el cable usb

Document related concepts
no text concepts found
Transcript
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