Last active
August 5, 2017 22:42
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
友人の子供向けプログラミング教材