Centrale électronique avec un arduino

Faut toujours être au courant ...

Modérateurs : Modo-Mecano's, The staff

Répondre
chicken
CXMen OR
CXMen OR
Messages : 82
Enregistré le : mer. 30 janv. 2013 21:11
Localisation : Armentières

Centrale électronique avec un arduino

Message par chicken »

Bonjour tout le monde , j ai eu enfin un petit moment pour bricoler sur un petit projet que j avais en tête .
Une centrale électronique pour simplifier le faisceau électrique d'un véhicule .
Elle est composé d'une copie de carte programmable arduino et d'une carte relai ( mon prochain projet est de les remplacer par des transistors type mosfet qui sont silencieux et moins encombrant ).
J ai repris un programme arduino sur un forum américain , j y ai juste rajouté un bouton avec plusieurs clique.
Cette arduino est indéfiniment paramétrable , on peut par exemple rajouter une ligne de code en utilisant l'interrupteur situé sur le levier d'embrayage pour désactivé le relai du démarreur si ce dernier n'est pas appuyé , ou bien rajouté une carte auxiliaire pour démarrer sa moto avec un badge .
Les fonctions boutons poussoirs sont aussi programmable ( plusieurs appui pour plusieurs fonction , fonction appuyé ou verrouillé ...).
Si vous avez des améliorations n hésitez pas.
J ai recablè le commodo gauche avec un cable ethernet en mettant une masse commune à chaque bouton .
Bien évidement il y a un relai prévu pour les freins que je n'ai pas filmé car il me manqué un bouton poussoir.



Modifié en dernier par chicken le lun. 13 juin 2016 04:56, modifié 1 fois.
Avatar du membre
thierry mecano
Thierry Mecano CX500
Thierry Mecano CX500
Messages : 4287
Enregistré le : dim. 01 oct. 2006 20:54
Localisation : saint remy sur avre 28380

Message par thierry mecano »

En bref j'ai pas compris l'avantage du système par rapport à l'origine mais j'ai été élevé à l'époque des 4 CV et 125 Motobec 4 temps alors....................... :lol:

L'électronique sur un cx, c'est le CDI pratiquement inusable donc ajouter des cartes, des relais, c'est certainement avoir des risques de pannes en plus ou alors il faut refaire entièrement le faisceau électrique.
500 Cx Rickman , 650 SilverWing qui sera remis en état au printemps!!
chicken
CXMen OR
CXMen OR
Messages : 82
Enregistré le : mer. 30 janv. 2013 21:11
Localisation : Armentières

Message par chicken »

je suis d'accord avec toi , si le faisceau d'une moto est en bon état il ne faut pas y toucher .( c est une règle en mécanique = si ça fonctionne ne pas y toucher)
Cette centrale simplifie le faisceau , un fils ethernet pour toutes les commandes , et 6 fils d alimentation + une masse et tout est centralisé sur la boîte relais.
J ai eu ce projet car mon cx était dépourvu de faisceau.
chicken
CXMen OR
CXMen OR
Messages : 82
Enregistré le : mer. 30 janv. 2013 21:11
Localisation : Armentières

Message par chicken »

voici un petit schéma du montage
Vous pouvez bien sur enlever le relai du warning dans le code et vous servir du relais pour l'alimentation de votre boitier ignitech.
Image



je vous mets le code.

[spoil]



//INCLUDE LIBRARIES:-------------------------------------------------------------
#include "ClickButton.h"




// the LED
const int ledPin = 5;
int ledState = 0;

// the Button
const int buttonPin1 = A6;
ClickButton button1(buttonPin1, HIGH, CLICKBTN_PULLUP);

// Arbitrary LED function
int LEDfunction = 0;













// DEFINE INITIAL FUNCTION STATES: ----------------------------------------------
boolean runlightsActive = true;
boolean britesActive = false;
boolean brakeActive = false;
boolean leftTurnActive = false;
boolean rightTurnActive = false;
boolean hornActive = false;
boolean startActive = false;
boolean suspendRunlights = false;
boolean parkActive = false;
boolean hazzardActive = false;



// DEFINE INPUT PINS: -----------------------------------------------------------//
#define frontCtrlPin
#define britesCtrlPin A7
#define brakeCtrlPin A4
#define leftCtrlPin A2
#define rightCtrlPin A4
#define hornCtrlPin A0
#define startCtrlPin A5


// DEFINE CLICKBUTTONS


