forum logo image
caferacer-forum.de - Das Forum für Petrolheads, Garagenschrauber, Ölfinger, Frickelracer und Alteisentreiber

Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Technische Fragen und Antworten, Tipps und Tricks für Profis und Bastler
Benutzeravatar
Emil1957
Beiträge: 1171
Registriert: 23. Mär 2016
Motorrad:: Honda CB 350K4 Bj. 1973, Jawonda-Gespann (Jawa mit CB450N-Motor und anderen Japan-Teilen), Honda CB250K im Laverda 750SFC Stil (im Aufbau)
Wohnort: Köln

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Beitrag von Emil1957 »

Da bald Ostern ist, wäre ich auch an einem Ei interessiert.
Grüße

Emil

Der Worte sind genug gewechselt,
Laßt mich auch endlich Taten sehn!
Indes ihr Komplimente drechselt,
Kann etwas Nützliches geschehn.

(Johann Wolfgang von Goethe: Faust: Eine Tragödie)

Dragon
Beiträge: 4
Registriert: 22. Jan 2020
Motorrad:: Kawasaki, ZX-7R, 1998

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Beitrag von Dragon »

Okay, dann biete mir doch gerne per PN zwei Stück an. Den dritten integriere ich ins Cockpit.
Fragen zum Schaltplan:
1. Die Dioden sind Standard 1N4001 ?
2. Die Blinker, wenn ich meinen Schaltplan richtig lese, dann kommt von der Armatur (Schalter Re/Li) +12V
Liege ich da falsch, oder hast du das geändert?
VG
Axel

Benutzeravatar
brummbaehr
Beiträge: 958
Registriert: 27. Sep 2016
Motorrad:: Honda CX 500/650
Wohnort: 41836 Hückelhoven
Kontaktdaten:

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Beitrag von brummbaehr »

1N400x oder auch 1N4148 sind OK
Die Armatur habe ich umgebaut auf Taster und es wird Masse geschaltet.

Benutzeravatar
brummbaehr
Beiträge: 958
Registriert: 27. Sep 2016
Motorrad:: Honda CX 500/650
Wohnort: 41836 Hückelhoven
Kontaktdaten:

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Beitrag von brummbaehr »

Auf meiner Tour letzte Woche habe ich noch einen Software-Fehler in dem Ei gefunden.
Wenn man das automatische Abschalten nicht abwartet und nach dem wieder losfahren den Blinker manuell durch Tastendruck abschaltet, dann passiert beim nächsten Tastendruck einfach nix. :oops: Da der Merker für die automatische Abschaltung noch gesetzt ist, wird beim Tastendruck der Blinker gleich wieder ausgeschaltet. Ein weiterer Tastendruck funktioniert dann wieder.
Der Fehler ist nun behoben.

Dann ist mir aber noch etwas anderes aufgefallen.
Wenn man kurz hintereinander erst Rechts und dann Links (oder anders herum) abbiegen muss, dann kann man nicht von Rechts-Blinken direkt auf Links-Blinken umschalten.
Der Tastendruck (Links) schaltet dann den Blinker Rechts Aus. Erst ein weiterer Tastendruck (Links) schaltet dann den Blinker Links Ein. Das ist irgendwie doof...
Ich habe nun die Software so angepasst, das mit dem Tastendruck (Links) direkt umgeschaltet wird auf Links-Blinken.
Das manuelle Ausschalten des Blinkers ist daher nur noch möglich wenn der passende Taster betätigt wird.

Wenn z.B. der rechte Blinker blinkt, dann kann der manuell nur noch mit erneuter Betätigung Rechts abgeschaltet werden.
Ein Tastendruck auf Links schaltet dann um auf Links Blinken.

Code: Alles auswählen

/*
Programmierung auf ATTiny85, Pins gemäß Anordnung

13.06.2022

P2   Eingang Blinker Rechts
P3   Eingang Blinker Links
P4   Eingang Neutral/Kupplung

P0   Ausgang Blinker Rechts
P1   Ausgang Blinker Links
*/

#include <Bounce2.h>

#define Switch 0 // 0 --> Tastersteuerung, 1 --> Schalter
#define BLINKPINRIGHT 0 // digitaler Ausgang rechter Blinker
#define BLINKPINLEFT 1 // digitaler Ausgang linker Blinker
#define BUTTONRIGHT 2 // digitaler Eingang rechter Taster
#define BUTTONLEFT  3 // digitaler Eingang linker Taster
#define NEUTRAL 4 // digitaler Eingang Neutral/Kupplung

#define WARNBLINKPRESSTIME 2000 // Zeitdauer Tastendruck um Warnblinken ein zu schalten
#define LONGKEYPRESSTIME 300 // Zeit ab der ein Tastendruck "lang" ist
#define BLINKCOUNT 4 // Anzahl der Blinkimpulse bei kurzem Tastendruck
#define BLINKDELAY 400 // Blinkintervall
#define NEUTRALCOUNT 5 // Anzahl der Blinkimpulse nach dem die Maschine wieder los fährt

Bounce Bleft = Bounce();
Bounce Bright = Bounce();
Bounce Bneutral = Bounce();


void setup()
{
// Eingänge
Bleft.attach(BUTTONLEFT, INPUT_PULLUP);
Bleft.interval(20);
Bright.attach(BUTTONRIGHT, INPUT_PULLUP);
Bright.interval(20);
Bneutral.attach(NEUTRAL, INPUT_PULLUP);
Bneutral.interval(100);

// Ausgänge
pinMode(BLINKPINLEFT, OUTPUT);
pinMode(BLINKPINRIGHT, OUTPUT);
}

void loop()
{
Blinker();
}

//***** Blinker *****
void Blinker()
{
static int blinkstate=0; // Blinkstatus in den untersten 2 Bits
static unsigned long startBlinkMillis=0; // Zeitpunkt beim Setzen des Blinkers
static byte shortButtonPress=false; // Wird true sobald ein kurzer Tastendruck erkannt wurde
static byte longBeamPress=false; // Wird true sobald ein langer Tastendruck erkannt wurde
static boolean blinkPhase=false;
static boolean currentOn=false;
static unsigned long startNeutralMillis;
static boolean Neutral = false;


Bleft.update();
Bright.update();
Bneutral.update();

if (!Switch)  // ********* Tastersteuerung ***********
{
  //********* Blinker links *************  
  if (Bleft.fell())        //Blinker links wurde soeben gedrückt
  {
    startBlinkMillis=millis();
    if (blinkstate==0b00 || blinkstate==0b01) // Wenn Blinkstatus "AUS" (13.06.22) oder "Rechts"
    blinkstate=0b10; // Blinker Links setzen
    else
    blinkstate=0b00; // Blinker ausschalten
    
    shortButtonPress = false; // Flag für kurzen Tastendruck löschen
    Neutral = false; // 13.06.22 Flag für automatisches Ausschalten löschen
  }
  
  //********** Blinker rechts ***********
  if (Bright.fell())      //Blinker rechts wurde soeben gedrückt
  {
    startBlinkMillis=millis();
    if (blinkstate==0b00 || blinkstate==0b10) // Wenn Blinkstatus "AUS" (13.06.22) oder "Links"
    blinkstate=0b01; // Blinker Rechts setzen
    else
    blinkstate=0b00; // Blinker ausschalten
    
    shortButtonPress = false; // Flag für kurzen Tastendruck löschen
    Neutral = false; // 13.06.22 Flag für automatisches Ausschalten löschen
  }
  // Sonderfall Warnblinker wenn Links/Rechts länger als WARNBLINKPRESSTIME gedrückt
  if (!Bleft.read() || !Bright.read()) // && Bneutral.read())
  if ((millis()- startBlinkMillis) > WARNBLINKPRESSTIME)
  blinkstate=0b11;
  
  // Sonderfall kurzer Tastendruck beim Links- oder Rechtsblinken
  if (((Bright.read() && millis()-startBlinkMillis<LONGKEYPRESSTIME && blinkstate==0b01) || (Bleft.read() && millis()-startBlinkMillis<LONGKEYPRESSTIME && blinkstate==0b10)) && Bneutral.read())
  shortButtonPress=true;
  
  // Prüfen, ob nach Einschalten mit kurzem Buttondruck die Blinkdauer abgelaufen ist
  if (shortButtonPress && (millis()-startBlinkMillis)>=(BLINKCOUNT*2-1)*BLINKDELAY && (blinkstate==0b01 || blinkstate==0b10))
  blinkstate=0b00; // falls ja, Blinken hier automatisch beenden

  // Keinen Leerlauf mehr, und Kupplung losgelassen, jetzt nur noch kurz weiter Blinken
  if (Bneutral.rose() && blinkstate){
    startNeutralMillis=millis();
    Neutral = true;
  }
  if (Neutral && (millis()-startNeutralMillis)>=(NEUTRALCOUNT*2-1)*BLINKDELAY && (blinkstate==0b01 || blinkstate==0b10)){
    blinkstate=0b00; // falls ja, Blinken hier automatisch beenden
    Neutral = false;
  }
  if (Bneutral.fell() && blinkstate){ // Wird die Kupplung wieder gezogen, dann Blinken nicht ausschalten
    Neutral = false;
    shortButtonPress=false;
  }
   
}

else   // ********* Schaltersteuerung *********
{    
  if (!blinkstate)
    startBlinkMillis=millis();
    
  //********* Blinker links *************  
  if (!Bleft.read())   // Blinker links
  blinkstate |= 0b10;  // Blinker Links setzen
  else
  blinkstate &= 0b01;  // Blinker Links ausschalten
  
  
  //********** Blinker rechts ***********
  if (!Bright.read())  // Blinker rechts
  blinkstate |= 0b01;  // Blinker Rechts setzen
  else
  blinkstate &= 0b10;  // Blinker Rechts ausschalten
}

if (((millis()-startBlinkMillis)/BLINKDELAY)%2==0)
blinkPhase=true;
else
blinkPhase=false;

// Soll der linke Blinker gerade an sein?
currentOn=bitRead(blinkstate,1) && blinkPhase;
if (digitalRead(BLINKPINLEFT)!=currentOn)
digitalWrite(BLINKPINLEFT,currentOn);

// Soll der rechte Blinker gerade an sein?
currentOn=bitRead(blinkstate,0) && blinkPhase;
if (digitalRead(BLINKPINRIGHT)!=currentOn)
digitalWrite(BLINKPINRIGHT,currentOn);
}

Dragon
Beiträge: 4
Registriert: 22. Jan 2020
Motorrad:: Kawasaki, ZX-7R, 1998

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Beitrag von Dragon »

Danke für die Info. Ich habe das Ei bis jetzt noch nicht eingebaut. Habe mir eine zweite Armatur besorgt, damit ich das in Ruhe machen kann.
VG
Axel

Antworten

Zurück zu „Elektrik/Beleuchtung“

Sloping Wheels