chrono sur excel alimenté par cellule IR via Arduino

Bonjour à tous,

je suis nouveau sur le forum et j'espère ne pas m'attirer les foudre des modos en créant ce nouveau post, c'est vrai qu'il y a une multitude de post "chrono" mais je n'ai pas trouvé exactement ce que je cherchais.

Pour l'instant je cherche juste une réponse avant de me lancer.

Le titre du post résume ma question mais je vais essayer d'expliquer en détail ce que je voudrais faire afin d'avoir une réponse aussi fiable que possible.

Le but est de fabriquer un système de chronométrage pour course de côte.
Dans ce genre de course, le départ et l'arrivée sont à des endroits différents (contrairement à un circuit), et la difficulté réside dans la distance qui sépare les deux points. J'ai déjà réalisé un système de chrono par barrières IR, le pupitre se trouvant à l'arrivée et le signal venant de la barrière départ étant transporté par un câble qui peut faire jusqu'à 2KM. Malheureusement ce système est dit "manuscrit" puisqu'il faut à chaque fois recopier le temps sur des tableaux. Je voudrais que les temps s'inscrivent automatiquement dans un tableau Excel, histoire de faciliter le traitement après la course.
Un ami m'a fait un mini programme sur Excel, avec VBA, qui permet de figer(par appui souris ou clavier) une horloge et de transférer l'horaire vers une cellule.
J'aimerais lier les deux systèmes à l'aide d'un arduino, mais je ne sais pas si c'est possible.
En gros, j'aimerais que le signal du passage du kart devant la cellule départ, qui déclenche la barrière IR, soit transformé dans l'arduino pour devenir un appui sur une touche du clavier, celui-ci figeant l'horloge, etc...

Voilà, j'espère ne pas avoir été trop long, et merci d'avance à tous ceux qui voudront bien m'apporter leur aide.
MADA16

en gros vous voulez envoyer une touche clavier depuis un Arduino, lorsque un événement spécifique se produit

La bibliothèque Keyboard permet de transformer un Arduino en clavier, mais pas n'importe quel arduino, il en faut un qui ait un composant Usb spécial, donc un arduino avec un 32u4 ou SAMD. Un Arduino Micro ou un de la famille MKR fera donc l'affaire.

Ensuite regardez le code de cet exemple, il envoie un message sur appui du bouton. Il suffit de remplacer le bouton par la detection IR et au lieu d'envoyer une phrase juste d'envoyer un appui de touche avec [url=https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardwrite/]Keyboard.write()[/url] ou faire un Keyboard.press() suivi d'un Keyboard.release()

Bonjour J-M-L, et merci de cette première réponse.

Dans le code donné en exemple, c’est avec un arduino Leonardo !! Est ce qu’il fait partie des “Micro” ou famille MKR, comme demandé???

Ensuite je vois que le bouton est relié à l’arduino coté “digital input”. Dans mon cas, cellule IR, j’avais cru comprendre que c’était une entrée analogique qu’il fallait prendre ???

enfin, si je comprends bien, j’aurais à utiliser Keyboard.write() en mettant entre les parenthèses la touche de clavier que je souhaite envoyer.

merci de tes réponses

mada16:
Dans le code donné en exemple, c'est avec un arduino Leonardo !! Est ce qu'il fait partie des "Micro" ou famille MKR, comme demandé???

Oui le Leonardo utilise aussi un 32u4 (aussi les Esplora, Zero, Due) comme l'Arduino Micro

mada16:
Ensuite je vois que le bouton est relié à l'arduino coté "digital input". Dans mon cas, cellule IR, j'avais cru comprendre que c'était une entrée analogique qu'il fallait prendre ????

ça dépend de votre capteur, s'il délivre une sortie analogique ou tout-ou-rien (0/5V). Quel est le code pour cette barrière IR aujourd'hui et quel composants utilisez vous ?

mada16:
enfin, si je comprends bien, j'aurais à utiliser Keyboard.write() en mettant entre les parenthèses la touche de clavier que je souhaite envoyer.

c'est cela. en faisant attention à ne pas générer un million de touches clavier, il faut ne le faire qu'une seule fois quand la barrière se déclenche, pas tant qu'elle est active. (le processeur va vite, il peut voir le véhicule passer pendant un moment et comme il pédale assez vite...)

