Compact Plus Blutzuckermessgerät-Hardware
Hardware
Übersicht Hardware
- OLED Display 102×80 Pixel incl. 16 Helligkeitsstufen pro Pixel / SSD1325 /43x36 mm gesamt
- Atmega168PA
- DC/DC-Wandler (Regler und Drosseln)
- IR-Sender/Empfänger
- 3 Tasten (4 wenn man den Schließer der Klappe mitzählt)
- 2 Elektromotoren
- kleine Lichtschranke/Barcodescanner
- kleines Spektrometer (2 * LEDs rot, IR(?)-LED, Fotodiode)
- Betriebsspannung 3V (2*AAA)
- SMD Piezo-Summer
Gerät als Ganzes
Das unzerlegte Gerät. Ganz links ist die Stechhilfe.
Gerät zerlegen
Das Gehäuse besteht aus drei ineinander einrastenden Teilen (keine Schrauben). Relativ schadlose Demontage durch vorsichtiges Aufhebeln möglich. Erst das Seitenteil (links) ganz oben und 2 cm von unten ausrasten. Von unten anfangen die Gehäusehälften zu lösen, bis man sie über die Oberkante aufklappen kann.
Die Platine selbst ist mit 2 Schrauben und ein paar Clipsen befestigt. Vor dem Entnehmen ist der untere Folienstecker abzuziehen.
Das geöffnete Gerät ohne Platine. Gut zu erkennen (im unverkleinertem Bild) sind die zwei Motoren und die Mechanik die dafür sorgen, dass die Aufbewarungstrommel gedreht und die Messstreifen herausgefahren werden können.
Komponenten
Board
Hochauflösende Scans beider Platinenseiten. Die Bauteile sind nach bestem Wissen und Gewissen bezeichnet (für spätere Schaltpläne). Speziell bei den Widerständen und Kondensatoren ist noch eine Kontrolle notwendig. Ich habe dabei alle blauen und schwarzen Bauteile als Widerstände und alles graue und weiße als Kondensatoren gedeutet.
Änderungen bitte mir (Netzwanze) melden.
Stromversorgung
Die zwei AAA Zellen sind in Serie geschaltet. Ein Schaltregler [IC7] erzeugt daraus 3.3 V. Ein Schaltregler [IC6] erzeugt daraus 12 V für das OLED.
Bauteilliste
Nach bestem Wissen und Gewissen bestimmt durch Kombination aus Schaltplänen und Messungen. Bei Komponenten mit "(?)" bin ich mir nicht sicher.
Bauteil | Größe |
---|---|
R1 | 820 kOhm |
R3 | 1 kOhm |
R4 | 1 kOhm |
R5 | 10 kOhm (Pull-Up nach Vcc für Reset) |
R11 | 100Ω |
R13 | 1 kOhm |
R14 | 10 kOhm |
R17 | 1 kOhm |
R29 | 15Ω |
R29 | 15Ω |
R35 | Temperaturfühler; NTC 10 kOhm bei 20°C (?) |
R36 | 10 kOhm |
R37 | 10 kOhm |
R43 | 100 kOhm |
R44 | 100Ω |
R45 | 39 kOhm |
R46 | 1 MOhm |
C24 | 22 µF (?) |
C38 | 4,7 µF |
C39 | 4,7 µF |
C44 | 100 nF |
C45 | 470 nF (?) |
C46 | 10 pF |
L2 | 100 uH |
IC1 | ASIC |
IC2 | ATmega168PV-10MU |
IC3 | Atmel AT25640A SPI EEPROM (64k, 8192*8) |
IC4 | NC7NP14 ULP Triple Inverter with Schmitt Trigger Input |
IC5 | 74LVC1G86GV (Markierung V68) |
IC6 | TPS61080 Step-up 12 V |
IC7 | AS1329, Step-up 3,3 V |
IC8 | BIG 01 A825MFL ???? |
IC9 | IR (TFDU2201) |
Buzzer | Piezo Schallwandler |
D1 | BAT54W |
T2 | ZXTN23015CFH (NPN) |
XTAL1 | 32 Khz |
XTAL2 | 4 Mhz |
Pinbelegung Mega168
Wie oben mittles Messungen ermittelt. Ohne Garantie auf Vollständigkeit und Richtigkeit.
Pin | Port | Funktionen | Verwendung |
---|---|---|---|
1 | PD3 | (PCINT19/OC2B/INT1) | Taste Mitte (S2) |
2 | PD4 | (PCINT20/XCK/T0) | Display SCLK (XCLK) |
3 | GND | GND | |
4 | VCC | VCC | |
5 | GND | GND | |
6 | VCC | VCC | |
7 | PB6 | (PCINT6/XTAL1/TOSC1) | an Transistor T2 (schaltet BAT+ über 2x R29 (7.5Ω) gegen GND - vermutlich um zu messen, ob die Batteriespannung unter Last stark einbricht) |
8 | PB7 | (PCINT7/XTAL2/TOSC2) | enable 3.3V step-up (über R12; High = aktiviert) |
9 | PD5 | (PCINT21/OC0B/T1) | VCC enable (12 V step-up) |
10 | PD6 | (PCINT22/OC0A/AIN0) | frei |
11 | PD7 | (PCINT23/AIN1) | direkt an Batteriespannung |
12 | PB0 | (PCINT0/CLKO/ICP1) | an Transistor T1 (schaltet 12 V über 100Ω gegen GND als Grundlast bzw. zum Entladen) |
13 | PB1 | (PCINT1/OC1A) | Display /CS |
14 | PB2 | (PCINT2/SS/OC1B) | über R17 an IC1. Anschluss des Buzzers möglich |
15 | PB3 | (PCINT3/OC2A/MOSI) | ISP MOSI |
16 | PB4 | (PCINT4/MISO) | ISP MISO |
17 | PB5 | (SCK/PCINT5) | ISP SCK |
18 | AVCC | mit Beschaltung an VCC | |
19 | ADC6 | Batteriespannung? (3.3Volt StepUp dafür abschalten) | |
20 | AREF | mit Filterkodensator C9 an GND. Interne Referenz 1,1V verwenden (REFS1=1, REFS0=1) | |
21 | GND | GND | |
22 | ADC7 | Ausgang des 3,3V step-up über Spannungsteiler. Mit Step-Up wird 707 gemessen, ohne ca. 637. | |
23 | PC0 | (ADC0/PCINT8) | Batteriespannung über Spannungsteiler (R31/C31 an Masse und über R30 an Batteriespannung), bei voller Batterie (3V) 0,68V ca. 638 |
24 | PC1 | (ADC1/PCINT9) | Display D/C |
25 | PC2 | (ADC2/PCINT10) | Display RESET |
26 | PC3 | (ADC3/PCINT11) | über R4 an IC1 |
27 | PC4 | (ADC4/SDA/PCINT12) | Taste Links (S1) |
28 | PC5 | (ADC5/SCL/PCINT13) | Taste rechts (S3) |
29 | PC6 | (RESET/PCINT14) | ISP Reset |
30 | PD0 | (RXD/PCINT16) | über R37 an GND und über R3 an IC1 |
31 | PD1 | (TXD/PCINT17) | Display SDIN. Achtung, ist auch TxD (UART-SPI möglich) |
32 | PD2 | (INT0/PCINT18) | über R14 an GND und über R13 an IC1 |
Unbekanntes IC1
Hier mal der Dekodierte Barcode des noch Unbekannten IC1. Der decodierte Text ist:
25SLEATM 8R4222 084420179+2P00+PLCMC
IC9 (IR)
Ist wohl ein TFDU2201 (Datenblatt).
Buzzer
Ist ein Piezo Schallwandler. Es ist möglich eine ihn mit PB2 des mega168 zu verbinden. Im Bereich "Kurzzeitwecker mit 7-Segment-Anzeige" auf adriano6's Webseite.
Display
Das Display basiert auf OLED - Technologie und besitzt eine Auflösung von 102×80 Pixel, von denen jedes 16 Helligkeitsstufen darstellen kann. Displaycontroller ist SSD1325.
Detailierte Informationen zum Display gibts auf adriano6's Webseite
Inbetriebnahme auf dem Board
Es ist möglich das Display auf dem Board in Betrieb zu nehmen, wenn alle Komponenten bis auf: R1, R43, R44, R45, R46, C24, C38, C39, C44, C45, C46, L2, IC6 und D1 entfernt werden. T1 und R11 sind vermutlich als Grundlast zum Start des 12 V Step-up und zum Entladen des OLED beim Abschalten. Die folgende Tabelle enthält die Pads des Atmega168 Footprints und die entsprechenden Pins am Display.
Pad am Atmega168 | Pin am Display |
---|---|
PD1 | SDIN |
PD4 | SCLK |
PC1 | D/C |
PC2 | RESET |
PB1 | /CS |
Grafikbeschleunigung mit dem SSD1325
Mit dem im SSD1325 vorhandenen Befehlen Copy, DrawRectangle und HorizontalScolling kann man ein paar nette Animationen machen, bzw. dem ATmega eine Menge Arbeit abnehmen (Details zu Controller und Display stehen im Datenblatt und hier ).
Der Displaycontroller verfügt über ein 64x80 Bytes großes RAM, von dem das Display aber nur 51x80 Bytes (102x80 Pixel) darstellt, beginnend von Spalte 7 bis Spalte 57:
Col0 | ... | Col6 | Col7 | ... | Col56 | Col57 | Col58 | ... | Col63 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
D7-4 | D3-0 | ... | ... | D7-4 | D3-0 | D7-4 | D3-0 | ... | ... | D7-4 | D3-0 | D7-4 | D3-0 | D7-4 | D3-0 | ... | ... | D7-4 | D3-0 |
Schaltet man im Controller nun Wraparound für das Scrolling- und Copy-Commando ein, hängen Ende und Anfang der jeweiligen Zeile hintereinander:
Col58 | ... | Col63 | Col0 | ... | Col6 |
Aus Sicht des Copy- und DrawRectangle-Kommandos kann man jetzt folgendermaßen auf den nicht sichtbaren Bereich des Display-RAM zugreifen:
Col58 | ... | Col63 | Col64 | ... | Col70 |
Um Daten in diesen Bereich zu bekommen, könnte man einen entsprechenden Bildschirmausschnitt definieren und die Daten einfach sequentiell da rein schreiben. Praktisch hat das aber nicht einwandfrei funktioniert. Besser schreibt man zuerst in den sichtbaren Bereich und kopiert dann den Block in den Bereich ab Spalte 58. Statt jetzt Grafiken byteweise über die Schnittstelle in das RAM zu schreiben braucht man sie nur noch durch den Controller vom unsichtbaren Bereich (maximal 26x80 Pixel) in den sichtbaren kopieren zu lassen.
Ich habe eine kleine Demo geschrieben, die mit dem Copy-Befehl 8 Sprites (sich drehende Bälle) fliegen läßt und bei jeder Randberührung eines Sprites einen Zähler erhöht. Im Hintergrund laufen je eine horizontale und vertikale Linie (Rechteck) durch. Das Ganze verbraucht mit Software-SPI ca. 20% Rechenzeit des ATmega, bei Hardware-SPI sind es ca. 6%.
Um auch in horizontaler Richtung eine pixelgenaue Bewegung zu erreichen, erstellt man für jedes Sprite zwei um jeweils ein Pixel verschobene Versionen, und kopiert diese nacheinander auf die selbe Spaltenposition.
Das Timing ist etwas kritisch, da vom Controller keine Rückmeldung möglich ist, man muß ggf. die Wartezeit nach einem Kommando versuchsweise ermitteln. Schickt man das nächste Kommando zu früh ab, wird das gerade laufende abgebrochen, was nicht immer schön aussieht oder sogar den Controller zum Abstürzen bringt.
Bei Ansteuerung mit Hardware-SPI muß man außerdem ca. 2µs warten, bevor das CS-Signal deaktiviert werden kann.
Spektrometer
Im Grunde genommen, handelt es sich um eine Reflexlichtschranke mit zwei roten LEDs, einer vermutlich infraroten LED, sowie einer Fotodiode.
Software
Programmierung
AVRdude
Auslesen der Fuses
avrdude -p m168 -P /dev/ttyUSB0 -c avrispv2 -F -v
avrdude: Device signature = 0x1e940b avrdude: Expected signature for ATMEGA168 is 1E 94 06 avrdude: safemode: lfuse reads as 42 avrdude: safemode: hfuse reads as D6 avrdude: safemode: efuse reads as 1
Flashen mit AVRdude
Da die IDs von ATmega168 und ATmega168A abweichen, muss die Option -F mit avrdude verwendet werden.
avrdude -p m168 -P /dev/ttyUSB0 -c avrispv2 -F -u -U flash:w:Oled-Demo.hex
Fuses mit AVRdude
Der ATmega168A hat die Fuse CLKDIV8 eingeschaltet. Durch Ändern der LFUSE von 0x42 auf 0xC2 (Bit7) wird der Teiler deaktiviert und der ATmega läuft mit voller Geschwindigkeit (8MHz):
avrdude -p m168 -P /dev/ttyUSB0 -c avrispv2 -F -U lfuse:w:0xC2:m
Programme
µC
- Grafikdemo: http://www.mikrocontroller.net/topic/109648#1419368
- Video: http://vimeo.com/6609124
- Kurzzeitwecker: http://www.mikrocontroller.net/topic/109648#1412841
- serielle Displaysteuerung: http://www.mikrocontroller.net/topic/109648#1487494
- Software-I2C + Drucksensor HP03: http://www.mikrocontroller.net/topic/109648#1653266
- Serielles Terminal: http://cforcode.wordpress.com/2011/06/01/accuterm-serielles-terminal-auf-dem-blutzuckermessgert-accu-chek/
PC
- gibt als Header gespeicherte Bilder auf std aus
- Erweiterter (ungetesteter) Konvertierer für Bilder in Format für Display
Links
Technische Dokumente
- Datenblatt für Display-Controller
- AVR Produktseite ATmega168PA mit Datasheets
- Patentschrift zu Gerät