Dies ist eine sehr umfangreiche Projektdokumentation geworden. Ich empfehle beim Lesen die Verwendung der Links aus dem Inhaltsverzeichnis und die Browser-Navigation zu verwenden.

Einführung

Übersicht

ULA-Ersatzmodul
Das ULA-Modul
Worum geht's?
Der Sinclair C5 besitzt einen ULA-Chip (uncommitted logic array), welcher alle Steuerungsaufgaben erledigt.
Ich habe ein Modul entwickelt, welches diesen Chip ersetzen kann und um ein paar zusätzliche Funktionen (wie z.B. einen Pedelec-Modus) erweitert.

Besonderheiten?
  • Für den originalen ULA-Chip gab es bisher kein Ersatz bei Verlust oder Defekt.
  • Mein Modul ermöglicht es, den C5 im Pedelec-Modus zu betreiben und damit ganz legal zulassungs- und versicherungsfrei innerhalb der EU zu fahren.
  • Es besteht die Möglichkeit einen Motorlüfter mit dem Ersatzmodul anzusteuern.
  • Fahrdaten wie Geschwindigkeit, Motorstrom, Batteriespannung werden über eine serielle Schnittstelle ausgegeben und können z.B. von einem PC angezeigt werden.
  • Das Projekt ist open source und freeware. Jeder ist dazu eingeladen es zu erweitern, zu ergänzen und weiterzugeben. Siehe dazu auch im Kapitel Lizenz.

Das Projekt gliedert sich in folgende Teile:

Zu diesem Dokument

Der einfachste Weg das ULA-Ersatzmodul zu verwenden ist, den originalen Chip damit zu ersetzen, einen zusätzlichen Widerstand in der Control-Box einzulöten und einen anderen auszulöten. Fertig.
Darüber hinaus gibt es aber noch mehr Optionen, z.B. einen Lüfter anzuschließen, Software-Einstellungen zu ändern oder gar eine komplett eigene Software zu entwickeln.

Diese Möglichkeiten setzen unterschiedliche Kenntnisse und Fähigkeiten voraus, weshalb ich die Anleitungen in folgende Abschnitte unterteile:
  1. für Umrüster (Installation des Ersatzmoduls),
  2. für Bastler (Pedelec-Sensoren anschließen, Software-Einstellungen ändern und neue Software aufspielen, Anschluss eines Motorlüfters)
  3. für Tüftler (Zusammenbau des Moduls, Auslesen der Fahrdaten, Entwicklung eigener Software).

Hintergrund

Bei der Entwicklung des Sinclair C5 in den frühen 80ern wurde viel Wert auf einfache und gewöhnliche Komponenten gelegt, um die Herstellungskosten niedrig zu halten.
Die Einfachheit und der Verzicht auf Spezialteile hat natürlich auch zur Folge, dass der C5 für nahezu jeden sehr gut instandsetzbar ist.
Allerdings gibt es eine Sache, welche nicht repariert werden kann: der ULA-Chip.
Dieser Chip (ein uncommitted logic array) ist sozusagen das "Gehirn" des C5.
Wenn dieser Chip verloren geht oder defekt ist, kann der C5 zwar immer noch verwendet werden - allerdings ohne Überwachung des Motorstroms und ohne das charakteristische LED-Display.

Wie ich schon im C5-Tagebuch geschrieben hatte, arbeitete ich da gerade an einem Prototyp einer Tacho-Einheit mit großem Display, Eingabetasten, Funkuhr, usw., welche die komplette Anzeige- und Steuereinheit des C5 (das POD) ersetzen sollte.
Inzwischen habe ich mich allerdings anders entschieden und stattdessen dieses Ersatzmodul entwickelt, welches anstelle des ULA-Chip in das POD eingesteckt wird und diesen simuliert.

Motivation

Die Motivation zur Entwicklung dieses Moduls war für mich, auf relativ einfache Weise den C5 zum Pedelec umzubauen.
Als weiteres Ziel sollte dieses die Möglichkeit bieten über eine Schnittstelle die aktuellen Fahrdaten auszulesen um diese ggf. später mal mit einem zusätzlichen Anzeigemodul darstellen zu können.
Und nicht zuletzt beabsichtige ich mit dem Modul allen C5-Besitzern einen Ersatz für verlorene oder defekte ULA-Chips anbieten zu können.

Features

Folgend mal die Möglichkeiten, welches dieses kleine Modul bietet:
  • Messen der Batteriespannung und des Motorstroms
  • Ansteuerung der LED-Balken für Strom und Spannung wie beim Original
  • Messen der Motortemperatur
  • Ansteuern eines Motorlüfters möglich
  • Messen der Fahrgeschwindigkeit
  • Messen der Pedalierfrequenz
  • Messen der zurückgelegten Strecke
  • Pedelec-Modus - erlaubt den Betrieb innerhalb der EU ohne Zulassung/Versicherung
  • Interne Selbsttests
  • Ausgabe aller Betriebsdaten über eine serielle Schnittstelle
  • Ein Bootloader ermöglicht das Aufspielen neuer oder eigener Software

Es handelt sich somit um einen vollwertigen Ersatz für den bisherigen ULA-Chip, welcher darüber hinaus noch ein paar Extras bietet.

Lizenz

Dieses Projekt ist dazu gedacht, von Bastlern nachgebaut und ggf. weiter verbessert zu werden. Die Lizenzen für die Projektteile erlauben daher explizit die Verbreitung und Weitergabe im nicht-kommeriezellen Rahmen:
Projektbestandteil Lizenz Bedingungen
Schaltplan und Layout der Platine Creative Commons Lizenzvertrag Creative Commons by-nc-sa 3.0
  • Namensnennung
  • Nicht-kommerziell
  • Weitergabe unter gleichen Bedingungen
Firmware Creative Commons Lizenzvertrag Creative Commons by-nc-sa 3.0
  • Namensnennung
  • Nicht-kommerziell
  • Weitergabe unter gleichen Bedingungen
Bootloader-Software Creative Commons Lizenzvertrag Creative Commons by-nc-sa 3.0
  • Namensnennung
  • Nicht-kommerziell
  • Weitergabe unter gleichen Bedingungen
