IRMP auf STM32 - ein USB IR Empfänger/Sender/Einschalter mit Wakeup-Timer

  • ****************************************************************************************
    Projektseiten:
    http://www.mikrocontroller.net…schalter_mit_Wakeup-Timer
    https://www.mikrocontroller.ne…_auf_STM32_-_Bauanleitung
    https://github.com/j1rie/IRMP_STM32
    NEU: https://www.mikrocontroller.ne…vereinfachte_Bauanleitung


    Verkauf im Forums-Marktplatz:
    IRMP-STM32-USB-IR-Empfänger
    http://www.vdr-portal.de/board…schalter-auf-stm32-basis/
    ****************************************************************************************


    Verbindet die Vorteile von yard2, yaUsbIr und IRMP/USBasp.
    Der Hauptvorteil ist, dass man alles selbst anpassen kann.


    Der STM32F103 ist massenhaft billig verfügbar für ca. 5 - 6 € auf ebay aus China.
    http://www.ebay.de/sch/i.html?_&_nkw=STM32F103C8T6+Board Größe: 52 x 36 mm


    Ich habe den STM32F105 gekauft für gerade mal das Porto, jetzt gibt es ihn leider nur noch zum Festpreis.
    www.ebay.de/sch/i.html?_&_nkw=STM32+based+3rd+axis+extension+board+for+Alexmos+gimbal+controller Größe: 51 x 24 mm


    Man könnte aber auch selbst bauen:
    http://shop.endasmedia.ch/index.php?id_product=8&controller=product&id_lang=1


    Der STM32F105 hat den Vorteil, dass man keine Hardware zum Flashen braucht. Er kann direkt über USB geflasht werden (dfu-util).
    Für den STM32F103 braucht man einen USB-TTL Wandler, wie sie z.B. für Handys üblich waren.
    Nachdem man einmalig einen USB Bootloader geflasht hat (maple), kann man dann auch bequem über USB flashen.


    Ich habe Software von
    http://mikrocontroller.bplaced.net/wordpress/?page_id=1516
    http://mikrocontroller.bplaced.net/wordpress/?page_id=1940
    http://mikrocontroller.bplaced.net/wordpress/?page_id=1993
    (IRMP, IRSND, USB_HID für STM32F4) benutzt und an den STM32F105 angepasst.


    Zum Entwickeln habe ich CooCox benutzt.
    Eine sehr gute Einführung in das Thema gibt es hier:
    http://www.olliw.eu/2013/stm32-this-and-that/


    Meine Experimentier-Firmware kann
    * sich als HID Device anmelden
    * über USB2 in Fullspeed Daten ein/ausgeben
    * IR empfangen
    * IR senden
    * den PC aus Standby oder Ausgeschaltet über USB aufwecken (+5V auf USB nötig)
    * von der Kommandozeile aus IR senden
    * per definierter Fernbedienungs-Taste IR senden
    * per irmplircd IR Codes an VDR weitergeben
    * per Kommandozeile irgendetwas tun
    * per empfangenem IR Code irgendetwas tun


    Noch zu implementieren wären u.a.:
    * RTC benutzen (auf dem F103 Board ist der zugehörige Quarz eingelötet, auf dem F105 nicht, es geht aber ev. auch ohne (?))
    * EEPROM emulieren zwecks dauerhaftem Speichern und wieder Auslesen


    Der Phantasie sind fast keine Grenzen gesetzt :)


    Anbei noch ein paar Bilder. Ich habe genommen, was gerade in meiner Elektronik Bastelkiste war, die Schalter müssen nicht so gross sein ;), und einer würde reichen (für Boot0 um in den DFU Flash Mode zu kommen), die anderen beiden sind für Reset und USB neu einlesen, was das ganze viel bequemer macht, wenn man dauernd flasht und testet.


    Auf dem F105 ist die STM32_USB-Host-Device_Lib_V2.1.0 aktuell, auf dem F103 die STM32_USB-FS-Device_Lib_V4.0.0, von daher könnten ev. weitere Anpasungen für den F103 nötig sein.


    Weitere Ideen und Kommentare erwünscht.

  • Da es bis jetzt noch kein Feedback gab möchte ich mich bedanken für das Teilen dieser Klasse Infos und der Firmware.
    Ich werde das Thema weiterverfolgen.


    ((Was ich mich frage ob die HW evtl. etwas overpowered ist und es diese mechanisch kleineren Teile auch tun würden: http://www.ebay.de/itm/1-x-STM8S103F3P6-STM8-core-board-development-board-/151129392071?pt=LH_DefaultDomain_0&hash=item23300383c7 ))


    Danke fürs Teilen Deines Projektes.

  • Moin,


    das Projekt ging irgendwie auch an mir vorbei. Coole Sache, gefällt mir :tup


    Vor allem endlich vernünftiger USB, keine SoftwareEmu.

    SAT Hardware: Gibertini SE75 | DuraSat Dur-Line UK-24 | DD OctopusNET V2 Rack (Firmware 1.0.80 Beta) mit MaxS8
    Server: Asus M5A78L-M/USB3 | Sempron 145@2Cores | 8GB ECC RAM | PicoPSU | Debian Jessie 64Bit | Linux Kernel 4.4 | VDR 2.2.0 mit SAT>IP, epgsearch, streamdev, epg2vdr, vdr-epg-daemon
    Clients: RaspberryPI 2/3 | Yocto Poky Linux (Openembedded) 2.2+git | Linux Kernel 4.9+git | VDR 2.2.0 mit SAT>IP, RpiHDDevice, SkinDesigner, Remote, Graphlcd-ax206dpf, RemoteTimer, Extrecmenu, NeutrinoEPG, Femon, Mlist


    R.I.P: Gigaset M740 mit VDR von open7x0.org

  • Danke für das ermutigende Feedback :)


    Ob der STM8S103F3P6 ausreicht, kann ich leider nicht beurteilen; auch nicht wie schwierig/einfach es wäre, die Firmware und insbesondere die Libs anzupassen. Ist natürlich von Preis und Größe her interessant.


    Die Eeprom Emulation ist schon fertig, aber ungetestet – keine Zeit momentan.
    Die RTC ist auf dem F105 Board benutzbar mit dem 25 MHz Quartz und ohne Batterie, man kann dann eben nicht in den Stromspar-Modus des STM32 gehen, was für einen IR-Einschalter eh nicht sinnvoll wäre, da er ja dauern bereit sein muss. Und nach einem Stromausfall muss dann eben der VDR wieder hochfahren und die Zeit neu setzen. Das halte ich für keinen Nachteil, auch wenn es eleganter wäre, wenn die RTC ohne externe Stromversorgung durchläuft, das geht aber nur mit Batterie und extra RTC-Quartz, ist also nur auf dem F103 Lctech Board möglich. Leider kann man die RTC-Bibliothek für den F407 nicht übernehmen, weil die Unterschiede zu groß sind. Das war auch für die Eeprom-Emulation so, aber da war es relativ leicht die STM Bibliotheken/Beispiele anzupassen. Für die RTC erscheint mir das schwieriger. Aber wenn ich wieder Zeit habe …

  • Ich hoffe, dass sich noch mehr Mitstreiter insbesondere für die Software finden.


    Mein nächster Schritt ist, etwas für die Kommunikation PC ↔ STM32 zu entwickeln, und dann das Eeprom zu testen und anzuwenden.


    Eine TODO Liste für Aufgaben, zu denen ich momentan keine Lust habe:
    * den USB-HID Teil für den F103 anpassen
    * RTC implementieren


    Anbei die aktuelle Firmware und der CooCox Projektordner mit den kompletten Sourcen.


    Edit: Habe gerade noch was nettes entdeckt (22 x 53 mm!):
    http://www.ebay.com/itm/New-STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-For-Arduino-/121367943647?pt=LH_DefaultDomain_0&hash=item1c4217d9df
    http://item.taobao.com/item.htm?spm=a1z10.1.w4004-386456545.4.5kbnhx&id=22097803050


    Edit2: Die eeprom.h von STM hat einen blöden Fehler, anbei korrigierte Version.
    Leider beiße ich mir beim Debuggen eines Fehlers im Eeprom Teil die Zähne aus. Wenn so ein Mikrocontroller sich aufhängt, kann man ja nicht einfach ein Backtrace machen. Vielleicht muß ich mir einen ST-Link zum debuggen kaufen.


    Edit3: Der Eeprom Teil geht, der Fehler war gar nicht dort, sondern in der Kommunikation PC ↔ STM32.
    Mein nächster Schritt wird sein, das näher zu untersuchen.

    Dieser Beitrag wurde bereits 8 Mal editiert, zuletzt von jrie ()

  • Für alle, die mit basteln wollen, hier der aktuelle Stand der Firmware Sourcen und ein halbfertiges Progämmchen zum Befehle geben, Eeprom setzen und Echos/IR Daten empfangen.
    RTC ist ansatzweise eingebaut, aber noch völlig ungetestet.
    Ein paar hartnäckige Bugs sind auch noch drin. Aber langsam wird es was :)


    PS: Den USB-HID Teil für den F103 anzupassen ist komplizierter, als ich zunächst dachte, da die Unterschiede zwischen F103 und F105 USB Bibliotheken groß sind, und auch der Unterschied des STM USB-HID Beispiels zum hier verwendetem groß ist.
    Statt die Änderungen zu Übertragen, wäre es wohl besser, für den F103 neu anzufangen und eines der USB-HID Beispiele aus dem Internet zu nehmen, oder die Custom HID demo von STM anzupassen.
    Eine andere Möglichkeit wäre, auf USB-CDC/VCP umzusteigen, dafür findet man weitaus mehr Code als für HID.


    Edit: Als ich angefangen habe, dachte ich, ich müsste nur ein paar fertige Module zusammen packen, und etwas Code drum herum stricken. Die eigentliche Arbeit besteht aber im Anpassen der Module. Jetzt beiße ich mir die Zähne am RTC Code aus. Das Ganze ist doch weitaus (Zeit-)aufwändiger, als ich erst annahm.


    Edit2: Ich habe noch mal drüber nachgedacht. Wofür braucht man eigentlich eine RTC? Zum Weiterlaufen mit minimalem Stromverbrauch, damit die Batterie länger hält. Ohne RTC Quartz macht das auf meinem STM32-Board eh keinen Sinn. Eigentlich geht es doch nur um das Aufwachen. Dafür reicht es, den zweiten Delta Parameter, den VDR per --shutdown übergibt, in den STM32 zu schreiben, ihn per Systick runter zu zählen, und schließlich bei Null den VDR aufzuwecken.
    Bei Stromausfall wäre eine RTC von Nutzen, aber als workaround kann man genauso gut den VDR bei Stromausfall neu starten lassen, dann fährt er nach MinUserInactivity runter und der STM32 bekommt wieder den (durch Stromausfall vergessenen) Delta Parameter.
    Der einzige Nachteil zur RTC bei Stromausfall ist also, dass der VDR eine kurze Zeit läuft, die man sonst sparen würde. So oft fällt der Strom aber nicht aus, dass es sich deswegen lohnen würde.
    Es gibt sogar einen Vorteil, nämlich wenn der RTC Neustart gerade in die Zeit des Stromausfalls fällt. Dann wäre bei RTC Schluss bis zu manuellem Eingriff, die workaround Methode fängt das ab.
    Daher habe ich die Idee eine RTC einzubauen verworfen, und werde statt dessen Systick benutzen.


    Falls jemand anderes eine RTC einbauen möchte, habe ich natürlich nichts dagegen ;)


    Ich gehe bei meinen Gedanken übrigens immer davon aus, dass der STM32 dauerhaft über USB Strom vom Netzteil bekommt, auch im ausgeschaltetem Zustand/Standby .


    Edit3: Die Firmware ist (fast) fertig, alles geht, muss nur nur noch etwas debugt und aufgeräumt werden.
    Das Konfigurationsprogramm muss noch erweitert werden.
    Konfigurieren und Auslesen geht übrigens auch unter Windows mit SimpleHIDWrite.


    Danach schaue ich mir vielleicht mal IRMP's Debugmodus an, der dekodiert nicht, sondern gibt Puls/Pause-Längen aus, ähnlich wie yaUsbIr und IgorPlugUSB. Bei der großen Anzahl (die ständig wächst) von Protokollen, die IRMP kann, dürfte man das aber nur selten brauchen.


    Ich habe den Titel angepaßt, und RTC durch Wakeup-Timer ersetzt.

    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von jrie ()

  • Hier die aktuelle Version. Man könnte noch ein paar Sachen optimieren, aber alles geht, und auch das Konfigurationsprogramm tut was es soll.

  • Ich habe mir doch die Mühe gemacht und den USB HID Teil stark überarbeitet und die Unterschiede vom USB_HID zu den STM Originalen herausgearbeitet. Der F105.HIDneu.diff ist sehr überschaubar.
    Hier zwei links auf ein HID für den F103 und das Repo:
    http://sysmagazine.com/posts/208026/
    https://github.com/RavWin/RHID…e/master/tstHID-STM32F103
    Ein leicht bereinigter F103b.diff zwischen dem Repo und den STM Dateien anbei. Ist ziemlich unaufgeräumt.
    Ich habe für den F103 eine Vorlage erstellt: STM32F103C8.ZIP, darin sind die STM Original HID Dateien enthalten.
    Jetzt muss man das „nur“ noch zusammen puzzeln, dann haben wir ein USB HID auch für den F103.

  • Zitat

    Jetzt muss man das „nur“ noch zusammen puzzeln, dann haben wir ein USB HID auch für den F103.


    Das wäre cool...
    Wer das tun will kann gerne einen meiner beiden haben (für "umme").



    Wenn das ganze SW-seitig läuft würde ich mal eine Aufsteckplatine für das Teil auf dem Foto entwickeln...

  • Für den F103 anbei mal was zum Basteln und erstem Erfolgserlebnis (hoffentlich). Da ich noch keinen habe, kann ich nicht verifizieren.
    IR in vom TSOP an C6
    LED an B12
    Bei jedem Tastendruck sollte die LED toggeln (außer wenn es dieselbe Taste ist).


    Für den F105 der aktuelle Stand.

  • Hier mal ein erstes Feedback.
    -Zuerst die Toolchain installieren (ich habe dieses gemacht: http://www.olliw.eu/2013/stm32-this-and-that/#coocoxinstall; direkt unter Debian/ Ubuntu geht es vbermutlich deutlich schneller / einfacher...)
    -kompilieren
    -Flashen (Achtung die Anschluss des seriellen Kabels ist wie bei einem Nullmodem, also RXD/TXD gekreuzt!)


     


    Fortsetzung folgt. (HW Part OK/ NOK)

  • Hallo Martin,
    ich bin nicht zu hause, und kann stm32flash gerade nicht mit dem F105 ausprobieren.
    Aber mit dfu-util benutze ich (aus dem Kopf):

    Code
    1. dfu-util -a 0 -s 0x8000000 -D /Pfad/IR.bin

    Mir kommt die Adresse 0x08002e28 komisch vor (oder hast du einen Bootloader geflasht?). Probier mal -s 0x8000000 (stm32flash hat den Parameter auch, und sowohl dfu-util als auch stm32flash werden beide (auch) von Tormod Volden gepflegt). Vielleicht ist es aber beim F103 anders, kann ich erst abchecken, wenn er ankommt.
    Gruß, Jörg
    Edit: Oder ist 0x2e28= 11816 die Größe von IR.bin, bzw ein wenig größer (letzter 1024er Block)? Dann ist alles ok.

    Dieser Beitrag wurde bereits 2 Mal editiert, zuletzt von jrie ()

  • Hi,


    noch ne Anmerkung: Das oben abgebildete Board ist wohl das mit der besten Preis-Leistung. Daher wäre es sehr schick wenn dieses ohne Änderung nutzbar wäre.


    B12 sollte kein Problem sein. (Aber z.B. B11 liegt z.B. auf der strategisch leicht geschickteren Reihe innen)

    Zitat

    IR in vom TSOP an C6
    LED an B12


    C6 ist meiner Meinung nach nicht herausgeführt. (Ich habe kein Datenblatt zu dem Board, kann aber selbst mit dem Mikroskop keine Beschriftung dazu finden)



    Grüße
    Martin

  • Das Datenblatt gibt es hier. Es gibt tatsächlich kein C6 auf dem 48 Pin F103.
    Wenn dir B11 lieber ist, ersetzt du in main.c die Zeile

    Code
    1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

    durch

    Code
    1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;


    In irmpconfig.h ist der Kommentar "use C6 as IR input on STM32", und in den beiden Zeilen darunter kannst du als IRMP_PORT_LETTER und IRMP_BIT_NUMBER statt C6 etwas anderes auswählen.
    Ich bin mit dem Basteln noch nicht so weit, sonst wär' mir das schon aufgefallen ;)
    Gruß, Jörg
    Edit: B6 sollte für die Sendediode reserviert bleiben.
    Edit2: Die (meisten) Pins vertragen max. 8 - 20 mA, da muss bei direktem LED verbinden der Vorwiderstand groß genug sein.

    Dieser Beitrag wurde bereits 3 Mal editiert, zuletzt von jrie ()

  • Vielen Dank an Martin für das Sponsoren eines STM32F103C8T6 Boards!


    Die USB HID Firmware ist zusammen gepuzzelt, die innere Logik anzupassen war schwierig, jetzt ist Testen angesagt, denn es sind bestimmt noch viele Bugs drin.


    Leider schaffe ich es nicht, das Board zu flashen. Ich weiß nicht, ob es am Flasher, Board oder Software liegt. Eines habe ich schon heraus bekommen: Auf dem Board sind die Beschriftungen für BOOT0 und BOOT1 vertauscht. Fürs Flashen muss BOOT0 high und BOOT1 low sein. Wenn man das vertauscht wird es nichts.


    Ich hoffe, ich komme bald zum Testen.


    Jörg

  • Der Phantasie sind fast keine Grenzen gesetzt


    Also richtig super fände ich IR empfangen und als Tastaturbefehl wieder ausgeben, damit wären inputlags endgültig Vergangenheit :-)
    Btw: Der STM32F103 kann kein HDMI-CEC ausgeben oder? Ich find nur Anleitungen für den STM32F0xx oder dem STM32F100xx?

    ASUS M3n78-EM, Sempron 140, 2 GB RAM, WD20EARX, DD DuoFlex CT , Atric IR Rev. 4, Pearl Display, Picopsu-150-XT mit Dell DA-1, yaVDR 0.61 am Samsung UE32D5000

  • Der F103 von Martin lässt sich mit einem anderen USB-Seriell Adapter immer noch nicht flashen. Ich gehe mal davon aus, dass er eine Macke hat und gebe erst mal auf.
    Vielleicht mache ich gelegentlich einen zweiten Versuch und bestelle mir einen neuen F103 und auch gleich einen STLink/V2 (Emulator).


    HDMI-CEC taucht im Datenblatt des F105 bzw. F103 nicht auf. Und falls mit "als Tastaturbefehl wieder ausgeben" events gemeint sind, ja, das tut er, er gibt über USB-HID events aus. irmplircd stellt die events dann bereit, z.B. für den VDR.


    Edit: Angehängt der Schaltplan des F103 LC-Tech. Boards. Ist bei LC-Tech/Aliexpress in den Bewertungen versteckt.

    Dateien

    • STM32F103.ZIP

      (111,66 kB, 257 Mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von jrie ()

  • Jetzt ist auch IRMP Logging eingebaut (Debug Modus, gibt Nullen und Einsen am UART aus).


    Wenn man senden und loggen nicht braucht, tut es auch etwas Kleines wie z.B.
    http://www.aliexpress.com/stor…er/524881_1446941850.html
    http://www.aliexpress.com/stor…AG/812021_1582945053.html
    http://www.aliexpress.com/item…ownloader/2029118202.html
    http://www.aliexpress.com/item…ith-Cover/1814522286.html
    Man braucht zwei davon, einen um den anderen zu programmieren.


    Edit: Voraussetzung ist allerdings, dass man an SWDIO und SWCLK zum Programmieren kommt, bei manchen sieht man 4 kleine Löchlein nebeneinander, das sind +3,3--SWCLK--GND--SWDIO. Da ist nämlich ein Passwort-geschützer Bootloader drauf, deswegen geht es bei denen nur so.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von jrie ()

  • Anbei stm32IRalarm um vom VDR-shutdown-Skript die Alarmzeit in den STM32 zu setzen und zum Auslesen der Aufwachzeit für commands.conf.


    Aktuelle Firmware Sourcen
    F103:
    mangels Hardware leider völlig ungetestet, vermutlich mit Fehlern, prealpha, fürs LED toggeln reicht es hoffentlich ;)
    IR in vom TSOP an A6
    Toggle LED an B12
    IR Sendediode an B6
    Einschalter an B7 und über USB
    Logging an B10
    F105:
    IR in vom TSOP an C6