Ersatz für die externe Status-LED der PixHawk (I2C->Arduino+RGB-Leiste)

meister

Erfahrener Benutzer
#1
Hi,
hab mal bissle was gebastelt damit ich nicht noch ne externe Status-LED kaufen muss :eek:



Funktioniert im Prinzip wie die Originale nur das man auch ganze Leisten mit ansteuern könnte.

Im Moment hab ich nur 4 LED's dran, die erste verhält sich wie die originale, die anderen 3 sind die erste in die drei farben aufgespittet (also nur Rot, nur Grün und nur Blau).

Desweiteren lassen sich auch normale LED's anklemmen (Einzelne oder eine RGB-LED).

PHP:
#include "FastSPI_LED2.h"
#include <Wire.h>

#define NUM_LEDS 4
#define SLAVE_ADDRESS 0x55

struct CRGB { 
  byte g; 
  byte r; 
  byte b; 
};
struct CRGB leds[NUM_LEDS];

WS2811Controller800Mhz<12> LED;

const int ledR = 9;
const int ledG = 10;
const int ledB = 11;
const int led13 = 13;


void setup() {
  LED.showRGB((byte*)leds, NUM_LEDS);

  LED.init();
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
  Serial.begin(38400);
  pinMode(ledR, OUTPUT);      
  pinMode(ledG, OUTPUT);      
  pinMode(ledB, OUTPUT);      
}

void loop() {
  delay(500);
}

void requestEvent()  {
  Wire.write(0);
  Wire.write(0);
  Wire.write(0);
}

void receiveEvent(int bytes) {
  byte data[6];
  data[0] = Wire.read();
  data[1] = Wire.read();
  data[2] = Wire.read();
  data[3] = Wire.read();
  data[4] = Wire.read();
  data[5] = Wire.read();
  if (data[1]) {
    digitalWrite(ledB, HIGH);
    digitalWrite(led13, HIGH);
  } else {
    digitalWrite(ledB, LOW);
    digitalWrite(led13, LOW);
  }
  if (data[3]) {
    digitalWrite(ledG, HIGH);
  } else {
    digitalWrite(ledG, LOW);
  }
  if (data[5]) {
    digitalWrite(ledR, HIGH);
  } else {
    digitalWrite(ledR, LOW);
  }
  leds[3].b = data[1] * 17;
  leds[2].g = data[3] * 17;
  leds[1].r = data[5] * 17;
  leds[0].r = leds[1].r;
  leds[0].g = leds[2].g;
  leds[0].b = leds[3].b;

  LED.showRGB((byte*)leds, NUM_LEDS);
  Serial.print(data[0]);
  Serial.print(" ");
  Serial.print(data[1]);
  Serial.print(" ");
  Serial.print(data[2]);
  Serial.print(" ");
  Serial.print(data[3]);
  Serial.print(" ");
  Serial.print(data[4]);
  Serial.print(" ");
  Serial.println(data[5]);
}
EDIT: kleines update (dimmen bei eingestecktem usb, wie das org.)
 
Zuletzt bearbeitet:

meister

Erfahrener Benutzer
#3
die leiste wird über die 5V leitung gespeist, mehr als 4 LED's würd ich aber nicht dran hängen.
Wenn man normale LED's nutzt kann man diese direkt an den arduino klemmen, das verkraftet er locker und auch die Versorgung von der Pixhawk (er originale will genause viel strom),
bei langen LED-Leisten sollte man die Versorgung über ein extra 5V-UBEC machen.

Gruß,
Olli
 

bigbretl

Erfahrener Benutzer
#4
Servus miteinander,
passt zwar nicht ganz hierher, wollte aber nicht gleich ein neues Thema öffnen.
Seit dem Update auf 3.2 habe ich an der externen Led für das GPS Signal einen neuen Blinkcode.
Bisher hatte ich nur Dauerblinken mit ca. 2-3 Blink pro sek für fehlendes GPS Signal und dauerhaft an für Sat fix.
Jetzt habe ich auch noch ab und zu 3xblink dann mehrere Sekunden aus und wieder 3xblink
Kennt jemand die Bedeutung des neuen Blinkcodes?
Danke Gruß bb
 
#5
Hi,
hab mal bissle was gebastelt damit ich nicht noch ne externe Status-LED kaufen muss :eek:



Funktioniert im Prinzip wie die Originale nur das man auch ganze Leisten mit ansteuern könnte.

Im Moment hab ich nur 4 LED's dran, die erste verhält sich wie die originale, die anderen 3 sind die erste in die drei farben aufgespittet (also nur Rot, nur Grün und nur Blau).

Desweiteren lassen sich auch normale LED's anklemmen (Einzelne oder eine RGB-LED).

PHP:
#include "FastSPI_LED2.h"
#include <Wire.h>

#define NUM_LEDS 4
#define SLAVE_ADDRESS 0x55

struct CRGB { 
  byte g; 
  byte r; 
  byte b; 
};
struct CRGB leds[NUM_LEDS];

WS2811Controller800Mhz<12> LED;

const int ledR = 9;
const int ledG = 10;
const int ledB = 11;
const int led13 = 13;


void setup() {
  LED.showRGB((byte*)leds, NUM_LEDS);

  LED.init();
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
  Serial.begin(38400);
  pinMode(ledR, OUTPUT);      
  pinMode(ledG, OUTPUT);      
  pinMode(ledB, OUTPUT);      
}

void loop() {
  delay(500);
}

void requestEvent()  {
  Wire.write(0);
  Wire.write(0);
  Wire.write(0);
}

void receiveEvent(int bytes) {
  byte data[6];
  data[0] = Wire.read();
  data[1] = Wire.read();
  data[2] = Wire.read();
  data[3] = Wire.read();
  data[4] = Wire.read();
  data[5] = Wire.read();
  if (data[1]) {
    digitalWrite(ledB, HIGH);
    digitalWrite(led13, HIGH);
  } else {
    digitalWrite(ledB, LOW);
    digitalWrite(led13, LOW);
  }
  if (data[3]) {
    digitalWrite(ledG, HIGH);
  } else {
    digitalWrite(ledG, LOW);
  }
  if (data[5]) {
    digitalWrite(ledR, HIGH);
  } else {
    digitalWrite(ledR, LOW);
  }
  leds[3].b = data[1] * 17;
  leds[2].g = data[3] * 17;
  leds[1].r = data[5] * 17;
  leds[0].r = leds[1].r;
  leds[0].g = leds[2].g;
  leds[0].b = leds[3].b;

  LED.showRGB((byte*)leds, NUM_LEDS);
  Serial.print(data[0]);
  Serial.print(" ");
  Serial.print(data[1]);
  Serial.print(" ");
  Serial.print(data[2]);
  Serial.print(" ");
  Serial.print(data[3]);
  Serial.print(" ");
  Serial.print(data[4]);
  Serial.print(" ");
  Serial.println(data[5]);
}
EDIT: kleines update (dimmen bei eingestecktem usb, wie das org.)
Könntest du bitte noch einige Aufnahmem von der Verkabelung am Arduino posten... das würde das "Nachbauen bzw. -löten" erleichtern.
 

meister

Erfahrener Benutzer
#6
erstmal es wichtigste:
------------------------------------------------------------------------
Arduino -> Pixhawk (i2c):

GND = GND
A4 = SDA
A5 = SCL
VIN = +5V
------------------------------------------------------------------------


dann entweder per ws2812-led-leiste:
------------------------------------------------------------------------
LED-Leiste (ws2812) -> Arduino:

GND = GND
VCC = VCC
DIN = D12
------------------------------------------------------------------------

und / oder mit einzelnen LED's (max20mA / LED ansonsten werden treiber und eine externe stromversorgung benötigt)
------------------------------------------------------------------------
LED -> Arduiono
LED_ROT = D9
LED_GÜN = D10
LED_BLAU = D11
------------------------------------------------------------------------

Gruß,
Olli

PS: ist ein 5V/16Mhz Arduino-Pro, kein sorge die I2C-Level bleiben im Slave-Mode auf höhe der Pullups (3.3V)
 
FPV1

Banggood

Oben Unten