{"id":2224,"date":"2017-06-20T13:37:13","date_gmt":"2017-06-20T11:37:13","guid":{"rendered":"https:\/\/makerspace-rheinfelden.ch\/blog\/?p=2224"},"modified":"2017-07-14T16:29:05","modified_gmt":"2017-07-14T14:29:05","slug":"leds-leds-leds","status":"publish","type":"post","link":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/","title":{"rendered":"LEDs, LEDs, LEDs, \u2026"},"content":{"rendered":"<p>Nachdem wir im <a href=\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/lasst-die-led-blinken\/\">letzten Artikel<\/a> eine einzige LED mit einem 555 Timer haben blinken lassen, wird es Zeit f\u00fcr mehr LEDs, viel mehr LEDs!!!<\/p>\n<p><!--more--><\/p>\n<p>Viele kennen vermutlich die WS2812B LED Streifen, manchmal auch Neopixel genannt. Diese LEDs sind sehr speziell, da \u00fcber eine einzige Datenleitung praktisch beliebig viele LEDs angesteuert werden k\u00f6nnen. So habe ich zum Beispiel <a href=\"https:\/\/makerspace-rheinfelden.ch\/blog\/2016\/04\/wort-uhr-teil-2-elektronik-und-fraesen\/\">bei meiner Wortuhr<\/a> eine einzige Datenleitung genutzt um die 114 LEDs anzusteuern. Das funktioniert, da in jeder einzigen LED ein kleine Chip eingebaut ist, der die ersten drei empfangenen Bytes f\u00fcr sich selbst beansprucht und alle anderen Daten danach weiterleitet an die n\u00e4chste LED.<\/p>\n<p>Nun gab es leider keine Library, f\u00fcr <a href=\"http:\/\/jeelabs.org\/2016\/02\/dive-into-forth\/\">Forth<\/a> und ich setzt in letzter Zeit nur noch auf Forth auf STM32 Mikrocontroller. Nun denn, schreiben wir halt selbst eine Library. Dazu war es wichtig zuerst das Format der \u00fcbertragenen Daten zu verstehen. Zum Gl\u00fcck gibt es im Internet bereits <a href=\"https:\/\/wp.josh.com\/2014\/05\/13\/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them\/\">gute Beschreibungen<\/a>.<\/p>\n<p>Ich wollte aber nicht die einzelnen Bits *von Hand* \u00fcbertragen, wie es im oben verlinkten Artikel gemacht wird. Mein Ziel war es, dass der Mikrocontroller selbstst\u00e4ndig die Daten \u00fcbertr\u00e4gt und das im Hintergrund. Zwei Technologien sind dazu notwendig.<\/p>\n<p>SPI: &#8222;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Serial_Peripheral_Interface\">Serial Peripheral Interface<\/a>&#8220; ist gedacht zur Kommunikation mit anderen ICs auf der Platine. Die Geschwindigkeit ist super (mehrere MHz) und die Unterst\u00fctzung durch Hardware ist gegeben. SPI ist in der Lage ein mit WS2812B kompatibles Bitmuster auszugeben. Bei 4.5MHz SPI-Rate wird das Bitmuster 110 als eine 1 gesehen von den Neopixel und das Bitmuster 100 als eine 0. Heisst also, dass wir 3x mehr Daten schicken m\u00fcssen wegen dieser Kodierung \u2013 kein Problem f\u00fcr einen STM32 mit 64kB RAM.<\/p>\n<p>DMA: &#8222;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Speicherdirektzugriff\">Direct Memory Access<\/a>&#8220; erlaubt einem Mikrocontroller im Hintergrund Aufgaben abzuarbeiten, ohne die CPU zu belasten. Und genau das kommt zum Einsatz um die im Arbeitsspeicher abgelegten Bitmuster direkt auf dem SPI Bus auszugeben.<\/p>\n<p>Der DMA Controller kann die Daten nicht mehr ver\u00e4ndern, das heisst, diese m\u00fcssen genau so im Arbeitsspeicher liegen, wie sie ausgegeben werden. Also muss auch im Arbeitsspeicher bereits dieses 3-Bit Muster f\u00fcr jedes Bit abgelegt werden. Aber wie bereits erw\u00e4hnt hat der STM32F103 gen\u00fcgend Arbeitsspeicher um auch so noch \u00fcber Tausend LEDs anzusprechen.<\/p>\n<div id=\"attachment_2225\" style=\"width: 260px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46.png\" rel=\"lightbox[2224]\"><img aria-describedby=\"caption-attachment-2225\" loading=\"lazy\" class=\"wp-image-2225 size-medium\" src=\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46-250x40.png\" alt=\"SPI f\u00fcr WS2812B\" width=\"250\" height=\"40\" srcset=\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46-250x40.png 250w, https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46-768x123.png 768w, https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46-700x112.png 700w, https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46-600x96.png 600w, https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46-120x19.png 120w, https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46.png 1035w\" sizes=\"(max-width: 250px) 100vw, 250px\" \/><\/a><p id=\"caption-attachment-2225\" class=\"wp-caption-text\">SPI f\u00fcr WS2812B<\/p><\/div>\n<p>Das Bildschirmfoto oben zeigt, wie jeweils 8x 3-Bit als ein Byte angesehen werden von den LEDs. Wer kann mir sagen, was f\u00fcr eine Farbe diese LED zeigt?<\/p>\n<h2>Fazit<\/h2>\n<p>Das Schreiben so einer Library f\u00fcr Forth war f\u00fcr mich ein guter Wiedereinstieg in Forth nach einer l\u00e4ngeren Pause. Auch war es spannend zum ersten Mal DMA f\u00fcr solch eine Aufgabe einzusetzen. Ich bezeichne die aktuelle Version dieser Library als 1.0 \u2013 sie l\u00e4uft, hat aber Potenzial f\u00fcr Verbesserungen. Die Datei liegt auf <a href=\"https:\/\/github.com\/tht\/forth-stuff\/blob\/master\/ws2812b\/ws2812b.fs\">Github<\/a>. Und wurde f\u00fcr die\u00a0<a href=\"http:\/\/embello.jeelabs.org\/flib\/\" class=\"broken_link\">Forth-Laufzeitumgebung von jeelabs.org<\/a>\u00a0geschrieben.<\/p>\n<h2>Verbesserungen?<\/h2>\n<p>Nat\u00fcrlich sind immer Verbesserungen m\u00f6glich. Eine Idee ist, den DMA-Controller in den Cycle-Mode zu schalten und nur immer die selben 18 Bytes auszugeben. Da der DMA-Controller einen Interrupt ausl\u00f6sen kann beim Erreichen der Mitte und dem Ende des Speicherbereichs k\u00f6nnte man immer jeweils die n\u00e4chsten Bytes in den gerade ungenutzten Bereich des DMA-Bereiches \u00fcbertragen. Das ginge ungef\u00e4hr so:<\/p>\n<ol>\n<li>Die ersten beiden LEDs in das 3-Bit Format f\u00fcr die SPI Ausgabe konvertieren und in die 18 Bytes DMA-Bereich schreiben.<\/li>\n<li>DMA-\u00dcbertragung starten<\/li>\n<li>Nun folgt der Mid-Transfer Interrupt, sobald die ersten 9 Bytes \u00fcbertragen wurden. In diesem Interrupt Handler werden nun also die ersten 9 Bytes ausgetauscht mit den 9 Bytes f\u00fcr die dritte LED.<\/li>\n<li>Sp\u00e4ter folgt der End-Transfer Interrupt, wenn auch die zweiten 9 Bytes \u00fcbertragen wurden. Der DMA-Controller ist im Cycle-Mode, beginnt also sofort von vorne mit den eben geschriebene Bytes der dritten LED. Wir nutzen den Interrupt Handler zum Schreiben der vierten LED in den zweiten Teil des DMA-Memories.<\/li>\n<li>usw\u2026 bis alle LEDs \u00fcbertragen wurden.<\/li>\n<\/ol>\n<p>So braucht man nicht mehr 9 Bytes Arbeitsspeicher pro LED sondern nur noch 3 Bytes (ein Byte pro Grundfarbe). Daf\u00fcr hat die CPU mehr zu tun, da diese alle 3.2\u00b5s ein neues Byte bereit haben muss f\u00fcr den Transfer. Das sind aber \u00fcber 2000 CPU-Zyklen bei der 72MHz CPU und sollte gut reichen. Aber ob das der Aufwand wert ist f\u00fcr diese paar WS2812B LEDs?<\/p>\n","protected":false},"excerpt":{"rendered":"Nachdem wir im letzten Artikel eine einzige LED mit einem 555 Timer haben blinken lassen, wird es Zeit f\u00fcr mehr LEDs, viel mehr LEDs!!!","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[3,24],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v17.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LEDs, LEDs, LEDs, \u2026 - Makerspace FabLab Rheinfelden\" \/>\n<meta property=\"og:description\" content=\"Nachdem wir im letzten Artikel eine einzige LED mit einem 555 Timer haben blinken lassen, wird es Zeit f\u00fcr mehr LEDs, viel mehr LEDs!!!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/\" \/>\n<meta property=\"og:site_name\" content=\"Makerspace FabLab Rheinfelden\" \/>\n<meta property=\"article:published_time\" content=\"2017-06-20T11:37:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-07-14T14:29:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46-250x40.png\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Thomas\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#website\",\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/\",\"name\":\"Makerspace FabLab Rheinfelden\",\"description\":\"Webseite des Vereins Makerspace Fablab Rheinfelden\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#primaryimage\",\"inLanguage\":\"de\",\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46.png\",\"contentUrl\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46.png\",\"width\":1035,\"height\":166,\"caption\":\"SPI f\\u00fcr WS2812B\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#webpage\",\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/\",\"name\":\"LEDs, LEDs, LEDs, \\u2026 - Makerspace FabLab Rheinfelden\",\"isPartOf\":{\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#primaryimage\"},\"datePublished\":\"2017-06-20T11:37:13+00:00\",\"dateModified\":\"2017-07-14T14:29:05+00:00\",\"author\":{\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#\/schema\/person\/188b0e4e97fe9b53bb9144561896e487\"},\"breadcrumb\":{\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LEDs, LEDs, LEDs, \\u2026\"}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#\/schema\/person\/188b0e4e97fe9b53bb9144561896e487\",\"name\":\"Thomas\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2016\/01\/DSC_2415_A-small-120x120.jpg\",\"contentUrl\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2016\/01\/DSC_2415_A-small-120x120.jpg\",\"caption\":\"Thomas\"},\"url\":\"https:\/\/makerspace-rheinfelden.ch\/blog\/author\/tht\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"de_DE","og_type":"article","og_title":"LEDs, LEDs, LEDs, \u2026 - Makerspace FabLab Rheinfelden","og_description":"Nachdem wir im letzten Artikel eine einzige LED mit einem 555 Timer haben blinken lassen, wird es Zeit f\u00fcr mehr LEDs, viel mehr LEDs!!!","og_url":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/","og_site_name":"Makerspace FabLab Rheinfelden","article_published_time":"2017-06-20T11:37:13+00:00","article_modified_time":"2017-07-14T14:29:05+00:00","og_image":[{"url":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46-250x40.png"}],"twitter_card":"summary","twitter_misc":{"Verfasst von":"Thomas","Gesch\u00e4tzte Lesezeit":"4\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#website","url":"https:\/\/makerspace-rheinfelden.ch\/blog\/","name":"Makerspace FabLab Rheinfelden","description":"Webseite des Vereins Makerspace Fablab Rheinfelden","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/makerspace-rheinfelden.ch\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"ImageObject","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#primaryimage","inLanguage":"de","url":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46.png","contentUrl":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2017\/06\/Bildschirmfoto-2017-06-20-um-13.20.46.png","width":1035,"height":166,"caption":"SPI f\u00fcr WS2812B"},{"@type":"WebPage","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#webpage","url":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/","name":"LEDs, LEDs, LEDs, \u2026 - Makerspace FabLab Rheinfelden","isPartOf":{"@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#primaryimage"},"datePublished":"2017-06-20T11:37:13+00:00","dateModified":"2017-07-14T14:29:05+00:00","author":{"@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#\/schema\/person\/188b0e4e97fe9b53bb9144561896e487"},"breadcrumb":{"@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/2017\/06\/leds-leds-leds\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/makerspace-rheinfelden.ch\/blog\/"},{"@type":"ListItem","position":2,"name":"LEDs, LEDs, LEDs, \u2026"}]},{"@type":"Person","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#\/schema\/person\/188b0e4e97fe9b53bb9144561896e487","name":"Thomas","image":{"@type":"ImageObject","@id":"https:\/\/makerspace-rheinfelden.ch\/blog\/#personlogo","inLanguage":"de","url":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2016\/01\/DSC_2415_A-small-120x120.jpg","contentUrl":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-content\/uploads\/2016\/01\/DSC_2415_A-small-120x120.jpg","caption":"Thomas"},"url":"https:\/\/makerspace-rheinfelden.ch\/blog\/author\/tht\/"}]}},"_links":{"self":[{"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/posts\/2224"}],"collection":[{"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/comments?post=2224"}],"version-history":[{"count":3,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/posts\/2224\/revisions"}],"predecessor-version":[{"id":2304,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/posts\/2224\/revisions\/2304"}],"wp:attachment":[{"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/media?parent=2224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/categories?post=2224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/makerspace-rheinfelden.ch\/blog\/wp-json\/wp\/v2\/tags?post=2224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}