モーター制御編3~ラズPicoでモータードライバを使うプログラム(オブジェクト指向)~

2024年8月23日(金)は、8割ほどの出席でした。

  • 18時00分~18時30分 タイピング練習
  • 18時30分~19時50分 配線とモーターを動かすプログラム
  • 19時50分~20時00分 あとかたづけ

タイピング練習

タイピングの練習は、「寿司打」です。

わたしとメンバーの寿司打スコア攻防戦は、まだわたしの辛勝です。わたしのスコアが伸びないので、逆転されるのは時間の問題でしょう。

ところで、しばらく寿司打ばかりやっていたので無料タイピングをやってもらいました。なんと、「220字/分」でした。

一般に「タイピングが速い」というレベルが、「100~120字/分」です。キーボードを見ていたのでは、このようなスピードは出ません。

また、最近急激に実力を伸ばしているメンバーにも無料タイピングをやってもらうと、「100字/分」でした。「50字/分」くらいで伸び悩んでいたところからすると、大変な上達ぶりです。ふたりとも素晴らしい!

モータードライバDRV8835を使ってモーターを動かすプログラム

ラズPicoとDRV8835の接続は、いったん終わって、モーターを動かすプログラムを書いていきます。プログラムは下のとおりです。

import utime
from machine import PWM, Pin
class motorDrv:
    #DRV8835モータードライバを使ったときの制御用

    def __init__(self, ain1, ain2):
        
        #正転のためのスイッチ(forward rotation)
        self.pwm_ain1 = PWM(Pin(ain1, Pin.OUT), freq=1000)
        self.pwm_ain2 = PWM(Pin(ain2, Pin.OUT), freq=1000)
        
        #速度設定 100%=65535
        #lowが小さいとモーターが起動しない high:100%, low:60%, stop:0%
        self.speed = {'high':100, 'low':100, 'stop':0}
        
    def rotfor(self, speed_setting:str):
        '''モーターを正転させる処理'''
        self.pwm_ain2.duty_u16(0)
        self.pwm_ain1.duty_u16(int(self.speed[speed_setting]/100*65535))
        print('cw',speed_setting, self.speed[speed_setting]/100*65535)

    def rotrev(self, speed_setting:str):
        '''モーターを逆転させる処理'''
        self.pwm_ain1.duty_u16(0)
        self.pwm_ain2.duty_u16(int((self.speed[speed_setting])/100*65535))
        print('ccw',speed_setting, self.speed[speed_setting]/100*65535)
    
    def rotstop(self):
        '''モーターを停止させる処理'''
        self.pwm_ain1.duty_u16(0)
        self.pwm_ain2.duty_u16(0)
        print('stopping')

ITV_TIME = 2
if __name__ == '__main__':
    mainmotor = motorDrv(18, 19)
    mainmotor.rotstop()
    
    while True :
        mainmotor.rotrev('low')
        utime.sleep(ITV_TIME)
        mainmotor.rotrev('high')
        utime.sleep(ITV_TIME)
        mainmotor.rotstop()
        utime.sleep(ITV_TIME)
        
        mainmotor.rotfor('low')
        utime.sleep(ITV_TIME)
        mainmotor.rotfor('high')
        utime.sleep(ITV_TIME)
        mainmotor.rotstop()
        utime.sleep(ITV_TIME)
    

タイピング練習をきちんとしているので、これくらいのコードなら30分もあれば入力してしまいます。

入力し終えたメンバーは、まだ入力が済んでいないメンバーのコーディングを手伝います。

自分以外のコーディングを見るのも上達の秘訣です。自分の入力のやり方と違うことに気づいたようで、そう、そこが大事なのです。自分ならこう入力するのに!と振り返ることが、さらなる上達につながります。

プログラムは一人で勉強できますが、せっかくたくさんの人が集まって一緒に勉強しているなら、一人ではできないことをやります。それが、ペアコーディングです。

オブジェクト指向ってなんだ

今回のプログラムのミソは、「オブジェクト指向」です。classを使ったプログラミングです。

いつもとプログラムコードの書き方が違うことに気づいたでしょうか。オブジェクト指向的に書いてみました。

現代プログラムでは必須の知識なので、そのうち本格的にやります。今回はさわりだけ。

コードから想像しよう

コードの内容がわからなくても、だいたいどのような動きをするのか想像してみましょう。

モーターを制御するのだから、やりたいことは「正転・逆転」「回転スピードを変える」くらいです。あとは英語の意味から推測すれば、ある程度動きがわかるはずです。

ただ、「想像しろ」と言っても、なかなかできません。モーターに期待する動作をひとつずつ確認していくと、想像できるようになります。これも繰り返しの鍛錬です。