TauLabs/PicoC: Ansteuerung RGB LEDs WS2812

cGiesen

Erfahrener Benutzer
Wenn ich das vor die Endlosschleife mache, kann der Effekt doch nicht solange laufen, bis ein Signal kommt?!?

Ich habe das jetzt in == geändert, aber jetzt bleibt es einfach nur gelb?!?!
ich habe es auch mit < und > probiert wobei ich die Grenzen auf 250 und 5 geändert habe.
Bleibt auch immer Gelb auch wenn ich den Delay auf 10 setze
 

ernieift

Erfahrener Benutzer
Mach doch ne Schleife mit while(serial.avail< 3) oder so. Dann müssen wenigstens 3 Bytes im Puffer sein, bevor der Automat das erste Mal läuft. Da kannst Du dann in Ruhe den Effekt testen. Bedenke, das ist softserial. Wenn du also den Puffer zu den LEDs schickst, kannst Du nichts empfangen. Es könnte also beim ersten Mal Übertragungsfehler geben, wenn du gerade show() ausführst.
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
So habe ich das gemacht. Klappt perfekt.
Code:
  while (softSerial.available() == 0) {          r++;
          g--;
          strip.setPixelColor(0, r, g, b);
          if (r > 250) r=5;
          if (g < 5) g=250;
          strip.show();
          delay(10);
  }
Jetzt weiß ich, dass die Elektronik funktioniert.
Jetzt muss das IC nur noch verlötet werden und verschrumpft werden.
 

cGiesen

Erfahrener Benutzer
Ich habe fertig:
Interface_1.jpg
Interface_2.jpg
Interface_3.jpg
Interface_4.jpg
Der abgesetzte Pin, ist Pin 2, nur damit der Rest klar ist.
(In meinem ersten Versuch hatte ich es falsch gemacht :( )

Spätestens jetzt sollten wir uns überlegen, wie wir sowas dauerhaft vernüpftig ablegen können.

Edit:
Solange bis wir nix besseres haben, habe ich mal eine Wiki Seite angelegt.
https://github.com/TauLabs/TauLabs/wiki/PicoC-Project:-RGB-LEDs
Ich weiß das Englisch ist grauenvoll, kann das mal einer bitte besser machen?
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
Mein Script, wie ich es haben wollte ist jetzt fertig (endlich)
Funktion:
- ich habe drei RGB LEDs
- die linke LED (0) zeigt die Spannung Analog zum Flight Status, allerdings müssen die Werte im Code eingetragen werden
- die mittlere LED (1) zeigt ob der Copter gearmt ist. Disarmed Grün, Armed Rot
- die rechte LED (2) zeigt den GPS Status analog zum Flight Status

Code:
#include "system.h"#include "gpsposition.h"
#include "flightbatterystate.h"


/* WS2812 library */
#define nLED 3
unsigned char bufLED[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));
}	


/* end of RGB-LED library */


short LEDupdate=1;
short TMPArmed=2;
short r=0,g=0,b=0;


TestValSet(1);
GPSPositionData GPSData;
short TPMGPS=4;


FlightBatteryStateData BatteryData;
short TMPBattery=4;


TestValSet(2);
while(TestValGet() > 0)
{
	FlightBatteryStateGet(&BatteryData);
	if ((BatteryData.Voltage < 10.4) && (TMPBattery != 1))
	{
		TMPBattery = 1;
		setLED(0,170,0,0);
		LEDupdate=1;
	}
	if ((BatteryData.Voltage < 10.8) && (BatteryData.Voltage > 10.4) && (TMPBattery != 2))
	{
		TMPBattery = 2;
		setLED(0,170,170,0);
		LEDupdate=1;
	}
	if ((10.8 < BatteryData.Voltage) && (TMPBattery != 3))
	{
		TMPBattery = 3;
		setLED(0,0,170,0);
		LEDupdate=1;
	}


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


	GPSPositionGet(&GPSData);
	if ((GPSData.Satellites < 5) && (TPMGPS != 1))
	{
		TPMGPS = 1;
		setLED(2,170,0,0);
		LEDupdate=1;
	}
	if ((GPSData.Satellites < 7) && (GPSData.Satellites > 4) && (TPMGPS != 2))
	{
		TPMGPS = 2;
		setLED(2,170,170,0);
		LEDupdate=1;
	}
	if ((6 < GPSData.Satellites) && (GPSData.PDOP <= 3.5) && (TPMGPS != 3))
	{
		TPMGPS = 3;
		setLED(2,0,170,0);
		LEDupdate=1;
	}


	if (LEDupdate == 1) {
		sendLED();
		LEDupdate = 0;
	}


	delay(500);
}
TestValSet(99);
@ernieift
Wenn ich den Code jetzt dauerhaft nutzen will, einfach ganz normal hoch laden wie immer und den Startmode ändern?
 

odwquad

Erfahrener Benutzer
So ich möchte mich auch mal jetzt mit PicoC befassen und habe mir daher die aktuelle Firmware (20.12.2014) runter geladen.
Aber beim starten kommt eine Fehlermeldung, dass er folgende DLL Dateien nicht findet:
  • Pfdqml.dll
  • welcome.dll

die GSC startet dann nach einem klick auf Ok aber ganz normal. Aber ich traue mich nicht die Firmware draufzuspielen^^
Welche Firmware ist den die aktuellste, die läuft? Welche nutzt ihr?
 
Zuletzt bearbeitet:

odwquad

Erfahrener Benutzer
Auch wenn die Meldung am Anfang kommt, ist der Rest in Ordnung.
Ja ich habe eigentlich die Frage im anderen Thread gelöscht. Ich habe den falschen Threat erwischt am Anfang. Bei mir taucht er auf jeden Fall gar nicht mehr auf. :confused:

Aber danke für die Antwort. :D

Dann gleich noch eine Frage: Ich möchte an die freien Ausgänge der Quanton, noch LEDs anhängen. Bis wieviel mA sind die belastbar?
Ich würde ganz gerne alles über PicoC ansteuern, sodass ich nicht nochmal mein externes Atmel328 Controllerboard benötige.
 

cGiesen

Erfahrener Benutzer
Mache das doch wie hier beschrieben.
Dann hast Du alle Möglichkeiten.
Die Ausgänge sind nicht so dolle belastbar.
10mA oder so, bin nicht sicher, muss Du mal ins Datenblatt gucken.
 

odwquad

Erfahrener Benutzer
Mache das doch wie hier beschrieben.
Dann hast Du alle Möglichkeiten.
Die Ausgänge sind nicht so dolle belastbar.
10mA oder so, bin nicht sicher, muss Du mal ins Datenblatt gucken.
okay. ja die WS2812 werde ich so wie beschrieben ansteuern. Ich wollte aber Zusätzlich noch 4 normale LEDs einsetzen (Als Blitzlicht ähnlich wie beim Flugzeug).
Dann muss ich da aber doch noch was dazwischenschalten. Oder einen weiteren Attiny dazwischen schalten. Ich überlege mir was :D
 

odwquad

Erfahrener Benutzer
Mache das doch wie hier beschrieben.
Dann hast Du alle Möglichkeiten.
Die Ausgänge sind nicht so dolle belastbar.
10mA oder so, bin nicht sicher, muss Du mal ins Datenblatt gucken.
okay. ja die WS2812 werde ich so wie beschrieben ansteuern. Ich wollte aber Zusätzlich noch 4 normale LEDs einsetzen (Als Blitzlicht ähnlich wie beim Flugzeug).
Dann muss ich da aber doch noch was dazwischenschalten. Oder einen weiteren Attiny dazwischen schalten. Ich überlege mir was :D
 

odwquad

Erfahrener Benutzer
So jetzt scheitert es schon an einfachen Sachen :(

ich habe mich mal an dem Beispiel aus diesem PicoC tutorial herangetraut. Leider ohne Erfolg. Ich kann mich zwar mit dem COM Port verbinden, aber es kommt nichts an. Manchmal hängt sich dann die Quanton auch komplett auf.
Irgendwas scheine ich falsch zu machen. Hat einer eine Idee?
 

ernieift

Erfahrener Benutzer
Da hast Du bestimmt überlesen, dass Du für größere Skripte auch dem Interpreter mehr Speicher geben musst. Übrigens kannst Du auch Dein Blitzlicht mit den WS2812 steuern. Du brauchst das Feld für die LEDs nur entsprechend gross definieren und jede LED in der Schleife einzeln (über Zustandsautomaten) programmieren. Dann alles in eine Endlosschleife mit Delay packen... Fertig.
 

odwquad

Erfahrener Benutzer
Aber ich nutze ja momentan nur das erste Skript wo man einfach ein text über den com port ausgibt. Und selbst das funktioniert nicht.

Aber das mit den ws2812 ist eine gute idee und werde ich auf jeden Fall mal ausprobieren.
Mal sehen wie das wirkt.
Aber erst muss ich pico c überhaupt mal zum laufen bekommen
 

odwquad

Erfahrener Benutzer
Den virtuellen usb com port.
Wie nur einen?
 

odwquad

Erfahrener Benutzer
Hmm ich habe den seriellen Telemetrie port und den seriellen gps port noch aktiviert.
Das dürfte doch aber eigentlich pico c nicht stören oder?

In den grund einstellungen ist dann bei vcp auf picoc geschaltet.
 
FPV1

Banggood

Oben Unten