Diese Seite mit anderen teilen ...

Informationen zum Thema:
Forum:
elweb Kewet / Buddy
Beiträge im Thema:
8
Erster Beitrag:
vor 1 Jahr, 11 Monaten
Letzter Beitrag:
vor 1 Jahr, 1 Monat
Beteiligte Autoren:
hallootto, R.M, Claus.

Arduino meets KEWET CityJet5 Display

Startbeitrag von hallootto am 02.09.2015 19:17

Moin, Moin!

Das könnte den einen oder anderen interessieren.

[www.familiewoll.de]

elektrische Grüße
Peter

Antworten:

Super,
...kannst Du mir gute Bilder vom Display und Controller zusenden?
Vielleicht gleich beschriften?
So wie ich es mal für Twike gemacht habe.

Grüße
Claus

von Claus. - am 06.09.2015 08:39
Hallo Claus

Die Anschlüsse fürs Display stehen doch auf deiner Seite.

Und verbaut sind stinknormale ICs aus deren Datenblättern man die Adressierung der Bausteine und damit das Protokoll 1 zu 1 übernehmen kann.

Da man mit den ICs nur 3 Adressen selektieren kann sind noch 2 leitungen für die Adressierung der restlichen 2 ICs nötig.

Hab ich alles schon mal ausprobiert aber solange ich die Ansteuerung des Shuntdrivers nicht ersetzen kann bleibt der Orginalcontroller drinnen.

Der ganze Kram mit Feldumschaltung ist leider kein Ersatz für das Orginal.

Gruß

Roman

von R.M - am 06.09.2015 09:56
Hallo Roman,

ich hatte heute einmal versucht, mit einem PWM-Signal aus einem Arduino, (mit Poti) den Shunt-Driver zu steuern. Leider ohne Erfolg. Die mit einem Multimeter messbare Spannungsänderung war sauber zu messen, und am Osci konnte man die Signale auch sauber sehen, Aber alles vorne an den ursprünglichen Anschlüssen des Carcontrollers.
Da der Driver ja über einen Optokoppler vom Carcontroller angesteuert wird, und dieser es auch nicht anders macht wie ich, gehe ich davon aus, dass mein Shunt-Driver nicht in Ordnung ist. Verstärkt wird diese Vermutung noch dadurch, dass sich der KEWET auch mit angeschlossenem Carcontroller genau so verhält, wie jetzt. Wie bereits geschrieben, bin ich damit nicht unzufrieden.
Wenn ich demnächst noch einmal Lust habe, dann werde ich den Shunt-Driver direkt ausmessen. Auch ein Tausch mit dem Driver aus meinem zweiten 5er sehe ich noch als Möglichkeit.
Dann habe ich heute versucht, das Signal aus dem vorhandenen Hallgeber zu verarbeiten. Bereits auf dem Osci sieht dieses etwas komisch aus, und mit einem angeschlossenen Arduino konnte ich nur sporadisch Signale auslesen. Ggf. benötige ich dafür noch eine Verstärker-Schaltung. Andererseits habe ich noch einen Hallsensor mit Magnetscheibe von einem Pedelec. Damit funktioniert der Arduino. Ich muss nun noch eine Möglichkeit finden diese zu installieren. Am Vorderrad sehe ich eine Möglichkeit.

@Claus
Dein Beispiel sieht gut aus, ist aber für das Display nicht notwendig, da für die Elektronik nur ein 16poliger Wannenstecker vorhanden ist, und die Belegung ist auf deiner Seite bereits vorhanden. Hat mir auch gut geholfen. Die restlichen Anschlüsse sind nur für die zusätzlich angebrachten LED's für Blinker usw. Und wie Roman schon schreibt, kann man die fehlenden Infos aus den Datenblättern ersehen. I2C ist ja nicht so kompliziert, aber die Ansteuerung ist schon ein wenig schwierig, da man erst einmal die Reihenfolge der LED's heraus bekommen muss.

elektrische Grüße
Peter

von hallootto - am 06.09.2015 20:33
Hallo

