Skip to content

Instantly share code, notes, and snippets.

@dodo5522
Last active August 5, 2017 22:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dodo5522/eb2f4b844ae88753f6bfa864084096b7 to your computer and use it in GitHub Desktop.
Save dodo5522/eb2f4b844ae88753f6bfa864084096b7 to your computer and use it in GitHub Desktop.
This module is very simple motor driver to be run on Raspberry Pi
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from __future__ import print_function
from motor import MotorDriver
from time import sleep
K = [10.0, 0.0]
CONTROLLERS = []
def init():
""" モーターコントローラを初期化してインスタンスを返す """
r = MotorDriver(pin_to_in1=17, pin_to_in2=27, pwm_hz=50)
l = MotorDriver(pin_to_in1=23, pin_to_in2=24, pwm_hz=50)
r.start()
l.start()
CONTROLLERS.extend([r, l])
def go_straight(speed, time_):
""" 前に進む """
print("go straight...")
for i, ctrl in enumerate(CONTROLLERS):
ctrl.set_duty(speed + K[i], MotorDriver.FORWARD)
sleep(time_)
def go_back(speed, time_):
""" 後ろ向きに進む """
print("go back...")
for i, ctrl in enumerate(CONTROLLERS):
ctrl.set_duty(speed + K[i], MotorDriver.INVERSE)
sleep(time_)
def turn_right(speed=30.0, time_=3.0):
""" 右に曲がる """
print("turn right...")
DIRS = [MotorDriver.FORWARD, MotorDriver.INVERSE]
for i, ctrl in enumerate(CONTROLLERS):
ctrl.set_duty(speed + K[i], DIRS[i])
sleep(time_)
def turn_left(speed=30.0, time_=3.0):
""" 左に曲がる """
print("turn left...")
DIRS = [MotorDriver.FORWARD, MotorDriver.INVERSE]
for i, ctrl in enumerate(CONTROLLERS):
ctrl.set_duty(speed + K[i], DIRS[i])
sleep(time_)
def deinit():
""" 使い終わったら後始末 """
for i, ctrl in enumerate(CONTROLLERS):
ctrl.destroy()
def main():
""" ロボットカーを動かす """
init()
#################################################
# これ以降のプログラムを変更してみてね
#################################################
go_straight(speed=40.0, time_=3.0)
go_back(speed=40.0, time_=3.0)
turn_right(speed=30.0, time_=2.0)
go_straight(speed=40.0, time_=3.0)
turn_left(speed=30.0, time_=2.0)
go_straight(speed=40.0, time_=3.0)
turn_left(speed=30.0, time_=2.0)
go_straight(speed=60.0, time_=2.0)
#################################################
# 変更していいのはここまで
#################################################
deinit()
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
deinit()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from __future__ import print_function
import RPi.GPIO as gpio
"""
This module is very simple motor driver to be run on Raspberry Pi
and can be used for TA7291P and maybe DRV8871.
Refer to below documentation about GPIO pin assignment.
https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/
"""
class MotorDriver(object):
INVERSE = 0
FORWARD = 1
STATE_IDLE = 0
STATE_MOVING = 1
STATE_BRAKING = 2
STATE_DESTROYED = 3
def __init__(self, pin_to_in1, pin_to_in2, pwm_hz, init_dir=FORWARD, warning=False):
gpio.setwarnings(warning)
self._pin_to_in1 = pin_to_in1
self._pin_to_in2 = pin_to_in2
self._dir = init_dir
self._duty = 0.0
gpio.setmode(gpio.BCM)
gpio.setup(pin_to_in1, gpio.OUT)
gpio.setup(pin_to_in2, gpio.OUT)
self._p_in1 = gpio.PWM(pin_to_in1, pwm_hz)
self._p_in2 = gpio.PWM(pin_to_in2, pwm_hz)
self._state = self.STATE_IDLE
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.destroy()
if exc_type:
return True
def set_duty(self, duty, dir_=FORWARD):
""" Arguments: duty is in 0.0(stop) to 100.0 """
if self._state in [self.STATE_DESTROYED, ]:
return
self._duty = duty
self._dir = dir_
self._p_in1.ChangeDutyCycle(0.0 if dir_ == self.INVERSE else duty)
self._p_in2.ChangeDutyCycle(duty if dir_ == self.INVERSE else 0.0)
self._state = self.STATE_MOVING if duty > 0.0 else self.STATE_IDLE
def start(self):
if self._state in [self.STATE_MOVING, self.STATE_DESTROYED]:
return
self._p_in1.start(0.0)
self._p_in2.start(0.0)
def stop(self):
if self._state in [self.STATE_DESTROYED, ]:
return
self._p_in1.stop()
self._p_in2.stop()
self._state = self.STATE_IDLE
def brake(self):
if self._state in [self.STATE_DESTROYED, ]:
return
self.stop()
gpio.output(self._gpio_in1, gpio.HIGH)
gpio.output(self._gpio_in2, gpio.HIGH)
self._state = self.STATE_BRAKING
def destroy(self):
self.stop()
gpio.cleanup()
self._state = self.STATE_DESTROYED
@dodo5522
Copy link
Author

dodo5522 commented Aug 1, 2017

友人の子供向けプログラミング教材

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment