Para la comunicación matlab arduino.
Se debe descargar previamente una carpeta de la pagina http://www.mathworks.com/academ http://www.math works.com/academia/arduino-softwar ia/arduino-software/arduinoe/arduinomatlab.html donde se encuentra la librería arduino.m, donde la comunicación arduino-matlab ya esta creada. Se ejecuta ejecuta el archivo archivo install_arduino.m install_arduino.m en matlab y el siguiente paso es correr el programa arduino.m que nos permite la conexión entre el matlab y nuestra tarjeta arduino.
Programación en matlab Para la realización del código en matlab estos son los los comandos principales a utilizar: Borrar cualquier comunicación existente entre matlab y el puerto USB delete(instrfind({'Port' delete(instrfind({ 'Port'},{ },{'COM4' 'COM4'})) })) Crear una variable global y utilizar la librería arduino.m especificando el puerto COM a utilizar global variable; global variable; variable = arduino('puerto arduino('puerto COM a utilizar'); utilizar'); Declarar los pines del arduino como salidas o entradas según sea el caso, esto es por medio del comando pinMode variable.pinMode(numero variable.pinMode(numero de pin, 'output o input'); input'); Para indicar a arduino que coloque una pin en estado alto o bajo se utiliza el comando digitalWrite seguido del numero de pin a utilizar y el valor digital que deseamos que represente 0 ó 1; Variable.digitalWrite(pin, Variable.digitalWrite(pin, salida);
Borrar comunicaciones existentes
Crear variable global
Declarar el puerto com a utilizar
Relizar la programación
Declarar entradas y salidas
Programación en arduino Para la programación del arduino, dentro de la carpeta descargada anteriormente se busca el archivo adiosrv.pde se abre y se carga en el arduinio, que simplemente lee los datos recibidos por el matlab por medio del puerto USB.
Programación en picc. el pic se encarga de interpreta los resultado del arduino, mostrado en la tablilla de leds y codificarlos a un lenguaje mejor entendido por el operador esto es en un mensaje de texto mostrado en una pantalla de cristal liquido. Esto es conectando las salidas del arduino con los pines que declaramos de entrada en el microcontrolador.
Mostrar un mensaje de verificacion
Evaluar las entradas
Revisar las condiciones
Mostrar el resultado de la evaluación.
Borrar los mensajes de la pantalla
DIAGRAMA
MATLAB
ARDUINO
MICROCONTROLADOR
PROGRAMA MATLAB global a; axes(handles.axes2) fondo=imread('fondo.jpg'); image(fondo); axis off a.digitalWrite(10,0); a.digitalWrite(11,0); a.digitalWrite(12,0); a.analogWrite(3,40); x=0; vid=videoinput('winvideo',1); while (x==0) val=a.digitalRead(2); if(val==0) x=0; elseif(val==1) x=1; end end pause(1); c=getsnapshot(vid); a.analogWrite(3,0); RGB=c; axes(handles.axes2) image(c); axis off c1=c(:,:,1); c2=c(:,:,2); c3=c(:,:,3); x1=mean2(c1) x2=mean2(c2) x3=mean2(c3) I = rgb2gray(RGB); threshold = graythresh(I); BW = not(im2bw(I,threshold)); bw = bwareaopen(BW,1500); se = strel('disk',2); bw = imclose(bw,se); bw = imfill(bw,'holes'); [B,L] = bwboundaries(bw, 'noholes'); figure; imshow(label2rgb(L, @jet, [.5 .5 .5])) hold on for k = 1:length(B) boundary = B{k}; plot(boundary(:,2), boundary(:,1), 'w','LineWidth', 4)
end stats = regionprops(L, 'Area','Centroid'); threshold = 0.94; metric=0; for k = 1:length(B) boundary = B{k}; delta_sq = diff(boundary).^2; perimeter = sum(sqrt(sum(delta_sq,2))); area = stats(k).Area; metric = 4*pi*area/perimeter^2 metric_string = sprintf( '%2.2f',metric); if metric > threshold centroid = stats(k).Centroid; plot(centroid(1),centroid(2), 'ko'); end text(boundary(1,2)35,boundary(1,1)+13,metric_string, 'Color','y','FontSize',14, 'FontWeight','bold'); end title(['La métrica indica que conforme se acerca a 1 ' ,'el objeto es más redondo' ]); if (metric>0.8) fprintf('circulo ') forma=1; elseif (metric<0.8 && metric>0.6) fprintf('cuadro ') forma=2; elseif (metric<0.6) fprintf('triangulo ') forma=3; end if (x1>x2) && (x1>x3) fprintf('rojo\n') a.digitalWrite(10, 1); if (forma==1) a.digitalWrite(7, 1); elseif (forma==2) a.digitalWrite(8, 1); elseif (forma==3) a.digitalWrite(9, 1); end pause(5); a.digitalWrite(7, 0); a.digitalWrite(8, 0); a.digitalWrite(9, 0); a.digitalWrite(10, 0); elseif (x2>x1) && (x2>x3)
fprintf('verde\n') a.digitalWrite(11, 1); if (forma==1) a.digitalWrite(7, 1); elseif (forma==2) a.digitalWrite(8, 1); elseif (forma==3) a.digitalWrite(9, 1); end pause(5); a.digitalWrite(7, 0); a.digitalWrite(8, 0); a.digitalWrite(9, 0); a.digitalWrite(11, 0); elseif (x3>x1) && (x3>x2) fprintf('azul\n') a.digitalWrite(12, 1); if (forma==1) a.digitalWrite(7, 1); elseif (forma==2) a.digitalWrite(8, 1); elseif (forma==3) a.digitalWrite(9, 1); end pause(5); a.digitalWrite(7, 0); a.digitalWrite(8, 0); a.digitalWrite(9, 0); a.digitalWrite(12, 0); end
PROGRAMA ARDUINO
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define INTERNAL INTERNAL1V1 #endif void setup() { int i; for (i=0;i<20;i++) { pinMode(i,INPUT); digitalWrite(i,0); } Serial.begin(115200); } void loop() { static int s = -1; static int pin = 13; int val = 0; int agv = 0; int dgv = 0; if (Serial.available() >0) { val = Serial.read(); switch (s) { case -1: if (val>47 && val<90) { s=10*(val-48); } if ((s>40 && s<90) || (s>90 && s!=340)) { s=-1; } break; case 0: if (val>98 && val<117) { pin=val-97; s=1; } else { s=-1; } break; case 1: if (val>47 && val<50) { if (val==48) { pinMode(pin,INPUT);
} else { pinMode(pin,OUTPUT); } } s=-1; break; case 10: if (val>98 && val<117) { pin=val-97; dgv=digitalRead(pin); Serial.println(dgv); } s=-1; break; case 20: if (val>98 && val<117) { pin=val-97; s=21; } else { s=-1; } break; case 21: if (val>47 && val<50) { dgv=val-48; digitalWrite(pin,dgv); } s=-1; break; case 30: if (val>96 && val<103) { pin=val-97; agv=analogRead(pin); Serial.println(agv); } s=-1; break; case 40: if (val>98 && val<117) { pin=val-97; s=41; } else { s=-1; }
break; case 41: analogWrite(pin,val); s=-1; break; case 90: if (val==57) { Serial.println(1); } s=-1; break; case 340: switch (val) { case 48: analogReference(DEFAULT); break; case 49: analogReference(INTERNAL); break; case 50: analogReference(EXTERNAL); break; default: break; } s=-1; break; default: s=-1; } } }
PROGRAMA MICROCONTROLADOR #include <16f84A.h> #fuses XT,NOWDT,NOPROTECT,PUT #use delay(clock=4000000) #use fast_io(B) #use fast_io(A) #define use_portb_lcd TRUE #include int i; void main() { set_tris_a(0b10000); output_a(0); set_tris_b(0x00); output_b(0); lcd_init(); i=0; lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"Bienvenido "); delay_ms(200); while(TRUE) { if (input(PIN_A0) && input(PIN_A3)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"triangulo rojo "); delay_ms(100); } else if (input(PIN_A0) && input(PIN_A4)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"triangulo verde "); delay_ms(100); } else if (input(PIN_A0) && input(PIN_B3)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"triangulo azul "); delay_ms(100); } else if (input(PIN_A1) && input(PIN_A3)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"cuadro rojo "); delay_ms(100);
} else if (input(PIN_A1) && input(PIN_A4)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"cuadro verde "); delay_ms(100); } else if (input(PIN_A1) && input(PIN_B3)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"cuadro azul "); delay_ms(100); } else if (input(PIN_A2) && input(PIN_A3)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"circulo rojo "); delay_ms(100); } else if (input(PIN_A2) && input(PIN_A4)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"circulo verde "); delay_ms(100); } else if (input(PIN_A2) && input(PIN_B3)) { lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"circulo azul "); delay_ms(100); } } }