Entwicklung eines Fahrradtachometers basierend auf einem Display des Nokia 3310

In jüngster Zeit haben sich die sogenannten digitalen Fahrradtachometer (Fahrradcomputer) unter Fahrradzubehör verbreitet. Diese Geräte können viele Parameter messen, von denen die Geschwindigkeit und die Entfernung die wichtigsten sind. Das Prinzip der Geschwindigkeitsmessung basiert auf der Berechnung der Umdrehungsdauer des Rades, und der Abstand wird auf der Grundlage der Messung der Anzahl solcher Umdrehungen berechnet. Oft ist der Radumdrehungssensor ein Reedschalter in Verbindung mit einem Magneten an der Radspeiche. Je nach Funktionalität variiert der Preis solcher Geräte stark. Der billigste Fahrradtachometer kann für ca. 500 p gekauft werden.

Ich hatte immer den Wunsch, ein ähnliches Gerät zu haben. Gleichzeitig formulierte ich eine Reihe meiner eigenen Anforderungen, die es erfüllen sollte. Zunächst wollte ich unbedingt eine grafische Darstellung der Geschwindigkeitsänderungen in Abhängigkeit von der Entfernung oder der Zeit sehen, die sich während der Bewegung über einen kurzen Zeitraum angesammelt haben. Und auch, um Messungen auf einem Speichergerät aufzuzeichnen (zu protokollieren), um statistische Daten weiter auf einen Computer zu übertragen, deren detailliertere Anzeige. Billige Modelle erfüllen meine Anforderungen nicht vollständig, aber ich möchte teure Modelle nicht überbezahlen.

Aufgrund des Vorstehenden habe ich beschlossen, einen eigenen Fahrradtachometer auf der Basis des ATmega8-Mikrocontrollers zu entwickeln. Es gab viele Fragen, insbesondere zu den verwendeten Peripheriegeräten. Ich bin versehentlich auf Artikel über die Verwendung des Displays des einst beliebten Nokia 3310 gestoßen. Nachdem ich das Datenblatt gelesen und sichergestellt hatte, dass es einfach zu bedienen war, hatte ich keinen Zweifel daran, dass der Tacho im Gehäuse des oben genannten Telefons mit einem eigenen Display hergestellt werden würde. Der Fall ist ziemlich gut und das Gerät selbst ist nicht schwer zu finden.



Als ROM für die Aufzeichnung von Messstatistiken habe ich mich für ein klassisches 24XX512-ROM (512 Kbit / s) entschieden, das über die I2C-Schnittstelle gesteuert wird. Ich habe mich nicht mit der Verwendung einer SD / MMC-Speicherkarte beschäftigt. Eine weitere wichtige Funktion im Gerät ist die Uhr. Sie dienen dazu, einige gemessene spezifische Parameter (z. B. maximale Geschwindigkeit) an Datum und Uhrzeit zu binden und sind auch für die Aufzeichnung von Zeitstempeln in Statistiken erforderlich. Als Uhr habe ich einen separaten Mikrouhr-Chip (RTC) vom Mikrocontroller verwendet, der über eine unabhängige Batterieleistung verfügt und auch über I2C mit dem Controller kommuniziert.

Ich habe beim Schreiben des Programms zusätzliche sekundäre Anforderungen an die Funktionalität des Geräts implementiert. Dies umfasst alle Arten von organisatorischen Problemen: die Anzahl der beteiligten Schaltflächen, die Position auf der Anzeige verschiedener Elemente, die Navigation auf der Benutzeroberfläche usw. In Bezug auf die Navigation habe ich mich im Voraus entschieden, das Programm nicht zu komplizieren, zum Beispiel das Einstellungsmenü, insbesondere die Datums- und Uhrzeiteinstellungen, nicht zu implementieren. Die Uhr wird einmal eingestellt. Dank eines 32,768-kHz-Quarzes und einer langlebigen Batterie tickt die Uhr im RTC-Chip selbstständig. Datums- und Uhrzeiteinstellungen werden über die UART-Schnittstelle des Tachometers vorgenommen, die mit einem Klick an den COM-Anschluss des Computers angeschlossen wird. Über dieselbe Schnittstelle sollte es Statistikdaten vom ROM auf einen Computer lesen. Für all dies müssen Sie das entsprechende Programm für den Computer schreiben. Wie die weitere Praxis zeigte, musste letzteres jedoch aufgegeben werden. Erstens gab es das Problem, den Empfang von Daten von der Steuerung zum Computer beim Schreiben eines Computerprogramms zu implementieren. Und noch wichtiger ist, dass die Lautstärke des Programms für die Steuerung erhöht wurde. Es war viel interessanter, das ROM (im SMIC-Gehäuse SOIC-8) auf einer austauschbaren Plattform zu platzieren, die der SIM-Karte entspricht, und den entsprechenden freien Steckplatz auf dem Mobiltelefon zu verwenden. Zu diesem Zweck ist es erforderlich, einen ROM-Leser basierend auf einem SIM-Leser gemäß einem der bekannten Schemata des I2C-ROM-Programmiergeräts herzustellen. Wie sich später herausstellte, verursachte diese Entscheidung keine unnötigen Unannehmlichkeiten.

Ein weiteres wichtiges Thema ist die Ausgabe symbolischer (einschließlich digitaler) Informationen auf einem Grafikdisplay. Dies erfordert grafische Informationen zu einem bestimmten Symbol. Diese Informationen stehen in engem Zusammenhang mit einem Parameter wie der Größe der angezeigten Schriftart. Um den Hauptparameter, die Bewegungsgeschwindigkeit, für eine gute Klarheit anzuzeigen, ist es wünschenswert, eine große Schriftart zu verwenden. Wie später gezeigt wird, passen solche grafischen Informationen über zehn Ziffern nicht in den Speicher von MK, und die Verwendung desselben externen, umfangreicheren ROM verlangsamt die Geschwindigkeit des Zeichnens der Schriftart. Ich habe mich für eine Schriftart mit einer Höhe von 8 Punkten als größte Schriftart entschieden. Ich habe die grafischen Informationen für diese Schriftart aus der Datei „8X8.FNT“ eines Programms von MS DOS abgerufen, nachdem ich zuvor die Struktur entschlüsselt und weiterverarbeitet hatte.



Wie sich später in der Praxis herausstellte, reicht diese Größe für eine klare Geschwindigkeit aus. Als Größe für die zusätzliche Schriftart habe ich die Größe 3x5 gewählt und die Grafiken für die Nummern dieser Größe unabhängig gezeichnet. Diese kleinen Zahlen zeigen zusätzliche Parameter an: Datum / Uhrzeit, Durchschnitts- und Höchstgeschwindigkeit, Pfad.

Die grafischen Informationen beider Schriftarten werden in bestimmten zweidimensionalen Arrays gespeichert. Jedes Array-Element mit einer Größe von 1 Byte bezeichnet die Pixelverteilung einer bestimmten Spalte einer bestimmten Ziffer. Bei Großdruck werden 8 Spalten für jede Ziffer und 3 für 3 zugewiesen. Bei Kleingedruckten mit einer Größe von 3 x 5 beträgt die formale Höhe nicht 5, sondern 8 Punkte (auf ein Byte gerundet). Auf diese Weise können Sie die Position der 5-Positionen-Schriftart innerhalb des 8-Positionen-Bereichs in vertikaler Richtung mit einer von 4 möglichen Methoden vorab anordnen. Diese Fakten sind in der folgenden Abbildung gut dargestellt, die die Modellierung von Grafiken für die ersten beiden Ziffern dieser Schriftart demonstriert. Excel ist bekannt für die Modellierung. Die Anfangsdaten sind die Anordnung von "Einheiten" in den entsprechenden Feldern für die gewünschten Grafiken. Von diesen berechnen die Formeln die Werte von Arrays bis zum C-Sprachcode, der später in den Programmtext für den Mikrocontroller kopiert werden kann.



Jetzt werden wir über die Steuerfunktionen des verwendeten Displays sprechen. Dieses Display ist monochrom und hat eine Größe von 84 x 48 Pixel. Die Anzeigesteuerung vom MK erfolgt über die SPI-Schnittstelle. Von SPI übertragene Bytes werden in der Anzeige in zwei Modi interpretiert: Bytes für die Anzeige und Bytes für Konfigurationsbefehle. Diese Modi werden vom MK selbst für einen bestimmten Anzeigestift (D / C) eingestellt. Eine vollständige Liste der Befehle finden Sie im Datenblatt auf dem Display. Einige dieser Befehle werden in meinem Gerät verwendet und dienen zum Initialisieren der Anzeige, wenn das Gerät mit Strom versorgt wird: Temperaturkoeffizient, Kontrast, sequentieller Zeichenmodus (horizontal oder vertikal) usw. Ich stelle sofort fest, dass der horizontale Zeichenmodus angewendet wird. Dies bedeutet, dass beim Übertragen eines Bytes im Anzeigemodus die Adresse automatisch um eine Zeile Zeile für Zeile nach rechts erhöht wird. Wenn die Zeile endet, geht die Positionsadresse an den Anfang der nächsten Zeile. Es reicht aus, zuerst einen speziellen Positionierungsbefehl an die Anzeige an eine bestimmte Zeilen- und Spaltenadresse (Anfangsposition) zu senden und dann nacheinander Datenbytes zu senden, um Grafiken anzuzeigen. Es ist erwähnenswert, dass der Adressraum und die Interpretation der Grafiken von den von der Anzeige empfangenen Bytes abhängen. Ich stelle fest, dass für monochrome Grafiken ein Byte Informationen über ungefähr acht Pixel gleichzeitig enthält.

Die betreffende Anzeige ist vertikal in 6 horizontale Zonen mit jeweils 8 Linien unterteilt (6 * 8 = 48). Jede Spalte jeder Zone entspricht einem bestimmten Byte, das mit der Adresse der entsprechenden Spalte (0 ... 83) und der Zonennummer (0 ... 5) gesendet wird. Die Adresse wird nicht von Grund auf neu gezählt. Wenn Sie sich beispielsweise an der Adresse (34; 2) positionieren und ein Datenbyte von 255 (in binärer Form „11111111“) senden, leuchten alle 8 Pixel vertikal von 16 bis 23 und horizontal in der 35. Spalte auf. Meiner Meinung nach ergibt sich aus diesem Merkmal einer der Nachteile: Die Unfähigkeit, den Zustand jedes Pixels einzeln auf Hardwareebene zu steuern. Ein Byte ist das kleinste Datenelement für Grafiken. Wenn ein Byte an die aktuelle Adresse übertragen wird, werden alle 8 entsprechenden Pixel in der aktuellen Zone aktualisiert. Das Display unterstützt nicht das Lesen der aktuell angezeigten Grafikinformationen zum Mikrocontroller. Daher ist es bei Bedarf erforderlich, die Ausgabeinformationen im Voraus in einem dedizierten Puffer zu speichern und den Status von Pixeln (Bits) zu ändern, Bitmasken für Bytes aus diesem Puffer anzuwenden und sie erneut an die Anzeige zu übertragen.

Das Modellieren und Überlegen der Position einer bestimmten grafischen Information auf dem Display wurde unter Berücksichtigung der obigen Merkmale durchgeführt. Dies wurde durchgeführt, um den Code beim Schreiben des Programms zu vereinfachen. Und es ist kein Zufall, dass die Schriftgröße aus der Kategorie 8, 16, 24, dh einem Vielfachen von 8, berücksichtigt wurde. Analog zur Anzeige habe ich auch die grafischen Informationen in 6 horizontale Zonen unterteilt. In der ersten Zone werden die absoluten und aktuellen Drehzahlwerte (ab dem Zeitpunkt des Einschaltens des Geräts) im Kleingedruckten angezeigt. In der zweiten Zone die absoluten und aktuellen Werte des Pfades (in Kilometern mit Rundung auf Hundertstel). In der dritten Zone - Durchschnittsgeschwindigkeit. Im vierten - maximale Geschwindigkeit und im Großdruck - die aktuelle Geschwindigkeit. In der fünften Zone werden zwei Fortschrittsbalken angezeigt, um anzuzeigen, dass das ROM voll ist und die Anzahl der Überschreibungen. In der sechsten, letzten Zone das Datum und die Uhrzeit. Dies ist die fünfte Zone, die die Ausnahme darstellt, wenn in vertikaler Richtung einer aufgenommenen Spalte Pixel vorhanden sind, die sich auf unterschiedliche Informationen beziehen. Daher werden diese Informationen unter Verwendung von Bitmasken in einem Puffer gesammelt, dessen Inhalt dann in dieser fünften Zone angezeigt wird. In 3-5 Zonen gibt es auch Informationen zum Zeichnen eines Rahmens um den angezeigten Geschwindigkeitswert. In der letzten Zone wird jedes erste (niedrigstwertige) Bit in allen Spalten auf "1" gesetzt, um die Trennlinie (40. Zeile) zu zeichnen. Für diese Simulation und Visualisierung von Adressen habe ich alle oben genannten Punkte in Excel-Zellen dargestellt.



So sieht das erste Anzeigefenster aus. Nur zwei Fenster. Das zweite Fenster ist die Ausgabe des Diagramms (Histogramm) der Bewegung. Dafür werden 5 Zonen vertikal (40 Zeilen) und alle 84 Spalten horizontal zugewiesen. Die sechste Zone mit der Uhr ist für beide Fenster gleich.

Beim Programmieren habe ich beschlossen, keine Bibliothek zu verwenden, um mit dieser Anzeige zu arbeiten. Persönlich ist es für mich einfacher, das Datenblatt zu verstehen, einen Teil der Funktionen selbst zu implementieren, als die Bibliothek zu verstehen. Darüber hinaus wurden darin gewisse Vorteile gefunden. Nachdem ich kürzlich eine der Bibliotheken heruntergeladen hatte, fand ich dennoch deren Funktionsmerkmale heraus. Es ist universell, mit seiner Hilfe können Sie Pixel individuell steuern und sich auf der realen Pixeladresse positionieren. Die Bibliothek verwendet jedoch einen Puffer mit einer Größe von 84 * 6 Byte. Dieser Zeitgeberpuffer wird regelmäßig an die Anzeige gesendet, um die Grafiken zu aktualisieren. Somit sind der Timer und ein Teil des Speichers MK beschäftigt. In meinem speziellen Fall ist es nicht erforderlich, eine Bibliothek zu verwenden, da ich bei der Modellierung im Voraus darauf geachtet habe, die Trennung der Informationen zwischen den angezeigten Zonen zu maximieren, die den Anzeigezonen vollständig entsprechen. Die Informationen auf dem Display müssen nicht regelmäßig aktualisiert werden: Die Informationen werden nur dann aktualisiert, wenn sie sich ändern (bei jeder Drehung des Rads, bei jedem Knopfdruck usw.). Daher betone ich noch einmal: Je nach Aufgabe können Sie die Verwendung von Bibliotheken vermeiden.

Um mit einer Uhr-Mikroschaltung und einem ROM zu arbeiten, habe ich auch nicht auf die Verwendung von Bibliotheken zurückgegriffen: Alle Funktionen sind recht einfach und werden von mir nach dem Studium der Datenblätter für diese Komponenten implementiert.

