Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

08 Dot-Matrix Display

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);
  }
}