• Hallo Zusammen, Aufgrund der aktuellen Situation setzten wir die Möglichkeit aus, sich mit Gmail zu registrieren. Wir bitten um Verständnis Das RCMP Team

Anleitung Atmega328p nano v3 Multicopterbeleuchtung

micha86

Mitglied
Hallo erstmal,
ich weiß es gibt schon diverse Controller für die Multikopter LED Steuerung, aber ich wollte dafür einfach was eigenes schreiben, schon alleine weil ich dann bezüglich der Modi's flexibler bin.

Gekauft hab ich mir dazu:
Nano V3.0 ATmega328P-AU MCU, Arduino kompatibel, USB CH340G
WS2912B LED Strips 60LEDs/m
0,25mm² Litzen in rot, schwarz und gelb
Hobbywing 3A 5V/6V BEC UBEC Eingangsspannung 5.5-26 Volt, 2-6 S Lipo SBEC Akku
Schrumpfschlauch - viel Schrumpfschläuche

Gut da ich in Sachen Microprozessoren noch ein kompletter Anfänger bin da ich aus der Webentwicklung komme, war das ganze für mich erstmal extremes Fachchinesisch. Was man allerdings schon von Anfang an lernt, ist, Copy -> Paste.

Hierfür hab ich einen guten und schön Dokumentierten Code gefunden. Das Projekt wurde von den Entwicklern eingestampft und steht nun auf Github zur Verfügung -> hier

Ganz extrem werde ich jetzt hier nicht drauf eingehen da eine gewissen Grundkenntnis einfach Voraussetzung ist und man diese sich erstmal dank Google aneignen sollte.

Dann fangen wir mal an:

1. LED Streifen auf die gewünschte länge Kürzen und die Kabel richtig anlöten ( WICHTIG: richtig anlöten :) mein erste Microprozessor hatte dadurch nur eine Laufzeit von ca 1 Minute ;) )
Ich hab das ganze verlötet und dann mit Schrumpfschlauch überzogen wie man auf dem Bild erkennen kann. Ist jetzt schon im eingebautem Zustand.

IMG_20170305_194513[1].jpgIMG_20170305_195025[1].jpg

2. Alle LED Streifen miteinander verlöten damit sie einen Strang ergeben
WICHTIG: Es gibt eine Richtung in die Ihr diese verbinden müsst.
siehe Bild

3. Die Verkabelung zur Platine.
Hier müssen wir jetzt beachten das wir einmal 5v vom UBEC an die Platine geben aber auch genauso die 5v vom UBEC an den ersten LED streifen weitergeben. Das ganze schleusen wir aber nicht durch die Platine sondern nehmen die 5v für die LED streifen auch vom UBEC.

Masse gehen wir einmal vom UBEC auf GND der Platine. Genauso nehmen wir die Masse der LED Streifen und gehen damit auch auf GND von der Platine.

Jetzt nehmen wir noch das (bei mir gelbe Kabel) Datenkabel von den LED streifen und gehen mit diesem auf den PIN D6.

Das wäre schon die vollständige Verkabelung für die einfache Beleuchtung.

IMG_20170305_200248[1].jpgIMG_20170305_200307[1].jpg

Jetzt die Programmierung des ganzen.

Vorweg:
zum Entwickeln hab ich die 5v vom UBEC zur Platine abgezogen und nur die Masse verbunden, da der Microprozessor, wenn er über den Computer verbunden ist, über den USB Anschluss strom bekommt.

Zu erst laden wir uns mal Arduino runter. Für mich hat es soweit alles bereitgestellt was ich zum Programmieren brauche.
Danach holen wir uns die Library von Adafruit_NeoPixel.
Diese kann man sich als .ZIP downloaden (hier)
Jetzt wird die gedownloadete Library als .ZIP eingebunden. Über Sketch -> Bibliothek einbinden -> .ZIP Bibliothek einbinden. Den Pfad auswählen wo ihr die Library gespeichert hab und einfach die .ZIP Datei auswählen.
Danach gehen wir auf Werkzeugen und stellen ein welchen Microprozessor wir nutzen wollen.
Bei "Board" wählen wir "Arduino Nano" aus.
Bei "Prozessor" wählen wir natürlich "ATmega328"
Und bei Port müsst ihr schauen welcher COM Port bei euch genutzt wird. Könnt ihr über den Gerätemanager rausfinden.

Das waren auch schon erstmal die Grundeinstellung.

Code:
#include <Adafruit_NeoPixel.h>

#define LEDOUT 6
#define NUMPIXELS 24

#define WHITE 255,255,255
#define RED 255,0,0
#define GREEN 0,255,0
#define BLACK 0,0,0
#define BRIGHTNESSHIGH 255
#define BRIGHTNESSLOW 20

Adafruit_NeoPixel stripe = Adafruit_NeoPixel(NUMPIXELS, LEDOUT, NEO_GRB + NEO_KHZ800);

int delayBig = 1200;
int delaySmall = 180;
int delayXSmall = 30;

void setup() {
  pinMode(LEDOUT, OUTPUT);
  stripe.begin();
  setColors(20);
}

void loop() {
  paintBasicMode();
}

void paintBasicMode() {
  setColors(BRIGHTNESSHIGH);
  delay(delaySmall);
  setColors(BRIGHTNESSLOW);
  delay(delaySmall);
  setColors(BRIGHTNESSHIGH);
  delay(delaySmall);
  setColors(BRIGHTNESSLOW);
  delay(delayBig);
  setStrobo(BRIGHTNESSHIGH);
  delay(delayXSmall);
  setStrobo(BRIGHTNESSLOW);
  delay(delayXSmall);
  setStrobo(BRIGHTNESSHIGH);
  delay(delayXSmall);
  setColors(BRIGHTNESSLOW);
  delay(delayBig);
}

void setColors(int brightness) {
  for(int i=0;i<NUMPIXELS;i++){
    if(i < 12) {
      setPixelColor(i, GREEN, brightness);
    } else {
      setPixelColor(i, RED , brightness);
    }
  }
  stripe.show();
}

void setStrobo(int brightness) {
  setPixelColor(2, WHITE, brightness);
  setPixelColor(3, WHITE, brightness);
  setPixelColor(8, WHITE, brightness);
  setPixelColor(9, WHITE, brightness);
  setPixelColor(14, WHITE, brightness);
  setPixelColor(15, WHITE, brightness);
  setPixelColor(20, WHITE, brightness);
  setPixelColor(21, WHITE, brightness);
  stripe.show();
}

void setPixelColor( uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint16_t brightness) {
   stripe.setPixelColor(n, (brightness*r/255) , (brightness*g/255), (brightness*b/255));
}
Auf den Code selber werde ich soweit nicht eingehen da ich dies erstmal zur Grundkenntnis Voraussetzung. Wenn ich es zeitlich schaffe kann ich eine Erklärung des Codes noch einfügen.

Jetzt muss der Code nur noch auf den Microprozessor geschrieben werden. Dafür überprüfen wir vorher einmal den Code.
Unter "Datei" ist ein schöner Haken, dieser prüft noch einmal den Code ob nicht vergessene Variablen sich versteckt haben oder der Code einfach an einer stelle Fehlerhaft ist.
Nach der Prüfung kann der Code durch den Button daneben einfach auf den Microprozessor geschrieben werden und es sollte dann auch schon zum Blinken anfangen.

Das Video muss ich erst noch bei YouTube hochladen und werde es vermutlich Morgen verlinken. Bis dahin noch ein wenig Geduld :)

Der nächste Schritt wird jetzt sein, Lichtmodus über die Fernsteuerung einstellbar. Leider tapp ich hier noch im Dunkeln und muss mich dort erst einlesen.
Anregungen und Tipps sind herzlich willkommen. Den Code dafür werde ich morgen mal Posten da ich schon weiter bin wie in dem oben gezeigten Code.
 
