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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Réunion

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    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 confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 661
    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 très actif
    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
    Par défaut
    Il faut pouvoir distinguer le point mort haut après la compression de celui après l'échappement.

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    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 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 254
    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.

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 17
    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 actif
    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
    Par défaut
    C'est une simulation ou vous utilisez vraiment un moteur thermique ?

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