# Arduino自我學習 Ch15 監視鍵盤驅動馬達 資料源: https://blog.jmaker.com.tw/l9110s/ 基本知識: #define A_1A 8 // A_1A控制A馬達的前進(HIGH)、後退(LOW) #define A_1B 9 // A_1B控制A馬達的速度 0~255 ,LOW表示停止 #define B_1A 10 // B_1A控制B馬達的前進(HIGH)、後退(LOW) #define B_1B 11 // B_1B控制B馬達的速度 0~255,LOW表示停止 我現在希望監視鍵盤 按下"1"順時鐘 啟動馬達 在5秒內從最高速255至0 按下"2"逆時鐘轉動馬達 在5秒內從最高速255至0 ```python= #python from pynput import keyboard import serial import time # 設定串列埠參數,根據你的實際情況調整 ser = serial.Serial('COM3', 9600) # 步進馬達控制的相關函數 def move_clockwise(): print("Moving clockwise...") ser.write(b'1') # 傳送 '1' 給 Arduino,啟動順時針轉動 def move_counterclockwise(): print("Moving counterclockwise...") ser.write(b'2') # 傳送 '2' 給 Arduino,啟動逆時針轉動 # 監聽鍵盤事件的函數 def on_press(key): try: if key.char == '1': move_clockwise() time.sleep(5) # 等待5秒,使馬達逐漸減速至停止 elif key.char == '2': move_counterclockwise() time.sleep(5) # 等待5秒,使馬達逐漸減速至停止 except AttributeError: pass # 啟動鍵盤監聽 with keyboard.Listener(on_press=on_press) as listener: listener.join() ``` Arduino ```c= const int a1APin = 2; // A-1A腳位接到Arduino的2腳 const int a1BPin = 3; // A-1B腳位接到Arduino的3腳 void setup() { pinMode(a1APin, OUTPUT); pinMode(a1BPin, OUTPUT); Serial.begin(9600); // 啟動串列通訊 } void loop() { if (Serial.available() > 0) { char incomingChar = Serial.read(); if (incomingChar == '1') { // 指令 '1',順時鐘轉動 digitalWrite(a1APin, HIGH); digitalWrite(a1BPin, LOW); delay(5000); // 等待5秒,逐漸減速至停止 // 逐漸減速至停止 for (int i = 255; i >= 0; i--) { analogWrite(a1APin, i); delay(10); } // 停止馬達 digitalWrite(a1APin, LOW); digitalWrite(a1BPin, LOW); } if (incomingChar == '2') { // 指令 '2',逆時鐘轉動 digitalWrite(a1APin, LOW); digitalWrite(a1BPin, HIGH); delay(5000); // 等待5秒,逐漸減速至停止 // 逐漸減速至停止 for (int i = 255; i >= 0; i--) { analogWrite(a1APin, i); delay(10); } // 停止馬達 digitalWrite(a1APin, LOW); digitalWrite(a1BPin, LOW); } } } ``` ![](https://i.imgur.com/Om217NM.jpg) ## 提醒: ### 關於上傳 在重新上傳CODE給ARDUINO時,如遇到下圖狀況,請將ARDUINO連接線(USB線)拔掉 然後1)重新插上線2)上傳CODE ![](https://i.imgur.com/GZTYvrB.jpg) ### 關於程式碼&接線 由於所使用的是L9110S驅動版,但ARDUINO會忘記/不知道該板子的PIN(它可能會誤會是L298N),所以CODE會出現EN(這是L298N會有的),所以要再跟他說你的板子以及板子上的PIN針,好讓GPT去修正 ![](https://i.imgur.com/CkPOztY.jpg) ![](https://i.imgur.com/NsLUwmE.jpg) ## 使出使速度變慢 接上可變電阻 原始程式碼 ```= const int a1APin = 5; // 定義A-1A腳位接到Arduino的~5腳 const int a1BPin = 3; // 定義A-1B腳位接到Arduino的~3腳 void setup() { pinMode(a1APin, OUTPUT); // 設定A-1A腳位為輸出模式 pinMode(a1BPin, OUTPUT); // 設定A-1B腳位為輸出模式 Serial.begin(9600); // 啟動串列通訊,波特率設定為9600 } void loop() { if (Serial.available() > 0) { // 檢查串列通訊是否有資料可讀取 char incomingChar = Serial.read(); // 讀取一個字元 if (incomingChar == '1') { // 如果收到指令 '1',則執行順時鐘轉動 clockwiseRotation(100); // 請根據實際需求調整 PWM 值 } if (incomingChar == '2') { // 如果收到指令 '2',則執行逆時鐘轉動 counterclockwiseRotation(100); // 請根據實際需求調整 PWM 值 } } } void clockwiseRotation(int pwmValue) { digitalWrite(a1APin, HIGH); // 設定A-1A腳位為高電位(正轉) digitalWrite(a1BPin, LOW); // 設定A-1B腳位為低電位 delay(1000); // 順時鐘轉動1秒 // 逐漸減速至停止 for (int i = pwmValue; i >= 0; i--) { analogWrite(a1APin, i); analogWrite(a1BPin, 0); delay(100); } // 停止馬達 digitalWrite(a1APin, LOW); digitalWrite(a1BPin, LOW); } void counterclockwiseRotation(int pwmValue) { digitalWrite(a1APin, LOW); // 設定A-1A腳位為低電位(逆轉) digitalWrite(a1BPin, HIGH); // 設定A-1B腳位為高電位 delay(1000); // 逆時鐘轉動1秒 // 逐漸減速至停止 for (int i = pwmValue; i >= 0; i--) { analogWrite(a1BPin, i); analogWrite(a1APin, 0); delay(100); } // 停止馬達 digitalWrite(a1APin, LOW); digitalWrite(a1BPin, LOW); } ```