nano V3 en remplacement de certaine fonction sur un véhicule

Bonjour tout le monde :slight_smile:

je viens de terminer le code nécessaire au remplacement de certaines fonctions d'une:
-Clignotant
-Démarreur
-Coupe Circuit
l'objectif étant de passer la totalité des commandes par boutons poussoir.

Concernant l'application du code ci dessous, je passe par un système de mosfet (un ps2801-4 en direct sur l'arduino qui contrôle à son tour 4 IRF540N) pour la mise sous tension des différents organes contrôlés, l'option relais mécanique ne m'ayant pas plus séduite que ça ^^' et surtout le circuit de mosfet étant fournis monté (le faire moi même, au vu des simulation sous proteus, n'était pas envisageable)

Je rencontre en revanche un petit soucis concernant la coupure des clignotants après la mise en marche, celle si est assez aléatoire... Je cherche donc une méthode plus efficace :slight_smile:

n’hésitez pas à me faire des critiques (constructives ^^"), je débute mais j'aime bien ça ^^

voici le code:

//entrées
int inPin1 = 2; // poussoir cligno droit
int inPin2 = 3; // poussoir cligno gauche
int inPin3 = 4; // poussoir démarreur
int inPin4 = 5; // poussoir coupe circuit
//sorties
int outPin1 = A0; // cligno avant et arriére droit
int outPin2 = A1; // cligno avant et arriére dgauche
int outPin3 = A2; // relai de démarreur
int outPin4 = A3; // coupe circuit
//variables
int state1 = LOW; //démarrer le prog cligno droit éteint
int reading1;
int previous1 = HIGH;
int state2 = LOW; //démarrer le prog cligno gauche éteint
int reading2;
int previous2 = HIGH;
int reading3;
int state4 = HIGH; //démarrer le prog coupe circuit sur on
int reading4;
int previous4 = LOW;
//gestion appuie
long time = 0;
long debounce = 200; //

void setup() //tout les poussoir en pullup pour passer par une masse commune
{
  attachInterrupt(0, loop, CHANGE);
  pinMode(inPin1, INPUT_PULLUP);
  pinMode(outPin1, OUTPUT);
  pinMode(inPin2, INPUT_PULLUP);
  pinMode(outPin2, OUTPUT);
  pinMode(inPin3, INPUT_PULLUP);
  pinMode(outPin3, OUTPUT);
  pinMode(inPin4, INPUT_PULLUP);
  pinMode(outPin4, OUTPUT);
}

void loop()
{
  //Pin1 / Cligno droit
  reading1 = digitalRead(inPin1);
  if (reading1 == LOW && previous1 == HIGH && millis() - time > debounce)
  {
    if (state1 == LOW)
    {
      state1 = HIGH;
      state2 = LOW;
    }
    else
      state1 = LOW;

    time = millis();
  }
  previous1 = reading1;
  while (state1 == HIGH)
  {
    digitalWrite(outPin1, HIGH);
    delay (500);
    digitalWrite(outPin1, LOW);
    delay (500);
    reading1 = digitalRead(inPin1);
    if (reading1 == LOW && previous1 == HIGH && millis() - time > debounce)
    {
      if (state1 == LOW)
      {
        state1 = HIGH;
        state2 = LOW;
      }
      else
        state1 = LOW;
      time = millis();
    }
    previous1 = reading1;
    break;
  }

  //Pin2 / Cligno gauche
  reading2 = digitalRead(inPin2);
  if (reading2 == LOW && previous2 == HIGH && millis() - time > debounce)
  {
    if (state2 == LOW)
    {
      state2 = HIGH;
      state1 = LOW;
    }
    else
      state2 = LOW;

    time = millis();
  }
  previous2 = reading2;
  while (state2 == HIGH)
  {
    digitalWrite(outPin2, HIGH);
    delay (500);
    digitalWrite(outPin2, LOW);
    delay (500);
    reading2 = digitalRead(inPin2);
    if (reading2 == LOW && previous2 == HIGH && millis() - time > debounce)
    {
      if (state2 == LOW)
      {
        state2 = HIGH;
        state1 = LOW;
      }
      else
        state2 = LOW;
      time = millis();
    }
    previous2 = reading2;
    break;
  }

  //Pin3 / Démarreur, pression = impulsion vers le relai de démarrage (pas de mosfet, intensité trop haute)
  reading3 = digitalRead(inPin3);
  if (reading3 == LOW)
    digitalWrite(outPin3, HIGH);
  else
    digitalWrite(outPin3, LOW);

  //Pin4 / Coupe circuit, on/off par pression courte
  reading4 = digitalRead(inPin4);
  if (reading4 == LOW && previous4 == HIGH && millis() - time > debounce)
  {
    if (state4 == HIGH)
      state4 = LOW;
    else
      state4 = HIGH;
    time = millis();
  }
  digitalWrite(outPin4, state4);
  previous4 = reading4;

}

Lu un peu vite mais j'ai le sentiment que si les clignotants fonctionnent tu ne peux pas éteindre/allumer ton moteur.

bonjour,
je rejoins pepe sur ce point.

de plus, si tu circule sur la voie publique avec un véhicule homologué normalement, mais avec des modifications apportées par tes soins sur des points de sécurité, tu risque de sérieux ennuis en cas d'accident et tu peux dire adieu à la couverture de ton assurance.

si c'est pour un modèle réduit, aucun soucis.

@fdufnews, tout à fait, le système ne le permet pas, tout comme le coupe circuit d'ailleurs >.<

@pepe; @infobarquee, non cette chose (une moto en l’occurrence) n'ira jamais sur route ouverte, la carte grise étant en RSV et la moto datant de Mathusalem, il faudrait un budget illimité pour espérer la voir passer au mine ^^ quand bien même, je ne pourrais pas l'assurer

c'est juste du bricolage, ça occupe quand on est insomniaque ^^"

ok,
un coupe circuit ne se met pas sur le système embarqué, mais à part pour tout couper en cas d'urgence.
heureusement, car si le système embarqué pète un cable, le coupe circuit ne sera pas utilisable.

après, erreur débutant dans certaines parties de code

   else
      state1 = LOW;

    time = millis();

juste la 1ere instruction est prise en compte, il faut des { } pour tout prendre en compte

remplace tes while par if

hello
tu dois avoir un problème avec ça:

int BP_clignotant_droit = 2; // poussoir cligno droit
attachInterrupt(0, loop, CHANGE);

tu déclenche l'interruption sur une action sur le BP clignotant droit?????????????

de plus appeler la loop sur une interruption ?????????????

@infobarquee, j'ai supprimé mes while, le fonctionnement est toujours erratique, je lâche l'affaire pour intégrer le clignotement dans l'arduino, ou il faudrait que le clignotement s'exécute en parallèle du reste du prog :confused: et sans vouloir dire de bêtise, il me semble qu'il n'y a pas de multitâche sur un arduino >.<

Je suis tombé sur ceci en rechercha,t une méthode qui pourrait passer, je regarde comment adapter tout ça

@dfgh, l'interrupt est supprimé, je n'avais pas les idées très clair, je cherchais un moyen de mettre fin au clignotement >.<

Bon, plutôt qur de m'arracher les cheveux pour gérer un clignotement par ligne de code, je vais le generer via un circuit tout simple à base de transistor, l'avantage c'est qu'au niveau de l'arduino, ça simplifie le problème ^^"

c'est dommage

veux tu essayer ce code

//entrees
int BP_clignotant_droit = 2; // poussoir cligno droit
int BP_clignotant_gauche = 3; // poussoir cligno gauche
int BP_demarreur = 4; // poussoir démarreur
int BP_coupe_circuit = 5; // poussoir coupe circuit
//sorties
int sortie_clignotant_droit = A0; // cligno avant et arriére droit
int sortie_clignotant_gauche = A1; // cligno avant et arriére dgauche
int sortie_relais_demarreur = A2; // relai de démarreur
int sortie_coupe_circuit = A3; // coupe circuit
//variables
boolean demande_clignotant_droit = false; //démarrer le prog cligno droit éteint
int lecture_BP_clignotant_droit;
int BP_clignotant_droite_memorise = HIGH;
boolean demande_clignotant_gauche = false; //démarrer le prog cligno gauche éteint
int lecture_BP_clignotant_gauche;
int BP_clignotant_gauche_memorise = HIGH;
int lecture_BP_demarreur;
boolean securite_ok = true; //démarrer le prog coupe circuit sur on
int lecture_BP_securite;
int BP_securite_memorise = LOW;

long debounce = 200; //

void setup() //tout les poussoir en pullup pour passer par une masse commune
{
  //attachInterrupt(0, loop, CHANGE);
  pinMode(BP_clignotant_droit, INPUT_PULLUP);
  pinMode(sortie_clignotant_droit, OUTPUT);
  pinMode(BP_clignotant_gauche, INPUT_PULLUP);
  pinMode(sortie_clignotant_gauche, OUTPUT);
  pinMode(BP_demarreur, INPUT_PULLUP);
  pinMode(sortie_relais_demarreur, OUTPUT);
  pinMode(BP_coupe_circuit, INPUT_PULLUP);
  pinMode(sortie_coupe_circuit, OUTPUT);
}

void loop()
{
  gestion_BP_clignotant_droit();
  gestion_BP_clignotant_gauche();
  gestion_BP_demarreur();
  gestion_clignotant_droit();
  gestion_clignotant_gauche();
  gestion_BP_securite();
}
  void gestion_BP_demarreur()
  {
    lecture_BP_demarreur = digitalRead(BP_demarreur);
    if (lecture_BP_demarreur == LOW)
    {
      delay(300);//anti rebonds
      digitalWrite(sortie_relais_demarreur, HIGH);
    }
    else
    {
      delay(300);//anti rebonds
      digitalWrite(sortie_relais_demarreur, LOW);
    }
  }
  
  void gestion_BP_securite()
  {
  lecture_BP_securite = digitalRead(BP_coupe_circuit);
  if (lecture_BP_securite == LOW )
  {
    if (securite_ok == true)
    {
      securite_ok = false;
    }
    else
    {
      securite_ok = true;
    }
  }
  digitalWrite(sortie_coupe_circuit, securite_ok);
}


void gestion_BP_clignotant_droit()
{
  lecture_BP_clignotant_droit = digitalRead(BP_clignotant_droit);

  if (lecture_BP_clignotant_droit == LOW ) //si le motard appuie sur le BP

  {
    delay(debounce);//le motard à 1 seconde pour relacher le BP
    if (lecture_BP_clignotant_droit == HIGH) //si le BP est bien relaché
  {
    if (demande_clignotant_droit == false)
      {
        demande_clignotant_droit = true;
        demande_clignotant_gauche = false;
      }
      else
      {
        demande_clignotant_droit = false;
      }
    }
  }
}

void gestion_clignotant_droit()
{
  if (demande_clignotant_droit == true)
  {
    digitalWrite(sortie_clignotant_droit, HIGH);
    delay (500);
    digitalWrite(sortie_clignotant_droit, LOW);
    delay (500);
  }
  if (demande_clignotant_droit == false)
  {
    digitalWrite(sortie_clignotant_droit, LOW);
  }
}


void gestion_BP_clignotant_gauche()
{
  lecture_BP_clignotant_gauche = digitalRead(BP_clignotant_gauche);
  if (lecture_BP_clignotant_gauche == LOW ) //si le motard appuie sur le BP
  {
    delay(debounce);//le motard à 1 seconde pour relacher le BP
    if (lecture_BP_clignotant_gauche == HIGH) //si le BP est bien relaché
  {
    if (demande_clignotant_gauche == false)
      {
        demande_clignotant_gauche = true;
        demande_clignotant_droit = false;
      }
      else
      {
        demande_clignotant_gauche = false;
      }
    }
  }
}

void gestion_clignotant_gauche()
{
  if (demande_clignotant_gauche == true)
  {
    digitalWrite(sortie_clignotant_gauche, HIGH);
    delay (500);
    digitalWrite(sortie_clignotant_gauche, LOW);
    delay (500);
  }
  if (demande_clignotant_gauche == false)
  {
    digitalWrite(sortie_clignotant_gauche, LOW);
  }
}

@dfgh, ça ne passe pas au niveau des cligno, je pense que ça provient des delay mais vu mon niveau, je suis loin d'en être sur ^^"

en revanche j'ai refais ça entre temps, pour éviter d'utiliser des delay en utilisant une seul fonction de clignotement (oui je devais passer par un montage clignotant mais le magasin d’électronique où je me fournis est fermé pour vacances :cry: )

j'ai aussi passé certain paramètres en constante pour éviter de trop attaquer la mémoire dynamique, même si avec 2Mo j'ai de la marge ^^

// voyant power on
const int PowerOn = 13; // led de mise en route du prog

// entrees
const int inPin1 = 2; // poussoir cligno droit
const int inPin2 = 3; // poussoir cligno gauche
const int inPin3 = 4; // poussoir demarreur
const int inPin4 = 5; // poussoir Warning

// sorties
const int outPin1 = A0; // cligno avant et arriere droit
const int outPin2 = A1; // cligno avant et arriere dgauche
const int outPin3 = A2; // relai de demarreur

// variables
int outClignoState = LOW;  // demarrer clignotement off
int state1 = LOW; //demarrer cligno droit sur off
int reading1;
int previous1 = HIGH;
int state2 = LOW; //demarrer cligno gauche sur off
int reading2;
int previous2 = HIGH;
int reading3;
int state4 = LOW; //demarrer warning sur off
int reading4;
int previous4 = HIGH;
// gestion appuie
long time = 0;
const long debounce = 200; // pour eviter un rebond sur l'appui
long previousMillis = 0;
const long interval = 500;  // intervalle de clignotement

void setup() //tout les poussoir en pullup pour passer par une masse commune
{
  pinMode(inPin1, INPUT_PULLUP);
  pinMode(outPin1, OUTPUT);
  pinMode(inPin2, INPUT_PULLUP);
  pinMode(outPin2, OUTPUT);
  pinMode(inPin3, INPUT_PULLUP);
  pinMode(outPin3, OUTPUT);
  pinMode(inPin4, INPUT_PULLUP);
  pinMode(PowerOn, OUTPUT);
}

void loop()
{

  //demarrage soft: allumage led 13
  digitalWrite(PowerOn, HIGH);

  //Pin1 / cligno droit: on/off par pression courte
  reading1 = digitalRead(inPin1);
  if (reading1 == LOW && previous1 == HIGH && millis() - time > debounce)
  {
    if (state1 == HIGH)
      {
      state1 = LOW;
      digitalWrite(outPin1, LOW);
      }
    else
    {
      state4 = LOW;
      state1 = HIGH;
      state2 = LOW;
      digitalWrite(outPin2, LOW);
    }
    time = millis();
  }
  clignotement (outPin1, state1);
  previous1 = reading1;

  //Pin2 / Cligno gauche: on/off par pression courte
  reading2 = digitalRead(inPin2);
  if (reading2 == LOW && previous2 == HIGH && millis() - time > debounce)
  {
    if (state2 == HIGH)
      {
      state2 = LOW;
      digitalWrite(outPin2, LOW);
      }
    else
    {
      state4 = LOW;
      state1 = LOW;
      digitalWrite(outPin1, LOW);
      state2 = HIGH;
    }
    time = millis();
  }
  clignotement (outPin2, state2);
  previous2 = reading2;

  //Pin3 / Demarreur: pression = impulsion vers le relai de demarrage (pas de mosfet, intensite trop haute)
  reading3 = digitalRead(inPin3);
  if (reading3 == LOW)
    digitalWrite(outPin3, HIGH);
  else
    digitalWrite(outPin3, LOW);

  //Pin4 / Warning: on/off par pression courte
  reading4 = digitalRead(inPin4);
  if (reading4 == LOW && previous4 == HIGH && millis() - time > debounce)
  {
    if (state4 == HIGH)
    {
      state4 = LOW;
      state1 = LOW;
      digitalWrite(outPin1, LOW);
      state2 = LOW;
      digitalWrite(outPin2, LOW);
     }
    else
    {
      state4 = HIGH;
      state1 = LOW;
      digitalWrite(outPin1, LOW);
      state2 = LOW;
      digitalWrite(outPin2, LOW);
    }
    time = millis();
  }
  clignotement (outPin1, state4);
  clignotement (outPin2, state4);
  previous4 = reading4;
}

int clignotement (int outCligno, int ClignoState)
{
  if (ClignoState == HIGH)
  {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis > interval)
    {
      previousMillis = currentMillis;
      if (outClignoState == LOW)
        outClignoState = HIGH;
      else
        outClignoState = LOW;
    }
    digitalWrite(outCligno, outClignoState);
  }
}

