Hallo,
Ich habe einen Arduino Mikro Pro und muss für ein paar WS2812b LEDs die
Library FastLED einsetzen.
Leider habe ich bemerkt und dann nachgelesen, dass diese Lib den
Interrupt deaktiviert.
Ich möchte nun noch mit einem RCModul 433Mhz Signale empfangen. Dazu
habe ich die Library RCSwitch verwendet.
Und es sieht so aus: sobald ich den Befehl FastLED.Show verwende,
empfange ich keine RC Signale mehr. Der Interrupt wird nicht mehr
ausgelöst. Auch wenn ich nach FastLED.Show den Interrupt neu aktiviere,
kommt dennoch kein Interrupt mehr durch.
FastLED empfiehlt in diesem Fall 2 getrennte Mikrokontroller zu
verwenden. Ich kann das aus Platzgründen nicht machen.
Noch eine Info zu der RC Sache:
Ich muss hier extrem wenig senden. 1 Byte pro Sekunde reicht. Muss auch
nicht sonderlich abgesichert sein.
Habt ihr eine Idee, was ich noch tun könnte?
Gibt es eine RC Library, die keinen Interrupt benötigt? Gibt es Module,
die einfach gestrickt sind und einfach nur Senden/Empfangen ohne
Protokoll. Mir reicht eine AM mit an/aus.
Viele Grüße
dost0011 schrieb:> Gibt es eine RC Library, die keinen Interrupt benötigt?
Wohl nicht, da die hereinkommenden Bits Timer-Interrupt-ge-
steuert einzeln zu einem Byte zusammengesetzt werden (müssen).
dost0011 schrieb:> Gibt es Module,> die einfach gestrickt sind und einfach nur Senden/Empfangen ohne> Protokoll.
Nein, es gibt weniger einfach gestrickte Module. Diese werden
über SPI gesteuert und abgefragt, man kann das so programmieren
dass man keinen Interrupt benötigt. Hier z.B. (es gibt noch
andere Module, bin zu faul zum Suchen):
https://www.ebay.de/itm/163941413757
Nun ja, Das Init der LED-Steuerung rükgängig machen, deine Daten senden
(hoffentlich schnell genug) und das LED-Init wieder ausführen.
Da musst du schon schauen was das genau macht.
o/
Anselm
Da machst du time-multiplexing. Heisst RC und led-ansteuerung finden nie
gleichzeitig statt.
In der praxis wird RC relativ selten sein, und nach einem RC befehl
steuerst du die led an. Deine rc-lib musst du eventuell nach jedem
led.show neu initialisieren, also mach led-show nicht in einer schleife
sondern nur wenn nötig.
dost0011 schrieb:> Habt ihr eine Idee, was ich noch tun könnte
Ja ja, so ist das bei Arduino.
Es passen halt nicht immer die Legosteine so zusammen, wie man sich das
wünschen würde.
Lern halt richtig programmieren, dann geht das schon auch mit diesen
Modulen, auch auf einem ATmega328.
Maschinenbauingenieure bauen schliesslich auch nicht mit Lego.
Technisch erwarten die WS2812b eine ununterbrochende Bitfolge, das lässt
sich natürlich einfacher programmieren wenn man die Interrupts sperrt.
Aber die restliche Zeit könnte man auf Empfang warten. Wenn dann gerade
während der Übertragungszeit zu den LED gesendet wird, Pech,,hat man das
Kommando halt verpasst. Bei Funk muss man eh mit Storungen rechnen, also
ausfalltolerant sein.
Was die FastLED Library alles verstellt, so das kein einfaches enable
von Interrupts danach mehr ausreicht - keine Ahnung, der code enthält
ein Umprogrammieren des Timer0 mit eigenen millis und mikros Funktionen,
aber auskommentiert. Der typische open source Codeverhau also.
Anderer Ansatz:
Schau Dir diese Appnote an:
https://ww1.microchip.com/downloads/en/AppNotes/00001606A.pdf
Da werden konfigurierbare Logikelemente, PWM und SPI dazu verwendet, um
das Timing für solche LEDs vollständig in Hardware zu generieren. Die
Methode ist realtiv genial.
Du könnst natürlich einen PCI mit einer CLC Einheit verwenden.
Nach der Übernahme von Atmel durch Microchip sind aber auch neue AVRs
entstanden, die auch etwas vergleichbares enthalten. (Atmega 4808,
AVR128DA28,...) Das würde dann vieles einfacher machen.
fchk
Eine Software Lösung (neue Lib selber schreiben) schließe ich aus. Der
Aufwand lohnt nicht. Ein LoRa Modul kann ich auch nicht verwenden, weil
die Reichweite zu groß ist - klingt blöd, ist aber so.
Meine Lösung wäre folgende:
Gibt es einen RF Sender/Empfänger, der ganz ohne Protokoll auskommt?
Sprich der Empfänger gibt ein HIGH aus, wenn der Sender sendet und ein
LOW aus, wenn der Sender nicht sendet. Das wäre perfekt. Kennt ihr so
ein Sender/Empfänger Modul?
Vielen Dank.
Stephan D. schrieb:> klingt blöd
Nö, klingt nicht nur blöd sondern ist auch blöd.
Denn man kann die Reichweite durch Einstellen der Sendeleistung
oder Verschlechtern der Antennenstrahlung deutlich einschränken.
Stephan D. schrieb:> Meine Lösung wäre folgende:
Und die ist so scheisse da es schon sehr viele probiert haben
und kläglich daran gescheitert sind.
Genau deswegen gibt es eine RCSwitch und VirtualWire Library.
dost0011 schrieb:> FastLED empfiehlt in diesem Fall 2 getrennte Mikrokontroller zu> verwenden. Ich kann das aus Platzgründen nicht machen.
Und FastLED kann aus Timing-Gründen nicht zulassen, dass während der
Datenübertragung Interrupts dazwischen bratsen.
Was für ein RC-Modul ist das. ???
Weil die normalen China-Module brauchen kein Interrupt ?
Da sollte eine Dauerschleife zum Abhören reichen die durch den Interrupt
halt unterbrochen wird.
Stephan D. schrieb:> Gibt es einen RF Sender/Empfänger, der ganz ohne Protokoll auskommt?> Sprich der Empfänger gibt ein HIGH aus, wenn der Sender sendet und ein> LOW aus, wenn der Sender nicht sendet. Das wäre perfekt. Kennt ihr so> ein Sender/Empfänger Modul?
Das geht nicht. Denn die einfachen Sender/Empfänger verwenden OOK als
Übertragungsprotokoll (OOK = On-Off-Keying). Und wenn nichts gesendet
wird, wird halt Müll empfangen, da das einfache Regenerativ-Empfänger
sind. Und für Müll bräuchtest du dann einen dritten Zustand.
Stephan D. schrieb:> Gibt es einen RF Sender/Empfänger, der ganz ohne Protokoll auskommt?> Sprich der Empfänger gibt ein HIGH aus, wenn der Sender sendet und ein> LOW aus, wenn der Sender nicht sendet. Das wäre perfekt. Kennt ihr so> ein Sender/Empfänger Modul?
Such nach JDY-40.
Sind aber 2.4 GHz.
Beitrag "JDY-40 ein neuer Geniestreich aus China?"
usw.
dann zeig mal den Code. FastLED zusammen mit der den RC-Switch "Libs".
Arduino Pico hab ich nicht in meiner "IDE", hab halt nen anderen
"kleinen" genommen. kompiliert schonmla und braucht 3.9K als leeres
Gerüst. Ist wohl dann so.