Zuletzt bearbeitet:

yoshi

Betreiber
Mitarbeiter
Der nächste Schritt wird jetzt sein, Lichtmodus über die Fernsteuerung einstellbar. Leider tapp ich hier noch im Dunkeln und muss mich dort erst einlesen.
Anregungen und Tipps sind herzlich willkommen.
Da gibt es doch schon Bibliotheken oder Sketches oder wie auch immer man das nennen möchte. Hier z.B.

Man muss da aber aufpassen welche Timer verwendet werden und welche Pins nutzbar sind. Eventuell beißt sich das dann mit anderen Bibliotheken.


Das war auch einer der Gründe, warum ich nie Bibliotheken verwendet habe. Wenn man aber alles selber zu Fuß programmiert, dann kommt man kaum noch vorran.
 

micha86

Mitglied
Morgen Yoshi,
die bibliothek hab ich mir sogar schon durchgelesen, für nen 3 Wege schalter hab ich das jetzt einfacher gelöst. Ich bin sogar schon soweit das ich den Lichtmodus über einen 3 wege schalter an meiner Taranis ändern kann. Leider ist es so noch nicht ganz optimal da ich noch nicht Interrupt arbeit (Derzeit ist es allerdings auch noch nicht nötig, da ich nur einen schalter auslesen muss).

Das ganze werde ich heute Abend hier noch einfügen.
 

micha86

Mitglied
So heute hab ich Mal nen Testflug gemacht. Leider hat das mitm Autofokus nicht geklappt. Besseres Video folgt. :)

Zum Code und die weitere Verkabelung gibt es dann morgen.

IMG-20170307-WA0013.jpeg

 
D

Deleted member 17

Gast
Respekt, die Landung hätte ich auf der kleinen Fläche vergeigt.:)
 

micha86

Mitglied
Code:
#include <Adafruit_NeoPixel.h>


#define LEDOUT 6 //PIN für LED streifen
#define REMOTESWITCH 5 // Arduino-Eingang für den Kanal der Fernsteuerung (Schalter).


#define NUMPIXELSTOP 24 //Anzahl der LEDs an den Armen
#define NUMPIXELSBOTTOM 12 //Anzahl der zusatz LEDs an der Unterseite

//Vordefinierte Lichtmodis
#define LIGHTOFF 0
#define LIGHTON 1
#define LANDINGLIGHT 2

//Vordefinierte Farbwerte
#define WHITE 255,255,255
#define RED 255,0,0
#define GREEN 0,255,0
#define BLACK 0,0,0

//Vodefinierte Helligkeitswerte
#define BRIGHTNESSHIGH 255
#define BRIGHTNESSLOW 20

// Grenzen für Bestimmung der Schalterstellung
#define LOWERSWITCH 1400
#define HIGHERSWITCH 1600


Adafruit_NeoPixel stripe = Adafruit_NeoPixel(NUMPIXELSTOP + NUMPIXELSBOTTOM, LEDOUT, NEO_GRB + NEO_KHZ800);

//Vordefinierte Pausezeiten
int delayBig = 1000;
int delaySmall = 130;
int delayXSmall = 30;
int lightMode = 0;

unsigned long duration;

void setup() {
  pinMode(REMOTESWITCH, INPUT);
  pinMode(LEDOUT, OUTPUT);
  stripe.begin();
  stripe.setBrightness(255);
  setColors(20);
}

void loop() {
  lightMode = readLightMode();

  if (lightMode == 1) {
    paintAllStripesBlack(255);
  } else if (lightMode == 2) {
    paintBasicMode();
  } else {
    paintAllStripesWhite(255);
  }
}

