Réglage des rapports - course de tracteur tondeuse

Bonjour J-M-L.
je suis de la BADO team, une équipe qui fait des courses de tracteur tondeuses comme theakoirium du site démarrage imminent.
Tu l'aurais aidé pour la construction d'un programme pour un projet de boite séquentielle sur son tracteur tondeuse, je ne sais pas si tu t'en souviens.
Il voulait pouvoir avec des palettes au volant monter et descendre les rapports grâce à deux boutons.
Il voulait également pouvoir régler sans ordinateur , grâce à deux boutons de réglage l'angle du servomoteur et valider grâce à un appui simultané grace à ces deux boutons.
il a partagé le programme sur son site (MERCI à theakoirium) et je l'ai testé.

les fonctions de changement de rapports fonctionnent à merveille!
les fonctions de réglage des rapports ne fonctionnent pas actuellement.

te serait-il possible svp de m'aider en rééxaminant le programme?

manque t il des virgules, des points virgules?
la montée de version du programme arduino a t il désactivé des fonctionnalités qui marchaient avant avec l'ancienne version du programme?

Je trop débutant en programmation arduino pour m'en sortir seul!

j'avais un projet moins ambitieux que the akoirium à la base que j'ai réussi à programmer, mais là, ça dépasse mes compétences.
j'avais réussi à récupérer avec un capteur angulaire à effet hall la position du levier de changement de rapports et à l'afficher sur un afficheur 7 segments géant devant le pilote.

Mais l'idée de theakoirium de servomoteur et de récupérer sa position angulaire pour afficher les rapports est bien meilleure!!

Après son débuggage, je souhaiterai même ajouter une fonctionnalité supplémentaire au programme:
utiliser un électrofrein comme embrayage !
un appui sur les palettes de changement de rapport ferait:
-débrayage.
-changement de rapport.
-embrayage.

Pourrais tu m'aider à réaliser tout cela svp?

Je me tiens à ta disposition pour tout renseignement.

Je te souhaite une bonne fin d'après midi , et j'espère à bientôt.

Cordialement

Bonjour

Je me souviens effectivement de l'avoir aidé — je ne me souviens plus du programme

Je déplace cette discussion

➜ postez le code (avec les balises de code) et décrivez votre montage exact.

le forum essayera de vous aider. le projet de "the akoirium" était fun.

--

EDIT. je viens de retrouver le post d'origine

/*
    Câblage

  PIN
   0  NC                        (Rx)
   1  NC                        (Tx)
   2  pinPalettePlus            pin 2 --- bouton --- GND
   3  pinPaletteMoins           pin 3 --- bouton --- GND
   4  NC
   5  pinServo                  pin 5 --- pin contrôle angle servo
   6  7 Segment 'a'             Prévoir résistance de limitation de courant (cf https://eskimon.fr/tuto-arduino-205-afficheurs-7-segments)
   7  7 Segment 'b'             Prévoir résistance de limitation de courant
   8  7 Segment 'c'             Prévoir résistance de limitation de courant
   9  7 Segment 'd'             Prévoir résistance de limitation de courant
  10  7 Segment 'e'             Prévoir résistance de limitation de courant
  11  7 Segment 'f'             Prévoir résistance de limitation de courant
  12  7 Segment 'g'             Prévoir résistance de limitation de courant
  13  NC                        Led interne
  A0  pinReglagePlus            pin A0 --- bouton --- GND
  A1  pinReglageMoins           pin A1 --- bouton --- GND
  A2
  A3
  A4
  A5

*/

#include <Servo.h>
Servo levierVitesse;
const byte pinServo = 5;

#include <simpleBouton.h> // cf @bricoleau @ http://forum.arduino.cc/index.php?topic=375232.0
// le changement de vitesse
const byte pinPalettePlus  = 2;  //Cablage : pin 2 --- bouton --- GND
const byte pinPaletteMoins = 3;  //Cablage : pin 3 --- bouton --- GND
simpleBouton boutonPlus(pinPalettePlus);
simpleBouton boutonMoins(pinPaletteMoins);
// le réglage de l'angle du servo
const byte pinReglagePlus = A0;
const byte pinReglageMoins = A1;
simpleBouton boutonReglagePlus(pinReglagePlus);
simpleBouton boutonReglageMoins(pinReglageMoins);

const byte pin7Seg[] = {12, 11, 10, 9, 8, 7, 6};
const byte chiffres7Seg[] = {0b1110111, 0b0010101, 0b0110000, 0b1101101, 0b1111001, 0b0110011, 0b1011011, 0b1011111, 0b0, 0b0};

void affichageChiffre(byte chiffre) { // de 0 à 7 seulement
  if (chiffre >= sizeof chiffres7Seg) chiffre = (sizeof chiffres7Seg) - 1;
  for (byte b = 0; b < sizeof pin7Seg; b++) digitalWrite(pin7Seg[b], bitRead(chiffres7Seg[chiffre], b) ? HIGH : LOW);
}

int boite[] = {700, 930, 1160, 1390, 1620, 1850, 2080}; // les valeurs d'angles en µs
const byte nombreDeVitesses = sizeof boite / sizeof boite[0];
byte vitesse  = 1;  // vitesse par défaut

inline void reglerVitesse() {
  levierVitesse.writeMicroseconds(boite[vitesse]);
  Serial.print(F("Vitesse ")); Serial.print(vitesse);
  Serial.print(F("\tangle ")); Serial.println(boite[vitesse]);
  affichageChiffre(vitesse);
}

void vitessePlus() {
  if (vitesse < nombreDeVitesses - 1) {
    vitesse++;
    reglerVitesse();
  }
}

void vitesseMoins() {
  if (vitesse > 0) {
    vitesse--;
    reglerVitesse();
  }
}

void reglagePlus() {
  boite[vitesse]++;
  reglerVitesse();
}

void reglageMoins() {
  boite[vitesse]--;
  reglerVitesse();
}

void gestionPalettes() {
  boutonPlus.actualiser();
  if (boutonPlus.vientDEtreEnfonce()) vitessePlus();
  else {
    boutonMoins.actualiser();
    if (boutonMoins.vientDEtreEnfonce()) vitesseMoins();
  }
}

void gestionAngle() {
  boutonReglagePlus.actualiser();
  if (boutonReglagePlus.vientDEtreEnfonce()) reglagePlus();
  else {
    boutonReglageMoins.actualiser();
    if (boutonReglageMoins.vientDEtreEnfonce()) reglageMoins();
  }
}

void setup() {
  for (byte b = 0; b < sizeof pin7Seg; b++) pinMode(pin7Seg[b], OUTPUT);
  Serial.begin(115200);
  reglerVitesse();
  levierVitesse.attach(pinServo);
}

void loop() {
  gestionPalettes();
  gestionAngle();
}

voilà le test du programme en l'état, sans fonctionnement des réglages , l'appui plus de 5 secondes sur les boutons n'activent rien.

Bonjour,

Merci de prendre quelques minutes pour lire "Les bonnes pratiques du forum francophone" et les appliquer.

En particulier, la mise en forme du code avec des balises en cliquant sur l'icône <code/>

revenons au code posté :

j'ai juste remanié l'affichage sur le 7 segment que j'ai modélisé ici par des LEDs et changer la vitesse par défaut à 0 et rajouter un test pour ne pas dépasser les angles min et max du servo.

Tout semble fonctionner comme prévu.

  • J'appuie sur les boutons + ou — de la vitesse et ça augment ou baisse le rapport.
  • J'appuie sur les boutons + ou — de réglage de l'angle et ça augment ou baisse l'angle de la vitesse en cours.
    comme il n'y a aucune mise en EEPROM, si on éteint l'arduino, on revient au calibrage initial. Il faut donc calibrer sur banc d'essai, noter les valeurs qui apparaissent dans le moniteur série lorsque l'on fait le réglage des vitesses de 0 à 6 et les mettre en dur dans ce tableau du code:
int boite[] = {700, 930, 1160, 1390, 1620, 1850, 2080}; // les valeurs d'angles en µs

avant de recompiler et recharger le code sur la carte.

ce n'est pas ce que fait ce code. Ce n'est pas implémenté.

Il n'y a rien dans le code posté qui gère le temps d'appui.

