{"id":779,"date":"2013-08-31T00:11:30","date_gmt":"2013-08-30T22:11:30","guid":{"rendered":"http:\/\/www.jensd.de\/wordpress\/?p=779"},"modified":"2013-12-19T12:43:25","modified_gmt":"2013-12-19T11:43:25","slug":"javafx-on-raspberry-pi-some-fun-with-stepper-motor","status":"publish","type":"post","link":"https:\/\/www.jensd.de\/wordpress\/?p=779","title":{"rendered":"JavaFX on Raspberry Pi: Some fun with stepper motor"},"content":{"rendered":"<p>Recently had some fun when controlling my stepper motor with my Raspberry Pi.<\/p>\n<p><iframe loading=\"lazy\" title=\"JavaFX + RaspberryPi: Controlling stepper motor\" width=\"900\" height=\"506\" src=\"https:\/\/www.youtube.com\/embed\/ikVTPBfD0aA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe><\/p>\n<p>The motor: a <strong>28BYJ-48<\/strong> with ULN2003 driver unit:<\/p>\n<p><a href=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/DSC_5687.jpg\"><img decoding=\"async\" data-attachment-id=\"787\" data-permalink=\"https:\/\/www.jensd.de\/wordpress\/?attachment_id=787\" data-orig-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/DSC_5687.jpg\" data-orig-size=\"\" data-comments-opened=\"0\" data-image-meta=\"[]\" data-image-title=\"DSC_5687\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/DSC_5687.jpg\" data-large-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/DSC_5687.jpg\" tabindex=\"0\" role=\"button\" src=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/DSC_5687.jpg\" alt=\"DSC_5687\" class=\"aligncenter size-full wp-image-787\" \/><\/a><\/p>\n<p><strong>Cool:<\/strong> <a href=\"http:\/\/pi4j.com\" title=\"Pi4J\" target=\"_blank\">Pi4J<\/a> has a ready to use <code><strong>GpioStepperMotorComponent<\/strong><\/code>.<\/p>\n<p>Let&#8217;s assume this architecture:<\/p>\n<p><a href=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl2.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"795\" data-permalink=\"https:\/\/www.jensd.de\/wordpress\/?attachment_id=795\" data-orig-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl2.png\" data-orig-size=\"1023,592\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"StepperMotorControl2\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl2-300x173.png\" data-large-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl2.png\" tabindex=\"0\" role=\"button\" src=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl2.png\" alt=\"StepperMotorControl2\" width=\"1023\" height=\"592\" class=\"aligncenter size-full wp-image-795\" srcset=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl2.png 1023w, https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl2-300x173.png 300w\" sizes=\"(max-width: 1023px) 100vw, 1023px\" \/><\/a><\/p>\n<p>Thus we start with the <code><strong>StepperMotorAdapter<\/strong><\/code> using this component.<\/p>\n<p>First some helpfull defines: <\/p>\n<p>[java]<br \/>\nprivate final int oneRevolution = 2038;<br \/>\nprivate final int quarterRevolution = oneRevolution \/ 4;<br \/>\nprivate final int halfRevolution = oneRevolution \/ 2;<br \/>\nprivate final int oneDegreeRevolution = oneRevolution \/ 360;<br \/>\n[\/java]<\/p>\n<p>then we need to get the <code><strong>GpioController<\/strong><\/code> and provide 4 GPIO pins set to digital output mode<\/p>\n<p>[java]<br \/>\ngpio = GpioFactory.getInstance();<\/p>\n<p>final GpioPinDigitalOutput[] pins = {<br \/>\n    gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, PinState.LOW),<br \/>\n    gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, PinState.LOW),<br \/>\n    gpio.provisionDigitalOutputPin(RaspiPin.GPIO_02, PinState.LOW),<br \/>\n    gpio.provisionDigitalOutputPin(RaspiPin.GPIO_03, PinState.LOW)};<br \/>\n[\/java]<\/p>\n<p>and we need a byte array to define a step sequence e.g. a single motor step sequence (every coil is turned on once per step):<\/p>\n<p>[java]<br \/>\nsingleStepSequence = new byte[4];<br \/>\n    singleStepSequence[0] = (byte) 0b0001;<br \/>\n    singleStepSequence[1] = (byte) 0b0010;<br \/>\n    singleStepSequence[2] = (byte) 0b0100;<br \/>\n    singleStepSequence[3] = (byte) 0b1000;<br \/>\n[\/java]<\/p>\n<p>Now we can create the motor:<\/p>\n<p>[java]<br \/>\nmotor = new GpioStepperMotorComponent(pins);<br \/>\n        motor.setStepSequence(currentStepSequence);<br \/>\n        motor.setStepsPerRevolution(oneRevolution);<br \/>\n[\/java]<\/p>\n<p>and some methods to control the motor:<\/p>\n<p>[java]<br \/>\npublic void stop() {<br \/>\n    motor.stop();<br \/>\n}<\/p>\n<p>public void forward() {<br \/>\n    motor.reverse();<br \/>\n}<\/p>\n<p>public void backward() {<br \/>\n    motor.forward();<br \/>\n}<\/p>\n<p>public void oneStepBackward() {<br \/>\n    motor.step(oneDegreeRevolution);<br \/>\n}<\/p>\n<p>public void oneStepForward() {<br \/>\n    motor.step(-oneDegreeRevolution);<br \/>\n}<\/p>\n<p>public void halfRevolutionBackward() {<br \/>\n    motor.step(halfRevolution);<br \/>\n}<\/p>\n<p>public void halfRevolutionForward() {<br \/>\n    motor.step(-halfRevolution);<br \/>\n}<\/p>\n<p>public void quarterRevolutionBackward() {<br \/>\n    motor.step(quarterRevolution);<br \/>\n}<\/p>\n<p>public void quarterRevolutionForward() {<br \/>\n    motor.step(-quarterRevolution);<br \/>\n}<br \/>\n[\/java]<\/p>\n<p>This adapter is used by the <code><strong>StepperMotorControl<\/strong><\/code> which implements handlers like:<\/p>\n<p>[java]<br \/>\nadjustBackwardButton.setOnMousePressed(new EventHandler<MouseEvent>() {<br \/>\n    @Override<br \/>\n    public void handle(MouseEvent t) {<br \/>\n        stepperMotorAdapter.backward();<br \/>\n    }<br \/>\n});<br \/>\nadjustBackwardButton.setOnMouseReleased(new EventHandler<MouseEvent>() {<br \/>\n    @Override<br \/>\n    public void handle(MouseEvent t) {<br \/>\n        stepperMotorAdapter.stop();<br \/>\n    }<br \/>\n});<br \/>\nadjustForwardButton.setOnMousePressed(new EventHandler<MouseEvent>() {<br \/>\n    @Override<br \/>\n    public void handle(MouseEvent t) {<br \/>\n        stepperMotorAdapter.forward();<br \/>\n    }<br \/>\n});<br \/>\nadjustForwardButton.setOnMouseReleased(new EventHandler<MouseEvent>() {<br \/>\n    @Override<br \/>\n    public void handle(MouseEvent t) {<br \/>\n        stepperMotorAdapter.stop();<br \/>\n    }<br \/>\n});<br \/>\n[\/java]<\/p>\n<p>and provides FXML usable methods like:<\/p>\n<p>[java]<br \/>\n@FXML<br \/>\npublic void backward() {<br \/>\n    Platform.runLater(new Runnable() {<br \/>\n        @Override<br \/>\n        public void run() {<br \/>\n            stepperMotorAdapter.backward();<br \/>\n        }<br \/>\n    });<br \/>\n}<\/p>\n<p>@FXML<br \/>\npublic void forward() {<br \/>\n    Platform.runLater(new Runnable() {<br \/>\n        @Override<br \/>\n        public void run() {<br \/>\n            stepperMotorAdapter.forward();<br \/>\n        }<br \/>\n    });<br \/>\n}<\/p>\n<p>@FXML<br \/>\npublic void stop() {<br \/>\n    Platform.runLater(new Runnable() {<br \/>\n        @Override<br \/>\n        public void run() {<br \/>\n            stepperMotorAdapter.stop();<br \/>\n        }<br \/>\n    });<br \/>\n}<br \/>\n[\/java]<\/p>\n<p>Finally this is the JavaFX UI running on the RasPi:<br \/>\n<a href=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl1.png\"><img decoding=\"async\" data-attachment-id=\"783\" data-permalink=\"https:\/\/www.jensd.de\/wordpress\/?attachment_id=783\" data-orig-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl1.png\" data-orig-size=\"\" data-comments-opened=\"0\" data-image-meta=\"[]\" data-image-title=\"StepperMotorControl\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl1.png\" data-large-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl1.png\" tabindex=\"0\" role=\"button\" src=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/08\/StepperMotorControl1.png\" alt=\"StepperMotorControl\" class=\"aligncenter size-full wp-image-783\" \/><\/a><\/p>\n<p><strong>Get the complete code here<\/strong>:<br \/>\n<a href=\"https:\/\/bitbucket.org\/Jerady\/raspberry-cpio-control-fx\" title=\"https:\/\/bitbucket.org\/Jerady\/raspberry-cpio-control-fx\" target=\"_blank\"><br \/>\nhttps:\/\/bitbucket.org\/Jerady\/raspberry-cpio-control-fx<\/a><\/p>\n<p><strong>Icons on the buttons are provided by<\/strong>:<br \/>\n<a href=\"http:\/\/www.jensd.de\/wordpress\/?p=733\" title=\"\u2018Font Awesome\u2019 Icons with JavaFX: minor updates\" target=\"_blank\">FontAwesomeFX<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recently had some fun when controlling my stepper motor with my Raspberry Pi. The motor: a 28BYJ-48 with ULN2003 driver unit: Cool: Pi4J has a ready to use GpioStepperMotorComponent. Let&#8217;s assume this architecture: Thus we start with the StepperMotorAdapter using this component. First some helpfull defines: [java] private final int oneRevolution = 2038; private final&hellip; <span class=\"clear\"><\/span><a href=\"https:\/\/www.jensd.de\/wordpress\/?p=779\" class=\"more-link read-more\" rel=\"bookmark\">Continue Reading <span class=\"screen-reader-text\">JavaFX on Raspberry Pi: Some fun with stepper motor<\/span><i class=\"fa fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"JavaFX on Raspberry Pi: Some fun with stepper motor http:\/\/wp.me\/p38FCL-cz","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[25,21,14,30,4,18,26],"tags":[91],"jetpack_publicize_connections":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p38FCL-cz","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/779"}],"collection":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=779"}],"version-history":[{"count":18,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/779\/revisions"}],"predecessor-version":[{"id":1209,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/779\/revisions\/1209"}],"wp:attachment":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}