Betrachten Sie nun den Stromkreis des Geräts.



Das Layout des Tachometers ist relativ einfach. Darüber hinaus enthält die Schaltung ein IC5 MAX756-Element, das als 3- bis 5-Volt-Stromrichter für eine zuverlässige Stromversorgung aus dem Originalakku des Nokia 3310-Mobiltelefons dient. Die Schaltung für eine 3-Volt-Stromversorgung wurde aufgrund des Fehlens des entsprechenden MK und der entsprechenden Peripheriegeräte nicht implementiert. Zum jetzigen Zeitpunkt habe ich den MAX756 noch nicht erworben, und die gesamte Schaltung wird immer noch von einer externen Krona-Batterie mit dem LM7805-Regler gespeist (nicht ganz die beste Option). Es wird an die Kopfhörerbuchse an der Unterseite des Telefons angeschlossen. Der Reedschalter SF1, bei dem es sich um einen Raddrehungssensor handelt, ist mit dem Interrupt-Port INT0 MK (Pin 32) verbunden. Es wird sicher von der Unterseite des Telefons mit dem Ladeanschluss verbunden. Die mit den Tasten „1“, „2“, „3“ des Mobiltelefons verbundenen Funktionstasten S1-S3 sind mit beliebigen Anschlüssen (Pins 23, 27, 28) verbunden. Ein Pin S4 ist mit Pin 29 des MK-Resets verbunden, der mit der oberen Endtaste zum Einschalten des Mobiltelefons zusammenfällt. Ich habe es einfach so gemacht. Das Gerät selbst hat keinen Standby-Modus und schaltet sich mit Strom ein. Ein IC2-Display und ein Anschluss zum Blinken von X1 sind an den SPI-Port des Controllers angeschlossen (Pins 15-17). Mit dem Anschluss, den ich auf der Grundlage der vorhandenen „Spots“ auf dem Original-Motherboard zum Koppeln mit einem PC (am selben Ort) herstellen wollte, habe ich einen kleinen Haken bekommen und werde ihn in Zukunft an einen anderen Ort übertragen. Eine UART-Schnittstelle für die Benutzerverbindung zu einem Computer ist mit demselben Anschluss verbunden, über den Datum und Uhrzeit auf dem Gerät konfiguriert werden (Pins 30-31, RX / TX). Das Display ist über Teiler an Widerständen mit der Steuerung verbunden, die zur Spannungsreduzierung dienen, da das Display mit einer Spannung von 3,3 V arbeitet. Zusätzlich sind die Display-Pins D / C (Daten / Befehl), SCE (Strobe) und RES (Display Reset) mit beliebigen Ports verbunden MK PB0, PB1 bzw. PB2 (Pins 12-14). Die Anzeige wird über die Dioden D1-D3 und den Widerstand R6 mit Strom versorgt, die dazu dienen, die Spannung von 5 auf 3,3 V zu reduzieren, ohne dass ein Linearregler verwendet werden muss. Von MK getakteter Quarz Cr1 mit einem Nennwert von 4,5 MHz wurde zufällig, aber absichtlich ausgewählt. Er fiel einfach in meinen Arm und ich entschied mich, ihn zu benutzen. Die Transistoren Q1 und Q2 sind mit den Anschlüssen des PD4 und PD5 MK (Pins 2 und 9) verbunden, auf die die LEDs für die Hintergrundbeleuchtung des Displays und der Tastatur geladen sind. Der Controller bietet die Möglichkeit, die Hintergrundbeleuchtung individuell zu steuern, wie es das ursprüngliche Layout des Mobiltelefons vorsieht (dies war auf Hardwareebene und nicht auf Benutzerebene), obwohl dies in der Praxis nicht erforderlich ist. Der I2C-Bus ist mit den PC2-PC3-Ports (Pins 25-26) verbunden und wird der Einfachheit halber programmgesteuert unter Verwendung der entsprechenden Bibliothek implementiert (obwohl er mit den Hardware-TWI-Ports verbunden ist). Das IC3-ROM und die Echtzeituhr (RTC) IC4 sind am Bus aufgehängt. Machen Sie sofort eine Reservierung, damit es in den Kommentaren keine Kritik gibt: Ich weiß, dass der DS1307 nicht die beste Lösung ist, aber zum Zeitpunkt der Entwicklung der Schaltung wusste ich nichts über die Existenz des DS3231. Das ROM befindet sich auf einem abnehmbaren Anschluss, ähnlich einer SIM-Karte. Ein zusätzlicher Port des PC1-Controllers (Pin 24) wird verwendet, um Impulse mit einer Frequenz von 1 Hz mit RTC zu empfangen, um die die Zeit auf dem Display aktualisiert wird. Alle passiven Body-Kit-Komponenten - gemäß Datenblättern für jede aktive Komponente.

Berücksichtigen Sie mathematische Überlegungen zur Berechnung bestimmter Parameter. Wie bereits eingangs erwähnt, basiert das Prinzip der Geschwindigkeitsmessung auf der Berechnung der Umdrehungsdauer des Rades, und der Abstand wird auf der Grundlage der Messung der Anzahl solcher Umdrehungen berechnet. Die Steuerung misst die Zeit zwischen dem vorherigen und dem vom Reed-Schalter eingehenden Impuls. Das Messergebnis wird in einen Geschwindigkeitswert umgewandelt, indem der Wert des Radumfangs durch die Umdrehungsdauer dividiert wird. Dieser Wert wird mit jedem Impuls (Radumdrehung) auf dem Display aktualisiert. Hierbei ist anzumerken, dass aus physikalischer Sicht die Durchschnittsgeschwindigkeit eines Fahrrads auf einem dem Radumfang entsprechenden Streckenabschnitt berechnet wird. Separat wird die Anzahl der Impulse berechnet und dann in einen Abstandswert umgewandelt. Um die Drehzeit des Rades zu messen, verwendet die Steuerung einen eigenen Timer. ATmega8 verfügt über einen 8-Bit- und einen 16-Bit-Timer. Der Dynamikbereich der Messung hängt von der Bittiefe des Timers ab. In meinem Fall wird ein 16-Bit-Timer verwendet, da 8 Bit (256 Zählungen) kategorisch unzureichend sind. Die maximale Messdauer (bevor der Timer überläuft) entspricht der minimalen Messgeschwindigkeit. Sie können den sogenannten Software-Timer eingeben, der große Zeiträume misst. Um das Programm zu vereinfachen, habe ich dies jedoch nicht getan. Mit dem verwendeten Quarz von 4,5 MHz und einem maximalen Teilerwert von 1024 in der Timerkonfiguration haben wir: (1 / (4500000/1024)) = 0,000227556 ​​Sek. Dieser Wert entspricht der Mindestlaufzeit des Kontos. Der maximale Kontodauer beträgt 0,000227556 ​​* 65536 = 14,913 Sekunden. Die maximale messbare Geschwindigkeit, die der minimalen messbaren Periode entspricht, beträgt ungefähr 30.000 km / h. Dies war nicht einmal eine Vereinbarung wert, die „Reserve von oben“ ist einfach riesig.Die minimale gemessene Geschwindigkeit, die der maximalen gemessenen Periode entspricht, beträgt jedoch 2,26 / 14,913 / 1000 * 3600 = 0,54 km / h. Hier ist 2,26 der Umfang des Fahrradrades (in Metern) in meinem Fall. Mit diesem minimalen Messwert bin ich sehr zufrieden. Wenn sich das Fahrrad mit einer Geschwindigkeit von weniger als 0,54 km / h bewegt, zeichnet der Fahrradtacho den Bewegungsmangel (und den Timerüberlauf) auf. Mit diesem Quarz funktioniert die 4,5-MHz-UART-Schnittstelle bei einer Geschwindigkeit von 2400 Baud mit einem akzeptablen akzeptablen Fehler einwandfrei. Diese Geschwindigkeit ist auch völlig ausreichend, insbesondere da ich UART für einmalige Uhreinstellungen von einem Computer aus verwende (zum Kopieren von Datum und Uhrzeit von einem Computer auf ein Gerät). Wenn Sie eine höhere Quarzfrequenz nehmen, erhöht sich die messbare Mindestgeschwindigkeit, was für mich nicht akzeptabel ist.und Sie müssen einen Software-Timer verwenden. Und wenn Sie es unten betrachten, nimmt die Leistung des gesamten Geräts ab. Deshalb habe ich mich entschlossen, diesen speziellen Quarz zu verlassen.

Ich stelle fest, dass die Perioden- und Geschwindigkeitswerte umgekehrt proportional sind und der Mikrocontroller-Timer die Periode diskret misst. In unserem Fall ist der Messbereich (0,000227556 ​​... 14,913) gleichmäßig mit Punkten in Höhe von 65535 markiert und in viele gleiche Intervalle unterteilt. Und diese Punkte entsprechen allen Arten von Messwerten. Unter Verwendung der Umrechnung von Intervallen von Zeit zu Geschwindigkeit wird dieses Intervallsystem von gleichmäßig zu umgekehrt proportional umgerechnet. Daher ist der Bereich unterschiedlich gemessener Geschwindigkeiten in ungleichmäßige Intervalle unterteilt. Die Länge dieser Intervalle nimmt mit zunehmendem Geschwindigkeitswert selbst zu. Angesichts dieser Tatsache wird die riesige "Reserve von oben", über die ich etwas höher geschrieben habe, nicht verkehrt sein. In der Praxis reicht es völlig aus, den Wert von 100 km / h für die maximal gemessene Geschwindigkeit des Fahrrads anzunehmen.Dies dient nur dazu, keine neue Ziffer (Hunderte) einzuführen und die Breite des auf dem Display angezeigten Parameters nicht zu erhöhen. Wir berechnen, wie lang das Intervall zwischen benachbarten möglichen Werten bei einer Geschwindigkeit in der Nachbarschaft ist, beispielsweise 90 km / h. Unter Verwendung der inversen Formeln oder Auswahl ist es einfach zu berechnen, dass für den Wert des Zeitgebers 397 (von 65536 möglich) die gemessene Geschwindigkeit 90,06 km / h entspricht. Und mit einem benachbarten Timerwert von 398 - 89,83 km / h. Und der Unterschied zwischen den Geschwindigkeiten beträgt 0,23 km / h, was bereits mehr als akzeptabel ist. Und bei niedrigeren Geschwindigkeiten wird dieser Unterschied noch geringer sein. Das Display zeigt den Geschwindigkeitswert auf das nächste Hundertstel an. In der Praxis reicht es jedoch normalerweise aus, auf das nächste Ganze oder auf die Zehntel zu runden. Aus dem Vorstehenden können wir schließen: Die Ungleichmäßigkeit des „Gitters“ der Geschwindigkeiten kann vernachlässigt werden.da der dadurch verursachte Messfehler den zulässigen Fehler nicht überschreitet.

Um die Entfernung zu berechnen, reicht es aus, die Anzahl der Impulse (Umdrehungen) mit dem Umfang des Rades zu multiplizieren. In diesem Fall wird der Abstand natürlich genau auf den Umfang des Rades berechnet, was durchaus akzeptabel ist. Die aktuelle Durchschnittsgeschwindigkeit wird als Verhältnis der aktuell zurückgelegten Strecke zum Zeitwert ab dem Zeitpunkt des Einschaltens berechnet. Dies ist die Zeit, die der Controller berücksichtigt, indem er die Anzahl der Impulse zählt, die einmal pro Sekunde mit RTC ankommen. Die durchschnittliche Geschwindigkeit auf dem Display wird zusammen mit der Zeitaktualisierung aktualisiert (einmal pro Sekunde). Alle anderen Parameter werden mit jeder Umdrehung des Rades aktualisiert.

Nun zu den kleinen Funktionen der Benutzeroberfläche. Mit der ersten Taste können Sie zwischen den Modi wechseln (Grafikmodus oder Wertanzeigemodus). Die zweite Taste - zeigt die absolute (für alle Zeiten) maximale Geschwindigkeit anstelle der relativen an, wenn Sie sie gedrückt halten. Außerdem werden Datum und Uhrzeit des Erreichens dieser Geschwindigkeit anstelle des aktuellen Datums und der aktuellen Uhrzeit angezeigt. Außerdem wird der Wert der aktuellen ROM-Adresse anstelle des Werts der relativen Geschwindigkeit (zur Steuerung) angezeigt. Dieser Wert kann durch den horizontalen Fortschrittsbalken in der 38. Zeile der Anzeige geschätzt werden. Auf diesem ROM mit einer Kapazität von 65536 Bytes (512 kbit) werden die gemessenen Parameter aufgezeichnet. Wie später gesagt wird, reicht es aus, den anfänglich gemessenen Parameter (die Rotationsdauer des Rades) mit dem anfänglichen Zeitstempel aufzuzeichnen.Alle anderen Parameter können von einem Computerprogramm im Stadium des ROM-Scannens leicht berechnet werden. Die dritte Taste dient zur Steuerung der Hintergrundbeleuchtung. Im Gegensatz zur obigen Bildschirmskizze habe ich später unbedeutende Nullen auf den sekundären Parametern entfernt, um sie deutlicher anzuzeigen. Im grafischen Modus wird ein Histogramm der Bewegungsgeschwindigkeit von links nach rechts gezeichnet, das den Prozess der Geschwindigkeitsänderung über einen kleinen Teil der Entfernung von 84 Umdrehungen des Rads deutlich zeigt. Der Histogrammwert ist die Geschwindigkeit auf einer Skala von 1 Pixel pro 1 km / h. Wenn die Geschwindigkeit 40 km / h überschreitet, wird das Bild zweimal vertikal verkleinert, um eine Abweichung vom Maßstab zu vermeiden. Gründliche Merkmale des Geräteverhaltens müssen hier nicht beschrieben werden.Ich habe später unbedeutende Nullen auf den sekundären Parametern entfernt, um sie deutlicher anzuzeigen. Im grafischen Modus wird ein Histogramm der Bewegungsgeschwindigkeit von links nach rechts gezeichnet, das den Prozess der Geschwindigkeitsänderung über einen kleinen Teil der Entfernung von 84 Umdrehungen des Rads deutlich zeigt. Der Histogrammwert ist die Geschwindigkeit auf einer Skala von 1 Pixel pro 1 km / h. Wenn die Geschwindigkeit 40 km / h überschreitet, wird das Bild zweimal vertikal verkleinert, um eine Abweichung vom Maßstab zu vermeiden. Gründliche Merkmale des Geräteverhaltens müssen hier nicht beschrieben werden.Ich habe später unbedeutende Nullen auf den sekundären Parametern entfernt, um sie deutlicher anzuzeigen. Im grafischen Modus wird ein Histogramm der Bewegungsgeschwindigkeit von links nach rechts gezeichnet, das den Prozess der Geschwindigkeitsänderung über einen kleinen Teil der Entfernung von 84 Umdrehungen des Rads deutlich zeigt. Der Histogrammwert ist die Geschwindigkeit auf einer Skala von 1 Pixel pro 1 km / h. Wenn die Geschwindigkeit 40 km / h überschreitet, wird das Bild zweimal vertikal verkleinert, um eine Abweichung vom Maßstab zu vermeiden. Gründliche Merkmale des Geräteverhaltens müssen hier nicht beschrieben werden.Der Histogrammwert ist die Geschwindigkeit auf einer Skala von 1 Pixel pro 1 km / h. Wenn die Geschwindigkeit 40 km / h überschreitet, wird das Bild zweimal vertikal verkleinert, um eine Abweichung vom Maßstab zu vermeiden. Gründliche Merkmale des Geräteverhaltens müssen hier nicht beschrieben werden.Der Histogrammwert ist die Geschwindigkeit auf einer Skala von 1 Pixel pro 1 km / h. Wenn die Geschwindigkeit 40 km / h überschreitet, wird das Bild zweimal vertikal verkleinert, um eine Abweichung vom Maßstab zu vermeiden. Gründliche Merkmale des Geräteverhaltens müssen hier nicht beschrieben werden.