Bonjour,

je m'appelle Lionel, j'ai 50 ans.
je me suis lancé par intermittence dans de la programmation arduino.
le besoin pour des applications m'a imposé l'arduino.
j'avais programmé un peu en C++ lors de ma première année de DUT génie électrique.
Depuis, plus rien.
je suis technicien en électricité haute tension, 63kV, 225kV et 400kV.
je touche à un peu tout à travers le métier, méc, hydraulique, élec HT et BT, télécommunication.
dans certains domaines, j'ai un très haut niveau, dans d'autres je suis "débutant".
Je suis autodidacte pour certians domaines.
J'adore comprendre comment les objets fonctionnent.

Un pote a proposé à mon groupe d'amis de se lancer dans les courses de tracteurs tondeuses.
il y a 5 ans , nous nous sommes lancés dans l'aventure.
il y a trois catégories:
GP1 : tracteur entièrement d'origine en enlevant le système de coupe, boite à vitesse mécanique
GP2: moteur 18cv max, chassis et entrainement par courroies d'origine tracteur tondeuse, boite à vitesse mécanique le reste est modifiable.
GP3: tout est est modifiable, excepté le moteur puissance max 18cv et rester en roue d'origine tracteur tondeuse.

Notre aventure a démarré en GP2.
chassis wheel horse et moteur 13cv, entrainement d'origine, une seule courroie.
pas d'embrayage.

bilan: nous avons remporté la seule course du championnat de l'ain.

seconde année: 2 courses, même tracteur.
nous cassons:
les boites mécaniques (pas de synchro de pignons d'origine dans ces boites simples).
la courroie.
arbre de roue.
jante.
chassis.

Le COVID passe par là et tout est stoppé.

durant cette période je réfléchis à plusieurs solutions:
mettre un indicateur de rapports engagés sur le levier de vitesse pour éviter de casser les boites méca car les pilotes rétrogradent trop tôt par rapport à la vitesse du tracteur et abiment les boites (700 euros pièces neuves).
mettre deux courroies au lieu d'une via un palier intermédiare pour éviter de les faire sauter des poulies. on peut changer le diamètre des poulies pour s'adapter à la configuration des circuits et avoir plus ou moins de démultiplication.
chassis d'un nouveau tracteur: le rendre robuste tout en étant léger pour éviter de vriller le chassis sur les circuits les plus bosselés.
modification des roues d'origine: installation dans les jantes de bagues en bronze (des roulements ne sont pas insatallables car trop peu de matière) pour éviter le serrage des roues sur les fusées.
préparation d'un autre jeu de roues en pneus de quad pour la pluie.
recherche d'une solution pour l'embrayage: sur un tracteur d'origine, on détend puis retend une courroie pour changer de vitesse: pas fiable, les courroies s'usent avec la puissance du moteur et on en casse: réflexion en cours pour passer sur un électrofrein ou embrayage à commande électrique.
boites à vitesses: à force d'en casser, on s'est rendu compte:
boite à vitesses sans joints spi, remplie de graisse: peu fiable, les "clavettes de transmission (2) sont le point faible et cassent et broient tout le contenu de la boite et ont des fuites qui conduisent aux serrages des boites.
boite à vitesses avec joints spi, remplie d'huile: plus fiable, les "clavettes de transmission (2) sont le point faible et cassent et broient tout le contenu de la boite et ont peu de fuites. si on règle le problème des clavettes, on n'aura plus de serrages des boites.

pour fiabiliser les boites, on veut mettre 4 clavettes au lieu de deux, un embrayage à commande électrique (ou frein), et le rapport engagé visible.

2024 découverte du projet de theakoirium de boite séquentielle: GENIAL, cela correspon presque à ce qu'on veut faire (il garde la pédale d'embrayage, nous non).

nous voulons donc adapter le programme que vous avez réalisés ensemble en faisant:

indicateur de rapports engagés.
réglages des rapports sans PC , car si nous remplaçons une boite , la nouvelle n' a pas les mêmes réglages.
passage des rapports rapides grâce à un servomoteur.
embrayage à commande électrique pour ne plus dépendre de courroies pas fiables.

dans le futur ,
faire un accélérateur by wire.
faire un frein by wire.

voilà, un peu le projet.

Cordialement.

Merci pour le résumé. (j'ai fixé votre post avec le code, dans le futur pensez à utiliser les balises de code SVP)

Comment allez vous effectuer les réglage concrètement ? sur piste ?

Le servo qui existe ce n'est pas le passage des vitesse ?

concrètement ça marcherait comment ?

Dans un monde "sans fil" (je n'avais jamais remarqué), j'ai réarrangé le diagram pour y mettre un afficheur 7 segments et rendre le tout compact (également grâce à un Nano)

{
  "version": 1,
  "author": "J-M-L pour le forum arduino",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-arduino-nano",
      "id": "nano",
      "top": 0,
      "left": 0,
      "rotate": -90,
      "attrs": {}
    },
    {
      "type": "wokwi-pushbutton",
      "id": "btn1",
      "top": -32.2,
      "left": 374.4,
      "attrs": { "color": "red", "label": "palette ⊕", "key": "ArrowUp" }
    },
    {
      "type": "wokwi-pushbutton",
      "id": "btn2",
      "top": 54.2,
      "left": 374.4,
      "attrs": { "color": "blue", "label": "palette ⊖", "key": "ArrowDown" }
    },
    {
      "type": "wokwi-servo",
      "id": "servo1",
      "top": -23,
      "left": 202.6,
      "rotate": 90,
      "attrs": {}
    },
    {
      "type": "wokwi-pushbutton",
      "id": "btn3",
      "top": -41.8,
      "left": -48,
      "attrs": { "color": "red", "label": "réglage ⊕", "key": "+" }
    },
    {
      "type": "wokwi-pushbutton",
      "id": "btn4",
      "top": 44.6,
      "left": -48,
      "attrs": { "color": "blue", "label": "réglage ⊖", "key": "-" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r1",
      "top": 23.15,
      "left": 144,
      "attrs": { "value": "330" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r2",
      "top": 3.95,
      "left": 144,
      "attrs": { "value": "330" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r3",
      "top": -15.25,
      "left": 144,
      "attrs": { "value": "330" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r4",
      "top": -34.45,
      "left": 144,
      "attrs": { "value": "330" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r5",
      "top": -53.65,
      "left": 144,
      "attrs": { "value": "330" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r6",
      "top": -72.85,
      "left": 144,
      "attrs": { "value": "330" }
    },
    {
      "type": "wokwi-resistor",
      "id": "r7",
      "top": -92.05,
      "left": 144,
      "attrs": { "value": "330" }
    },
    {
      "type": "wokwi-7segment",
      "id": "sevseg1",
      "top": 43.38,
      "left": 149.08,
      "attrs": { "common": "cathode" }
    }
  ],
  "connections": [
    [ "nano:2", "btn1:1.r", "", [ "v0" ] ],
    [ "nano:3", "btn2:1.r", "", [ "v0" ] ],
    [ "btn2:2.r", "btn1:2.l", "", [ "v0" ] ],
    [ "nano:GND.3", "btn2:2.l", "", [ "v0" ] ],
    [ "nano:A0", "btn3:1.r", "", [ "v0" ] ],
    [ "nano:A1", "btn4:1.r", "", [ "v0" ] ],
    [ "btn3:2.l", "btn4:2.l", "", [ "v0" ] ],
    [ "nano:GND.2", "btn4:2.r", "", [ "v0" ] ],
    [ "nano:GND.2", "sevseg1:COM.1", "", [ "v0" ] ],
    [ "nano:GND.2", "sevseg1:COM.2", "", [ "v0" ] ],
    [ "nano:6", "r1:1", "", [ "v0" ] ],
    [ "nano:7", "r2:1", "", [ "v0" ] ],
    [ "nano:8", "r3:1", "", [ "v0" ] ],
    [ "nano:9", "r4:1", "", [ "v0" ] ],
    [ "nano:10", "r5:1", "", [ "v0" ] ],
    [ "nano:11", "r6:1", "", [ "v0" ] ],
    [ "nano:12", "r7:1", "", [ "v0" ] ],
    [ "r1:2", "sevseg1:A", "", [ "v0" ] ],
    [ "r2:2", "sevseg1:B", "", [ "v0" ] ],
    [ "r3:2", "sevseg1:C", "", [ "v0" ] ],
    [ "r4:2", "sevseg1:D", "", [ "v0" ] ],
    [ "r5:2", "sevseg1:E", "", [ "v0" ] ],
    [ "r6:2", "sevseg1:F", "", [ "v0" ] ],
    [ "r7:2", "sevseg1:G", "", [ "v0" ] ],
    [ "nano:5", "servo1:PWM", "", [ "v0" ] ]
  ],
  "dependencies": {}
}

Oui en le passant effectivement en cathode commune (j'avais pas vu que Wokwi avait l'option) ça va fonctionner sans les LEDs.

j'ai intégré l'afficheur à la simulation - merci

quand on arrive avec le tracteur tondeuse sur le circuit, on emmène deux boites à vitesses à rapport mécaniques.
une est installée dans le chassis.
une est en réserve au stand.

Le mieux serait d'arriver sans ordinateur.

notre tracteur est prêt mécaniquement.
je mets le contact électrique, l'afficheur indique sur quel rapport je suis.
avec les boutons de réglages de rapport, je balaye tous les rapports de la boite en validant (appui simultané des boutons + et- , si j'ai bien compris) à chaque rapport leur position.

Je casse la boite.
Je la remplace.
Je recommence toute la procédure de positionnement du servomoteur en adéquation avec les rapports de la boite. (les boites sont de récupération et ont des réglages différents)

c'est la solution la plus ergonomique. si elle n'est pas réalisable, je peux emmener le PC sur le circuit.
dans ce cas:
activer les boutons de réglages, balayer les rapports, lire les valeurs de l'angle dans le moniteur série (chose que je n'ai pas réussi à faire actuellement, je n'ai que des caractères saugrenues....) puis les rentrer dans le tableau des valeurs, compiler puis téléverser.

pour le système de transmission.
nous avons détourné l'embrayage électromagnétique de sa fonction première.
il est utilisé pour les lames de coupe. quand on le met en fonction, un électroaimant est alimenté jusqu'à jusqu'on enlève la fonction= on prélève la puissance moteur qui ne sert plus pour avancer.
mais si je n'ai pas le choix ( si je ne trouve pas d'électrofrein) je veux l'utiliser comme un embrayage de voiture. (tant pis pour la perte de puissance dûe à sa consommation).

la meilleure solution : un vrai embrayage (à commande électrique) ou un électrofrein, pourquoi?
on ne consommerait de la puissance moteur que pour débrayer.
l'embrayage ou l'électrofrein sont sans alim élec, collés.
l'embrayage ou l'électrofrein sont avec alim élec, décollés. (on peut changer de rapport à ce moment et on consomme de la puissance moteur qu'à ce moment.)

le fonctionnement est totalement inverse entre la poulie de lame et l'embrayage ou électrofrein.

le but final étant:
j'appuie sur une palette de changement de rapport:
çà débraye.
çà change de rapport.
çà embraye.
ce processus prendrait moins de temps avec l'arduino que si c'est un humain qui le fait.

actuellement, il est sans embrayage, le levier commande directement les pignons de boite. mais cela va faire de la casse tôt ou tard car on ne coupe pas la puissance du moteur lors du changement de rapport. on ne peut pas installer de pignon synchronisateur car c'est impossible, les "clavettes de transmission" prennent donc toute la puissance dans les dents.
nous faisons tourner 4 à 5 fois plus vites les pignons de la boite qu'en usage tondeuse.
le coefficient de sécurité méca est grand..... mais pas au point que les clavettes puissent tenir dans la durée à de tels chocs.....il faut donc débrayer

j'ai oublié de préciser que ce sont des courses d'endurance.
une course de 2H.
une course de 3H.

si nous fiabilisons tout, nous pourrions nous engager en auvergne où les courses durent 12 heures....

le servomoteur dans la vidéo est donc un 150kg.cm pour être sûr qu'il soit assez puissant pour passer les rapports.

je recherche un embrayage à commande électrique mais c'est dur à trouver , peut-être un de voiturette de golf .....peu d'infos sur le net..je cherche.

je me tiens à votre disposition si je suis pas assez précis dans mes explications.

PS: si j'ai bien compris, j'ai deux problèmes : 1 je n'ai pas le moniteur série qui m'affiche quelque chose de lisible. 2 les boutons de réglages ne font rien bouger.
je suis en logiciel arduino 1.8.12, je n'ai pas osé le mettre à jour de peur que cela fasse dysfonctionner mon prog d'afficheur.

mais peut être qu'il faut que je le fasse pour que tout fonctionne ?

ou est ce que les entrées A0 et A1 ne sont pas actives ?

j'ai compris mon erreur de mauvais utilisateur! (comme d'habitude vous allez me répondre!)

la vitesse en bauds étaient mauvaise dans le moniteur série! il fallait mettre 115200 et non 9600bauds, c'est pour cela que j'avais des caractères saugrenus!

j'ai bien le programme qui fonctionne en changement de rapport et en réglage de rapports.
Merci bien!!!!

j'essaie d'intégrer au programme la commande d'embrayage et je vous tiens au courant.

en pièce jointe l'afficheur 56mm vert, un ou deux fils ont dus se débrancher dans le transport mais tout fonctionnera quand je reprendrai le cablage. capteur angulaire à effet hall du précédent projet...

OK je comprends mieux.

Pour le moment concentrons nous sur le réglage "sans PC", sur le terrain.

Non le code ne gère pas le double appui simultané et ce n'est pas une bonne idée.


Dites mois si cette approche qui utilise un encodeur rotatif vous conviendrait mieux :

On n'a plus les boutons de réglage + et - pour l'angle du servo, on les remplace par un encodeur type KY040.


l'encodeur dispose d'un bouton que l'on tourne et qui permet d'envoyer des impulsions dans un sens ou dans l'autre à l'arduino et on peut aussi appuyer sur le bouton.

L'idée de code que j'ai partagé c'est la suivante:

au premier démarrage de l'arduino, il y a mise en mémoire EEPROM d'une config par défaut pour les angles du servo.

const int16_t boiteDefaut[] = {700, 930, 1160, 1390, 1620, 1850, 2080};  // les valeurs par défaut d'angles en  µs

une fois le code lancé vous choisissez une vitesse avec les boutons des palettes et si vous tournez le bouton de l'encodeur dans un sens ou dans l'autre vous affinez l'angle en plus ou en moins.

La LED interne de la carte Arduino s'allume pour dire que la config a été modifiée mais n'est pas enregistrée en EEPROM ➜ si vous coupez le jus, au prochain boot vous n'aurez pas cette modification.

Pour mettre en mémoire EEPROM les valeurs modifiées de la boîte, il suffit de clicker sur le bouton central qui effectuera la sauvegarde (et éteindra la led interne de l'arduino).

L'avantage c'est que d'un point de vue ergonomique c'est quand même plus naturel de tourner dans un sens ou dans l'autre le bouton de l'encodeur pour régler l'angle que de clicker sans cesse sur les boutons. et pour sauver, on utilise le bouton qu'on a déjà dans la main, on l'enfonce juste au lieu de le tourner.

➜ est-ce que ça correspond à ce que vous avez en tête pour le réglage manuel sur le champs de course de la boîte ?

Hello,
Avez vous ou pouvez vous envisager le shifter, comme sur les motos?

bonsoir,

je pense en effet que cette solution est plus naturelle.
mais la rotation complète de l'encodeur correspond-elle à la rotation sur 180 degrés du servomoteur? ou à 360 degrés du servo?

concrètement pour l'arduino ça veut dire

ça débraye ➜ on active le relais embrayage et on attend un peu pour que la mécanique fasse son effet
ça change de rapport ➜ on bouge le servo et on attend un peu pour que la mécanique fasse son effet
ça embraye ➜ on désactive le relais embrayage et on attend un peu pour que la mécanique fasse son effet

il faudra définir les temps

je n'ai pas pris le temps de m'intéresser au fonctionnement du shifter mais je pense que l'on s'en rapproche beaucoup en effet