ClickButton britesButton (britesCtrlPin, LOW, CLICKBTN_PULLUP);
ClickButton brakeButton (brakeCtrlPin, LOW, CLICKBTN_PULLUP);
ClickButton leftButton (leftCtrlPin, LOW, CLICKBTN_PULLUP);
ClickButton rightButton (rightCtrlPin, LOW, CLICKBTN_PULLUP);
ClickButton hornButton (hornCtrlPin, LOW, CLICKBTN_PULLUP);
ClickButton startButton (startCtrlPin, LOW, CLICKBTN_PULLUP);


// DEFINE RELAY PINS: -----------------------------------------------------------


#define runlightsPin 12
#define britesPin 11
#define brakePin 10
#define leftTurnPin 9
#define rightTurnPin 8
#define hornPin 6
#define startPin 7



// DEFINE INITIAL RELAY STATES FOR TIMED FUNCTIONS: -----------------------------
int leftLight = HIGH;
int rightLight = HIGH;


// DEFINE INITIAL MS COUNT FOR FUNCTIONS: ---------------------------------------
// will store last time LED was updated OR switch debonce
unsigned long leftTurnMs = 0;
unsigned long rightTurnMs = 0;
unsigned long hazzardMs = 0;


unsigned long britesCtrlMs = 0;
unsigned long brakeCtrlMS = 0;
unsigned long leftCtrlMS = 0;
unsigned long rightCtrlMS = 0;
unsigned long hornCtrlMS = 0;
unsigned long startCtrlMS = 0;








// DEFINE CONSTANT INTERVALS:----------------------------------------------------
#define turnInterval 500
#define hazzardInterval 200






// SETUP ///////////////////////////////////////////////////////////////////////


void setup() {



pinMode(ledPin,OUTPUT);

// Setup button timers (all in milliseconds / ms)
// (These are default if not set, but changeable for convenience)
button1.debounceTime = 20; // Debounce timer in ms
button1.multiclickTime = 250; // Time limit for multi clicks
button1.longClickTime = 1000; // time until "held-down clicks" register










// SET INITIAL RELAY STATES TO AVOID MISFIRES AT STARTUP:------------------------
digitalWrite (runlightsPin,LOW);
digitalWrite (britesPin,HIGH);
digitalWrite (brakePin,HIGH);
digitalWrite (rightTurnPin, rightLight);
digitalWrite (leftTurnPin, leftLight);
digitalWrite (hornPin,HIGH);
digitalWrite (startPin, HIGH);
//digitalWrite (killPin, HIGH);
//digitalWrite (headlightPin,HIGH);

/* / ACTIVATE INPUT BUTTION PULLUPS:-----------------------------------------------
digitalWrite (britesCtrlPin, HIGH);
digitalWrite (brakeCtrlPin, HIGH);
digitalWrite (leftCtrlPin, HIGH);
digitalWrite (rightCtrlPin, HIGH);
digitalWrite (hornCtrlPin, HIGH);
digitalWrite (startCtrlPin, HIGH); */

/* // DEFINE INPUT PINS:------------------------------------------------------------
//pinMode(frontCtrlPin,INPUT);
pinMode(britesCtrlPin,INPUT_PULLUP);
pinMode(brakeCtrlPin,INPUT_PULLUP);
pinMode(leftCtrlPin,INPUT_PULLUP);
pinMode(rightCtrlPin,INPUT_PULLUP);
pinMode(hornCtrlPin,INPUT_PULLUP);
pinMode(startCtrlPin,INPUT_PULLUP); */





// Setup button timers (all in milliseconds / ms)
// (These are default if not set, but changeable for convenience)
//button1.debounceTime = 20; // Debounce timer in ms
brakeButton.multiclickTime = 1000; // Time limit for multi clicks
startButton.longClickTime = 1500; // time until "held-down clicks" register

// DEFINE OUTPUT PINS:-----------------------------------------------------------
pinMode(runlightsPin, OUTPUT);
pinMode(britesPin, OUTPUT);
pinMode(brakePin, OUTPUT);
pinMode(leftTurnPin, OUTPUT);
pinMode(rightTurnPin, OUTPUT);
pinMode(hornPin, OUTPUT);
pinMode(startPin, OUTPUT);
//pinMode(killPin, OUTPUT);
//pinMode(headlightPin, OUTPUT);
}




// MAIN LOOP ////////////////////////////////////////////////////////////////////
void loop()





{









// Update button state
button1.Update();

// Save click codes in LEDfunction, as click codes are reset at next Update()
if (button1.clicks != 0) LEDfunction = button1.clicks;


// Simply toggle LED on single clicks
// (Cant use LEDfunction like the others here,
// as it would toggle on and off all the time)
if(button1.clicks == 1) ledState = !ledState;

// blink faster if double clicked
if(LEDfunction == 2) ledState = (millis()/500)%2;

// blink even faster if triple clicked
if(LEDfunction == 3) ledState = (millis()/200)%2;

// slow blink (must hold down button. 1 second long blinks)
if(LEDfunction == -1) ledState = (millis()/1000)%2;

// slower blink (must hold down button. 2 second loong blinks)
if(LEDfunction == -2) ledState = (millis()/2000)%2;

// even slower blink (must hold down button. 3 second looong blinks)
if(LEDfunction == -3) ledState = (millis()/3000)%2;


// update the LED
digitalWrite(ledPin,ledState);

// CHECK CONDITIONS FOR EACH FUNCTION STATE AND CALL APPROPRIATE FUNCTION ////////////////////////


readInputSwitches();


if (runlightsActive == true && suspendRunlights == false ){ runlightsOn();}
else{runlightsOff();}

if (britesActive == true){britesOn();}
else{britesOff();}

if (brakeActive == true){brakeLightsOn();}
else{brakeLightsOff();}

if (hornActive == true){hornOn();}
else{hornOff();}


if (startActive == true){
starterOn();
suspendRunlights = true;
}
else{
starterOff();
suspendRunlights = false;
}

if (leftTurnActive == true){
leftTurnOn();
rightTurnActive = false;
parkActive = false;
hazzardActive = false;
}
else if (rightTurnActive == true){
rightTurnOn();
leftTurnActive = false;
parkActive = false;
hazzardActive = false;
}
else if (hazzardActive == true){
hazzardFlashers();
leftTurnActive = false;
rightTurnActive = false;
parkActive = false;
}
else if (parkActive == true){
parkingLightsOn();
leftTurnActive = false;
rightTurnActive = false;
hazzardActive = false;
}
else {blinkersOff();}



// TEST SEQUENCE TO CHECK FUNCTIONS WITHOUT BUTTONS


//leftTurnActive = true;


//rightTurnActive = true;


//hazzardActive = true;


//parkActive = true;


//brakeActive = true;


//headlightOn();


//britesActive = true;


//runlightsOff();


//hornActive = true;


//startActive = true;


}






//FUNCTIONS///////////////////////////////////////////////////////////////////




// READ INPUT SWITCHES


void readInputSwitches(){

//WITH CLICKBUTTON


britesButton.Update();
if (britesButton.depressed == true){britesActive = true;}
else britesActive = false;


leftButton.Update();


if (leftButton.depressed == true){leftTurnActive = true;}
else leftTurnActive = false;


rightButton.Update();
if (rightButton.depressed == true){rightTurnActive = true;}
else rightTurnActive = false;


brakeButton.Update();
if (brakeButton.depressed == true){brakeActive = true;}
else brakeActive = false;


hornButton.Update();
if (hornButton.depressed == true){hornActive = true;}
else hornActive = false;


startButton.Update();
if (startButton.depressed == true){startActive = true;}
else startActive = false;

/* WITHOUT CLICKBUTTON
if (digitalRead (britesCtrlPin) == LOW){britesActive = true;}
else britesActive = false;


if (digitalRead (leftCtrlPin) == LOW){leftTurnActive = true;}
else leftTurnActive = false;


if (digitalRead (rightCtrlPin) == LOW){rightTurnActive = true;}
else rightTurnActive = false;


if (digitalRead (brakeCtrlPin) == LOW){brakeActive = true;}
else brakeActive = false;


if (digitalRead (hornCtrlPin) == LOW){hornActive = true;}
else hornActive = false;


if (digitalRead (startCtrlPin) == LOW){startActive = true;}
else startActive = false; */


}


// RUNNING LIGHTS: --------------------------------------------------------------


void runlightsOn(){
digitalWrite(runlightsPin, LOW);
}


void runlightsOff(){
digitalWrite(runlightsPin, HIGH);
}




// HIGHBEAM: -------------------------------------------------------------------


void britesOn(){
digitalWrite(britesPin, LOW);
}


void britesOff(){
digitalWrite(britesPin, HIGH);
}




// BRAKE LIGHTS: ---------------------------------------------------------------


void brakeLightsOn(){
digitalWrite(brakePin, LOW);
}


void brakeLightsOff(){
digitalWrite(brakePin, HIGH);
}




// LEFT TURN SIGNAL: ---------------------------------------------------------


