# 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);
}
```