Arduino en WS2811

Arduino specifieke Software
Berichten: 4
Geregistreerd: 09 Dec 2016, 14:59

Arduino en WS2811

Berichtdoor murf » 11 Dec 2016, 02:09

Goedeavond/nacht!

Ik heb even een klein vraagje
Ik heb laatst een WS2811 ledstrip ontvangen en deze werkt uitstekend met een arduino, maar nu had ik een vraag.

Is er een mogelijkheid om realtime de kleuren te kunnen veranderen van de ledstrip of een bepaald effect te kunnen laten afspelen via de computer? Zoals bijvoorbeeld via een C# applicatie of bestaat er al een soortgelijk programma?

Heb even snel een layout gemaakt om het idee wat duidelijker te maken:

Afbeelding


Iemand enig idee hoe ik dit zou kunnen uitwerken?

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Arduino en WS2811

Berichtdoor nicoverduin » 11 Dec 2016, 09:21

Meest eenvoudige is gewoon via de com poort de waardes over pompen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4
Geregistreerd: 09 Dec 2016, 14:59

Re: Arduino en WS2811

Berichtdoor murf » 11 Dec 2016, 14:04

nicoverduin schreef:Meest eenvoudige is gewoon via de com poort de waardes over pompen.


Moet ik dan gebruik maken van bytes of van strings?

Mijn idee is dus om alle effecte van de ledstrips op te slaan in de sketch, en via een C# applicatie aangeven welk effect moet worden afgespeeld, of is er een betere manier om dit uit te voeren?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Arduino en WS2811

Berichtdoor nicoverduin » 11 Dec 2016, 15:07

De keuze is geheel aan jou. Een set data van de opslag van de pc geeft meer flexibiliteit dan vooraf programmeren maar maakt de sketch complexer.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Arduino en WS2811

Berichtdoor nicoverduin » 11 Dec 2016, 15:09

En ik zou gewoon chars naar de arduino sturen en strings geheel vermijden op kleine controllers wegens ontbreken van garbage collection.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino en WS2811

Berichtdoor Koepel » 11 Dec 2016, 15:33

Waarom niet allebei ?
Zowel een effect aanroepen als de mogelijkheid om een reeks van bytes te sturen voor iedere led afzonderlijk.

Een effect aanroepen kan met een enkel byte, zoals 'A' of 'B'.
Als je een reeks van bytes wilt versturen, dan kan het handig zijn om een start byte en een stop byte of een aantal te hebben.

Ik weet niet hoe lang de ledstrip is, maar ik zou de baudrate hoog zetten, bijvoorbeeld 115200. De standaard 9600 baud is langzaam met ongeveer 1000 tekens per seconde.
Volgens de referentie is 115200 het hoogste : https://www.arduino.cc/en/Serial/Begin, ik dacht dat het soms nog wat hoger kan, maar misschien is dat undocumented.

Bij een ATmega32U4 (zoals in de Leonardo of Micro) wordt de baudrate eigenlijk niet gebruikt en is de dataoverdracht nog veel hoger.

Berichten: 4
Geregistreerd: 09 Dec 2016, 14:59

Re: Arduino en WS2811

Berichtdoor murf » 20 Dec 2016, 22:02

Het is gelukt! standaard commando's om de ledstrip van kleur te kunnen veranderen die werken, ik merk wel dat er 2 seconden delay tussen zit, is er een mogelijkheid om de delay te verkleinen?

tevens zit ik tegen het volgende probleem:

Onder aan het script is een stukje dat moet zorgen dat de ledstrip knippert alleen als ik dat effect wil uitvoeren dan knippert de ledstrip 1x wit, en daarna niet meer. terwijl die in een loop moet blijven knipperen.

Iemand enig idee hoe ik dit kan oplossen?

Zie code:

Code: Alles selecteren
#include "FastLED.h"

#define NUM_LEDS 50
#define DATA_PIN 6
#define CLOCK_PIN 13


CRGB leds[NUM_LEDS];
int val;

void setup()
{
  Serial.begin(115200); // set serial speed
  FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
}
void loop()
{
  if (Serial.available() == 0) // do nothing if nothing sent
  {
     if (val ==  1 )
    {
    fill_solid( leds, NUM_LEDS, CRGB::Red);
    FastLED.show();
    }
/////////     
    if (val == 2)
    {
      fill_solid( leds, NUM_LEDS, CRGB::Yellow);
      FastLED.show();
    }
///////// 
    {
      if (val == 3 )
      fill_solid( leds, NUM_LEDS, CRGB::Green);
      FastLED.show();
    }
    if (val == 4 )
    {
      fill_solid( leds, NUM_LEDS, CRGB::Orange);
      FastLED.show();
    }
/////////     
    if (val == 5 )
    {
    fill_solid( leds, NUM_LEDS, CRGB::Purple);
      FastLED.show();
    }
/////////   
   
    if (val == 6 )
    {
    fill_solid( leds, NUM_LEDS, CRGB::Blue);
      FastLED.show();
    }
/////////       
    if (val == 7 )
    {
    fill_solid( leds, NUM_LEDS, CRGB::Cyan);
      FastLED.show();
    }
/////////
    if (val == 8 )
    {
    fill_solid( leds, NUM_LEDS, CRGB::White);
    FastLED.show();
    delay(500);
 
    FastLED.clear();
    FastLED.show();
    delay(500);
    }
/////////   
   
   
  Serial.println(val);

   
    }//laatste
 

      val = Serial.parseInt(); // deduct ascii value of '0' to find numeric value of sent number
 

}


Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino en WS2811

Berichtdoor Koepel » 20 Dec 2016, 22:25

Dit is een belangrijk punt. De afgelopen tijd blijven meerdere mensen hier in hangen op dit forum, omdat ze niet de gedachtensprong kunnen maken dat de loop() steeds opnieuw uitgevoerd wordt.

De loop() wordt steeds opnieuw uitgevoerd, dus zijn er vaak globale variabelen nodig die hun waarde houden als de loop() is afgelopen. Het is zelfs zo dat hoe vaker de loop() per seconde wordt uitgevoerd, des te soepeler alles gaat. Daarom is het vaak nodig om "delay()" te voorkomen door "millis()" te gebruiken. Ook werkt een "state machine" vaak goed samen met de Arduino loop().
Je hoeft dit nog niet te begrijpen, ik schrijf het alleen maar op om je alvast te laten wennen aan de termen "millis()" en "state machine" ;)

Je gebruikt Serial.available() samen met Serial.parseInt(). Die gaan lastig samen. Kies een van de twee.

Het begint er mee dat je eerst goed omschrijft wat het protocol is dat de Arduino ontvangt.
Een getal ? Dat zegt me niets. Echt niet. Ik ben heel serieus.
Je hebt een goede omschrijving nodig.
Wil je een getal van een paar cijfers ? Hoeveel cijfers ? Kan het getal negatief zijn ? Gevolgd door een CarriageReturn of LineFeed ? Of allebei ? En wat als er geen CarriageReturn of LineFeed komt ? Hoe lang wil je dan de timeout laten duren voordat een aantal cijfers als één getal wordt gezien ? En wat als dat uit sync raakt ?
Dit is de reden dat nicoverduin schreef om enkel chars naar de arduino sturen en strings geheel vermijden, en dit is de reden dat ik een enkel byte noemde zoals 'A' en 'B'. Op die manier voorkom je al die problemen.
Doe je best, en maak een goede beschrijving van het protocol. Pas daarna kun je over de code van sketch gaan nadenken.

Berichten: 4
Geregistreerd: 09 Dec 2016, 14:59

Re: Arduino en WS2811

Berichtdoor murf » 20 Dec 2016, 23:41

Koepel schreef:Dit is een belangrijk punt. De afgelopen tijd blijven meerdere mensen hier in hangen op dit forum, omdat ze niet de gedachtensprong kunnen maken dat de loop() steeds opnieuw uitgevoerd wordt.

De loop() wordt steeds opnieuw uitgevoerd, dus zijn er vaak globale variabelen nodig die hun waarde houden als de loop() is afgelopen. Het is zelfs zo dat hoe vaker de loop() per seconde wordt uitgevoerd, des te soepeler alles gaat. Daarom is het vaak nodig om "delay()" te voorkomen door "millis()" te gebruiken. Ook werkt een "state machine" vaak goed samen met de Arduino loop().
Je hoeft dit nog niet te begrijpen, ik schrijf het alleen maar op om je alvast te laten wennen aan de termen "millis()" en "state machine" ;)

Je gebruikt Serial.available() samen met Serial.parseInt(). Die gaan lastig samen. Kies een van de twee.

Het begint er mee dat je eerst goed omschrijft wat het protocol is dat de Arduino ontvangt.
Een getal ? Dat zegt me niets. Echt niet. Ik ben heel serieus.
Je hebt een goede omschrijving nodig.
Wil je een getal van een paar cijfers ? Hoeveel cijfers ? Kan het getal negatief zijn ? Gevolgd door een CarriageReturn of LineFeed ? Of allebei ? En wat als er geen CarriageReturn of LineFeed komt ? Hoe lang wil je dan de timeout laten duren voordat een aantal cijfers als één getal wordt gezien ? En wat als dat uit sync raakt ?
Dit is de reden dat nicoverduin schreef om enkel chars naar de arduino sturen en strings geheel vermijden, en dit is de reden dat ik een enkel byte noemde zoals 'A' en 'B'. Op die manier voorkom je al die problemen.
Doe je best, en maak een goede beschrijving van het protocol. Pas daarna kun je over de code van sketch gaan nadenken.


Hartstikke bedankt voor het uitbundige antwoord, ik ga er morgen naar kijken en me wat meer verdiepen in de genoemde termen!

Fijne avond!

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: wihoxefexip en 40 gasten