Es ist erwähnenswert, einen der charakteristischen Unterschiede zwischen meinem Tacho und billig gekauft. Es besteht in der Geschwindigkeit der Aktualisierung der Geschwindigkeitsanzeige auf dem Display. In meinem Gerät wird es bei jeder Umdrehung des Rads sofort wie berechnet aktualisiert. Bei gekauften Geräten wird es mit einer gewissen Verzögerung aktualisiert. Möglicherweise ist diese Verzögerung auf den Versuch zurückzuführen, das Messrauschen zu filtern (z. B. unter Verwendung der Methode des gleitenden Durchschnitts), um die Geschwindigkeitsanzeige auf dem Display für eine detailliertere Klarheit zu stabilisieren. Oder die Anzeige wird in regelmäßigen Abständen (z. B. zweimal pro Sekunde) vollständig aktualisiert. Es mag praktisch sein, aber ich wollte mit jeder Umdrehung des Rades ein Geschwindigkeitsupdate implementieren.

Die Leiterplatte wird nach der LUT-Methode in Form der Originalplatine des verwendeten Mobiltelefons hergestellt. Bei der Herstellung der Leiterplatte habe ich das SLayout-Programm verwendet. Gleichzeitig habe ich vorab ein Bild von der Originalplatine auf beiden Seiten des Scanners aufgenommen und die Bilder als Vorlage in SLayout abgelegt. Dies ist erforderlich, um Pads zum Anschließen des Displays, der Tasten und Anschlüsse an ausschließlich erforderlichen Stellen zu zeichnen. Bei der Herstellung der Platte trat ein Fehler von ca. 0,5 mm auf. Dieser Fehler erwies sich hinsichtlich der Kombination von Pads und Elementen als akzeptabel. Dieser Fehler beeinträchtigte jedoch die Qualität der Hintergrundbeleuchtung: Versiegelte LEDs wurden um einen Bruchteil von Millimetern verschoben und fielen nicht in den Fokus von Lichtstreudornen. Aus diesem Grund nahm die Helligkeit der Hintergrundbeleuchtung ab, wodurch die Effizienz verringert wurde.Die folgenden Abbildungen zeigen eine Ansicht der Leiterplatte in SLayout zusammen mit drei kleinen Leiterplatten für ROM in Form einer SIM-Karte. Außerdem werden Scans der ursprünglichen Leiterplatte von zwei Seiten angezeigt.





Einige Elemente (Tasten, Anschlüsse) sind durch dünne Drahtbrücken miteinander verbunden, da keine Schienen verlegt werden können. Es gibt einen Spielraum für alle verfügbaren Schaltflächen, dh es ist möglich, jede verfügbare Schaltfläche zu verwenden. Es kann zweckmäßig sein, die große Taste in der Mitte zu einer Taste zum Umschalten der Anzeigemodi zu machen. In der oberen linken Ecke der Platine befindet sich eine 3-Volt-RTC-Batterie. Im Allgemeinen werden alle Elemente auf der Platine korrekt platziert, wobei ihre Abmessungen mit den Abmessungen des Gehäuses abgestimmt werden. Im Gegensatz zum vergoldeten Original ist die hauseigene Platine mit normalem Lot beschichtet. Wie in der ersten Übung gezeigt, geht der Kontakt mit dem Display und anderen Peripheriegeräten nicht verloren.

Das Programm für MK erwies sich als ziemlich umfangreich und nimmt einen bedeutenden Teil seines Gedächtnisses ein. Darüber hinaus sieht das Programm die Verwendung eines eigenen nichtflüchtigen Speichers der Steuerung (EEPROM) zum Aufzeichnen und Speichern der erforderlichen Informationen vor. Die folgende Tabelle zeigt die Verteilung dieser Informationen nach EEPROM-Adressen.

AdresseGrößeDaten
04n (für S)
42t_min (für v_max)
66Datum von t_min
122Adresse EEPROM
141EEPROM RW Count
12880Ziffern 8X8
20830Ziffern 3X5
Die ersten vier Bytes speichern die zurückgelegte Strecke als Anzahl der Umdrehungen des Rades. Ich habe speziell den 32-Bit-Integer-Typ für diese Variable gewählt, da in der Praxis die Werte des zurückgelegten Pfades relativ groß sind. Beispielsweise könnte eine ganzzahlige 16-Bit-Variable maximal 65.536 Umdrehungen (ca. 148 km) einsparen, was natürlich klein ist. Es folgen zwei Bytes, um die absolute Höchstgeschwindigkeit aufrechtzuerhalten. Tatsächlich wird die minimale Raddrehzeit gespart. Die Variable nimmt zwei Bytes ein, da ihr Wert das Ergebnis der Messung eines 16-Bit-Timers ist. Die nächsten 6 Bytes sind das Datum und die Uhrzeit, zu der die oben angegebene Höchstgeschwindigkeit erreicht wurde. Die Daten werden genau in dem Format dargestellt, in dem sie vom RTC-Chip gelesen werden (außer am Wochentag). Als nächstes zwei Bytes, die den Wert der aktuellen Adresse des externen ROM speichern. Dies ist eine Art Zeiger, der erforderlich ist, um die Aufzeichnung von Statistiken im ROM nach dem nächsten Einschalten des Geräts fortzusetzen. MK sollte wissen, an welcher Position des Adressraums des externen ROMs es zuletzt gestoppt wurde. Von dieser Position aus setzt MK die Aufnahme fort. Diesem Wert werden 2 Bytes zugewiesen, da der Adressraum des externen ROM 16 Bit beträgt. Dies ergibt sich aus einer ROM-Größe von 64 kB. Als nächstes folgt eine Einzelbyte-Variable, die den Wert der Anzahl der ROM-Überschreibungen speichert. Das Überschreiben ist der Fall, wenn der obige Zeiger den Maximalwert erreicht und auf Null geht. In diesem Fall werden neu empfangene Informationen auf dem ROM von Anfang an aufgezeichnet, wobei die darauf verfügbaren alten Informationen gelöscht werden. Eine ganzzahlige Einzelbyte-Variable kann maximal 256 Werte speichern. Ich erinnere Sie daran, dass die Werte des ROM-Adresszeigers und die Anzahl der Überschreibungen visuell durch zwei Fortschrittsbalken auf dem Display angezeigt werden. Ferner werden nach einem großen Sicherungsspeicher des EEPROM MK ab Adresse 128 grafische Informationen über 8 x 8 Ziffern gespeichert. Dafür werden 80 Bytes zugewiesen (8 Bytes für jede Ziffer, wie bereits erwähnt). Und schließlich werden ab Adresse 208 30 Bytes für grafische Informationen über kleine 3x5-Ziffern (drei Bytes pro Ziffer) gespeichert.

Zusätzlich zum Hauptprogramm für den Mikrocontroller habe ich drei weitere Hilfsprogramme für den Computer geschrieben, auf die weiter unten eingegangen wird. Alle Programme haben keine grafische Oberfläche und arbeiten über die Befehlszeile von Windows XP.

