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

Tastersteuerung Anfrage

Technische Fragen und Antworten, Tipps und Tricks für Profis und Bastler
Benutzeravatar
brummbaehr
Beiträge: 958
Registriert: 27. Sep 2016
Motorrad:: Honda CX 500/650
Wohnort: 41836 Hückelhoven
Kontaktdaten:

Re: Tastersteuerung Anfrage

Beitrag von brummbaehr »

Schön das es soweit funktioniert.
Dreh die Spannung mal höher auf 14-15V irgendwann sollte das Licht dann einschalten.
Anpassen kann man das ja unter.

Code: Alles auswählen

#define BATTERYVOLTAGE 13.0 // Mindestspannung der Batterie zum Abblendlicht einschalten
Da die Messung erst nach der Verpolungsschutzdiode ist, fehlen da vermutlich ~0,6V.


Das mit der Lichthupe sollte so nicht sein. Bei meinen Tests mit LED's ist mir das nicht aufgefallen.
Soweit ich das auf die schnelle erkenne, passt die Reihenfolge im Sketch nicht.
Hier mal ein geänderter Sketch. Wobei ich das nicht getestet habe!

Code: Alles auswählen

/*
 * Sketch zu HW-Version 6 2019.12.18
Programmierung auf Arduino Nano, Pins gemäß Anordnung

Vin  Betriebsspannung Arduino (12V vom Zündschloss)
D2   Eingang Blinker Links
D3   Eingang Blinker Rechts
D4   Eingang Fernlicht
D5   Eingang Hupe
D6   Eingang Starten
D7   Eingang Seitenständer
D8   Eingang Bremslichtschalter
D9   Eingang Killschalter
D10  Ausgang Blinker Links
D11  Ausgang Zündung
D12
D13
A0   Ausgang Bremslicht
A1   Ausgang Blinker Rechts
A2   Ausgang Hupe
A3   Ausgang Fernlicht
A4   Ausgang Anlasser
A5   Ausgang Abblendlicht
A6   Analog-Eingang Vin
A7

Wenn Killschalter betätigt mindestens KILLTIME (3s) ausschalten
Fernlicht (Lichthupe) für die Zeit SHORTBEAMTIME (0,4s) einschalten
Abblendlicht einschalten wenn Batteriespannung > BATTERYVOLTAGE oder Fernlichttaster gedrückt
Abblendlicht ausschalten wenn Fernlichttaster > LIGHTOFFPRESSTIME (2s) betätigt
*/
#include <Bounce2.h>

#define BUTTONLEFT  2 // digitaler Eingang linker Taster
#define BUTTONRIGHT 3 // digitaler Eingang rechter Taster
#define BUTTONLIGHT 4 // digitaler Eingang Fernlichttaster
#define BUTTONWARN 5 // digitaler Eingang Hupentaster
#define BUTTONSTART 6 // digitaler Eingang Motor an
#define BUTTONSIDESTAND 7 // digitaler Eingang Seitenständer/Neutral
#define BUTTONBRAKE 8 // digitaler Eingang Bremse
#define BUTTONKILL 9 // digitaler Eingang Killschalter
#define BATTERY A6 // analoger Eingang Batterie

#define BLINKPINRIGHT A1 // digitaler Ausgang rechter Blinker
#define BLINKPINLEFT 10 // digitaler Ausgang linker Blinker
#define LIGHTPIN A3 // digitaler Ausgang Fernlicht
#define WARNPIN A2 // digitaler Ausgang Hupe
#define STARTPIN A4 // digitaler Ausgang Anlasser
#define ABLIGHTPIN A5 // digitaler Ausgang Abblendlicht
#define BRAKELIGHTPIN A0 // digitaler Ausgang Bremslicht
#define IGNITIONPIN 11 // digitaler Ausgang Zündung

#define LONGKEYPRESSTIME 250 // Zeit ab der ein Tastendruck "lang" ist
#define BLINKDELAY 700 // Blinkintervall
#define BLINKCOUNT 3 // Anzahl der Blinkimpulse bei kurzem Tastendruck
#define SHORTBEAMTIME 500 // Zeitdauer der Lichthupe in ms
#define KILLTIME 3000 // Mindest Zeitdauer Zündung ausschalten bei Killschalterbetätigung in ms
#define BATTERYVOLTAGE 13.0 // Mindestspannung der Batterie zum Abblandlicht einschalten
#define LIGHTOFFPRESSTIME 2000 // Zeitdauer Tastendruck um Licht aus zu schalten

#define Switch 0 // 0 --> Tastersteuerung, 1 --> Schalter


Bounce Bleft = Bounce();
Bounce Bright = Bounce();
Bounce Blight = Bounce();
Bounce Bwarn = Bounce();
Bounce Bstart = Bounce();
Bounce Bbrake = Bounce();
Bounce Bsidestand = Bounce();
Bounce Bkill = Bounce();

byte Fernlicht=false;
byte Starter=false;
byte Lichtan=false;
byte Lichtaus=false;
float Voltage=0;



void setup()
{
//Serial.begin(9600); 

// Eingänge
Bleft.attach(BUTTONLEFT, INPUT_PULLUP);
Bleft.interval(20);
Bright.attach(BUTTONRIGHT, INPUT_PULLUP);
Bright.interval(20);
Blight.attach(BUTTONLIGHT, INPUT_PULLUP);
Blight.interval(20);
Bwarn.attach(BUTTONWARN, INPUT_PULLUP);
Bwarn.interval(100);
Bstart.attach(BUTTONSTART, INPUT_PULLUP);
Bstart.interval(100);
Bsidestand.attach(BUTTONSIDESTAND, INPUT_PULLUP);
Bsidestand.interval(100);
Bbrake.attach(BUTTONBRAKE, INPUT_PULLUP);
Bbrake.interval(10);
Bkill.attach(BUTTONKILL, INPUT_PULLUP);
Bkill.interval(100);
pinMode(BATTERY, INPUT); //Analoger Eingang

// Ausgänge
pinMode(BLINKPINLEFT, OUTPUT);
pinMode(BLINKPINRIGHT, OUTPUT);
pinMode(LIGHTPIN, OUTPUT);
pinMode(WARNPIN, OUTPUT);
pinMode(STARTPIN, OUTPUT);
pinMode(BRAKELIGHTPIN, OUTPUT);
pinMode(ABLIGHTPIN, OUTPUT);
pinMode(IGNITIONPIN, OUTPUT);
}

void loop()
{
Zuendung();
Blinker();
readbattery();
Licht();
Starten();
//Serial.println(blinkstate);

//********** Hupe ***********
Bwarn.update();
digitalWrite(WARNPIN,!Bwarn.read());  //Hupentaster wird betätigt

// **** Bremslicht einschalten ****
Bbrake.update();
digitalWrite(BRAKELIGHTPIN,!Bbrake.read());
}

//***** Batteriespannung *****
void readbattery()
{
  int sensorValue = analogRead(BATTERY);
  float voltage = sensorValue * (5.0 / 120.0);
  if (voltage > BATTERYVOLTAGE && !Lichtaus)
  Lichtan = true; // Abblendlicht einschalten wenn Batterie über 13V --> Motor läuft
  //Serial.println(voltage);
}

//***** 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;

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

if (!Switch)  // ********* Tastersteuerung ***********
{
  //********* Blinker links *************  
  if (Bleft.fell())        //Blinker links wurde soeben gedrückt
  {
    startBlinkMillis=millis();
    if (blinkstate==0b00) // Wenn Blinkstatus "AUS"
    blinkstate=0b10; // Blinker Links setzen
    else
    blinkstate=0b00; // Blinker ausschalten
    shortButtonPress=false; // Flag für kurzen Tastendruck löschen
  }
  
  //********** Blinker rechts ***********
  if (Bright.fell())      //Blinker rechts wurde soeben gedrückt
  {
    startBlinkMillis=millis();
    if (blinkstate==0b00) // Wenn Blinkstatus "AUS"
    blinkstate=0b01; // Blinker Rechts setzen
    else
    blinkstate=0b00; // Blinker ausschalten
    shortButtonPress=false; // Flag für kurzen Tastendruck löschen
  }
  // Sonderfall Warnblinker wenn Links/Rechts zeitgleich gedrückt
  if (!Bleft.read() && !Bright.read())
  if ((millis()- startBlinkMillis) > LIGHTOFFPRESSTIME/2)
  blinkstate=0b11;
  
  // Sonderfall kurzer Tastendruck beim Links- oder Rechtsblinken
  if ((Bright.read() && millis()-startBlinkMillis<LONGKEYPRESSTIME && blinkstate==0b01) || (Bleft.read() && millis()-startBlinkMillis<LONGKEYPRESSTIME && blinkstate==0b10))
  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
}

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

//***** Licht *****
void Licht()
{
 Blight.update();
static byte shortBeamPress=false; // Wird true sobald ein kurzer Tastendruck erkannt wurde
static unsigned long startBeamMillis=0; // Zeitpunkt beim Tasten des Fernlichts

if (!Switch)  // ********* Tastersteuerung ***********
{

  //********** Fernlicht ***********
  if (Blight.fell())        //Fernlichttaster wurde soeben gedrückt
    {
      if (Fernlicht)            //Wenn Fernlichtflag aktiv, wieder ausschalten
      Fernlicht=false;
      else
        {
        Fernlicht=!Lichtaus;      //Wenn Fernlichtflag nicht aktiv, dann Fernlicht einschalten wenn Licht nicht ausgeschaltet ist
        }
      startBeamMillis=millis();
      shortBeamPress=true; // Flag für kurzen Tastendruck setzen
    }
    
  // Wenn Tastendruck Fernlicht länger ist, Flag für kurzen Tastendruck löschen
  if (!Blight.read() && millis()-startBeamMillis>LONGKEYPRESSTIME && Fernlicht==true)
     shortBeamPress=false;
  
  // Sonderfall langer Tastendruck Fernlicht --> Licht ausschalten
  if (!Blight.read() && millis()-startBeamMillis>LIGHTOFFPRESSTIME )
    {
      Lichtaus=true;
      Fernlicht=false;
    }
  
  // Licht wieder einschalten wenn Fernlichtschalter wieder betätigt
  if (Lichtaus==true && Blight.fell())
     Lichtaus=false;
  
  // Lichthupe 
  if (shortBeamPress && millis()-startBeamMillis>SHORTBEAMTIME && Fernlicht==true)
    {
     Fernlicht=false;
     shortBeamPress=false;
    }
	
  if (Starter!=true)
  {
    if (Fernlicht==true)
    {
      digitalWrite(ABLIGHTPIN, shortBeamPress); // Bei Lichthupe bleibt das Abblendlicht eingeschaltet
      Lichtan = true; // Bei Zündung an, aber Motor AUS (Batteriespannung <13V) das Licht einschalten wenn Fernlichttaster betätigt
    }
    if (Fernlicht!=true)
    digitalWrite(ABLIGHTPIN, Lichtan && !Lichtaus);
  
    if ((digitalRead(LIGHTPIN)!=HIGH) && (Fernlicht==true))
    digitalWrite(LIGHTPIN,HIGH);
  
    if ((digitalRead(LIGHTPIN)==HIGH) && (Fernlicht==false))
    digitalWrite(LIGHTPIN,LOW);
  }	
}

else  // ********* Schaltersteuerung *********
{
  if (!Blight.read())   //Fernlichtschalter betätigt
  {
      Fernlicht=true;
      Lichtan=true; // Abblendlicht aktivieren wenn Fernlichtschalter betätigt um bei stehenden Motor das Abblendlicht einschalten zu können
  }
      else
      Fernlicht=false;
  if (Starter!=true)    // Licht nur einschalten, wenn NICHT Starttaster betätigt
  {
     digitalWrite(ABLIGHTPIN,!Fernlicht && Lichtan);
     digitalWrite(LIGHTPIN,Fernlicht); 
  }    
}
}


//***** Zündung *****
void Zuendung()
{
  unsigned long startKillMillis = KILLTIME; //Zeitpunkt beim Tasten des Killschalters
  Bsidestand.update();
  Bkill.update();
// **** Killschalter ****
if (!Bkill.read())              // Killschalter in Stellung OFF
  {                    
    if (digitalRead(IGNITIONPIN))
       startKillMillis = millis();
    digitalWrite(IGNITIONPIN,LOW);            //Zündung ausschalten
  }
if (Bkill.read())               //Killschalter wieder in Stellung ON
  {                     
    if (millis()-startKillMillis >= KILLTIME) //Zündung mindestens für KILLTIME ausgeschaltet?
       digitalWrite(IGNITIONPIN,HIGH);        //Zündung wieder einschalten
  }
  
// **** Seitenständer ****
if (!Bsidestand.read())      // Seitenständer ausgeklappt
//digitalWrite(IGNITIONPIN,LOW); //Zündung ausschalten
;
if (Bsidestand.read())      // Seitenständer eingeklappt
//digitalWrite(IGNITIONPIN,HIGH); //Zündung einschalten
;
}

// **** Anlasserrelais ****
void Starten()
{
  Bstart.update();
  if (!Bstart.read())      //Starttaster betätigt
     if (digitalRead(IGNITIONPIN))      //Nur wenn Zündung auch eingeschaltet
      {
        digitalWrite(ABLIGHTPIN, LOW);  //Abblendlicht ausschalten
        digitalWrite(LIGHTPIN, LOW);    //Fernlicht ausschalten
        digitalWrite(STARTPIN,HIGH);    //Anlasser einschalten
        Starter=true;
      }
// Anlasserrelais ausschalten, unabhängig der anderen Zustände
if (Bstart.read()) 
  {
  digitalWrite(STARTPIN,LOW);
  Starter=false;
  }
}

Benutzeravatar
pitschi67
Beiträge: 32
Registriert: 5. Sep 2018
Motorrad:: Harley48 und V-Strom

Re: Tastersteuerung Anfrage

Beitrag von pitschi67 »

Hallo Jochen,
hab den Sketch getestet und jetzt ist es super.
Habe noch die Longkeypresstime von 250 auf 350 gesetzt und jetzt ist es perfekt.
Die Batteryvoltage habe ich mal auf 12,5 gesetzt. Jetzt geht das Lich automatisch an aber auch schon bei 11Volt.
Ich glaube da passt etwas noch nicht.
Könnte man das Licht auch evtl. bei Zündung aus noch eine Zeit an lassen und es schaltet sich dann selbstständig aus? (Coming Home)

Mopedschrauber
Beiträge: 603
Registriert: 27. Feb 2014
Motorrad:: KLR 650 und andere

Re: Tastersteuerung Anfrage

Beitrag von Mopedschrauber »

Hi,

habe nochmal eine Frage zur Stückliste.
Bei der Diode D1 steht 1N4004, Pitschi hat in seiner Stückliste 2 x 1N4003.
Für die Dioden D2 und D3 sind keine Werte angegeben.
Welche Dioden benötige ich für D2 und D3?

Gibt es jetzt schon mehr Infos wegen den Widerständen R1 - R8? Brücke rein, oder bestücken?
Gruß Werner

Benutzeravatar
pitschi67
Beiträge: 32
Registriert: 5. Sep 2018
Motorrad:: Harley48 und V-Strom

Re: Tastersteuerung Anfrage

Beitrag von pitschi67 »

Hallo Werner,
D1 kannst du die Werte nehmen die ich in der Stückliste habe.
D2 und D3 brauchst du nicht.

Hier mal der Hinweis von Jochen:

Die Widerstände (R1-R8) zu den BTS442 habe ich 10k genommen. Vermutlich kann man die sogar weglassen (also durch eine Drahtbrücke ersetzen).
Von daher sollten auch kleinere Werte, 4k7 oder so, kein Problem sein.
Die Vorwiderstände für die LED’s habe ich 820Ohm genommen. Kommt halt drauf an was man da für LED‘s verbaut.
Ich habe da mal so mit ca. 10-15mA gerechnet.
Der Kondensator C4 ist blöde platziert, da kommt man dann nicht mehr gescheit an den USB Anschluss.
So 10-100 uF sollte OK sein.
Der Widerstand R19 soll ein Varistor als Überspannungsschutz für den Arduino sein. Da bin ich mir noch unschlüssig welcher da geeignet ist.
Ich würde den erst mal weg lassen.

Auf der Platine die Punkte AL-AL1, FL-FL1, BR-BR1, BL-BL1 müssen vor dem Einlöten der BTS miteinander verbunden werden.
Ich habe dazu 1,5mm² starre Drähte (aus Nym-Kabel) genommen.
Die BTS bekommen die Batteriespannung über das Gehäuse/Kühlkörper.
Dazu habe ich die Anschlüsse VCC1 und VCC2 mit dem Kühlkörper per 1,5mm² starre Drähte (aus Nym-Kabel) verbunden.

Die Dioden D2 und D3 werden nur benötigt, wenn man eine gemeinsame Blinkerkontrollanzeige (Eine Anzeige für Rechts und Links gemeinsam) hat.
Dann könnte man ein Brücke von BK nach VCC1 oder VCC2 machen um den Anschluss raus zu führen. Dann bleibt aber nur noch ein Anschluss für die Batterie übrig.


Noch als Zusatz, die Punkte Hu, St, IG und BRAKE kannst du frei lassen. Die hat Jochen nur für eine evtl. Kabelpeitsche als Anschluss vorgesehen.
Für die LED´s habe ich 1K Wieserstände genommen. 12V habe ich an den LED´s komplett durchgeschliffen.
C4 habe ich liegend angeschlossen und da passt das auch mit dem USB Anschluss

Ich hoffe das hilft dir weiter.

Gruß
Dirk

Mopedschrauber
Beiträge: 603
Registriert: 27. Feb 2014
Motorrad:: KLR 650 und andere

Re: Tastersteuerung Anfrage

Beitrag von Mopedschrauber »

Hi Dirk,

den Text kenne ich schon :) Trotzdem Danke
Da ich aber nur eine Anzeige für den Blinker habe, brauch ich auch die beiden Dioden D2 und D3. Darum meine Frage.
Was hast du für R1 bis R8 an Widerständen genommen?

Gruß Werner
Gruß Werner

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

Re: Tastersteuerung Anfrage

Beitrag von brummbaehr »

Für D1, D2 und D3 kann man 1N400x nehmen. Also ob da nun 1N4001 (1A, 50V) oder 1N4007 (1A 1000V) benutzt wird, ist wurscht.
Als R1 - R8 habe ich 10K benutzt.

pitschi67 hat geschrieben: 18. Dez 2019 Hallo Jochen,
hab den Sketch getestet und jetzt ist es super.
Habe noch die Longkeypresstime von 250 auf 350 gesetzt und jetzt ist es perfekt.
Die Batteryvoltage habe ich mal auf 12,5 gesetzt. Jetzt geht das Lich automatisch an aber auch schon bei 11Volt.
Ich glaube da passt etwas noch nicht.
Könnte man das Licht auch evtl. bei Zündung aus noch eine Zeit an lassen und es schaltet sich dann selbstständig aus? (Coming Home)
Das mit der Batteryvoltage muss ich mir mal anschauen.
Da die Zündung den Arduino ausschaltet, ist es aktuell unmöglich das Licht noch etwas an zu lassen.

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

Re: Tastersteuerung Anfrage

Beitrag von brummbaehr »

Zu der Batteryvoltage habe ich mal die Funktion "readbattery()" angepasst.
Bei mir funktioniert's.

Code: Alles auswählen

void readbattery()
{
  int sensorValue = analogRead(BATTERY);
  float voltage = map(sensorValue, 0, 1023, 0, 47500) / 1000.0;
  if (voltage > BATTERYVOLTAGE && !Lichtaus)
  Lichtan = true; // Abblendlicht einschalten wenn Batterie über 13V --> Motor läuft
  //Serial.println(voltage);
}

Benutzeravatar
bikebomber
Beiträge: 482
Registriert: 3. Mai 2016
Motorrad:: ...verschiedene
Wohnort: www.die-beschriftungsfabrik.de
Kontaktdaten:

Re: Tastersteuerung Anfrage

Beitrag von bikebomber »

Hallo NyFAZ,
das was Du da zusammen stellen möchtest, gibts doch schon.
Das habe ich vor 5 Jahren an meinem FJ Umbau gemacht.
Die Taster kannst Du kaufen mit ein oder zwei Leitungen und die Tastergehäuse habe ich fräsen lassen.
Die elektronische Steuerung bekommst in x-Varianten bei Joost.
Also warum die Arbeit machen, wenns sowas schon gibt ??

Ralf
Erst sehen was sich machen läßt, dann machen was sich sehen läßt.

Mopedschrauber
Beiträge: 603
Registriert: 27. Feb 2014
Motorrad:: KLR 650 und andere

Re: Tastersteuerung Anfrage

Beitrag von Mopedschrauber »

Hey bikebomber,
warum kaufst du dir nicht eine schöne Triumph Café Racer? Wozu was selber bauen, wenn es sowas schon gibt? Du erkennst den Fehler in deiner Frage?
Gruß Werner

Benutzeravatar
bikebomber
Beiträge: 482
Registriert: 3. Mai 2016
Motorrad:: ...verschiedene
Wohnort: www.die-beschriftungsfabrik.de
Kontaktdaten:

Re: Tastersteuerung Anfrage

Beitrag von bikebomber »

Nein Moppedschrauber, da ist kein Fehler.
Wenn ich mir was zusammen bauen möchte, dann weil ich es so haben möchte wie ich es will.
Bei den ganzen Anbauteilen frage ich nach dem Sinn so etwas zu bauen. Aus Langeweile ??
Oder baust Du Dir nen Lenker selber, wenns den schon für x-Euro fertig und in diversen Varianten
gibt ??
Ralf
Erst sehen was sich machen läßt, dann machen was sich sehen läßt.

Antworten

Zurück zu „Elektrik/Beleuchtung“

Sloping Wheels