BeneluxSpoor.net forum

Vraag en antwoord => Digitaal => Topic gestart door: tuurtje op 31 March 2018, 17:42:50

Titel: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: tuurtje op 31 March 2018, 17:42:50
Goedemiddag,

Ik hoop dat iemand mij de goede kant op kan sturen.

Ben bezig met de Faller Frei Fall Turm en helemaal boven in een Neo Pixel ring met 24 leds geplaatst.
En dan moet het toch simpel zijn om deze via Arduino Uno aan te sturen.
Klopt, knippert, draait, maar het gaat niet vloeiend, kleuren verspringen.

Wat ik op Internet las is dat de strandtest moet werken

#include <Adafruit_NeoPixel.h>

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(160, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(30); //adjust brightness here
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  rainbow(20);
  rainbowCycle(20);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

Bij voorbaat mijn dank

Groetjes

Arthur
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: spock op 31 March 2018, 19:08:38
Hallo tuurtje,

Ik zou eerst de programmatuur (en methodiek) veranderen zodat er geen gebruik meer gemaakt wordt van de functie delay();
Mijn streven met Arduino progammeren is dat de loop() meer dan 100 keer per seconde wordt doorlopen.
Om de methodiek zonder gebruik te maken van delay() te begrijpen, is het raadzaam om de voorbeeld programma's blink.ino en BlinkWithoutDelay.ino (in de Voorbeeld\02.Digital folder)) door te nemen en te begrijpen voordat je echt iets met Arduino gaat programmeren.

mvg spock

 
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: Timo op 31 March 2018, 20:29:02
Strandtest? ???

Maar ben het met Spock eens, hoofdstuk twee, na hoofdstuk één "Blink, van alle Arduino boeken zou moeten heten "En nu nooit meer delay() gebruiken". ;D Maar goed, aangezien deze code alleen maar de Neopixels stuurt zou het wel prima er uit moeten zien. Met onderstaande code is dat dus niet? Kan je ander een filmpje plaatsen?

En nog paar tips:

Spaties zijn gratis
for(j=0; j<256*5; j++)
//en
for(j = 0; j < (256 * 5); j++)
doen hetzelfde maar ik weet wel welke ik duidelijker vind. :angel:

#define PIN 6C++ kent de mooiere en veiligere (oa betere foutmeldingen) alternatief van const:
const byte NeoPixelPin = 6;
Elke inspring is twee spaties (of in ieder geval gelijk). In de Wheel functie is de eerste inspring twee spaties maar de tweede maar drie.

En probeer een standaard stijl voor variabele namen en functie namen te hebben. Je mag zelf bepalen wat maar het maakt het niet makkelijker als je de ene keer functieVoorA() gebruikt en de andere keer FunctieVoorB(). "Standaard" binnen Arduino is ditVoorVariabeleOfFuncties (camelCase), ConstVariableEnClassesZo (UpperCamelCase) en ALL_CAPS_MET_UNDERSCORE for macro's.

En zelf vind ik FastLed (https://github.com/FastLED/FastLED) een vele malen mooiere library for NeoPixels dan die van AdaFruit.


Timo
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: tuurtje op 31 March 2018, 21:55:44
Thanks voor jullie reactie's  (y)

Ik heb dit niet zelf geschreven hoor, maar komt van de site van Adafruit af

https://github.com/adafruit/Adafruit_NeoPixel (https://github.com/adafruit/Adafruit_NeoPixel)

Dat regels in software altijd beter kunnen snap ik, wat ik niet snap is het onregelmatige oplichten van sommige leds.

Groetjes

Arthur
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: 72sonett op 31 March 2018, 22:01:12
Citaat van: Timo
...
for (j = 0; j < (256 * 5); j++)doen hetzelfde maar ik weet wel welke ik duidelijker vindt.
In de FOR voorwaarde moet je ook geen berekening uitvoeren, nu wordt het sommetje 256*5 iedere keer weer uitgevoerd om de test te doen terwijl het gewoon een constante is. Alleen een slimme compiler 'ziet' dat en vult de waarde 1280 in.
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: Timo op 31 March 2018, 22:06:26
@72sonett, waar kwam die t vandaan ??? Zat zeker in me whisky :angel:

Maar alle hedendaagse compilers zijn slim genoeg om een berekening van constanten te vervangen tijdens compiler time. En juist het uitschrijven kan je code verduidelijken.

@tuurtje, zoals ik zei, kan je een filmpje plaatsen?


Timo
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: 72sonett op 31 March 2018, 22:29:53
Citaat van: Timo
... waar kwam die t vandaan ??? Zat zeker in me whisky
Als ik af moet gaan op jouw reacties dan drink je t veel whisky...   8)
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: tuurtje op 31 March 2018, 22:48:52
Timo,

Ik hoop dat dit een impressie geeft

https://youtu.be/SOgCrZrW6-k (https://youtu.be/SOgCrZrW6-k)

Groetjes

Arthur
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: Reinout van Rees op 31 March 2018, 23:10:07
Oh gruwel! Er staat toch wel een preisertje met een snijbrander onderaan die toren de poten door te zagen???

"Frei fall Turm" klinkt als een attractie waar het wel bij past :) Netjes uitgevoerd zo!