Uploader-Tool (Quelltext und Executable) Creative Commons Lizenzvertrag Creative Commons by-nc-sa 3.0
  • Namensnennung
  • Nicht-kommerziell
  • Weitergabe unter gleichen Bedingungen
crc_calc-Tool (Quelltext und Executable) Creative Commons Lizenzvertrag Creative Commons by-sa 3.0
  • Namensnennung
  • Weitergabe unter gleichen Bedingungen
Jegliche Dokumentation zu diesem Projekt Creative Commons Lizenzvertrag Creative Commons by-sa 3.0
  • Namensnennung
  • Weitergabe unter gleichen Bedingungen

Um die Lizenzen im Detail anzusehen, bitte den Links aus obiger Tabelle folgen, oder einen Brief an
Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA
schicken.

Glossar

Begriff / Abkürzung Beschreibung
ATmega88 Verwendeter Mikrocontroller für das Ersatzmodul.
Bootloader Bestandteil der Software des Ersatzmoduls, welche das Einstellen von Konfigurationswerten und Aufspielen neuer Firmware ermöglicht.
Control-Box Elektronikkasten unterhalb des Sitzes mit Motorrelais, Stromverteilung, ...
ESD Elektrostatische Entladung.
Firmware Bestandteil der Software des Ersatzmoduls, welche die Funktionalität des bisherigen ULA-Chips emuliert.
IC Integrierter Schaltkreis
ISR Interrupt Service Routine; Funktion die beim Auftreten eines bestimmten Interrupts aufgerufen wird.
Pedelec Eine Art von Elektrofahrrad, bei dem sich der Motor nur aktivieren lässt, wenn der Fahrer zeitgleich auch in die Pedale tritt. Zulassungs- und versicherungsfrei innerhalb der EU.
PN Programmer's Notepad. Editor für Source Code.
POD Display-Modul des C5. Enthält den ULA-Chip.
RS232 Ein Standard für serielle Datenübertragung.
ULA Uncommitted Logic Array. Integrierter Schaltkreis welcher die Steuerlogik beinhaltet.
WinAVR Software-Paket mit Entwicklungstools für Atmel-Mikrocontroller.

Technische Umsetzung

Vorüberlegungen

ULA-Chip
Der originale ULA-Chip des Sinclair C5
Um den ULA-Chip zu simulieren, muss man wissen, wie er funktioniert. Abgesehen von meinen eigenen Untersuchungen haben dazu ganz entscheidend die Dokumente auf c5alive.co.uk beigetragen.

Ein dickes DANKE hierfür an alle Autoren!

Der ULA-Chip ist ein 28pin Chip im DIL-Gehäuse. Das schränkt den Platz für ein Ersatzmodul entsprechend ein.
ULA-Ersatzmodul
ULA-Ersatzmodul in der Fassung des alten Chips.
Der Chip steckt in einer IC-Fassung im POD. Nach oben hin ist im Gehäuse noch reichlich Platz, so dass problemlos Steckerleisten o.ä. platziert werden können. Unmittelbar rechts vom ULA-Chip sind auf der POD-Platine nur niedrige Bauteile, so dass die Platine der Ersatzschaltung, welche auf die ULA-Fassung gesteckt wird, hier noch ein paar Millimeter überragen kann.

Da das Ersatzmodul auf die Fassung des ULA-Chips gesteckt wird, ist man natürlich an die vorgegebene Pin-Konfiguration gebunden:
ULA-Chip pinout
Verwendete Pins

Somit ergeben sich Platinenmaße von ca. 49 x 19 mm. Da das recht eng ist, mussten, soweit möglich, SMD-Bauteile verwendet werden.

Controller

ATmega circuit
Beschaltung des Controllers
Bei der Auswahl des Controllers habe ich mich für einen ATmega88 entschieden, welcher hier mit 16MHz läuft.
Der Controller hat 8kB Flash, 512 Byte EEPROM und lässt sich über ein ISP-Interface (In-System Programming) beschreiben.

Die nötige Beschaltung für den Controller beschränkt sich auf ein Minimum:
R1 ist der Pullup-Widerstand für die Resetleitung, C3 dient der Glättung der Betriebsspannung und C1, C2 und Q1 bieten die Taktquelle.
Auch das ISP-Interface ist als 10poliger Anschluss auf der Platine herausgeführt und entspricht dem Atmel-Standard.

LED-Ansteuerung

Zur Ansteuerung der LEDs des POD sind keine weiteren Bauteile auf dem Ersatzmodul erforderlich.
Die Leitungen MUX_CURRENT und MUX_FUEL gehen direkt an die Multiplexertransistoren. Bei der Entwicklung des Ersatzmoduls habe ich übrigens festgestellt, dass diese Transistoren durch BC557 ersetzbar sind.
Softwareseitig geschieht das Multiplexing durch einen Timer des ATmega. Jede Millisekunde wird zwischen Spannung und Strom gewechselt, so dass eine flackerfreie Anzeige entsteht.

Spannungsmessung

Wie man hier sehen kann, wird die 12V Batteriespannung über einen 47k-Widerstand an den ULA-Chip gegeben (Pin 1).
Zusammen mit einem weiteren 15k-Wiederstand gegen Masse auf dem Ersatzmodul ergibt dies einen Spannungsteiler mit Faktor 0.32. D.h. aus 12V Batteriespannung werden 3.83V am AD-Eingangspin ADC0 des ATmega. Der ATmega löst mit seinem AD-Wandler Spannungen zwischen 0V und AREF (5V) mit 10 Bit auf.
Daraus folgt:
12V Batteriespannung * 15k/47k = 3.83V
3.83V/5.04V * 1024 = 784 (Die Ausgangsspannung des 7805-Reglers beträgt ziemlich exakt 5.04V)
⇒ 784 ist der zu erwartende Wert des AD-Wandlers für 12V Batteriespannung.

Mit dem gewählten 15k-Widerstand sind Spannungen bis 15.8V messbar:
5.04V * 47k/15k = 15.792V
Da eine Autobatterie bei Spannungen über 14.4V Schaden nimmt, ist diese Dimensionierung also völlig ausreichend.

