TauLabs/PicoC: Ansteuerung RGB LEDs WS2812

cGiesen

Erfahrener Benutzer
#1
Da viele Informationen im Monster Thread untergehen könnten, möchte ich hier beginnen, alles was zum Thema gehört hier zu bündeln.
Ich möchte Betonen, das es sich nicht um meine Idee handelt, sondern von Elyot ! Ich habe nur mal wieder wie ein Doofer gesucht.

Hintergrund:
Die WS2812 werden im Kern über ein Serielles Protokoll gesteuert. Die Idee ist, dass man dieses über einen schnellen UART wie auch auf einem Quanton Board zu finden ist, möglich sein sollte.
TauLabs kann dank Ernieift eigenen 'kleinen' C-Code aufnehmen, der dann dort interpretiert wird. Dort können dann ganz individuelle kleine Programmer abgelegt werden, die eigene Funktionen bedienen, die nicht wirklich was in der eigentlichen Firmware was zu suchen haben.

Die wichtigsten Beiträge aus dem Monster, um eine Vorstellung der Idee zu bekommen.
http://fpv-community.de/showthread....ltige-Hardware&p=696666&viewfull=1#post696666
Es geht um die Beträge #1512 - #1520

Aufbau:
Das serielle Signal muss invertiert werden, hier reicht ein Transistor aufgrund der Geschwindigkeit nicht mehr aus.
Es empfiehlt sich ein SN74AHC1G04DBVT, der auf Grund seiner Größe doch noch einigermassen zu verarbeiten ist, aber trotzdem gut innerhalb des Kabels in Schrumpfschlauch verschwinden kann.
 

ernieift

Erfahrener Benutzer
#3
Schöner Anfang. Eigentlich wollte ich heute noch ein bisschen damit weiter probieren, komme aber nicht mehr dazu. Da ja gestern die Änderungen übernommen wurden, kann ja jetzt jeder mit dem aktuellen Next weitermachen. Ich suche nachher mal mein angefangenes Script dazu raus.
 

Elyot

Erfahrener Benutzer
#4
Die UART müßte auf 4MBaud,8N1 eingestellt warden. Mit den Bitmustern 0xEF,0x2F,0xEC und 0x8C (für jeweils 2 Bit) müßte das Timing dann laut Datenblatt unter Ausnutzung der Toleranzgrenze eingehalten werden.
Inverter gibt es als Singlegatter in schönen kleinen Gehäuseformen, braucht demnach nicht mehr Platz als die klassische Lösung mit Transistor.
 

Elyot

Erfahrener Benutzer
#6
Für das Bitmuster muß man das Start- und Stop-Bit der UART mit einrechnen. Und das paßt nur, wenn man den Datenstrom invertiert.
 

cGiesen

Erfahrener Benutzer
#7
Danke, verstanden.

Käfer sind seit gestern bestellt, können aber erst ab Freitag geliefert werden.
Dann kann ich auch testen
 

ernieift

Erfahrener Benutzer
#8
Hatte heute eine Idee. Wenn Du schon einen Inverter brauchst, dann kannst Du doch gleich einen ATTiny10 nehmen. Die Dinger sind ziemlich cool. Ich habe damit schonmal einen einfachen LED Blinker für das Moped vom Kollegen gebaut. Geht einfacher/flexibler als mit 2 Transistoren.
Für den Fall, dass es mit den Pattern nicht klappt, könnte der als Protokollkonverter herhalten. Das Ding ist genauso gross wie ein Singlegatter.
Es muss auch nicht viel speichern.
Die Funktion wäre in etwa so:
- Warte auf und ignoriere Startbit
- Ausgang auf H für ca. 250ns
- Teste UART und entscheide ob H oder L ausgegeben wird.
- nochmal 250ns warten
- 1000ns warten
- Bits zählen und bis 8 wiederholen
- bei Stopbit an den Anfang springen

So kann man beliebig viele LEDs ansteuern. Mit 1,5µs pro Bit käme man auf ca. 666KBaud. So könnte man sich die Pattern
sparen und man hätte viel mehr Zeit für anderes. Das Timing bei den LEDs ist +-150ns. Wer also jetzt darüber gestolpert ist, dass ich Start- und Stopbit dabei unter den Tisch fallen lassen habe, keine Sorge. Die WS2812 triggern mit L/H-Flanke. Wenn sich also der Zeitpunkt der Abtastung während der Übertragung verschiebt wäre das nicht schlimm. Wenn es so nicht geht, kann man immer noch 3 Bytes mit einer anderen Baudrate im Block übertragen und für jeder LED komplett ausgeben.
Müsste man allerdings in Assembler schreiben. Geht aber gut. Für OSX geht es damit: https://sites.google.com/site/wayneholder/attiny-4-5-9-10-assembly-ide-and-programmer
Andere Möglichkeiten gibt es bestimmt auch.
 

