16. November 2011
Bei dieser Aufgabe mussten wir eine LED-Dot-Matrix Display ansteuern und eine Grafik darauf anzeigen lassen. Nach ein paar Tests mit dem Display entschied ich mich via Processing ein Video auf dem Display laufen zu lassen.
Ich rechnete ein Kontrast reiches Video auf 5*7 Pixel runter und liess es per Processing auslesen und an das Arduino übermitteln.
Processing:
// Imoport Libraries import pogg.*; import processing.serial.*; // Objects TheoraMovie movie; Serial serial; // Variables int movieWidth = 7; int movieHeight = 5; String controlCharacter = "~"; // Setup void setup() { // Sketch size(movieWidth*100,movieHeight*100); frameRate(5); // Serial serial = new Serial(this,"/dev/tty.usbserial-A7005Ogo",115200); // Movie movie = new TheoraMovie(this,"movie.ogv"); movie.loop(); } // Loop void draw() { // Empty message and read Frame String message = ""; movie.read(); // Display Movie image(movie,0,0,movieWidth*100,movieHeight*100); // Get Pixels int[] data = movie.pixels; // Create Message if (data.length>movieWidth*movieHeight) { for (int i=0; i < movieHeight; i++) { for (int ii=0; ii < movieWidth; ii++) { int value = int(map(brightness(data[i*7+ii]), 0, 255, 0, 1.5)); if (value>1) value = 1; message += (value+""); } } //println(message); serial.write(message); serial.write(controlCharacter); } } // Stop void stop() { movie.stop(); serial.stop(); super.stop(); }
Arduino:
// Variables byte data[35]; int pointer = 0; // Setup void setup() { // Serial Serial.begin(115200); // Set Mode for(int i=2; i<14; i++) { pinMode(i,OUTPUT); } // Set Colums to Low for(int i=2; i<7; i++) { digitalWrite(i,HIGH); } // Set Rows to High for(int i=7; i<14; i++) { digitalWrite(i,LOW); } } // Loop void loop() { // Check Serial while(Serial.available()) { // Read Byte byte in = Serial.read(); // Check Data if(in == 126 || pointer > 35) { // Reset Array pointer = 0; } else { //Save Data data[pointer] = in; pointer++; } } // Write Data for(int i=0; i<5; i++) { // Activate Row digitalWrite(i+2,LOW); // Write Columns for(int ii=0; ii<7; ii++) { // Check Data if(data[i*7+ii] > 48) { digitalWrite(ii+7,HIGH); } } delay(5); // Clear Column for(int ii=0; ii<7; ii++) { digitalWrite(ii+7,LOW); } // Deactivate Row digitalWrite(i+2,HIGH); } }