void leftTurnOn(){
unsigned long currentMs = millis();
if(currentMs - leftTurnMs >= turnInterval) {
// save the last time you blinked the LED
leftTurnMs = currentMs;


// if the LED is off turn it on and vice-versa:
if (leftLight == HIGH)
leftLight = LOW;
else
leftLight = HIGH;


// set the LED with the ledState of the variable:
digitalWrite(leftTurnPin, leftLight);
digitalWrite(rightTurnPin, HIGH);
}
}




// RIGHT TURN SIGNAL: ---------------------------------------------------------


void rightTurnOn(){
unsigned long currentMs = millis();
if(currentMs - rightTurnMs >= turnInterval) {
// save the last time you blinked the LED
rightTurnMs = currentMs;


// if the LED is off turn it on and vice-versa:
if (rightLight == HIGH)
rightLight = LOW;
else
rightLight = HIGH;


// set the LED with the ledState of the variable:
digitalWrite(rightTurnPin, rightLight);
digitalWrite(leftTurnPin, HIGH);
}
}




// HAZZARD FLASHERS: -----------------------------------------------------------


void hazzardFlashers(){
unsigned long currentMs = millis();
if(currentMs - hazzardMs >= hazzardInterval) {
// save the last time you blinked the LED
hazzardMs = currentMs;


// if the LED is off turn it on and vice-versa:
if (rightLight == HIGH)
rightLight = LOW;
else
rightLight = HIGH;


if (leftLight == HIGH)
leftLight = LOW;
else
leftLight = HIGH;


// set the LED with the ledState of the variable:
digitalWrite(rightTurnPin, rightLight);
digitalWrite(leftTurnPin, leftLight);
}
}




// PARKING LIGHTS: -------------------------------------------------------------


void parkingLightsOn(){
digitalWrite(rightTurnPin, LOW);
digitalWrite(leftTurnPin, LOW);
}




// BLINKERS OFF: ---------------------------------------------------------------


void blinkersOff(){
digitalWrite(rightTurnPin, HIGH);
digitalWrite(leftTurnPin, HIGH);
}




// HORN: ------------------------------------------------------------------------


void hornOn(){
digitalWrite(hornPin, LOW);
}


void hornOff(){
digitalWrite(hornPin, HIGH);
}




// STARTER: ---------------------------------------------------------------------


void starterOn(){
digitalWrite(startPin, LOW);
}


void starterOff(){
digitalWrite(startPin, HIGH);
}




/* / KILLSWITCH: ------------------------------------------------------------------


void killOn(){
digitalWrite(killPin, LOW);
}


void killOff(){
digitalWrite(killPin, HIGH);
}
*/




/* / HEADLIGHT: ------------------------------------------------------------------


void headlightOn(){
digitalWrite(headlightPin, LOW);
}


void headlightOff(){
digitalWrite(headlightPin, HIGH);
}
*/



[/spoil]
Avatar du membre
Sha_do
CXMen forumeur
CXMen forumeur
Messages : 19
Enregistré le : mar. 19 mai 2015 13:09
Localisation : Longjumeau 91

Message par Sha_do »

Salut Chicken!

Un magnifique projet que tu as là!
J'ai exactement le même, j'ai tout à la maison pour le faire, faut que je m'y colle...
Avec en prime une carte RFID pour le démarrage sans clé :)

Au passage, je suis dans le 91, donc si tu as besoin de quoi que se soit, n'hésite pas!
Avatar du membre
pollcast
CXMen Master
CXMen Master
Messages : 822
Enregistré le : mer. 09 mai 2012 19:20
Localisation : auvergne

Message par pollcast »

salut.
tu penses faire comment pour installer les mosfet ?
tu fais imprimer un circuit ?
je te demande çà , car j'ai commandé un kit arduino , pour m'entrainer à faire un petit montage et de la programmation.
mais les relais comme les tiens sont un peu 'encombrants' , donc dans l'avenir je compterai faire comme toi avec mosfet .
A+
SPTOQ
CXMen Master
CXMen Master
Messages : 305
Enregistré le : lun. 02 janv. 2012 22:23
Localisation : Aude

Message par SPTOQ »

Bonsoir

Je ne voie pas en quoi cela simplifie le faisceau.
Si je ne me trompe pas, il y a autant de fils que de boutons . Sauf erreur, le seul gain que je voie est sur la section des fils puisqu'ils ne font plus transiter la puissance des éléments à activer. Pour les sorties, idem, autant de fils que d'éléments à commander + le commun.
Si ensuite je rajoute les différents fils d'interconnexion entre les cartes et le pavé du programme.... je ne voie pas où est la simplification.
Après, si c'est pour ce faire plaisir en programmation et automatisme 8)

