@@songchaii ขอบคุณครับ ผมทดลองตามตัวอย่างจากในเวปนี้ www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html ที่เป็น excample 5 ใช้ VR มาปรับความเร็วของมอเตอร์ ถ้าเราต้องการใช้ Encoder มาแทนตัว VR เราจะเขียนคำสั่งอย่างไรครับ ตามด้านล่างนี้เป็น Example 5 ที่คัดลอกมาวางไว้ครับ #include // Define the stepper and the pins it will use AccelStepper stepper1(AccelStepper::DRIVER, 9, 8); // Define our three input button pins #define LEFT_PIN 4 #define STOP_PIN 3 #define RIGHT_PIN 2 // Define our analog pot input pin #define SPEED_PIN 0 // Define our maximum and minimum speed in steps per second (scale pot to these) #define MAX_SPEED 500 #define MIN_SPEED 0.1 void setup() { // The only AccelStepper value we have to set here is the max speeed, which is higher than we'll ever go stepper1.setMaxSpeed(10000.0); // Set up the three button inputs, with pullups pinMode(LEFT_PIN, INPUT_PULLUP); pinMode(STOP_PIN, INPUT_PULLUP); pinMode(RIGHT_PIN, INPUT_PULLUP); } void loop() { static float current_speed = 0.0; // Holds current motor speed in steps/second static int analog_read_counter = 1000; // Counts down to 0 to fire analog read static char sign = 0; // Holds -1, 1 or 0 to turn the motor on/off and control direction static int analog_value = 0; // Holds raw analog value. // If a switch is pushed down (low), set the sign value appropriately if (digitalRead(LEFT_PIN) == 0) { sign = 1; } else if (digitalRead(RIGHT_PIN) == 0) { sign = -1; } else if (digitalRead(STOP_PIN) == 0) { sign = 0; } // We only want to read the pot every so often (because it takes a long time we don't // want to do it every time through the main loop). if (analog_read_counter > 0) { analog_read_counter--; } else { analog_read_counter = 3000; // Now read the pot (from 0 to 1023) analog_value = analogRead(SPEED_PIN); // Give the stepper a chance to step if it needs to stepper1.runSpeed(); // And scale the pot's value from min to max speeds current_speed = sign * (((analog_value/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED); // Update the stepper to run at this new speed stepper1.setSpeed(current_speed); } ความต้องการใช้งาน เพื่อหันกล้องดูดาวครับ facebook.com/groups/711823398888858/permalink/7622364901167972/
อาจารย์ สอน ต่ออุปกรณ์ และ โปรแกรม ได้ละเอียด ชัดเจน มาก ผมมือใหม่ ทำตาม คลิปสอน ครั้งแรก โปรแกรม ก็ทำงานได้สมบูณร์เลย ขอบคุณที่่ให้ความรู้
สอนละเอียดดีมากครับ ขอบคุณครับ
อาจารย์ครับผมทดสอบหมุนไปหมุนกลับปรากฏว่าตำแหน่งจะเพี้ยนไปเรื่อยๆครับ ค่า x เท่ากันทั้ง 2 direction ครับ
สิ่งแรกคือตรวจสอบไฟเลี้ยง microstep driver ว่าเพียงพอไหม อันที่สองตรวจสอบ microstep driver ว่ายังดีอยู่ไหม
@@songchaii ขอบคุณครับอาจารย์ เมื่อคืนหลังจากที่ถามอาจารย์ก็พยายามหาสาเหตุจนพบว่าวางตำแหน่ง enable / disable ในโปรแกรมไม่ดีครับ เวลาสั่ง direction เลยเพี้ยนไป
ผมรบกวนคัดลอก Source code อาจารย์ได้ไหมครับ
ได้ครับ
ขอปรึกษาส่วนตัวๆได้ไหมครับ
ถามตรงนี้ได้เลย
@@songchaii
ขอบคุณครับ
ผมทดลองตามตัวอย่างจากในเวปนี้
www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html
ที่เป็น excample 5 ใช้ VR มาปรับความเร็วของมอเตอร์
ถ้าเราต้องการใช้ Encoder มาแทนตัว VR เราจะเขียนคำสั่งอย่างไรครับ
ตามด้านล่างนี้เป็น Example 5 ที่คัดลอกมาวางไว้ครับ
#include
// Define the stepper and the pins it will use
AccelStepper stepper1(AccelStepper::DRIVER, 9, 8);
// Define our three input button pins
#define LEFT_PIN 4
#define STOP_PIN 3
#define RIGHT_PIN 2
// Define our analog pot input pin
#define SPEED_PIN 0
// Define our maximum and minimum speed in steps per second (scale pot to these)
#define MAX_SPEED 500
#define MIN_SPEED 0.1
void setup() {
// The only AccelStepper value we have to set here is the max speeed, which is higher than we'll ever go
stepper1.setMaxSpeed(10000.0);
// Set up the three button inputs, with pullups
pinMode(LEFT_PIN, INPUT_PULLUP);
pinMode(STOP_PIN, INPUT_PULLUP);
pinMode(RIGHT_PIN, INPUT_PULLUP);
}
void loop() {
static float current_speed = 0.0; // Holds current motor speed in steps/second
static int analog_read_counter = 1000; // Counts down to 0 to fire analog read
static char sign = 0; // Holds -1, 1 or 0 to turn the motor on/off and control direction
static int analog_value = 0; // Holds raw analog value.
// If a switch is pushed down (low), set the sign value appropriately
if (digitalRead(LEFT_PIN) == 0) {
sign = 1;
}
else if (digitalRead(RIGHT_PIN) == 0) {
sign = -1;
}
else if (digitalRead(STOP_PIN) == 0) {
sign = 0;
}
// We only want to read the pot every so often (because it takes a long time we don't
// want to do it every time through the main loop).
if (analog_read_counter > 0) {
analog_read_counter--;
}
else {
analog_read_counter = 3000;
// Now read the pot (from 0 to 1023)
analog_value = analogRead(SPEED_PIN);
// Give the stepper a chance to step if it needs to
stepper1.runSpeed();
// And scale the pot's value from min to max speeds
current_speed = sign * (((analog_value/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED);
// Update the stepper to run at this new speed
stepper1.setSpeed(current_speed);
}
ความต้องการใช้งาน
เพื่อหันกล้องดูดาวครับ
facebook.com/groups/711823398888858/permalink/7622364901167972/
@@kamesuph7790 ก่อนอื่นต้องเข้าใจวิธีการอ่าน Encoder ก่อน ถ้ายังไม่เข้าใจก็จะทำไม่ได้ ให้ไปทำความเข้าใจวิธีอ่าน Encoder ที่ www.zonemaker.com/article/14/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-incremental-rotary-encoder-%E0%B8%AD%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B9%88%E0%B8%B2%E0%B8%AD%E0%B8%87%E0%B8%A8%E0%B8%B2%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%AB%E0%B8%A1%E0%B8%B8%E0%B8%99 จากนั้นก็เอาตัวเลขค่า encoder ไปแทนค่า VR
เอา code จากไหนครับ
พิมพ์ตามที่สอนได้ครับ code ไม่ยาวมาก