Der Hall Geber hat recht steile Flanken und eine hohe Frequenz, Logo scheidet da schon mal aus funktioniert höchstens mit runter teilen. Also könnte es beim Adurino das gleiche Problem sein.

An Linde Gabelstaplern war mal so ein Modul für die Feldschwächung vorhanden leider ist beim einzigen Modul das ich bis jetzt gesehen habe die Bezeichnung abgeschliffen.

Das display testen geht mit einem USB zu i2C Modul recht gut damit kann man die einzelnen Ausgänge ansteuern.


Gruß

Roman

von R.M - am 06.09.2015 21:09
Moin, Moin!

Nachdem ich in den letzten Wochen, auch durch den Einbau des EMUS-BMS, mich wieder mit dem Display beschäftigt habe, ist nun neben der Geschwindigkeitsanzeige auch die Kapa-Anzeige, und der Tages-Km-Zähler fertig.

Für die interessierten hier einmal das aktuelle Programm. Ist bestimmt in vielen Teilen noch optimierungsbedürftig, zeigt aber, dass es geht den Carcontroller zu ersetzen. Zumindest mit einem guten BMS. Nun überlege ich noch wie ich den Gesamt-Km-Zähler umsetze, insbesondere die Frage ob ich den internen EEPROM nutze, oder eine SD-Karte.

Alle die es nicht interessiert, mögen dies ignorieren.

Leider konnte ich den Code nicht genau so einfügen, wie er im Editor steht, weswegen die Kommentare teilweise schwieriger zu lesen sind , bzw. deren Inhalt verschoben ist.
Irgendwo ist noch ein Fehler, denn einige LED blinken mit zunehmender Geschwindigkeit. Aber es funktioniert.

elektrische Grüße
Peter
/*
KEWET-5-Tacho
-------------
Copyright Solarburg, Peter Woll

Example 39.1 - NXP SAA1064 I2C LED Driver IC Demo I
Demonstrating display of digits
[tronixstuff.com] > chapter 39
John Boxall July 2011 | CC by-sa-nc

Im DB steht auf Seite 6

C0 = 0 static mode, i.e. continuous display of digits 1 and 2
C0 = 1 dynamic mode, i.e. alternating display of digit 1 + 3 and 2 + 4
C1 = 0/1 digits 1 + 3 are blanked/not blanked
C2 = 0/1 digits 2 + 4 are blanked/not blanked
C3 = 1 all segment outputs are switched-on for segment test(1)
C4 = 1 adds 3 mA to segment output current
C5 = 1 adds 6 mA to segment output current
C6 = 1 adds 12 mA to segment output current
wobei es so anfängt

x C6 C5 C4 C3 C2 C1 C0

Was statt dem x steht ist egal

Wenn du bei max. Helligkeit den Segmenttest im Staticmode haben willst musst du &B01111110 schreiben.

Es ist für die Adresse egal, welchen Mode du nimmst. Wenn du den ADR Eingang auf GND gelegt hast ist die Adresse &H70
*/

#include // enable I2C bus
// #include
// #include

