Steuerung von NeoPixel-LEDs mit einem Servo-Entwicklungsboard

Das Simply Servos Board von Kitronik (Abbildung 1) löst das Problem der Bereitstellung einer angemessenen Spannungsversorgung von 3 V bis 12 V bei der Nutzung mehrerer Servos in einem Projekt. Die integrierte 3-V-Leistungsregelung und die Stiftleisten bieten eine Möglichkeit, zum Betrieb der Servos schnell ein Pico von Raspberry Pi hinzuzufügen. Aber was ist mit anderen Komponenten mit drei Anschlussdrähten, die eine Versorgungsspannung von 5 V benötigen und viel Strom brauchen können? Wie die LED-Leisten NeoPixel von Adafruit.

Abbildung 1: Das Simply Servos Board von Kitronik. (Bildquelle: Kitronik)

Vor kurzem hatte ich die Idee, aus einem meiner ferngesteuerten Kampfflugzeuge einen Nachtflieger zu machen. Ich könnte so ziemlich jeden Mikrocontroller einbauen und eine Möglichkeit finden, die NeoPixel-Leisten mit einer Spannungsversorgung zu verbinden, aber erlauben Servozuleitungen vielleicht eine schnellere Integration und eine einfachere Wartung? Das Simply Servos Board ist nicht nur für Servos gedacht. Mit der Entscheidung für diese Plattform konnte das Projekt rationalisiert werden und viele angepasste Drähte und Steckverbinder sind entfallen.

Die Details zur Flugzeugplattform und ein unterhaltsames Video über den Umbau des Kampfflugzeugs finden Sie in den Blog- und Videolinks am Ende dieses Beitrags. Mit der Arduino-IDE ließ sich das Pico so programmieren, dass die NeoPixel-Leisten per Fernsteuerbefehl betrieben werden konnten. Geplant war eine Marquee-Funktion an den Seiten des Flugzeugrumpfs, deren Frequenz an den Schub gekoppelt ist. Mit zunehmender Dunkelheit können die NeoPixel-Leisten aufgrund der hohen Helligkeit unangenehm für die Augen sein. Ein Hilfskanal dient zum Dimmen der LEDs. Außerdem würden Landescheinwerfer bei der Landung des Flugzeugs im Dunklen helfen. Anstatt eines weiteren Kanals leuchten die NeoPixel-Leisten an der Unterseite hellweiß, wenn der Schub Landegeschwindigkeit erreicht oder unter diese fällt. Ich habe eine Grundprogrammierung verwendet, die Raum für Verbesserungen oder zusätzliche Funktionen lässt.

KopierenArduino IDE Code:

//Rx throttle as LED speed control. Rx Aux 2 as dimmer. Channels 1 and 2 as inputs on Simply Servos.
//Remaining servo ports on board (channels 3-8, pins 4-9) used as NeoPixel outputs.
#include <neopixelconnect.h>

//Number of NeoPixels in each string
#define FIN_LEN 34  //Number of NeoPixels on each fin
#define BOT_LEN 28  //Number of NeoPixels on each bottom skid
#define AUX_LEN 61  //Number of NeoPixels on each auxiliary location
#define THRESH 60   //Landing versus flight throttle threshold

//Rx channel Pico GPIO inputs
#define THROT 2
#define AUX2 3

// Create an instance of NeoPixelConnect and initialize it for each strand of NeoPixels
// (pin, number of pixels in string, programmable IO location (0 or 1), programmable IO state machine usage (0-3))
NeoPixelConnect R_Aux(4, AUX_LEN, pio0, 0);
NeoPixelConnect L_Aux(5, AUX_LEN, pio1, 0);
NeoPixelConnect R_Bot(6, BOT_LEN, pio0, 1);
NeoPixelConnect L_Bot(7, BOT_LEN, pio1, 1);
NeoPixelConnect R_Fin(8, FIN_LEN, pio0, 2);
NeoPixelConnect L_Fin(9, FIN_LEN, pio1, 2);

uint8_t AuxSingLED;  //Single LED variable on auxiliary string

//Function - Get intensity level from Rx Aux2 output
uint8_t get_pixel_intensity() {
  return map(pulseIn(AUX2, HIGH), 900, 2200, 0, 255);
}

//Function - Get speed level from Rx Throttle output
uint8_t get_pixel_speed() {
  return map(pulseIn(THROT, HIGH), 990, 1902, 100, 0);
}

void setup() {
  pinMode(THROT, INPUT);  //Set Pico GPIO pin 2 as input
  pinMode(AUX2, INPUT);   //Set Pico GPIO pin 3 as input
}

