[erledigt] Unklarer "Blink-Effekt"

Moin allerseits!

Die Schaltung, an der ich diese Tage bastle, zeigt einen seltsamen Effekt.

Es geht darum, dass ich zunächst nur die linke LED-Matrix im Film ansteuern möchte. Die LEDs links und „vor“ dem Nano zeigen lediglich an, welche Leitungen aktiv sind.

Nach dem Reset blinkt die LED der Matrix aber nur kurz auf, obwohl die passenden Leitungen ständig aktiv sind. Die passenden Zeilen im Sketch:

  {
    digitalWrite(8, HIGH); // Spalte 0, schaltet Transistor
    digitalWrite(9, HIGH); // Zeile 0, ist "Pluspol" fuer die Strecke
                           // aus Pin---LED/R---Matrix-LED--(Transistor)--GND
    while(1) {}
  }

Wer kann sich (und mir) das erklären?

Gruß

Gregor

noiasca:
Du bist lang genug dabei: Damit man dir helfen kann braucht es schon ein Schaltplan inkl. der Widerstandswerte

Stimmt:

Gruß

Gregor

Du hast die Pins in deinem Sketch nicht als Output definiert.

Allerdings würde ich die Matrix anders aufbauen:
Bei dir sehe ich eine evtl. Überlastung des Arduino Pin (x).
Den gemeinsamen + (x) durch einen PNP schalten und die Katode der Led an den Arduino Pin.

Allerdings würde ich die Matrix anders aufbauen:

Kommt darauf an wie man die Matrix ansteuert. Die Anschlüsse der LED die auf den Transistor gehen sind die, die den Strom für alle LED schalten (gemeinsame Anode bzw Kathode). Es ist unwichtig ob sie im Endeffekt die Kathoden mit NPN o die Anoden mit PNP Transistoren sind.
Ciao Uwe

uwefed:
Kommt darauf an wie man die Matrix ansteuert. Die Anschlüsse der LED die auf den Transistor gehen sind die, die den Strom für alle LED schalten. Es ist unwichtig ob sie im endeffekt die Kathoden mit NPN o die Anoden mit PNP Transistoren sind.
Ciao Uwe

Sehe ich auch so.
Nur der Beschreibung von Gregor entnehme ich, dass er mittels Pin x alle Leds mit VCC versorgt.

Aber evtl. habe ich da auch etwas falsch verstanden.
Dann sollte er es nochmal deutlicher schreiben.

HotSystems:
Du hast die Pins in deinem Sketch nicht als Output definiert.

Wo hast Du das gesehen?

In allen der zuletzt getesteten Sketches werden die Pins, an denen ein Transistor oder das „eine Ende“ der Arduino-R-LED-R-GND-Kette hängt, als Ausgänge konfiguriert. S. kpl. Sketch weiter unten.

HotSystems:
Allerdings würde ich die Matrix anders aufbauen:
Bei dir sehe ich eine evtl. Überlastung des Arduino Pin (x).
Den gemeinsamen + (x) durch einen PNP schalten und die Katode der Led an den Arduino Pin.

Nein, Pin x steht nur für einen von 7 Pins, die die Spalten oder Zeilen bedienen.

Was Überlastung angeht, mache ich mir keine Sorgen. An der LED fallen 1,7 V ab und 3,3V/180Ohm sind knapp über 22 mA. Das liegt zwar über den 20 mA, die ich mir immer als Grenze setze, aber da „damage“ erst ab 30 mA anfangen soll, bin ich mal nicht so streng :slight_smile:

Der vollständige Sketch, der das beschriebene Verhalten zeigt:

// Schonerlampe

// LED-Matrixmodul: TC12-11

#define DEBUG

#include <Piezo.h>
Piezo audio(A2);

// ---------------------------------------------------------------------
const char colPins[]={7, 8, 2, 3, 4, 5, 6};
const char rowPins[]={9, 10, 11, 12, 13, A0, A1};

const char displayWidth=sizeof(colPins)/sizeof(colPins[0]);
const char displayHeight=sizeof(rowPins)/sizeof(rowPins[0]);

const int rowOnTime=1000;   // So lang ist eine Zeile eingeschaltet
                            // MILLISEKUNDEN
                           
const char maxIntensity=7;  // Hoechster Wert fuer die
                            // Helligkeit eines Pixels
const char buttonPin=A4;    // Pin, an den der Knopf angeschlossen ist
const char potiPin=A3;      // Pin, an dem das Poti haengt


byte refX=displayWidth/2;   // (Start-) Koordinaten des Referenzpunktes
byte refY=displayHeight/2;  //
byte refXMax=displayWidth;  // und dessen Bewegungsbereich
byte refXMin=0;             //
byte refYMax=displayHeight; //
byte refYMin=0;             //

class Pixel
{
  private:
    char intensity; // Helligkeit d. Pixels
  public:
    Pixel() {intensity=0;}; // Konstruktor: Erzeugt ein Pixel
                           // mit Helligkeit 0
    bool setIntensity(char); // Setzt Helligkeit
    char getIntensity() { return intensity; }; // Holt Helligkeit
} matrix[7][7];

bool Pixel::setIntensity(char i_)
{ 
  if(i_ <= maxIntensity)
    { intensity=i_; return true;}
  else
    { return false; }
}

// displayMatrix() -----------------------------------------------------

void displayMatrix()
{
  for(char i=0; i<=maxIntensity; i++)
  {
    for(char y=0; y<displayHeight; y++)
    {
      for(char x=0; x<displayWidth; x++)
      {
        if((matrix[x][y].getIntensity()>i))
          {
            digitalWrite(colPins[x], HIGH);
          }
      }
      digitalWrite(rowPins[y], HIGH);
      delay(rowOnTime);
      digitalWrite(rowPins[y], LOW);
      for(char x=0; x<displayWidth; x++)
      {
        digitalWrite(colPins[x], LOW);
      }
    }
  }
}

// distanceToRef() -----------------------------------------------------
//
// Zu Testzwecken wird einfach ein Zufallswert zurueckgegeben

char distanceToRef(char x_, char y_, char refX_, char refY_)
{
  char result=random(maxIntensity+1);
  return(result);
}

// ---------------------------------------------------------------------
void setup()
{
  #ifdef DEBUG
  {
    Serial.begin(9600);
  }
  #endif

  for (char i=0; i<displayWidth; i++)
    {
      pinMode(colPins[i], OUTPUT);
    }
  for (char i=0; i<displayHeight; i++)
    {
      pinMode(rowPins[i], OUTPUT);
    }

  pinMode(buttonPin, INPUT_PULLUP);

  matrix[0][0].setIntensity(1);
  matrix[1][1].setIntensity(2);
  matrix[2][2].setIntensity(3);
  matrix[3][3].setIntensity(4);
  matrix[4][4].setIntensity(5);
  matrix[5][5].setIntensity(6);
  matrix[6][6].setIntensity(7);

  audio.beep(READY);

  #ifdef DEBUG
  Serial.println("---Programmstart---");
  #endif
}

// ---------------------------------------------------------------------
void loop()
{
  #ifdef DEBUG
  Serial.print  ("Button:");
  Serial.print  (digitalRead(buttonPin));
  Serial.print  (", Poti:");
  Serial.println(analogRead(potiPin));
  {
    digitalWrite(8, HIGH); // Spalte 0
    digitalWrite(9, HIGH); // Zeile 0
    while(1) {}
  }
  #endif
  
  if(digitalRead(buttonPin)==0)
  {
    audio.beep(ON);
    while(digitalRead(buttonPin)==0) {}
    audio.beep(OFF);
  }

  displayMatrix();
}

// eof

Gruß

Gregor

gregorss:
Wo hast Du das gesehen?

Eben nirgens, deswegen die Vermutung.

Nein, Pin x steht nur für einen von 7 Pins, die die Spalten oder Zeilen bedienen.

Und ok, dann habe ich es falsch interpretiert.
Den Sketch schau ich mir nochmal gesondert an.

HotSystems:
Den Sketch schau ich mir nochmal gesondert an.

Ja, bitte! Ich habe beim Programmieren eher selten Dinge, die sich so hartnäckig zu funktionieren weigern.

Was mich besonders irritiert: Ich habe mit genau so einem LED-Matrixmodul einen 35-Bit-Zähler gebaut (um damit zu kontrollieren, ob ich den ATmega168 bzw. -328 richtig „gelernt“ habe. Das zählt munter mit 19 kHz und braucht rund 21 Tage, um bis 32 Mrd. zu zählen.
Unterschied ist allerdings, dass der Zähler mit dem nackten ATmega zurecht kommt.

Gruß

Gregor

Guten Abend!

Nachdem mir das Ding bzw. die Idee, die ich habe, nicht aus dem Kopf geht, habe ich nochmal einen Aufbau auf einem Steckbrett zusammengebaut. Und siehe da: test.szaktilla.de/film.avi

Ich habe zwar andere Widerstandswerte verbaut, aber der wesentliche Unterschied ist, dass ich keine LEDs verwendet habe, um die Zustände der Leitungen bzw. Pins anzuzeigen. Bei Gelegenheit gucke ich mal nach, was für eine Gesamtschaltung sich jeweils ergibt.

Nunja ... die nächsten Tage werde ich wohl mal wieder den Lötkolben schwingen, um aus der anderen Schaltung die LEDs zu entfernen.

Gruß

Gregor