IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Allumage et injection Moteur 4 temps mono cylindre


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut Allumage et injection Moteur 4 temps mono cylindre
    Bonjour à tous,voilà 4 ans que je cherche à finaliser un projet réalisé avec un moteur de DD un capteur IR à fin de proposer à mes élèves une maquette pouvant faire apparaître le moment de l'injection de carburant et la durée ainsi que l'allumage de la bougie avec la possibilité de modifier le moment de l'injection avec un potentiomètre ainsi que la durée idem pour l'allumage mais cette fois en degré d'avance de 0° à 30° d'avance par rapport au point mort haut du piston.
    Autre problème,supprimer une étincelle et une injection sur deux,en effet le volant moteur ( DD) équipé d'une cible passant devant le capteur donne une information /tour ce qui n'est pas le cas dans la réalité.
    Admission 180°
    compression 180° à ce moment il me faudrait la possibilité d'envoyer un signal pour l'injection et presque dans le même temps le signal pour l'allumage.
    C'est deux signaux pouvant intervenir quelque ° avant le 360° premier degrés du cycle.
    Un jeune homme m'avait fabriqué un programme arduino que je suis presque incapable d'exploiter!
    Je précise que dans le programme que je propose,plusieurs paramètres ne sont plus d'actualité !
    Sur l'afficheur LCD (20X4) les informations se superposent et sont donc illisible et je pense trop précise !
    Merci d'avance pour votre aide,si besoin je peu faire une vidéo du résultat que j’obtiens
    Le programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    #include <LiquidCrystal.h>
     
    float temps_tour; //temps d'un tour du volant-moteur
    float temps_dernier_tour; //temps au début du dernier tour
     
    int etat; //état du tour (1: tour d'injection, 2: tour d'allumage, 3: état d'attente)
     
    float temps_signal[6] = {1, 1, 10, 10, 1, 0.1}, angle_signal[5]; //temps et angles correspondant aux débuts et fins des signaux (avances puis temps d'injections, avance puis temps d'allumage)
     
    bool signaux_emis[4] = {false, false, false, false}; //si les signaux de début et fin d'injections sont émis ou non
     
    int broche_signal[3] = {6, 7, 8}, broche_capteur = 9; //broches des signaux et du capteur
    int capteur_positif = LOW, signal_positif = HIGH, signal_negatif = LOW; //signaux reçus et émis comme signaux positifs
     
    String texte_signal = "        ";
     
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //connection des différentes broches de l'afficheur
     
    void setup() 
    {
      lcd.begin(16,4);                //initialize LCD
     
      Serial.begin(9600);
     
      pinMode(broche_signal[0], OUTPUT); //broche d'injection du carburant
      pinMode(broche_signal[1], OUTPUT); //broche d'injection de l'air
      pinMode(broche_signal[2], OUTPUT); //broche d'allumage
      pinMode(broche_capteur, INPUT); //broche du capteur
      pinMode(A0, INPUT); //potentiomètre relié à l'avance à l'injection du carburant, la valeur obtenue entre 0 et +1023 est divisée par 64 pour obtenir l'avance à l'injection
    pinMode(A1, INPUT); //potentiomètre relié à l'avance à l'injection de l'air, idem
      pinMode(A2, INPUT); //potentiomètre relié à l'avance à allumage
      pinMode(A3, INPUT); //potentiomètre relié à l'injection du carburant
      pinMode(A4, INPUT); //potentiomètre relié à l'injection de l'air
     
      lcd.begin(16, 4); //initialisation de l'écran LCD à 4 lignes
     
      temps_tour = 40;
      delay(40);
      temps_dernier_tour = 0; //le tour a commencé à 0 millisecondes
      etat = 1; //tour d'injection
     
    }
     
    void loop() {
     
      if(digitalRead(broche_capteur) == capteur_positif){
     
        if(etat != 3){ //on vérifie que le signal n'est pas un duplicata du signal précédent
     
          angle_signal[0] = (float)analogRead(A0) / 64.0; //on lit l'avance à l'injection à partir du potentiomètre, et on la divise par 64 pour obtenir une avance à l'injection comprise entre 0 et +16 (plus précisément, entre 0 et +15.984375)
          angle_signal[1] = (float)analogRead(A1) / 64.0; //les valeurs retournées par les capteurs sont entières, entre 0 et +1023. elles doivent donc être d'abord converties en float pour que la division ne retourne pas un nombre entier
          angle_signal[4] = (float)analogRead(A2) / 64.0; //il s'agit ici d'angles, la véritable avance est donc également proportionnelle au temps moyen d'un tour
          angle_signal[2] = (float)analogRead(A3) * 300.0 / 1024.0; //les valeurs sont cette fois-ci comprises entre 0 et +300 (afin de ne pas déborder sur le tour suivant)
          angle_signal[3] = (float)analogRead(A4) * 300.0 / 1024.0;
     
          temps_tour = millis() - temps_dernier_tour; //actualisation des données sur la durée d'un tour et sur le début du dernier tour
          temps_dernier_tour = millis();
     
          for(int i = 0; i < 5; i++){ //affichage des données sur l'écran LCD
            temps_signal[i] = angle_signal[i];
            lcd.setCursor(8*(i%2), i/2+1);
            texte_signal = temps_signal[i];
            lcd.print(texte_signal);
          }
     
          for(int i = 0; i < 4; i++){
            signaux_emis[i] = false;
          }
     
          if(etat == 1) { //tour d'injection
     
            lcd.setCursor(0, 0);
            lcd.print("INJECTION");
     
            temps_signal[2] += temps_signal[0]; //on ajoute le temps d'attente précédant le temps du signal
            temps_signal[3] += temps_signal[1];
     
            while(signaux_emis[0] == false || signaux_emis[1] == false || signaux_emis[2] == false || signaux_emis[3] == false){
     
              for(int i = 0; i < 4; i++){ //on vérifie si un ou plusieurs des 4 signaux doivent être émis
                if(millis() - temps_dernier_tour >= temps_signal[i] && signaux_emis[i] == false){
                  if(i < 2) digitalWrite(broche_signal[i], signal_positif);
                  else digitalWrite(broche_signal[i-2], signal_negatif);
                  signaux_emis[i] = true;
                }
              }
     
            }
     
            etat = 2;
          }
     
          else if(etat == 2) { //tour d'allumage
     
            lcd.setCursor(0, 4);
            lcd.print("      ALLUMAGE");
     
            delayMicroseconds(100000 * temps_signal[4]);
            digitalWrite(broche_signal[2], signal_positif); //on envoie le signal d'allumage
            delayMicroseconds(100000 * temps_signal[5]);
            digitalWrite(broche_signal[2], signal_negatif); //fin de l'envoi du signal d'allumage
     
            etat = 3; //l'état d'attente évite de sortir de la boucle avec toujours le même signal que celui d'avant l'activation de l'allumage
          }
     
        }
     
      } else if(etat == 3) { //si aucun signal n'est détecté et que l'on est en état d'attente, on peut passer à l'état d'injection (celui permettant d'activer l'injection une fois qu'un nouveau signal arrive)
          etat = 1;
      }
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    Bonjour,

    je ne suis pas très familier avec le vocabulaire employé dans le sujet (et je pense ne pas être le seul) et donc il sera difficile de répondre.

    Pour comprendre un peu mieux la problématique :
    - qu'est-ce qu'un Moteur 4 temps mono cylindre ? Je présume qu'il s'agit d'un moteur à explosion car tu fais allusion à des injections, à des étincelles.
    - qu'est-ce qu'un moteur DD ? moteur de Disque Dur ?
    - quel est le rôle du capteur IR ? Est-ce pour compter le nombre de tours ?

    le moment de l'injection de carburant et la durée ainsi que l'allumage de la bougie avec la possibilité de modifier le moment de l'injection avec un potentiomètre ainsi que la durée idem pour l'allumage mais cette fois en degré d'avance de 0° à 30° d'avance par rapport au point mort haut du piston.
    là j'avoue je n'ai rien compris, surtout la fin. Mesures-tu un angle ?

    Peut-on avoir un schéma très simplifié du système complet ?

  3. #3
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 453
    Points
    1 453
    Par défaut
    Il faut pouvoir distinguer le point mort haut après la compression de celui après l'échappement.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut Moteur thermique à 4 temps
    Citation Envoyé par Auteur Voir le message
    Bonjour,

    je ne suis pas très familier avec le vocabulaire employé dans le sujet (et je pense ne pas être le seul) et donc il sera difficile de répondre.

    Pour comprendre un peu mieux la problématique :
    - qu'est-ce qu'un Moteur 4 temps mono cylindre ? Je présume qu'il s'agit d'un moteur à explosion car tu fais allusion à des injections, à des étincelles.
    - qu'est-ce qu'un moteur DD ? moteur de Disque Dur ?
    - quel est le rôle du capteur IR ? Est-ce pour compter le nombre de tours ?


    là j'avoue je n'ai rien compris, surtout la fin. Mesures-tu un angle ?

    Peut-on avoir un schéma très simplifié du système complet ?
    Merci de intérêt que tu portes à mon projet,effectivement je parle d'un moteur thermique à quatre temps mais avec un seul cylindre!
    DD est bien un moteur de Disque Dur qui remplace le volent moteur du moteur sur lequel j'ai fixé une cible.
    Le capteur IR devrait me servir à compter le nombre de tour moteur mais aussi à déterminer le point mort haut qui de ce fait déterminera le moment de l'injection et aussi le moment de l'allumage (étincelle).
    Le programme joint fonctionne mais je souhaiterai supprimer des données qui me semble inutile pour le moment car l'affichage se chevauche sur un LCD 20X4 !
    J'ai joint 4 photo qui représentent les quatre cycles d'un moteur 4 temps (PMH = point où la piston est au plus haut PMB = point où le piston est au plus bas
    Admission PMH vers PMB
    Compression PMB vers PMH fin de compression : sur ce cycle :début injection 248° (c'est un exemple )étincelle 360° (c'est un exemple auissi)
    Combustion détente PMH vers PMB
    Échappement
    J'aimerai que le moment en ° et la duré de l'injection en milliseconde soit réglable avec un potentiomètre (2 en fait) et que le moment de l'étincelle soit réglable par un potentiomètre en ° mais de 0° vers 246° soit 24° avant le PMH du temps compression !
    J'aimerai aussi que l'étincelle ne soit existante sur le PMH du cycle échappement soit une étincelle pour deux tours de volant moteur.
    Voila j'espère avoir été plus clair ?
    Encore une fois merci de ton aide.
    Images attachées Images attachées     

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Salut,
    Il y a des choses que je ne comprends pas dans la description ni dans le logiciel qui faudrait penser différemment. Attention ce que je vais écrire ci dessous est une critique constructive.

    Il y a bien un seul capteur IR qui se trouve au PMH et qui fait office de compte tour ?
    Le volant moteur tourne grâce a un petit moteur mais sans être contrôlé précisément, il est juste alimenté et il tourne ?

    Si les deux réponses sont oui alors tu n'as donc aucun moyen de connaître précisément la position du volant moteur. Le logiciel semble compenser cette absence d'information en comptant le temps qui passe entre deux détections du capteur IR mais ce n'est pas vraiment un bonne solution et elle l'est d'autant moins car le programme utilise la méthode de polling (à l'inverse des interruption) pour détecter le signal du capteur IR.

    Explication :
    if(digitalRead(broche_capteur) == capteur_positif)
    Le logiciel dans Arduino tourne en boucle, d'où le nom de la fonction "loop", c'est à dire que le programme lit le signal du capteur seulement lorsqu'il passe par la ligne ci dessus. Le reste du temps le programme fait autre chose puis il revient sur cette ligne puis fait autre chose ainsi de suite. Pour que ça fonctionne bien, il faut que le autre chose ne dure pas longtemps comme ça le programme passe souvent par la ligne de code qui lit le signal du capteur et on augmente les chances que la cible sur le volant moteur passe devant le capteur IR à l'instant où le programme Arduino est sur la ligne de code ci dessus.
    Cette solution n'a que des défauts en réalité car si le autre chose prend du temps (affichage, communication avec un PC, ...) on a toute les chances que lorsque la cible passe devant le capteur IR, le programme soit encore entrain... bah de faire ce autre chose. On rencontrera le même problème si jamais le moteur tourne trop vite car statistiquement il y a moins de chance que la cible passe devant le capteur IR au moment précis où le programme Arduino est sur la ligne de code ci dessus.


    Il faudrait que :
    Le logiciel Arduino travaille par interruption pour ne jamais louper un passage de la cible devant le capteur IR. Le mode interruption n'a rien à voir avec le polling, en interruption le micro arrête tout ce qu'il est entrain de faire pour exécuter ce que tu veux qu'il fasse lors du passage de la cible devant le capteur IR, il reprendra ce qu'il était entrain de faire après seulement.

    Tu saches exactement la position du volant moteur pour correctement définir le moment (en °) de l'injection + sa durée ainsi que le moment (en °) de l'allumage + sa durée, car sans ça des choses du genre "soit 24° avant le PMH du temps compression !" ne sont pas possible sauf à faire une estimation. Pour solutionner ce problème tu peux, soit demander à Arduino de contrôler un moteur pas à pas pour faire tourner le volant moteur au quel cas tu sais exactement la position du volant moteur puisque c'est toi qui le fait tourner, soit tu utilises un codeur incrémental rotatif qui te donnera la positon très précise du volant moteur même si il tourne avec un moteur de HDD indépendant et non contrôlé.


    Citation Envoyé par nanoprof
    J'aimerai aussi que l'étincelle ne soit existante sur le PMH du cycle échappement soit une étincelle pour deux tours de volant moteur.
    Alors ça par contre, je ne sais pas comment faire. Ce que je sais c'est que tu ne pourras pas travailler directement sur la haute tension qui va à la bougie (un relai ou autre ne sera pas adapter, soudage des contacts, défauts d'isolement etc...) il faudra agir sur ce qu'il y a avant la haute tension, donc sur ce qui la commande. En espérant que ce ne soit pas un système mécanique !? Idem pour gérer l'injection car il y a de la pression là dedans ?


    Plus personnellement, je pense qu'on pourrait même se passer d'un Arduino.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Bonjour ,question peut être bête mais si je met une deuxième cible sur le DD ne pourrait elle pas annoncer l'arrivée de la cible principale?et donc déduire le moment d'injection et d'allumage en avance?

  7. #7
    Membre habitué
    Homme Profil pro
    007
    Inscrit en
    Octobre 2014
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : 007

    Informations forums :
    Inscription : Octobre 2014
    Messages : 119
    Points : 188
    Points
    188
    Par défaut
    C'est une simulation ou vous utilisez vraiment un moteur thermique ?

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    C'est une petite maquette qui doit être pédagogique!

  9. #9
    Membre habitué
    Homme Profil pro
    007
    Inscrit en
    Octobre 2014
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : 007

    Informations forums :
    Inscription : Octobre 2014
    Messages : 119
    Points : 188
    Points
    188
    Par défaut
    Une photo ne serait pas inutile pour être sûr de savoir de quoi on parle.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Nom : 20181127_221745.jpg
