#include <Arduino.h>
// กำหนดพินที่เชื่อมต่อกับขา IN1 - IN4 ของมอเตอร์
const int IN1 = 5;
const int IN2 = 6;
const int IN3 = 7;
const int IN4 = 8;
// กำหนดพิน LED
const int LED_PIN = 0;
// กำหนดพินสำหรับสวิตช์
const int SW1_PIN = 3; // พินสำหรับ SW1
const int SW2_PIN = 4; // พินสำหรับ SW2
// ลำดับการกระตุ้นขดลวด (Full-step sequence)
int steps[4][4] = {
{1, 0, 0, 1},
{1, 0, 1, 0},
{0, 1, 1, 0},
{0, 1, 0, 1}
};
// จำนวนสเต็ปต่อรอบของมอเตอร์ (ปรับตามสเปคมอเตอร์ของคุณ)
const int STEPS_PER_REV = 200; // 200 สเต็ป = 360 องศา
// ตัวแปรสำหรับบันทึกสถานะของสวิตช์
volatile bool sw1Pressed = false; // สำหรับ SW1
volatile bool sw2Pressed = false; // สำหรับ SW2
void setup() {
// กำหนดพิน LED และมอเตอร์เป็น OUTPUT
pinMode(LED_PIN, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// กำหนดพิน SW1 และ SW2 เป็น INPUT พร้อม Pull-up
pinMode(SW1_PIN, INPUT_PULLUP);
pinMode(SW2_PIN, INPUT_PULLUP);
// ตั้งค่า Interrupt
attachInterrupt(digitalPinToInterrupt(SW1_PIN), sw1ISR, FALLING);
attachInterrupt(digitalPinToInterrupt(SW2_PIN), sw2ISR, FALLING);
}
void loop() {
// ทำให้ LED กระพริบตลอดเวลา
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
// หาก SW1 ถูกกด จะหมุนมอเตอร์ 90 องศา
if (sw1Pressed) {
sw1Pressed = false; // รีเซ็ตสถานะ
rotateStepper(-90); // หมุนมอเตอร์ 90 องศา ตามเข็มนาฬิกา
}
// หาก SW2 ถูกกด จะหมุนมอเตอร์ 45 องศา
if (sw2Pressed) {
sw2Pressed = false; // รีเซ็ตสถานะ
rotateStepper(46); // หมุนมอเตอร์ 45 องศา (ทวนเข็มนาฬิกา)
}
}
// ฟังก์ชันสำหรับหมุนมอเตอร์เป็นองศา (บวกหรือลบ)
void rotateStepper(int degrees) {
// คำนวณจำนวนสเต็ปที่ต้องหมุน
int stepsToMove = (degrees * STEPS_PER_REV) / 360;
// หมุนตามลำดับสเต็ป
for (int step = 0; step < abs(stepsToMove); step++) {
int direction = (stepsToMove > 0) ? step % 4 : (3 - step % 4);
setStepperPins(direction);
delay(5); // ปรับความเร็วได้ตามต้องการ
}
}
// ฟังก์ชันสำหรับเซ็ตพินมอเตอร์ตามลำดับ
void setStepperPins(int step) {
digitalWrite(IN1, steps[step][0]);
digitalWrite(IN2, steps[step][1]);
digitalWrite(IN3, steps[step][2]);
digitalWrite(IN4, steps[step][3]);
}
// ISR สำหรับ SW1
void sw1ISR() {
sw1Pressed = true; // ตั้งค่าสถานะเมื่อ SW1 ถูกกด
}
// ISR สำหรับ SW2
void sw2ISR() {
sw2Pressed = true; // ตั้งค่าสถานะเมื่อ SW2 ถูกกด
}