Mittwoch, 27. Juli 2011

Neuer Versuchsaufbau

Das ist jetzt mein neuer Versuchsaufbau. Die LED-Matrix habe ich in vier Quadranten aufgeteilt. Jeder Quadrant bekommt seinen eigenen MAX7219-LED-Treiber. In den Kommentaren zum letzten Post wurden einige Vorschläge gemacht, wie man mit weniger LED-Treibern auskommt. Das ist sicherlich möglich, aber macht die Programmierung und die Fehlersuche auch deutlich komplizierter. Ich fange daher mal mit vier Treibern an und reduziere dann eventuell noch. Ich hoffe bald dazu zu kommen, die Matrix zum Testen zu verkabeln.

Mittwoch, 20. Juli 2011

Alles auf Anfang

Nun ist es soweit. Nach der Pleite mit den TLC5940-LED-Treibern ist die Matrix wieder 'herkömmlich' verlötet und die QLOCKTWO-Hardware auf dem Steckbrett nachgebaut. Das kann ich dann bald im Schlaf. Immerhin habe ich im Zuge dessen endlich einen Compiler-Schalter in die Firmware eingebaut, mit dem man die Anzeige auf den Kopf stellen kann (und dann die Kabel bei dem Anoden-Multiplexer nicht mehr kreuzen muss).

Dann habe ich begonnen, mit dem MAX7219-LED-Treiber zu spielen. Der kann eine 8x8-Matrix treiben. Bei der Arduino-IDE gibt es dazu ein Beispiel (hello_matrix). Aber das hat wieder mal nicht geklappt, die Matrix leuchtet komplett (aber dafür schön hell). Irgendwann am späten Abend habe ich die Fehlersuche aufgegeben.

Was übrigens immer eine gute Idee ist, denn meistens hat man am nächsten Morgen die zündende Idee. In dem Beispiel werden die digitalen Pins 0, 1, 2 verwendet, was mit einem Arduino Duemilanove keine gute Idee ist - denn die Pins 0, 1 werden für die serielle Kommunikation genutzt. Nach der Umstellung auf die Pins 2, 3, 4 ging es sofort.

Jetzt bleibt das Problem: "Wie teilt man eine 10 mal 11 Matrix auf 'Kacheln' mit 8 mal 8 auf?" Und braucht man wirklich 4 Stück, denn der Chip ist recht hochpreisig?

Dienstag, 19. Juli 2011

Basteln im ganz großen Stil

Ich bin ja eher ein Bastler im kleinen Stil, was vielleicht meines Studiums der Feinwerktechnik gestundet ist. Wer sich eher für Basteln im großen Stil interessiert, dem sei der Blog von Freunden empfohlen: Jugendstilhaus renovieren beschäftigt sich mit den Höhen, Tiefen, Freuden und Leiden des Erwerbs einer rennovierungsbedürftigen Immobilie.

Mittwoch, 13. Juli 2011

Ausflug: WebDuino

Mit der im vorherigen Post erwähnten 'JavaFirmata' habe ich dann eine kleine Demo-Web-Anwendung geschrieben. Aus den Teilen eines Fritzing Starter Kits habe ich ein paar LEDs, einen LDR und ein Potentiometer an den Arduino angeschlossen.

Sechs LEDs gehen über Vorwiderstände an die digitalen Pins 8-13 vom Arduino, der LDR ist mit einem 10kΩ-Widerstand als Spannungsteiler an den analogen Pin 0 angeschlossen und letztlich ist das Potentiometer auch als Spannungsteiler an den analogen Pin 1 angeschlossen.

Mit Hilfe der JavaFirmata kann man dann prima die LEDs ein- und ausschalten sowie die Werte vom LDR bzw. Potentiometer lesen.