Reinout
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: spock op 01 April 2018, 13:20:12
Hoi Arthur,

Nog even naar de code gekeken.

Wat ik niet begrijp is de volgende regel:

// Parameter 1 = number of pixels in strip
..
Adafruit_NeoPixel strip = Adafruit_NeoPixel(160, PIN, NEO_GRB + NEO_KHZ800);

En dan met name het getal 160. In de header staat dat je een 24 pixel ring gebruikt.
Probeer eens 24 ipv 160 in de definitie regel.

mvg spock
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: Timo op 01 April 2018, 13:38:17
Dat is inderdaad wel heftig. 1e parameter zou inderdaad aantal liedjes moeten zijn maar meer dan niet kloppende animaties zou het niet tot gevolg mogen hebben.

Ik zit toch eerder aan iets elektrisch te denken. Hoe ver weg is de Arduino? Hoe dik zijn de voedingsdraden? En heb je netjes een weerstand tussen de Arduino en de ring?


Timo
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: tuurtje op 01 April 2018, 16:26:05
Beste Spock en Timo,

Een oud spreekwoord zegt, krijg nou t**tten  ::)

Ik heb niets aan de sketch veranderd, vanmorgen was nog steeds hetzelfde beeld, net even na een tuincentrum geweest want dat hoort op 1e Paasdag  ;D
Zet net de boel weer aan en het loopt vloeiend.

Getver de getver, hier kan ik dus niet tegen, als iets niet werkt ok, maar niet weten waarom iets niet werkt.

Om toch even de vragen van Timo te beantwoorden.

De Arduino is ca 75 cm verwijderd van de ring, de draad dikte is 0,14 qmm, maar ook met meetsnoeren was het precies hetzelfde.
En de weerstand zit er tussen

In ieder geval wil ik jullie bedanken voor het meedenken  (y)

Groetjes

Arthur
Titel: Re: Neo Pixel ring (24 leds) aansturen met arduino
Bericht door: Timo op 02 April 2018, 10:47:13
Als het nu opeens wel werkt kan je de code echt wel uitsluiten. :) Klinkt als ouderwetse interferentie.

75cm is best lang voor de gevoelige Neopixels. En 0,14mm2 best dun. 24 Neopixels hebben een piek vermogen van bijna 1,5A ;) Kan je de Arduino dus ook niet laten voeden als je de Arduino niet met 5V voedt (dus 7-12V via de jack). Ik had voor GND en Vcc dus iets dikkers gepakt. Maar gemiddeld genomen zal het wel meevallen en kan je waarschijnlijk wel uit met de 0,142 maar zou ik toch wat maatregelen nemen. Zo zou ik de data en de GND lijn twisten om ze dicht bij elkaar te houden. Ook zou ik iets van 100uF direct naast de ring plaatsen. Als het goed is heeft iedere pixel al 100nF. Samen zou de spanning bij de ring wat stabieler moeten worden en door de draden te twisten minder storing op pikken.


Timo