cGiesen

Erfahrener Benutzer
#9
Die Idee ist gut, aber auch nicht mal eben :(
>Da fehlen mir die Ressourcen und Assembler kann ich nur 6502
Auch braucht man dann wieder eine Menge zusätzliche Hardware wie Progger etc.

Die Inverter sind auf dem Weg, aber Deine Idee ist Plan B da bräuchten wir dann aber auch ein gescheites Protokoll
 

cGiesen

Erfahrener Benutzer
#13
Wenn dann soll der auch die Logik machen.
Aber ich hoffe wir brauchen das nicht.

Ich habe NIX um mich damit zu beschäftigen, schon gar keine Zeit :(
 

Elyot

Erfahrener Benutzer
#14
Die Idee mit dem Tiny "ohne Protokoll" finde ich richtig gut. Viel Logik gibt es da nicht. Auf das Startbit wird synchronisiert, die Datenbits warden dann jeweils nach 0,5Bit (also "in der Mitte") eingelesen und die entsprechenden "Muster" an die LEDs geschickt. Um Assembler kommt man aber definitiv nicht rum.
 

ernieift

Erfahrener Benutzer
#15
Jedenfalls braucht es dann keine 4MBaud sondern irgendwas bei 800KBaud. Die LEDs sollen eine Toleranz von bis zu 5µs zwischen den Bits akzeptieren ohne einen internen Reset auszulösen. Wer es schnell programmieren will, der kann es ja erstmal auf einem normalen Uno o.ä. in Assembler schreiben. Das Handling in der IDE ist da einfacher. Aber prinzipiell ändern sich dann nur die NOPs :).
Leider habe ich im Moment mehr Ideen als Zeit sie umzusetzen (HoTT-OSD, Pixy, Navigation mit picoC, LEDs ...) :(. Mein Teensy3.1 liegt seit heute bei der Post und ich bin morgen schon wieder 2 Tage weg. Na wenigstens habe ich mir schon die Arduinoerweiterung dafür installiert.

PS: Habe noch was vergessen. Monokopter sind auch cool. Den Roboterprototyp habe ich ja schon probiert. Die Schrittmotor-ESCs dafür müssen auch noch gebaut werden. Soviele Baustellen :).
 
Zuletzt bearbeitet:
#17
Auf dem Arduino gibt's verschiedene libs für die leds. Wenn die LEDs mit 5V versorgt werden, brauchen die auch 5V Signal. Aus dem Teensy zb kommen nur 3v3, da musste noch ein Pegelwandler her - ein 5V pro mini hat kein Problem.
 

ernieift

Erfahrener Benutzer
#18
@Carsten: Die Libs aus den links sind keine Protokollkonverter. Der USB-Hack aber super. Oder wolltest Du eine statische Lösung mit vorher definierten Effekten?

@markus1234: Der Teensy ist für mein HoTT-OSD. Für die LEDs wäre es mit Kanonen auf Spatzen.
 

cGiesen

Erfahrener Benutzer
#19
Warum 'driften' wir so ab?
Wird das einfach am UART jetzt doch nicht klappen?

Wir müssen ja nicht ständig schreiben.
Lauflichter sind ja nicht nötig.

@Ernieift
Nee, ich will gezielt was einstellen können.
Auch nur für drei LEDs
 

Elyot

Erfahrener Benutzer
#20
Am UART mit Inverter wird klappen, wenn die Baudrate passend eingestellt ist. Mit 4 MBaud paßt dann auch das Timing laut Datenblatt unter Ausnutzung der Toleranzgrenzen.
Die Attiny-Lösung würde die LEDs außerhalb der Datenblatt-Speks betreiben, was aber dennoch zu funktionieren scheint. Der große Vorteil hier wäre, daß man direkt die RGB-Werte (3 Byte pro LED) ausgeben kann, während man die RGB-Werte für die UART-Inverter-Variante erst noch umkodieren muß (12 Byte pro LED).
 
FPV1

Banggood

Oben Unten