Objectif :
Commande des actionneurs (LEDs et Moteur) par l’interface matlab avec une manette graphique.
Fonctionnement :
L’interface matlab est constituée d’une manette graphique dédiée au control de trois LED et un moteur à CC. L’appuie sur un bouton permet d’envoyer une commande via l’interface série à la carte Arduino qui active ensuite l’actionneur correspondant. On distingue 8 configurations possibles :
- ‘0’ : Toutes les interfaces en état d’attente, valeur par défaut
- ‘1’ : Activation de la LED 1
- ‘2’ : Activation de la LED 2
- ‘3’ : Activation de la LED 3
- ‘4’ Activation du moteur avec la vitesse minimale 1(V1)
- ‘5’ Activation du moteur avec la vitesse 2 (V2>V1)
- ‘6’ Activation du moteur avec la vitesse 3 (V3>V2)
- ‘7’ Activation du moteur avec la vitesse maximale 4 (V4>V3)
Note : la zone sensible pour chaque cas est limitée par un carrée encerclé par différente cercles (Voir le programme principe pour plus des détails concernant les dimensions de chaque zone sensible). Autrement dit, on peut activer une LED ou le moteur en cliquant sur un pixel à l’intérieur du cercle (voir l’image ci-dessous). Tous les pixels de la même zone génèrent la même valeur (du 1 à 7) et 0 en dehors des zones.
Code matlab: le programme principal (main.m)
% clear all;
close all;
clc;
%% Ouverture du port série
SerialCOM = Open();
%% Get image from disk
imm=imread('im_1.png');
imshow(imm)
num_disp=8;
im_0=uint8(zeros(num_disp,num_disp));
ValOut=0;
%% Read & Write Pixels
while(1)
%% Get values from screen
% Display original image
figure(1);
imshow(imm); axis on;clc;
ValOut
[xi,yi,P]=impixel;
% Extraction de la valeur
ValOut = Pixel2Action( xi,yi );
%% Send data to ARDUINO
Startt='#'; % Caractère de début de Tx
Endd='*'; % Caractère de fin de Tx
WriteData(ValOut,Startt,Endd, SerialCOM); % Transmission de données
end
%% Port Delete (Previous port if exist)
Delete(SerialCOM);
Code matlab: fonction de récupération de la valeur à partir des coordonnées du clic de la souris (Pixel2Action.m)
function ValOut = Pixel2Action( xi,yi )
%% Détection de la zone active et génerer la valeur
%% Correspondante variée entre 0 et 8.
% Initialisation
ValOut=0;
% LED1
l1_x0=208;l1_y0=165;l1_taille=70;
if (xi>= l1_x0)& (xi< l1_x0+l1_taille) &(yi>= l1_y0)& (yi< l1_y0+l1_taille)
ValOut=1;
end;
% LED2
l1_x0=404;l1_y0=189 ;l1_taille=22;
if (xi>= l1_x0)& (xi< l1_x0+l1_taille)& (yi>= l1_y0)& (yi< l1_y0+l1_taille)
ValOut=2;
end;
% LED3
l1_x0=544;l1_y0=186 ;l1_taille=22;
if (xi>= l1_x0)& (xi< l1_x0+l1_taille)& (yi>= l1_y0)& (yi< l1_y0+l1_taille)
ValOut=3;
end;
% Vitesse 1
l1_x0=714;l1_y0=113 ;l1_taille=38;
if (xi>= l1_x0)&(xi< l1_x0+l1_taille)& (yi>= l1_y0)& (yi< l1_y0+l1_taille)
ValOut=4;
end;
% Vitesse 2
l1_x0=652;l1_y0=177 ;l1_taille=38;
if (xi>= l1_x0)& (xi< l1_x0+l1_taille)& (yi>= l1_y0)& (yi< l1_y0+l1_taille)
ValOut=5;
end;
% Vitesse 3
l1_x0=716;l1_y0=241 ;l1_taille=38;
if (xi>= l1_x0)& (xi< l1_x0+l1_taille)& (yi>= l1_y0)& (yi< l1_y0+l1_taille)
ValOut=6;
end;
% Vitesse 4
l1_x0=779;l1_y0=179 ;l1_taille=38;
if (xi>= l1_x0)& (xi< l1_x0+l1_taille)& (yi>= l1_y0)& (yi< l1_y0+l1_taille)
ValOut=7;
end;
end
Programme Arduino:
/*
LED1: PIN 8
LED2: PIN 9
LED3: PIN 10
MOTEUR: PIN 11
*/
int data_in=0;
const int TimeEnable=3000;
void setup() {
/* *************** LEDs & Moteur ***************** */
// Configuration
pinMode(8, OUTPUT); // LED1
pinMode(9, OUTPUT); // LED2
pinMode(10,OUTPUT); // LED3
pinMode(11,OUTPUT); // MOTEUR
// Initialisation
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
/* ******************* UART ********************** */
Serial.begin(9600);
}
void loop()
{
// Vous pouvez remplacer l'instruction IF par SWITCH...CASE
if (Serial.read() =='#')
{
while(1)
{
// Get and set LED or Motor
data_in = Serial.parseInt();
// LED1
if (data_in==1)
{
digitalWrite(8, HIGH);
delay(TimeEnable);
digitalWrite(8, LOW);
}
// LED2
else if(data_in==2)
{
digitalWrite(9, HIGH);
delay(TimeEnable);
digitalWrite(9, LOW);
}
// LED3
else if(data_in==3)
{
digitalWrite(10, HIGH);
delay(TimeEnable);
digitalWrite(10, LOW);
}
// Moteur - Vitesse 1
else if(data_in==4)
{
analogWrite(11, 60);
delay(TimeEnable);
analogWrite(11, 0);
}
// Moteur - Vitesse 2
else if(data_in==5)
{
analogWrite(11, 120);
delay(TimeEnable);
analogWrite(11, 0);
}
// Moteur - Vitesse 3
else if(data_in==6)
{
analogWrite(11, 180);
delay(TimeEnable);
analogWrite(11, 0);
}
// Moteur - Vitesse 4
else if(data_in==7)
{
analogWrite(11, 250);
delay(TimeEnable);
analogWrite(11, 0);
}
else
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
if (Serial.read() =='*') break;
}
}
}
Photos du projet:
************
Un petit commentaire de vous, un Grand encouragement pour nous 🙂
************
Téléchargement du projet
************
Vidéo illustrative
************
3 réponses sur « Projets Matlab & Microcontrôleur #2: Commande d’un moteur à CC avec une manette visuelle avec matlab et Arduino »
Es’que je peut simuler ce projet en utilisant seulement des logiciels sur pc ?
Bonjour, Il vous faut un simulateur de port série virtuel afin de communiquer avec la carte Arduino via le port série dans un logiciel de dessin électrique. Voir le lien ci-dessous pour plus de détails:
https://www.electronique-mixte.fr/projet-capteur-de-son-logiciel-a-base-du-pic16877-matlab-isismikroc/
Bonjour; Oui, t peux envoyé les données via la liaison série virtuelle.
———————-
Es’que je peut simuler ça en utilisant des logiciels de l’ordinateur (proteus,multisim…) et sans avoir une carte arduino en réalité ?