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;
  }
 
}