Mit dem ersten Programm können Sie Datum und Uhrzeit über den COM-Anschluss von einem Computer auf den Fahrradtachometer kopieren. Der Fahrradtachometer ist über den MAX232-Chip mit dem Computer verbunden. Mit WinAPI empfängt das Programm das aktuelle Datum und die aktuelle Uhrzeit in einer speziellen Strukturvariablen vom Typ SYSTEMTIME. Aus dieser Variablen werden der aktuelle Tag, Monat, Jahr, Wochentagsnummer, Stunden, Minuten, Sekunden im Dezimalformat extrahiert. Alle diese Zahlen mit Ausnahme des Jahres überschreiten nicht zwei Dezimalstellen (weniger als 100) und liegen innerhalb eines Bytes. Der Wert des Jahres wird in eine zweistellige Zahl umgewandelt, indem die Zahl 2000, der Wert des aktuellen Jahrtausends, davon abgezogen wird. Jede dieser zweistelligen Dezimalzahlen wird in das für den RTC-Chip charakteristische binäre Dezimalformat konvertiert. In diesem Format belegt eine zweistellige Zahl auch ein Volumen von einem Byte. Die höchstwertigen 4 Bits werden mit der Zehnerstelle und die niedrigstwertigen mit der Anzahl der Einheiten codiert. Anschließend wird aus diesen Zahlen ein 13-Byte-Paket gemäß einem Protokoll gebildet, das ich zuvor bestimmt habe. Die ersten fünf Bytes repräsentieren das Wort "TIME =" gemäß Standard-ASCII-Codierung. Dann folgen Sekunden, Minuten, Stunden, Wochentag, Tag, Monat, Jahr. Das letzte Byte ist das Zeichen "#" als Ende des Nachrichtenzeichens. Dieses Paket wird vom Computer über den COM-Anschluss an das Gerät gesendet. Das Mikrocontroller-Programm empfängt das Paket und überprüft es gemäß dem obigen Format auf Richtigkeit. Wenn die ersten fünf Bytes "TIME =" und das letzte "#" sind, wird das Senden als korrekt angesehen und die darin enthaltenen Bytes werden in der entsprechenden Reihenfolge interpretiert. Ohne diese Byte-Zeichenfolge zu ändern, sendet der Controller sie über den I2C-Bus an den RTC-Chip und konfiguriert sie für das aktuelle Datum und die aktuelle Uhrzeit. Ich stelle fest, dass diese Mikroschaltung die Berechnung der Wochentage von 1 bis 7 unterstützt, obwohl dies als solcher Kalender, der die Entsprechung von Datum und Wochentag bestimmt, nicht der Fall ist. Ich habe auf meinem Gerät keine Informationen zum Wochentag angezeigt.

Das zweite Programm dient zur Verarbeitung von Daten aus dem Inhalt eines externen ROM. Zunächst wurde angenommen, dass dieser Inhalt mit einem bekannten Programm, das mit bekannten MK- und ROM-Programmierern (z. B. „icprog“) zusammenarbeitet, aus dem ROM in die Bilddatei kopiert werden sollte. Nachdem ich das Prinzip des I2C-Betriebs genauer untersucht hatte, gelang es mir, diese Funktionalität zu implementieren und in mein Programm aufzunehmen. Das Schema des ROM-Programmiergeräts dieser Serie, das ich im Gerät verwendet habe, ist in der folgenden Abbildung dargestellt.



Das ROM ist mit dem COM-Port des Computers verbunden, der nicht als Mittel zum Informationsaustausch über RS-232 (wo es ausreicht, die Ausgänge von TX, RX, GND zu verwenden) verwendet wird, sondern als Mittel zur willkürlichen Eingabe / Ausgabe von logischen Signalen. Über den TX-Anschluss wird das ROM mit Strom versorgt, das vom 78L05-Regler auf 5 V stabilisiert wird. Durch Steuern der TX-Ausgabe vom Computer können wir den ROM-Chip ein- oder ausschalten. Die unidirektionale SCL-Taktleitung ist auf den RTS-Pin des COM-Ports konzentriert, und die bidirektionale SDA-Datenleitung ist auf zwei Pins konzentriert: CTS (Datenempfang) und DTR (Datenübertragung). Widerstände und Zenerdioden D1 und D2 werden verwendet, um den Signalpegel auf TTL zu begrenzen, an dem der ROM arbeitet.

Ich habe diesen Standardprogrammierer für meinen speziellen Fall entwickelt, bei dem anstelle eines ROM-Sockels ein SIM-Lesegerät eines defekten Mobiltelefons verwendet wird.



Über WinAPI greift das Programm auf die Pins des COM-Ports des Computers zu, setzt die dafür erforderlichen Werte (0 oder 1) und entfernt den eingehenden Binärwert aus dem ROM vom CTS-Pin. Basierend auf diesem Toolkit wurde die I2C-Funktionalität gemäß der entsprechenden Spezifikation implementiert, auf die ich nicht näher eingehen werde. Das Programm kann den Inhalt des ROM in ein Dateibild einlesen (wie ein normaler Programmierer) und auch eine solche Datei verarbeiten oder Informationen direkt aus dem ROM verarbeiten. Die Informationsverarbeitung besteht darin, die Ausgabestatistikdateien in einem vorbestimmten Tabellenformat basierend auf den Eingabeinformationen aus dem ROM zu erhalten. Jede solche Datei entspricht einer Auslösung (vom Moment des Stroms bis zum nächsten Einschalten des Geräts). Zunächst werde ich kurz das Eingabeformat beschreiben, das ich im Voraus definiert habe. Bei jedem Einschalten des Geräts werden zwei Byte Nullen in die aktuelle Adresse geschrieben, die aus dem EEPROM des Mikrocontrollers gelesen wird. Wenn sich das Rad nach einer Zeitüberschreitung oder nach dem Einschalten des Geräts (beim ersten Impuls) zu drehen beginnt, werden das aktuelle Datum und die aktuelle Uhrzeit im binären Dezimalformat geschrieben (wie es in den Registern des RTC-Chips gespeichert ist). Und dann werden zwei Bytes von "Einheiten" 0xFF aufgezeichnet. Während der Drehung des Rades wird für jeden k-ten Impuls (k = 2,3, ...) die Zeit der Raddrehung zwischen dem (k-1) -ten und dem k-ten Impuls durch zwei Bytes (hoch und niedrig) aufgezeichnet. Offensichtlich reichen diese Informationen aus, um die aktuelle (nicht absolute) zurückgelegte Strecke und die Geschwindigkeit mit Datum und Uhrzeit zu verknüpfen. Das Ausgabeformat ist Text und eine tabellarische Tabelle in * .csv-Dateien, die in Excel durch Doppelklick mit der Maus geöffnet werden. Die Zeilen in dieser Tabelle entsprechen den Radumdrehungen, und die Spaltenwerte sind unten aufgeführt.