super, j’avance !!!

les capteurs sont en tout ou rien (moi, j’appelle ça contact sec…), il faut que je retrouve le schéma de montage utilisé, mais si je me souviens bien, ils sont en PNP. Et je me souviens que le circuit électronique du chrono est en 5V…
En PJ, un semblant de fichier que j’avais utilisé à l’époque pour relier les capteur IR et les mettre en parallèle avec les boutons du chrono.
Pour l’instant je n’ai écrit encore aucun code…

“ne pas générer un million de touche clavier” ???
Je pense attribuer un touche pour la capteur départ, et une pour la capteur arrivée…

“le capteur peut voir passer le véhicule pendant un moment…” Y a t il une solution pour ne générer qu’un seul appui ???
C’est vrai qu’à l’arrivée, ça va assez vite, le passage devant devant la cellule ne doit durer, à priori, qu’environ un dixième de seconde. Par contre au départ, c’est plus lent, vu la longueur du kart, ça doit bien durer une seconde…

Schema avec cellule pnp.pdf (62.9 KB)

le PDF:
Schema avec cellule pnp.pdf (62.9 KB)

C'est vrai qu'à l'arrivée, ça va assez vite, le passage devant devant la cellule ne doit durer, à priori, qu'environ un dixième de seconde. Par contre au départ, c'est plus lent, vu la longueur du kart, ça doit bien durer une seconde

