sábado, 29 de marzo de 2014

Control de Arduino por MATLAB (Serial)



Hoy comparto sencillo código y una breve explicación de como comunicarnos con Arduino por medio de MATLAB, para quien aun no lo sabe esta comunicación se da por medio del puerto serial de Arduino es decir tanto el como con MATLAB tienen la posibilidad de enviar y recibir datos a través de puerto COM bueno comencemos primero con la parte de MATLAB.

PS=serial('COM12');
set(PS,'Baudrate',9600); % se configura la velocidad a 9600 Baudios
set(PS,'StopBits',1); % se configura bit de parada a uno
set(PS,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8
set(PS,'Parity','none'); % se configura sin paridad
set(PS,'Terminator','CR/LF');% “c” caracter con que finaliza el envío 
set(PS,'OutputBufferSize',2); % ”n” es el número de bytes a enviar
set(PS,'InputBufferSize' ,2); % ”n” es el número de bytes a recibir
set(PS,'Timeout',5); % 5 segundos de tiempo de espera


fopen(PS);
b='e';
for v=1:10

b =input('Ingrese comando: ','s');

for j=1:1
fwrite(PS,b,'uchar');
end

end
fclose(PS); 
delete(PS);
clear PS;

Como podemos ver el código es bastante sencillo y lo primero que tenemos que realizar es la configuración de transmisión de datos como velocidad, paridad, bits de parada, etc.  Arduino debe tener la misma velocidad de transmisión y configuración para que la comunicación se pueda dar.

// La funcion "fopen(); nos abre la comunicación del puerto
fopen(PS);

// Esta es la parte central del programa aquí declaramos una variable de cadena que estaremos editando por medio del serial durante 10 veces es decir no pedirá ingresar un comando en 10 ocasiones donde nosotros podremos enviar cualquier carácter o letra para que el Arduino lo reciba e interprete.
b='e';
for v=1:10

b =input('Ingrese comando: ','s');

for j=1:1
fwrite(PS,b,'uchar');
end

end

//La funcion "fclose(); nos cierra la comunicación del puerto
fclose(PS); 
delete(PS);


clear PS;

Esto seria todo en la parte de MATLAB, el código de Arduino lo dejo en la parte de abajo confió que no tendrán ningún problema en entenderlo lo único que hace es estar a la espera de recibir por medio del puerto serial ya sea una 'e' o una 'd' para encender o apagar el PIN13 donde tenemos un LED.

int lucesA = 13;              
char tecla;
  void setup() {
                pinMode(lucesA, OUTPUT);
                Serial.begin(9600);            // Inicializamos el puerto serial a 9600 baudios
               }


  void lucesA_on() {
                    digitalWrite(lucesA, HIGH);
                   }

  void lucesA_off() {
                     digitalWrite(lucesA, LOW);
                    }

  void Comando() {
                  if (Serial.available()) {
                                           tecla = Serial.read();
                                          }
                  if (tecla == 'd') { // luces altas on
                                     lucesA_on();
                                    } 
                  else if (tecla == 'e') { // luces altas off
                                          lucesA_off();
                                         }
                 }

  void loop() { //ciclo infinito de muestreo de la variable Val para el Switch de casos
               Comando();
              }

Espero les sirva saludos.