MezData-Logo

Zylonen-Lauflicht alt

Synopsis: [Zylonen]

Durch eine LED-Spende an die Schule motiviert, entwickelte ich eine kostengünstige Platine für meine Schüler zum Üben.

Die Platine

Zylonenauge

Berechnung der Widerstände

Farbe U bei 1 mA U bei 20 mA LED Vorwiderstand I gemessen
Rot 1,7 V 2,0 V (5V-1,8V)/10mA =320Ω => 330Ω 9,3mA
Grün 2,9-3,0 V 3,5-3,9 V ! (5V-3,2V)/10mA =180Ω 9,1mA
Blau 2,8 V 3,3-3,8 V ! (5V-3,2V)/10mA =180Ω 9,7mA

Laut [Datenblatt ATtiny2313] liefert ein Portpin maximal 40 mA, der maximale Strom in VCC und aus GND darf 200mA nicht überschreiten. Der maximale Strom in eine LED darf bei kontinuierlichem Betrieb 20mA nicht überschreiten. Die Kathoden von jeweils 4 LED münden in einen Portpin (siehe Schaltplan). Die Schaltung wird mit 5 V betrieben, die Ausgangsspannung eines Portpins sei bei Low 0V und bei High 5V, das ist idealisiert, tatsächlich liegt sie laut Datenblatt bei 20mA Strom bei Low <0,7V und bei High >4,2V.
Eine erste einfache Annahme für die Berechnung ist, dass der maximale Strom an einem Portpin dann auftritt, wenn die Anoden von 4 LED Strom über 4 Widerstände ziehen.
Seien PB7..PB4 Low und PB3 High, es leuchten LED1, LED5, LED9, LED13. PB3 liefert den Strom für die 4 LED. Der Strom durch eine LED darf durch die 40mA Grenze eines Portpins nicht grösser als 10mA sein. Sollten alle LED gleichzeitig leuchten wäre der Strom in und aus dem µC <160mA, was im erlaubten Bereich liegt.
Die Berechnungen in der Tabelle wurden mit Schätzwerten für die Spannung an der LED bei 10mA und mit einem Sollstrom von 10mA durchgeführt. Zur Kontrolle wurden die tatsächlichen Ströme mit den ermittelten Vorwiderständen gemessen.

Messungen des Gesamtstrombedarfs mit blauen LED: Ruhestrom ohne LED 2,68mA; 4LED 1..4 leuchten 11,7mA; 4LED 1,5,9,13 leuchten 24,8mA; alle LED leuchten 38mA. Vcc-UPB0 = 0,5V bei 25mA.

Der Schaltplan

Schaltplan

Plan wurde mit [fritzing] erstellt. Projekt laden: [Zylonenauge6.fzz]

Bauanleitung

Ein altes 5V-Netzteil eines Handys und eine Hörmuschel eines ausgedienten Kopfhörers finden eine neue Aufgabe..

[Zylonenauge_Bauanleitung.pdf]

TasterLED

Port- und Verbinder J7 Belegung

PORTB wird für die 16 Leuchdioden und den Lautsprecher verwendet. An PORTD sind die Taster gegen GND angeschlossen.

PORTB PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
Belegung - Led 15,14,13,12 - Led 11,10,9,8 - Led 7,6,5,4 - Led 3,2,1,0 & Lautsprecher + Led 15,11,7,3 + Led 14,10,6,2 + Led 13,9,5,1 + Led 12,8,4,0
PORTD PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
Belegung NC Taster S2 Taster S1 Taster S0 J7 1 J7 2 J7 5 J7 6

Am Verbinder J7 sind die freien Pins herausgeführt, dort kann z.B. ein Keramikschwinger angeschlossen werden.

Verbinder J7 Pin 8 7 6 5 4 3 2 1
Belegung +5V GND PD0 (RXD) PD1 (TXD) PA1 (XTAL2) PA0 (XTAL1) PD2 (INT0) PD3 (INT1)

Led-Matrix: Eine Led leuchten lassen

Matrixanordnung

Um mit 8 Port-Pins 16 LED ansteuern zu können sind die LED als Matrix verschaltet. Um beispielsweise Led0 leuchten zu lassen muss PB4 auf 0 und PB0 auf 1 geschaltet werden. An PORTB muss dazu 0b11100001 = 0xe1 ausgegeben werden.

Aufgaben

Ausgabe-Array vervollständigen

Vervolständigen Sie das Array unsigned char ledausgabe[]={0xe1,...} um darüber das für die LED 0..15 passende Muster ausgeben zu können.