même en un dixième de seconde il y a le temps de faire plusieurs mesures... (sans aller dans les registres, un digitalRead() se fait en 2 ou 3 micro-secondes...

oui il suffit de détecter le premier changement et ne rien envoyer tant que ce n'est pas revenu au repos pendant ∆t ms au moins par exemple

OK je vais voir ça!!!
Je suis en train d'étudier pour faire le code et j'ai vu quelque part qu'il pouvait y avoir un soucis avec ce genre de commande. Il se peut qu'on perde le contrôle du clavier....

d'ailleurs dans le code exemple je vois ça :

// initialize control over the keyboard:
Keyboard.begin();

Ne serait ce pas là le problème ???

Parce qu'il faudra, dans mon cas, absolument garder le contrôle du clavier et de la souris pour faire d'éventuels changements dans le tableau Excel pendant le chronométrage.

mada16:
OK je vais voir ça!!!
Je suis en train d’étudier pour faire le code et j’ai vu quelque part qu’il pouvait y avoir un soucis avec ce genre de commande. Il se peut qu’on perde le contrôle du clavier…

pas vraiment votre PC supporte 2 claviers ou 2 souris en même temps → mais si votre arduino se met à cracher des centaines de caractères ça va être dur de reprendre la main ou si vous émulez une souris et qu’elle bouge partout ce n’est pas simple de cliquer quelque part. En débranchant l’arduino on reprend le contrôle de son PC. le soucis c’est dès que vous le rebranchez pour charger une nouvelle version du code ils se remet à balancer des touches clavier et donc c’est la zone…

Pour éviter cela on met souvent un test d’un interrupteur qui doit être activé pour que les commandes soient envoyées

#include <Keyboard.h>
const byte pinInterrupteur = 2;

void setup() {
  pinMode(pinInterrupteur, INPUT_PULLUP); // câblage: pin D2 <<---->> interrupteur <<--->> GND
  Keyboard.begin();
}

void loop() {
  if (digitalRead(pinInterrupteur) == LOW) { // si l'interrupteur est en position
    Keyboard.write('X'); // on balance l'appui sur la touche X en continu toutes les 10ms
    delay(10); 
  }
}

comme ça si vous avez un souci, vous basculez l’interrupteur et plus rien n’est envoyé

Bon, j'me lance....

Voila ce que j'ai commencé à faire :

#include "Keyboard.h"

const int buttonPin1 = A0;          // input pin for pushbutton cellule départ
const int buttonPin2 = A2;          // input pin for pushbutton cellule arrivée
int previousButtonState = HIGH;   // for checking the state of a pushButton a confirmer si cellule IR au repos est en état high or low



void setup() {
 // make the pushButton pin an input:
  pinMode(buttonPin1,buttonPin2 INPUT);
  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  /// read the pushbutton:
  int buttonState = analogRead(buttonPin1);
  // if the button state has changed,
  if ((buttonState != previousButtonState)
      // and it's currently pressed:
      && (buttonState == HIGH)) {
    // type out a message
    Keyboard.write("32 ");
    int buttonState = analogRead(buttonPin2);
  // if the button state has changed,
  if ((buttonState != previousButtonState)
      // and it's currently pressed:
      && (buttonState == HIGH)) {
    // type out a message
    Keyboard.write("43 ");

  }
  // save the current button state for comparison next time:
  previousButtonState = buttonState;
}

Avec quelques interrogations:
au début comment déclarer que j'aurai deux entrées, une cellule IR départ sur le pin A0, et une cellule IR arrivée sur le pin A2 ??
Ensuite même chose quand je les déclare comme input, est ce que je dois faire deux lignes, ou une seule suffit comme j'ai fait ???
Après est ce que j'ai bon pour lui dire de n'envoyer l'appui clavier seulement quand le pushbutton sera revenu à l'état initial??
Enfin, la dernière instruction est elle utile sachant que ce sont des cellule IR ???

mada16:
Avec quelques interrogations:
au début comment déclarer que j'aurai deux entrées, une cellule IR départ sur le pin A0, et une cellule IR arrivée sur le pin A2 ??

oui vous déclarez des constantes qui portent ces N° de pin. ensuite c'est au code de vérifier ce qu'il se passe.

mada16:
Ensuite même chose quand je les déclare comme input, est ce que je dois faire deux lignes, ou une seule suffit comme j'ai fait ???

que dit la documentation de pinMode() ? peut-on en passer 2 d'un coup ? (réponse = non --> faut 2 lignes).

mada16:
Après est ce que j'ai bon pour lui dire de n'envoyer l'appui clavier seulement quand le pushbutton sera revenu à l'état initial??
Enfin, la dernière instruction est elle utile sachant que ce sont des cellule IR ???

Si vous êtes sur du tout ou rien, il faut utiliser digitalRead() pas analogRead() qui vous retournerait une valeur entre 0 et 1023 et pas juste LOW ou HIGH

Pour bien commencer avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon et autres exemples, ça vous permet de maîtriser la plateforme.

et vu que vous semblez débuter, pour ne pas vous ennuyer avec les boutons, éventuellement utilisez la librairie de @bricoleau ou alors la librairie OneButton de Matthias Hertel.

Bonjour,

merci pour ces réponses, ça me permet de "dégrossir" un peu l'affaire.

Je croyais que la différence entre digitalread et analogread, c'était le type d'entrée sur la carte. Les entrées analogiques pour lire des tensions, et les digitales pour...(j'ai un trou...)

C'est vrai que je suis "total débutant", et pour l'instant j'ai peu survolé "eskimon"

Je vais m'y replongé et voir aussi les autres.

J'espère revenir avec un meilleur code...

Une dernière question, j'ai vu qu'il existait des modules gsm/gprs, je crois qu'ils appellent ça "shield"...
Est ce que deux arduino peuvent communiquer ensemble avec ces modules ? Pour être plus clair, est qu'une arduino peut envoyer à l'autre un signal quelconque, un code, par l'intermédiaire du réseau gsm?

Je pense à l'avenir de mon système, faire envoyer le top passage devant la cellule IR de départ vers le pc présent au niveau de la cellule IR arrivée.

Je croyais que la différence entre digitalread et analogread, c'était le type d'entrée sur la carte. Les entrées analogiques pour lire des tensions, et les digitales pour...(j'ai un trou...)

On lit toujours des tensions et les pins analogiques peuvent aussi être lue en tout ou rien avec un digitalRead().

Tout dépend surtout du capteur et l'information qu'il envoie. Il me semble que le votre envoie 0V ou 5V, donc du tout ou rien, pas une valeur arbitraire de tension entre 0 et 5V que vous devriez traiter par rapport à un seuil.

Est ce que deux arduino peuvent communiquer ensemble avec ces modules ? Pour être plus clair, est qu'une arduino peut envoyer à l'autre un signal quelconque, un code, par l'intermédiaire du réseau gsm?

Oui bien sûr, des Arduinos peuvent s'envoyer des SMS entre eux ou si vous avez une connexion IP avec votre carte SIM (et un serveur intermédiaire sur internet) ils peuvent aussi partager des infos comme cela en HTTP par exemple.

Bonjour à tous,

je reviens sur le sujet, car j'ai enfin reçu mon arduino léonardo, il va donc être temps pour moi de tester...

Pour l'instant j'ai réussi à sortir ça...

#include "Keyboard.h"

const int buttonPin1 = A0;          // input pin for pushbutton cellule départ
const int buttonPin2 = A2;          // input pin for pushbutton cellule arrivée
int previousButtonState = LOW;   // for checking the state of a pushButton 



void setup() {
 // make the pushButton pin an input:
  pinMode(buttonPin1,INPUT);
  pinMode(buttonPin2,INPUT);
  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  /// read the pushbutton:
  int buttonState = digitalRead(buttonPin1);
  // if the button state has changed,
  if ((buttonState != previousButtonState)
      // and it's currently pressed:
      && (buttonState == HIGH)) {
    // type out a message
    Keyboard.write("65 ");
    /// read the second pushbutton:
    int buttonState = digitalRead(buttonPin2);
  // if the button state has changed,
  if ((buttonState != previousButtonState)
      // and it's currently pressed:
      && (buttonState == HIGH)) {
    // type out a message
    Keyboard.write("85 ");

  }
  // save the current button state for comparison next time:
  previousButtonState = buttonState;}
}

merci de me dire ce que vous en pensez...

que pensez vous faire avec Keyboard.write("65 ");ouKeyboard.write("85 "); ? le compilateur était-il content ?

si vous avez jeté un oeil à la doc de Keyboard.write(), les usages dont ils parlent sont

 Keyboard.write(65);         // sends ASCII value 65, or A 
Keyboard.write('A');            // same thing as a quoted character
Keyboard.write(0x41);       // same thing in hexadecimal
Keyboard.write(0b01000001); // same thing in binary (weird choice, but it works)

--> pas de guillemets

En effet, j'avais pas les yeux en face des trous :o :o

Mais est ce que c'est la seule erreur, car même avec cette correction (guillemets et espace enlevés) ça ne fonctionne pas.

J'ai un gros doute sur mes branchements. Sur le système que j'avais la sortie com de la cellule était raccordée (après passage resistance et transistor) directement à une broche du bouton poussoir, l'autre broche étant à la masse, les masses (BP et cellule) étant reliées.
J'ai fait de même avec l'arduino.
Mais j'ai l'impression qu'il manque quelque chose.
Sur les schéma que j'ai vu de bouton sur arduino, il y a un branchement sur la broche 5v...mais tous ces schémas avaient pour but d'allumer une diode et moi, je n'ai pas besoin d'allumer une diode...

faudrait tester cela ‘à la main’

→ si vous mettez un voltmètre au bout du fil, voyez vous un passage de 0 à 5V (ou de 5v à 0) ?

Justement c’est là le problème, il n’y a pas de tension…

Quand je teste la tension à la sortie des fils de la cellule (après résistance et transistor), il n’y a pas de tension, et ce quelque soit la position du BP. Il y a juste une “continuité” qui s’installe quand je masque la cellule IR.
Par contre quand je teste la tension entre la sortie (out) cellule et la masse cellule (avant résistance et transistor), il y a un passage de 0 à 12v quand je masque la cellule…

Mais ça me fait un peu peur d’amener du 12V dans l’arduino…

Ci joint les deux schémas du chrono électronique, le premier sans cellule, et le deuxième avec cellule.

Schema avec cellule pnp.pdf (62.9 KB)

Schema chrono 1.pdf (90.6 KB)

vos images:
Schema avec cellule pnp.pdf (62.9 KB)

Schema chrono 1.pdf (90.6 KB)

--> j'ai pas regardé en détail dans votre schéma, regardez ce que vous envoyez dans le circuit amont si vous appuyez sur le bouton (à priori c'est sur le collecteur du transistor donc ça ne devrait pas avoir de conséquences)


moi je câblerais le transistor (bien choisi) pour adapter à la tension d'entrée de l'arduino

C’est exactement là où je mesure, mais à la différence que je n’ai pas l’arrivée 5V

Voilà comment est fait mon circuit et les endroits où je mesure avec les tensions observées

oups…j’ai oublié le schéma!!! :confused: :confused:

schema cellule mesure.PDF (44.5 KB)