Archives de catégorie : ARDUINO

Arduino avec la Camera Sen0305 , la reconnaissance faciale

.

Mise à jour le 11/11/2021 : Dans cet article vous trouverez les caractéristiques principales du module AI HuskyLens Gravity SEN0305 avec utilisation de la reconnaissance faciale .

Sommaire :

 

Retour au sommaire

.

.

Présentation du module AI HuskyLens Gravity SEN0305 

.

Le HuskyLens Gravity est un capteur visuel intelligent, économique, simple d’utilisation basé sur une caméra OV2640 associée à un afficheur 2″ IPS et à un processeur Kendryte K210.

Grâce au port UART / I2C, HuskyLens peut se connecter à Arduino et micro:bit pour vous aider à réaliser des projets très créatifs sans jouer avec des algorithmes complexes.

Spécification :

  • Processeur : Kendryte K210
  • Capteur d’images  : Objectif Husky SEN0305 : OV2640 (appareil photo 2,0 mégapixels).
  • Tension d’alimentation : 3,3 ~ 5,0 V
  • Consommation :  320 mA à 3,3 V , 230 mA à 5,0 V (mode de reconnaissance faciale ; luminosité du rétroéclairage à 80 % ; lumière d’ appoint éteinte).
  • Port de communication : UART ; I2C
  • Affichage : écran IPS de 2,0 pouces avec une résolution de 320*240
  • Algorithmes intégrés : reconnaissance faciale, suivi d’objets, reconnaissance d’objets, suivi de lignes, reconnaissance de couleurs, reconnaissance de balises, classification d’objets
  • Dimensions : 52 mm x 44,5 mm (2,05 * 1,75 pouces)

 

 

Retour au sommaire

.

Tuto sur la  reconnaissance facial

.

.

Retour au sommaire

.

Schéma de principe pour le cablage entre la carte Arduino Uno et la carte SEN0305

.

.

Matériel :

  • Régulateur 7805 en boitier TO2020
    • https://www.gotronic.fr/art-l7805cv-1578.htm
  • Module AI HuskyLens Gravity SEN0305
    • https://www.gotronic.fr/art-module-ai-huskylens-gravity-sen0305-31965.htm 
    • https://fr.rs-online.com/
      • code article  : 204-9898
  • Arduino UNO
    • https://www.gotronic.fr/ 
      • code article : 25950
 
 
 

 

 

 

Retour au sommaire

.

Programme de  reconnaissance faciale,  de suivis de visage et du mode patrouille

.

//
//
// *********************************************
//
// reconnaissance faciale
//  suivis de visage reconnu
//   mode patrouille 
//
// Arduino avec la Camera Sen0305
//
// 
// Code Modifié : Mazelin H
// RedOhm 
// Le 01/09/2021
// *********************************************



//  À utiliser pour déterminer s'il s'agit d'une flèche ou d'un bloc
//  -> COMMAND_RETURN_BLOCK : C'est un bloc
//  -> COMMAND_RETURN_ARROW : C'est une flèche
//
// Pour un bloc :
// xCenter : X Centre du bloc
// yCenter : Centre Y du bloc
// width : Largeur du bloc
// height : Hauteur du bloc

#include <Servo.h>
#include "HUSKYLENS.h"

HUSKYLENS huskylens;

void printResult(HUSKYLENSResult result);

// Variable de passage 
int passage_setup = 0 ;

// Crée un objet de type "Servo_X", nommé -> Servo_X
Servo servo_x;
Servo servo_y;

int position_x = 90 ;
int position_y = 90 ;

// variable pour le calcul de l'erreur de positionnement en x 
int erreur_x;
 // Variable pour La grandeur réglante en x. La valeur réglante est la grandeur de  
 // commande qui a été choisie pour contrôler la grandeur réglée
 int valeur_reglante_x;
// variable pour le calcul de l'erreur de positionnement en y 
int erreur_y; 
 // Variable pour La grandeur réglante en y. La valeur réglante est la grandeur de  
 // commande qui a été choisie pour contrôler la grandeur réglée
 int valeur_reglante_y;
// position du mode patrouille
int pos ;
 

// **********************************************************************
// Un programme Arduino doit impérativement contenir la fonction "setup"
// Elle ne sera exécutée une seule fois au démarrage du microcontroleur
// Elle sert à configurer globalement les entrées sorties
// **********************************************************************
void setup() {
    // initialisation de la connexion série
    // IMPORTANT : le terminal côté PC doit être réglé sur la même valeur.
    Serial.begin(115200);
    // on attent que le port de communication soit pret
    while (!Serial) {
     ; 
    }

    
    // communication i2c
    Wire.begin();
    while (!huskylens.begin(Wire))
    {
        Serial.println(F("Échec du démarrage!"));
        Serial.println(F("1.Veuillez revérifier le \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>I2C)"));
        Serial.println(F("2.Veuillez revérifier la connexion."));
        delay(100);
    }
   
// associe le servomoteur x à la broche 9   
   servo_x.attach(9);
 // associe le servomoteur y à la broche 9     
    servo_y.attach(8);
    delay(15);
// Positionne mes servomteurs à 90 (phase d'initialisation) 
   servo_x.write(position_x);
   servo_y.write(position_y);
// Réalise une pause dans l'exécution du programme pour une durée 
// de 50 millisecondes
// permettant au servomoteur d'atteindre sa position  
   delay(50);
} 



// **********************************************************************
// Le programme principal s’exécute par une boucle infinie appelée Loop ()
// ********************************************************************** 
void loop() {
    

    
    // verifie la connexion
    if (!huskylens.request())
    {
      Serial.println(F("Échec de la demande de données à HUSKYLENS, revérifiez la connexion!"));
    }

    // controle si le module possède des enregistrements  
    else if(!huskylens.isLearned())
    {
      Serial.println(F("Je suis desolé il faut appuyer sur le bouton d'apprentissage "));
    }
    
    // on verifie si le systeme ne detecte rien dans son champs de vision 
    else if(!huskylens.available())
    {
      Serial.println(F("Aucun bloc ou flèche n'apparaît à l'écran! Oryon ne detecte rien "));
      
      // mise en service du mode patrouille 
      // pour la recherche d'un visage 
      // x < y (position_x est inferieur à y)
      if (( position_x < 170)&&( pos == 0))  
      {
      position_x = position_x +1;      
      servo_x.write(position_x);
      
      }  
      else if (( position_x < 171)&&(position_x > 10))
      {
      pos = 1 ;
      position_x = position_x -1;      
      servo_x.write(position_x);   
      }
      else if (position_x <= 10)
      {
      pos=0;  
      }
      delay(20);
      Serial.println (position_x);
    }
    
    else
    {
        Serial.println(F("###########"));
        while (huskylens.available())
        {
            HUSKYLENSResult result = huskylens.read();
            printResult(result);

            
           
        }    
    }
}