Strommessung

Die Messung des Motorstroms beim originalen ULA-Chip funktioniert wie folgend:
Der Spannungsabfall über einem 1mΩ Shunt wird einem Operationsverstärker in der Control-Box im Heck zugeführt.
1A Motorstrom resultiert also in 1mV Eingangspannung.
Dieser Wert wird durch einen DAC im ULA-Chip variabel verstärkt. Konkret heißt das, der Verstärkungsfaktor wird solange erhöht, bis ein bestimmter Ausgangswert erreicht ist. Anhand der Verstärkung kann man dann zurückrechnen, welcher Eingangsspannung dieser Wert entspricht. Der Vorteil dabei ist, dass sich so auch kleine Ströme extrem verstärken lassen um sie exakt zu messen.
Wirklich eine sehr clevere Methode!
Zusätzlicher Transistor
47k-Widerstand auf Unterseite angelötet.
Aber - leider hat der ATmega88 keinen DAC! Und einen externen DAC auf der Platine unterzubringen war wegen der Platzverhältnisse nicht möglich.
Um dennoch den Motorstrom irgendwie messen zu können, habe ich die Verstärkung des OPV mit einem zusätzlichen 47k-Widerstand auf einen festen Wert gebracht:
Der 47k-Widerstand befindet sich zwischen Pin 7 und Pin 3 am OPV in der Control-Box.


Der Verstärkungsfaktor des OPV ist nun fest eingestellt auf 1 + 47k/2.7k (⇒ Faktor 18.4):
OPV output
Verstärkung des OPV: grün = Ausgangsspannung, rot = Eingangsspannung (1mV entspricht 1A Motorstrom)

Diese Verstärkung ist geeignet Ströme bis ca. 160A zu messen. Allerdings ist zu berücksichtigen, dass das Messergebnis durch das lange Kabel zwischen OPV und POD erheblichen Störungen unterliegt, was sich besonders bei niedrigen Strömen bemerkbar machen kann.

Es ist zwar schade, dass das Prinzip der variablen Verstärkung mit dem ATmega nicht realisiert werden konnte, aber auf der anderen Seite wurde so die Emitterleitung zwischen POD und Control Box nicht mehr benötigt und kann nun zur Ansteuerung eines Motorventilators verwendet werden.

Temperaturmessung

Die Messung der Motortemperatur erfolgt mit einem temperaturabhängigen Widerstand. Zusammen mit den Widerständen R9 und R20 im POD ergibt sich ein Spannungsteiler. Der Spannungswert an Pin VtH wird dem AD-Wandler zugeführt und von der Software in eine Temperatur umgerechnet.
Bedingt durch Widerstandstoleranzen und Unlinearität ist das Ganze zwar relativ ungenau, aber für den Zweck völlig hinreichend.

Motortaster

Der Taster am Lenker des C5, welcher dem Einschalten des Motors dient, hängt mit einem Anschluss direkt an +12V.
Wird der Taster geschlossen, wird diese Spannung über einen 15k-Widerstand an Pin 21 des ULA-Chip geleitet.
Auf der Platine des Ersatzmoduls bildet ein weiterer Widerstand mit 4.7kΩ ein Spannungsteiler mit Faktor 4.7k/15k = 0.31.
Aus den 12V werden so verträgliche 3.76V, welche an einen AD-Eingang geführt werden.

Motorrelais

Die Leitung zum Aktivieren des Motorrelais ist direkt mit einem Controller-Pin verbunden und erfordert keine weitere Hardware. Bitte beachten: wenn dieses Signal aktiviert ist, muss trotzdem erst auch der Motortaster gedrückt werden damit das Relais geschaltet wird.

Lüfter

Da der Emitterausgang (Pin 4 des ULA-Chip) zur Temperaturmessung nicht mehr benötigt wird, und ich am ATmega88 noch ein IO-Pin übrig hatte, kann mit diesem Anschluss ein Lüfter oder anderer Verbraucher geschaltet werden.
Um einen 12V-Lüfter oder ein Relais zu betreiben muss man aber noch einen Transistortreiber vorschalten.

Über den Bootloader kann eine Temperatur eingestellt werden, ab welcher der Lüfter aktiviert werden soll.
Der Lüfter wird ebenfalls immer aktiviert, wenn die Motortemperatur 70°C überschreitet.

Lautsprecher

Wenn die Motortemperatur dauerhaft 70°C übersteigt oder die Stromaufnahme zu hoch ist, wird der Piezo-Lautsprecher im POD durch ein Rechtecksignal aktiviert.

Tachosignal

Das ULA-Ersatzmodul bietet die Möglichkeit einen Reed-Schalter anzuschließen, welcher durch einen Magneten am einem der Räder geschlossen wird.
Mit dem Bootloader kann der Radumfang des Rades eingegeben werden.
Somit kann die Software auf dem ATmega die derzeitige Fahrgeschwindigkeit errechnen und über die serielle Schnittstelle ausgeben.

Pedalsignal

Das Ersatzmodul bietet zudem die Möglichkeit einen zweiten Reed-Schalter anzuschließen, welcher durch einen Magneten am Pedalritzel geschlossen wird.
Somit kann die Software feststellen ob und mit welcher Umdrehungszahl pedaliert wird.
Diese Information ist relevant um den C5 als Pedelec zulassungsfrei in der EU zu betreiben.

Serielle Schnittstelle

Die serielle Schnittstelle dient dazu über den Bootloader Einstellungen (z.B. den Radumfang) vorzunehmen und ggf. neue oder eigene Software aufzuspielen.
Die serielle Schnittstelle wird mit 9600 Baud betrieben. Wichtig ist, dass die herausgeführten Signale auf der Platine 5V-Pegel haben und auf keinen Fall direkt mit einem COM-Port verbunden werden dürfen!
Zum Anschluss an einen Computer ist ein Pegelwandler nötig.

Allgemeine Anleitung


Funktionsweise

Das Ersatzmodul imitiert die Funktionsweise des originalen ULA-Chips so weit wie möglich. Es gibt aber auch ein paar Besonderheiten, auf die ich folgend eingehen möchte.

