Système de sécurité : Une alarme sonore s'active lorsqu'un tracteur est à l'arrêt alors qu'une prise de force est en marche

Bonjour je souhaite réaliser un projet.
Pour des raisons de sécurité, j'ai pour objectif d'émettre un bruit sonore quand un véhicule est à l'arrêt alors qu'un disque se trouve en rotation.
Je compte récupérer la vitesse d'avancement avec un Module GPS NEO-M6 couplé à un Arduino UNO. Pour cela j'ai trouvé le programme suivant :

# include <TinyGPS++.h>

# include <SoftwareSerial.h>

Static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;

SoftwareSerial ss (RXPin, TXPin);

Void setup(){

Serial.begin(9600);

ss.begin(GPSBaud);

}

Void loop (){

While (ss.avaibable()>0){

gps.encode(ss.read());

if (gps.speed.isUpdated()){

Serial.print("Speed in km/h = ");

Serial.println(gps.speed.kmph());

}

}

}

Est-il correcte ?
Ensuite je souhaite à l'aide d'un capteur inductif (pepperl+fuchs NBN8-12GM50-E0-V1) de détecter la mise en mouvement du disque.
Si le disque tourne alors que la vitesse d'avancement détecté par l'antenne GPS est nulle alors cela déclenche le buzzer.

J'espère que quelqu'un pourrait m'aider à trouver un code pour ce que je souhaite réaliser.
Merci d'avance

Bonjour vivic05

Comment comptes tu alimenter ton Arduino?

As-tu essayé ton montage, uniquement avec le GPS?
Est ce que, dans la console (9600) de l'IDE Arduino tu as la vitesse de ton GPS:
Serial.println(gps.speed.kmph());

Pour le câblage de ta sonde:
image
Le convertisseur 5-12V n'est pas nécessaire, cette sonde fonctionne de 5 à 36V. Par contre il faudra lui ajouter une résistance de PULL_UP
image

(environ 4,7k), du fait que l'on se trouve dans un environnement (véhicule) dit perturbé.

As-tu un lien sur le buzzer?

A+
Cordialement
jpbbricole

Mon arduino je pense l’alimenter avec le 12v de la prise 3 plots du coup je mettrai un convertisseur 12v->5v
Pour le moment c’était juste pour savoir si c’était faisable, je n’ai pas encore acheté les composants. Du coup je peux pas te dire si j’obtiens la vitesse du gps mais j’ai vu qu’avec ce type de module gps on pouvait obtenir la latitude, la longitude, la vitesse … avec précision .
Super merci pour l’info du branchement de la sonde.
En ce qui concerne le buzzer voici le lien :

Merci

Bonsoir vivic05

Je n'ai jamais fait, mais je pense que c'est faisable.

Tu peux alimenter ton Arduino par le jack entre 7 et 12 volts.
Si tu n'as que le capteur à alimenter en 5V, pas besoin de convertisseur, la pin 5V de l'Arduino suffit.

Pour commander le buzzer, pour simplifier, un module relais 12V
image
Ca te permettra de commander, en parallèle, une lampe de signalisation.

Cordialement
jpbbricole

D’accord super je te remercie pour les informations !!
En ce qui concerne le codage aurais-tu une idée ou pas du tout car je débute seulement et pour le moment je n’ai pas de connaissance en codage arduino ?

Cordialement

Vivic05

Bonsoir vivic05

Oui, ce n'est pas trop compliqué à réaliser, mais, avant tout, il te faut te familiariser avec l'environnement Arduino en faisant quelques exemples proposés dans l'IDE Arduino.

Une fois reçu le GPS, faire des exemples proposé par la bibliothèque TinyGPS++.h.
La lecture de ta sonde, correspond à lire une entrée digitale, essaies aussi ça.

A+
Cordialement
jpbbricole

Bonjour j'ai refait mon schéma avec les modifications suggéré je voudrais savoir si cela est correcte.

De plus concernant le codage :
Voici le code pour la vitesse d'avancement obtenu par le module NEO-M6 :

static cons tint RXPin=4 TXPin=3
Static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss (RXPin, TXPin);

Void setup(){
Serial.begin(9600);
ss.begin(GPSBaud);
}

Void loop (){
Lcd.backlight();

 While (ss.avaibable()>0){
	gps.encode(ss.read());
	if (gps.speed.isUpdated()){

	  Serial.print("Speed in km/h = ");
  Serial.println(gps.speed.kmph());

Voici le code pour savoir si le disque entrainé par le cardant est en mouvement :


const byte              capteurInduPin = 11;
volatile unsigned long  nbrTours = 0;
const unsigned long     periode = 500ul; // 500 ms
unsigned long           chrono;

void CompteurTours() {
  nbrTours++;
}

void setup() {
  pinMode(capteurInduPin, INPUT);
  Serial.begin(9600);
  Serial.println(F("\nDémarrage !"));
  attachInterrupt(digitalPinToInterrupt(capteurInduPin), CompteurTours, FALLING);
  Serial.println("Nombre Impulsions");
  chrono = millis();
}

void loop() {
  if (millis() - chrono > periode) {
    cli();      // début section critique
    unsigned long nbrToursCopie = nbrTours;
    nbrTours = 0;
    sei();      // fin section critique
    Serial.println(nbrToursCopie);
    chrono = millis();
  }
}

Puis pour finir le dernier qui correspond à la fonction souhaité : allumer un buzzer lorsque la vitesse d'avancement est nulle (code1) et que le disque est en mouvement (code 2) :


void setup() {
pinMode (2, OUTPUT) ;
}
void loop() {
if (speed == 0 && nombre d’impulsion >1) 
{
digitalWrite (2, LOW) ;
}
Else 
{
digitalWrite (2, HIGH) ;
}

J'aimerais savoir si les trois codes ci-dessus sont correctes ?
Merci d'avance
Cordialement Vivic05

Bonjour vivic05

Pour le câblage, le + du relais 12 Volts doit être câblé sur l'alimentation 12 V (actuellement sur le 5V de l'Arduino)
Il faut croiser les pin du capteur avec celle de la commande du relais (2 et 11) en effet, dans ton 2ème programme de détection de la roue qui tourne, tu utilises les interruptions, ce qui est très bien vu, sauf que sur un UNO seules les broches 2 et 3 ont cet attribut:
image

Ton premier programme est incomplet :woozy_face: mais si je me réfère à celui du post #1, tu devrait essayer de le vérifier dans l'IDE Arduino
image
pour en retirer, au moins, les erreurs de syntaxe :wink:

Pour le 2ème programme,
const byte capteurInduPin = 11;
changer la pin sur 2
et l'initialisation de la pin

  pinMode(capteurInduPin, INPUT);
en 
  pinMode(capteurInduPin, INPUT_PULLUP);

Du fait du PULLUP, l'impulsion "active" est à LOW. et l'interruption est:
attachInterrupt(digitalPinToInterrupt(capteurInduPin), CompteurTours, FALLING);
FALLING.

Pour le 3ème programme, changer la pin comme indiqué ci-dessus.

Je n'ai pas essayé les programmes, mais tu peux déjé esayer de les vérifier dans l'IDE Arduino.

A+
Cordialement
jpbbricole

Bonjour merci pour vos réponses, j'ai inclus dans mon premier programme la fonction suivante : si la vitesse est nulle un signal est envoyé au relais qui permet l'activation du buzzer. Je sais pas si celui-ci est correct :

#include <SoftwareSerial.h>
#include <TinyGPS++.h>

TinyGPSPlus gps;
SoftwareSerial ss (4, 3);

void setup(){
Serial.begin(9600);
pinMode(11,OUTPUT);
}

void loop (){

 while (ss.available()>0){
	gps.encode(ss.read());
	if (gps.speed.isUpdated()){

	  Serial.print("Speed in km/h = ");
  Serial.println(gps.speed.kmph());
  }
 }
 if (gps.encode(ss.read()==0))
 {
   digitalWrite(11,LOW);
  }
 else 
 {
   digitalWrite(11,HIGH);
 }

}

J'ai aussi découvert un programme permettant d'obtenir avec précision le nombre de tour par min par contre sur celui-ci je n'ai pas besoin des éléments pour l'afficheur. Je dois uniquement supprimer l'ensemble des lignes contenant "TM1637 " ? Pensez vous qu'il est compatible avec un capteur inductif ? Voici le programme :

/*
 * Compte-tours de 0 à 10000 tr/min, auteur Christophe JUILLET
 * 
 * Voir ici pour discussion et complément d'infos: http://forum.arduino.cc/index.php?topic=562866.0
 * 
 * Précision après calibrage: environ 0,01% +- 1 digit (sans calibrage environ 1%).
 * Environ 2 mesures par seconde, réglable, ou une mesure par tour en dessous de 120 tr/min.
 * Message d'erreur "EEEE" si le capteur loupe une impulsion. Améliore la fiabilité de la lecture, ne fonctionne pas sous 300 tr/min.
 * En cas de messages d'erreurs répétées, revoir le montage du capteur.
 * Le message d'erreur peut s'afficher pendant une accélération ou décélération brutale, ou vitesse erratique (par exemple en cas de freinage avec ABS, roue bloquée par moments).
 * 
 * nomenclature:
 * un Arduino
 * un afficheur 4 digits série avec TM1637 (facultatif si lecture en console)
 * un capteur au choix (hall, optique ou autre) générant une impulsion de 5v maxi, 3v mini, la mesure se fait sur le front montant ou descendant
 * 
 */

#include <TM1637.h> // menu IDE Arduino => croquis => inclure une bibliothèque => gérer les bibliothèques => filtrez votre recherche => TM1637 => Grove4-Digit Display => more info => installer. Voir ici pour infos: https://github.com/Seeed-Studio/Grove_4Digital_Display  

// variables de configuration:
#define LUM                   4 // luminosité de l'afficheur de 0 à 7
#define DELAI_MESURE        500 // délai minimal entre deux mesures en ms, 500 par défaut 
#define PIN_CAPTEUR           2 // la broche utilisée par le capteur, uniquement 2 ou 3!
#define CLK                   5 // broche d'horloge du TM1637 au choix
#define DIO                   4 // broche de données du TM1637 au choix
#define FREQUENCE_ARDUINO 16000 // fréquence de l'Arduino en KHz (voir calibrage ici: http://forum.arduino.cc/index.php?topic=561774.0 ) 16000 par défaut, si Arduino pro 8 MHz multipliez la fréquence par deux

const bool console = false;     // true pour un retour console
const bool deuxTours = false;   // true si une impulsion tous les deux tours (moteur 4 temps), sinon une impulsion par tour
// variables de configuration, fin

volatile uint32_t t2;
volatile bool nouvTour = false;
TM1637 tm1637(CLK,DIO);

void mesurer(void);

void setup() {
  pinMode(PIN_CAPTEUR, INPUT_PULLUP);
  if (console) Serial.begin(115200);
  tm1637.init();
  tm1637.set(LUM);
  attachInterrupt(digitalPinToInterrupt(PIN_CAPTEUR), mesurer, FALLING); // RISING front montant, FALLING front descendant
}

void loop() {
  static bool afficher = true;
  static bool erreurMesure = false;
  static uint32_t t1 = micros(), dt = 0, dtOld = 0, sommeT = 0; // t1 et t2: moment des deux dernières impulsions, dt: durée de la dernière impulsion, dtOld: durée de l'avant dernière impulsion, sommeT: durée de la somme des impulsions de la dernière mesure
  static int nbTours = 0; // nombre de tours à prendre en compte pour la dernière mesure
  int rpm;

  if (nouvTour == true) { nouvTour = false;
    nbTours++;
    dt = t2 - t1;
    t1 = t2;
    sommeT += dt;
    if ((dt > 1.8 * dtOld || dtOld > 1.8 * dt) && dt < 200000) erreurMesure = true; // en cas de loupé, afficher le message d'erreur "EEEE". désactivé en dessous de 300 tr/min
    dtOld = dt;
    if (sommeT > 1000L * DELAI_MESURE) { afficher = true; // si le temps écoulé depuis la dernière mesure dépasse 500ms actualiser l'affichage
      if (deuxTours) sommeT /= 2;
      rpm = 3750L * FREQUENCE_ARDUINO * nbTours / sommeT; // 3750 = 60 * 1000 / 16
      if (!erreurMesure) {
        if (console) Serial.println(rpm);
        tm1637.display(3, rpm%10);
        tm1637.display(2, (rpm/=10) > 0 ? rpm%10 : 0x10);
        tm1637.display(1, (rpm/=10) > 0 ? rpm%10 : 0x10);
        tm1637.display(0, (rpm/=10) > 0 ? rpm%10 : 0x10);
      } else { erreurMesure = false;
        if (console) Serial.println("Erreur de mesure");
        tm1637.display(0,0x0E);
        tm1637.display(1,0x0E);
        tm1637.display(2,0x0E);
        tm1637.display(3,0x0E);
      }
      sommeT = nbTours = 0;
    }
  }
  if (afficher && micros() - t1 > 1000000) { afficher = false; // après une seconde sans détection, afficher 0
    if (console) Serial.println(0);
    tm1637.display(0, 0x10);
    tm1637.display(1, 0x10);
    tm1637.display(2, 0x10);
    tm1637.display(3, 0);
  }
}

void mesurer() {
  t2 = micros();
  nouvTour = true;
}

Merci d'avance
Cordialement vivic05

Bonjour vivic05

Pour le GPS, j'ai bien le même, mais pour essayer depuis le bureau...
As-tu le matériel?
Mais pour ce qui est du programme, la première chose qui manque est l'initialisation de ss par un
ss.begin(9600);
Sans ça, pas de communications avec le GPS.

Pour la détection de la rotation, après réflexion, un pulseIn() devrait suffire.

A+
Cordialement
jpbbricole

Juste un truc, ATTENTION le 12volts des véhicules c'est souvent 13.5v mais tolérer jusqu'à 14.8v, je suis pas sur que l'arduino accepte 14volts.

Bonjour Charles_9999

Très bonne remarque, on oublie souvent et on croit que c'est toujours 12V.
l'Arduino supporte Input Voltage (limit) 6-20V

Cordialement
jpbbricole

Non, l'ensemble des éléments nécessaires sont commandés mais en attendant j'essai de trouver le programme que je pourrais utiliser pour ne pas perdre de temps.
Du coup j'ai modifié mon programme en mettant le ss.begin (9600) et la fonction pulseIn() mais je sais pas si c'est bon. Dans le deuxième if comment je pourrais inclure que si la vitesse est nulle et qu'on détecte une rotation alors le buzzer s'active ?

#include <SoftwareSerial.h>
#include <TinyGPS++.h>

TinyGPSPlus gps;
SoftwareSerial ss (4, 3);
unsigned long duration ;

void setup(){
Serial.begin(9600);
ss.begin(9600);
pinMode(11,OUTPUT);
pinMode(2,INPUT);
}

void loop (){

 while (ss.available()>0){
	gps.encode(ss.read());
	if (gps.speed.isUpdated()){

	  Serial.print("Speed in km/h = ");
  Serial.println(gps.speed.kmph());
  }
 }
   duration = pulseIn(2,HIGH);
  Serial.println(duration);
  
  if (gps.encode(ss.read()==0)){
   digitalWrite(11,LOW);
  }
  else{
   digitalWrite(11,HIGH);
  }

}
Merci 
Cordialement vivic05

Bonjour vivic05

Si on s'en réfère au schéma du post #7 mais avec capteur sur 2, on est en mode PULLUP, ce qui veut dire que le capteur est actif à LOW
donc

doit être
`duration = pulseIn(2,LOW);

As-tu un Arduino, si oui, tu n'as pas encore de capteur, tu peux le remplacer par un simple bouton.

A+
Cordialement
jpbbricole

Pour le moment je n'ai rien reçu.
Dans le deuxième if du programme comment je pourrais inclure que si la vitesse est nulle et qu'on détecte une rotation alors le buzzer s'active ?

Cordialement vivic05

Attention, toutefois, le GPS renvoie une valeur de vitesse fiable que en mouvement, à l’arrêt c’est beaucoup moins exploitable.

Du coup le module NEO-6M ne ferait pas l'affaire ?
Comment je pourrais donner l'information à l'arduino que le tracteur est à l'arrêt ?

On pourrai considérer un seuil de vitesse donnée par le GPS et déduire que le tracteur est à l'arrêt.

Sauf que un tracteur pouvant avancer à une vitesse très faible, il n'est pas assuré qu'on ne soit pas dans la limite de précision du GPS...

Il serai intéressant de voir du coté de l'instrumentation du tableau de bord du tracteur de voir si il n'est pas possible de récupérer une information de vitesse ou de boite de vitesse au neutre

L'utilisation d'une antenne plus précise pourrait résoudre le problème ?
Mon objectif est de pouvoir adapter ce système sur plusieurs tracteurs d'où l'utilisation d'une antenne gps sur l'outil.
Si le système fonctionne pour une vitesse inférieur à 1km/h cela me convient largement

C’est pas l’antenne le problème. C’est la précision de la technologie GPS.

Faut essayer