L298Nを使ってモータの制御
L298Nとは
2つのモータを独立して駆動でき、正転逆転制御などに最適です。
制御は各モーターに対して、イネーブル(回転する/しない)と回転方向の指定を2線でおこないます。
マイコンでの制御のほか、スイッチなどによってマニュアル制御も簡単におこなえます。
L298N使用 2Aデュアルモーターコントローラー: マイコン関連 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gM-06680/
Pin Description
ENA Motor A Speed Control
IN1 Motor A Direction Pin 1
IN2 Motor A Direction Pin 2
IN3 Motor B Direction Pin 1
IN4 Motor B Direction Pin 2
ENB Motor B Speed Control
Terminal Description
VMS 5-35V Input
GND 0V
5V 5V input/output
OUT1 Motor A
OUT2 Motor A
OUT3 Motor B
OUT4 Motor B
RaspiとPythonによるモータ制御
import RPi.GPIO as gpio import time def init(): gpio.setmode(gpio.BCM) gpio.setup(17, gpio.OUT) gpio.setup(22, gpio.OUT) gpio.setup(23, gpio.OUT) gpio.setup(24, gpio.OUT) def forward(tf): init() gpio.output(17, True) gpio.output(22, False) gpio.output(23, True) gpio.output(24, False) time.sleep(tf) gpio.cleanup() def reverse(tf): init() gpio.output(17, False) gpio.output(22, True) gpio.output(23, False) gpio.output(24, True) time.sleep(tf) gpio.cleanup() print "forward" forward(4) print "backward" reverse(2)
#!/usr/bin/python3.4 #MKerbachi November 6th, 2015 #Python code to control two motors with Rpi A+ with the H bridge l298n import RPi.GPIO as GPIO # always needed with RPi.GPIO import time import curses # get the curses screen window screen = curses.initscr() # turn off input echoing curses.noecho() # respond to keys immediately (don't wait for enter) curses.cbreak() # map arrow keys to special values screen.keypad(True) #If the two GND (PI + l298n) are not interconnected that won't work ! #For all Keyboard symbols: #https://docs.python.org/2/library/curses.html GPIO.setmode(GPIO.BCM) # choose BCM or BOARD numbering schemes. I use BCM ################################################################# # Variables # ################################################################# #For Motor #1 GPIO.setup(18, GPIO.OUT)# set GPIO 01 as an output Enabler GPIO.setup(24, GPIO.OUT)# set GPIO 05 as an output. GPIO.setup(23, GPIO.OUT)# set GPIO 04 as an output. p24 = GPIO.PWM(24, 100) p23 = GPIO.PWM(23, 100) p18 = GPIO.PWM(18, 100) # create an object p for PWM on port 18 at 50 Hertz # you can have more than one of these, but they need # different names for each port # e.g. p1, p2, motor, servo1 etc. #For Motor #2 GPIO.setup(13, GPIO.OUT)# set GPIO 03 as an output Enabler GPIO.setup(27, GPIO.OUT)# set GPIO 02 as an output. GPIO.setup(17, GPIO.OUT)# set GPIO 0 as an output. p27 = GPIO.PWM(27, 100) p17 = GPIO.PWM(17, 100) p13 = GPIO.PWM(13, 100) # create an object p for PWM on port 18 at 50 Hertz # you can have more than one of these, but they need # different names for each port # e.g. p1, p2, motor, servo1 etc. LastKey = "" ################################################################# # Functions # ################################################################# def Stop(): p18.start(0) p23.start(0) p24.start(0) p13.start(0) p27.start(0) p17.start(0) time.sleep(0.3) #GPIO.cleanup() print ("Stop executed") #exit() def Left(): if LastKey != 'left' : Stop() p18.start(60) p23.start(0) p24.start(100) time.sleep(0.4) p13.start(60) p27.start(0) p17.start(100) # time.sleep(0.3) #Stop() def Right(): if LastKey != 'right' : Stop() p18.start(60) p23.start(100) p24.start(0) time.sleep(0.4) p13.start(60) p27.start(100) p17.start(0) # time.sleep(0.3) #Stop() def Up(): #if LastKey != 'up' : Stop() p18.start(60) p23.start(100) p24.start(0) time.sleep(0.3) p13.start(60) p27.start(0) p17.start(100) time.sleep(0.3) #Stop() def Down(): #if LastKey != 'down' : Stop() p18.start(60) p23.start(0) p24.start(100) time.sleep(0.3) p13.start(60) p27.start(100) p17.start(0) time.sleep(0.3) #Stop() try: while True: char = screen.getch() print ('you entred') print (char) if char == ord('q'): break #elif char == curses.KEY_ENTER: elif char == ord(' '): # print doesn't work with curses, use addstr instead #screen.addstr(0, 0, 'right') if not ( LastKey == "enter" ) : print ('Last key was not Enter, it was %s \n' % LastKey) LastKey="enter" print ('enter\n') Stop() elif char == curses.KEY_RIGHT: # print doesn't work with curses, use addstr instead #screen.addstr(0, 0, 'right') if not ( LastKey == "right" ) : print ('Last key was not right, it was %s \n' % LastKey) LastKey="right" print ('right\n') Right() elif char == curses.KEY_LEFT: #screen.addstr(0, 0, 'left ') if not ( LastKey == "left" ) : print ('Last key was not left, it was %s \n' % LastKey) LastKey="left" print ('left\n') Left() elif char == curses.KEY_UP: #screen.addstr(0, 0, 'up ') if not ( LastKey == "up" ) : print ('Last key was not up, it was %s \n' % LastKey) LastKey="up" print ('up\n') Up() elif char == curses.KEY_DOWN: #screen.addstr(0, 0, 'down ') if not ( LastKey == "down" ) : print ('Last key was not down t was %s \n' % LastKey) LastKey="down" print ('down\n') Down() else: print ('Nothing Entred!\n') finally: # shut down cleanly print ('In the finally section now') curses.nocbreak(); screen.keypad(0); curses.echo() curses.endwin() p13.stop() # stop the PWM output p17.stop() p27.stop() p23.stop() # stop the PWM output p24.stop() p18.stop() GPIO.cleanup() # when your program exits, tidy up after yours p13.stop() # stop the PWM output p17.stop() p27.stop() p23.stop() # stop the PWM output p24.stop() p18.stop() GPIO.cleanup() # when your program exits, tidy up after yours
メモ
アナログ出力では周波数とデューティ比を指定して、モータ制御などに使うPWM制御ができます。
まずピンに対して周波数を設定してpwmオブジェクトを取得します。
pwm = GPIO.PWM([チャンネル], [周波数(Hz)]) 次にpwmオブジェクトに対してデューティ比を指定して出力を開始します。
pwm.start([デューティ比]) 例えば、ピン18に周波数1KHz、デューティ比50%でPWM出力する場合は以下のように書きます。
pwm = GPIO.PWM(18, 1000) pwm.start(50) 途中で周波数を変更する場合は以下の関数を使用します。
pwm.ChangeFrequency([周波数(Hz)]) 途中でデューティ比を変更する場合は以下の関数を使用します。
pwm.ChangeDutyCycle([デューティ比]) PWM出力を停止する場合は以下の関数を実行します。
pwm.stop() スクリプト終了時にはちゃんと停止しておきましょう。