void loop() {
  uint8_t LEDInten = get_pixel_intensity();  //Get NeoPixel intensity value
  uint8_t LEDSpeed = get_pixel_speed();      //Get NeoPixel speed value
  if (LEDSpeed < 10) LEDSpeed = 0;           //Dampen lower speed limit

  if (LEDSpeed < THRESH) {                                   //Throttle high color
    R_Bot.neoPixelFill(LEDInten, 0, 0, true);                //Fill string with red
    L_Bot.neoPixelFill(LEDInten, 0, 0, true);                //Fill string with red
  } else {                                                   //Throttle low color
    R_Bot.neoPixelFill(LEDInten, LEDInten, LEDInten, true);  //Fill string with white
    L_Bot.neoPixelFill(LEDInten, LEDInten, LEDInten, true);  //Fill string with white
  }

  R_Fin.neoPixelFill(0, LEDInten, 0, true);  //Fill string with green
  L_Fin.neoPixelFill(0, LEDInten, 0, true);  //Fill string with green

  R_Aux.neoPixelFill(0, 0, LEDInten, false);                           //Fill string with blue
  R_Aux.neoPixelSetValue(AuxSingLED, LEDInten, 0, 0, false);           //Set a NeoPixel to red
  R_Aux.neoPixelSetValue(AuxSingLED - 1, LEDInten / 10, 0, 0, false);  //Set trailing NeoPixel to dimmed red
  R_Aux.neoPixelSetValue(AuxSingLED + 1, LEDInten / 10, 0, 0, true);   //Set leading NeoPixel to dimmed red
  L_Aux.neoPixelFill(0, 0, LEDInten, false);                           //Fill string with blue
  L_Aux.neoPixelSetValue(AuxSingLED, LEDInten, 0, 0, false);           //Set a NeoPixel to red
  L_Aux.neoPixelSetValue(AuxSingLED - 1, LEDInten / 10, 0, 0, false);  //Set trailing NeoPixel to dimmed red
  L_Aux.neoPixelSetValue(AuxSingLED + 1, LEDInten / 10, 0, 0, true);   //Set leading NeoPixel to dimmed red

  AuxSingLED = AuxSingLED + 3;                //Marquis - move R_Aux and L_Aux red LEDs along NeoPixel string 3 pixels at a time.
  if (AuxSingLED >= AUX_LEN) AuxSingLED = 0;  //If at end of string, return to start.

  delay(LEDSpeed);  //Set how long to delay code execution cycle depending upon throttle level.
}

Arduino IDE Code END:
</neopixelconnect.h>

Listing 1: Mit Arduino-IDE erstellter Code zur Steuerung der NeoPixel-Leisten.

Das gesamte Programm profitiert vom Wegfall jeglicher Verzögerungsfunktionen und der Betrieb der LEDs kann durch die Manipulation des Schubeingangswertes oder Zuordnung der Eingangswerte beschleunigt werden. Die verbleibenden Leisten lassen sich auf ein beliebiges Muster in den gewünschten Farben programmieren. Dabei gilt es lediglich zu bedenken, dass für die korrekte Fernsteuerung des Flugzeugs bei Nacht ein Lichtmuster genutzt wird, an dem sich die Ausrichtung und der Kurs des Flugzeugs erkennen lassen. Der Nachtflug macht Spaß, ist gleichzeitig jedoch eine Herausforderung. Üben Sie das Fliegen im Dunklen am frühen Abend, wenn Sie das Flugzeug und seine LEDs noch sehen können.

Zusätzliche Ressourcen:

Video: Explore R/C Night Flying with NeoPixel LEDs (Ferngesteuertes Flugzeug mit NeoPixel-LEDs nachts fliegen lassen)

Blog: Wie man eine kostengünstige RC-Kampfdrohne baut

Über den Autor

Image of Don Johanneck

Don Johanneck, Technical Content Developer bei DigiKey, arbeitet seit 2014 für das Unternehmen. Seit dem Wechsel in seine aktuelle Position ist er für das Verfassen von Beschreibungen zu Videos und Produkten verantwortlich. Er hat seinen Abschluss als Associate of Applied Science im Bereich Elektronik und automatisierte Systeme vom Northland Community & Technical College im Rahmen des DigiKey-Stipendienprogramms erworben. Er genießt die Modellierung von Funksteuerungen, die Restaurierung von alten Maschinen und das Basteln.

More posts by Don Johanneck
 TechForum

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.

Visit TechForum