Affichages : 3702
Taille : 1,26 Mo

  11. #11
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Bonjour,

    Il y a plusieurs choses que je ne comprends pas à ton problème :
    - tu dis que tu as un capteur qui ne te fournit qu'une impulsion / tour, comment fais-tu pour connaître la position de l'arbre au degré près ? (pour pouvoir régler par exemple l'avance à l'allumage de 0 à 30°).
    - je vois dans ton programme une sortie nommée "broche d'injection de l'air", je croyais que l'admission de l'air était commandée mécaniquement par une soupape et l'arbre à cames.
    - le programme est difficile à lire, tout est dans la fonction loop(), il faudrait le décomposer en fonction.
    - pour le capteur de position de l'arbre-moteur, pourquoi ne pas utiliser une interruption ?

    Aurais-tu un document qui décrit clairement ce que doit faire le programme ?

    Cordialement,
    jmv (prof aussi)

  12. #12
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut Encore moi !
    En fait il faut que tu connaisse la position sur 2 tours, le PMH pouvant être la fin de la compression ou la fin de l'échappement.
    Il faudrait placer le capteur de position sur un arbre à cames (qui tourne 2 fois moins vite si j'ai tout compris au moteur 4 temps) mais tu n'en dispose pas.

  13. #13
    Membre habitué
    Homme Profil pro
    007
    Inscrit en
    Octobre 2014
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : 007

    Informations forums :
    Inscription : Octobre 2014
    Messages : 119
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par nanoprof Voir le message
    photo
    OK, donc si je récapitule, ton moteur est un disque dur, ton volant moteur
    et le piston sont symbolisés par le plateau du disque dur. Avec l'arduino,
    tu essaies de construire l'équivalent d'un ecu (calculateur moteur) avec la
    possibilité d'agir manuellement sur différentes variantes et voir le comportement
    moteur qui en résulte. Alors que jusqu'à maintenant, le moteur tournait à une
    vitesse fixe. C'est ça ?

    Sinon, là comme ça,

    Je dirais qu'il faut agrémenter ton disque de quelques led pour représenter les
    soupapes, l'étincelle, l'injection, etc. et conserver l'afficheur juste pour les rpms.
    Plus un bouton pour le démarreur (sauf si tu préfères une tirette).

    Après, il y a des essais ou des calculs à faire avec un plateau à 1000 rpm (genre
    moteur réel au ralenti) et voir si ton unique capteur ir est suffisant pour te donner
    une précision suffisante de la vitesse angulaire et en extrapoler la position du
    disque à un instant t. Sinon faire une bande noire sur le plateau ou ajouter un deuxième
    capteur. Mais le projet est tout à fait réalisable.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par jmv Voir le message
    En fait il faut que tu connaisse la position sur 2 tours, le PMH pouvant être la fin de la compression ou la fin de l'échappement.
    Il faudrait placer le capteur de position sur un arbre à cames (qui tourne 2 fois moins vite si j'ai tout compris au moteur 4 temps) mais tu n'en dispose pas.
    Bonjour
    Effectivement,comme je l'ai dit dans mon premier post les lignes 30 et 33 ne sont plus a prendre en compte.
    Pour ce qui et de la vitesse de rotation (RPM) j'ai utilisé une autre Arduino et un autre LCD mais si les des programmes pouvaient être sur la même Arduino ça m'arrangerai !
    Je n'ai aucune connaissance en programmation!
    Je bidouille !!!!
    Le programme que j'ai posté à été réalisé par un ancien élève que j'avais en Calédonie et depuis suite à une mutation plus de nouvelle!
    L'injection et l'allumage doivent se faire quelques degrés avant le PMH fin de compression,sur ma maquette je ne dispose que du DD!
    Dans ce que ce jeune m'avait fait ,j'avais la possibilité de modifier les degrés d'avance injection et allumage et de modifier aussi la durée de l'injection.
    Le pb c'est que sur mon LCD trop d'informations arrivent et donc se superposent!
    Je voulais savoir si en enlevant les ligne 30 et 33 et en donnant des indications un peu moins précises(sur le LCD j'ai des affichage de 3 chiffres après la virgule que je ne peu pas identifier mais qui varient en agissant sur les potentiomètres , alors que moi je n'attends que 10° ou 30° d'avance injection et allumage et un résultat en millième de seconde pour la durée d'injection) cela pourrait clarifier mon affichage?
    Encore une fois merci de te pencher sur mon projet

  15. #15
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    J'ai trouvé cette vidéo où le gars explique qu'il faut bien un capteur sur l'arbre à cames pour savoir où en est le moteur.


    Tu simules un moteur monocylindre donc tu n'as besoin que d'une impulsion sur l'arbre à cames.

    Dans ton cas, ne serait-il pas plus simple de dire que le DD représente l'arbre à cames ? ça t'éviterait d'avoir une variable "etat" qui alterne entre 1 et 2.

    Pour le problème d'affichage, c'est normale car tu envoie des informations tous les 2 tours soit environ 80ms (ligne 37 : temps_tour = 40; ).
    Il faudrait modifier le programme pour que la mise à jour de l'affichage soit moins rapide (1 seule ligne tous les 10 tours par exemple).

    Et je n'ai toujours pas compris ce signal pour l'admission d'air, pourrais-tu m'expliquer pourquoi la soupape d'admission ne suffit pas ?

    a+
    jm

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    "Tu simules un moteur monocylindre donc tu n'as besoin que d'une impulsion sur l'arbre à cames."
    Ok mais ne peut on pas diviser par deux le signal.Dans les moteurs à quatre temps, le cycle complet nécessite deux tours de vilebrequin pour un tour de l'arbre à cames.
    En conséquence, ce dernier tourne à une vitesse qui est la moitié de celle du moteur.
    Pour la ligne 37 je dois remplacer le 40 par 10?
    Dans le programme le jeune avait estimé en temps la vitesse de rotation du volent moteur,bonne idée ou pas ?

  17. #17
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par nanoprof Voir le message
    "Tu simules un moteur monocylindre donc tu n'as besoin que d'une impulsion sur l'arbre à cames."
    Ok mais ne peut on pas diviser par deux le signal.
    Bien sûr que si, c'est ce qui est fait dans le programme avec la variable "etat" qui alterne entre 1 et 2.
    Le faite de mettre le capteur sur un arbre à cames évite de diviser la fréquence par 2 et en plus tu sait où en est le moteur.

    Citation Envoyé par nanoprof Voir le message
    "Pour la ligne 37 je dois remplacer le 40 par 10?
    Non, je voulais simplement dire qu'au lieu de mettre à jour les 4 lignes de l'afficheur à chaque tour, les infos seraient plus lisibles si on les mettait à jour moins souvent. 1 ligne tous les 10 tours cela revient à mettre tout à jours tous les 40 tours, l'affichage sera plus "stable".

    Citation Envoyé par nanoprof Voir le message
    Dans le programme le jeune avait estimé en temps la vitesse de rotation du volent moteur,bonne idée ou pas ?
    Oui, 40ms correspond à 1500 tr/min, c'est une bonne estimation et de toutes façons c'est mis à jour à chaque tour.

    Bon mais je n'ai toujours ma réponse au sujet de l'admission de l'air

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    L'admission de l'aire se fait par la soupape d'admission!donc sur un moteur c'est la distribution qui gère ça.
    Les lignes 30 et 33 ne sont plus à prendre en compte!

  19. #19
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Salut nanoprof,

    Excuse moins d'avoir pris du temps pour te répondre, beaucoup de boulot en ce moment.

    Comme tu dis que tu ne comprends rien au code que tu as posté, on va y aller étape par étape. Je te propose le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    const int brocheCapteur = 2;
    const int noInterruption = digitalPinToInterrupt(brocheCapteur);
     
    // les temps suivants sont en µs
    volatile unsigned long dateDerniereImplusion = 0;
    volatile unsigned long tempsTour = 40000; // c'est une estimation, ça correspond à 1500 tr/min
     
    void isr()
    {
        unsigned long date = micros();
        tempsTour = date - dateDerniereImplusion;
        dateDerniereImplusion = date;
    }
     
    void setup()
    {
        Serial.begin(9600);
        pinMode(brocheCapteur, INPUT); 
        attachInterrupt(noInterruption, isr, FALLING);
    }
     
    void loop()
    {
        delay(1000);
        unsigned rpm = 60000000ul / tempsTour;
        Serial.print(rpm);
        Serial.println(" tr/min");
    }
    Ce code ne fait que calculer la vitesse de rotation en tr/min et l'affiche dans la console. C'est tout pour l'instant.
    Sur Arduino Uno, seul les entrées 2 et 3 sont utilisables avec les fonctions digitalPinToInterrupt() et attachInterrupt(), il va donc falloir que tu modifie tes câblages.
    De plus je suis passé aux microsecondes car je pense que la précision est insuffisante en millisecondes (à 6000 tr/min, un tour dure 10ms, tu as donc une précision de 36°).

    Si il y a des choses dans ce code que tu ne comprends pas, n'hésite pas à poser des questions.

    bon courage...
    jm

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Salut , ne t'excuse pas pour le retard,c'est déjà bien sympa de répondre .
    Bon j'ai téléversé ton programme et effectivement au niveau câblage,ce n'es plus compatible puisque mon écran utilisait les broches 2 et 3!
    Je t'ai envoyé mon branchement,pour ma part je ne sais pas comment le modifier!!!
    Tu donnes broche 2 capteur et la 3?
    Encore merci pour ton aide
    Pierric
    Images attachées Images attachées  

Discussions similaires

  1. [Projet en cours] Développement d'un moteur physique temps réel
    Par Mikmacer dans le forum Projets
    Réponses: 6
    Dernier message: 10/02/2011, 13h25
  2. Réponses: 0
    Dernier message: 24/09/2009, 10h00
  3. Réponses: 1
    Dernier message: 23/06/2008, 16h48
  4. Réponses: 3
    Dernier message: 15/10/2006, 10h10
  5. [recherche documentation] Moteur de jeu ou de démo interactive temps réel
    Par shenron666 dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 20/06/2006, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo