資料源:
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
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
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);
}
}
}
在重新上傳CODE給ARDUINO時,如遇到下圖狀況,請將ARDUINO連接線(USB線)拔掉 然後1)重新插上線2)上傳CODE
由於所使用的是L9110S驅動版,但ARDUINO會忘記/不知道該板子的PIN(它可能會誤會是L298N),所以CODE會出現EN(這是L298N會有的),所以要再跟他說你的板子以及板子上的PIN針,好讓GPT去修正
原始程式碼
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);
}
材質製作
Jun 15, 2024//1. 匯入函式庫與定義 (可有可無)#include <SoftEasyTranfer.h>#define LEDPIN 13;
Jan 19, 2024112-1創新原型實作學生專案
Dec 26, 2023禪心鐘 - 伍恩輝, 蔡曜隆毛球怪獸 ! - 陳又寧, 黃之儀感知變奏之旅 - 黃韻文, 王羽柔ㄋㄧㄚˊ - 劉又瑜, 周昱雯黑盒子 - 黃鈺晴, 林柔劭仿生海兔會夢到大海嗎 - 周俊丞, 潘宇光Jelly Fish Music Live - 蕭琮翰, 張弘達Shimmering Dusk - 賴竹原, 顏士容[ - 謝東穎, 廖亭柔][ - 宋承陽]
Dec 10, 2023or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up