ADRROM-Adresswert
DATUM / ZEITStartdatum und -zeit
Dez.Dezimaler Timer-Wert
ZeitAktuelle Zeit
tReisezeit seit dem Einschalten
vGeschwindigkeit
nGeschwindigkeit
S.Der Weg
anDie absolute Anzahl der Umdrehungen (nur innerhalb des aktuellen ROM)
aSAbsoluter Pfad (nur innerhalb des aktuellen ROM)
n_TagDie Anzahl der Umdrehungen für den aktuellen Tag
S_dayDer Weg für den aktuellen Tag
v_maxHöchstgeschwindigkeit für die aktuelle Fahrt
av_maxAbsolute Höchstgeschwindigkeit (nur innerhalb des aktuellen ROM)
v_midDurchschnittsgeschwindigkeit für die aktuelle Fahrt
Ein Screenshot des Inhalts einer solchen Datei in Excel ist in der folgenden Abbildung dargestellt. Außerdem werden Diagramme der Änderungen der aktuellen, durchschnittlichen und maximalen Geschwindigkeit in verschiedenen Farben in einem Koordinatensystem angezeigt. Argument (X-Achse) - Geschwindigkeitswerte als Eingabedaten. Die Abbildung zeigt die Parameteränderungen für die ersten 730 Umdrehungen. Die zurückgelegte Strecke ist mit dieser variablen linearen Abhängigkeit verbunden (730 Umdrehungen entsprechen ungefähr 1650 m). Daher können wir sagen, dass die Grafiken die Abhängigkeit der Geschwindigkeit von der Entfernung (genau auf die horizontale Skala) widerspiegeln, im Gegensatz zu der traditionellen Abhängigkeit der Geschwindigkeit von der Zeit, die beachtet werden sollte. Wie bereits erwähnt, beruht dieses Merkmal auf der Ideologie und dem Prinzip der Messung der Geschwindigkeit anhand der Radgeschwindigkeit. Schließlich ist jeder Umdrehung des Rades ein bestimmter Zeitpunkt zugeordnet (der Moment der Annäherung des Magneten und des Reed-Schalters). Natürlich ist diese Abfolge von Zeitstempeln nicht einheitlich. Aus Gründen der Formalität und Bequemlichkeit kann Excel jedoch ein Array von Zeitwerten im Pfad oder in der aktuellen Zeit als Argument für Diagramme angeben. Trotzdem sollte beachtet werden, dass die tatsächliche Abhängigkeit der Geschwindigkeit von der Zeit (in einheitlichen Zeitintervallen für den diskreten Fall) mit einer variablen horizontalen Skala anders ausgesehen hätte.





Die folgende Abbildung zeigt die gleiche Abhängigkeit der Geschwindigkeit von den Umdrehungen, verwendet jedoch bereits den Filter nach der Methode des gleitenden Durchschnitts mit einer Fensterbreite von 11 Umdrehungen. Alle Diagramme werden mit bekannten Methoden in Excel erstellt.



Beim Vergleich der beiden Graphen der Geschwindigkeitsänderung ist es offensichtlich, dass die Hochfrequenzkomponente in dem gefilterten Graphen fehlt, d.h. Lärm entfernt. Die Breite des gleitenden Durchschnittsfensters von 11 Umdrehungen (ca. 25 m) ist meiner Meinung nach zu groß. Wenn Sie wirklich die Frage nach dem Filtern von Messwerten aus Rauschen aufwerfen, reicht es aus, eine kleine Fensterbreite von beispielsweise drei zu verwenden. Dieser Algorithmus kann in das Fahrrad-Tacho-Programm integriert werden, da er nicht nur zur Analyse der Messwerte verwendet werden kann, sondern auch zur Anzeige dieser Messwerte in Echtzeit. Trotz der Einfachheit dieses Algorithmus werde ich nicht auf die Details seiner Beschreibung eingehen, da dieses Thema im Verlauf der Mathematik behandelt wird und den Rahmen dieses Artikels sprengt. Und hier ist eine weitere Klarstellung über die Durchschnittsgeschwindigkeit. Wie ich bereits geschrieben habe, ist die Durchschnittsgeschwindigkeit der einzige Parameter, der nicht bei jeder Umdrehung des Rades, sondern bei jeder Sekunde aktualisiert wird. Ich habe dies getan, um sicherzustellen, dass das Display auch bei sehr langsamen Bewegungen eine Änderung der Durchschnittsgeschwindigkeit anzeigt. Daher weichen die Werte der Messwerte auf dem Display in Echtzeit geringfügig von den Werten ab, die in Zukunft vom Computerprogramm beim Scannen des ROM berechnet werden. Die Messwerte für die absolute Geschwindigkeit, den absoluten Pfad und die absolute Höchstgeschwindigkeit unterscheiden sich ebenfalls. Das Display zeigt wirklich absolute Werte (für die gesamte Lebensdauer des Geräts) und in den Ausgabetabellen - nur innerhalb der Grenzen des aktuell gelesenen ROM.

Das dritte Programm ist im Wesentlichen das gleiche Programm für den Firmware-Mikrocontroller. Ich arbeite mit dem einfachsten „STK 200“ -Programmierer, der an den LPT-Anschluss des Computers angeschlossen ist, oder besser gesagt mit seinem Analog, wenn Sie es so nennen können, da der Programmierer im einfachsten Fall überhaupt keine aktiven Elemente enthält. Tatsächlich stellt MK über die SPI-Schnittstelle eine direkte Verbindung zu bestimmten Pins des LPT-Ports her und arbeitet als Slave. Das Programm implementiert ein Protokoll für den Datenaustausch mit dem ATmega8-Controller gemäß seinem Datenblatt (S. 237). Die physische SPI-Schicht wird implementiert, indem die LPT-Portregister mithilfe der bekannten dynamischen Bibliothek „inpout32.dll“ verwaltet werden. Meine Bibliothek ist nicht als Projekt verbunden (da ich das Erstellen eines Projekts als solches in „Dev-cpp“ vermieden habe, indem ich eine einfache „Datei“ erstellt habe), sondern mithilfe der LoadLibrary-Funktion unter Verwendung des Strukturtyps HINSTANCE. Die Bibliothek „inpout32.dll“ wird einer Variablen dieses Typs zugeordnet, und anschließend werden Zeiger auf Funktionen aus dieser Bibliothek in separate Variablen extrahiert. Inpout32.dll hat nur zwei Funktionen, die für die Eingabe und Ausgabe von Daten verantwortlich sind. Auf diese Funktionen wird mit vorextrahierten Zeigern zugegriffen. Die LPT-Port-Pins werden einzeln über Bitmasken gesteuert. In meinem speziellen Fall funktioniert das von mir geschriebene Programm mit dem EEPROM-Bereich des Controllers und dient zum Lesen, Sichern, Schreiben, Korrigieren und Wiederherstellen einer Sicherungskopie der darin gespeicherten Daten, die ich zuvor gezeichnet habe. Wie alle anderen Programme wird das Programm über die Befehlszeile ausgeführt. In solchen Fällen werden zur Implementierung der Multifunktionalität des Programms die "Switch-Case" -Funktionen und ein Textbenutzerdialog verwendet, z. B. "Geben Sie '1' für Operation Nr. 1 ein, ... geben Sie '0' ein, um das Programm zu beenden." Daten werden in verschiedenen für mich geeigneten Formaten angezeigt. Darüber hinaus kann das Programm einen vollständigen Speicherauszug des EEPROM-Controllers in 512 Byte auf dem Bildschirm anzeigen. Das Programm kann auch grafische Informationen zu den im Speicher des Controllers verwendeten Schriftarten aufzeichnen. Bei Kleingedruckten der Größe 3X5 bezieht das Programm Informationen aus der Textdatei "Fonts 3X5.txt", die sich im selben Verzeichnis befindet. Die Datei enthält eine tabellarische Tabelle mit 30 Bytes (3 x 10) im Hexadezimalformat. Falls gewünscht, kann es einfach in einem Texteditor bearbeitet werden, wodurch die Grafiken dieser Schriftart geändert werden. Wie bereits erwähnt, ist dieses Kleingedruckte so einfach, dass eine Änderung der Grafik keinen Sinn ergibt. Das einzige ist, dass die vertikale Verschiebung möglicherweise nur erforderlich ist, da ein Speicherplatz mit einer Höhe von 8 Pixeln vorhanden ist und die Schrift eine Höhe von 5 hat. Bei einer großen Schrift mit der Größe 8 x 8, die die aktuelle Geschwindigkeit anzeigt, habe ich die Funktionalität viel interessanter bereitgestellt. Grafische Informationen zu dieser Schriftart werden nicht in einer Textdatei als Bytetabelle, sondern in grafischen visuellen BMP-Dateien dargestellt. Jede Ziffer entspricht einer solchen Datei. Die Parameter sind Größe 8X8, monochrom mit einer Schwarz-Weiß-Palette. Unten sehen Sie einen Screenshot des bekannten Grafikeditors „MS Paint“ mit der darin geöffneten Datei „8.bmp“.



Empirisch habe ich die Struktur von monochromen BMP-Dateien untersucht, die von MS Paint erhalten wurden. Auf dieser Grundlage konnte ich lernen, jedes Pixel eines monochromen BMP-Bildes zu lesen (ohne Verwendung von Strukturen und Hilfsbibliotheken). In der Phase des horizontalen zeilenweisen Lesens von unten nach oben (so ist die Struktur der BMP-Datei organisiert) konvertiert das Programm die Informationen in das vertikale Format, das für die verwendete Anzeige spezifisch ist. Diese Operation wird in einem Durchgang ausgeführt, wobei Bitmasken und die Akkumulation von Variablenwerten verwendet werden. Im Folgenden werde ich diesen Codeabschnitt für die i-te Ziffer zeigen und dabei auf die Einfachheit des Prozesses achten.

for(k=0; k<8; k++){ fnt[i][k] = 0; } for(j=0; j<8; j++){ fseek(f, 62+4*j, SEEK_SET); byte = ~fgetc(f); for(k=0; k<8; k++){ if(byte & pow2(7-k)){ fnt[i][k] += pow2(7-j); } } } 

In der ersten Schleife werden die Elemente des fnt-Arrays mit Nullen initialisiert. Ferner trägt jedes k-te Element dieses Arrays (k = 0 ... 7) für die i-te Ziffer (i = 0 ... 9) grafische Informationen über jede entsprechende Spalte jeder entsprechenden Ziffer. Der nächste Zyklus ist der Lauf entlang des Bildes der BMP-Datei. Mit dem Operator fseek positionieren wir uns Bytes am Offset 62 + 4 * j der vordefinierten BMP-Datei f. Die Spezifität der Formel, mit der der Versatz in Abhängigkeit von der Zeilennummer j berechnet wird, wird durch die Struktur der BMP-Datei bestimmt. In der Byte-Zwischenvariablen erhalten wir den Byte-Wert am obigen Offset. Dieses Byte speichert Informationen über alle acht Pixel eines monochromen Bildes in der aktuellen Zeile j. Der Operator '~' führt eine bitweise Inversion des Bytes durch, was zu einer Farbinversion jedes Pixels führt. Dies liegt an der Tatsache, dass ein schwarzes Pixel in der Palette einer monochromen BMP-Datei einer logischen „0“ und Weiß - „1“ entspricht. Im angewandten Display dagegen. In einer verschachtelten Schleife findet eine Byteanalyse des Bytes statt und gleichzeitig werden Informationen im fnt-Ausgabearray akkumuliert. Funktion pow2 - Erhöhen einer Zwei auf eine nicht negative ganzzahlige Potenz, unabhängig geschrieben. Anstelle dieser Funktion können Sie den effizienteren bitweisen Verschiebungsoperator "<<" verwenden, aber zum Zeitpunkt des Schreibens dieses Programms habe ich es nicht verwendet.

Darüber hinaus bietet das Programm die Möglichkeit, eine von mehreren Grafikoptionen für diese Schriftart meiner Wahl in den Speicher von MK zu schreiben. Diese Optionen werden mithilfe von Verzeichnissen (Ordnern) mit einem Namen der Form "v1", "v2", "v3" usw. implementiert, die sich im Ordner "Fonts 8X8" im selben Verzeichnis wie das Programm befinden. Und schon in diesen Ordnern befinden sich die notwendigen BMP-Dateien. Dank der oben genannten Funktionalität ist es möglich, Zahlen aus einem „leeren Blatt“ in einem grafischen Editor zu korrigieren oder zu zeichnen und diese zu speichern und auf Verzeichnisse zu verteilen. Ich habe drei Schriftartenoptionen. Die erste Option ist das Original. Die zweite - wie das Original, jedoch mit einer durchgestrichenen Null und einer modifizierten Einheit (ohne Unterstrich). Die dritte ist eine Schriftart mit einem rechteckigen Rand.

Die Fotos unten zeigen: die hergestellte Leiterplatte des Geräts von hinten; ein Gerät auf dem Tisch, an das Strom angeschlossen ist (mit einer nicht endgültigen Version der Firmware); ein in Betrieb befindliches Gerät, das an einem Fahrrad montiert ist und auf dem ein Diagramm der Geschwindigkeitsänderungen angezeigt wird.







Während des Betriebs der Vorrichtung wurden jedoch kleine Fehler identifiziert, die mit den Herstellungsmerkmalen verbunden waren. Zuallererst - schlechter Kontakt des Displays mit den Pads der Leiterplatte. Beim Original-Mobiltelefon sind die Kontakte auf der Platine vergoldet und es kommt zu keiner Oxidation. In meinem Fall sind sie einfach verzinnt.

Auf der Grundlage des Vorstehenden wurde beschlossen, das Gerät in einem anderen Fall neu zu erstellen und die Leiterplatte neu zu erstellen, auf die das Display unverschämt gelötet wird. Ich habe diesen Prozess kürzlich gestartet. Das Ergebnis ist ein robusteres Design.







Ich habe den Fall für das Gerät aus einem 17 mm dicken Stück Plexiglas auf einer CNC-Fräsmaschine hergestellt. Zu diesem Zweck habe ich die Skizzen des Falls im SPlan-Programm vorläufig skizziert, wobei ich das Thema Zeichnungen, CAD usw. fast vollständig nicht kannte.



Diese Skizzen werden für die allgemeine Darstellung und das Erhalten der Koordinaten von Kontrollpunkten benötigt. Darauf aufbauend wird ein Programm für die CNC-Maschine geschrieben, das die allgemeinen Prinzipien und Abläufe des Fräsens berücksichtigt. Ich habe das CNC-Programm manuell in Excel geschrieben und dabei die Autocomplete-Funktionen für wiederholte Vorgänge verwendet.





Ich habe auch das Gerätelayout leicht korrigiert, es ist in der folgenden Abbildung dargestellt.



Anstelle der ohnehin schon unnötigen Hintergrundbeleuchtung der Tastatur gibt es eine LED für Schönheit, die bei jeder Umdrehung des Rades blinkt. Die Anschlüsse werden ebenfalls neu gezeichnet, und es gibt keine anderen Elemente, die in der aktualisierten Version des Designs nicht benötigt wurden. Außerdem habe ich Quarz 4,433619 MHz gefunden und installiert, wobei einige Konstanten im Quellcode meines eigenen Programms leicht korrigiert wurden. Einige kleinere Änderungen am Programm wurden ebenfalls vorgenommen.

Ein Foto des fertigen Produkts ist unten dargestellt. Das Gerät wird von einer Batterie gespeist, die an Bord des Fahrrads steht. Daraus ergibt sich auch eine Beleuchtung für Fahrten im Dunkeln.



Bei diesem Design funktionierte das Gerät völlig störungsfrei. Der einzige Nachteil ist die Verwendung eines nicht sehr hochwertigen RTC-Chips: Im Winter bei niedrigen Temperaturen ist die Zeit merklich in Eile, Sie müssen sie einmal im Monat anpassen.

Source: https://habr.com/ru/post/de414281/


All Articles