Wenn ich mal irgendwann ein Projekt plane bei dem ein Mikrocontroller Laut geben soll, werde ich mich hoffentlich an atmegaSID erinnern. Das ist eine Art Emulator, damit ersetzt ein ATmega8 den Soundchip eines Commodore C64. Dann muss ich nur noch bei Welle: Erdball in Erfahrung bringen, wie man dem ordentliche Klänge entlockt…
Kategorie: Elektronik
Elektronik und Mikrocontroller
Spielzeug für ARMe
Wenn man im englischsprachigen eBay nach Samsung S3C2440 sucht findet man eine ganze Reihe verschiedene interessante Angebote. Fertige Boards mit ARM-CPU und viel Peripherie, darunter Sachen wie Touch-Screens, USB-Hostcontrollern, Ethernet und WLAN. Lauffähig mit Linux. Und das zu echt moderaten Preisen: für 85 Euro kriegt man da schon ein Gerät mit Touch-Screen, für 133 gibt es sogar WLAN.
Ein bisschen doof ist nur, dass es die Dinger offenbar nicht in der deutschen Bucht findet, und dass man sich die aus China zukommen lassen muss.
Aber trotzdem: die Dinger schreien geradezu danach, da mal irgendwas mit zu basteln…
Farnell kauft Eagle CAD
Offenbar hat der Elektronik-Händler Farnell die Software-Schmiede CadSoft gekauft, bekannt als Hersteller des Elektronik-CAD-Systems Eagle CAD — unter Hobby-Elektronikern wahrscheinlich die am weitesten verbreitete Software für den Zweck. Ich habe für meine letzten Projekte die freie Software Kicad benutzt und nehme diese Nachricht nochmal zum Anlass die zu verlinken.
Apple Adjustable Keyboard an USB
Hmm, ich hatte die befürchtung dass ich wieder zu spät wäre, genau wie damals mit der Model M. Ich habe da seinerzeit gemütlich dran gebastelt, hatte die mehrere Wochen hier rumliegen. Als ich meine erste Dulcimer veröffentlicht habe hat mir jemand gesagt dass eine Woche vorher jemand ein ganz ähnliches Projekt fertiggestellt hat…
Naja, ich habe danach noch ein paar andere Tastaturen umgebaut. Und noch einige auf Lager liegen, die auf einen Umbau warten. Unter anderem eben eine Apple Adjustable. Jetzt habe ich mich halbwegs erschrocken als ich sehen musste dass die schon jemand auf USB umgebaut hat. Allerdings hat der Thomas E. Henz Jr. eher den Ansatz verfolgt den ich bei meinen alten MAME-Joysticks hatte. Tut’s zwar auch, aber mir gefällt der Dulcimer-Ansatz immer noch so gut dass ich den bei Gelegenheit auf die Tastatur anwende…
Eine Sache hat Thomas aber schon richtig erkannt: Das Innenleben der Tastatur ist nicht gerade freundlich für den geneigten Umbauer. Nachdem ich auch schon andere Apple-Tastaturen von innen gesehen habe glaube ich, dass das eine (weitere) Unsitte dieses Herstellers ist…
I2C-LED-Matrix
Dieser Text ist erst 2015 von meinem alten CMS in den Blog gewandert.
Dieses Projekt macht aus einem AVR ATmega8 Mikrocontroller einen LED-Controller für eine Matrix aus 8×8 LEDs. Der Controller verhält sich als I2C-Slave, die anzuzeigenden Bitmuster können also über diesen Bus (der auch als TWI bekannt ist, Two Wire Interface) geschickt werden.Sinn und Zweck
In meinem nächsten grösseren Projekt will ich Zahlenwerte auf Siebensegmentanzeigen ausgeben. Ich habe vor einer Weile eine Menge von diesen Dingern gekauft, jetzt kommen sie zum Einsatz. Das sind vierstellige mit einem zwölfpoligen Anschluss an der Unterseite. Acht Pins für die Kathoden der LEDs (sieben Segmente plus Punkt) und vier Anoden, eine für jede Ziffer.
Man kann sich diese Module als Matrix aus vier mal acht LEDs vorstellen, wie in dem Schaltplan hier dargestellt wird. Ich benutze zwei von den Modulen, also habe ich eine Matrix aus acht mal acht LEDs.
Die Zeilen und Spalten dieser Matrix werden an den Mikrocontroller angeschlossen, so dass der die Lampen Zeile für Zeile befeuern kann. Das hat zwei Vorteile: erstens sind maximal acht LEDs gleichzeitig an, das drückt den Stromverbrauch. Und zweitens braucht man auf diese Weise nur 16 Pins um 64 LEDs anzutreiben.
Durch diese Art der Ansteuerung flackert die Ausgabe natürlich etwas, aber der Controller ist schnell genug damit man das mit dem bloßen Auge nicht sehen kann.
Ich hätte meine Displaymodule natürlich auch direkt an den Hauptcontroller des nächsten Projektes anschließen können, aber da habe ich nicht mehr genug freie Pins. Außerdem wird das Programm auf dem Hauptcontroller übersichtlicher wenn das Multiplexen der LEDs woanders geschieht, da ich mich nicht um irgendein Timing kümmern muss. Also ist ein billiger ATmega8 ein prima LED-Treiber, und ich sage dem per I2C was er anzeigen soll.
I2C sprechen
Der ATmega8 hat ein eingebautes Hardware-I2C-Interface, also braucht es nicht allzu viel Code um I2C zu sprechen. Trotzdem habe ich mir von roboternetz.de die kleine Bibliothek gezogen, die Uwe Grosse-Wortmann (uwegw) geschrieben hat. Ich habe die nur etwas umformatiert um den Code meinem Programmierstil anzupassen. Nein, ich habe die Kommentare nicht gelöscht…
Benutzung
Am anderen Ende der Kommunikation habe ich die großartige Procyon AVRlib von Pascal Stang benutzt. Ein einfaches Code-Beispiel um mit der I2C LED Matrix zu sprechen sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#define I2C_LEDMATRIX 0x10 // address of the device timerInit(); // initialize timers timerPause(100); // give everything a little time to settle i2cInit(); // initialize i2c function library timerPause(100); // wait a bit more while (1) { // endless loop uint8_t buffer[9]; // prepare buffer // loop until 255 for (uint8_t i = 0; i <= 255; i++) { // set all bytes of the buffer to value i memset(buffer, i, sizeof(buffer)); // send the buffer via I2C-bus i2cMasterSend(I2C_LEDMATRIX, sizeof(buffer), buffer); timerPause(500); // wait, so you have the time to watch } } |
Man bemerke: der Buffer hält nicht wirklich die Zahlen die auf dem Display dargestellt werden sollen, zumindest nicht in diesem Beispiel. Da sind nur die Bitmuster drin.
Zahlen anzeigen
Wenn man Siebensegmentanzeigen an den Controller anschließt um darauf Zahlen anzuzeigen müssen die auf der Master-Seite des Busses definiert werden. Ich habe die Definitionen nicht in dieses Projekt aufgenommen um dem Master die volle Kontrolle über die LEDs zu geben, selbst wenn keine Zahlen angezeigt werden sollen.
Außerdem hängt die Darstellung davon ab wie die Displays an den Controller angeschlossen sind. Ich weiß nicht ob die Pinbelegung irgendwie standardisiert ist.
Um ein Beispiel zu geben wie sowas gebaut wird, hier ist ein Codeausschnitt der mit meinem Display funktioniert:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// Names of the segments: // aaaaa // f b // f b // ggggg // e c // e c // ddddd h uint8_t characters[16]; // c e g a h f b d characters[ 0] = (1 << 0) | (1 << 1) | (0 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (1 << 6) | (1 << 7); // 0 characters[ 1] = (1 << 0) | (0 << 1) | (0 << 2) | (0 << 3) | (0 << 4) | (0 << 5) | (1 << 6) | (0 << 7); // 1 characters[ 2] = (0 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (0 << 5) | (1 << 6) | (1 << 7); // 2 characters[ 3] = (1 << 0) | (0 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (0 << 5) | (1 << 6) | (1 << 7); // 3 characters[ 4] = (1 << 0) | (0 << 1) | (1 << 2) | (0 << 3) | (0 << 4) | (1 << 5) | (1 << 6) | (0 << 7); // 4 characters[ 5] = (1 << 0) | (0 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (0 << 6) | (1 << 7); // 5 characters[ 6] = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (0 << 6) | (1 << 7); // 6 characters[ 7] = (1 << 0) | (0 << 1) | (0 << 2) | (1 << 3) | (0 << 4) | (0 << 5) | (1 << 6) | (0 << 7); // 7 characters[ 8] = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (1 << 6) | (1 << 7); // 8 characters[ 9] = (1 << 0) | (0 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (1 << 6) | (1 << 7); // 9 characters[10] = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (1 << 6) | (0 << 7); // a characters[11] = (1 << 0) | (1 << 1) | (1 << 2) | (0 << 3) | (0 << 4) | (1 << 5) | (0 << 6) | (1 << 7); // b characters[12] = (0 << 0) | (1 << 1) | (0 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (0 << 6) | (1 << 7); // c characters[13] = (1 << 0) | (1 << 1) | (1 << 2) | (0 << 3) | (0 << 4) | (0 << 5) | (1 << 6) | (1 << 7); // d characters[14] = (0 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (0 << 6) | (1 << 7); // e characters[15] = (0 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (0 << 4) | (1 << 5) | (0 << 6) | (0 << 7); // f |
Nachteile
Bis jetzt hat das Teil in allen getesteten Situationen prima funktioniert. Alles läuft wie geplant.
Danke!
Ich danke den Autoren der Bibliotheken die ich benutzt habe: Uwe Grosse-Wortmann (uwegw) für die I2C-Slave-Bibliothek und Pascal Stang für seine Procyon AVRlib.
Lizenz
Dieses Projekt steht unter der GNU General Public License (GPL). Eine Kopie der GPL liegt dem Paket in der Datei License.txt bei.
Download
- i2c-ledmatrix_090506.tar.gz – Sourcecode und Dokumentation, 212kB
Bulbdial Clock
Diese Uhr muss bei Gelegenheit mal nachgebaut werden. Macht sich sicher gut neben meiner Binär-Funkuhr…
USB beschnüffeln
Ich habe in der Vergangenheit einige Sachen mit USB-Schnittstelle gebastelt, und es werden bestimmt noch mehr. Zwischendurch habe ich mir gewünscht, einen direkten Blick auf die Kommunikation werfen zu können. Jetzt erfahre ich zufällig dass Wireshark das kann. Sehr hilfreich.
Ich bin ätzend!
Tja, die Überschrift klingt komisch, hat mir aber besser gefallen als ‚Mein Solarium und ich‘. Obwohl letzteres auch gepasst hätte.
Nachdem ich mich jetzt mehrere Jahre davor gedrückt und lieber mit Lochrastermaterial gebastelt habe, habe ich mich seit anderthalb Wochen intensiv mit dem Ätzen von Platinen beschäftigt. Erst so versucht, dann eine Ätzanlage gebaut. Gestern habe ich das erste Ergebnis zusammengelötet, und es hat auf Anhieb funktioniert.
Meine Erfahrungen damit habe ich auf der Schatenseite verewigt. Was die gezeigte Platine tut wird später in einem separaten Eintrag beschrieben, damit ist die dann auch als ‚Metaprojekt‘ fertig.
Platinen ätzen
Der Text war 2009 noch nicht im Blog, ich habe ihn erst 2015 aus meinem alten CMS übernommen.
Aus irgendeinem Grund hatte ich Hemmungen, mit der eigenen Herstellung von Platinen anzufangen. Wie sich herausgestellt hat ist das völlig unbegründet. Es vereinfacht vieles, wenn man erstmal die Ausrüstung dazu hat. Nach der ersten Eingewöhnung ist das schwierigste, nach dem Rumpanschen mit der Chemie die Gummihandschuhe wieder aus zu kriegen…Vorlage erstellen
Bevor es wirklich zur Sache geht muss ein Layout erstellt werden das später auf die Platine belichtet wird.Sehr verbreitet für diese Art von Aufgabe ist Eagle CAD. Ein tolles Tool, allerdings ist die kostenlose Version davon in Bezug auf die Größe der herzustellenden Platinen eingeschränkt. Mit einer halben Eurokarte kann man zwar schon einiges anfangen, aber spätestens für das Dulcimer-Projekt brauchte ich mehr.
Ich habe mich jetzt an KiCad gewöhnt. Das ist noch schlechter zu benutzen als Eagle, aber wenn man sich Zeit nimmt und freundlich zu ihm ist bekommt man Schaltpläne und Platinenlayouts zurück mit denen man arbeiten kann. Und der unschlagbare Vorteil: es ist freie Software.
Belichten
Die Belichtung des fotoempfindlichen Materials ist etwas tricky. Ich habe da verschiedene Versuche gemacht und bin jetzt bei dem was ich als das Optimum sehe.
Erstmal zum Träger für das Layout: Die ersten Versuche habe ich mit normalem Papier gemacht das ich in meinem Laserjet 5 bedruckt hatte. Nachdem man auf den Platinen keine Ergebnisse sehen konnte habe ich das Papier mit Öl eingestrichen um es durchsichtiger zu machen. Mit der Nitraphot-Birne hätte ich so wahrscheinlich mit Belichtungszeiten um 50 Minuten arbeiten können, das hätte die verwendete Lampe aber definitiv nicht mitgemacht. Wirklich gut funktioniert hat der Ausdruck auf normaler Overhead-Folie. Beim ersten Versuch habe ich noch zwei Folien übereinander gelegt, spätere Tests haben ergeben dass auch eine einfache Lage reicht.
Mehr Auswahl hat man bei den Lampen: Ein Versuch der sich als — zumindest bei mir — absolut untauglich erwiesen hat war der mit dem Baustrahler. Andere haben damit mehr Erfolg, ich bin damit nicht mal ansatzweise zu einem Resultat gekommen. Mittlerweile habe ich gelesen dass es sein kann dass die Glasscheibe vor dem Baustrahler für den Fehlversuch verantwortlich war: die blockieren oft UV-Strahlung.
Besser hat der Versuch mit der Nitraphot-Lampe geklappt. Dabei handelt es sich um eine Glühbirne mit einer normalen E27-Fassung. Diese spezielle Birne hat aber ein erweitertes UV-Spektrum. Und eine Leistung von 250W. Letzteres hat dazu geführt dass ich beinahe unsere Küchenlampe gegrillt hätte, als ich versucht habe durch Papier zu belichten. Mit der Folie hat es dann doch gute Ergebnisse gegeben: zehn Minuten aus 15cm Entfernung bringen ein Resultat das sich sehen lassen kann.
Als beste Lösung hat sich ein Gesichtsbräuner erwiesen, den ich für sage und schreibe 1,50 Euro erstanden habe (übrigens in etwa ein Viertel dessen was ich für die Nitraphot-Birne bezahlt habe). Das Modell nennt sich Philips HB 170 und verfügt über vier Röhren à 15W. Den lasse ich erst ein paar Minuten warm laufen, dann lege ich ihn auf zwei Kanthölzer von etwa 3cm Dicke. Darunter ein Stapel, bestehend aus der Platine, dem Layout auf Folie und einer Glasscheibe zum Beschweren. So belichte ich zwei Minuten und kriege erstklassige Resultate — ohne einen Zimmerbrand zu riskieren.
Ätzen
Natürlich kann man für den Anfang auch einfach in einer Schale ätzen, das sollte am Ergebnis nicht viel machen. Aber ich habe das schon bei den ersten Teststreifen als fummelig empfunden, insbesondere weil es nicht einfach ist die Temperatur von 50 Grad halbwegs aufrecht zu erhalten.Also habe ich ein Ätzgerät gebaut. Das war die billigste Variante, da ich durch mein Aquarien-Hobby schon einiges an Material da hatte. Das Ding besteht aus:
- Glasscheiben
- Silikon
- Aquarien-Heizstab
- Aquarien-Thermometer aus Glas
- Aquarien-Luftpumpe
- Aqua-Curtain Luftverteiler
- Luftschlauch
- Kabelkanal-Stücke als Halterungen für den Luftverteiler und die Platine
- Einer stabilen Plastikwanne unter dem ganzen, weil ich meiner Silikonklebekunst nicht bis ans Ende der Welt traue…
Geätzt wird dann mit einem Liter Natriumpersulfat-Lösung. In das Gerät passt ziemlich genau eine Eurokarte rein, das Ätzen an sich dauert etwa 10 bis 15 Minuten.
Mit den Ergebnissen bin ich mehr als zufrieden. Ich habe zwar noch keine Tests gemacht wie klein die Strukturen werden dürfen, aber ich habe auf den bislang geätzten Platinen alle Details wiedergefunden die ich auch nach dem Layout und der Folie erwartet hätte.
Siehe auch…
- Bauanleitung – wie man sich ein Ätzgerät bastelt
Armbanduhr zum selber löten
Ich trage keine Armbanduhr, und die uWatch trägt auch ziemlich auf. Trotzdem wird die an Coolness höchstens noch von Woz‘ Nixie-Armbanduhr übertroffen.