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
さんが
前の月曜日の16:02
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
前の月曜日の16:03
に
編集
をしました。
ログインしてコメントを投稿する