// Basic Light Mode
// Diese Funktion stellt nur die abwechselnden Blinkeffekte
void paintBasicMode() {
  setColors(BRIGHTNESSHIGH);
  delay(delaySmall);
  setColors(BRIGHTNESSLOW);
  delay(delaySmall);
  setColors(BRIGHTNESSHIGH);
  delay(delaySmall);
  setColors(BRIGHTNESSLOW);
  if (checkChangedLightMode() == true) {
    return;
  }
  delay(delayBig);
  setStrobo(BRIGHTNESSHIGH);
  delay(delayXSmall);
  setStrobo(BRIGHTNESSLOW);
  delay(delayXSmall);
  setStrobo(BRIGHTNESSHIGH);
  delay(delayXSmall);
  setColors(BRIGHTNESSLOW);
  if (checkChangedLightMode() == true) {
    return;
  }
  delay(delayBig);
  if (checkChangedLightMode() == true) {
    return;
  }
}

//Arme werden vorne Grün und hinten Rot
//Die Unterseite wird Schwarz(Aus)
void setColors(int brightness) {
  for(int i=0;i<(NUMPIXELSTOP + NUMPIXELSBOTTOM);i++){
    if(i < 12) {
      setPixelColor(i, GREEN, brightness);
    } else if (i < 24) {
      setPixelColor(i, RED , brightness);
    } else {
      setPixelColor(i, BLACK, 0);
    }
  }
  stripe.show();
}

//Alle LEDs werden Schwarz(Aus)
void paintAllStripesBlack(int brightness) {
   for(int i=0;i<(NUMPIXELSTOP + NUMPIXELSBOTTOM);i++){
      setPixelColor(i, BLACK, brightness);
  }
  stripe.show();
}

//Alle LEDs werden Weiß
void paintAllStripesWhite(int brightness) {
   for(int i=0;i<(NUMPIXELSTOP + NUMPIXELSBOTTOM);i++){
      setPixelColor(i, 255,255,255, brightness);
   }
  stripe.show();
}

//Blitzfunktion für die jeweils mittleren 2 LEDs an einem Arm
void setStrobo(int brightness) {
  setPixelColor(2, WHITE, brightness);
  setPixelColor(3, WHITE, brightness);
  setPixelColor(8, WHITE, brightness);
  setPixelColor(9, WHITE, brightness);
  setPixelColor(14, WHITE, brightness);
  setPixelColor(15, WHITE, brightness);
  setPixelColor(20, WHITE, brightness);
  setPixelColor(21, WHITE, brightness);
  stripe.show();
}

//Funktion für den Helligkeitsunterschied
//Hier wird mit der Helligkeit der RGB Farbwert
void setPixelColor( uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint16_t brightness) {
   stripe.setPixelColor(n, (brightness*r/255) , (brightness*g/255), (brightness*b/255));
}

//PIN 5 wird ausgelesen und in lightMode geschrieben
byte readLightMode() {
  duration = pulseIn(REMOTESWITCH, HIGH);
  if(duration > HIGHERSWITCH) {
    //Schalter oben
    lightMode = 0;
  } else if (duration > LOWERSWITCH) {
    //Schalter unten
    lightMode = 2;
  } else {
    //Schalter mitte
    lightMode = 1;
  }
}

//Zusätzliche Prüfung des lightMode
//wird genutzt um zu prüfen ob der Schalter eine andere Position hat
bool checkChangedLightMode() {
  int newLightMode = readLightMode();
  if (newLightMode == lightMode) {
    return false;
  }
  lightMode = readLightMode();
  return true;
}
So hier gibt's jetzt noch den Code der bei mir grad die LEDs steuert. Auch hier muss ich noch dazu sagen: Es ist lediglich FUNKTIONELL.
Das Ganze wird jetzt noch vernünftig zusammengebaut und noch mit Interrupt versehen.

Der Code wurde soweit Dokumentiert und sollte jetzt eigentlich lesbar und abänderbar sein. Falls jemand damit rumspielen oder erweitern will.
 
Zuletzt bearbeitet:
Top Bottom