j'ai reglé le soucis en forçant les sorties en LOW:

voir code ci dessus

c'est bon alors ? les clignotants clignotent correctement et tu peux les éteindre et les allumer normalement ?

oui et non...
Lorsque je provoque le changement alors qu'ils sont en LOW dans la fonction "clignotement" ça passe nickel, si je le fait alors qu'ils sont en HIGH, ça devient n'importe quoi ^^"

exemple:

Warning clignote, j'appuie sur droite au moment ou les clignos sont allumé -> le droit se mets a clignoter mais le gauche reste fixe....

Je n'avais pas téléversé le bon programme >.<

en fait c'est tout bon ^^"

je me suis bien amusé, l'idée de base est venu de ce système:

http://motogadget.com/en/electrics/electronic-control-box-m-unit/m-unit/m-unit-digit-tastersteuerung-u-sicherung.html

finalement, l'arduino fait une partie de ce que le m-Unit fait, pour environ 250€ de moins ^^"
bon après il y a pas mal de chose en plus sur leur m-Unit, mais bon, j'ai du temps, je vais bien réussir à en faire un équivalent un jour ^^

mais en tout cas, ce petit arduino est vraiment addictif ^^

il te manque le feu stop (frein) et l'alarme.

arduino sait faire

pour le feux stop, c'est le même principe que le in 3, juste à dupliquer :slight_smile:
pour l'alarme, c'est vrai que ça pourrait être marrant, mais pour ça il faudrait que l'arduino soit en permanence allumer non ?
dans ce cas la quid de la batterie ?

si la moto roule tous les jours, je serai surpris que la batterie ne tienne pas.
et tu peux ajouter:
"si moto sur béquille" alors "autoriser la mise en veille du micro" pour limiter sa conso (c'est à réfléchir)

elle ne roule pas du tout à vrai dire ^^"
mais j'aurais plutôt vu une mise en marche de l'alarme par pression, en gros en veille dès qu'il n'y a plus de contact, réveil en cas de pression sur un bouton, coupure de l'alarme en cas de démarrage ou mise en veille après un temps donné

je parlais de mise en "marche de la fonction alarme" si moto sur béquille ( ou pression sur un BP)

et mise en veille ( j'aurais du dire sommeil ) du µ pour économiser la batterie.
le micro se réveille une fois par seconde par exemple. pour 2 ou 3 ms et se rendort si tout va bien.
ou se réveille sur un signal reçut par un "tilt" par exemple.