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
SebastianM
Beiträge: 1287
Registriert: 2. Sep 2015
Motorrad:: ..
Wohnort: Vaterstetten

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

Beitrag von SebastianM »

Hi Roland, genauso hätte ich es auch gemacht. Beim Start alle Eeprom Adressen auslesen und den höchsten Wert nehmen... Dann zyklisch die Werte wegschreiben. Ich würde das aber Geschwindigkeitsabhängig machen... Bei v>30kmh ist es ja ziemlich unwahrscheinlich, dass die Zündung in den nächsten Sekunden abgeschaltet wird.
Code habe leider keine noch keinen... Hoffentlich komme ich jetzt am langen Wochenende dazu.

Mfg Basti

Benutzeravatar
Eumel
Beiträge: 186
Registriert: 28. Aug 2017
Motorrad:: Buell XB12R Firebolt 2004
Honda CBF1000 (SC58) 2006
Honda CB450S (PC17) 1988
Kawasaki Z650SR
Verkauft: Honda NTV 650 Revere (RC33) 1989
Wohnort: Stuttgart

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

Beitrag von Eumel »

Das Zauberwort heißt "Wear Leveling". Wenn du das mit Arduino zusammen bei Google rein wirfst findest du vielleicht sogar ne Library die das macht. Ist wenn man häufig in den Flash/EEPROM schreibt üblich.

Warum aber auf nen ATTiny oder sowas kleines setzen? Die Dinger werden sehr schnell zu klein wenn man sie mit der platzraubenden Arduino Firmware nutzt und heute ist schnelleres/besseres weder teurer noch komplizierter.
Schau dir mal die NodeMCU oder den Lolin32 an. Die bekommst du komplett für um die 4$ bei Aliexpress oder für um die 10€ in DE. Die kannst du ganz normal wie nen Arduino auch mit der Arduino IDE verwenden und auch viele der üblichen Libraries verwenden und (jetzt kommt's) die Teile haben Wifi an Board. Damit könnte man sich später noch Spielereien überlegen wie Logging der Kilometer/Geschwindigkeit/Boardspannung oder auf die Zündung bezogen Zündkurven/Settings per Wifi laden.
Der Lolin32 hat sogar ne Ladeelektronik für Lipos an Board. Damit könnte man das Speicher Problem auch lösen indem man einfach immer erst schreibt wenn die Zündung wieder aus ist und den Prozessor dann schlafen legt. Das Teil braucht dann nur ein paar µA sollte also die Batterie nicht belasten.
Nur mal so ne Idee.

Sollte es an der Hardware scheitern: Da kann ich gerne helfen. Man könnte ja sogar Zündung Tacho (und was weiß ich noch) in ein Projekt packen...
:!: Hier könnte Ihre Werbung stehen :!:

Benutzeravatar
NyFAZ
Beiträge: 288
Registriert: 2. Nov 2016
Motorrad::  
BMW R80
KTM LC400 Mil
Wohnort: Braunschweig

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

Beitrag von NyFAZ »

Bei mir vorerst: One job, one tool :)

Von daher wäre ein Arduino schon zu groß. Aufteilen in mehrere Speicherbereiche wäre ein Thema, welche Daten wann geschrieben werden ein anderes. Wenn ich bei einem Gesamtkilometerstand von 600km losfahre und am Ende 1600 erreicht habe, brauche ich (theoretisch) nur die "1" zu speichern (eine gewisse Logik vorausgesetzt). Das erzwingt aber auch ein Erkennen der abfallenden Bordspannung und beschreiben des EEProms bevor der Saft ausgeht. Code mit Interrupt für Tacho habe ich parat und poste ich heute Abend mal wenn ich zu Hause bin. Könnt ihr dann auseinander nehmen oder wir als Basis für weitere Versuche benutzen ;)

LG Roland

Benutzeravatar
Eumel
Beiträge: 186
Registriert: 28. Aug 2017
Motorrad:: Buell XB12R Firebolt 2004
Honda CBF1000 (SC58) 2006
Honda CB450S (PC17) 1988
Kawasaki Z650SR
Verkauft: Honda NTV 650 Revere (RC33) 1989
Wohnort: Stuttgart

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

Beitrag von Eumel »

Naja aber "One job, one tool" spricht ja eher gegen den Arduino weil der bei so mancher Aufgabe dann zu klein wird und dann musst du für den nächsten Job wieder "another tool" raussuchen. So wäre es sogar "every job, the same tool".
Zumindest mache ich das im Moment daheim so. Meine Nachttischlampe oder das Mobile über dem Kinderbett brauchen sicher keinen 32-bit Dual-Core Prozessor (ESP32) aber der kostet nicht mehr als der Arduino und liegt hier halt Stapelweise rum weil ich die immer im 10er Pack beim Chinesen ordere. Und jetzt hat das Mobile halt nen Webserver mit dem man die Drehgeschwindigkeit und die Pausen einstellen kann. :stupid:
Und bei privaten Bastelprojekten gibt es so etwas wie einen "zu großen" Microcontroller ja nicht. Hast ja kein Controlling daheim (hoffe ich für dich). :grin:

Und die Logik mit nur einzelnen Zahlen schreiben würde ich jetzt auch nicht gerade implementieren. Da machst du dir mehr Aufwand als es dir später nutzt. Einfach wie bereits gesagt immer im Ring rum in alle Speicherzellen schreiben und gut ist.
:!: Hier könnte Ihre Werbung stehen :!:

Benutzeravatar
NyFAZ
Beiträge: 288
Registriert: 2. Nov 2016
Motorrad::  
BMW R80
KTM LC400 Mil
Wohnort: Braunschweig

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

Beitrag von NyFAZ »

Hallo Eumel,

hast Du denn fürs Ringrum eine Library oder darf ich das Rad neu erfinden?
Dann muss ich mich erst einmal mit Speicherbereichen auseinandersetzen.

LG Roland

Benutzeravatar
Eumel
Beiträge: 186
Registriert: 28. Aug 2017
Motorrad:: Buell XB12R Firebolt 2004
Honda CBF1000 (SC58) 2006
Honda CB450S (PC17) 1988
Kawasaki Z650SR
Verkauft: Honda NTV 650 Revere (RC33) 1989
Wohnort: Stuttgart

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

Beitrag von Eumel »

Benutzt hab ich noch keines aber Google spuckt zum Beispiel dieses hier aus: https://github.com/drjoju/Arduino-wear-leveling
Nach grobem Überfliegen des Codes tut es ungefähr was du möchtest.

Edit: Besser klingt noch das hier: https://github.com/PRosenb/EEPROMWearLevel
:!: Hier könnte Ihre Werbung stehen :!:

Benutzeravatar
NyFAZ
Beiträge: 288
Registriert: 2. Nov 2016
Motorrad::  
BMW R80
KTM LC400 Mil
Wohnort: Braunschweig

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

Beitrag von NyFAZ »

Hallo,

ich habe jetzt endlich mal meinen Code für den Tacho vorgekramt. Da ich einen el. Tachogeber als Ersatz für den mechanischen an der CX verwenden will, zähle ich wenn ich einen Interrupt, ausgelöst durch eine steigende Flanke, reinbekomme.
Aktuell ist die Verkabelung noch sehr überschaubar. Vier Leitungen zum Display und drei zum el. Tachogeber.

Das hier ist aber erstmal nur die Geschwindigkeitsanzeige, Gesamtkilometer fehlen noch. 1400 Interrupts = 1km, das ist nicht so schwer.
Hier kommt dann der Wearlevel zum Einsatz ;)

Nun aber erstmal der versprochene Code:

Code: Alles auswählen

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RunningAverage.h>

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);  //Mein Display (OLED 182x32)

RunningAverage myRA(5);
volatile unsigned long dauer = 0;             // microsekunden seit dem letzten Interrupt
volatile unsigned long last = 0;              // Zählerwert beim letzten Interrup
short geschwindigkeit;                        // selbstredend
short VAnzeige;
char dispStr[3]; 

void setup(void) {
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(2), readmillis, RISING);
  myRA.clear();
  u8g2.begin();
}

void loop(void) {
  if (last > 0) {
   if (millis() - last > 4000) {                         // Nach 4 Sekunden stillstand Display löschen
      u8g2.clearDisplay();
      myRA.clear();
    }
    else {
   VAnzeige = myRA.getAverage();
   String(VAnzeige).toCharArray(dispStr, 3);        
    u8g2.clearBuffer();                           
    u8g2.setFontDirection(0);
    u8g2.setFont(u8g2_font_logisoso32_tf);
      u8g2.drawStr(0,32,dispStr);               
      u8g2.setFont(u8g2_font_logisoso16_tf);
      u8g2.drawStr(70,32,"km/h");                       
      u8g2.sendBuffer();            
    }
  }
}


void readmillis() {                           // Interrupt-Routine
  detachInterrupt(2);                         // Interrupt ausschalten damit er uns nicht beißt
  volatile unsigned long m = millis();          // Microsekundenzähler auslesen
  volatile unsigned long v = m - last;          // Differenz zum letzten Durchlauf berechnen
  if (v > 10) {                               // ignorieren wenn <= 10ms (Kontaktpreller)
    dauer = v;                                // Wert in dauer übernehmen
    last = m;                                 // und wieder den letzten Wert merken
    geschwindigkeit = 2572 / dauer;           // Geschwindigkeit ausrechnen mit k-Wert 1,4
    myRA.addValue(geschwindigkeit);           // Wert zur Mittelwerberechnung hinzufügen
    
  }
  attachInterrupt(digitalPinToInterrupt(2), readmillis, RISING);    // Interrupt wieder einschalten.
}
Wenn ich es noch schaffe den Tachowert rechtsbündig darzustellen, wäre das noch besser. Tipps sind gerne gesehen.

LG Roland

Benutzeravatar
NyFAZ
Beiträge: 288
Registriert: 2. Nov 2016
Motorrad::  
BMW R80
KTM LC400 Mil
Wohnort: Braunschweig

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

Beitrag von NyFAZ »

Nachtrag zu rechtsbündig:

Ich bin mal davon ausgegangen dass die Zahlen eine Breite von 20 Pixeln haben :)

Code: Alles auswählen

short offset = 0;
short fixebreite = 20;

//Und im loop erweitern:
void loop(void) {
  if (last > 0) {
   if (millis() - last > 4000) {                         // Nach 4 Sekunden stillstand Display löschen
      u8g2.clearDisplay();
      myRA.clear();
    }
    else {
   VAnzeige = myRA.getAverage();
   if (VAnzeige < 10) {
    offset = 2 * fixebreite;
   }
   else if (VAnzeige < 100) {
    offset = fixebreite;
   }
   else {
    offset = 0;
   }
   String(VAnzeige).toCharArray(dispStr, 3);
    u8g2.clearBuffer();                           
    u8g2.setFont(u8g2_font_logisoso32_tn);
      u8g2.drawStr(offset,32,dispStr);               
      u8g2.setFont(u8g2_font_logisoso16_tf);
      u8g2.drawStr(70,32,"km/h");                       
      u8g2.sendBuffer();            
    }
  }
}
Nachtragende Grüße
Roland

Benutzeravatar
NyFAZ
Beiträge: 288
Registriert: 2. Nov 2016
Motorrad::  
BMW R80
KTM LC400 Mil
Wohnort: Braunschweig

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

Beitrag von NyFAZ »

Nochmal einen Nachtrag, falls hier wer mitlesen sollte:

Ich habe aktuell FRAM bestellt.
Damit benötige ich kein rundenbasiertes Schreiben und kann den Speicher jeden zurückgelegten Meter beschreiben, wenn ich wollen würde.
Mit 10.000.000.000.000 Schreibzyklen brauche ich mir keine Sorgen mehr um wear zu machen.

LG Roland

SebastianM
Beiträge: 1287
Registriert: 2. Sep 2015
Motorrad:: ..
Wohnort: Vaterstetten

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

Beitrag von SebastianM »

coole sache! Das Ding kannte ich noch garnicht

Antworten

Zurück zu „Elektrik/Beleuchtung“

Kickstarter Classics