{"id":1492,"date":"2012-10-30T18:27:09","date_gmt":"2012-10-30T18:27:09","guid":{"rendered":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=1492"},"modified":"2012-11-22T09:33:52","modified_gmt":"2012-11-22T09:33:52","slug":"motor-uber-serielle-schnittstelle-steuern","status":"publish","type":"post","link":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=1492","title":{"rendered":"Motor \u00fcber serielle Schnittstelle steuern"},"content":{"rendered":"<p>Heute bin ich bei Arduino \u00fcber die erste richtige Knacknuss gestolpert. Die Aufgabenstellung schien einfach: die <strong>Geschwindigkeit <\/strong>eines Spielzeug-Gleichstrommotors soll \u00fcber die <strong>serielle Schnittstelle<\/strong> mit <strong>Werten von 0 bis 255<\/strong> ver\u00e4ndert werden. Die Hardware ist dieselbe wie gestern, der Pushbutton bleibt ohne Funktion. Hier noch einmal der Best\u00fcckungsplan f\u00fcr das Schaltbrett:<\/p>\n<div id=\"attachment_1479\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_Steckplatine.jpg\"><img aria-describedby=\"caption-attachment-1479\" decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1479\" title=\"Arduino-Motorsteuerung mit Pushbutton\" src=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_Steckplatine-300x187.jpg\" alt=\"\" width=\"300\" height=\"187\" srcset=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_Steckplatine-300x187.jpg 300w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_Steckplatine-150x93.jpg 150w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_Steckplatine-400x249.jpg 400w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_Steckplatine.jpg 600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1479\" class=\"wp-caption-text\">Arduino-Motorsteuerung mit Pushbutton<\/p><\/div>\n<p>Solange Arduino am PC h\u00e4ngt und die Entwicklungumgebung l\u00e4uft, kann man das direkt \u00fcber <strong>Tools &#8211; Serial monitor<\/strong> ausprobieren. Die erste H\u00fcrde waren die <strong>Datentypen <\/strong>und die <strong>Typenkonversion<\/strong>. Arduino versteht eben kein Java, auch wenn es zuerst fast so aussieht. Also musste ich mich erst mal schlau machen, welche Datentypen die Arduino-Sprache kennt und was mir die serielle Schnittstelle eigentlich schickt. W\u00e4hrend bei den Zahlen mein Javawissen funktionierte, gab es bei den Strings ein paar H\u00fcrden. Hier sind die Typen, die f\u00fcr die Aufgabe eine Rolle spielten:<\/p>\n<ul>\n<li><strong>char<\/strong>: einzelnes Zeichen, L\u00e4nge 1 Byte; aus der <strong>seriellen Schnittstelle <\/strong>kommen einzelne chars zur\u00fcck<\/li>\n<li><strong>Array of char (string)<\/strong>: Array von Einzelzeichen mit fixer L\u00e4nge;\u00a0 das ist der g\u00e4ngige Typ, um Strings in Arduino zu verarbeiten; klein, schlank und t\u00fcckisch, unten mehr davon<\/li>\n<li><strong>String-Objekt<\/strong>: w\u00fcrde eigentlich wieder Java entsprechen, mit komfortablen Methoden. Allerdings ist es mir nicht gelungen, die chars aus der Schnittstelle in einen String zu verketten. Die Werte waren absolut wild, ich vermute ein Zeichensatzproblem.<\/li>\n<\/ul>\n<div id=\"attachment_1496\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/CIRC03WithMaxbox_2012-10-30_145109.gif\"><img aria-describedby=\"caption-attachment-1496\" decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1496 \" title=\"Mit Serial Monitor aus Arduino IDE Motor steuern\" src=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/CIRC03WithMaxbox_2012-10-30_145109-300x262.gif\" alt=\"\" width=\"300\" height=\"262\" srcset=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/CIRC03WithMaxbox_2012-10-30_145109-300x262.gif 300w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/CIRC03WithMaxbox_2012-10-30_145109-150x131.gif 150w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/CIRC03WithMaxbox_2012-10-30_145109-400x350.gif 400w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/CIRC03WithMaxbox_2012-10-30_145109.gif 648w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1496\" class=\"wp-caption-text\">Mit Serial Monitor aus Arduino IDE Motor steuern<\/p><\/div>\n<p>Soweit war alles klar: aus der Schnittstelle mit <strong>Serial.read()<\/strong> in einer Schleife einzelne Zeichen abfischen, in ein Array of char f\u00fcllen, mit der Funktion <strong>atoi<\/strong> in einen Integer umwandeln und mit <strong>analogWrite<\/strong> an den Motor senden.<\/p>\n<p>Ich \u00f6ffne also den Monitor, gebe 70 ein. Das Mot\u00f6rchen beginnt tats\u00e4chlich zu schnurren. Nun erh\u00f6he ich auf 120, das Surren schwillt an. 150, 170, 190, alles klappt wie am Schn\u00fcrchen. Dann gehe ich zur\u00fcck auf 60. Upps! Statt abzubremsen l\u00e4uft der Motor so schnell wie noch nie!<\/p>\n<p>Nun kommt der harte Teil, debuggen mit\u00a0Arduino. Die einzige Methode, die ich bis jetzt kenne, erinnert ans gute alte ASP: mit Serial.println Werte auf dem Monitor ausgeben und nachdenken. Bald ist mir klar, dass bei der Eingabe von zweistelligen Zahlen die dritte Stelle aus dem vorangegangenen Durchlauf erhalten bleibt. Aus 60 wird somit 600.<\/p>\n<p>Wie dumm von mir, ich habe das <strong>Zur\u00fccksetzen der Array-Variable <\/strong>vergessen. Und genau hier laufe ich in den Hammer. S\u00e4mtliche Syntaxvarianten, die mir in Anlehnung an andere Sprachen in den Sinn kommen, funktionieren nicht. Entweder sie lassen sich nicht kompilieren oder sie werden ignoriert oder der Motor setzt sich gar nicht in Bewegung. Erst <strong>memset<\/strong>, das alle Stellen eines Array auf 0 setzt, bringt die Erl\u00f6sung. Und dann muss ich noch merken, dass<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nchar incoming[4] = {};\r\n...\r\nif (sizeof(incoming) &gt; 0) {...}\r\n<\/pre>\n<p>eine absolut sinnlose Bedingung ist f\u00fcr einen Array mit fixer L\u00e4nge, weil die definierte L\u00e4nge des Arrays zur\u00fcckgeliefert wird, und nicht etwa die tats\u00e4chliche Anzahl Zeichen darin. Damit hatte ich nun alles beisammen f\u00fcr eine fehlertolerante Motorsteuerung. \u00dcbrigens funktioniert der Code auch bei der Eingabe von Buchstaben. In diesem Fall wird der Motor angehalten.<\/p>\n<p>&nbsp;<\/p>\n<p>Hier nun also der vollst\u00e4ndige Code:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/*\r\n * Motorengeschwindigkeit \u00fcber serielle Schnittstelle regeln\r\n * Author: Silvia Rothen, rothen ecotronics, Bern, Switzerland\r\n *\/\r\n\r\nint motorPin = 9;  \/\/ an diesem Pin h\u00e4ngt der Motor\r\nint val = 0; \/\/zuerst steht der Motor\r\nchar incoming[4] = {}; \/\/wegen Endzeichen\r\n\r\nvoid setup() {\r\n    Serial.begin(9600);        \/\/ connect to the serial port\r\n    pinMode(motorPin, OUTPUT);\r\n}\r\n\r\nvoid loop() {\r\n\r\n  int i = 0;\r\n\r\n  if (Serial.available() &gt; 0) {\r\n    \/\/sonst bleiben die 0 erhalten 60 -&gt; 600\r\n    memset(incoming, 0, sizeof(incoming));\r\n    while (Serial.available() &gt; 0 &amp;&amp; i &lt; sizeof(incoming) - 1) {\r\n      incoming[i] = Serial.read();\r\n      i++;\r\n      delay(3);\r\n    }\r\n\r\n    \/\/array of char in int wandeln\r\n    val = atoi(incoming);\r\n    \/\/Geschwindigkeit limitieren\r\n    if (val &lt; 0) {\r\n      val = 0;\r\n    } else if (val &gt; 255) {\r\n      val = 255;\r\n    }\r\n\r\n    Serial.print(&quot;Umlaufgeschwindigkeit &quot;);\r\n    Serial.println(val);\r\n    \/\/Motorgeschwindigkeit setzen\r\n    analogWrite(motorPin, val);\r\n  }\r\n}\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Heute bin ich bei Arduino \u00fcber die erste richtige Knacknuss gestolpert. Die Aufgabenstellung schien einfach: die Geschwindigkeit eines Spielzeug-Gleichstrommotors soll \u00fcber die serielle Schnittstelle mit Werten von 0 bis 255 ver\u00e4ndert werden. Die Hardware ist dieselbe wie gestern, der Pushbutton bleibt ohne Funktion. Hier noch einmal der Best\u00fcckungsplan f\u00fcr das Schaltbrett:<\/p>\n<p id=\"caption-attachment-1479\" class=\"wp-caption-text\">Arduino-Motorsteuerung mit [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":1496,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[160,158],"tags":[296,168,165,169],"_links":{"self":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1492"}],"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=1492"}],"version-history":[{"count":12,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1492\/revisions"}],"predecessor-version":[{"id":1551,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1492\/revisions\/1551"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/1496"}],"wp:attachment":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}