{"id":4062,"date":"2025-03-29T22:26:48","date_gmt":"2025-03-29T21:26:48","guid":{"rendered":"https:\/\/www.rommelkist.nl\/elec\/?p=4062"},"modified":"2025-03-31T09:08:05","modified_gmt":"2025-03-31T07:08:05","slug":"stappenmotor-raspberry-pi-pico","status":"publish","type":"post","link":"https:\/\/www.rommelkist.nl\/elec\/elektronica\/stappenmotor-raspberry-pi-pico\/","title":{"rendered":"Stappenmotor &amp; Raspberry Pi Pico"},"content":{"rendered":"\n<p>Natuurlijk wilde ik ook een motortje aan de <a href=\"https:\/\/www.rommelkist.nl\/elec\/wp-content\/uploads\/2025\/03\/image-17.png\">Pico<\/a> hangen. Een stappenmotortje; de hier al veel vaker gebruikte 28BYJ-48 dus.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/www.rommelkist.nl\/elec\/wp-content\/uploads\/2025\/03\/image-23.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"551\" src=\"https:\/\/www.rommelkist.nl\/elec\/wp-content\/uploads\/2025\/03\/image-23-1024x551.png\" alt=\"\" class=\"wp-image-4063\" style=\"width:400px\" srcset=\"https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2025\/03\/image-23-1024x551.png 1024w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2025\/03\/image-23-300x161.png 300w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2025\/03\/image-23-768x413.png 768w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2025\/03\/image-23-425x229.png 425w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2025\/03\/image-23.png 1207w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Net als voor het OLED-scherm aansturing ik ook voor deze stappenmotor niet een &#8220;pakket&#8221; voor MicroPython beschikbaar. Maar het duo Rui &amp; Sara Santos heeft op <a href=\"https:\/\/randomnerdtutorials.com\/raspberry-pi-pico-stepper-motor-micropython\/\">hun site<\/a> wel iets beschikbaar.<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\"># Rui Santos &amp; Sara Santos - Random Nerd Tutorials\n# Complete project details at https:\/\/RandomNerdTutorials.com\/raspberry-pi-pico-stepper-motor-micropython\/\n# Forked from: https:\/\/github.com\/larsks\/micropython-stepper-motor\/blob\/master\/motor.py\n\nimport machine\nimport time\n\nclass Motor:\n    stepms = 10\n\n    # Do be defined by subclasses\n    maxpos = 0\n    states = []\n\n    def __init__(self, p1, p2, p3, p4, stepms=None):\n        self.pins = [p1, p2, p3, p4]\n\n        if stepms is not None:\n            self.stepms = stepms\n\n        self._state = 0\n        self._pos = 0\n\n    def __repr__(self):\n        return '&lt;{} @ {}>'.format(\n            self.__class__.__name__,\n            self.pos,\n        )\n\n    @property\n    def pos(self):\n        return self._pos\n\n    @classmethod\n    def frompins(cls, *pins, **kwargs):\n        return cls(*[machine.Pin(pin, machine.Pin.OUT) for pin in pins],\n                   **kwargs)\n\n    def reset(self):\n        self._pos = 0\n\n    def _step(self, dir):\n        state = self.states[self._state]\n\n        for i, val in enumerate(state):\n            self.pins[i].value(val)\n\n        self._state = (self._state + dir) % len(self.states)\n        self._pos = (self._pos + dir) % self.maxpos\n\n    def step(self, steps):\n        dir = 1 if steps >= 0 else -1\n        steps = abs(steps)\n\n        for _ in range(steps):\n            t_start = time.ticks_ms()\n\n            self._step(dir)\n\n            t_end = time.ticks_ms()\n            t_delta = time.ticks_diff(t_end, t_start)\n            time.sleep_ms(self.stepms - t_delta)\n\n    def step_until(self, target, dir=None):\n        if target &lt; 0 or target > self.maxpos:\n            raise ValueError(target)\n\n        if dir is None:\n            dir = 1 if target > self._pos else -1\n            if abs(target - self._pos) > self.maxpos\/2:\n                dir = -dir\n\n        while True:\n            if self._pos == target:\n                break\n            self.step(dir)\n\n    def step_until_angle(self, angle, dir=None):\n        if angle &lt; 0 or angle > 360:\n            raise ValueError(angle)\n\n        target = int(angle \/ 360 * self.maxpos)\n        self.step_until(target, dir=dir)\n        \n    def step_degrees(self, degrees):\n        if degrees &lt; 0 or degrees > 360:\n            raise ValueError(\"Degrees should be between 0 and 360\")\n\n        steps_to_take = int(degrees \/ 360 * self.maxpos)\n\n        self.zero()  # Ignore the current position, start from zero\n        self.step(steps_to_take)\n\nclass FullStepMotor(Motor):\n    stepms = 5\n    maxpos = 2048\n    states = [\n        [1, 1, 0, 0],\n        [0, 1, 1, 0],\n        [0, 0, 1, 1],\n        [1, 0, 0, 1],\n    ]\n\n\nclass HalfStepMotor(Motor):\n    stepms = 3\n    maxpos = 4096\n    states = [\n        [1, 0, 0, 0],\n        [1, 1, 0, 0],\n        [0, 1, 0, 0],\n        [0, 1, 1, 0],\n        [0, 0, 1, 0],\n        [0, 0, 1, 1],\n        [0, 0, 0, 1],\n        [1, 0, 0, 1],\n    ]\n<\/pre>\n\n\n\n<p>Bovenstaande script als &#8220;Stepper.py&#8221; naar de Pico gestuurd en onderstaand script uitgevoerd doet de motor prima heen er weer gaan.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/www.rommelkist.nl\/elec\/wp-content\/uploads\/2025\/03\/image-24.png\"><img loading=\"lazy\" decoding=\"async\" width=\"590\" height=\"604\" src=\"https:\/\/www.rommelkist.nl\/elec\/wp-content\/uploads\/2025\/03\/image-24.png\" alt=\"\" class=\"wp-image-4084\" style=\"width:400px\" srcset=\"https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2025\/03\/image-24.png 590w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2025\/03\/image-24-293x300.png 293w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2025\/03\/image-24-425x435.png 425w\" sizes=\"auto, (max-width: 590px) 100vw, 590px\" \/><\/a><\/figure>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\"># Rui Santos &amp; Sara Santos - Random Nerd Tutorials\n# Complete project details at https:\/\/RandomNerdTutorials.com\/raspberry-pi-pico-stepper-motor-micropython\/\n\nimport stepper\nfrom time import sleep\n\n# Define the stepper motor pins\nIN1 = 28\nIN2 = 27\nIN3 = 26\nIN4 = 22\n\n# Initialize the stepper motor\nstepper_motor = stepper.HalfStepMotor.frompins(IN1, IN2, IN3, IN4)\n\n# Set the current position as position 0\nstepper_motor.reset()\n\ntry:\n    while True:\n        #Move 500 steps in clockwise direction\n        stepper_motor.step(500)\n        sleep(0.5) # stop for a while\n        \n        # Move 500 steps in counterclockwise direction\n        stepper_motor.step(-500)\n        sleep(0.5) # stop for a while\n        \n        # Go to a specific position (in steps)\n        stepper_motor.step_until(2000)\n        sleep(0.5) # stop for a while\n        \n        # Force a direction using the dir paramter\n        stepper_motor.step_until(2000, dir=-1)\n        sleep(0.5) # stop for a while        \n        \n        # Go to a specific position (angle, maximum is 359, otherwise it will spin indefinetely)\n        stepper_motor.step_until_angle(90)\n        sleep(0.5) # stop for a while\n        \n        stepper_motor.step_until_angle(45)\n        sleep(0.5) # stop for a while\n        \n        stepper_motor.step_until_angle(135)\n        sleep(0.5) # stop for a while\n        \n        stepper_motor.step_until_angle(180)\n        sleep(0.5) # stop for a while\n    \nexcept KeyboardInterrupt:\n    print('Keyboard interrupt')\n<\/pre>\n\n\n\n<p>Stepper_heen_en_weer.py<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\"># Rui Santos &amp; Sara Santos - Random Nerd Tutorials\n# Complete project details at https:\/\/RandomNerdTutorials.com\/raspberry-pi-pico-stepper-motor-micropython\/\n\nimport stepper\nfrom time import sleep\n\n# Define the stepper motor 1 pins\nIN1 = 28\nIN2 = 27\nIN3 = 26\nIN4 = 22\n\n# Define the stepper motor 2 pins\nIN5 = 10\nIN6 = 11\nIN7 = 12\nIN8 = 13\n\n# Initialize the stepper motor\nstepper_motor_1 = stepper.HalfStepMotor.frompins(IN1, IN2, IN3, IN4)\nstepper_motor_2 = stepper.HalfStepMotor.frompins(IN5, IN6, IN7, IN8)\n\n# Set the current position as position 0\nstepper_motor_1.reset()\nstepper_motor_2.reset()\n\ntry:\n    while True:\n        #Move 500 steps in clockwise direction\n        stepper_motor_1.step(500)\n        stepper_motor_2.step(500)\n        sleep(0.5) # stop for a while\n        \n        # Move 500 steps in counterclockwise direction\n        stepper_motor_1.step(-500)\n        sleep(0.5) # stop for a while\n        \n        # Go to a specific position (in steps)\n        stepper_motor_2.step_until(2000)\n        sleep(0.5) # stop for a while\n        \n        # Force a direction using the dir paramter\n        stepper_motor_2.step_until(2000, dir=-1)\n        sleep(0.5) # stop for a while        \n        \n        # Go to a specific position (angle, maximum is 359, otherwise it will spin indefinetely)\n        stepper_motor_1.step_until_angle(90)\n        sleep(0.5) # stop for a while\n        \n        stepper_motor_1.step_until_angle(45)\n        sleep(0.5) # stop for a while\n        \n        stepper_motor_2.step_until_angle(135)\n        sleep(0.5) # stop for a while\n        \n        stepper_motor_2.step_until_angle(180)\n        sleep(0.5) # stop for a while\n    \nexcept KeyboardInterrupt:\n    print('Keyboard interrupt')\n<\/pre>\n\n\n\n<p>Een tweede motor eraan is eenvoudig. De eerste motor zit op de pinnen: IN1 = GPIO28, IN2 = GPIO27, IN3 = GPIO26 en IN4 = GPIO22. De tweede motor: IN5 = GPIO10, IN6 = GPIO11, IN7 = GPIO12 en IN8 = GPIO13.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Natuurlijk wilde ik ook een motortje aan de Pico hangen. Een stappenmotortje; de hier al veel vaker gebruikte 28BYJ-48 dus. Net als voor het OLED-scherm aansturing ik ook voor deze stappenmotor niet een &#8220;pakket&#8221; voor MicroPython beschikbaar. Maar het duo Rui &amp; Sara Santos heeft op hun site wel iets beschikbaar. Bovenstaande script als &#8220;Stepper.py&#8221; naar de Pico gestuurd en onderstaand script uitgevoerd doet de motor prima heen er weer gaan. Stepper_heen_en_weer.py Een tweede motor eraan is eenvoudig. De eerste motor zit op de pinnen: IN1 = GPIO28, IN2 = GPIO27, IN3 = GPIO26 en IN4 = GPIO22. De tweede motor: IN5 = GPIO10, IN6<span class=\"more-link\"><a href=\"https:\/\/www.rommelkist.nl\/elec\/elektronica\/stappenmotor-raspberry-pi-pico\/\">Read More &rarr;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,74],"tags":[168,173],"class_list":["entry","author-admin","post-4062","post","type-post","status-publish","format-standard","category-elektronica","category-raspberry-pi","tag-28byj-48","tag-raspberry-pi-pico"],"_links":{"self":[{"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/posts\/4062","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/comments?post=4062"}],"version-history":[{"count":0,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/posts\/4062\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/media?parent=4062"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/categories?post=4062"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/tags?post=4062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}