Einschaltvorgang

Direkt nach dem Einschalten werden die mittleren gelben LEDs des POD für 2 Sekunden flackern. In dieser Zeit ist das Bootloader-Programm aktiv und wartet ab, ob neue Firmware aufgespielt oder Konfigurationseinstellungen geändert werden sollen:
LED-Display während des Boot-Vorgangs

Wie das Bootloader-Programm bedient wird, ist weiter unten beschrieben.

Hauptprogramm

Nach dem Timeout des Bootloaders startet dieser die eigentliche Firmware.
Diese initialisiert alle Software- und Hardwaremodule, lädt die Konfigurationseinstellungen aus dem EEPROM-Speicher und gibt eine Begrüßungsmeldung über die serielle Schnittstelle aus.

Beispiel:
ULA replacement V1164 CRC: 0x5B80E61F PM: 1 WS: 1280mm LMX: 250 LMN: 30 FT: 45

In dieser Ausgabe steht die Versionsnummer der Firmware und ihre CRC32-Summe.
Die weiteren Angaben zeigen an,
  • ob der Pedelec-Modus aktiv ist (PM = 1) oder inaktiv (PM = 0),
  • welchen Umfang in Millimetern das Rad mit dem Tachosensor hat (WS),
  • bis zu welcher Geschwindigkeit Motorunterstützung verfügbar ist (LMX) wenn der Pedelec-Modus aktiv ist (250 entspricht 25.0 km/h),
  • ab welcher Geschwindigkeit Motorunterstützung verfügbar ist (LMN) wenn der Pedelec-Modus aktiv ist (30 entspricht 3.0 km/h)
  • und ab welcher Motortemperatur ein ggf. angeschlossener Lüfter aktiviert werden soll (FT-Angabe in °C).

Hauptschleife

Nach Initialisierung und Begrüßungsmeldung werden im normalen Betrieb über die serielle Schnittstelle alle 256ms folgende Informationen ausgegeben:

#DIST|SPEED|RPM|TIMEOUT|SWITCH|TEMP|VOLT|VREF|CURR|ENA|COND|TIME

Die Ausgabe beginnt mit einem '#'-Zeichen und wird mit einem Newline-Zeichen ('\n') beendet.

InformationBeschreibung
DIST zurückgelegte Strecke (in mm)
SPEED aktuelle Geschwindigkeit in Zehntel km/h (123 entspricht 12.3km/h)
RPM aktuelle Pedalierrate in Umdrehungen pro Minute
TIMEOUTfür den Pedelec-Modus: Zeit in ms die verbleibt, bis der Motor deaktiviert wird, da nicht mehr mitgetreten wird
SWITCH 0 wenn der Motortaster nicht gedrückt ist; sonst beliebiger Wert <=1023
TEMP AD-Wert der Motortemperatur
VOLT AD-Wert der Batteriespannung
VREF AD-Wert der Referenzspannung (einstellbar mit dem Poti im POD)
CURR AD-Wert des Motorstroms
ENA 0 wenn Motorrelais disabled ist; sonst 1
COND Sicherheitszustand. 0 wenn alles ok ist.
TIME Systemzeit in Millisekunden

LED-Anzeige

Wie auch beim originalen ULA-Chip werden die beiden LED-Balken im Multiplexbetrieb angesteuert (jedoch mit 1kHz deutlich schneller als bisher), wobei links der Motorstrom angezeigt wird und rechts die Batteriespannung.

Die angezeigte Batteriespannung entspricht der Durchschnittsspannung der letzten 20 Sekunden. D.h. ein kurzer Spannungseinbruch beim Einschalten des Motors wird ggf. gar nicht angezeigt; ein langsames Nachlassen der Batteriespannung hingegen schon.
Beim originalen ULA-Chip konnte die Spannungsanzeige nach dem Einschalten nur sinken - hatte sich die Batteriespannung während einer Pause etwas erholt, wurde dies nicht an den LEDs angezeigt.

Die Stromanzeige zeigt stets den momentanen Stromfluss an.

Schutzmechanismen

Wenn die durchschnittliche Batteriespannung einen Referenzwert unterschreitet, welcher mit dem Poti im POD eingestellt werden kann, wird ein Spannungsfehler angezeigt. In diesem Zustand kann der Motor nicht mehr aktiviert werden. Um die Batterie zu schonen, sollte er auch nicht mehr aktiviert werden, wenn sich die Spannung daraufhin wieder etwas erholt.

Wenn der aktuelle Strombedarf einen bestimmten Wert überschreitet wird zuerst eine Stromwarnung angezeigt. Überschreitet der Strombedarf der letzten 10 Sekunden einen Grenzwert, wird ein Stromfehler angezeigt. In beiden Fällen kann der Motor nicht aktiviert werden.

Wenn die Motortemperatur dauerhaft 70°C überschreitet, wird eine Temperaturwarnung angezeigt. Erreicht sie 80°C wird ein Temperaturfehler angezeigt und der Motor kann nicht aktiviert werden.

Fehleranzeige

Ich kam zu der Ansicht, dass es sehr wichtig ist, im Fehlerfall die genaue Ursache ermitteln zu können. Zugleich sollte möglichst immer die Batteriespannung ablesbar sein. Somit bleibt zur Anzeige der Fehlerursache eigentlich nur noch der LED-Balken für den Motorstrom übrig.
Ausgehend von diesen Überlegungen habe ich folgende Fehleranzeigen implementiert (sorry, dass ich dieses GIF-Geblinke hier zumute):
EreignisLED-AnzeigeLautsprecher
Spannungswarnung aus
Spannungsfehler aus
Stromwarnung Piepton
Stromfehler Piepton
Temperaturwarnung Piepton
Temperaturfehler Piepton
Eine weiße LED bei diesen Beispielen soll dabei bedeuten, dass der LED-Balken normal arbeitet. Im Falle einer Spannungswarnung beispielsweise blinkt zwar die rechte rote LED der Stromanzeige, aber die Batterieanzeige ist normal lesbar.

Auch Kombinationen dieser Fehler sind möglich - ein Beispiel:

Na, was bedeutet das?