J'ai un petit bémol aussi sur le langage C mais cela reste personnel. Pour ce type d'application ça le fera, sur quelque chose de plus compliqué il y a des risques de latence.
Pourquoi ne pas utiliser un nano automate industriel, ça existe en 12V, la programmation reste simple et le logiciel parfois gratuit, c'est compacte, extensible, entrees / sorties analogiques possibles..... ????
chicken
CXMen OR
CXMen OR
Messages : 82
Enregistré le : mer. 30 janv. 2013 21:11
Localisation : Armentières

Message par chicken »

Salut

Il y a moins de fils car les boutons ont une masse commune donc pour 6 boutons = 7 fils avec une petite section de fils . ( on peut diminuer le nombres de boutons en attribuant plusieurs fonctions pour un bouton )
Pour la partie puissance ,il y aura une masse commune aussi .( avec la carte relai )
Pour les fils interconnections entre la carte et le relai , je pense intégrer la carte arduino + carte mosfet dans un même circuit.
J ai utilisé une carte compatible arduino pour son faible coût .
Beting
CXMen Master
CXMen Master
Messages : 153
Enregistré le : dim. 16 nov. 2014 14:14
Localisation : Charente maritime

Message par Beting »

cool moi toute ma maison est gérée par un raspberry, manque plus que la moto.

Pour te donner des idées

https://buzzcasoni.blogspot.fr/
Avatar du membre
thierry mecano
Thierry Mecano CX500
Thierry Mecano CX500
Messages : 4287
Enregistré le : dim. 01 oct. 2006 20:54
Localisation : saint remy sur avre 28380

Message par thierry mecano »

En regardant tout cela, c'est super intéressant pour le coté technique de la chose mais ou caser tout le bazar en plus par rapport au faisceau d'origine ?

Pour moi la moto doit rester simple à tous niveau, c'est le plus fiable et facile à entretenir.

Mais pourquoi pas tout gérer depuis son portable, c'est cela le progrès 8)
500 Cx Rickman , 650 SilverWing qui sera remis en état au printemps!!
chicken
CXMen OR
CXMen OR
Messages : 82
Enregistré le : mer. 30 janv. 2013 21:11
Localisation : Armentières

Message par chicken »

Pour les mosfet il y deux solutions .
Celle utilisant un mosfet type n

Image

Il y a qu un seul transistor et une résistance . Le petit soucis est qu il est impossible d avoir une masse commune.
Car les éléments sont contrôlés par le pôle négatif .



Celle utilisant un mosfet type p
Image

Il y a plus de composants mais le montage est simplifié car la masse est commune .

Un plaque d essai me semble pas mal

Image
chicken
CXMen OR
CXMen OR
Messages : 82
Enregistré le : mer. 30 janv. 2013 21:11
Localisation : Armentières

Message par chicken »

ce boîtier sert à remplacer tout le faisceau d'origine .
Il faut tout recabler. ( comme le boîtier de motogadget .)
Avec l arduino vous pouvez via le Bluetooth utiliser votre portable pour remplacer vos commodos .



Modifié en dernier par chicken le sam. 18 juin 2016 08:54, modifié 1 fois.
chicken
CXMen OR
CXMen OR
Messages : 82
Enregistré le : mer. 30 janv. 2013 21:11
Localisation : Armentières

Message par chicken »

Pour simplifier encore plus le faisceau , on peut aussi multiplexer le signal des boutons poussoirs . Il n y aurais plus que deux fils .Un peu comme chez motogadget
Explication
Je ne sais pas si cela marchera au top car j ai peur des interférences .
Dino38
CXMen forumeur
CXMen forumeur
Messages : 53
Enregistré le : sam. 13 avr. 2019 12:00
Localisation : 38150 salaise sur sanne

Re: Centrale électronique avec un arduino

Message par Dino38 »

Bonjour,
Je suis nouveau sur le forum. J'ai aqcueri il y a peut de temps une Honda cx 500 de 1980 et en cherchant un peu sur internet des idées de transformations,je suis tombé sur votre forum qui est super. On y trouve plein d'infos et d'avis intéressants dont ce sujet qui m'intéresse beaucoup étant donné que je suis passionné d'électronique. Je trouve que c'est une excellente idée d installer un arduino ainsi que le multiplexage pour simplifier le faisceau. Je ne sais pas encore si je vais le faire sur la cx, mais c'est sur que je vais essayer sur un projet de sustom
Répondre