Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



NEOPIXEL handmatig ...
 
Deel:
Meldingen
Alles wissen

[Opgelost] NEOPIXEL handmatig programmeren

16 Berichten
2 Gebruikers
0 Reactions
3,495 Bekeken
(@marcohaller)
Active Member
Deelgenomen: 7 jaar geleden
Berichten: 8
Topic starter  

Ten eerste mij complimenten voor de enorme uitgebreide handleidingen over Neopixel en Fastled, werkelijk duidelijk en met de effecten erbij, super goed.

Ik heb met mijn 3D printer de letters STAR ROCKER geprint en in elk van deze letters zitten NeoPixel Diffused 5mm leds. Als ik hier een van de lichteffecten uit de handleiding er op los laat gaat het helemaal perfect zoals het hoort. Maar nu wil handmatig zelf wat programmeren/proberen, ik begrijp dat dit kan.

In elke letter zitten dus NeoPixel Diffused 5mm leds, niet alle letters hebben evenveel leds, zie hier:

S heeft 8 LEDS

T heeft 8 LEDS

A heeft 7 LEDS

R heeft 9 LEDS ect ect …

Nu kun je per led een kleur aangeven met het volgende voorbeeld: 

c = strip.Color(255, 0, 0); // defineer de variable c als ROOD (R,G,B)

strip.setPixelColor(10, c); // zet LED 10 in de kleur die we in de variabele c hebben gezet (rood)

strip.show(); // Update alle LEDs (= maakt LED 10 rood)

Nu wil de letters STAR allemaal rood hebben en ROCKER in de kleur blauw.

Hoe kan ik ervoor zorgen dat STAR een groep word en ROCKER een groep zodat ik niet alle leds apart hoef in te vullen. Eerste instantie zou dit het kunnen zijn maar hier schiet mijn kennis even te kort. 

int myLEDs[ ] = {1, 2, 3, 4, 5, 6, 7, 8};

int myLEDt[ ] = {9, 10, 11, 12, 13, 14, 15, 16};

int myLEDa[ ] = {17, 18, 19, 20, 21, 22, 23};

int myLEDr[ ] = {24, 25, 26, 27, 28, 29, 30, 31};

int myLEDstar[ ] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};

c = strip.Color(255, 0, 0); // defineer de variable c als ROOD (R,G,B)

strip.setPixelColor(myLEDstar, c); // zet de leds in star in de kleur rood

strip.show(); // voer nu uit

Kan en wil iemand mij hier in helpen? STAR ROCKER is een soort van woord wat net als op de kermis allerlei kleuren en effecten rijk mag zijn, als het kan.

Dat zou geweldig zijn. Misschien zijn er voorbeeldjes of tips ideen? Ik hoor ze graag, alvast bedankt!!!


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Hi Marcohaller,

je kunt inderdaad met een array aan de gang, maar misschien is het handiger om een functie te maken die een begin punt, eind punt en kleur accepteert (eerst maar beginnen met 1 kleur per letter voor we overgaan op effecten).

Je weet de waarden van de letters al, wat het aantal LEDs betreft. Je zou deze vooraf kunnen definiëren. B.v.

int letterS_start = 1;
int letterS_eind = 8;
int letterT_start = 9;
int letterT_eind = 16;

of misschien beter (omdat er geen variable gedefinieert hoeft te worden):

#define letterS_start 1
#define letterS_eind 8
#define letterT_start 9
#define letterT_eind = 16

"#define" bespaard geheugen omdat de compiler simpel weg elk voorkomen van b.v. "letterS_start" vervangt door het nummer "1" - versus "int letterS_start" een integer variabele aanmaakt en tijdens het draaien van het programma deze waarde invult in de variable en de variabele aanroept waar nodig.

Vervolgens zou je een functie kunnen maken om de kleur in te stellen:

void kleurLetter(int start, int eind, byte rood, byte groen, byte blauw) {
  for(int c = start; c <= eind ; c++) {
    strip.setPixel(c, rood, groen, blauw);
  }
  strip.show();
}

Je kunt dan voor iedere letter het volgende doen:

kleurLetter(letterS_start, letterS_eind, 255, 0, 0);
kleurLetter(letterT_start, letterS_eind, 255, 0, 0);

Er zijn vast efficiëntere manieren, maar dit is misschien een goede manier om te starten.

Mocht je nu een effect per letter willen hebben, dan wordt het e.e.a. wel gecompliceerder, omdat dan per letter een effect "berekent" moet worden.


   
BeantwoordenCiteren
(@marcohaller)
Active Member
Deelgenomen: 7 jaar geleden
Berichten: 8
Topic starter  

Beste Hans,

Wat een topper zeg, ik worstelde hier al een tijdje mee maar dit gaat werken. Nu heb ik de letters zelf even niet aangesloten (aan afwerken, verven ect) dus heb ik het voor nu als test even op een mini printje gedaan en het werkt perfect!!! Wat ik nu handmatig kan doen is de code kleurLetter(letterS_start, letterS_eind, 255, 0, 0); ect aanpassen en ik zie dat ze dan per letter veranderen van kleur. Dit is de code die nu ingeladen is:

#include <Adafruit_NeoPixel.h>

#define PIN 6

#define NUM_LEDS 15

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_RGB + NEO_KHZ800);

#define letterS_start 0

#define letterS_eind 5

#define letterT_start 6

#define letterT_eind 10

#define letterA_start 11

#define letterA_eind 14

#define letterR_start 15

#define letterR_eind 16

void setup() {

  strip.begin();

  strip.show(); // Initialize all pixels to ‘off’

  strip.setBrightness(20);

}

void loop() {

  kleurLetter(letterS_start, letterS_eind, 255, 0, 0);

  kleurLetter(letterT_start, letterT_eind, 255, 255, 255);

  kleurLetter(letterA_start, letterA_eind, 0, 0, 255);

  kleurLetter(letterR_start, letterR_eind, 255, 0, 0);

}

void kleurLetter(int start, int eind, byte rood, byte groen, byte blauw) {

  for (int c = start; c <= eind ; c++) {

    strip.setPixelColor(c, rood, groen, blauw);

  }

  strip.show();

}

(krijg de code niet echt binnen de code venster)

Nu is de vraag, is het zo correct ingeklopt? En de volgende stap…. een effect eraan toevoegen, nu lijkt mij dit aardig moeilijk maar bijvoorbeeld net als op de kermis, het woord per letter vullen of om en om van kleur verwisselen, ik noem maar wat hoor, misschien ga ik wel te snel vooruit. Maar ik ben u al fan!!! Donatie gaat zeker richting Tweaking4All.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Hoi Marco,

blij om te horen dat ik kon helpen en een donatie is zeer gewaardeerd (maar niet vereist natuurlijk).

Jouw code ziet er correct uit! Goed gedaan! 

Om nu effecten toe te voegen, kunnen we 2 kanten op gaan;

1) Elke letter gedraagt zich als een "LED", dus heeft de hele letter altijd 1 kleur voor alle LEDs in de letter, of
2) Elke letter heeft zijn eigen effect, dus b.v. een kleur die veranderd vanuit het midden van de letter naar de buiten kant.

De eerste optie is relatief eenvoudig omdat we steeds wisselend 

kleurLetter(letterS_start, letterS_eind, 255, 0, 0);

kunnen aanroepen.
B.v. (kleuren willekeurig gekozen):

kleurLetter(letterS_start, letterS_eind, 255, 0, 0);
Delay(100);
kleurLetter(letterS_start, letterS_eind, 255, 255, 255);
Delay(100);
kleurLetter(letterS_start, letterS_eind, 0, 0, 255);
Delay(100);

Je kunt, als je dit zoekt, daarna zelf effecten gaan bedenken, en zelfs loops gaan gebruiken voor herhaling.
b.v.

for(int i=0; i<256; i++) {
  kleurLetter(letterS_start, letterS_eind, i, 0, 0);
}

Uiteraard te combineren met meerdere letters zoals

for(int i=0; i<256; i++) {
  kleurLetter(letterS_start, letterS_eind, i, 0, 0);
  kleurLetter(letterT_start, letterT_eind, 0, i, 0);
  kleurLetter(letterA_start, letterA_eind, 0, 0, i);
  kleurLetter(letterR_start, letterR_eind, i, i, i);
}

De tweede optie is aanzienlijk lastiger omdat we dingen in parallel moeten gaan doen. Namelijke elke stap in een effect moet worden toegepast op elke letter.


   
BeantwoordenCiteren
(@marcohaller)
Active Member
Deelgenomen: 7 jaar geleden
Berichten: 8
Topic starter  

Beste Hans,

Ik wor hier wel zo blij van haha, echt het werkt perfect, dank je wel voor de uitleg. 

Nu wil ik nog een stapje verder gaan, hieronder zie je de code die ik nu gebruik om in dit geval geval, de letters een kleurtje te geven en daarna alles 1 kleur, en mag hij dan 3 keer doen, nu kan ik dit 3 keer (copy paste) neerzetten zoals hieronder maar ik denk dat het niet nodig zou hoeven te zijn. 

Waarom 3 keer zou je je afvragen terwijl hij in een loop zit?

Nou, uit je "Alle ledstrip effecten in 1" document/uitleg, die ik ook geprobeerd heb en ook super werkt, zie ik dat deze in verschillende case's werken, 1 daarvan heb ik vervangen voor de code hieronder, deze doet hij ook 3 keer, en na 3 keer mag hij door naar het volgende effect/case.

Kan ik deze code verkleinen en vervolgens in een case stoppen met een run van 3x? Verkleinen omdat ik waarschijnlijk nog wel wat effecten wil gaan proberen en maken, want de code hieronder is al groot en stelt relatief nog weinig voor. 

Nogmaals dank en doneren komt goed hoor haha, voor wat hoort wat. Je help me al zo op weg, op andere forums gaat het behoorlijk stroef. Zal binnenkort proberen om een filmpje te maken, dan heb je een idee hoe het word.

De Code:

    case 3 : 

{ // HalloweenEyes - Vervangen door eigen effect

  kleurLetter(letterS_start, letterS_eind, 255, 0, 0);

  kleurLetter(letterT_start, letterT_eind, 255, 255, 255);

  kleurLetter(letterA_start, letterA_eind, 0, 0, 255);

  kleurLetter(letterR_start, letterR_eind, 255, 0, 0);

  kleurLetter(letterRR_start, letterRR_eind, 255, 255, 255);

  kleurLetter(letterO_start, letterO_eind, 0, 0, 255);

  kleurLetter(letterC_start, letterC_eind, 255, 0, 0);

  kleurLetter(letterK_start, letterK_eind, 255, 255, 255);

  kleurLetter(letterE_start, letterE_eind, 0, 0, 255);

  kleurLetter(letterS_start, letterS_eind, 255, 0, 0);

  delay(500);

  kleurLetter(letterAL_start, letterAL_eind, 0, 255, 0);

  delay(500);

   kleurLetter(letterS_start, letterS_eind, 255, 0, 0);

  kleurLetter(letterT_start, letterT_eind, 255, 255, 255);

  kleurLetter(letterA_start, letterA_eind, 0, 0, 255);

  kleurLetter(letterR_start, letterR_eind, 255, 0, 0);

  kleurLetter(letterRR_start, letterRR_eind, 255, 255, 255);

  kleurLetter(letterO_start, letterO_eind, 0, 0, 255);

  kleurLetter(letterC_start, letterC_eind, 255, 0, 0);

  kleurLetter(letterK_start, letterK_eind, 255, 255, 255);

  kleurLetter(letterE_start, letterE_eind, 0, 0, 255);

  kleurLetter(letterS_start, letterS_eind, 255, 0, 0);

  delay(500);

  kleurLetter(letterAL_start, letterAL_eind, 0, 255, 0);

  delay(500);

   kleurLetter(letterS_start, letterS_eind, 255, 0, 0);

  kleurLetter(letterT_start, letterT_eind, 255, 255, 255);

  kleurLetter(letterA_start, letterA_eind, 0, 0, 255);

  kleurLetter(letterR_start, letterR_eind, 255, 0, 0);

  kleurLetter(letterRR_start, letterRR_eind, 255, 255, 255);

  kleurLetter(letterO_start, letterO_eind, 0, 0, 255);

  kleurLetter(letterC_start, letterC_eind, 255, 0, 0);

  kleurLetter(letterK_start, letterK_eind, 255, 255, 255);

  kleurLetter(letterE_start, letterE_eind, 0, 0, 255);

  kleurLetter(letterS_start, letterS_eind, 255, 0, 0);

  delay(500);

  kleurLetter(letterAL_start, letterAL_eind, 0, 255, 0);

  delay(500);

                break;

              }


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Hoi Marco,

mooi om jouw enthousiasme te horen! 
Daar geniet ik ook van, dus geen moeite om een handje te helpen!

Je kunt jouw code inderdaad wat efficiënter doen door een loop in de case te zetten:

case 3 : 
{ // HalloweenEyes – Vervangen door eigen effect for(int counter; counter<3; counter++) {
  kleurLetter(letterS_start, letterS_eind, 255, 0, 0);
  kleurLetter(letterT_start, letterT_eind, 255, 255, 255);
  kleurLetter(letterA_start, letterA_eind, 0, 0, 255);
  kleurLetter(letterR_start, letterR_eind, 255, 0, 0);
  kleurLetter(letterRR_start, letterRR_eind, 255, 255, 255);
  kleurLetter(letterO_start, letterO_eind, 0, 0, 255);
  kleurLetter(letterC_start, letterC_eind, 255, 0, 0);
  kleurLetter(letterK_start, letterK_eind, 255, 255, 255);
  kleurLetter(letterE_start, letterE_eind, 0, 0, 255);
  kleurLetter(letterS_start, letterS_eind, 255, 0, 0);
  delay(500);
  kleurLetter(letterAL_start, letterAL_eind, 0, 255, 0);
  delay(500); }
    break;
  }

De "counter" telt nu: 0, 1 ,2 (dus 3 keer door de loop) en herhaald de stappen.

Zodra ik weer van vakantie terug ben wil ik eens kijken wat we hier nog meer mee kunnen doen. Maar de huidige aanpak leek me het eenvoudigste om het leesbaar te houden ... 
Ben benieuwd naar de video, als je er aan toekomt, en vooral hoe de andere effecten er uitzien met de letter. 


   
BeantwoordenCiteren
(@marcohaller)
Active Member
Deelgenomen: 7 jaar geleden
Berichten: 8
Topic starter  

Helemaal super Hans, inmiddels ben ik aardig aan het programmeren geslagen en de letters lopen nu een voor een vol, in verschillende kleuren, snelheden, links om rechts om en met diversen effecten. Dit gaat helemaal goed.

Toch nog weer even een vraagje, nu zijn de letter gedefinieerd door 

#define letterB_start 0

#define letterB_eind 10

ect ect maar nu wil een lijn van boven naar beneden laten lopen in een bepaalde kleur, hoe krijg ik het zo dat bijvoorbeeld bepaalde leds gaan branden, dus niet in volgorde zoals hierboven van 0 t/m 10 maar bijvoorbeeld led 1 4 7 11 en 23.

Ergens op een forum zag ik dit staan: 

// Array of pixels in order of animation - 70 in total:

int sine[] = {

   4, 3, 2, 1, 0, 15, 14, 13, 12, 20, 21, 22, 23, 24, 25, 26, 27, 28,

  36, 35, 34, 33, 32, 47, 46, 45, 44, 52, 53, 54, 55, 56, 57, 58, 59, 60,

  61, 62, 63, 48, 49, 50};

Kan dat zo gemaakt worden dat bijvoorbeeld het volgende, net als de letters eruit komt te zien:

#define lineEen 1 4 7 11 23

#define lineTwee 2 4 6 12 14 ect ect

Ben er zelf mee aan het stoeien gegaan maar ik krijg het helaas niet voor elkaar. Hoop dat je begrijp wat ik bedoel.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Hoi Marco!

mooi om te horen dat je er lol in begint te krijgen! 

Wat de #define betreft; je kunt maar 1 "waarde" aan 1 "variabele" toewijzen, dus jouw voorbeeld

#define lineEen 1 4 7 11 23
#define lineTwee 2 4 6 12 14 

werkt dus niet. Wat wel kan (niet zeker hoe handig dit gaat zijn):

#define lineEen1 1 
#define lineEen2 4
#define lineEen3 7
#define lineEen4 11
#define lineEen5 23
#define lineTwee1 2
#define lineTwee2 4  
#define lineTwee3 6
#define lineTwee4 12
#define lineTwee5 14 

of met een array:

int lineEen[] = {1, 4, 7, 11, 23};
int lineTwee[] = {2, 4, 6, 12, 14};

en dan aanroepen met

lineEen[0], 
lineEen[1], 
..., 
lineEen[4],
lineTwee[0], lineTwee[1], ..., lineTwee[4]

Hopelijk helpt dit een beetje op weg ...


   
BeantwoordenCiteren
(@marcohaller)
Active Member
Deelgenomen: 7 jaar geleden
Berichten: 8
Topic starter  

Oke, met array lijkt mij de beste optie, zo selecteer je de leds maar aanroepen wil niet erg.

Heb nu dit staan:

int lineEen[] = {1, 3, 5, 7};

int lineTwee[] = {2, 4, 6, 12, 14};

En roep het aan met:

kleurLetter(lineEen[0], lineEen[1], blue);

delay(100);

kleurLetter(lineTwee[0], lineTwee[1], red);

delay(100);

 strip.show();

Wat er nu gebeurd is dan de leds1 (blue) en led4 (red) aan blijven, led2 en led3 knipperen om en om blue naar red.

Onderin staat deze code nog, wellicht gooit deze roet in het eten?

void kleurLetter(int start, int eind, byte rood, byte groen, byte blauw) {

  for (int c = start; c <= eind ; c++) {

    strip.setPixelColor(c, rood, groen, blauw);

  }

  strip.show();


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Ik begrijp niet precies wat er fout gaat, het is nog vroeg in de morgen hier (zit in de VS). 

Maar wat ik wel zie is dat we misschien een tel foutje gemaakt hebben.
De LEDs beginnen te tellen bij "0", terwijl wij in onze laatste 2 berichten "1" hebben gebruikt.

Dus:

int lineEen[] = {1, 3, 5, 7};
int lineTwee[] = {2, 4, 6, 12, 14};

Zou misschien het volgende moeten zijn:

int lineEen[] = {0, 2, 4, 6};
int lineTwee[] = {1, 3, 5, 11, 13};

(de 1e LED is "0", 2e LED is "1", etc - dus alle waarden minus 1)

Maar zoals gezegd; ik ben nog niet helemaal wakker en het sinus verhaal verward me even een beetje.
Ik ga even meer koffie zoeken 


   
BeantwoordenCiteren
(@marcohaller)
Active Member
Deelgenomen: 7 jaar geleden
Berichten: 8
Topic starter  

Beste Hans,

Dank je wel voor de support tot nu toe, was zelf ook druk om de letter om te bouwen voor mijn andere attractie Break Dance, hier het resultaat: https://www.youtube.com/watch?v=BhzS9ZntDqQ

De bedoeling is eigenlijk om de letters van boven naar beneden ook een draai of effect te geven maar komt wellicht in later stadium wel, tot nu toe hebben we dit al bereikt en ben ik enorm blij mee met je support hiervan.

Maar bouw en programmeer door, misschien kun je me nog beetje helpen, rondom deze attractie zitten 20 strips met op elke strip 6 x een ws2812 neopixel led. uittellend 120 leds, startende met led 0, wil eigenlijk elke strip het zelfde laat doen, dus als led 0 blauw is, moet led 6 ook blauw zijn, en ok led 12 ect ect, led1 geel? dan ook led 7 geel ect kortom alle strips van 6 leds moeten hetzelfde doen. is hier een hand trucje voor? ps kan je pm sturen met reknummer, dan doneer ik, ben zelf geen lid van doneer links, anders doe ik het alsnog. nogmaals super dank en nog plezier in de VS geniet ervan.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Hoi Marco,

dat ziet er gaaf uit! Mooi gedaan!!! 

Als ik jouw vraag goed begrijp heb je dus 6 strips van 20 LEDs die je hetzelfde wilt laten doen?
In dat geval: de strips parallel aansluiten. Dus elk van de 6 strips los knippen, dan alle 6 op +5V, GND, en Din aansluiten.
De strips geven dat alle 6 hetzelfde patroon weer.

Is dat wat je in gedachten hebt?

Wat donatie betreft; vermeld mijn website, en dan ben ik al blij 


   
BeantwoordenCiteren
(@marcohaller)
Active Member
Deelgenomen: 7 jaar geleden
Berichten: 8
Topic starter  

Hey Hans,

Bijna, het zijn 20 strips met daarop 6 leds, echter kan ik ze, wegens modelbouw en aansloten niet meer apart een Din van maken :-( ze moeten ook wel, (wegens bedradingen en aansluitingen) in een serie staan ipv paralel door zetten.


   
BeantwoordenCiteren
(@marcohaller)
Active Member
Deelgenomen: 7 jaar geleden
Berichten: 8
Topic starter  

Beste Hans,

Het is me gelukt door extra bedrading op de dIN te zetten, dit gaat lukken.

Zou je mij een prive bericht willen sturen? ivm donatie want ik kom ergens niet uit.

Gr Marco


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
 

Hoi Marco,

Goed om te horen!! 

Je kunt een reply doen naar de [deze] notificatie email 


   
BeantwoordenCiteren
Pagina 1 / 2
Deel: