Rebonjour! J'ai du partir plus vite que prévu pour le boulot dans une autre région, je n'ai pas eu l'occasion de vous poster une petite vidéo du montage
Je rentre enfin demain dans ch'nord, et je vais pouvoir m'y remettre. J'en ai profité pour chopper un relais plus rapide, je me servais d'un Omron G5V1 (commutation entre 3 et 7ms), là, j'ai choppé un relais reed, un Celduc D31B3100 (commutation rebond inclus 1 - 1,5ms)
Le montage sera bien plus vif et performant!
Le but de tout ceci:
Lire le régime moteur: ok
Réussir à couper l'allumage du véhicule, sans le faire caler et en restant invisible au yeux de l'ECU: ok
Décaler le rupteur sur demande: ok
Maintenant, j'ai des doute concernant mon optimisation,
Le but est bien de lire mes RPM en continu, et quant le moteur arrive au seuil, 4000 Tr/min pour l'exemple, l'arduino allume mon relais, puis le coupe pour que la moto remonte à 4000, re-coupure et ainsi de suite
Petit exemple, pour rendre notre cas parlant:
Voila le code:
//Definition des variables
volatile byte compteur_injections = 0;
byte memo_compteur_injections = 0;
unsigned long premiere_injection = 0;
int rpm = 0;
int injecteur_Pin = 2; // Signal d'un injecteur
const int ignitionCoilPin = 6; // pin de controle du relais/shifter
int launch = 4000; // Decalage rupteur a: XXXX tr/min
int step = 25 * 1000; // stepper
void setup()
{
Serial.begin(115200);
attachInterrupt(0, comptage_injections, RISING);
premiere_injection = micros();
pinMode(2, INPUT_PULLUP);
pinMode(ignitionCoilPin, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT); //Led interne, juste pour contrôler le fonctionnement
digitalWrite(ignitionCoilPin, LOW); //Niveau BAS = fonctionnement normal de la moto, pas de coupure au démarrage
digitalWrite(LED_BUILTIN, LOW);
}
void loop()
{
readRpm();
Serial.println(rpm);
if (rpm >= launch)
{
// cut power to ignition coil for some milliseconds.
digitalWrite(ignitionCoilPin, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
delayMicroseconds(step);
digitalWrite(ignitionCoilPin, LOW);
digitalWrite(LED_BUILTIN, LOW);
delayMicroseconds(step);
}
}
//Fonctions
void readRpm() {
if (compteur_injections == 1) {
premiere_injection = micros();
}
if (compteur_injections >= 3)
{
memo_compteur_injections = compteur_injections;
compteur_injections = 0;
rpm = ((60000000 / ((micros() - premiere_injection) / (memo_compteur_injections - 2)))) * 2;
}
}
void comptage_injections()
{
compteur_injections++;
}
Voyez-vous une quelconque amélioration/optimisation de code encore possible? Mais je suis certain que ce nouveau relais va justement me permettre d'être beaucoup plus "agressif" et rapide dans mon contrôle d'allumage
Je pense également, que le fait des faire delayMicroSeconds(step) n'est peut-etre pas judicieux, en lisant ceci
Le but de ma dernière démarche, est de garder le maximum de vitesse d'execution
Merci!