Lösung:
Die Spannungsanzeige blinkt nicht, also zeigt sie ganz normal die Batteriespannung an. Die Stromanzeige zeigt eine Stromwarnung an (grüne LED) und einen Temperaturfehler (gelb-rot).

Anleitung für Umrüster

Dieser Abschnitt richtet sich an C5-Fahrer, welche das Ersatz-Modul von mir oder jemand anderem fertig aufgebaut bekommen haben und in ihren C5 einbauen wollen.

Ein paar Worte zu ESD

BITTE LESEN: Bevor es losgeht, möchte ich darauf hinweisen, dass elektronische Bauteile wie der Mikrocontroller sehr empfindlich auf elektrostatische Ladungen (ESD) reagieren.
Solche Ladungen entstehen im Alltag nahezu überall. Z.B. beim Laufen über Teppichböden, beim Hantieren mit Plastikfolien, Tragen von Fleecekleidung, etc.
Dabei können Spannungen von einigen tausend Volt entstehen. Und auch wenn sie für uns normalerweise völlig harmlos sind, können sie den Controller zerstören.
Es ist darum unbedingt wichtig sich zu entladen, bevor man das Ersatzmodul oder damit verbundene Kabel anfasst.
Entladen kann man sich mit speziellen ESD-Ableitkabeln aber auch z.B. durch Berühren eines Heizkörpers oder Wasserhahns.

Installation

  1. Zuerst sollte man zwecks besserer Handhabung das POD vom C5 entfernen.

  2. Nachdem das POD aufgeschraubt wurde, wird der ULA-Chip aus seiner Fassung gezogen. Es gibt spezielle Werkzeuge zum Herausziehen von ICs, mit etwas Geschick lässt sich das IC aber auch mit einem flachen Schraubendreher aus der Fassung hebeln. Es ist aber darauf zu achten, dass man dabei keine Beinchen knickt oder abbricht.

  3. Anschließend wird das Ersatzmodul, wie auf der Abbildung unten, in die Fassung eingesteckt:
    Ersatzmodul im POD
    Ersatzmodul im POD.

    Dabei darauf achten, dass es nicht versetzt eingesteckt wird. Jedes Beinchen muss gesteckt sein.

  4. Das POD kann jetzt wieder zugeschraubt und eingebaut werden.

  5. Leider war es das noch nicht: auch die Control-Box muss ausgebaut und geöffnet werden.

  6. In der Control-Box befindet sich ein 8-beiniges Operationsverstärker-IC (Aufschrift LM358). Bei diesem IC muss zwischen Pin 7 und Pin 3 ein 47kΩ-Widerstand angelötet werden. Dies kann entweder auf der Platinenoberseite erfolgen, oder auf der Unterseite wie auf dem Bild unten:
    Zusätzlicher 47k-Widerstand
    Zusätzlicher 47k-Widerstand am OPV.

    An dieser Stelle noch ein Tipp:
    Dieser OPV geht häufig kaputt. Ich empfehle dringend ihn mit +5V an Pin 8 zu versorgen, statt mit +12V wie im Original. Außerdem bietet sich die Verwendung eines 8pin-IC-Sockels an, um den OPV im Falle eines Defekts schnell wechseln zu können.

  7. Jetzt muss noch der Widerstand R5 in der Control-Box entfernt werden. Er befindet sich in der nähe des OPV.

  8. Der Kabelstrang, welcher POD und Control-Box verbindet, mündet in der Control-Box am Stecker X9.
    An diesem Stecker muss das Kabel an Pin 8 (C5 Emitter) entfernt werden.
    Dieses Kabel führt direkt an einen Mikrocontroller-Ausgang und kann dazu verwendet werden einen Lüfter anzusteuern.

Das war's. Nachdem die Control-Box wieder geschlossen und eingebaut wurde, kann die Fahrt losgehen!

Anleitung für Bastler

Der C5 als Pedelec

Um den C5 als Pedelec zu betreiben benötigt man zuerst zwei Reed-Schalter nebst Magneten.
Diese kann man z.B. von alten Fahrradtachos entnehmen.
Die Magneten werden an einem Rad und am Pedalzahnrad angebracht und die Schalter so, dass sie bei jeder Umdrehung von den Magneten ausgelöst werden.
Die folgende Abbildung zeigt, wie die Schalter am ULA-Ersatzmodul angeschlossen werden:

Anschluss der Reed-Schalter
Anschluss der Reed-Schalter: P = Reed-Schalter am Pedalzahnrad, M = Reedschalter am Antriebsrad

Software-Einstellungen ändern

Die Software ist standardmäßig auf einen Radumfang von 1280mm eingestellt. Das entspricht dem Umfang der BigApple-Reifen von Schwalbe.
Wer einen anderen Raddurchmesser hat, muss diese Einstellung also ändern.

So geht's:
Upload-Tool
Uploader.exe: ULA replacement upload tool
  1. Rechts auf der Platine des Ersatzmoduls (neben dem Quarz) befindet sich ein 4-poliger Stecker.
    Die Pinbelegung ist von Oben nach Unten:
    +5V
    GND
    RXD
    TXD

    RXD ist die Empfangsleitung des ATmega, TXD die Sendeleitung. Diese Signale haben 5V-Pegel und dürfen darum nicht direkt an einen Computer angeschlossen werden, sondern benötigen noch einen Pegelwandler.
    Es gibt von Pollin-Elektronik einen günstigen Bausatz, welchen ich selbst auch verwende und welcher über die +5v-Leitung versorgt werden kann.

  2. Gegebenenfalls benötigt man noch ein 9-poliges Sub-D-Verlängerungskabel, wenn der Computer zu weit weg ist.

  3. Heutzutage haben Notebooks selten noch eine serielle RS232-Schnittstelle. In diesem Fall kann man sich ggf. mit einem USB<->RS232-Adapter behelfen.

  4. Wenn nun die Verbindung zwischen Computer und Pegelwandler, bzw. Ersatzmodul hergestellt ist, wird Uploader.exe gestartet.

  5. Im ULA replacement upload tool ist zuerst der korrekte COM-Port, über den der Computer mit dem Ersatzmodul verbunden ist, auszuwählen.

  6. Jetzt wird der Button open geklickt um den Port zu öffnen. War dies erfolgreich, wird der Button connect freigegeben und muss ebenfalls angeklickt werden.
    Das Programm versucht jetzt eine Verbindung mit dem Bootloader herzustellen.

  7. Als nächstes wird der C5 eingeschaltet. Wenn alles funktioniert sollte das Programm eine gültige Bootloader-Version anzeigen und die Button-Beschriftung von connect auf reconnect wechseln.
    Der Zustand der Verbindung wird übrigens immer auch unten rechts im Programm angezeigt und sollte jetzt connected sein.

  8. Im Tab Settings gibt es eine Tabelle mit verschiedenen Einstellmöglichkeiten:

    • Pedelec mode: Wird hier der Wert 1 eingetragen, wird der Pedelec-Modus aktiviert. D.h. bei Geschwindigkeiten zwischen Speed limit min und Speed limit max kann der Motor nur eingeschaltet werden, während der Fahrer in die Pedale tritt.

    • Wheel size: Dieser Wert entspricht dem Radumfang des Rades, an dem der Tacho-Reed-Sensor angebracht ist. Die Fahrgeschwindigkeit kann nur dann korrekt gemessen werden, wenn dieser Wert stimmt. Auch der Pedelec-Modus ist von diesem Wert abhängig.

    • Speed limit min und Speed limit max: siehe Pedelec mode.

    • Fan activation temperature: Motortemperatur, ab welcher ein ggf. angeschlossener Lüfter aktiviert wird.

  9. Mit den Buttons read und write unterhalb der Tabelle können die Einstellungen aus dem Ersatzmodul gelesen und geschrieben werden.

  10. Die neuen Einstellungen werden nach einem Neustart des Ersatzmoduls aktiv.

Einstellungen
Uploader.exe: Einstellmöglichkeiten

Neue Software aufspielen

Das ULA-Ersatzmodul habe ich nicht nur für mich selbst entwickelt, sondern auch für alle interessierte C5-Fahrer. Es kann nun aber sein, dass meine Software für den ATmega bei der Auslieferung vielleicht noch einen Fehler enthält, oder ich später noch ein weiteres Feature hinzufügen möchte. Die wenigsten meiner "Kunden" werden aber einen Programmieradapter haben, um dann geänderte Software in den Controller zu laden.
Das ULA replacement upload tool hat von mir nicht nur einen ziemlich langen Namen bekommen, sondern darum auch die Möglichkeit über den Bootloader eine Datei mit neuem Programm aufzuspielen.

So geht's:
  1. Die Punkte 1-7 von oben durchführen.

  2. Im Tab Upload den Button load file klicken und eine Hex-Datei mit der neuen Controller-Software auswählen.

  3. Den Button upload klicken und warten bis der Vorgang abgeschlossen ist.

  4. Das war alles - nach einem Neustart startet die neue Software!

Einen Motorlüfter anschließen

Wie im Abschnitt Installation beschrieben, wird die mit "C5 Emitter" bezeichnete Leitung vom POD zur Control-Box mit dem ULA-Ersatzmodul nicht mehr benötigt und kann nun dazu verwendet werden, z.B. einen Lüfter zur Kühlung des Motors anzusteuern.
Die Leitung führt nun direkt an einen Mikrocontrollerausgang (also bitte ESD beachten!!!), welcher jedoch nur wenige mA Strom liefern kann. Zu wenig um direkt einen Lüfter zu betreiben.
Man kann aber ein Relais dazwischen schalten - und so geht's:

Lüfter-Anschluss
Anschluss eines Relais für einen Motorlüfter

Die Temperatur, ab welcher der Lüfter aktiviert werden soll, lässt sich, wie im Abschnitt Einstellungen beschrieben, konfigurieren.

Anleitung für Tüftler

Für manche Leute gilt es bereits als extrem "freaky" überhaupt einen C5 zu fahren. Dieser Abschnitt richtet sich allerdings eher an diejenigen, welche das Ersatzmodul selbst zusammenlöten und programmieren wollen.
Ich gehe davon aus, das solide Fertigkeiten im Umgang mit SMD-Bauteilen, gute Programmierkenntnisse in C und Erfahrungen mit Mikrocontroller-Systemen vorhanden sind.
Falls das nicht so ganz der Fall sein sollte, rate ich dringend davon ab selbst das Ersatzmodul bauen oder abändern zu wollen.
Nicht zuletzt auch, weil ich wenig Lust habe später jedes Kleinklein erklären zu müssen...

Also kurz: wenn Du fließend C sprichst, weißt welches Ende am Lötkolben heiß wird und Interrupts, Timer, CRC32 oder IO-Register keine Fremdwörter für Dich sind ⇒ weiter lesen.
Falls nicht ⇒ jemanden suchen, der sich damit auskennt (nicht mich).

Zusammenbau des Moduls

Das Projekt ist im Eagle-Datenformat. Wer es nicht kennen sollte: Eagle gibt es als Freeware Light Edition hier zum downloaden.
Die Platine hat Abmessungen von 49 x 19mm und ist zweiseitig. Die Leiterbahnen sind zwar recht dünn, aber für einen Hobby-Elektroniker noch gut ätzbar. Wichtig ist, die beiden Seiten genau deckungsgleich zu belichten, was etwas mehr Erfahrung benötigt.
Ich habe versucht die Leiterbahnführung möglichst optimal zu halten, aber wegen der engen Platzverhältnisse gibt es jetzt leider doch viele Durchkontaktierungen.
Wer den Aufwand und die Sauerei des Selbtsätzens scheut, kann sich die Platine auch ätzen lassen. Das ist für einen Bastlergeldbeutel nicht unbedingt billig - gemessen am Endergebnis aber auf jeden Fall lohnend. Meine Platinen habe ich bei Q-print machen lassen.

