Catégories
Algorithme Arduino projet matlab Projets Arduino Projets électroniques Projets traitement d'image Projets traitement du signal Traitement du signal sur matlab

Projet ARDUINO + MATLAB: Détection de Mouvement – Partie 2/2 [PROJET COMPLET]

Objectifs

  • Savoir établir la liaison avec le port série
  • Savoir établir la liaison avec le port caméra
  • Savoir détecter les mouvements dans une image
  • Savoir transférer les données vers la carte Arduino
  • Savoir commander des LEDs avec Matlab via la carte Arduino
  • S’initier à la commande avec Matlab
  • Etc.

Voir le tuto pour plus de détails

Programme Matlab

Principe

L’idée principale consiste à envoyer  via le port série à la carte Arduino une valeur entière DET au moment de la détection du mouvement, 0 à l’absence du détection.  Pour soulager le port série, on transmit la valeur uniquement au moment de la détection de la façon suivante :

if DET~=0

        fprintf(SerialCOM,'%d\n',DET);

end

La fonction openCam()

function cam = openCam(Type, Source)

if Type==0
cam = imaqfind; % Trouver l'objet en mémoire (s'il existe!)
if(~exist('cam'))
cam=videoinput('winvideo',Source); % Déclaration
set(cam,'ReturnedColorSpace','GRAY'); % GRAY
triggerconfig(cam, 'manual'); % Définition du Trigger
start(cam); % Déclanchement
else
delete(cam);
cam=videoinput('winvideo',Source);
set(cam,'ReturnedColorSpace','GRAY');
triggerconfig(cam, 'manual');
start(cam);
end;
end;

if Type~=0
cam = imaqfind; % Trouver l'objet en mémoire (s'il existe!)
if(~exist('cam'))
cam=videoinput('winvideo',Source); % Déclaration
set(cam,'ReturnedColorSpace','RGB'); % RGB
triggerconfig(cam, 'manual'); % Définition du Trigger
start(cam); % Déclanchement
else
delete(cam);
cam=videoinput('winvideo',Source);
set(cam,'ReturnedColorSpace','RGB');
triggerconfig(cam, 'manual');
start(cam);
end;
end;

end

La fonction openSerial()

function SerialCOM = openSerial(namePort, baudValue)

% Paramètres de la liaison série (COM)
NumBits=8; % Nomble de bits

SerialCOM=instrfind;
if(~exist('SerialCOM'))
% Création d'un objet Serial Port
SerialCOM = serial(namePort,'BaudRate',baudValue,'DataBits', NumBits, 'Parity', 'none');
SerialCOM.Terminator = 'LF';
set(SerialCOM, 'Timeout',2);

% Connexion du port
fopen(SerialCOM);
else
% Fermeture du port
delete(SerialCOM);

% Création d'un objet Serial Port
SerialCOM = serial(namePort,'BaudRate',baudValue,'DataBits', NumBits, 'Parity', 'none');
SerialCOM.Terminator = 'LF';
set(SerialCOM, 'Timeout',2);

% Connexion du port
fopen(SerialCOM);
end;

end

Programme complet

close all; clc; clear all;




%% Ouverture de la Caméra (Multi-sources)

Type=0;      % 0(GRAY), 1(RGB)

Source=1;    % 1(CAM1), 2(CAM2), ...

cam=openCam(Type,Source);

% figure(1); imshow(getsnapshot(cam)); return;




%% Ouverture du port série

namePort='COM3';

baudValue=9600;

SerialCOM = openSerial(namePort, baudValue);




%% Paramètres du programme

M=512; N=512;

Nfil=3; % Taille du Buffer

im_A=zeros(Nfil,M,N);

j=1;

Seuil=0.05;




%% Détection & Transfert vers Arduino

while 1

    %% Lecture de l'image courante

    im=imadjust(im2double(getsnapshot(cam)));

    im_in=imresize(im,[M N]);

   

    %% Calcul de l'intensité / Détection

    Moy=squeeze(mean(im_A)) ;

    I_diff=Moy(:)-im_in(:);

    RMSE=sqrt(mean(I_diff.^2));

    DET=20*double(RMSE>Seuil)

   

    %% Mise à jour du buffer

    im_A(j,:,:)=im_in;

    j=j+1;

    if j==Nfil+1

        j=1;

    end;

   

    %% Transfert vers la carte Arduino

    if DET~=0

        fprintf(SerialCOM,'%d\n',DET);

    end

   

    %% Image Binaire

    Imb=(Moy-im_in)>0.5;

   

   

    %% Affichage

    Im=[Imb im_in];

    figure(1); imshow(Im);

end

Programme Arduino

On scrute le port série à la recherche de la valeur DET transmis par Matlab. Ensuite, on déclenche une action dés la détection de la valeur en question (allumer une LED, déclencher une alarme, fermeture des ports, envoie un SMS, etc.).

#define   LEDPin1  50

#define   LEDPin2  48







// Valeur acquise

int DataDet=0;

const int ValDet=20;




void setup() 

{

  // Init port série

  Serial.begin(9600);




  // Init des LEDs 

  pinMode(LEDPin1, OUTPUT);

  pinMode(LEDPin2, OUTPUT);




  // Initialisation

  digitalWrite(LEDPin1, HIGH);

  digitalWrite(LEDPin2, HIGH);     

}




void loop() 

{

    // Lecture du détecteur 

    DataDet = Serial.parseInt();

      

    // Mise à jour de l'état de la LED

    if(DataDet==ValDet)

    {

      digitalWrite(LEDPin1, HIGH);

      digitalWrite(LEDPin2, HIGH); 

    }

    else

    {

      digitalWrite(LEDPin1, LOW);

      digitalWrite(LEDPin2, LOW); 

    }  

}

Accueil Traitement d’Images | Matlab

Laisser un commentaire