Show Posts
Pages: [1]
1  International / Deutsch / Re: Programmfehler, find ihn aber nicht on: March 09, 2013, 10:11:01 am
Hi,

habe ich gemacht.

Lustigerweise rennt es so.
Code:
1
2
3
4
5
Counter value: 25
6
7
8
Counter value: 25
9
10
11
12
13
Setup finished

ich hab es nochmals ohne die "DEBUG" Ausgaben getestet. Funktioniert nicht. Woran kann dass denn liegen?
Und nochwas ist mir aufgefallen, wenn ich den Encoder auf bestimmten Stellen stehen lassen. Wird dennoch die Funktion "updateEncoder" durchgeführt, allerdings (logischerweise) ohne den Wert zu verändern.
Ist der Encoder mist?

Gruß

Til
2  International / Deutsch / Programmfehler, find ihn aber nicht on: March 08, 2013, 01:04:25 pm
Hallo zusammen,

ich habe einen Arduino Due mit einem Rotary Encoder (siehe: http://www.exp-tech.de/Zubehoer/Sparkfun-Rotary-Encoders---Illuminated.html )
und einem 16fach LED Anzeigefeld (siehe: http://www.exp-tech.de/Shields/Rotary-Encoder-LED-Ring-Breakout-Board---Blue-332.html )

Aber irgendwie will das Sketch nicht richtig laufen. Ich sitz jetzt schon den dritten abend dran. Nehm alle Zeilen auseinander, und finde den fehler nicht.

Kann mir jemand sagen, warum ich noch nicht mal was im seriellen Monitor sehe?
ich bekomm noch nicht mal die Erfolgsmeldung, dass das Setup durchgelaufen ist.

Danke für jede Hilfe. Verbesserungen im Quellcode sind ebenso gerne willkommen.

Gruß

Til

Code:
//These are the pins that will talk to the shift register through SPI
#define SDI    20    //Data
#define CLK    21    //Clock
#define LE     22    //Latch

//These are the rotary encoder pins A, B, and switch
#define ENC0_A    2
#define ENC0_B    3
#define ENC0_SW   30

//These are the pins for the encoder light
#define ENC0_Red   32
#define ENC0_Green 33

// Global variables
int scaledCounter = 0;  //The LED output is based on a scaled veryson of the rotary encoder counter
int sequenceNumber = 0;   //The output sequence for the LEDs

int lastEncoded = 0; //

int ENC0_Pos = 0;   // 0 to 100
int ENC0_Col = 0;   // 0 = off, 1 = green, 2 red

int lastMSB = 0;
int lastLSB = 0;

/*This is a 2 dimensional array with 3 LED sequences.  The outer array is the sequence;
 the inner arrays are the values to output at each step of each sequence.  The output values
 are 16 bit hex values (hex math is actually easier here!).  An LED will be on if its
 corresponding binary bit is a one, for example: 0x7 = 0000000000000111 and the first 3 LEDs
 will be on.
 
 The data type must be 'unsigned int' if the sequence uses the bottom LED since it's value is 0x8000 (out of range for signed int).
 */
unsigned int sequence[3][16] = {
  {0x0,0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80,0x100,0x200,0x400,0x800,0x1000,0x2000,0x4000},
  {0x0,0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f,0xff,0x1ff,0x3ff,0x7ff,0xfff,0x1fff,0x3fff,0x7fff},
  {0x0,0x7fff,0x3ffe,0x1ffc,0xff8,0x7f0,0x3e0,0x1c0,0x80,0x1c0,0x3e0,0x7f0,0xff8,0x1ffC,0x3ffe,0x7fff}
  };

void setup() {
  //Set SPI pins to output
  pinMode(SDI, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(LE,OUTPUT);
  //Set encoder pins to input, turn internal pull-ups on
  pinMode(ENC0_A, INPUT);
  digitalWrite(ENC0_A, HIGH);
  attachInterrupt(ENC0_A, updateEncoder, CHANGE);
  pinMode(ENC0_B, INPUT);
  digitalWrite(ENC0_B, HIGH);
  attachInterrupt(ENC0_B, updateEncoder, CHANGE);
  pinMode(ENC0_SW, INPUT);
  digitalWrite(ENC0_SW, HIGH);
  //Set encoder color pins
  pinMode(ENC0_Red, OUTPUT);
  pinMode(ENC0_Green, OUTPUT);  
  //Set serial rate for debug
  Serial.begin(9600);
  Serial.println("Setup finished");
}

void loop() {
  digitalWrite(ENC0_Red, LOW);
  digitalWrite(ENC0_Green, HIGH);
 
  //if the encoder has moved
  if(ENC0_Pos) {
    //Set the new counter value of the encoder      
    scaledCounter = map(ENC0_Pos,0,100,0,15);
    //Send the LED output to the shift register
    digitalWrite(LE,LOW);
    shiftOut(SDI,CLK,MSBFIRST,(sequence[sequenceNumber][scaledCounter] >> 8));    //High byte first
    shiftOut(SDI,CLK,MSBFIRST,sequence[sequenceNumber][scaledCounter]);           //Low byte second
    digitalWrite(LE,HIGH);
  }

  //If the encoder switch is pushed, this will turn on the bottom LED.  The bottom LED is turned
  //on by 'OR-ing' the current display with 0x8000 (1000000000000000 in binary)
  if (!digitalRead(ENC0_SW)) {
    if (sequenceNumber == 3) {
      sequenceNumber = 0;
    } else {
      sequenceNumber++;
    }
    digitalWrite(LE,LOW);  
    shiftOut(SDI,CLK,MSBFIRST,((sequence[sequenceNumber][scaledCounter]|0x8000) >> 8));
    shiftOut(SDI,CLK,MSBFIRST,sequence[sequenceNumber][scaledCounter]);              
    digitalWrite(LE,HIGH);  
  }
}

void updateEncoder() {
  int MSB = digitalRead(ENC0_A); //MSB = most significant bit
  int LSB = digitalRead(ENC0_B); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

  if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) ENC0_Pos++;
  if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) ENC0_Pos--;

  if (ENC0_Pos < 0) {
    ENC0_Pos = 0;
    //set green LED on
    digitalWrite(ENC0_Red, LOW);
    digitalWrite(ENC0_Green, HIGH);
  }
  if (ENC0_Pos > 100) {
    ENC0_Pos = 100;
    //set red LED on
    digitalWrite(ENC0_Red, HIGH);
    digitalWrite(ENC0_Green, LOW);
  }
  lastEncoded = encoded; //store this value for next time
  Serial.print("Counter value: ");
  Serial.println(ENC0_Pos, DEC);
}

Update: Rechtschreibfehler verbessert. *g*
3  International / Deutsch / Re: testbericht zum WS2812 on: February 27, 2013, 02:54:50 am
Nachtrag:
Habe gerade mal den größten Abschnitt berechnet.
Dieser ist 12.4m lang, also runt 740 LEDs.
Das liegt ja dann unter den 1000 LEDs und müsste mit 30fps zu machen sein.
Oder?
4  International / Deutsch / Re: testbericht zum WS2812 on: February 27, 2013, 02:42:20 am
Hey,

vielen vielen Dank für die ganzen Infos. Ich wollte euch damit echt nicht nerven.
Ich bin Informatiker und kein Nachrichtentechniker.
Habe bis jetzt auf jeden Fall schon viel gelernt. *thx a lot*

Wenn ich das Ganze mal zusammenfasse - so wie ich es verstanden habe - ist folgendes die beste Möglichkeit:

- Ein zentraller "Server" (am liebsten den Due, denn den hab ich schon bestellt)
* der berechnet das gesamte "Bild"
* teilt das "Bild" in die Abschnitte und schickt es an die "Slaves"

- Drei Slaves Typ "ATmega1284P" für jeden Abschnitt
* jeder Slave bekommt sein Bild und "pushed" es bei einem gemeinsamen Signal an die Strips

- Die Übertragung des Teilbildes an den Strip muss fix mit 800kHz erfolgen
- Die Übertragung des Teilbildes an die Slaves muss mit mindestes 2.4MHz erfolgen, da ja 3 Teilbilder verschickt werden
- Das Sync Signal muss vom "Server" kommen und 30 Hz betragen.
- das gemeinsame Sync-Signal darf nur die "Slaves" erreichen, die eine Änderung des Teilbildes haben, Strips die nicht verändert werden behalten so die vorherige Einstellung bei.

Ist das so richtig?

Til
5  International / Deutsch / Re: testbericht zum WS2812 on: February 26, 2013, 03:36:36 pm
Hallo Eisbaer,

wieso 16MHz?
Der DUE rennt doch mit 84MHz?
genuegend Zeit die Pins zu wechseln, und wieder zurueckzuschalten, oder?

Til
6  International / Deutsch / Re: testbericht zum WS2812 on: February 26, 2013, 02:22:07 pm
Hi, das ist glaub ich auch ne Idee.
Kannst du abschätzen wie lange die Umschaltzeit ist?
Die LEDs sollen natürlich einzeln steuerbar sein.
parallel wird wohl nicht klappen, wie soll denn dann ein farbwechsel laufen?

Aber nochmal ne Frage, warum soll man OctoWS2811 nicht auf den DUE portieren können? der DUE kann doch ebenfalls DMA.

Til
7  International / Deutsch / Re: testbericht zum WS2812 on: February 26, 2013, 12:22:11 pm
es scheint als habe ich das Loesungsproblem gefunden.
schaut mal hier:
http://www.pjrc.com/teensy/td_libs_OctoWS2811.html

bis zu 8 Strips an einem Teensy 3.0. Der Due hat ebenfalls DMA. Könnte ich das evtl. portieren?

Gruß

Til
8  International / Deutsch / Re: testbericht zum WS2812 on: February 26, 2013, 09:00:23 am
Hi,

Danke für die Tipps. Arduino Due hab ich schon lange bestellt.

Irgendwo hab ich auch gelesen, dass die Signalspannung beim ersten LED auch 3.3V betragen kann, die Strecke zwischen den DUE und dem ersten LED darf wohl nur nicht zu lang sein. Ansonsten kommt halt n Pegelwandler rein.

Hab euch mal n Bild von dem Wohnzimmer angehangen.

Ist warscheinlich nicht nötig alle LEDs gleichzeitig mit weiss zu beschalten. Sondern dann halt nur jedes zweite oder dritte.
Allerdings strahlen die LEDs nach oben. Und das Licht kommt nur aus einem 4-6cm großem Spalt.

Die Bildrate für Farbübergänge sind nicht sooo wichtig, natürlich will ich einen flüssigen farbverlauf sehen.

Meint ihr es könnte klappen die 40m an einen Strang zu bauen?

Ein typisches Anwendungsbeispiel in meinem Wohnzimmer wäre abends zum Beispiel:
- Leinwand unten, Licht in Abschnitt III wird nicht gebraucht
- Abschnitt II leuchtet weiß (jede 5. LED)
- Abschnitt I leuchtet weiß (jede 3. LED)

Meine Frau will dann was lesen, dann muss Abschnitt I heller werden, da hier die Couch steht. also Leuchtet jede 2. LED.

Beispiel 2:
ein Farbwechsel soll von Abschnitt I über die Mitte in Abschnitt II bis in Abschnitt III laufen. Also von Links nach Rechts.

Lichtprogramm technisch mach ich mir dazu weniger gedanken, das bekomm ich hin. Nur die Ansteuerung der LEDs, wie am sinnigsten, das macht mir gedanken.

Die Ansteuerung über 3 unterschiedliche PINs würde mir hier am logischsten erscheinen.

Gruß

Til









9  International / Deutsch / Re: testbericht zum WS2812 on: February 26, 2013, 06:50:20 am
Hallo zusammen,

erstmal vorweg, vielen Dank für diesen hilfreichen Thread.
Habe mir ebenfalls 2m WS2812 Strips bestellt also 120 LEDs.

Will diese mit dem Arduino Due verbinden. Hab dazu schon extrem viele Seiten gelesen, Interesannt ist für mich das Thema ob ich nicht mehrere Pins für verschiedene Strips verwenden kann.
Für mein Projekt "Wohnzimmerbeleuchtung" brauch ich über 40m Strips. Was dann folglich über 2400 LEDs sind.
Diese an einem Pin zu betreiben erscheint mir ein Ding der Unmöglichkeit. Da ich mit dem Due eine höhere Taktrate habe, müsste ich die Strips doch bei 800kHz auf mehreren Pins parallel betreiben können, oder sehe ich das falsch?

Ich bin ein absoluter Anfänger in Sachen Mircocontroller. Und würde mich echt freuen, wenn Ihr mir bei dem Projekt unter die Arme greift.

Lieben Gruß

Til

10  International / Deutsch / Re: Anfaenger Frage zu Arduino Projekt (LED / IR / Touchscreen) on: February 26, 2013, 04:33:41 am
Hi Stefan,

Hatte zuerst auch vor den Mega zu holen.
Da, die strips aber 800kHz brauchen, ist der Mega mit 16MHz Takt schon etwas "langsam".
Deshalb habe ich gedacht den Due zu nehmen.
FastSPI läuft auch auf dem Due. Siehe hier: http://funkboxing.com/wordpress/?p=1366
Ich habe mir die Quellcodes mal angeschaut, und denke eingentlich, dass es möglich sein sollte, auch zwei oder mehrere Strips an unterschiedlichen Pins zu betreiben, allerdings bin ich ein MicroController Anfänger.
 
Habe eher mit Serveren und IT-Netzwerken zu tun.

Durch den schnelleren Takt sollte ich aber noch Reserven frei haben, um die Steuerung abzufragen und ggf. die Interrupts zu behandeln.
Sollte es durch den schnelleren Takt nicht auch möglich sein, Strip 1 an PIN A mit 800kHZ zu beschicken, dann Strip 2 an PIN B mit 800kHz, oder evtl. beide gleichzeitig? Geht das?

Der Link mit dem PI ist super interessant, vor allem weil hier dann mit PHP programmiert wird (kann ich fließend).




11  International / Deutsch / Re: Anfaenger Frage zu Arduino Projekt (LED / IR / Touchscreen) on: February 25, 2013, 04:07:26 am
Hallo Uwefed,

vielen Dank fuer deine Ausfuehrungen.
Spannungsversorgung ist kein Problem, damit hatte ich mich schon ausseinandergesetzt.
Kann man denn auch mehrere Strips paralell an unterschiedlichen Pins mit FastSPI betreiben?
Damit würde sich das Limit von 1000 LEDs umgehen lassen. Aber klappt das auch?

Zum Lichtprogramm:
Mit der Programmierung habe ich noch nicht angefangen, will erstmal meine offenen Fragen beantworten können, bevor ich code.
Im Grunde sollen alle Lichtprogramme in einer Endlosschleife laufen, bis sie durch eine Userinteraktion geändert werden.

Laut Spezifikation haben die WS2812 5V "Signal-Spannung", habe aber in diversen Foren gelesen, dass die Dinger auch 3,3 funktionieren, solang das erste LED nicht zu weit vom Arduino entfernt ist.

Gruß

Til
12  International / Deutsch / Anfaenger Frage zu Arduino Projekt (LED / IR / Touchscreen) on: February 20, 2013, 09:45:57 am
Hallo zusammen,

ich habe vor mein Wohnzimmer mit einer indirekten LED Beleuchtung zu versehen. (Siehe Anhang: wohnzimmer-stip-count.png)

Das Ganze soll über eine IR Universalvernbidinung von Logitech Harmony 900 zu steuern sein.
(http://www.logitech.com/de-de/product/harmony-900?crid=60)
Alternativ natürlich über IPhone mit Webserver und nochmal alternativ über ein Touchscreen ("SainSmart 3.2" TFT Touch Screen LCD + SD reader + Mega Expansion Board 4 Arduino")
(http://www.ebay.de/itm/SainSmart-3-2-TFT-Touch-Screen-LCD-SD-reader-Mega-Expansion-Board-4-Arduino-/221192045692?pt=Elektromechanische_Bauelemente&hash=item338012c47c)


Für das Projekt habe ich mir "12mm Diffused Thin Digital RGB LED Pixels" (http://adafruit.com/products/322) ausgesucht, alternativ vielleicht noch folgender Strip "60 RGB LED Strip mit WS2812"
(http://www.ebay.de/itm/1m-60-RGB-LED-Strip-mit-WS2812-5050-SMD-LEDs-mit-integriertem-WS2811-Controller-/350688305895?pt=Bauteile&hash=item51a6a6e2e7)

Da ich hier über 800, warscheinlich sogar über 1000 Pixel habe, wollte ich von euch mal wissen, ob es bei einem Arduino Probleme / Limit mit der Anzahl der Pixel gibt.

Ich habe schon jetzt schon einiges (um nicht zu sagen Tonnen) dazu gelesen. So wie ich das ganze verstanden habe benutzt das EthernetShield und das TFT Touchscreen den SPI Anschluss.
Den oder die Strips werden ebenfalls über den SPI angesprochen. Klappt das überhaupt?

Als Platform dachte ich an einen Arduino Due. Da die Verarbeitsungsgeschwindigkeit ja durchaus schneller ist.

Programmiertechnisch mache ich mir keine Sorgen (bin Informatiker).

In dem Programm sollen dann einzelne Lauflichtprogramme und Lichteffekte gesteuert werden. Habe dazu mal die FastSPI gelesen, und das ist ja super einfach.

Nun meine Fragen:

A) gibts irgendwelche Limits in Punkto Anzahl von LEDs?
B) können sich alle Komponenten die SPI Schnittstelle teilen?
C) Wie funktioniert das mit den Interrupts? Während ein Lichtprogramm laeuft kann ich wie auf Eingaben über die Webschnittstelle / Touchscreen / IR reagieren? gibts dazu irgendewelchen Beispiel Source-Code?
D) Kappt das mit der Spannungsversorgung? Arduino hat 3,3V die Stips / LEDs sprechen 5V. Muss ich das noch hochsetzten?
E) Auf der SD Karte von dem Ethernet Shield würde ich gernde die einzelnen Licht-Programme speichern, und auch die Webseite an sich. Kann ich die Lichtprogramme dann zur Laufzeit mit in den Programcode laden? Hat jemand vielleicht ne Anleitung für den Webserver? Dazu hab ich nur die Webserver Sample Code gefunden, das ist aber n bisschen dürftig. Da ich nicht nur Werte ausgeben, sondern auch aktiv verändern will.

Hoffe Ihr könnt mir ein bisschen weiterhelfen. Da ich auf die Fragen noch keine Antwort gefunden habe.

Liebe Grüße aus dem Westerwald

Til
Pages: [1]