//
void printResult(HUSKYLENSResult result){
    if (result.command == COMMAND_RETURN_BLOCK){
          Serial.println(String()+F("Block:xCenter=")+result.xCenter+F(",yCenter=")+result.yCenter+F(",width=")+result.width+F(",height=")+result.height+F(",ID=")+result.ID);
           
           
            // Deplacement de la camera sur horizontal cote droit 
            // 
            // x > y (result.xCenter est supérieur à y)
            if (result.xCenter > 165)
            {
              
              // calcul de l'erreur de positionnement 
              erreur_x = result.xCenter - 165 ; 
              // valeur_reglante
              valeur_reglante_x= map(erreur_x,1,50,1,5);
              position_x =position_x+valeur_reglante_x ;
              servo_x.write(position_x);  
            }

            // Deplacement de la camera sur horizontal cote gauche 
            // 
            else if ( result.xCenter < 155)
            {  
              // calcul de l'erreur de positionnement 
              erreur_x = 155 - result.xCenter ;
              // valeur_reglante
              // map -> Ré-étalonne un nombre d'une fourchette de valeur vers une autre fourchette
              // map (valeur, limite_basse_source, limite_haute_source, limite_basse_destination, limite_haute_destination)
              valeur_reglante_x= map(erreur_x,1,50,1,5);
              position_x = position_x - valeur_reglante_x ;
              
              servo_x.write(position_x);  
            }

            
            else if ((result.xCenter > 165)&&( result.xCenter < 155))
            {

            servo_x.write(position_x); 
            
            }
            // si la camera est trop haut
            if (result.yCenter < 115) 
            {
              // calcul de l'erreur de positionnement 
              erreur_y = 115-result.yCenter  ; 
              // valeur_reglante
              valeur_reglante_y= map(erreur_y,1,50,1,5); 
              position_y = position_y + valeur_reglante_y ;
              servo_y.write(position_y);       
            }

            // si la camera est trop basse 
            else if ( result.yCenter > 125)
            {  
              // calcul de l'erreur de positionnement pour la camera trop basse 
              erreur_y = result.yCenter -125  ; 
              // valeur_reglante
              valeur_reglante_y= map(erreur_y,1,50,1,5); 
              position_y = position_y -valeur_reglante_y ;
              servo_y.write(position_y);  
            }

           // Temporisation de stabilité 
           delay (100);
             
           
           // affectation du resultat a un prenom ( a une personne )
           if (result.ID == 1 )
           {
            Serial.println ("Bonjour Louis");
           }
           else if (result.ID == 2 ) 
           {
            Serial.println ("Bonjour Timeo");
           } 
           else if (result.ID == 3 ) 
           {
            Serial.println ("Bonjour au grand maitre ");
           } 
           else if (result.ID == 4 ) 
           {
            Serial.println ("Salut Johann ");
           }
           else if (result.ID == 5 ) 
           {
            Serial.println ("Bonjour Marie");
      
      
           }

    }      
    
    else if (result.command == COMMAND_RETURN_ARROW){
        Serial.println(String()+F("Arrow:xOrigin=")+result.xOrigin+F(",yOrigin=")+result.yOrigin+F(",xTarget=")+result.xTarget+F(",yTarget=")+result.yTarget+F(",ID=")+result.ID);
        
    }
    else{
        Serial.println("Objet inconnu!");
    }   
     
}

.

Retour au sommaire

 

Comment stocker des valeurs de plusieurs Octets

.

Mise à jour le 28/09/2021 : Comment traiter le stockage d’informations en mémoire EEPROM sur arduino avec l’instruction EEPROM.put.

Sommaire :

.

.

separateur-redohm-001

But du tutoriel

.

Dans le cadre du projet Oryon nous avons une partie programmation pour le système d’apprentissage du cobot. Le principe de l’apprentissage et d’enseigner au cobot les mouvements que l’on souhaite qu’il réalise en le manipulant simplement, et d’enregistrer des différents mouvements dans une mémoire afin qu’il nous les restitue quand on lui demande

Pour que l’on utilise le mode d’apprentissage il faut déjà ecrire un programme qui nous permettra que ce mode nous retranscrive automatiquement les déplacements de celui-ci. Voici un petit programme qui nous permet déjà d’avoir un petit aperçu de ce mode de stockage. La difficulté sur arduino étend de récupérer les valeurs du convertisseur 10 bits et de stocker la valeur des 2 octets en une seule fois dans la mémoire.

Le but de cet exemple est de montrer aussi l’instruction EEPROM.put()  qui écrit des données sur EEPROM ou en utilisant également EEPROM.update() qui écrit des données uniquement si elles sont différentes du contenu précédent des emplacements à écrire. Le nombre d’octets écrits est lié au type de données ou à la structure personnalisée de la variable à écrire.

.

Retour au sommaire

.

separateur-redohm-001

Principe de capture et d’ecriture en EEPROM de plusieurs octets

.

.

.

Retour au sommaire

.

.

separateur-redohm-001

Video sur l’ecriture de la mémoire EEPROM

.

.

Retour au sommaire

.

.

separateur-redohm-001

Programme pour l’ecriture et la lecture en EEPROM de plusieurs octets

.

//
//
//******************************************************
//
//But : Lecture d'une valeur de 10 bits et enregistrement  
//      de celle-ci en memoire EEPROM
//
// Par H-Mazelin
// RedOhm
// Le 26/05/2021
//******************************************************


#include <EEPROM.h>


// le potentiomètre, branché sur la broche analogique 6
 int potentiometre1 = 6;
//int address = 0 ;
 int valeur_eeprom ;


// *************************************************************
// Declaration des entrees et des sorties pour l'enregistrement 
const int Led_enregistrement = 25 ;

// déclaration de l'entrée du bouton branché sur la broche 15
// de votre carte Arduino 
int bouton15 = 15;
// variable du type int pour stocker les valeurs de passage du bouton15
int bouton15v;



// *************************************************************
// Declaration des entrees et des sorties la lecture 
const int Led_lecture = 26;


// déclaration de l'entrée du bouton branché sur la broche 16
// de votre carte Arduino 
int bouton16 = 16;
// variable du type int pour stocker les valeurs de passage du bouton16
int bouton16v;





void setup() {
  
//****************************************
//Mise en service du port de com 
//****************************************

//ouvre le port série et fixe le debit de communication à 9600 bauds
  Serial.begin(9600);
// on attent que le port de communication soit pret  
  while (!Serial) {
    ; 
  }

//****************************************
//Configuration des entrees pour les boutons de selection
//****************************************
pinMode (bouton15,INPUT );
pinMode (bouton16,INPUT );
  
//****************************************
//Configuration des sorties pour les Led
//****************************************
pinMode (Led_enregistrement,OUTPUT );
pinMode (Led_lecture,OUTPUT );

  
}

void loop() {


// ****************************************************
// creation de la commande enregistrement 
// ****************************************************

bouton15v = digitalRead(bouton15);

  if (bouton15v == 1)
  {
    digitalWrite (Led_enregistrement,HIGH);
    // appel de la fonction -> lecture de la position du servomoteur
    lecture_position();
  }
  
  else if (bouton15v == 0)
  {
  digitalWrite (Led_enregistrement,LOW);    
  } 

// ****************************************************
// creation de la commande de lecture
// ****************************************************
   
bouton16v = digitalRead(bouton16);
 



  if (bouton16v == 1)
  {
    digitalWrite (Led_lecture,HIGH);
    // appel de la fonction -> lecture de la memoire
    lecture_memoire_et_pilotage_servomoteur();
  }
  
  else if (bouton16v == 0)
  {
    digitalWrite (Led_lecture,LOW);
  } 
 
}


// Creation de la fonction lecture_position
// 
//*******************************************************
// Lecture des positions du servomoteur et enregistrement
//*******************************************************
//

void lecture_position()
{
 
Serial.println(" Attention lecture de la position et ecriture de la memoire dans 5 secondes : ");
delay (5000);
Serial.print ("");
Serial.println("c'est parti");



for (int i=0 ; i <= 32 ; i=i+2)
{
    
    
    // conversion de la tension de la borne 6 et transfert de la valeur 
    // numerique dans la variable valeur_eeprom

    valeur_eeprom=analogRead(potentiometre1); 
    delay(20);
    Serial.print("ecriture a l'adresse : ");Serial.print(i);
    Serial.print(" de la valeur => ");Serial.println(valeur_eeprom);
    // EEPROM.put permet d'ecrire n'importe quel type de données ou objet dans l'EEPROM.
    // la valeur de i permet de pointer l'adresse pour stocker la valeur 
    EEPROM.put (i,valeur_eeprom);
    delay(200); 
 }

    bouton15v == 0; 
    Serial.println("Fin d'enregistrement");
    delay(2000);
}



 
//********************************
// Lecture de la memoire EEPROM 
//********************************
//
// Creation de la fonction lecture_memoire_et_pilotage_servomoteur

void lecture_memoire_et_pilotage_servomoteur()
{
Serial.println("");
Serial.println(" Attention lecture de la memoire EEPROM dans 5 secondes");
delay (5000);

for (int i=0 ; i <= 32 ; i=i+2)
{
   
  // lire un octet à partir de l'adresse specifie dans la variable i
  EEPROM. get ( i , valeur_eeprom ) ;
  delay (100);
  Serial.print(i);
  Serial.print("\t");
  Serial.print(valeur_eeprom);
  Serial.println();
  
 }
  
 delay(500);
 bouton16v == 0;
 Serial.println("Fin de lecture ");
}

.

Retour au sommaire

.

separateur-redohm-001

Pour tout probléme 

.

Pour tout problème de téléchargement ou pour nous suivre sur les réseaux sociaux voici les plateformes  sur lesquelles nous éditons.
Cliquez sur celle qui vous intéresse .

Facebook  Twitter  Youtube 

Grabcad  Thingiverse  Cults  

.

Retour au sommaire

 

.

 

.

Arduino : Etude d’un chenillard 8 sorties à relais

Mise à jour le 13/10/2017 .Dans cet article, nous allons non seulement étudier le fonctionnement d’un chenillard, mais aussi la création de fonctions. Alors ! Une fonction c’est quoi ? Une fonction c’est ce qu’on pourrait également désigner sous le nom d’une procédure, de sous-programme ou d’une sous routine, c’est un ensemble d’instructions que l’on peut appeler dans n’importe quelle partie du programme principal. Dans cet article ,vous aurez la liste du matériel correspondant, un tutoriel vidéo pour vous guider dans la programmation, ainsi que le listing du programme d’origine.

Sommaire :

  • Matériel utile pour ce tutoriel.
  • Programme du chenillard avec information sur le moniteur

Un tutoriel vidéo est en cours ainsi qu’un schéma électrique  

 

 

Matériel utile pour le tutoriel étude d’un chenillard 

Liste du materiel :

1 pièces  : Module bouton poussoir Grove 101020003 ou  bouton poussoir 111020000ou interrupteur Grove 101020004 .

Distributeur : Gotronic 

1 pièces  : Potentiomètre à glissière Grove 101020036 .Ce module potentiomètre compatible Grove délivre un signal analogique et est équipé d’une résistance de 10 kΩ idéale pour une utilisation avec les cartes Arduino ou compatibles.

 Potentiomètre à glissière Grove 101020036 . Pour la vitesse de défilement du chenillard

 Potentiomètre à glissière Grove 101020036 . Pour la vitesse de défilement du chenillard

Distributeur : Gotronic  / Lextronic 

 

1 pièce : Carte Arduino MEGA 2560 . La carte Arduino Mega 2560 est basée sur un ATMega2560 cadencé à 16 MHz. Elle dispose de 54 E/S dont 14 PWM, 16 analogiques et 4 UARTs. Elle est idéale pour des applications exigeant des caractéristiques plus complètes que la Uno. Des connecteurs situés sur les bords extérieurs du circuit imprimé permettent d’enficher une série de modules complémentaires.

Distributeur : Gotronic  / Lextronic 

1 pièce : Module Grove Mega Shield V1.2 103020027 . Le module Grove Mega Shield de Seeedstudio est une carte d’interface permettant de raccorder facilement, rapidement et sans soudure les capteurs et les actionneurs Grove de Seeedstudio sur une carte compatible Arduino Mega. Il est compatible notamment avec les cartes Arduino Mega et Google ADK.

Module Grove Mega Shield V1.2 103020027

Module Grove Mega Shield V1.2 103020027 ( interface pour le chenillard utile mais pas obligatoire )

Distributeur : Gotronic 

 

1 pièce :Le Relais 5 V à 8 Canaux est un module 5 V de relais à 8 canaux. Il peut être contrôlé directement par une large gamme de microcontrôleurs, comme Arduino, AVR, PIC, ARM et MSP430. Ce module comporte 8 relais avec des ports « NC » (normalement connecté à COM) et « NO » (normalement ouvert à COM). Ce module est également équipé de 8 LED qui montrent l’état des relais.

Relais 5V à 8 Canaux - Sorites pour le chenillard

Relais 5V à 8 Canaux – Sorites pour le chenillard

Distributeur : Roboshop

Programme du chenillard avec information sur le moniteur

Programme : Version du 10/10/2017