Академический Документы
Профессиональный Документы
Культура Документы
Programación en matlab
Para la realización del código en matlab estos son los los
comandos principales a 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 de pin, 'output o 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, salida);
Borrar Crear variable
comunicaciones global
existentes
Declarar el
puerto com a
utilizar
Relizar la Declarar
programación 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.
Revisar las
condiciones
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 <lcd.c>
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);
}
}
}