Borg16
Borg16 Release status: Stable [box doku] | |
---|---|
Description | Ein 256-LED Displaycontroller |
Author(s) | Various (Suschman) |
Last Version | 2.0 () |
Platform | AVR (ATmega32) |
Download | Software: SVN browse Hardware: SVN browse |
„Stable“ befindet sich nicht in der Liste (experimental, beta, stable, obsolete, unknown) zulässiger Werte für das Attribut „Pr status“.
About
Der Borg16 ist eine auf Andres originalem 16x16 Borg basierende, professionell hergestellte Platine zur Ansteuerung von 256 Leds. Üblicherweise sind diese als eine Matrix von 16x16 Leds angeordnet, aber auch andere Formate sind möglich. Sie bietet eine serielle Schnitstelle und einen Anschluss für bis zu zwei Joysticks im 9-Pin Atari-Standard. Zusätzlich kann ein Canbus-Controller oder RMF12 Funkmodul zur Vernetzung bestückt werden.
Die LEDs werden durch die Borgware mit vier Helligkeitsstufen angesteuert. An Software existiert bereits eine breite Palette an Spielen, Demos und Testprogrammen. Zur Entwicklung neuer Software kann auch ohne Hardware der Simulator verwendet werden.
Auf den Labortagen 2012 wurde ein einführender Vortrag über den Borg 16 gehalten, hier: Borg16 - Getting started ist das Video dazu. Die Bauteile für den Borg16 gab es zusammen mit den Platinen auf dem Congress 2007 in Berlin als fertige Tüte.
Aufbau
Hardware
V1
V2
Bauteile
Bestückungsliste: Position Bauteil/Wert C1 330µF C2 100nF C3 100nF C4 100nF (Wird nicht bestückt) C5 100nF C6 18pF C7 18pF D1 1N4148 D2 1N4004 IC1 UDN2981AN IC2 UDN2981AN IC3 74HCT164N IC4 74HCT164N IC5 ATMEGA32 LED1 LED 5mm Grün LED2 LED 5mm Rot R01-R16 *Siehe Text* R17 10K R18 10k R19 10k R20 1k R21 1k R22 1k R23 1k R24 33k T01-T16 IRLD024 T17 BC547B T18 BC547B X1 16Mhz Quarz (HC49/U) RESET Kurzhubtaster PWR Hohlsteckerbuchse ISP Stiftleiste. 2x5 COL Wannenbuchse 16Pol ROW Wannenbuchse 16Pol JOY Sub-D9 Male RS232 Sub-D9 Female IC6 MCP2510P (Optional) IC7 MCP2551P (Optional) CAN (Optional)
Borg16V2 Bestückungsliste: Position Bauteil / Wert C1 470µF C2 100nF C3 100nF C4 100nF (Wird nicht bestückt) C5 100nF C6 18pF C7 18pF D1 1N4148 D2 1N4004 IC1 UDN2981AN IC2 UDN2981AN IC3 74ACT164N IC4 74ACT164N IC5 ATMEGA32 LED3 LED 3mm Gelb R01-16 Passend für LEDs, siehe Text R18 10k R19 10k R20 1k R21 1k R26 1k T17 BC547B T18 BC547B X1 16Mhz Quarz (HC49/U) RESET Kurzhubtaster PWR Hohlsteckerbuchse ISP Stiftleiste. 2x5 COL Wannenbuchse und Pfostenstecker 16Pol ROW Wannenbuchse und Pfostenstecker 16Pol 16 adriges Flachbandkabel JOY Sub-D9 Male RS232 Sub-D9 Female T01-T16 IRLD024 Can Option: R17 10K IC6 MCP2510SO IC7 MCP2551SN R24 33k LED1 LED 5mm Grün LED2 LED 5mm Rot R22 1k R23 1k CAN RFM12 Option: IC8 RFM12 R25 10k ANT ca 17,5cm Kabel Die RFM12 und CAN Optionen schliessen sich leider gegenseitig aus, es geht immer nur eines von beidem!
Bausatz
Diesen Bausatz kannst du im Labor kaufen.
Reicheltliste
Hier gibt es die Teileliste (inkl. Reichelt Warenkorb), CAN und RFM12 sind optional.
Bestückung
Kleine Ungereimtheiten noch korrigieren, die Bestückungsliste ist korrekt
Die Bestückung der Platine läuft, wenn du schonmal einen Bausatz zusammengelötet hast, nach dem bekannten Schema ab. Sollte dies dein erstes Bauprojekt sein, empfiehlt es sich das Tutorial von Microcontroller.net zu lesen.
Zunächst werden die Widerstände ab R17 der Reihe nach bestückt. R1 bis R16 sind die LED-Vorwiderstände. Diese sind von den von dir verwendeten LEDs abhängig und im Bausatz nicht enthalten. Danach kommen alle ICs an ihre Plätze, für den Microcontroller ist ein Sockel empfehlenswert. Nun folgen die Zeilentreiber in Form der MOSFETs T1 bis T16. Deren großer Doppelpin zeigt dabei in Richtung der Wannenstecker. Jetzt kommen der Reset-Taster, die Verpolschutzdiode 1N4001 (D2) und der Quarz an ihren Platz. Weiter geht es mit den Kondensatoren 18pF (C6, C7) und 100nF (C2, C3, C5). C4 wird nicht bestückt. Die Diode 1N4148 (D1) wird stehend festgelötet, dabei zeigt der schwarze Ring auf dem Bauteil in Richtung des Strichs auf dem Bestückungsdruck. Dann werden die Transistoren T17 und T18, die LEDs, die Wannenstecker, die ISP-Steckerleiste, die Hohlsteckerbuchse (PWR) und die Sub-D Buchsen verlötet. Die weibliche Buchse kommt dabei auf den RS232-Port.
LED Matrix
Die Reihen haben jeweils eine gemeinsame Anode, die Spalten jeweils eine gemeinsame Kathode. Bei einer korrekt aufgebauten Matrix (Draufsicht von vorne) liegen die "Pin 1"-Leitungen der Spalten und Zeilen in der rechten oberen Ecke (von hinten drauf geschaut also links oben). Die Borgware kann einen spiegelverkehrten Aufbau mittels der Option Borg Hardware/Borg16 port setup/reverse cols in Software ausgleichen. Dies kostet allerdings Rechenzeit, was sich u.a. in langsameren Plasma-Animationen zeigt. Besser gar nicht erst falsch verdrahten.
Für den Bau des eigentlichen Displays eignen sich LEDs beliebiger Größe (zB. 3mm, 5mm, 10mm Durchmesser) und Farbe. Nur blaue und weiße LEDs haben eine zu hohe Dropout-Spannung, wer sie unbedingt verwenden will muss die Steuerung mit 6V betreiben. Wichtig ist es, nicht zu sparsam zu sein und LEDs mit 400mcd Helligkeit oder mehr zu verwenden, keine low-cost oder preiswerte Standardware. Diese verkraften die hohen Pulsströme nicht und leuchten sehr dunkel.
(Hier Beispielliste möglicher Led-Widerstand Kombinationen eintragen - WIP)
- Osram 3mm Kingbright Amberfarben - 22 Ohm ??
- Osram 5mm Kingbright Rot (Reichelt Bestellnummer "LED 5-4500 RT") - 12 Ohm
- Osram 10mm Kingbright Rot (Reichelt Bestellnummer "LED 10-4500 RT") - 12 Ohm
LED Vorwiderstand berechnen
Über die Treibertransistoren gehen ca. U_treiber = 1.5-2V verloren. Die Spannung über den Vorwiderstand kann also mit
U_r = U_betrieb - U_treiber - U_led berechnet werden.
Beispiel: rote LED hat 2V Abfall, Treiber Abfall mit 2V angenommen, 5V Betriebsspannung:
U_r = 5V-2V-2V = 1V
Der Vorwiderstand wir nun nach R=U/I berechnet. Für einen LED-Pulsstrom von 100mA:
R = 1V/0.1A = 10 Ohm
Da die LEDs mit 1/16 Einschaltdauer bei ca. 100Hz angesteuert werden, kann man ihnen ruhig Überstrom geben.
Das Datenblatt sagt dazu genaueres, wieviel erlaubt ist. Alle LEDs sollten mindestens 50mA vertragen können.
Die Schaltung kann Pulse bis zu 200mA erzeugen mit passendem Vorwiderstand. Dann muss das Netzteil aber auch 16*200mA = 3.2A liefern können.
Für blaue oder weiße LEDs kann die Schaltung mit 6V Betreibsspannung versorgt werden, damit die LEDs strotz der Spannungsabfälle über die Treiber noch ihre 3.5V bekommen. Noch höher sollte man die Versorgungsspannung aber nicht machen, weil sonst der Mikrokontrolller oder andere Teile leiden könnten.
Zum Berechnen des Widerstandes gibt es auch einen praktischen Vorwiderstandsrechner.
Aufbau
- in Ikea Bilderrahmen RIBBA in der Größe 50x50x4.5 cm (Bauvorschlag)
- auf Lochraster mit Milchtransparentem Plexiglas (Bauvorschlag)
- Marcus hat eine detaillierte Bauanleitung für seinen RainbowBorg geschrieben
Es ist empfehlenswert, die Löcher für die LED-Beinchen um 45° versetzt zu bohren/lasern. Das hat den Vorteil, etwas mehr Platz zwischen Anoden- und Kathodendrähten zu bekommen.
Plexiglas gibt es beim stegplattenshop.com (kostenloser Zuschnitt!) in Castrop-Rauxel oder bei Ebay, Handelsbezeichnung "PLexiglas XT Opal Weis" in unterschiedlichen Graden an Lichtdurchlässigkeit. Etwas teurer ist der Plexiglas-Shop von Evonik, der allerdings auch ausgefallenere Materialien wie das schwarze 9H04-truLED-Plexiglas führt.
Günstige LEDs in verschiedenen Farben und Größen gibt es bei www.easyseller24.de. Es handelt sich dabei um B-Ware (siehe Marcus' Bauanleitung für Details), allerdings ist die Qualität der LEDs für einen Borg gemeinhin ausreichend.
Programmieren
Der Borg16 lässt sich ganz normal über die ISP-Schnittstelle mit STK-200-Belegung programmieren (das ist zum Beispiel die übliche 10-Pin-Belegung von USBasp-Programmiergeräten). In der Draufsicht der Platine ist Pin 1 für den ISP rechts oben, sofern die Buchsen PW, JOY und RS232 in Richtung Süden zeigen.
Bei erstmaliger Inbetriebnahme eines ATMega muss der SLOW-Jumper (J3) des USBasp gesetzt sein. Dies hängt damit zusammen, dass der Controller zunächst mit einem internen Taktgeber von 1 MHz arbeitet und die Daten des USBasps zu schnell über die ISP-Schnittstelle übertragen werden. Sobald der externe Taktgeber über die Fuses (siehe unten) konfiguriert ist, braucht der SLOW-Jumper nicht mehr gesetzt zu werden.
Fuses
Ein Mikrocontroller bedarf vor der ersten Verwendung einmalig einer Konfiguration mittels sogenannter Fuses, wobei wir zwischen lfuse und hfuse unterscheiden. Sie werden jeweils durch ein Byte repräsentiert. Die genaue Bedeutung der einzelnen Bits dieser Bytes lässt sich aus dem Datenblatt des jeweiligen Mikrocontrollers entnehmen. Konkret stellen wir bei den ATmegas folgendes ein:
- Nutzung eines externes Quarzes mit 16 MHz
- EEPROM-Inhalte bleiben beim Flashen erhalten
- Bootloader nutzen (optional)
- Bootloadergröße von 512 Words (1024 Bytes)
- serielle Programmierung über ISP zulassen
Die folgende Tabelle gibt die richtigen Fuse-Werte für alle derzeit auf dem Borg16 unterstützten Mikrocontroller an (jeweils mit und ohne Bootloader-Option):
Controller | Bootloader | lfuse | hfuse | avrdude-Befehl für USBasp |
---|---|---|---|---|
ATmega32 | ja | 0xef | 0xc4 | avrdude -c usbasp -p m32 -U lfuse:w:0xef:m -U hfuse:w:0xc4:m
|
ATmega32 | nein | 0xef | 0xc5 | avrdude -c usbasp -p m32 -U lfuse:w:0xef:m -U hfuse:w:0xc4:m
|
ATmega644 | ja | 0xe7 | 0xd6 | avrdude -c usbasp -p m644 -U lfuse:w:0xe7:m -U hfuse:w:0xd6:m
|
ATmega644 | nein | 0xe7 | 0xd7 | avrdude -c usbasp -p m644 -U lfuse:w:0xe7:m -U hfuse:w:0xd7:m
|
ATmega644P | ja | 0xe7 | 0xd6 | avrdude -c usbasp -p m644p -U lfuse:w:0xe7:m -U hfuse:w:0xd6:m
|
ATmega644P | nein | 0xe7 | 0xd7 | avrdude -c usbasp -p m644p -U lfuse:w:0xe7:m -U hfuse:w:0xd7:m
|
Der Fuse-Calculator von Engbedded kann die hexadezimalen Werte der Fuses in sprechende Namen übersetzen. Die dort verwendeten Bezeichnungen lassen sich dann bequem im Datenblatt des jeweiligen Controllers nachschlagen.
Flashen der Firmware mit dem USBasp
Dieser Abschnitt geht davon aus, dass bereits ein Firmware-Image mit dem Namen image.hex
im aktuellen Verzeichnis vorliegt. Ein solches Image lässt sich mit Hilfe eines eines USBasp-Programmiergerätes folgendermaßen flashen.
Controller | avrdude-Befehl |
---|---|
ATmega32 | avrdude -c usbasp -p m32 -U f:w:image.hex
|
ATmega644 | avrdude -c usbasp -p m644 -U f:w:image.hex
|
ATmega644P | avrdude -c usbasp -p m644p -U f:w:image.hex
|
Wird die Borgware 2D direkt mittels ISP auf den ATmega übertragen, geht ein eventuell zuvor aufgespielter Bootloader verloren. Dementsprechend ist der Bootloader in den Fuses ggf. zu deaktivieren.
Serieller Bootlader
Der hintere Teil des Flash-ROMs kann per Fuse für einen Bootloader reserviert werden, der nach einem Reset direkt gestartet wird. Er kann dann bei Bedarf die eigentliche Firmware von anderen Quellen wie der seriellen Schnittstelle nachladen und im vorderen Teil des Flash-ROMs abspeichern, ansonsten springt er direkt in die eigentliche Firmware.
In der AVR109 Application Note beschreibt Atmel ein Protokoll zum Programmieren von AVR-Controllern über die serielle Schnittstelle. Dieses Protokoll wird von vielen AVR-zentrierten Werkzeugen (u.a. von avrdude) unterstützt. Unter Zuhilfenahme eines entsprechenden Bootloaders verhält sich der Borg16 dann selbst wie ein serielles Programmiergerät. Mit einem normalen Verlängerungskabel (1-zu-1) oder USB-RS232-Wandler lässt sich das Board dann neu programmieren.
In früher angebotenen Bausätzen haben wir den Foodloader auf dem Mikrokontroller vorinstalliert. Leider ist besagter serieller Bootloader nicht mehr mit neueren Versionen des GNU-C-Compilers kompatibel (Compiler-Fehler bzw. Build sprengt die Größe von 512 Words). Als Alternative empfehlen wir den AVRProg Boot 0.85 von Martin Thomas et al. Die Quellen gibt es hier. Zu dessen Konfiguration sei auf den Borg16-Vortrag verwiesen.
Ein leerer Controller (bzw. ein Controller ohne Bootloader) muss zunächst mittels eines Programmiergeräts über die ISP-Steckerleiste mit einem Bootloader-Image programmiert werden. Ebenfalls sind die Fuses entsprechend anzupassen.
Das Überspielen der Firmware über die serielle Schnittstelle am Beispiel von avrdude:
Controller | avrdude-Befehl |
---|---|
ATmega32 | avrdude -c avr109 -b 19200 -P serialdev -p m32 -U f:w:image.hex
|
ATmega644 | avrdude -c avr109 -b 19200 -P serialdev -p m644 -U f:w:image.hex
|
ATmega644P | avrdude -c avr109 -b 19200 -P serialdev -p m644p -U f:w:image.hex
|
serialdev
ist auf den Namen der verwendeten seriellen Schnittstelle zu setzen (z.B. /dev/ttyS0
, /dev/ttyUSB0
oder COM1
).
Die Fuses lassen sich ohne spezielle Konfiguration des Bootloaders üblicherweise nicht über die seriellen Schnittstelle einstellen.
Joysticks
Verwendung finden Joysticks nach dem 9-Pin Atari Standard der 80er, z.B vom C64, Amiga, Atari ST, Atari VCS 2600. Gut und extrem robust sind die "Competition Pro" Joysticks. Gibt es noch recht häufig auf dem Flohmarkt. Wurden aber auch noch mal neu produziert von Speedlink als Competition Pro Retro, zu bekommen unter anderem bei Vesalia (aber anscheinend derzeit nicht). Eine Alternative ist bspw. ein Gamepad.
Die Spielecontroller sind digital und ziehen den jeweiligen Pin auf GND (siehe hier für Belegung), insofern geht das auch sehr schnell auf einer kleinen Lochrasterplatine.
Ferner ist die Nutzung einer Funkfernbedienung als Joystick möglich (in Arbeit).
Software
Software gibt es im SVN.
- Aktueller Support durch Borgware-2D: SVN browse
Hier gibt es die Möglichkeit, das ganze per make menuconfig¹ zu konfigurieren, und per make simulator² auf einem PC zu simulieren.
- ¹ (benötigt ncurses, bei Ubuntu in libncurses5-dev enthalten)
- ² (benötigt glut, bei Ubuntu in freeglut3-dev enthalten)
Compilieren
AVR-Toolchain + Uisp installieren, Software entpacken oder auschecken, mit make bauen, make sflash zum hochladen per Bootloader.
Ubuntu:
sudo apt-get install gcc-avr avr-libc binutils-avr avrdude in foodloader-0.21/launcher/ aus svn make und die entstandene ausführbare launch-bootloader nach /usr/bin kopieren, dann in borgware-2d make && make sflash
Module
Spiele
Tetris
Das altbekannte Tetris, mit Highscoreliste.
Bastet Tetris
Diese Version von Tetris, angelehnt an Bastet, gibt dir immer den gerade am schlechtesten passenden Stein. Eine Herrausforderung :).
First Person Tetris
Hier dreht sich nicht der Stein, sondern das Spielfeld. Also lass dich nicht verwirren...
Snake
Du spielst das bekannte Spiel "Snake" auf dem Borg.
LaborInvaders
Spaceinvaders Clone
Breakout
Ein Breakout Clone, ähnlich Arkanoid.
Animationen
AutoSnake
Hier spielt die Snake mit sich selber :).
AutoBreakout
Breakout als Animation.
GameOfLife
Das Spielfeld wird per Zufall befüllt, danach beginnt es sich nach den Regeln von Conways Spiel des Lebens zu verändern. Wenn eine Stagnation eintritt, wird ein "Glider" eingeworfen, die Simulation endet bei vollständiger Auflösung aller Zellen.
Langtons Ameise
Eine Simulation von [Langtons Ameise], einer Turingmaschine die komplexe Muster erzeugt.
Laborlogo
Ein scrollendes Laborlogo :)
Hypnotoad
ALL GLORY TO THE HYPNOTOAD!
"Matrix Effekt"
Genieße die Matrix...
"Lagerfeuer"
Es wärmt in kalten Nächten :).
Zufallsgenerator
Nach etwas Getüftel tut es der Zufallsgenerator recht gut, dies kann man hier betrachten.
Laufschrift
Ein frei programmierbarer Scrolltext, nutzt BorgTextAnim.
Counter
Der Counter zählt die Neustarts der Platine hoch, ein zurücksetzen erfolgt beim überschreiben des eeprom, aber nicht bei einem normalen Upload der Firmware.
Testprogramme
- Wechselndes Schachbrettmuster
- Wandernde Linien mit Helligkeitswechsel
- Spirale
MCUF-Schnittstelle
Peter hat ein MCUF-Modul geschrieben (zu finden im svn). Damit steht die Fülle der Blinkenlight-Apps für den Borg offen. Mit Hilfe von BlinkenOutput kann man über das serielle Interface MCUF-Pakete an den Borg schicken.
ich hab das ganze mit meinem 2m-Aufblas-Borg unter Mac OS X zum Laufen gebracht.
meine Kommandos dafür:
./BlinkenOutput -d /dev/tty.usbserial -s 115200,N,8,1 ./BlinkenSend -i ../examples/static.bml -l 0
wichtig: die MCUF-Pakete müssen als Graustufenwerte 8bit (0-255) festgelegt werden (header im .bml-file: <blm width="16" height="16" bits="8" channels="1"> )
Downloads
- Schaltplan
- Software
Bestellen
Es sind noch einige Borg16V2 Platinen vorhanden. Stückpreis liegt bei 14 Euro.
Bei interesse melde dich einfach auf der Mailingliste, oder komm vorbei :-).
Mailingliste
- Webinterface: http://www.das-labor.org/mailman/listinfo/borg16
- Anmelden: Mail an borg16-request@das-labor.org mit "subscribe" im body.
- Für Fragen, Diskussion, Mailorder, und den ganzen Rest.
Links im Netz
Hier sind ein paar Links zu Webseiten die sich mit dem Borg16 beschäftigen, hier und da gibt es spannende Software für das Display zu entdecken...
- http://hansmi.ch/hardware/borg16
- http://blog.blinkenarea.org/index.php/2008/10/17/blinken-in-the-air/
- http://www.werkzeugh.at/?p=283
- http://www.mikrocontroller.net/topic/147689
- http://s23.org/wiki/Borg16
Artikel Todo
* V2 Bilder hochladen! done * Aufbauanleitung überprüfen * Aufbau der Matrix beschreiben/schaltplan!! (true) * Reicheltlisten fixen/anlegen/einstellen * Led-widerstandsvorschläge einfügen/bearbeiten * Für Software Zipfiles erstellen?? * Farbcodes der Widerstände hinzufügen * Neue V2 Hardware einpflegen! * Allgemeine Verbesserungen * Aufbau in RIBBA bilder von Smartin und Hansi einarbeiten * Aufbau Lochraster nach AndreBorg einarbeiten?? * fuses? * ... * Way more Nakka!
New Stuff
* Portierung von Spielen des [Mignon Game Kits] ?? * Portierung von Spielen des ["LED Game for AVR"] ??