Go Down

Topic: Reprise de projet, lecture RPM (tours par minute), moteur 4 temps (Read 4409 times) previous topic - next topic

dfgh

hello
quand le prg du dessus sera validé, testes celui ci

attention vérifies que les lignes sont bien pour toi.
par exemple il y a deux lignes de calcul du régime dans lesquelles tu avais ajouté une multiplication par 2. ( j'ai cherché un bout de temps, je le savais mais j'avais oublié.)
il y a aussi deux #define en tête du prg pour les états travail et repos
car il me semble bien avoir vu que tu travailles avec un relais dont le contact est NF ?? ( c'est une question )

je t'ai laissé tous les Sérial.print pour que tu puisses suivre sur le moniteur.
une fois le prg validé, il faudra  mettre tous les serial.print en commentaire pour ne pas brider sa vitesse

Code: [Select]
#define  injecteur                      2 //signal à capter et compter 
#define  bp_saisie_seuil                3 //BP de memorisation du regime actuel dans le seuil
#define  bp_on_off                      4 //BP de mise en fonction du systeme 
#define  embrayage_on_off               5 //contact monté sur poignée d'embrayage 
#define  relais_coupure                 6 //relais coupure allumage
#define  led_systeme_ON                 7 //led témoin mise en fonction du systeme
#define  led_relais                    13 //led témoin etat relais
#define  Travail 1
#define  Repos 0
volatile byte compteur_injections =     0;//compteur du signal à capter
byte memo_compteur_injections     =     0;//memorisation du compteur
int seuil_par_defaut              =  4000;//seuil initialisé par défaut ******c'est ici qu'il faut modifier la valeur par  defaut
int seuil                         =     0;//seuil de la coupure d'allumage
int regime                        =     0;//seuil de la coupure d'allumage
unsigned long premiere_injection  =     0;//debut premiere injection
unsigned long deb_tempo           =     0;//debut tempo cde relais coupure
unsigned long tempo               =    25;//durée de la coupure par relais
boolean  memo_on_off              = false;//memo appui sur BP on off (flip/flop)
boolean  flag_saisie_seuil        = false;//memorisation de la demande de saisie du regime vers le seuil
//boolean  flag_fin_demarrage     = false;//temoin de demarrage en 1ere terminé
boolean  flag_premier_debrayage   = true;//memorisation de la demande de saisie du regime vers le seuil
boolean  flag_gachette            = true;
void setup()
{

  Serial.begin(115200);
  attachInterrupt(1, isr_saisie_seuil, FALLING);        //flanc descendant
  attachInterrupt(0, isr_comptage_injections, RISING); //la poignée est relachée, le flanc monte
  premiere_injection = micros();          //en micro secondes, le calcul du regime se fera en en tenant compte
  pinMode(2, INPUT_PULLUP);               //D2 INT 0  injecteur
  pinMode(3, INPUT_PULLUP);               //D3 INT 1  bp_saisie_seuil
  pinMode(bp_on_off, INPUT_PULLUP);       //D4
  pinMode(embrayage_on_off, INPUT_PULLUP);//D5
  pinMode(relais_coupure, OUTPUT);        //D6
  pinMode(led_systeme_ON, OUTPUT);        //D7 Led temoin de la mise en fonction du programme
  pinMode(led_relais, OUTPUT);            //D13Led interne, juste pour contrôler le fonctionnement
  digitalWrite(relais_coupure, Repos);    //Niveau BAS = fonctionnement normal de la moto, pas de coupure au démarrage
  digitalWrite(led_systeme_ON, LOW);      //signale la mise en fonction du système
  digitalWrite(led_relais, Repos);         //suit l'état du relais pour en signaler le fonctionnement
  seuil = seuil_par_defaut;               //initialisation effective du seuil par défaut
}

void loop()
{
  if (!digitalRead(bp_on_off))                      //si BP on/off  appuyé la lecture retourne "LOW"
  {
    while (!digitalRead(bp_on_off)) {};              //attends que le BP soit relaché
    delay(30);                                      //delay anti rebond
    memo_on_off = !memo_on_off;                     //on inverse le flip_flpo de memorisation appui
    flag_gachette = true;
  }
  if (memo_on_off)                                  //si le flip_flop est ON
  {
    //Serial.print(" 1 memo_on_off ="); Serial.println(memo_on_off);
    //Serial.print(" 8 flag_premier_debrayage = "); Serial.println(flag_premier_debrayage);
    digitalWrite(led_systeme_ON, HIGH);       //le système est en fonction
    if (flag_gachette == true) {
      flag_premier_debrayage = true;
      flag_gachette = false;
    }

    if ((!digitalRead(embrayage_on_off)) && (flag_premier_debrayage == true) ) //si poignée embrayage actionnée et systeme en "ON"
    { //Serial.print(" 3 embrayage_on_off = "); Serial.print(digitalRead(embrayage_on_off));
      //Serial.print(" 4 flag_premier_debrayage = "); Serial.println(flag_premier_debrayage);
      //on fait des choses
      flag_premier_debrayage = false;
      while (!digitalRead(embrayage_on_off))
      {
        //Serial.print(" demarrage en cours ");
        //Serial.print(digitalRead(embrayage_on_off)); Serial.println(memo_on_off);
        flag_premier_debrayage = false;
        //Serial.print("1 flag_premier_debrayage "); Serial.println(flag_premier_debrayage);
        if (compteur_injections == 1)
        {
          premiere_injection = micros();
        }
        if (compteur_injections >= 5)
        {
          memo_compteur_injections = compteur_injections;
          compteur_injections = 0;
          //regime = ((60000000 / ((micros() - premiere_injection) / (memo_compteur_injections - 2))) * 2);
          regime = ((60000000 / ((micros() - premiere_injection) / (memo_compteur_injections - 2))) );
          Serial.print("debraye "); Serial.print("regime ");Serial.print(regime);
          Serial.print("  ");Serial.print("seuil ");Serial.println(seuil);
          if (regime > seuil)                           //si regime > seuil
          {
            deb_tempo = millis();                     //on saisit le temps
            while ((millis() - deb_tempo) < tempo)    //et tant que le temps est < tempo
            {
              digitalWrite(relais_coupure, Travail);     //on colle le relais de coupure de l'allumage
              digitalWrite(led_relais, Travail);         //on allume la led temoin de l'etat du relais
            }                                         //le temps "tempo" est passé
            digitalWrite(relais_coupure, Repos);        //on relache le relais de coupure d'allumage
            digitalWrite(led_relais, Repos);            //on eteint la led temoin de l'etat du relais
           
            compteur_injections = 0;
            //Serial.println("sortie ");
          }
        }
      }
    }
    else
    {
      if (flag_premier_debrayage == true)
    {
     Serial.print("1   attente debrayage ");
    }Serial.print("regime ");Serial.print(regime);
     Serial.print("  ");Serial.print("seuil ");Serial.println(seuil);
      if (flag_premier_debrayage == false)
      {
        //Serial.print(" 5 embrayage_on_off = "); Serial.println(digitalRead(embrayage_on_off));
        //Serial.print(" 6 flag_premier_debrayage = "); Serial.println(flag_premier_debrayage);
        //Serial.print(" 7 memo_on_off ="); Serial.println(memo_on_off);

Serial.print(regime); Serial.print("   "); Serial.println(seuil);
        digitalWrite(led_systeme_ON, LOW);
        memo_on_off = !memo_on_off;
      }
    }
  }
  else
  {
    //Serial.print(" 2 memo_on_off ="); Serial.println(memo_on_off);
    digitalWrite(led_systeme_ON, LOW);
    if (compteur_injections == 1)
    {
      premiere_injection = micros();
    }
    if (compteur_injections >= 5)
    {
      memo_compteur_injections = compteur_injections;
      compteur_injections = 0;
      //regime = ((60000000 / ((micros() - premiere_injection) / (memo_compteur_injections - 2))) * 2);
      regime = ((60000000 / ((micros() - premiere_injection) / (memo_compteur_injections - 2))) );
     
    }
    if (flag_saisie_seuil == true)
    {
        seuil = regime;                             //init de seuil par valeur regime
        if (seuil<seuil_par_defaut){seuil=4000;}    //si valeur du seuil < seuil par defaut...appui involontaire
  Serial.print(" nouveau seuil  ");Serial.println(seuil);
      Serial.print("******************************************* saisie du seuil ");
      flag_saisie_seuil = false;
    }
Serial.print(regime); Serial.print(" 2  "); Serial.println(seuil);
  }

  //Serial.println("      sortie ");
}
void isr_saisie_seuil()
{
  flag_saisie_seuil = true; //Serial.print("flag_saisie_seuil__________________________________");Serial.println(flag_saisie_seuil);
}
void isr_comptage_injections()
{
  compteur_injections++;//Serial.print("compteur_injections");Serial.println(compteur_injections);
}


Nota: le petit relais que tu veux utiliser tiendra t'il dans le temps ?

Brasiligun

Programme 1

Programme 2


Alors pour ceux qui suivent en sous marin le projet,

- régime x2 car moteur 4 temps (2 tours de vilbrequin pour 1 rpm réel donc un cycle)
- ce petit relais (reed) car plus vif qu'un Omron G5V1, normalement meilleure durée de vie mais tests réel et grosses période de stress nécessaire

Mais au niveau ou l'on est, dfgh me porte carrément, nous avons largement dépassé mes capacité en software, donc respect :applause:


Next step: remontage sur la gex!

dfgh

hello
pas d'inquiétude, j'ai testé avec un générateur de fréquences et lorsque tu débrayes, tu entres bien dans la condition qui surveille le régime

attendons la suite de tes tests :) 

Brasiligun

Tu as du beau matos! Je m'y met demain matin vers 11h. Si les test sont conculants, je metterais un lm7805 avec 2 condos (0.1µF et 0.33 µF) pour que je puisse faire un essais "soft" sur route

D'ailleurs, petite question: J'ai toujours fait mes montages précédent avec un couple de condo 100µF en entrée et 100 nF en sortie. Mais la datasheet indique que pour faire du "beau" 12V vers 5V, il vaut mieux se servir d'un couple 0.1µF/0.33µF

Un avis ou un retour personnel sur ce sujet? J'ai les 4, mais dans le temps je n'avais que le couple 100µF/100nF et ça marchait plutôt pas mal


Encore merci et bonne soirée!

dfgh

fies toi à la data sheet

12V ==> 5V c'est le maxi en entrée pour le 7805 il faut lui prévoir un refroidisseur.

s'il "surchauffe", il se mettra en sécurité. puis après avoir refroidi, il se remettra en service.
il ne faut pas que ça arrive quand tu en as besoin.

il m'arrive de passer par un 7808 avant le 7805, (mais c'est un choix perso)

Brasiligun

Je lui colle toujours un petit radiateur + pate thermique en général, mais je n'en ai jamais encore fait chauffer un au point de le mettre en sécu

Aller merci, et demain suite des tests!

Brasiligun

J'ai voulu voir la tension et le fonctionnement du vrai capteur d'embrayage

Donc 3.50V quand la moto est embrayée (levier lâché)
0V quand moto débrayée (levier écrasé)

Video

dfgh


Brasiligun

Bon des nouvelles

Le système de déclenchement puis de lâché d'embrayage très très bien, mais malheureusement, si je suis débrayé et que je monte à 4000, la moto cale :/ Comme si l'arduino stoppé la lecture, ou si elle reçoit trop d'information à traiter

Je pars demain sur Paris, je reviens le wk prochain donc plus d'essais la prochaine fois :p

dfgh

tu as verifié les #défine Travail et Repos pour la commande du relais ?
c'est dans le bon sens pour toi ?

tu as dit quelque part comment est le contact de ton relais, mais je ne trouve plus ou.
fermé au repos ou ouvert au repos?

tu as bien mis en commentaire tous les Serial.print ?

edit:
je viens de re-tester chez moi, avec les serial.print opérationnels

fréquence à 10Hertz, seuil à 4000 et système en ON, lorsque je debraye, je vois que la led temoin du relais ne s'allume pas. puis lorsque je monte en fréquence, la led temoin du relais se met à clignoter.

Brasiligun

J'ai eu une merde avec une vitre de voiture aujourd'hui, je suis resté 5h dessus donc ça m'a flingué mon planning :p

Effectivement, comme un con j'ai laissé les serial.print. Ils ont donc forcément ralentis le programme. Et pareil dans l'urgence j'ai oublié de vérifier aussi les #define (je voulais absolument faire un essai sur le peu de temps qu'il me restait)

Du coup le relais doit être au repos NF, et s'ouvrir juste quand notre programme tourne et que la moto arrive au seuil. Donc je pense qu'on était dans le bon sens mais je vérifierai bien

Je suis pressé d'être à samedi pour refaire un montage propre et à tête reposée

Désolé d'avoir zappé de supprimer les éléments superflux

dfgh

ok,

si ton relais est un NF alors le prg est ok.

les #define Travail et Repos sont ok aussi.

en collant le relais, on ouvre le contact et l'allumage est coupé.

il est coupé pour une durée de 25 ms, peut être faudra t'il ajuster ce temps.

une question : ce temps sera t 'il le même pour un régime de 4000tr ou un regime de 8000tr ?

faudra t'il moduler cette tempo en fonction du régime moteur?

c'est toi qui nous le dira en faisant un essai concluant avec un seuil de 4000 et la tempo qui va bien
puis en faisant un autre test concluant avec un seuil à 8000 et la tempo qui va bien
nous en tirerons une formule qui ajustera ce temps automatiquement

Brasiligun

Tu me dis des belles choses la! :p

Pour mon shifter à l'époque je n'avais pas su me piquer sur un injecteur, sinon j'aurai tenté aussi de faire des temps variables en fonction du régime

Mais si ça marche et que le relais et que la moto arrivent à suivre, ça pourrait être super !

Prochaine étape samedi prochain


Bonne soirée en tout cas

Go Up