Das Projekt (für NetBeans) kann hier heruntergeladen werden. Es folgt dem Model-View-Controler-Pattern, das Servlet "Controller.java" nimmt die Eingaben aus dem HTML-Formular entgegen, verarbeitet sie, hängt anzuzeigende Daten an den Request an und gibt die Kontrolle dann weiter an die JSP-Seite, welche die HTML-Seite darstellt.

Das Servlet als Herz sieht so aus:

public class Controller extends HttpServlet {

private static Firmata f;
private static boolean[] digitalPins = new boolean[14];

static {
try {
f = new Firmata("/dev/tty.usbmodem1d11", 57600);

for (int i = 8; i < 14; i++) {
f.pinMode(i, Firmata.OUTPUT);
}

for (int i = 0; i < 14; i++) {
digitalPins[i] = false;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

/**
* Processes requests for both HTTP GET and POST methods.
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setAttribute("a0", f.analogRead(0));
request.setAttribute("a1", f.analogRead(1));

for (int i = 8; i < 14; i++) {
digitalPins[i] = request.getParameter("d" + i) != null;
}
try {
for (int i = 8; i < 14; i++) {
if (digitalPins[i]) {
f.digitalWrite(i, Firmata.HIGH);
} else {
f.digitalWrite(i, Firmata.LOW);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
request.setAttribute("digitalPins", digitalPins);

RequestDispatcher rd = request.getRequestDispatcher("arduino.jsp");
rd.forward(request, response);
}

@Override
public void destroy() {
f = null;
}
[...]
}

Ausflug: Arduino - Firmata - Java

Ich wollte gerne einen Arduino über Java ansprechen können, um ihn in Webprojekte (Java Servlets/JSPs) einbinden zu können. Es gibt ein interessantes Projekt, um den Arduino via Firmata in Processing einzubinden. Firmata ist eine kleine Firmware für den Arduino, wodurch er sich über MIDI-ähnliche Befehle über die serielle Schnittstelle steuern lässt. Leider setzt die Library Processing voraus, was sie für Web-Anwendungen unbrauchbar macht. Ich habe daher einige Source-Codes aus dem Netz zusammengeworfen, herausgekommen ist die 'JavaFirmata'. Jetzt kann man den Arduino aus jedem Java-Projekt via Firmata steuern.

Ein Beispiel-Code sieht so aus:

public class TestJavaFirmata {

public static void main(String[] args)
throws Exception {

// list available ports...
SerialWorker.listPorts();
// open a port...
Firmata f = new Firmata("/dev/tty.usbmodem1d11", 57600);

// set pin 13 (smd-led on arduino) to output...
f.pinMode(13, Firmata.OUTPUT);
// set pin 13 to HIGH - the smd-led should light up...
f.digitalWrite(13, Firmata.HIGH);

}
}

Rückschlag

Leider muß ich von einem Rückschlag berichten. Die Matrix aus SuperFLUX-LEDs und TLC5940-Treiber-Bausteinen habe ich nicht zum Laufen gebracht. Sie ging immer mit wenigen eingeschalteten LEDs, aber bei vielen traten unkontrollierbare Störungen auf und der letzte Treiber-Chip wurde heiß. Ich habe dann angefangen, eine Reihe nach der anderen in Betrieb zu nehmen, um den Fehler zu finden. Dabei ist mir aufgefallen, dass bereits 3 Reihen bei voller Beleuchtung 1,5 A ziehen. Bei 10 Reihen ist der Stromverbrauch dann nicht mehr haltbar... Eventuell lag der Fehler darin, vielleicht auch in dem hochfrequenten Treiben der LEDs, die ja alle über Flachbandkabel angeschlossen waren, und dadurch vermutlich hervorragende Antennen bilden und stören.
Auf jeden Fall kehre ich jetzt zum 'klassischen' Aufbau zurück und versuche dafür mal mein Glück mit dem Ersetzen der Darlington-Arrays durch Transistoren - oder vielleicht auch dem Einsatz eines TLC5940 statt der Shift-Register/Darlington-Array-Kombination.