Hallgeber signal wandler

HI
ich hab mal ne komplexe frage.

Ein Freund ist zu mir mit nem kleines Projekt mit arduino fürs Auto an mich herangetreten.

Die Golf 2 ( und zb Transporter) Fahrer haben immer ein Problem mit moderneren Motoren bzw Getrieben.
Diese haben keine Möglichkeit für eine Tachowelle für den Tacho sondern nur Hallgeber.

Also ist unsere Idee folgende:

Der Arduino erkennt das Hallgeber Signal was zb 3862 Impulsen für 1km entsprechen.
Dies Wandelt der Arduino um und steuert einen Motor an der zb 950 (tacho abhängig) Umdrehungen für 1 km auf den Tachowellen des Tachos gibt.

Dazu sollen die Werte noch auf einen kleinen Display angezeigt werden.

Wie schwer ist das zu realisieren mit einen Arduino?
Momentan schwebt mir ein Nano vor aber besserer Arduino wie der Mega 2560 oder Due schweben mir da vor.

DarkBeauty666:
Wie schwer ist das zu realisieren mit einen Arduino?

Nicht so, wenn es funktionieren soll.
Ziemlich, wenn es gut aussehen soll.

Gruß

Gregor

naja ganze kram kämen in ne hülle das ist nicht das problem.

erstmal muss es funktionieren dann kommt das optische

und wie wollt ihr das Thema "TÜV" behandeln?

ich weiss was du meinst aber was soll da der Tüv machen?
Der Tacho muss nur die richtige Speed anzeigen.
Die einzige Vorschrift ist das er etwas mehr anzeigen muss und nicht zu wenig.

Wie ginge es sonst golf 3 oder golf 4 Tachos in den Golf 2 Einbauen.

Klar die Elektrik muss abgesichert sein aber das ist das kleinste Problem.
Gibt ja auch genug Module für die Probleme mit Drehzahlwandeln und Co.

DarkBeauty666:
... was soll da der Tüv machen?

Zuerst wird kassiert :slight_smile:

Gruß

Gregor

Kassieren für was?
der tüv sagt nur abgesichert und es muss richtige speed anzeigen.
bis auf gurte, airbag, sitze und das man speed und die wichtigsten signal lampen wie fernlicht, nbebellicht abs und co sieht kannste dich im innenraum austoben da gibt es keine vorschrichten.

aber das ist schon längst geklärt und intresse an sowas besteht nunmal.
das es richtig eingestellt werden muss ist klar.
hier dachte ich an 2 werte die man ändert also impulszahl des hallgebers und umdrehungen des tachos.

nebenbei gibt es bei diesen zahlen viele kombinationen was an den getrieben liegt.
golf 2 tachos haben so 6 verschiedene zahlen

DarkBeauty666:
aber das ist schon längst geklärt und intresse an sowas besteht nunmal.

Ok, wenn du das geklärt hast, besteht ja auch kein Grund mehr, darüber zu diskutieren.

Ich habe unlängst mal gelesen, dass nachträgliche Änderungen genehmigt werden müssen.
Allerding weiß ich nicht mehr genau, worauf sich das bezog.

Aber egal, du wirst es besser wissen.

Änderunge die eingetragen werdne müssen sind alles was mit fahrwerk, bremsen, reifen, felgen oder motor zu tuen.
dazu noch die karosserie änderungen oder sachen mit der aussenbeleuchtung.
innen sind sachen wie sitze, lenkrad, airbag, gurte, folierung der scheiben einzutragen.
tacho muss nur richtig anzeigen udn alle statusanzeigen müssen gehen.
hier gibts nur die vorgabe km/h müssen genau sein oder/und vor gehen.
der rest ist freiwild solange keine beleuchtung nach aussen geht.

Im übrigen gibt es Tachowelle zu Digital Wandler wie zb bei Taxen genutzt wurden oder für die Mfa.
Bei meinen entsprechen 3862 Impuls für 1km und der G2 Tacho braucht da 950 Umdrehungen dafür.
Damit lässt sich arbeiten.

ich kenn mich im tuning bereich aus da ich zu denen gehöre die ihr auto komplett umbauen.

Im Prinzip musst du nur über ein PWM Signal und einen FET einen kleinen Motor die Drehzahl regeln.
Den Motor am besten gleich hinten am Tacho angebracht, also ohne Welle. (Wenn dahinter genug Platz)

Wenn du nur dies machen willst, also Hall Geber Impulse Zählen umrechnen und PWM für den Motor erzeugen, reicht ein Arduino auf ATmega328 Basis.

Ein Mega2560 hat nur viele IO Pin's mehr als ein 328 (die du nicht brauchst), und ein Due(ARM) ist mit seinen 84 MHz für so eine Aufgabe total unterfordert :slight_smile:

ah das ist schonmal ein guter hinweiss.

der motor kommt an den adapter der hinten auf den tacho gesteckt wird also keine weitere welle dazwischen.
den motor den wir in aussicht haben kan mit einen regler angesteuert udn drehzahl ausgewertet werden.

ja der nano ist ja ein atmega 328 und finde den auch passend dr müsste reichne um die werte noch auf nen 0,96" display anzuzeigen.

hatte nur den mega und due genannt falls der nano nicht reichen würde

ja der nano ist ja ein atmega 328 und finde den auch passend dr müsste reichne um die werte noch auf nen 0,96" display anzuzeigen.

Das geht bestimmt auch.

motor den wir in aussicht haben kan mit einen regler angesteuert udn drehzahl ausgewertet werden.

Ich hätte es erst ohne Regelkreis versucht wie genau das wird, aber so ist natürlich optimal.

Naja kann man alles testen mit oder ohne Steuerung.
Wobei ich denke die 8-9 Volt die der Motor für 260 am Tacho braucht ist etwas viel für den Nano.

Noch sind wir nicht über die Planung raus und die Testreihe für den Motor steht auch aus

Die Spannungsversorung des Controlles im KFZ wäre auch noch ein Kriterium.

Da ist viel Schmutz unterwegs.
Vor dem 5Volt Regler z.b sowas einplanen.

das ist klar da im auto bis so 14,4 V laufen.
das ist ja zuviel für den ardu und das signal des hallgebers ( glaube ist 12V)müsste wohl auch etwas runter gesetzt werden.

wollte für den arduino ein spannunhgsboard aus dem modellbaubereich nehmen wo ich einmal konstant 12v habe und einen einstellbaren ausgang der bis 12v regelbar ist.
dazu wären noch anschlüsse für die motor spannungsversorgung dran.

sowas meine ich http://www.ebay.de/itm/Dual-BEC-Stromverteiler-Lot-Platine-Spannungsbord-12V-und-3-20V-Multicopter-/301838469289?hash=item4646f988a9:g:j0AAAOxyhXRTKH5N

das ist klar da im auto bis so 14,4 V laufen.

fail :slight_smile:

Kurze Peaks um die 500V können im Bordnetz dabei sein, die den Atmel stören können. oder mehr :confused:

Hat diese BEC Platine Suppressor Dioden drin ?

DarkBeauty666:
Kassieren für was?

Es ist nicht wichtig, wofür der TÜV kassiert. Irgendwo muss jemand irgendjemandem Geld geben, damit sich der TÜV mit Deinem Auto beschäftigt.

Gruß

Gregor

OT:
Gerade im Tuning Bereich, ist das was erlaubt wird, und was nicht, nicht genau definiert. Von Bundesland zu Bundesland unterschiedlich.
Dann werden Autos die B-Land x nicht zugelassen werden im B-Land y gegen z.b 1k € Cache zugelassen.

Das stinkt doch gewaltig ...

rudirabbit:
OT:
Gerade im Tuning Bereich, ist das was erlaubt wird, und was nicht, nicht genau definiert. Von Bundesland zu Bundesland unterschiedlich.
Dann werden Autos die B-Land x nicht zugelassen werden im B-Land y gegen z.b 1k € Cache zugelassen.

Das stinkt doch gewaltig ...

das ist falsch!
für jedes bundesland gelten die gleichen gesetzgebungen in sachen auto.
das einzige ist das einzelabnahmen im westdeutschland der nur tüv macht und im osten nur die dekra das ist gesetzlich festgelegt.

wenn der eine tüv das nicht einträgt aber ein anderer ist das eher willkür des tüvlers oder derjenige will nicht dafür geradestehen.

unterschiedliche gesetze für autos gibt es aber in deutschland nicht.

rudirabbit:
fail :slight_smile:

Kurze Peaks um die 500V können im Bordnetz dabei sein, die den Atmel stören können. oder mehr :confused:

Hat diese BEC Platine Suppressor Dioden drin ?

ja spannungspitzen die eigentlich nicht auftretten sollten aber bisher funktioniert bei mir alles was auf 14 v ausgelegt ist.
kann man mit filtern aber abfangen.

suppressor dioden? wie sehen die als smd aus? dann kann ich nachsehen hab ja 2 solche boards in benutzung

Evtl hilft dir das hier !

//Anzahl Spalten des Display (16)
#define LCD_WIDTH 16

//Anzahl Zeilen des Display (2)
#define LCD_HEIGHT 2

// Pin für Reed-Kontakt, Digital-2 für Interrupt 0
#define REEDPIN 2

// Hardware-Interrupt für den Reed-Pin
#define REEDINTERRUPT 0

// Radumfang in mm
#define RADUMFANG 2260


#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// build 2-line digit font data array
// Digits are 3 characters wide.
byte bignums[10][2][3] = {
// Define which characters to use for each number. 255 is a solid block; 254 is a space  
// The format is { {TopLeft, TopMiddle, TopRight}, {BottomLeft, BottomMiddle, BottomRight} }
{ {255, 0, 255}, {255, 1, 255} },        // data to display "0"
{ {0, 255, 254}, {1, 255, 1} },          // data to display "1"
{ {0, 5, 255}, {255, 1, 1} },            // data to display "2"
{ {0, 5, 255}, {1, 1, 255} },            // data to display "3"
{ {255, 1, 255}, {254, 254, 255} },      // data to display "4"
{ {255, 5, 5}, {1, 1, 255} },            // data to display "5"
{ {255, 5, 5}, {255, 1, 255} },          // data to display "6"
{ {0, 0, 255}, {254, 255, 254} },        // data to display "7"
{ {255, 5, 255}, {255, 1, 255} },        // data to display "8"
{ {255, 5, 255}, {254, 254, 255} }       // data to display "9"
};

void loadchars() {                        // This subroutine programs the custom character data into the LCD
lcd.command(64);
// Custom character 0
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));

// Custom character 1
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B11111));

// Custom character 2
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B11111));

// Custom character 3
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B01110));
lcd.write(byte(B01110));
lcd.write(byte(B01110));

// Custom character 4
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B01110));
lcd.write(byte(B01110));
lcd.write(byte(B01110));
lcd.write(byte(B00000));
lcd.write(byte(B00000));

// Custom character 5
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B11111));
lcd.write(byte(B11111));

// Custom character 6
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B11111));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B11110));
lcd.write(byte(B11111));

// Custom character 7
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));
lcd.write(byte(B00000));

lcd.home();
}

void printbigchar(byte digit, byte col) { // This subroutine prints the big font characters on the LCD screen
if (digit > 9) return;                   // reject anything above 9
for (int i = 0; i < 2; i++) {            // count i from 0 to 1
lcd.setCursor(col*4 , i);              // set LCD cursor at correct point
for (int j = 0; j < 3; j++) {          // count j from 0 to 2
  lcd.write(bignums[digit][i][j]);     // write proper block to LCD from array
}
lcd.write(254);                        // write an empty space
}
lcd.setCursor(col + 4, 0);               // move the cursor to the top line, col + 4
}


void setup(){
pinMode(REEDPIN, INPUT_PULLUP); // Reedkontakt direkt und ohne Widerstand angeschlossen  
lcd.begin(LCD_WIDTH, LCD_HEIGHT);
loadchars();
attachInterrupt(REEDINTERRUPT, reedISR, FALLING);
}

volatile byte reedCountSum;
volatile long reedMillisSum;

unsigned long lastReedMillis;

void reedISR()
{
if (millis()-lastReedMillis>=25)  // 25ms entspricht max. 40 Radumdrehungen pro Sekunde
{
 reedCountSum++;                 // eine Radumdrehung zählen
 reedMillisSum+=millis()-lastReedMillis;   // Zeit addieren
 lastReedMillis=millis();       // Zeit merken
}
}

unsigned long gesamtUmdrehungen;

void tachoAnzeige()
{
byte umdrehungen;
unsigned long zeit;
float kph, kilometer;
int kphRounded;
char buffer[10];
noInterrupts();            // Interrupts sperren
 umdrehungen=reedCountSum;// Zählvariable umkopieren
 reedCountSum=0;          // Zählvariable auf 0 zurücksetzen
 zeit=reedMillisSum;      // Zeitzähler umkopieren
 reedMillisSum=0;         // Zeitzähler auf 0 zurücksetzen
interrupts();              // Interrupts wieder zulassen
gesamtUmdrehungen+= umdrehungen; // Aufsummieren aller Radumdrehungen
kilometer=(float)gesamtUmdrehungen*(float)RADUMFANG/1000000.0; // Fahrtkilometerzähler
if (umdrehungen>0)
 kph=float(RADUMFANG)*(float)umdrehungen/(float)zeit*3.6;
else
 kph=0.0;  

lcd.setCursor(12, 0);
dtostrf(kilometer,3, 1, buffer);
lcd.print(buffer);
/*  
lcd.setCursor(0, 0);
dtostrf(kilometer,9,3,buffer);
lcd.print(buffer);
lcd.print(" km");
lcd.setCursor(0, 1);
lcd.print("KM/H ");
dtostrf(kph,5,1,buffer);
*/
kphRounded=int(kph+0.5); // auf ganze kph gerundet
// Ausgabe kph in grossen Ziffern
kphRounded = kphRounded % 1000;       // drop any digits above 999
printbigchar(kphRounded / 100,0);     // print the speed hundreds
kphRounded = kphRounded % 100;        // drop any digits above 99
printbigchar(kphRounded/10,1);        // print the speed tens
kphRounded = kphRounded % 10;         // drop any digits above 9
printbigchar(kphRounded,2);           // print the speed ones
lcd.setCursor(12, 1);
lcd.print("km/h");
}


unsigned long letzteSekunde=0;
void loop()
{
unsigned long dieseSekunde=millis()/1000;
// Tachoanzeige wird genau einmal pro Sekunde aktualisiert
if (letzteSekunde != dieseSekunde)
{
 tachoAnzeige();
 letzteSekunde=dieseSekunde;
}

}