TauLabs/PicoC: Ansteuerung RGB LEDs WS2812

ernieift

Erfahrener Benutzer
Der PR ist noch offen. Kommt nach dem Januarrelease rein. Mein Leora fliegt wie Hölle damit. Nur das Wetter ist sch... Hast Du schon MWRATE probiert?
 
Bisher nur auf einem Kleinen 2S / 3100KV Kopter mit 5x3 Props 250gr.
Habe hier meinen etwas größeren wie Leora 240er mit 2204/2300 und 6x4 APC fertig gemacht. Gestern mal der erste Flug draußen mit CC3D CF und KISS im OneShot. Der verhält sich noch etwas merkwürdig. Habe die Looptime mal von 1000 auf 2000 erhöht aber heute ist erstmal nichts drin wegen obigen Wetter. Naja spätestens am WE ist wieder Halle fliegen oder besser einstellen angesagt.
 
Die können keinen verwenden weil nur die Naze Rev4 den MPU Int und auch MagReady an der CPU hat. Andere wie Sparky CC3D haben natürlich den MPU Int dran aber das passt ja dann nicht zu den Nazen.
Darum konnte man auch nur mit der Rev4 TL oder OP betreiben.
 

ernieift

Erfahrener Benutzer
Wenn die Schaltung offen wäre, dann könnte man ja einen Port übernehmen. Andererseits sind die F1 eher die nächsten 8bit-Arduinos ;). Hat eigentlich schon mal jemand die CPU auf einem CC3D gegen einen F3 getauscht. Es sollte doch eigentlich gehen.
 
Das würde mich eher auf dem AirHero32 interessieren da ist eine 6500er MPU drauf. Habe aber leider keinen Schaltplan.
Und bitte - 32Bit Arduinos :) Ordnung muss sein. Und da gibt es dann auch den passenden Arduino
 
Ich denke ja,die Sensordaten,ESCDaten, werden per ser an ein OpenLog - 328Atmel mit MicroSDSlot mit spezieller Firmware - geschickt.

Und funktioniert sogar gleich. Ich liebe die SH Buchsen bei OP/TL mit immer identischer Belegung :)
 
Zuletzt bearbeitet:

rolfz

Neuer Benutzer
Hallo, bin neu im Forum, ev. etwas spät wenn ich die letzten Meldungen sehe.

Baue einen Racer 250 Multicopter mit BrainFPV Kontroller. Ich habe mir ein LED Board gebaut (mit Tiny85) und bin am PicoC programmieren. Habe mir die meinsten Details von diesem Thread geholt. Vielen Dank dafuer.
Nun möchte ich bei Low-Bat meine LED's blinken lassen. Da im Pico-Code ein delay von 500ms enthalten ist sollte dies nicht schwierig sein, jedoch funktionniert meine Rutine nicht (Variable speichert den letzten zustand, und wechselt bei jedem Duchgang das entsprechende Pattern). Habt Ihr dazu eine Idee wie ich dies zustande bringen kann ?
 

ernieift

Erfahrener Benutzer
Hallo,
zeig mal Deinen Source - wird schon werden. Das TimeOut im Tiny liegt bei 3ms. Du kannst also die 500ms delay noch kleiner machen. BTW, Du kannst auch die I2C-Variante nehmen. Ich weiss jetzt grad nicht, ob das am Brain extern geht. Das hat den Vorteil, dass Du nicht auf das Refresh warten musst und die entsprechende(n) LED(s) direkt programmieren kannst.
 

rolfz

Neuer Benutzer
Danke, beim Brain gibt es einen Flex Stecker der I2C unterstuetzen kann.

Ich häng mal meinen Source, hängt leider :-(

#include "system.h"

#include "flightbatterystate.h"

#define nLED 8
unsigned char bufLED[nLED*3];
unsigned char clrLED[nLED*3];

void setLED(unsigned short n, unsigned char r, unsigned char g, unsigned char b) {
if (n < nLED) {
unsigned short offset = 3*n;
bufLED[offset++] = r;
bufLED[offset++] = g;
bufLED[offset++] = b;
}
}

void sendLED() {
ChangeBaud(9600);
SendBuffer(bufLED, sizeof(bufLED));
}

void clearLED() {
ChangeBaud(9600);
SendBuffer(clrLED,sizeof(clrLED));
}

/* end of RGB-LED library */

/* create link to ARM code */

FlightBatteryStateData BatteryData;


short LEDblink=0;
short LEDupdate=1;
short TMParmed=2;
short r=0,g=0,b=0;

TestValSet(1);
sync(0);
while(TestValGet() > 0)
{
FlightBatteryStateGet(&BatteryData);
if (BatteryData.Voltage < 10.4)
LEDblink=1;
else LEDblink=0;

if (armed() && (TMParmed != 1))
{
setLED(0,170,0,0);
setLED(1,170,0,0);
setLED(2,170,0,0);
setLED(3,170,0,0);
TMParmed = 1;
LEDupdate=1;
}
else if (!armed() && (TMParmed != 0))
{
setLED(0,0,170,0);
setLED(1,0,170,0);
setLED(2,0,170,0);
setLED(3,0,170,0);
TMParmed = 0;
LEDupdate=1;
}


if (LEDupdate == 1) {

if(LEDblink==0)
sendLED();
else
clrLED();
LEDupdate = 0;
}


delay(500);
}

TestValSet(2);
 

ernieift

Erfahrener Benutzer
Ich nehme mal an, dass der Source mit exit-code=1 abbricht. Etwas weiter unten hast Du clrLED(); geschrieben. Es müsste clearLED(); heissen. Ausserdem ist da noch ein Fehler bei LEDblink. Der soll doch blinken oder nur die LEDs bei Unterspannung abschalten?
Ein paar Anmerkungen. Die Flankenerkennung von wegen armed/disarmed kannst Du Dir sparen. picoC läuft als low Task. Also kannst Du immer die LEDs berechnen. Spart Variablen und Source. ChangeBaud initialisiert immer den UART neu. Kann man machen, sollte man aber besser lassen. Es könnten ja noch Daten in der pipeline sein. bufLED und clrLED hätte ich vielleicht anders gelöst aber seit drum.
Du hast oben sync(0) geschrieben und unten delay() verwendet. Das geht, macht aber keinen Sync-Intervall. Du würdest es wahrscheinlich nicht mal bemerken.
So sollte es gehen:
Code:
#include "system.h"
#include "flightbatterystate.h"

#define nLED 8
unsigned char bufLED[nLED*3];
unsigned char clrLED[nLED*3];

void setLED(unsigned short n, unsigned char r, unsigned char g, unsigned char b)
{
 if (n < nLED) {
  unsigned short offset = 3*n;
  bufLED[offset++] = r;
  bufLED[offset++] = g;
  bufLED[offset++] = b;
 }
}

void sendLED()
{
 SendBuffer(bufLED, sizeof(bufLED));
}	

void clearLED()
{
 SendBuffer(clrLED,sizeof(clrLED));
}


FlightBatteryStateData BatteryData;
short LEDblink=0;

ChangeBaud(9600);
TestValSet(1);
sync(0);

while (TestValGet() > 0) {
 FlightBatteryStateGet(&BatteryData);
 if (BatteryData.Voltage < 10.4)
  LEDblink= ++LEDblink % 2;
 else
  LEDblink=0;

 if (armed()) {
  setLED(0,170,0,0);
  setLED(1,170,0,0);
  setLED(2,170,0,0);
  setLED(3,170,0,0);
 } else {
  setLED(0,0,170,0);
  setLED(1,0,170,0);
  setLED(2,0,170,0);
  setLED(3,0,170,0);
 }

 if (LEDblink == 0)
  sendLED();
 else
  clearLED();

 sync(500);
}

TestValSet(2);
 

rolfz

Neuer Benutzer
Vielen Dank, Code ist super, mit ein paar Aenderungen bekomme ich nun ein schnelles blaues Blinken wenn die Accus am Ende sind. Habe nur ein Problem mit Memory im Taulab Status Teil, das wird nun GELB angezeigt. Ist mein Code zu lange ? Suche mich mal in den anderen Messages durch. Zum Abschulss, wo kann ich über die PICOC spez. Details nachlesen ? Sollte mich da noch etwas schlauer machen!
 

ernieift

Erfahrener Benutzer
im Wiki steht (fast) alles zu den Libraries drin (https://github.com/TauLabs/TauLabs/wiki/User-Guide:-PicoC). Zu den Details und Unterschieden bei picoC siehe hier (https://github.com/zsaleeba/picoc)
Du kannst die Speichereinteilung bei picoC im Modul einstellen. Da das Brain ja noch OSD macht, kannst Du bestimmt noch etwas drehen. Wenn Du den Source optimierst, kannst Du die default-Werte für den Speicher verringern. Immer mal Testen und auf die TaskInfo schauen.
 
FPV1

Banggood

Oben Unten