{"id":1478,"date":"2012-10-29T21:27:37","date_gmt":"2012-10-29T21:27:37","guid":{"rendered":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=1478"},"modified":"2012-12-20T21:20:03","modified_gmt":"2012-12-20T21:20:03","slug":"motorsteuerung-mit-interrupt-und-debounce","status":"publish","type":"post","link":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=1478","title":{"rendered":"Motorsteuerung mit Interrupt und Debounce"},"content":{"rendered":"<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 (Steckplan)\" 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 (Steckplan)<\/p><\/div>\n<p>In der letzten Zeit habe ich mit Arduino vor allem herumgespielt, um verschiedene Komponenten kennenzulernen. Das Projekt, das ich hier vorstelle, ist die Weiterentwicklung aus einem Beispiel in meinem Experimentierkit (Hersteller und Bezugsadresse <a href=\"https:\/\/www.ecotronics.ch\/ecotron\/arduinocheatsheet.htm#Links_und_Quellen\" target=\"_blank\">hier<\/a>).<br \/>\nIn diesem Beispiel l\u00e4sst man einen <strong>Gleichstrommotor mit zu- und abnehmender Geschwindigkeit<\/strong> laufen. Da das Gesumse des Motors mich beim Denken st\u00f6rte, ich aber auch nicht st\u00e4ndig das USB-Kabel ein- und ausstecken wollte, war nat\u00fcrlich sofort das Bed\u00fcrfnis nach einem Schalter da. Also wollte ich die Schaltung mit einem <strong>Pushbutton <\/strong>erg\u00e4nzen. Gesagt, getan. Doch mit meiner Pushbutton-L\u00f6sung hatte ich mir gleich zwei neue Probleme eingehandelt:<\/p>\n<ol>\n<li>\n<div id=\"attachment_1481\" style=\"width: 310px\" class=\"wp-caption alignright\"><a href=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_20121029_215147.jpg\"><img aria-describedby=\"caption-attachment-1481\" decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1481 \" title=\"Foto von Arduino mit Motor und Pushbutton\" src=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_20121029_215147-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_20121029_215147-300x225.jpg 300w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_20121029_215147-150x112.jpg 150w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_20121029_215147-400x300.jpg 400w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/10\/MotorMitButtonInterruptDebounce_20121029_215147.jpg 600w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1481\" class=\"wp-caption-text\">Foto von Arduino mit Motor und Pushbutton<\/p><\/div>\n<p>Der Motor spult sein Programm in einem Endlosloop ab, der Button soll diesen Ablauf unterbrechen. Wie macht man das, wenn ein Programm aus einer einzigen Endlosschleife besteht? Richtig, ein <strong>Interrupt <\/strong>muss her!<\/li>\n<li>Auch nach der Programmierung des Interrupts f\u00fchrte ein Tastendruck zu absolut erratischem Verhalten. Mal passierte gar nichts, dann schaltete der Motor ein- und sofort wieder aus, manchmal mehrmals hintereinander. Dieses Ph\u00e4nomen bezeichnet man als Nachfedern oder in Neudeutsch <strong>Bouncing<\/strong>. Ein Knopfdruck sendet nicht ein einzelnes sauberes Signal, sondern durch das mechanische Nachfedern werden mehrere Signale hintereinander in k\u00fcrzestem Zeitabstand ausgel\u00f6st. Die Library Bounce erm\u00f6glicht es nun, dass ein Arduino-Programm nur auf den ersten Tastendruck einer Serie reagiert.<\/li>\n<\/ol>\n<p>Den Programmcode stelle ich ohne weitere Erl\u00e4uterungen ins Netz. Zusammen mit dem Schaltplan, dem Bild und den Kommentaren im Code sollte das Experiment verst\u00e4ndlich sein. Wichtig ist h\u00f6chstens noch, dass <strong>debouncer.update nicht nur im loop steht sondern auch innerhalb der for-Schleifen<\/strong> , damit der Motor nicht nur am Ende seines Zyklus unterbrochen werden kann.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/*  Weiterentwicklung von Arduino Experimentation Kit Example Code CIRC-03 : Spin Motor Spin\r\n *  http:\/\/ardx.org\/src\/circ\/CIRC03-code.txt\r\n *  erg\u00e4nzt mit\r\n *  - Interrupt-Funktion zum Starten und Stoppen des Motors auf Knopfdruck\r\n *    http:\/\/www.arduino.cc\/en\/Reference\/AttachInterrupt\r\n *  - Debounce, um Prellen des Buttons abzufangen\r\n *    siehe: http:\/\/arduino.cc\/playground\/Code\/Bounce\r\n *\r\n * Author: Silvia Rothen, rothen ecotronics, Bern, Switzerland\r\n *\/\r\n#include &lt;Bounce.h&gt;\r\n\r\nint motorPin = 9;\r\nvolatile boolean on = false;\r\n\r\n\/\/debouncing the push button\r\nBounce debouncer = Bounce(2, 20);\r\n\r\nvoid setup() {\r\n  pinMode(motorPin, OUTPUT);\r\n\r\n  \/\/The Arduino Uno has two external interrupts:\r\n  \/\/numbers 0 (on digital pin 2) and 1 (on digital pin 3)\r\n  \/\/here the interrupt function is attached\r\n  attachInterrupt(0, change, LOW); \/\/LOW CHANGE RISING FALLING\r\n}\r\n\r\nvoid loop() {\r\n  debouncer.update();\r\n  if (on) {\r\n    motorAcceleration();\r\n  }\r\n}\r\n\r\n\/\/this is the interrupt method\r\nvoid change() {\r\n  \/\/debouncer.update() ist hier nicht erlaubt\r\n  if (debouncer.read()) {\r\n    on = !on;\r\n  }\r\n}\r\n\r\n\/*\r\n * motorAcceleration() - accelerates the motor to full speed then\r\n * back down to zero, if not interrupted by pushbutton\r\n*\/\r\nvoid motorAcceleration(){\r\n  int delayTime = 50; \/\/milliseconds between each speed step\r\n  int minValue = 100;\r\n  int maxValue = 200;\r\n\r\n  \/\/Accelerates the motor\r\n  \/\/goes through each speed from minValue to maxValue\r\n  for(int i = minValue; i &lt; maxValue; i++){\r\n   debouncer.update();\r\n   \/\/has the interrupt changed this value?\r\n   if (!on) {\r\n      analogWrite(motorPin, 0);   \/\/stops the motor\r\n      break;\r\n    }\r\n    analogWrite(motorPin, i);   \/\/sets the new speed\r\n    delay(delayTime);           \/\/ waits for delayTime milliseconds\r\n  }\r\n\r\n  \/\/Decelerates the motor\r\n  for(int i = maxValue; i &gt;= minValue; i--){\r\n   debouncer.update();\r\n   \/\/has the interrupt changed this value?\r\n   if (!on) {\r\n      analogWrite(motorPin, 0);   \/\/stops the motor\r\n      break;\r\n    }\r\n    analogWrite(motorPin, i);   \/\/sets the new speed\r\n    delay(delayTime);           \/\/ waits for delayTime milliseconds\r\n  }\r\n}\r\n<\/pre>\n<p>Allgemeine Infos und Links zu Arduino wie immer auf meinem <a href=\"https:\/\/www.ecotronics.ch\/ecotron\/arduinocheatsheet.htm\" target=\"_blank\">Arduino Cheat Sheet<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p id=\"caption-attachment-1479\" class=\"wp-caption-text\">Arduino-Motorsteuerung mit Pushbutton (Steckplan)<\/p>\n<p>In der letzten Zeit habe ich mit Arduino vor allem herumgespielt, um verschiedene Komponenten kennenzulernen. Das Projekt, das ich hier vorstelle, ist die Weiterentwicklung aus einem Beispiel in meinem Experimentierkit (Hersteller und Bezugsadresse hier). In diesem Beispiel l\u00e4sst man einen Gleichstrommotor mit zu- und abnehmender Geschwindigkeit laufen. Da das [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":1479,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[160,158],"tags":[296,167,166,165],"_links":{"self":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1478"}],"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=1478"}],"version-history":[{"count":13,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1478\/revisions"}],"predecessor-version":[{"id":1758,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1478\/revisions\/1758"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/1479"}],"wp:attachment":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}