Bei der Bestückung fängt man zuerst mit dem ATmega88 an. Ich weise an dieser Stelle noch mal auf ESD-Schutz hin!
Als nächstes folgen die Widerstände und Kondensatoren.
Der Widerstand R_RST wird nicht bestückt. Hier gibt es die Möglichkeit an dessen Stelle einen Resettaster anzuschließen, was für Entwickler nützlich sein kann.
Auch der Widerstand R6 an der Emitter-Leitung wird nicht bestückt.
Anschließend wird der 16MHz-Quarz und die Steckerleisten angelötet. Damit das Ersatzmodul später passend in die Fassung des ULA-Chips gesteckt werden kann, ist es hilfreich sich beim Löten ein Stück Lochrasterplatine unterzulegen, um die 14-poligen Stiftleisten gerade zu führen:
Lochtrasterplatine
Eine Lochrasterpltine hilft die Stiftleisten auszurichten.

Wenn das Board fertig ist, muss der Bootloader über den ISP-Stecker aufgespielt werden. Ich verwende einen einfachen STK200-Clone für den Parallelport als Programmer. Jeder andere ISP-Programmer für ATmegas tut es aber genauso gut.
Spätestens nach dem Flashen des Bootloaders sollte man die Fuse-Bits einstellen.

Fahrdaten auslesen

Nach dem Einschalten gibt die Software über die serielle Schnittstelle den Text ULA replacement, gefolgt von der Firmwareversion und der gespeicherten CRC32-Summe aus.
Anschließend folgt eine Auflistung der Konfigurationseinstellungen (Pedelec-Modus, Radumfang, ...). Siehe dazu auch Kapitel Hauptprogramm.
Während des normalen Betriebs werden alle 256ms die Fahrdaten wie oben beschrieben ausgegeben.
Die serielle Schnittstelle ist über die Stiftleiste rechts vom Quarz herausgeführt.
Die Pinbelegung ist im Abschnitt Einstellungen beschrieben.
Um eine Art Fahrradtacho zu bauen kann man an diese Schnittstelle z.B. einen weiteren Controller mit Display anschließen um die Fahrdaten über diesen auszulesen und anzuzeigen.

Software

Dieses Kapitel soll einen Überblick über die Software des ULA-Ersatzmoduls geben, um ambitionierten Bastlern die Möglichkeit zu geben die Firmware selbst zu ändern, zu erweitern oder Teile davon für ganz andere Projekte zu verwenden.

Allgemeines

Die Software wurde in C geschrieben, wurde mit WinAVR entwickelt und ist aufgeteilt in ein Firmware- und ein Bootloader-Projekt.
WinAVR ist eine Sammlung von open source Tools für die Entwicklung von Software für AVR-Controller.
Als Entwicklungsumgebung empfehle ich das bei WinAVR enthaltene Programmers's Notepad.

Im EEPROM des Mikrocontrollers werden Konfigurationsdaten abgespeichert. Diese bestehen aus:
  • E_BOOL bIsPedelec - Pedelec-Modus aktiviert oder nicht
  • UINT16 u16WheelSize - Radumfang in mm
  • UINT16 u16SpeedLimitMax - Maximale Geschwindigkeit bis zu der Motorunterstützung verfügbar ist
  • UINT16 u16SpeedLimitMin - Geschwindigkeit bis zu der immer Motorunterstützung verfügbar ist
  • UINT16 u16TempFan - Temperatur ab welcher ein ggf. angeschlossener Lüfter eingeschaltet wird
Siehe auch Dokumentation der Datenstruktur.

Der Speicherbereich des ATmega88 ist in Blöcke zu je 64Bytes aufgeteilt (Pages).
Die Pages 0..111 (7kB) stehen der Firmware zur Verfügung, die Pages 112..128 (1kB) sind vom Bootloader belegt.
Am Ende der Page 111 steht an Adresse 0x1BFA die 16Bit-Versionsnummer der Firmware und an Adresse 0x1BFC eine 32Bit-CRC-Summe über das Firmware-Binary.
Diese Checksumme wird zur Laufzeit verwendet, um zu prüfen ob die Firmware korrekt in den Flash-Speicher geladen wurde.
Ich habe ein kleines Kommandozeilen-Tool entwickelt, welches die CRC berechnet und automatisch in den Source-Code einträgt:
CRC_CALC auf SourceForge.net

Es empfiehlt sich, das CRC-Tool direkt in das Programmer's Notepad zu integrieren:
Tool-Intergation
Integration des CRC-Tools in Programmer's Notepad

In PN:
Menü: Tools->Options->Project Tools->Add
Und wie nebenstehend abgebildet eingeben.

Die Reihenfolge zur Erstellung der Firmware ist dann:
  1. Make Clean
  2. Make All
  3. CRC-Tool ausführen
  4. Make Clean
  5. Make All


Wichtig ist allerdings, dass das CRC-Tool (also die crc_calc.exe) im gleichen Verzeichnis liegt wie ula_repl.hex und global.h!

Fuse-Bits

Bevor Software auf den ATmega geflasht wird, sollte man die Fuse-Bits richtig einstellen. Ich verwende dazu das Programm PonyProg.
Die Fuses sollten wie unten abgebildet eingestellt werden:
Einstellungen der Fuse-Bits
Einstellungen der Fuse-Bits in PonyProg. Bitte beachten: In PonyProg sind die Fuses invertiert: ein Häkchen steht für ein 0-Bit!

Software-Architektur

Der Code ist so entwickelt, dass einzelne Module ohne großen Aufwand für andere Projekte wiederverwendet werden können.
Aus diesem Grund sind in allen Modulen Zugriffe auf Ports oder Register abstrahiert. Die Defines für den Zugriff auf die Hardware befinden sich in global.h und kann leicht auf ein geändertes Hardware-Layout oder gar einen anderen Prozessor angepasst werden.
Ausgaben über die serielle Schnittstelle werden durch das Modul print gekapselt und könnten von dort, statt zur seriellen Ausgabe, auf ein anderes Interface umgeleitet werden.
Es gibt einen Systemtimer mit Millisekundenauflösung im Modul Timer. Dieser Timer handhabt das Multiplexing der Display-LEDs und die Frequenz des Lautsprechers.
Darüber hinaus stellt dieser Timer Flags zur Verfügung, welche zu bestimmten Zeitpunkten (alle 128ms, alle 256ms, alle 512ms und alle 1024ms) gesetzt werden.
In der main-Loop können diese Flags gelesen werden um zu diesen Zeitpunkten bestimmte Aktionen durchzuführen (beispielsweise werden alle 256ms die Fahrdaten ausgegeben).
Das Löschen der Flags erfolgt am Ende der main-Loop.
Das Modul safety bildet eine zentrale Instanz zur Handhabung von Fehlern und Warnungen. Zudem werden hier kontinuierlich Speichertests durchgeführt um Fehler im Flash zu erkennen und um die CRC32-Summe der Firmware mit dem eingespeichertem Sollwert zu vergleichen.

Software-Module

Es gibt unter www.cypax.net/projects/ula/docu/index.html eine umfangreiche Doxygen-Dokumentation der Firmware. Daher beschränke ich mich im Folgenden auf eine kurze Beschreibung der Firmware-Module.

ModulBeschreibung
adc Einlesen analoger Werte
current Berechnen des Motorstroms
fan Ansteuerung eines Lüfters über die bisherige "C5 Emitter"-Leitung
Siehe auch Kapitel Motorlüfter.
global Pin-Mapping, Globale Definitionen und Makros
init Zentrale Einheit zur Initialisierung aller Module
leds Ansteuerung der LED-Displays
memory Zugriff auf EEPROM-Speicher
pedal ISR und Methoden um Pedaldrehzahl zu ermitteln
print Umleiten der stdout-Zugriffe auf serielle Schnittstelle
relay Ansteuern des Motorrelais
safety Zentrales Safety-Modul
Führt kontinuierlich Speichertest durch und verwaltet Fehler und Warnungen.
speaker Ansteuerung des Lautsprechers
speed ISR und Methoden um Fahrgeschwindigkeit und Strecke zu ermitteln
switch Erfassung, ob der Motorschalter gedrückt wurde oder nicht
Der Zustand des Motortasters wird zwar über die serielle Schnittstelle ausgegeben, von der Firmware selbst jedoch nicht weiter verwendet.
temp Bestimmung der Motortemperatur
timer Systemtimer
Siehe auch Kapitel Software-Architektur.
uart Interface für serielle Kommunikation
ula_repl Hauptmodul der Firmware
Enthält den main()-Einstiegspunkt und führt alle Funktionalität aus, welche nicht interrupt-getrieben ist.
voltage Berechnen der Batteriespannung
xtypes Deklaration der globalen Typen

Im Modul ula_repl befindet sich der Einstiegspunkt der Firmware. Hier, in der main-Funktion, wird nach der Initialisierung der Hardware und der Module ein Begrüßungstext mit Identifikation der Firmware und der Einstellungen aus dem EEPROM ausgegeben.
Anschließend geht das Programm in eine Endlosschleife und erledigt alle Aufgaben, welche nicht von einem Interrupt ausgelöst werden.
Die meisten dieser Aktionen werden nur in bestimmten Intervallen ausgeführt.
Dazu werden die Timer-Flags bei jedem Durchlauf der Schleife übernommen und temporär gesichert (s. Kapitel Software-Architektur).

In jedem Durchlauf der main-Schleife wird die Funktion safety_MemoryTest() aus dem safety-Modul aufgerufen und der Speichertest des Flash weitergeführt.
Beim Speichertest wird vom Flash-Speicher eine CRC32-Summe über den Bereich 0..7164 gebildet und mit dem Vergleichswert, welcher im Bereich 7165..7168 abgelegt ist, verglichen.
Dies erfüllt zwei Zwecke:
Zum einen wird sichergestellt, dass kein zufälliger Speicherfehler zu einem unvorhersehbaren Verhalten der Firmware führt, und zum anderen wird geprüft, ob das letzte Update der Firmware erfolgreich abgeschlossen wurde.
Sollte der Speichertest fehlschlagen, so wird in die Funktion safety_SafeMode() gewechselt, in der, nach dem Deaktivieren aller Interrupts, in einer Endlosschleife das Motorrelais disabled wird und der Motorlüfter (sofern angeschlossen) aktiviert wird.
Aus dieser Endlosschleife führt nur ein Reset des Controllers.

Die wesentliche Funktionalität des Timer-Moduls steckt in dessen ISR. Hier wird jede Millisekunde zwischen LED-Display für Spannung und Display für Strom gewechselt (Multiplexing).
Die Timer-ISR ist darüber hinaus auch für das Piepen des Lautsprechers verantwortlich, falls eine Temperatur- oder Überstromwarnung gesetzt ist.
Im Gegensatz zum originalen ULA-Chip wird der Lautsprecher nicht schrill dauerpiepen (was nämlich sehr nervig sein kann), sondern gepulst betrieben.

Hardware

Schaltplan

Schaltplan
Schaltplan des ULA-Ersatzmoduls. Anklicken zum vergrößern.

Platine

Layout oben
Platinenoberseite. Anklicken zum vergrößern.

Layout unten
Platinenunterseite. Anklicken zum vergrößern.

Ressourcen

Dateien


Einzel-Downloads:

Weiterführende Links


Updates (!!!)

So, 23.01.2011

Firmwareversion 1.172 und Bootloaderversion 1.042.
Neu in dieser Version: Es kann jetzt konfiguriert werden, wie viele Magnete für den Pedal-Reedschalter und den Tacho-Reedschalter verwendet werden.
Falls mal ein Magnet verloren geht, werden Pedaldrehzahl oder Geschwindigkeit zwar falsch berechnet, der Motor ist aber grundsätzlich trotzdem noch einschaltbar.
Erklärt wird das auch hier: http://c5alive.co.uk/forum/index.php?topic=1636.msg12965;topicseen#msg12965.

Anzahl der Magnete
Eingeben der Anzahl von Magneten im Upload-Tool.

Do, 05.05.2011

Falsche Pin-Bezeichnung in Dokumentation.
In der Dokumentation stand bisher, dass der 47k-Widerstand zwischen Pin 7 und Pin 5 angebracht werden soll. Das war falsch!
Richtig ist: zwischen Pin 7 und Pin 3, so wie jetzt oben korrigiert abgebildet.