<br />
<b>Warning</b>:  Undefined array key "HTTPS" in <b>/var/www/vhosts/eiseler.com/httpdocs/wordpress/wp-config.php</b> on line <b>87</b><br />
{"id":417,"date":"2013-10-29T00:15:11","date_gmt":"2013-10-28T23:15:11","guid":{"rendered":"http:\/\/eiseler.synology.me\/wordpress\/?p=417"},"modified":"2013-10-29T10:58:55","modified_gmt":"2013-10-29T09:58:55","slug":"arduino-controlling-lego-4x4-powerfunctions-ir","status":"publish","type":"post","link":"http:\/\/www.eiseler.com\/wordpress\/?p=417","title":{"rendered":"Arduino controlling Lego 4&#215;4 (Powerfunctions IR)"},"content":{"rendered":"<p><a href=\"https:\/\/i0.wp.com\/eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg\"><img data-attachment-id=\"418\" data-permalink=\"http:\/\/www.eiseler.com\/wordpress\/?attachment_id=418\" data-orig-file=\"https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg?fit=2448%2C3264\" data-orig-size=\"2448,3264\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;2.4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 5&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1382893348&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.12&quot;,&quot;iso&quot;:&quot;200&quot;,&quot;shutter_speed&quot;:&quot;0.05&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Lego 4&#215;4 Offroader\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg?fit=225%2C300\" data-large-file=\"https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg?fit=640%2C853\" decoding=\"async\" loading=\"lazy\" class=\"alignright size-medium wp-image-418\" alt=\"Lego 4x4 Offroader\" src=\"https:\/\/i0.wp.com\/eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563-225x300.jpg?resize=225%2C300\" width=\"225\" height=\"300\" srcset=\"https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg?resize=225%2C300 225w, https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg?resize=768%2C1024 768w, https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg?w=1280 1280w, https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg?w=1920 1920w\" sizes=\"(max-width: 225px) 100vw, 225px\" data-recalc-dims=\"1\" \/><\/a>For the evenings at late summer holidays on a small island in the German north sea I bought a <a href=\"http:\/\/www.amazon.de\/gp\/product\/B006ZS4SXQ\/ref=as_li_ss_tl?ie=UTF8&amp;camp=1638&amp;creative=19454&amp;creativeASIN=B006ZS4SXQ&amp;linkCode=as2&amp;tag=eiselerde-21\">Lego 4&#215;4 Offroader<\/a> to build with the kids. The truck has 4&#215;4 driving and steering, and is controlled by an ir remote. Coming home with the built truck\u00a0 I was curious whether I could use an arduino to control the car.<\/p>\n<p>So let&#8217;s share what I found out:\u00a0The truck uses the Lego power functions (<a href=\"http:\/\/www.philohome.com\/pf\/pf.htm\">info<\/a>). One could use wiring to control it, but since I got some experience with ir control, I tried it this way, so no physical connection is needed. I found three libraries out there to control Lego power functions with the arduino and ended with this one: <a href=\"https:\/\/github.com\/schultzy51\/LEGOPowerFunctions\">LEGOPowerFunctions<\/a>. To get it to run I had to insert the line &#8222;#include &lt;Arduino.h&gt; in the legopowerfunctions.h file. After that everything worked fine. Spending a lot of time with soldering in the last projects I also wanted to try a system without soldering, so I gave the <a href=\"http:\/\/www.seeedstudio.com\/wiki\/index.php?title=Main_Page#Grove\">grove<\/a> system from seeed a try. For a small prove of concept I used an <a href=\"http:\/\/www.seeedstudio.com\/wiki\/Grove_-_Infrared_Emitter\">IR Emitter<\/a>, a <a href=\"http:\/\/www.seeedstudio.com\/wiki\/Grove_-_Serial_LCD_V1.1\">LCD Display<\/a> (for debugging),\u00a0 a <a href=\"http:\/\/www.seeedstudio.com\/wiki\/Grove_-_LED_Bar\">LED-Bar<\/a> and an ultrasonic range sensor. And here is the (simple) code which you can use as start. It simply drives the truck forward and backs up and turn if it is approaching\u00a0 a wall. It also gives some simple debugging info on LCD and the LED-Bar.<\/p>\n<p>&nbsp;<\/p>\n<p><iframe loading=\"lazy\" style=\"width: 120px; height: 240px;\" src=\"http:\/\/rcm-eu.amazon-adsystem.com\/e\/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=eiselerde-21&amp;o=3&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B006ZS4SXQ\" height=\"240\" width=\"320\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<pre class=\"brush: c; gutter: true\">define TRIGGER_PIN  2  \/\/12  \/\/ Arduino pin tied to trigger pin on ping sensor.\r\n#define ECHO_PIN     3  \/\/11  \/\/ Arduino pin tied to echo pin on ping sensor.\r\n\r\n#include \r\n\r\n#include \r\n#include  \/\/this is a must\r\n#include &quot;LED_Bar.h&quot;\r\n\r\nLED_Bar myLED;\r\n\r\n\/\/ IR led on port 13\r\n\/\/LEGOPowerFunctions lego(13);\r\nLEGOPowerFunctions lego(5);\r\n\r\nint timeout, count;\r\nunsigned long int distance;\r\n\r\nSerialLCD slcd(6,7);\/\/this is a must, assign soft serial pins\r\n\r\nvoid setup()\r\n{           \r\n\r\n  myLED.set_LED_Index(0b000001101010101);\r\n  \/\/Ping\r\n  pinMode(TRIGGER_PIN, OUTPUT);     \r\n  pinMode(ECHO_PIN, INPUT);\r\n\r\n  slcd.begin();\r\n  \/\/ Print a message to the LCD.\r\n  slcd.print(&quot;hello, world!&quot;);\r\n  delay(3000);\r\n}\r\n\r\nvoid loop()\r\n{\r\n  while(1){\r\n\r\n    distance = pingIt();  \r\n\r\n    if (distance &lt;= 40) {\r\n      slcd.setCursor(0, 1);\r\n      slcd.print(&quot;Rueckwaerts  &quot;);\r\n      lego.ComboPWM(PWM_FWD7, PWM_REV6, CH2); \/\/\r\n      delay(700);\r\n    } \r\n    else\r\n    {\r\n      slcd.setCursor(0, 1);\r\n      slcd.print(&quot;Forward  &quot;);\r\n      lego.ComboPWM(PWM_FLT, PWM_FWD6, CH2); \/\/Forward 4WD\r\n      delay(700);\r\n    }  \r\n\r\n  }\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;PWM_FWD3  &quot;);\r\n  lego.ComboPWM(PWM_FLT, PWM_FWD3, CH2); \/\/Forward 4WD\r\n  pingIt();\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;PWM_FWD4  &quot;);\r\n  lego.ComboPWM(PWM_FWD7, PWM_FWD4, CH2); \/\/Forward 4WD\r\n  pingIt();\r\n  delay(1000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;PWM_FWD5  &quot;);\r\n  lego.ComboPWM(PWM_REV7, PWM_FWD5, CH2); \/\/Forward 4WD\r\n  pingIt();\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;PWM_FWD6  &quot;);\r\n  lego.ComboPWM(PWM_FLT, PWM_FWD6, CH2); \/\/Forward 4WD\r\n  pingIt();\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;PWM_FWD7  &quot;);\r\n  lego.ComboPWM(PWM_FLT, PWM_FWD7, CH2); \/\/Forward 4WD\r\n  pingIt();\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;ComboMode  &quot;);\r\n  lego.ComboMode(RED_FWD, BLUE_FWD, CH2);\r\n  pingIt();\r\n  delay(3000);\r\n\r\n  \/\/ }\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;zwei  &quot;);  \r\n  lego.ComboMode(PWM_FLT, PWM_FWD4, CH2); \/\/Left Backward\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;drei  &quot;);\r\n  lego.ComboMode(PWM_FLT, PWM_FWD7, CH2); \/\/Left Forward\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;vier   &quot;);\r\n  lego.ComboMode(PWM_FLT, PWM_BRK, CH2); \/\/Right Forward\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;fuenf  &quot;);\r\n  lego.ComboMode(PWM_FLT, PWM_REV4, CH2); \/\/ Right Backward Not Working\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;sechs   &quot;);\r\n\r\n  lego.ComboMode(PWM_FLT, PWM_REV1, CH2); \/\/Forward 4WD\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;sieben   &quot;);  \r\n  lego.ComboMode(PWM_FLT, PWM_REV7, CH2); \/\/Left Backward\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;acht   &quot;);\r\n  lego.ComboMode(PWM_FWD2, PWM_FLT, CH2); \/\/Left Forward\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;neun   &quot;);\r\n  lego.ComboMode(PWM_REV4, PWM_FLT, CH2); \/\/Right Forward\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;zehn   &quot;);\r\n  lego.ComboMode(PWM_FWD3, PWM_FWD3, CH2); \/\/ Right Backward Not Working\r\n  delay(3000);\r\n\r\n  slcd.setCursor(0, 1);\r\n  slcd.print(&quot;zehn   &quot;);\r\n  lego.ComboMode(PWM_FWD3, PWM_FWD3, CH2); \/\/ Right Backward Not Working\r\n  delay(3000);\r\n\r\n  \/*\r\n\r\n   timeout = 5; \/\/ 5 secs\r\n   count = 0;\r\n   while(timeout &gt; 0)\r\n   {\r\n   \/\/lego.ComboPWM(PWM_REV4, PWM_FWD4, CH2); \/\/ 50% speed\r\n   lego.ComboPWM(PWM_FLT, PWM_FWD4, CH2); \/\/ 50% speed\r\n   delay(100);\r\n\r\n   if (count++ == 1)\r\n   {\r\n   timeout--;\r\n   count = 0;\r\n   }\r\n\r\n   }\r\n   lego.ComboPWM(PWM_FLT, PWM_FLT, CH2); \/\/ stop\r\n   delay(1000);\r\n   timeout = 3; \/\/ 5 secs\r\n   count = 0;\r\n   *\/\r\n  \/*\r\n  while(timeout &gt; 0)\r\n   {\r\n   lego.ComboMode(RED_FWD, BLUE_FWD, CH2);  \/\/ turn\r\n   delay(100);\r\n   if (count++ == 10)\r\n   {\r\n   timeout--;\r\n   count = 0;\r\n   }\r\n   }\r\n   *\/\r\n}\r\n\r\nlong unsigned int pingIt(){\r\n  \/\/ Start Ranging\r\n  long unsigned int distance;\r\n  int ii;\r\n\r\n  digitalWrite(TRIGGER_PIN, LOW);\r\n  delayMicroseconds(2);  \/\/4 2\r\n  digitalWrite(TRIGGER_PIN, HIGH);\r\n  delayMicroseconds(10); \/\/20 10  5\r\n  digitalWrite(TRIGGER_PIN, LOW);\r\n  \/\/ Compute distance\r\n  distance = pulseIn(ECHO_PIN, HIGH);\r\n  distance= distance\/58;\r\n\r\n  myLED.set_LED_Range(ledBarRange(distance));\r\n\r\n  slcd.setCursor(0, 0);\r\n  slcd.print(&quot;         &quot;);\r\n\r\n  slcd.setCursor(0, 0);\r\n  slcd.print(distance, DEC);\r\n  \/\/lcd_print(0, &quot;Ping&quot;);\r\n  \/\/lcd_print_special(turn, distance);\r\n  \/\/distanceLeds(distance);\r\n  return distance;\r\n}\r\n\r\nint ledBarRange(long unsigned int aD){\r\n  if (aD &lt;= 5) return 10;\r\n  if (aD &lt;= 10) return 9;\r\n  if (aD &lt;= 15) return 8;\r\n  if (aD &lt;= 20) return 7;\r\n  if (aD &lt;= 30) return 6;\r\n  if (aD &lt;= 40) return 5;\r\n  if (aD &lt;= 50) return 4;\r\n  if (aD &lt;= 70) return 3;\r\n  if (aD &lt;= 90) return 2;\r\n  return 1; \r\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For the evenings at late summer holidays on a small island in the German north sea I bought a Lego 4&#215;4 Offroader to build with the kids. The truck has 4&#215;4 driving and steering, and is controlled by an ir remote. Coming home with the built truck\u00a0 I was curious whether I could use an&#8230;<\/p>\n","protected":false},"author":4,"featured_media":418,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":[]},"categories":[6,26,5],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2013\/10\/IMG_5563.jpg?fit=2448%2C3264","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8zCJ2-6J","jetpack-related-posts":[{"id":670,"url":"http:\/\/www.eiseler.com\/wordpress\/?p=670","url_meta":{"origin":417,"position":0},"title":"Duplo Train with Arduino","date":"24\/01\/2017","format":false,"excerpt":"(Re-)Found a video from my Duplo Arduino Train: https:\/\/www.youtube.com\/watch?v=NK9jH1OX3CI","rel":"","context":"In &quot;Arduino&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.eiseler.com\/wordpress\/wp-content\/uploads\/2017\/01\/2019-08-19-09_49_01-Duplo-Train-with-Arduino-\u2013-News-aus-Mering.jpg?fit=422%2C265&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":466,"url":"http:\/\/www.eiseler.com\/wordpress\/?p=466","url_meta":{"origin":417,"position":1},"title":"New Toy: Nano QX","date":"16\/11\/2013","format":false,"excerpt":"A new toy arrived. A Blade Nano QX. First flights managed successfully. Short Movie (edited with iPad): http:\/\/www.youtube.com\/watch?v=30hy1jK0vzQ","rel":"","context":"In &quot;Gadgets&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/30hy1jK0vzQ\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]}],"_links":{"self":[{"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/417"}],"collection":[{"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=417"}],"version-history":[{"count":9,"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/417\/revisions"}],"predecessor-version":[{"id":428,"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/417\/revisions\/428"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/418"}],"wp:attachment":[{"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=417"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.eiseler.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}