{"id":1503,"date":"2012-11-04T17:57:37","date_gmt":"2012-11-04T17:57:37","guid":{"rendered":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=1503"},"modified":"2013-11-16T10:34:27","modified_gmt":"2013-11-16T10:34:27","slug":"pingpong-lampe-mit-arduino","status":"publish","type":"post","link":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=1503","title":{"rendered":"Pingpong-Lampe mit Arduino"},"content":{"rendered":"<h1>Projektziel<\/h1>\n<div id=\"attachment_1505\" style=\"width: 310px\" class=\"wp-caption alignright\"><a href=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/20121104_140236.jpg\"><img aria-describedby=\"caption-attachment-1505\" decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1505 \" title=\"Arduino-Pingpong-Lampe mit Farbwechsel\" src=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/20121104_140236-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/20121104_140236-300x225.jpg 300w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/20121104_140236-150x112.jpg 150w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/20121104_140236-400x300.jpg 400w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/20121104_140236.jpg 600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1505\" class=\"wp-caption-text\">Arduino-Pingpong-Lampe mit Farbwechsel<\/p><\/div>\n<p>Die Erw\u00e4hnung von Pingpongb\u00e4llen im Arduino-Buch animierte mich zu diesem Projekt. Ziel ist es, ein <strong>RGB-L\u00e4mpchen<\/strong> mit einem aufgeschnittenen <strong>Pingpong-Ball als Lampenschirm<\/strong> zu basteln. Die Lampe soll selbstverst\u00e4ndlich die Farbe wechseln. Sie hat zus\u00e4tzlich einen Kipp-Schalter zum an- und abschalten und ein Potentiometer, mit dem man den Farbwechsel beschleunigen oder verlangsamen kann.<\/p>\n<h1>Komponenten<\/h1>\n<ul>\n<li>1 Arduino UNO<\/li>\n<li>1 Steckbrett<\/li>\n<li>diverse Jumperkabel M\/M<\/li>\n<li>1 RGB-LED<\/li>\n<li>3 Widerst\u00e4nde 560 Ohm (Gr\u00fcn-Blau-Braun)<\/li>\n<li>1 Potentiometer<\/li>\n<li>1 Kippschalter (z.B. von Modelleisenbahn)<\/li>\n<li>1 aufgeschnittener weisser Tennisball<\/li>\n<\/ul>\n<h1>Best\u00fcckungsplan<\/h1>\n<p>Der Best\u00fcckungsplan braucht keinen grossen Kommentar: oben ist der Kippschalter, unten das Potentiometer. Wichtig ist, dass man die Widerst\u00e4nde f\u00fcr die RGB-Beinchen des LEDs nicht vergisst.<\/p>\n<div id=\"attachment_1504\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/RGBLED_Steckplatine_600.jpg\"><img aria-describedby=\"caption-attachment-1504\" decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1504 \" title=\"Best\u00fcckungsplan f\u00fcr RGB-LED mit Schalter und Potentiometer\" src=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/RGBLED_Steckplatine_600-300x221.jpg\" alt=\"\" width=\"300\" height=\"221\" srcset=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/RGBLED_Steckplatine_600-300x221.jpg 300w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/RGBLED_Steckplatine_600-150x110.jpg 150w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/RGBLED_Steckplatine_600-400x295.jpg 400w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/11\/RGBLED_Steckplatine_600.jpg 600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1504\" class=\"wp-caption-text\">Best\u00fcckungsplan f\u00fcr RGB-LED mit Schalter und Potentiometer<\/p><\/div>\n<p>Und falls sich jemand fragt, was das Schwarze unter dem Pingpong-Ball ist: Aus dem Styropor einer Pizzaverpackung habe ich der Lampe ein kleines Podest gebastelt. Erstaunlich, wie man Verpackungsm\u00fcll kreativ umnutzen kann!<\/p>\n<h1>Code<\/h1>\n<p>Der Code ist f\u00fcr den Farbwechsel des RGB-LED zust\u00e4ndig. Der aus dem Potentiometer ausgelesene Wert wird dabei in einen Delay von 1 bis 100 umgerechnet. Und je nach Farbprogramm wird dieser Wert noch mit einem Delay-Faktor verrechnet, denn bei einem Farbverlauf mit 255 Schritten macht ein Delay von 100 Sinn, aber bei einem Wechsel zwischen 6 Farben wird ein solch kurzer Delay ziemlich hektisch.<\/p>\n<p>\u00dcbrigens noch ein kleiner Stolperstein, wenn man die L\u00e4nge eines zweidimensionaen Arrays mit sizeof misst: sizeof gibt die L\u00e4nge in Byte des gesamten Arrays zur\u00fcck! Wenn ich also ein Array mit 6 Farben \u00e0 je 3 Farbwerten habe und diese als Integer-Typen definiert habe, dann muss ich <strong>sizeof(meinArray) \/ (L\u00e4nge des inneren Array * 2) <\/strong>rechnen, um die effektive L\u00e4nge zu erhalten, weil ein Array 2 Byte lang ist!<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint length = sizeof(colorSequence) \/ (3 * 2);\r\n<\/pre>\n<p>Das reicht aber noch nicht: Mein Code funktionierte wunderbar, bis ich das sizeof-Statement dahin verschob, wo es eigentlich hingeh\u00f6rt, n\u00e4mlich in die Methode playColorSequence. Und siehe da, es ging gar nichts mehr. Mit Serial.print fand ich heraus, dass der Wert pl\u00f6tzlich 0 wird. Erst Google half mir weiter. Unter <a href=\"http:\/\/www.hackerboard.de\/code-kitchen\/36875-c-array-uebergeben.html\" target=\"_blank\">http:\/\/www.hackerboard.de\/code-kitchen\/36875-c-array-uebergeben.html<\/a> fand ich den sch\u00f6nen Satz: &#8220;hierbei ist zu beachten das sizeof(menge)\/sizeof(int) bei arrays zur gr\u00f6\u00dfenbestimmung <strong>nur funktioniert wenn sie im selben bereich deklariert wurden,<\/strong> sonst geht das ganze nach hinten los.&#8221; Langsam begreife ich, weshalb Leute C hassen!<br \/>\nDer Code f\u00fcr den Farbwechsel enth\u00e4lt im Moment 2 Varianten:<\/p>\n<ul>\n<li><strong>playColorSequence<\/strong>: fixe Abfolge von Farben, z.B. Rot, Gr\u00fcn, Blau, oder Rot, Gelb, Gr\u00fcn, Cyan (Hellblau), Blau, Magenta<\/li>\n<li><strong>continuousColorChange<\/strong>: Farbverlauf von Rot \u00fcber Gr\u00fcn zu Blau und zur\u00fcck zu Rot<\/li>\n<\/ul>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/*\r\n * RGB-LED with color change\r\n * - with toggle switch\r\n * - tempo of color change regulated by potentiometer\r\n * Author: Silvia Rothen, rothen ecotronics, Bern, Switzerland\r\n * https:\/\/blog.ecotronics.ch\/wordpress\/category\/physical-computing\/\r\n *\/\r\n\r\nint ledAnalogOne[] = {3, 5, 6}; \/\/3 PWM-LEDs: 3 Rot, 5 Gr\u00fcn, 6 Blau\r\n\r\nint colorSequenceRGB[3][3] = {{255, 0, 0}, {0, 255, 0}, {0, 0, 255}};\r\nint colorSequence[6][3] = {{255, 0, 0}, {255, 255, 0}, {0, 255, 0},\r\n  {0, 255, 255}, {0, 0, 255}, {255, 0, 255}};\r\n\/\/Poti bestimmt Delay\r\nint sensorPin = A0;    \/\/ select the input pin for the potentiometer\r\n\r\nint red = 0;\r\nint green = 0;\r\nint blue = 0;\r\nint mydelay = 100;\r\nint analogIn = 0;\r\n\r\nbyte  black[] = {0, 0, 0};\r\n\r\nvoid setup(){\r\n  Serial.begin(9600);\r\n  for(int i = 0; i &lt; 3; i++){\r\n   pinMode(ledAnalogOne[i], OUTPUT);   \/\/Set the three LED pins as outputs\r\n  }\r\n  setColor(ledAnalogOne, black);\r\n}\r\n\r\nvoid loop(){\r\n  \/\/geht nicht anders, sizeof funktioniert nur hier!\r\n  int lengthRGB = sizeof(colorSequenceRGB) \/ (3 * 2);\r\n  onlyRGB(lengthRGB);\r\n\r\n  int length = sizeof(colorSequence) \/ (3 * 2);\r\n  playColorSequence(colorSequence, length);\r\n  \/\/continuousColorChange();\r\n}\r\n\r\nvoid playColorSequence(int colorSequence[][3], int length) {\r\n  Serial.print(&quot;Length: &quot;);\r\n  Serial.println(length);\r\n  for (int counter =  0; counter &lt; length; counter++){\r\n   changeColor(colorSequence[counter][0],\r\n      colorSequence[counter][1],\r\n      colorSequence[counter][2], 5);\r\n  }\r\n}\r\n\r\nvoid onlyRGB(int length) {\r\n  playColorSequence(colorSequenceRGB, length);\r\n}\r\n\r\nvoid continuousColorChange() {\r\n  \/\/Red to green\r\n  for (int counter =  0; counter &lt; 256; counter++){\r\n    changeColor(255 - counter, counter, 0, 1);\r\n  }\r\n  \/\/Green to blue\r\n  for (int counter =  0; counter &lt; 256; counter++){\r\n    changeColor(0, 255 - counter, counter, 1);\r\n  }\r\n  \/\/Blue to Red\r\n  for (int counter =  0; counter &lt; 256; counter++){\r\n    changeColor(counter, 0, 255 - counter, 1);\r\n  }\r\n}\r\n\r\nvoid changeColor(int red, int green, int blue, int delayfactor) {\r\n  \/\/read the delay from potentiometer\r\n  analogIn = analogRead(sensorPin);\r\n  mydelay = analogIn \/ 10;\r\n  if (mydelay &lt; 1) { mydelay = 1;}\r\n  if (mydelay &gt; 100) { mydelay = 100;}\r\n\r\n  \/\/change the colors\r\n  byte color[] = {red, green, blue};\r\n  printToSerial(color);\r\n  setColor(ledAnalogOne, color);\r\n  delay(mydelay * delayfactor);\r\n}\r\n\r\nvoid setColor(int* led, byte* color){\r\n for(int i = 0; i &lt; 3; i++){             \/\/Iteration durch die 3 Pins\r\n   analogWrite(led[i], 255 - color[i]);\r\n }\r\n}\r\n\r\n\/\/prints input value and RGB values at the serial interface\r\n\/\/just for debugging\r\nvoid printToSerial(byte* color) {\r\n  Serial.print(&quot;Analog In: &quot;);\r\n  Serial.print(analogIn);\r\n  Serial.print(&quot;; Delay: &quot;);\r\n  Serial.print(mydelay);\r\n  Serial.print(&quot;; RGB: &quot;);\r\n  Serial.print(color[0]);\r\n  Serial.print(&quot;\/&quot;);\r\n  Serial.print(color[1]);\r\n  Serial.print(&quot;\/&quot;);\r\n  Serial.println(color[2]);\r\n}\r\n<\/pre>\n<h1>Demo<\/h1>\n<p>Im Video sieht man den Farbwechsel und den Frequenzwechsel beim Hochschrauben des Potentiometers.<br \/>\n<iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"http:\/\/www.youtube.com\/embed\/21RCSTCePPU\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Projektziel <\/p>\n<p id=\"caption-attachment-1505\" class=\"wp-caption-text\">Arduino-Pingpong-Lampe mit Farbwechsel<\/p>\n<p>Die Erw\u00e4hnung von Pingpongb\u00e4llen im Arduino-Buch animierte mich zu diesem Projekt. Ziel ist es, ein RGB-L\u00e4mpchen mit einem aufgeschnittenen Pingpong-Ball als Lampenschirm zu basteln. Die Lampe soll selbstverst\u00e4ndlich die Farbe wechseln. Sie hat zus\u00e4tzlich einen Kipp-Schalter zum an- und abschalten und ein Potentiometer, mit dem man den Farbwechsel beschleunigen [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":1505,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[160,244,158],"tags":[296,170,173,171,180,172],"_links":{"self":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1503"}],"collection":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1503"}],"version-history":[{"count":23,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1503\/revisions"}],"predecessor-version":[{"id":2457,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1503\/revisions\/2457"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/1505"}],"wp:attachment":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1503"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1503"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1503"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}