// Variablen definieren
// File Datei;
byte saa106470 = 0x70 >> 1; // definiert die I2C bus Adresse für das erste SAA1064 (pin 1 auf GND) ****
byte saa106472 = 0x72 >> 1; // definiert die I2C bus Adresse für das zweite SAA1064 (pin 1 auf 2V (3/8 VCC)) ****
byte saa106474 = 0x74 >> 1; // definiert die I2C bus Adresse für das dritte SAA1064 (pin 1 auf 3V (5/8 VCC)) ****
byte saa106476 = 0x76 >> 1; // definiert die I2C bus Adresse für das vierte SAA1064 (pin 1 auf VCC) ****
int LEDDisplay[11]={ 63, 6, 91, 79, 102, 109, 125, 7, 127, 111}; // Konstanten für die Darstellung der Ziffern Leer und 0 - 9
// hgfedcba a Wenn ein Dezimalpunkt dargestellt werden soll,
// 00111111 = 63 = Ziffer 0 ----- dann muss der Wert 128 zu dem Wert der Ziffer
// 00000110 = 6 = Ziffer 1 | | hinzuaddiert werden.
// 01011011 = 91 = Ziffer 2 f | | b So wird z.B. der Wert für die Drei mit Dezimalpunkt zu
// 01001111 = 79 = Ziffer 3 | | 79 + 128 = 207.
// 01100110 = 102 = Ziffer 4 -----
// 01101101 = 109 = Ziffer 5 | g |
// 01111101 = 125 = Ziffer 6 e | | c
// 00000111 = 7 = Ziffer 7 | |
// 01111111 = 127 = Ziffer 8 -----
// 01101111 = 111 = Ziffer 9 d . h (Dezimalpunkt)
// 10000000 = 128 = Dezimalpunkt
// ALT int digits[9]={ 1, 1, 2, 4, 8, 16, 32, 64, 128}; // Konstanten für die Darstellung der LED (einzelne LED)
int digits[9]={ 1, 1, 3, 7, 15, 31, 63, 127, 255}; // Konstanten für die Darstellung der LED (aufsteigender Balken)
// 00000000 = 0
// 00000001 = 1
// 00000011 = 3
// 00000111 = 7
// 00001111 = 15
// 00011111 = 31
// 00111111 = 63
// 01111111 = 127
// 11111111 = 255
int Block[8]={ 0, 0, 0, 0, 0, 0, 0}; // hier werden die Konstanten für LED-Block des Tachos gespeichert (6 x 8 bit, und 1 x 3 bit = 51 LED)
int BlockKapa[8]={ 0, 0, 0, 0, 0, 0, 0}; // hier werden die Konstanten für LED-Block der Kapazitätsanzeige gespeichert (2 x 8 bit = 16 LED)
int BlockGesantKmZaehler[5]={ 0, 0, 0, 0, 0}; // hier werden die Konstanten für jedes Digit des Gesamt-Km-Zählers gespeichert
int BlockTagesKmZaehler[4]={ 0, 0, 0, 0}; // hier werden die Konstanten für jedes Digit des Tages-Km-Zählers gespeichert
int ResetTaster = 0;
int LED = 0;
int LEDKAPA = 0;
int SOCPin = 0; //Analog-Pin für das Einlesen des SOC vom BMS
int thousand, hundred, ten, one;
int SOCWert = 0; // Variable für den SOC-Wert
int SOCWertAlt = 0;
long Weg = 0;
int WegKm = 0;
int DZaehler = 0;
double RadUmfang = 1760; // Radumfang in mm
// Reifengröße: 145 80 13 = 1766 mm (1760 mm gemessen)
// Reifengröße: 155 65 13 = 1670 mm

// Beim KEWET CityJet 5 sind 5 Digits für den Km-Zähler, und 4 Digits für den Tages-Km-Zähler vorhanden.
// Man kann also bis 99.9999 Km darstellen,
// der Tages-Km-Zähler kann entweder 999,9 Km oder 9999 Km darstellen.
// Somit könnte man bis 999,9 in 100 Meter, und darüber hinaus nur noch in Km anzeigen.

// Über einen Digital-Eingangs-Pin, z.B. D12 kann der vorhandene Reset-Taster angebunden werden,
// damit kann man den Tages-Km-Zähler resetten.

// --------------------------------------------------------------------------------------------------------------
void setup()
{
Wire.begin(); // start up I2C bus
delay(50);
InitDisplay();
StartCounting();
pinMode(9,OUTPUT); // Signal für die Compoundwicklung
pinMode(10,OUTPUT); // für "Hodometer Select" Gesamt-Km-Zähler 1.-4. Stelle I2C-Baustein aktive Low
pinMode(11,OUTPUT); // für 5. "Hodometer"-Stelle + Kl. VU Meter Select (die 3 LED grün-gelb-rot) aktive Low
pinMode(12,INPUT); // Reset-Taster für Tages-Km-Zähler
}


// --------------------------------------------------------------------------------------------------------------
void StartCounting()
{ // sets hardware timer 1 as a hardware impulse counter on D4
noInterrupts();
TCCR1A=0; // reset timer/counter control register A
bitSet(TCCR1B ,CS12); // Counter Clock source is external pin
bitSet(TCCR1B ,CS11); // Clock on rising edge
TCNT1 = 0; // reset the hardware counter
interrupts();
}

// --------------------------------------------------------------------------------------------------------------
void InitDisplay()
{
Wire.beginTransmission(saa106470); // Tacho, die ersten 4 x 8 LED
Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
Wire.write(B01100111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 18mA segment current
Wire.endTransmission();
Wire.beginTransmission(saa106472); // Tages-Km-Zähler
Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 18mA segment current
Wire.endTransmission();
Wire.beginTransmission(saa106474); // Gesmat-Km-Zähler, und Kapazität, und ECO-LED
Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 18mA segment current
Wire.endTransmission();
Wire.beginTransmission(saa106476); // Tacho, die zweiten 4 x 8 LED (benutzt werden allerdings nur die ersten 2 Bytes komplett, und 3 LED im 3. Byte)
Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
Wire.write(B01100111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 18mA segment current
Wire.endTransmission();
}

// --------------------------------------------------------------------------------------------------------------
void ClearDisplay()
// clears all digits
{
Wire.beginTransmission(saa106470);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2
Wire.write(0); // digit 3
Wire.write(0); // digit 4 (LHS)
Wire.endTransmission();

Wire.beginTransmission(saa106472);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2
Wire.write(0); // digit 3
Wire.write(0); // digit 4 (LHS)
Wire.endTransmission();

digitalWrite(10, LOW); // aktive low - Signal zur Umschaltung der SAA 1064 Bausteine (5/74)
digitalWrite(11, HIGH);
Wire.beginTransmission(saa106474);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2
Wire.write(0); // digit 3
Wire.write(0); // digit 4 (LHS)
Wire.endTransmission();

digitalWrite(10, HIGH); // aktive low - Signal zur Umschaltung der SAA 1064 Bausteine (5/74)
digitalWrite(11, LOW);
Wire.beginTransmission(saa106474);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2
Wire.write(0); // digit 3
Wire.write(0); // digit 4 (LHS)
Wire.endTransmission();
digitalWrite(10, LOW);

Wire.beginTransmission(saa106476);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2
Wire.write(0); // digit 3
Wire.write(0); // digit 4 (LHS)
Wire.endTransmission();
}

// --------------------------------------------------------------------------------------------------------------
void DisplayDigits() // Tacho-Werte ausgeben
{
Wire.beginTransmission(saa106470);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(Block[1]); // digit 1 (RHS)
Wire.write(Block[3]); // digit 2
Wire.write(Block[2]); // digit 3
Wire.write(Block[4]); // digit 4 (LHS)
Wire.endTransmission();

Wire.beginTransmission(saa106476);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(Block[5]); // digit 1 (RHS)
Wire.write(Block[7]); // digit 2
Wire.write(Block[6]); // digit 3
Wire.write(0); // digit 4 (LHS)
Wire.endTransmission();

// Tages-Km aufbereiten ---------------------------------------------------
//Weg = 123400; // Testwert
WegKm = Weg / 5 * RadUmfang / 100000; // Weg = gezählte Impulse, 5 pro Radumdrehung, RadUmfang im mm, durch 100000 weil mm / 1000 = Meter und / 100 weil eine Nachkommastelle (100 Meter) angezeigt werden soll
thousand = WegKm/1000;
hundred = (WegKm-(thousand*1000))/100;
ten = (WegKm-((thousand*1000)+(hundred*100)))/10;
one = WegKm-((thousand*1000)+(hundred*100)+(ten*10));
Wire.beginTransmission(saa106472);
Wire.write(1);
if (thousand == 0) { Wire.write(0); }
else { Wire.write(LEDDisplay[thousand]); }
if (hundred == 0)
{
if (thousand == 0) { Wire.write(0); }
else { Wire.write(LEDDisplay[hundred]); }
}
else { Wire.write(LEDDisplay[hundred]); }
Wire.write(LEDDisplay[ten]+128);
Wire.write(LEDDisplay[one]);
Wire.endTransmission();

// Wire.beginTransmission(saa106472);
// Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
// Wire.write(0); // digit 1 (RHS) höchstes Digit im Tages-Km-Zähler
// Wire.write(LEDDisplay[2]); // digit 2 zweites
// Wire.write(LEDDisplay[3]+128); // digit 3 drittes
// Wire.write(LEDDisplay[4]); // digit 4 (LHS) niedrigstes Digit
// Wire.endTransmission();

digitalWrite(10, HIGH); // aktive low - Signal zur Umschaltung der SAA 1064 Bausteine (5/74)
digitalWrite(11, LOW);
Wire.beginTransmission(saa106474);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(LEDDisplay[3]); // niedrigstes Digit im Gesamt-Km-Zähler LEDDisplay[8]
Wire.write(BlockKapa[2]); // obere 8 LED der Kapazitätsanzeige
Wire.write(BlockKapa[1]); // untere 8 LED der Kapazitätsanzeige
Wire.write(0); // ECO-LED, links (grün) = 1, Mitte (gelb) = 2, rechts (rot) = 3
Wire.endTransmission();

digitalWrite(10, LOW); // aktive low - Signal zur Umschaltung der SAA 1064 Bausteine (3/74)
digitalWrite(11, HIGH);
Wire.beginTransmission(saa106474);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(LEDDisplay[2]); // digit 1 (RHS) höchstes Digit im Gesamt-Km-Zähler
Wire.write(LEDDisplay[8]); // digit 2 zweites
Wire.write(LEDDisplay[5]); // digit 3 drittes
Wire.write(LEDDisplay[4]); // digit 4 (LHS) viertes
Wire.endTransmission();
digitalWrite(10, LOW);

}


// --------------------------------------------------------------------------------------------------------------
void loop()
{
static unsigned long lastSampleMillis;
if (millis()-lastSampleMillis>=1000)
{
lastSampleMillis=millis();
noInterrupts();
long count = TCNT1; // read hardware counter
TCNT1 = 0; // reset the hardware counter
interrupts();
//Serial.println(count * 12 * 60 * (RadUmfang / 1000000) / 2); // 0.001766
LED = count * 12 * 60 * (RadUmfang / 1000000) / 2;

Weg = Weg + count;

} // ENDE if (millis()-lastSampleMillis>=1000)

// Ausgangs-Pin 9 für das Compoundfeld abhängig von der Geschwindigkeit schalten
if (LED >=2) // über 4 Km/h
{
if (LED = 16) { SOCWert = 16; } // sicher stellen, dass kein Wert über 16 entstehen kann

for (int z=1; z

von hallootto - am 28.05.2016 09:43
Moin, Moin!

Leider hat es zur Speicherung der Km-Zähler noch nicht gereicht, aber hier noch ein Bild vom heutigen Tag.


elektrische Grüße
Peter

von hallootto - am 05.06.2016 20:40
Moin, Moin!

So ich habe das Problem mit den flackernden Displays nun auch gelöst.

Am Anfang von "void DisplayDigits" muss man die beiden zusätzlichen Steuerleitungen auf LOW ziehen, sonst haben die Befehle für den Tacho einen Einfluss auf die anderen SAA1064. Darüber hinaus habe ich zwei Optokoppler an die beiden Ausgänge geschaltet, und schalte damit die beiden zusätzlichen Umschaltleitungen.

// --------------------------------------------------------------------------------------------------------------
void DisplayDigits() // Tacho-Werte ausgeben
{
digitalWrite(10, LOW);
digitalWrite(11, LOW);
Wire.beginTransmission(saa106470);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(Block[1]); // digit 1 (RHS)
Wire.write(Block[3]); // digit 2
Wire.write(Block[2]); // digit 3
Wire.write(Block[4]); // digit 4 (LHS)
Wire.endTransmission();

Nun noch das Speichern der Km-Zähler.

to be continued
Peter

von hallootto - am 26.06.2016 07:51
Zur Information:
MySnip.de hat keinen Einfluss auf die Inhalte der Beiträge. Bitte kontaktieren Sie den Administrator des Forums bei Problemen oder Löschforderungen über die Kontaktseite.
Falls die Kontaktaufnahme mit dem Administrator des Forums fehlschlägt, kontaktieren Sie uns bitte über die in unserem Impressum angegebenen Daten.