Zylonenlauflicht programmieren

Erstellen Sie ein Programm, das einen Leuchtpunkt hin und her laufen lässt. Verwenden Sie dazu _delay_ms(30). Lösung anzeigen..

Leuchtpunkt mit Tasten wandern lassen

Erstellen Sie ein Progamm, das dieses Verhalten zeigt:

Zum Entprellen der Tasten können Sie die Funktion keycheck() verwenden.

Reaktionsspiel programmieren

Entwickeln Sie ein Reaktionsspiel für die Zylonenplatine, hier die Vorgabe: [https://www.youtube.com/watch?v=R6G8hLEMesk]

 

Led-Matrix: Beliebige LED scheinbar gleichzeitig leuchten lassen (Zeit-Multiplex-Verfahren)

Durch die Matrix-Anordnung ist es nicht möglich, beliebige LED zeitgleich leuchten zu lassen. Durch die Trägheit des Auges ergibt sich jedoch die Möglichkeit, nacheinander die LED-Gruppen an PB7..4 ihre Muster ausgeben zu lassen:

  1. Nur PB4 auf 0 und Muster für LED3..0 anlegen.
  2. Nur PB5 auf 0 und Muster für LED7..4 anlegen.
  3. Nur PB6 auf 0 und Muster für LED11..8 anlegen.
  4. Nur PB7 auf 0 und Muster für LED15..12 anlegen.
  5. Wieder zu 1.

Es bietet sich an, die Ausgabe über einen Timer gesteuerten Interrupt periodisch ausführern zu lassen, das Muster wird dabei im SRAM gespeichert.

Ausgabezyklus

Aufgaben

ISR Aufrufzeit festlegen

Wie oft muss der Timerinterrupt zur Ausgabe aufgerufen werden, damit die Ausgabe flackerfrei erscheint?

Datenstruktur für die SRAM-Speicherung festlegen

Spontan können zwei Datenstrukturen gefunden werden:

  1. Zwei Byte: Byte1 für LED15..8 und Byte0 für LED7..0
  2. Vier Byte: Byte3 für LED15..12, Byte2 für LED11..8, Byte1 für LED7..4 und Byte0 für LED3..0

Um zu beurteilen welche Datenstruktur besser ist, gilt es zu bedenken:

Welche Struktur ist besser, Begründung?

Leuchtbalken mit Tasten einstellen

Erstellen Sie ein Progamm, das dieses Verhalten zeigt:

Zum Entprellen der Tasten können Sie die Funktion keycheck() verwenden. Gliedern Sie Ihr Programm in folgende Abschnitte:

  1. Einer ISR für die periodische Ausgabe des Leuchtmusters aus dem SRAM
  2. Einer Funktion ausgebeBalken(unsigned char n), die das Balkenmuster ins SRAM schreibt
  3. Einer Funktion main() mit Aufruf der Initalisierung, der Abfage der Tasten und des Aufrufs vonausgebeBalken(unsigned char n)

Lösung anzeigen..

Für Checker: Unterschiedliche Helligkeit

Vier verschiedene Helligkeiten sollen die LED annehmen können: {Aus,1/3,2/3, An} .Beim Leuchtblaken beginnen die LED beginnen nun erst mit 1/3 zu leuchten, erst wenn sie An sind, wird bei Tastendruck die nächste LED angegangen.

Tipps: Vram-Datenstruktur muss geändert werden. Pulsweitenmodulation. Ein ganzer Zyklus ist nun drei mal länger.

Bonus: Schneefall

Quellcode [Schneefall.c]
// Schneefall V1.0 (c) Oliver Mezger 5.01.2015
 
#include <avr/io.h>
#include <util/delay.h>
 
unsigned char muster[]={0x78,0x74,0x72,0x71,0xb8,0xb4,0xb2,0xb1,0xd8,0xd4,0xd2,0xd1,0xe8,0xe4,0xe2,0xe1};
int main(){
  DDRB=0xff;
  signed char musterz=0;
  char z=0,i;
  while(1){
    musterz=8+rand()%8;
    z=2+(rand()%32);
    for(i=0;i<=z;i++){
      _delay_ms(30);
    }
    z=2+(rand()%16);
    while (musterz>=0){
      PORTB=muster[musterz--];
      for(i=0;i<=z;i++){
        _delay_ms(20);
      }
    }
    PORTB=0;
  }
}
 

Ausblick

Lautsprecher ansprechen, Lichtsensor, Keramikschwinger, Spiele portieren..