8xRGB

Ach ja, was Du noch nicht erwähnt hast. Welchen Arduino benutzt Du eigentlich ?

Denke mal ich mir demnächst folgende Version kaufen werde:
http://www.watterott.com/de/Button-Pad-4x4-Breakout-PCB
http://www.watterott.com/de/Button-Pad-4x4-Silikon-Kontaktmatte

Getestet hab ich das ganze mit einem UNO aber ich habe noch einen Mega2560 hier rumliegen, den ich dann für das Projekt nutzen werde. zZ. teste ich mit dem das Midi-Shield.

Ich denke mal das ich es geschaft habe.

Es war ein Timing Problem.

// Unter Benutzung eines 74HC595 und eines ULN2803 
// für ein Button Pad 2x2 von http://www.sparkfun.com
int data  = 2; // 74HC595
int clock = 3; // 74HC595
int latch = 4; // 74HC595
int blu =  9;  // Arduino Digital Pin 9
int grn =  10; // Arduino Digital Pin 10
int red =  11; // Arduino Digital Pin 11
int row1[] = {B00000001, B00000010, B00000100, B00001000};

void setup()
{
  pinMode(data,  OUTPUT);
  pinMode(clock, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(grn,   OUTPUT);
  pinMode(blu,   OUTPUT);
  pinMode(red,   OUTPUT);
}

void loop()
{
  updateLEDs(row1[0], 255, 0, 0);
  delayMicroseconds(3000);
  updateLEDs(row1[1], 0, 255, 0);
  delayMicroseconds(3000);
  updateLEDs(row1[2], 0, 0, 255);
  delayMicroseconds(3000);
  updateLEDs(row1[3], 255, 255, 255);
  delayMicroseconds(3000);
}

void updateLEDs(byte row, byte r, byte g, byte b)
{
  digitalWrite(latch, LOW);            // Pulls the chips latch low
  shiftOut(data, clock, MSBFIRST, 0);   // Festlegung der Led die leuchten soll
  digitalWrite(latch, HIGH);            // Pulls the latch high displaying the data
  analogWrite(red, r);                  // Ändern der 3 Farbkannäle erst wenn Leds aus
  analogWrite(grn, g);  
  analogWrite(blu, b);  
  delayMicroseconds(1875);              // Ein verkleinern dieses Wertes führt zur Farbvermischung
  digitalWrite(latch, LOW);            // Pulls the chips latch low
  shiftOut(data, clock, MSBFIRST, row); // Festlegung der Led die leuchten soll
  digitalWrite(latch, HIGH);            // Pulls the latch high displaying the data
}

Wenn ich hier neue Werte übergebe

  analogWrite(red, r);      
  analogWrite(grn, g);
  analogWrite(blu, b);

dann dauert es ca. 1875 Microsekunden bis sich der neue Zustand aufgebaut hat.
Bis die neuen Spannungswerte erreicht werden.

Wartet man weniger lange hat man Teile der Farbe der vorherigen LED in der aktuellen Led !

Rote Tasten die blau blinken:

void loop()
{
  for(byte Zaehler = 0; Zaehler < 100; Zaehler += 1)
  {
    if (Zaehler < 86)
    {
      updateLEDs(row1[0], 255, 0, 0);
      delayMicroseconds(3000);
      updateLEDs(row1[1], 255, 0, 0);
      delayMicroseconds(3000);
      updateLEDs(row1[2], 255, 0, 0);
      delayMicroseconds(3000);
      updateLEDs(row1[3], 255, 0, 0);
      delayMicroseconds(3000);
    }
      else
      {
        updateLEDs(row1[0], 0, 0, 255);
        delayMicroseconds(3000);
        updateLEDs(row1[1], 0, 0, 255);
        delayMicroseconds(3000);
        updateLEDs(row1[2], 0, 0, 255);
        delayMicroseconds(3000);
        updateLEDs(row1[3], 0, 0, 255);
        delayMicroseconds(3000);
      }
  }
}

Weihnachtlich bunt:

byte rot[4];
byte gruen[4];
byte blau[4];

void loop()
{
  for(byte Zaehler = 0; Zaehler < 4; Zaehler += 1)
  {
    rot[Zaehler] = random(255);
    gruen[Zaehler] = random(255);
    blau[Zaehler] = random(255);
  }
  for(byte Zaehler = 0; Zaehler < 15; Zaehler += 1)
  {
    for(byte LedNr = 0; LedNr < 4; LedNr += 1)
    {
      updateLEDs(row1[LedNr], rot[LedNr], gruen[LedNr], blau[LedNr]);
      delayMicroseconds(1900);
    }
  }
}

Viel Spass beim weiterentwickeln und realisieren der eigenen Ideen !

Wenn weitere Fragen bestehen, dann einfach fragen !

Danke vielmals!

Im mom kann ich es gerade noch nicht ausprobieren, da ich gerade den ganzen Aufbau auf eine Prototypenkarte übertrage.
Und ich bin etwas langsam was das löten angeht :slight_smile:

Wie hast Du rausgefunden dass es genau 1875 Mikrosekunden dauert???

Und warum dauert das "so lange" ? Bei digitalWrite gibt es dieses Problem ja anscheinend nicht.

Liegt das an der LED oder am Arduino?

Zuerst einmal vermute ich das es an der Art liegt wie das PWM-Signal produziert wird, also an seinen Eigenheiten.

Ich habe die Leds rot, gruen, blau und weiss in Reihe leuchten lassen.

Wenn ich weniger als 1875 Mikrosekunden gewartet habe konnte ich sehen das bei der grünen auch das rote ganz kurz aufleuchtet und bei der blauen das grüne. Als ich den Wert dann auf 1875 gesetzt hatte tauchte dieses Phanomen nicht mehr auf.

Vielleicht kann man den
delayMicroseconds(1875)
Wartebefehl durch

digitalWrite(pinrot, LOW);
digitalWrite(pingruen, LOW);  
digitalWrite(pinblau, LOW);

ersetzen. Das habe ich allerdings nicht ausprobiert !

Ich vermute mal das dies nützlich sein könnte um bei der Abfrage der Tasten der Keypads Arduino Pins einzusparen.

I2C Port expander and keypads for Arduino:
http://www.arduino.cc/playground/Main/I2CPortExpanderAndKeypads


5V o----||---
4,7k |
Arduino PinA5 SCL o-------------------o Pin14 SCL PCF8574 PinP0-P7 o---o Keypad
PinA4 SDA o-------------------o Pin15 SDA
___ |
5V o----|
|---
4,7k

Arduino Duemilanove & Uno:
Pin A4 = SDA (data)
Pin A5 = SCL (clock)

Arduino Mega:
Pin 20 = SDA (data)
Pin 21 = SCL (clock)

DIP ATmega328-PU:
Pin 27 = SDA (data)
Pin 28 = SCL (clock)

@Radar

Und wie läuft es im Moment ?

Hey, ja ganz gut. Bin gestern Nacht mit dem zusammen löten fertig geworden. Und mal wieder angeschlossen. Hab aber irgendwie noch n paar Wackelkontakte oder sowas, die ich erstmal beheben muss. Aber läuft mal soweit. Da ich n Mega verbaue hab ich mehr als genug Steckplätze um jeden Button einzeln abzunehmen. Brauche da also keine IC's für oder so.

Und das nächste mal werde ich ganz sicher ein PCB ätzen. Denn all diese Verbindungen auf nem PrototypenBoard zu löten ist einfach Sch*****! Dazu sind mir teilweise die Kupferringe abgefallen(n bissie lange erhitzt) und im Loch drin hats auch kein Kupfer.

Wie ists eigentlich beim selber ätzen. Gibt es Möglichkeiten die Löcher auch innen zu verkupfern und leitende Durchgänge zu machen? Oder können das nur Profis mit speziellen Tools?

Ach ja, hast Du einen Tipp wie ich am besten die schwarzen Female-Stecker der Arduino weglöten kann? Oder lässt man die dran und macht bei den Drähten die Male-Stecker an und verleimt das ganze?

Jupp, soviel mal zu meinem Status update :slight_smile:

Durchkontaktieren:
http://www.elektor.de/jahrgang/2005/marz/durchkontaktieren.63330.lynkx
http://www.prime-electronics.com.au/datasheets/data/Multicore/Wave%20Soldering/Acessories/Through%20Hole%20Repair%20Kit/Tech%20Data%20Sheet.pdf

Wenn Du etwas entlöten willst dann benutzt am besten Entlötlitze:
http://www.google.de/products?q=entlötlitze&um=1&ie=UTF-8&ei=YTn2TPv1HISVswaUm93CBA&sa=X&oi=mode_link&ct=mode&ved=0CBgQ_AU

Auf keinen Fall eine Entlötpumpe sonst fehlen dir nachher weitere Kontaktringe !

Warum willst Du die ablöten ?

Habe hier noch etwas interessantes gefunden:

74C922 16-Key Encoder:

74C922:

  • Keybounce elimination with single capacitor
  • Last key register at outputs

Ahhh cool, werde ich mal bestellen und auschecken.

Ansonsten bin ich noch dran. Hab mein gelötetes über den Haufen geworfen und habe nochmals begonnen. Mit ein paar anderen Ideen.
zB. gehe ich nicht mehr durch alle 16 LEDs und schalte die an und aus sondern mache das pro 4er Block. Was der Helligkeit wohl zugute kommt. Macht es aber auch ein bisschen komplizierter Software-Seitig.
Die Buttons nehme ich im Moment direkt am Mega ab. Der hat genug In-/Outputs.

Eine Frage hat sich noch im zusammenhang mit dem Projekt ergeben:

Kannst Du hier genau sehen welche Anschlüsse gebraucht werden vom Arduino?
Ich will das Ding nicht mehr oben drauf stecken, sondern nur noch mit Kabeln verbinden. (Es verbraucht sinnlos Platz auf dem Mega)

Ich sehe folgende Anschlüsse:

  • Pin4
  • Pin5
  • TX
  • RX
  • V5
  • und irgend ein Ground wird wahscheinlich auch gebraucht.

Laut Arduino Shield List: Sparkfun MIDI Shield sind es ein paar mehr...

Wenn Du die RGB Leds nicht mehr einzeln schaltest sondern als 4er Block dann steigt die benötigte Stromstärke von 60mA auf 240mA.

@stundenblume: Thnx für den Link! Ist aber leider ein anderes Shield. Das was ich besitze ist das Midi-Breakout und hat keine Knöpfe oder Potis.
Aber ich hab mal die Info an die Seite weitergeleitet und hoffe der Typ da findet es raus :slight_smile:

@mega: Also ich "multiplexe" immer noch. Es ist immer noch jedes LED einzeln ansteuerbar. Also ich benutze im Moment 9 Kanäle nur für die RGB Kabel... hust und 16 für die Grounds und 16 für die Buttons. Aber die LEG-Grounds nehme ich nachher wieder zusammen mit dem 74595 und dem ULN, wie schon besprochen.

Hast Du vielleicht den direkten Produktlink ?

Ja, sicher.