L298Nを使ってモータの制御

L298Nとは


2つのモータを独立して駆動でき、正転逆転制御などに最適です。 制御は各モーターに対して、イネーブル(回転する/しない)と回転方向の指定を2線でおこないます。 マイコンでの制御のほか、スイッチなどによってマニュアル制御も簡単におこなえます。

L298N使用 2Aデュアルモーターコントローラー: マイコン関連 秋月電子通商 電子部品 ネット通販

http://akizukidenshi.com/catalog/g/gM-06680/   f:id:kobakenkken:20180515171831p:plain

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() スクリプト終了時にはちゃんと停止しておきましょう。