akira.keiのアイコン画像
akira.kei 2026年09月21日作成 (2026年09月21日更新) © MIT
製作品 製作品 閲覧数 36
akira.kei 2026年09月21日作成 (2026年09月21日更新) © MIT 製作品 製作品 閲覧数 36

定番ステッピングモーターでターンテーブルを回す(その2)

<前の記事


MicroPython + Gemini

もう最近はGeminiにPythonコードを書いてもらってばっかりだ。前の記事ではArduino IDEを使ってたが、今回はMicroPython+Thonny IDEでGeminiが書いたコードを貼り付けて実行することしかやってない。相談しながら書き出させてみたが、紆余曲折があった。

import time from machine import Pin, Timer # --- ピン設定 (GP4:IN1, GP5:IN2, GP6:IN3, GP7:IN4) --- IN_PINS = [Pin(4, Pin.OUT), Pin(5, Pin.OUT), Pin(6, Pin.OUT), Pin(7, Pin.OUT)] # タッチスイッチピン (GP10: L / GP11: C / GP12: R) pin_L = Pin(10, Pin.IN, Pin.PULL_DOWN) # 左 pin_C = Pin(11, Pin.IN, Pin.PULL_DOWN) # 中 (トグル) pin_R = Pin(12, Pin.IN, Pin.PULL_DOWN) # 右 # --- モーター励磁パターン(1-2相励磁)--- STEP_SEQUENCE = [ [1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [1, 0, 0, 1] ] # --- ステート・制御変数 --- STATE_STOP = 0 STATE_MANUAL_LEFT = 1 STATE_MANUAL_RIGHT = 2 STATE_AUTO = 3 current_state = STATE_STOP motor_dir = 0 # 1: 右回り, -1: 左回り, 0: 停止 last_dir = 1 # 最後に押された手動方向(初期値 1: 右回り) step_index = 0 pfreq=400 # 駆動速度 btn_c_pressed = False # --- スイッチC(トグル) 割り込みハンドラ --- def handle_btn_c(pin): global btn_c_pressed btn_c_pressed = True # GP11 (スイッチC) 割り込み登録 pin_C.irq(trigger=Pin.IRQ_RISING, handler=handle_btn_c) # --- モーター駆動 タイマー割り込みハンドラ --- def motor_timer_callback(timer): global step_index, motor_dir if motor_dir == 0: for pin in IN_PINS: pin.value(0) else: step_index = (step_index + motor_dir) % len(STEP_SEQUENCE) pattern = STEP_SEQUENCE[step_index] for pin, bit in zip(IN_PINS, pattern): pin.value(bit) # タイマー起動(2ms周期 = pfreq Hz駆動) motor_timer = Timer(-1) motor_timer.init(freq=pfreq, mode=Timer.PERIODIC, callback=motor_timer_callback) # --- メインループ --- def main(): global current_state, btn_c_pressed, motor_dir, last_dir print("--- ターンテーブル制御(方向記憶版)開始 ---") while True: # 1. スイッチC(トグル)の処理 if btn_c_pressed: btn_c_pressed = False if current_state == STATE_AUTO: current_state = STATE_STOP else: current_state = STATE_AUTO # 2. 手動入力(L/R)の読み取り val_l = pin_L.value() val_r = pin_R.value() # 3. 状態判断と方向情報の更新 if val_l: # L押下中 -> 左回転&最後の方向を記憶 current_state = STATE_MANUAL_LEFT motor_dir = -1 last_dir = -1 elif val_r: # R押下中 -> 右回転&最後の方向を記憶 current_state = STATE_MANUAL_RIGHT motor_dir = 1 last_dir = 1 else: if current_state == STATE_AUTO: # 連続回転モード中 -> 最後に記憶した方向(last_dir)で回転 motor_dir = last_dir else: # 停止状態 current_state = STATE_STOP motor_dir = 0 time.sleep_ms(10) if __name__ == '__main__': main()

格安タッチスイッチ

3つのタッチスイッチは20個で1000円もしないという格安だった。もちろんアリエクならもっと安いかもしれないが、いつ到着するのかヤキモキするくらいならAmazon Primeの方が断然いい。
このタッチスイッチは物理スイッチにありがちなチャタリングが無い一方で、物理スイッチは大抵アクティブローだが、このタッチスイッチはアクティブハイになる。電源も必要でかなり面積が大きいこと、隣接させるとお隣のスイッチが入りやすいのもちょっとデメリットかな。

キャプションを入力できます

正回転するが逆回転しない

スイッチL、C、Rの三つを実装してあり、LとRは押してる間だけ正転または逆転する。真ん中のCは一度押すと継続回転、もう一度押すと停止とした。コードを実行してみるとどうもちゃんと回らない。正転するが逆転しない、というのが症状だったので配線間違いはないだろうと思いこんで様々なチェックを繰り返しんだが、結局は配線間違いだった。
GP5から8に接続したと思い込んでおり、実際にはGP4から7だった。ぁ、片側には回るんだ…


<前の記事

akira.keiのアイコン画像
機械系エンジニアだが電子工作を趣味としている。週末はひとりバーベキュー。
ログインしてコメントを投稿する