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 Basics & Shifting

10. November 2011

Diese Übung beinhaltete sich mit dem Dot-Matrix-Bauelement vertraut zu machen, das 5x7 LEDs enthält. Die LEDs mussten in Spalten und Kolonnen an die PINs des Arduinos angeschlossen werden. Je nachdem ob eine Spalte oder Reihe HIGH oder LOW geschaltet ist leutet die LED am Kreuzpunkt auf. Sind alle Outputs auf LOW gesetzt leuchtet keine der LEDs, um nun einzelne LEDs aufleuchten zu lassen, habe ich eine eigene Funktion geschrieben die eine LED aktiviert und die restlichen LEDs auslöscht. So konnte ich dann im Loop einzeln LEDs der Reihe nach aufleuchten lassen.

int leds[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
int leds_rows[] = { 2, 3, 4, 5, 6, 7, 8 };
int leds_cols[] = { 9, 10, 11, 12, 13 };

int i=9; int d=1; int k=2; int d2=1;

void setup() {
  // ROWS
  for(int l=0; l    pinMode(leds_rows[l], OUTPUT);
    digitalWrite(leds_rows[l],LOW);
  }
  // COLS
  for(int l=0; l    pinMode(leds_cols[l], OUTPUT);
    digitalWrite(leds_cols[l],LOW);
  }
}

void loop() {
    setActive(i, HIGH, 9, 5);
    delay(50);
    setActive(k, LOW, 2, 6);
    delay(50);

    if (i==13) d=0;
    if (i==9) d=1;
    d==1 ? i++ : i--;
    if (k==8) d2=0;
    if (k==2) d2=1;
    d2==1 ? k++ : k--;
}

void setActive(int pin, int state, int start, int num) {
  for(int i=0; i    if (pin!=i+start) {
      digitalWrite(i+start,state);
    } else {
      digitalWrite(i+start,state==LOW?HIGH:LOW);
    }
  }
}

Bit Shifting

Um mit einfachen Mitteln möglichst viele LEDs ansteuern zu können haben wir uns in einer weiteren Übung das Bit-Shifting zu Nutze gemacht. 1 Byte besteht aus 8 Bit, die jeweils einen boolschen Zustand haben können. In Arduino ist die Schreibweise für ein Byte jeweils mit einem 'B' vorneangestellt (B00000000) gefolgt von den 8 Bit als Stellen. Mit bitWrite() lassen sich nun einzelen Bits unseres Byte umschreiben und so eine Zahl zwischen 0-255 generieren. Mit ShiftOut kann das Byte auch direkt verwendet werden, um mit seinen 8 Stellen jeweils 8 LEDs gleichzeitig zu steuern.
#define LATCH_PIN 8
#define CLOCK_PIN 12
#define DATA_PIN 11
#define SOUND_PIN 2
#define SOUND_PIN2 4

#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
//
int melody[] = {
NOTE_GS4, NOTE_CS5, NOTE_E5,
NOTE_GS4, NOTE_CS5, NOTE_E5,
NOTE_GS4, NOTE_CS5, NOTE_E5,
NOTE_GS4, NOTE_CS5, NOTE_E5,
NOTE_A4, NOTE_CS5, NOTE_E5,
NOTE_A4, NOTE_CS5, NOTE_E5,
NOTE_A4, NOTE_D5, NOTE_FS5,
NOTE_A4, NOTE_D5, NOTE_FS5,
NOTE_GS4, NOTE_AS4, NOTE_FS5,
NOTE_GS4, NOTE_CS4, NOTE_E5,
NOTE_GS4, NOTE_CS4, NOTE_DS5,
NOTE_FS4, NOTE_A4, NOTE_DS5 };

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 4, 4 };

int i=0; int i2=7; int d=1; int d2=0; int d3=0; int k=1;
void setup() {
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);
  pinMode(SOUND_PIN, OUTPUT);
  pinMode(SOUND_PIN2, OUTPUT);
}

void loop() {
    byte myByte = B00000000;
    digitalWrite(LATCH_PIN,LOW);
    bitWrite(myByte,i,1);
    bitWrite(myByte,i2,1);
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, myByte);
    digitalWrite(LATCH_PIN,HIGH);
    // old code for making tunes
    //tone(SOUND_PIN,(i+1)*20*k,50);
    //delay(50);
    //tone(SOUND_PIN2,(i2+1)*10*k,50);
    //delay(50);
    //tone(SOUND_PIN2,(i2+1)*150);

    for (int thisNote = 0; thisNote < sizeof(melody); thisNote++) {
    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000/noteDurations[thisNote];
    tone(SOUND_PIN, melody[thisNote],noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(7);
    }

    if (i==7) d=0;
    if (i==0) d=1;
    d==1 ? i++ : i--;
    if (i2==7) d2=0;
    if (i2==0) d2=1;
    d2==1 ? i2++ : i2--;
    if (k==7) d3=0;
    if (k==0) d3=1;
    d3==1 ? k++ : k--;
}