Projets Matlab & Microcontrôleur #2: Commande d’un moteur à CC avec une manette visuelle avec matlab et Arduino

Commande d'un moteur à CC avec une manette visuelle_ architecture

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)

Commande d'un moteur à CC avec une manette visuelle_ manette

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.

Commande d'un moteur à CC avec une manette visuelle_zone active

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: 

Commande d'un moteur à CC avec une manette visuelle_résultats (1)

 

Commande d'un moteur à CC avec une manette visuelle_résultats (1)

 

Commande d'un moteur à CC avec une manette visuelle_résultats (2)

************

Un petit commentaire de vous, un Grand encouragement pour nous 🙂

************

Téléchargement du projet 

************

Vidéo illustrative 

************

Articles

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *