Açıklama
Birçok kişi EasyDriver veya BigEasyDriver satın alıyor ve bu sürücüleri projelerinde sorunsuz bir şekilde çalıştırabiliyor. Ancak bazı kullanıcılar bunu başaramıyor. Bu nedenle Easy Driver'ınızı mümkün olduğunca hızlı ve kolay bir şekilde çalıştırabilmeniz için basit talimatlar hazırlamanın iyi bir fikir olduğunu düşündüm.Bu örneklerin tamamında, laboratuvarımda bulunan farklı step motorları çalıştırmak için Easy Driver ve Big Easy Driver step motor sürücü kartlarını kullanacağım. Step ve yön darbelerini Arduino UNO ve chipKIT UNO32 kartlarıyla oluşturacağım. Bununla birlikte, bu örneklerin tümü herhangi bir Arduino, Arduino klonu veya chipKIT kartları gibi Arduino uyumlu kartlarla da çalışmalıdır.
Bu konuyu daha ayrıntılı öğrenmek isterseniz Dan Thompson'ın hazırladığı kapsamlı Easy Driver eğitim yazısını da okumayı unutmayın. Bu blog yazısının yorumlar bölümünde birçok güzel sorunun yanıtı bulunuyor.
Not 1: Tüm örnekler Easy Driver ve Big Easy Driver ile aynı şekilde çalışır.
Not 2: Tüm örnekler Arduino ve chipKIT kartlarında çalışır. PIC32 işlemcisinin yüksek hızı sayesinde bazı örnekler chipKIT kartlarında daha iyi performans gösterebilir.
Not 3: Tüm devre çizimlerinde güç girişi için silindirik jak gösterilmiştir. Easy Driver'a bir şekilde güç sağlamanız gerekir, ancak bunun için mutlaka silindirik jak kullanmanız gerekmez. 5 V ile 30 V arasında gerilim sağlayabilen ve en az 1 A akım verebilen bir güç kaynağı kullanmalısınız.
Örnek 1: Temel Arduino bağlantısı
Arduino, Easy Driver ve bir step motor kullanılarak kurulabilecek en basit devre budur.Motorun dört kablosunu, bobin bağlantılarının doğru olduğundan emin olarak Easy Driver'a bağlayın. 12 V güç kaynağını Power In bağlantılarına bağlayın. Ardından Arduino'nun GND, 8 ve 9 numaralı pinlerini Easy Driver'a bağlayın.
Devre bağlantısı:

Ardından aşağıdaki programı Arduino veya chipKIT kartınıza yükleyip çalıştırın.
Kod:
void setup() {
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void loop() {
digitalWrite(9, HIGH);
delay(1);
digitalWrite(9, LOW);
delay(1);
}
Bu kod bundan daha basit olamaz. Peki, program ne yapıyor?
Öncelikle 8 ve 9 numaralı pinleri çıkış olarak ayarlıyor. Başlangıçta her iki pini de LOW seviyesine getiriyor. Daha sonra ana döngüde 9 numaralı pini HIGH ve LOW seviyeleri arasında değiştiriyor ve her değişim arasında 1 ms bekliyor.
Easy Driver'ın STEP (adım) kontrolü için 9 numaralı pini, DIRECTION (yön) kontrolü için ise 8 numaralı pini kullanıyoruz.
Easy Driver üzerindeki MS1 ve MS2 pinlerini LOW seviyesine çekmediğimiz için sürücü varsayılan olarak 1/8 mikrostep modunda çalışır. Bu, digitalWrite(9, HIGH); komutu her çalıştırıldığında step motorun bir tam adımın sekizde biri kadar hareket edeceği anlamına gelir.
Motorunuzun adım açısı 1,8 dereceyse, bir turda 200 tam adım veya 1600 mikro adım bulunur.
Step motorun hızı ne kadar olacak?
STEP sinyali 1 ms HIGH ve 1 ms LOW seviyesinde kaldığında, bir tam darbenin süresi 2 ms olur.Bir saniyede 1000 ms bulunduğuna göre:
1000 / 2 = 500 mikro adım/saniye
Motorun daha yavaş dönmesini istiyorsanız delay(); satırlarındaki bekleme sürelerini artırabilirsiniz. Her iki satırda da delay(10); kullanırsanız motor saniyede 50 mikro adım ilerler.
Motorun daha hızlı dönmesini istiyorsanız 1 ms'den daha kısa sürelerle bekleyebiliriz. Elbette, bunu yapabiliriz! delay(); komutları yerine delayMicroseconds(100); kullanabiliriz. Böylece her bekleme 100 mikrosaniye (µs) olur ve motor saniyede 5000 mikro adım hızında sürülür.
Easy Driver akım ayarı
Denemeniz gereken bir diğer ayar, Easy Driver üzerindeki akım ayar potansiyometresidir. Bu potansiyometreyi çevirmek için küçük bir tornavida gerekir. Hassas olduğu için potansiyometreyi bir yöne veya diğer yöne fazla zorlamamaya dikkat edin.Bazı Easy Driver kartlarında mekanik durdurucusu olmayan potansiyometreler bulunur; bunlar sürekli dönebilir.
Yukarıdaki kodu çalıştırırken potansiyometreyi yavaşça bir yöne çevirin. Motorunuzun türüne ve bobin direncine bağlı olarak, potansiyometreyi çevirdiğinizde motorun sesinde veya hareketinde hiç fark görmeyebilir ya da belirgin bir değişiklik hissedebilirsiniz.
Örnek 2: İleri ve geri hareket
Birinci örnekteki programı biraz değiştirerek motoru belirli sayıda adım ileri veya geri hareket ettirebiliriz. Örneğin:
Kod:
int Distance = 0; // Record the number of steps we've taken
void setup() {
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void loop() {
digitalWrite(9, HIGH);
delayMicroseconds(100);
digitalWrite(9, LOW);
delayMicroseconds(100);
Distance = Distance + 1; // record this step
// Check to see if we are at the end of our move
if (Distance == 3600)
{
// We are! Reverse direction (invert DIR signal)
if (digitalRead(8) == LOW)
{
digitalWrite(8, HIGH);
}
else
{
digitalWrite(8, LOW);
}
// Reset our distance back to zero since we're
// starting a new move
Distance = 0;
// Now pause for half a second
delay(500);
}
}
Arduino
Bu bölümde Arduino ve EasyDriver kullanılarak step motorun belirli adımlarla ileri ve geri hareket ettirilmesi, ardından AccelStepper kütüphanesiyle hızlanma ve yavaşlama kontrolü anlatılıyor.Örnek
Kod, motoru bir yönde 3600 adım döndürür, kısa bir süre bekletir ve ardından ters yönde 3600 adım hareket ettirir.Burada dikkat edilmesi gereken nokta, EasyDriver sürücüsünün 1/8 mikro adım modunda çalıştığının varsayılmasıdır. Bu nedenle kodda belirtilen her adım, motorun tam adımının sekizde biridir.
- 3600 adım: Bir yönde hareket.
- Bekleme: Motorun hareketleri arasında kısa bir duraklama.
- 3600 adım: Ters yönde hareket.
- Adım gecikmesi: Motorun hareket hızını belirler.
Örnek
Orijinal kaynak: AccelStepper kütüphanesiAccelStepper, temel Arduino step motor kodlarının yetersiz kaldığı durumlarda kullanılır. Özellikle birden fazla step motoru kontrol etmek ve motorun ani hareket etmesi yerine kademeli olarak hızlanıp yavaşlamasını sağlamak için yararlıdır.
Kurulum adımları:
- AccelStepper kütüphanesini indir.
- İndirilen ZIP dosyasını çıkar.
- AccelStepper klasörünü Arduino IDE'nin libraries klasörüne kopyala.
- Arduino IDE'yi yeniden başlat.
- Önceki örnekteki donanım bağlantılarını kullanarak yeni kodu yükle.
Kod:
#include <AccelStepper.h>
// Define a stepper and the pins it will use
AccelStepper stepper(1, 9, 8);
int pos = 3600;
void setup()
{
stepper.setMaxSpeed(3000);
stepper.setAcceleration(1000);
}
void loop()
{
if (stepper.distanceToGo() == 0)
{
delay(500);
pos = -pos;
stepper.moveTo(pos);
}
stepper.run();
}
Bu kod, AccelStepper kütüphanesi aracılığıyla hızlanma ve yavaşlama kullanarak Örnek 2 ile temelde aynı işi yapar, ancak iki kat daha fazla adım hareket eder. (Bu önemli noktaya dikkat çektiği için Bay Duffy'ye teşekkürler!) İki kat daha fazla adım hareket etmesinin nedeni, kodu kısa ve basit tutmak için pos = -pos komutunu kullanmamızdır. Bu, motorun önce 0 konumundan 3600 adımına, ardından 3600 konumundan -3600 konumuna hareket edeceği anlamına gelir (toplam 7200 adım).
Örnek 4: Birden fazla step motoru çalıştırma
AccelStepper kütüphanesinin en güzel özelliklerinden biri, daha fazla AccelStepper nesnesi oluşturarak aynı anda istediğiniz kadar step motoru çalıştırabilmenizdir. Ancak motorları çok hızlı çalıştırmaya çalışırsanız adımlar düzgün olmayabilir. Bu nedenle Arduino'ya aşırı yük bindirmemeye dikkat etmelisiniz. chipKIT, Arduino'dan çok daha hızlı olduğu için bu sorunu yaşamaz.
Bu şemada artık iki EasyDriver ve iki step motor bulunuyor. İkinci motoru eklemek için Arduino'dan yalnızca iki ek pine ihtiyacımız var.

Bu örneğin kodu aşağıda gösterilmiştir:
Kod:
#include <AccelStepper.h>
// Define two steppers and the pins they will use
AccelStepper stepper1(1, 9, 8);
AccelStepper stepper2(1, 7, 6);
int pos1 = 3600;
int pos2 = 5678;
void setup()
{
stepper1.setMaxSpeed(3000);
stepper1.setAcceleration(1000);
stepper2.setMaxSpeed(2000);
stepper2.setAcceleration(800);
}
void loop()
{
if (stepper1.distanceToGo() == 0)
{
pos1 = -pos1;
stepper1.moveTo(pos1);
}
if (stepper2.distanceToGo() == 0)
{
pos2 = -pos2;
stepper2.moveTo(pos2);
}
stepper1.run();
stepper2.run();
}
Bu örnekte Örnek 3'teki kodu kopyalayıp yapıştırdığımı, ardından iki konum ve iki step motor tanımladığımı görebilirsiniz. Bu örnek kod oldukça basittir ve çok kullanışlı değildir. Ancak AccelStepper kütüphanesindeki mevcut örnekleri inceleyerek ve farklı işlevlerin yardım sayfalarını okuyarak step motor kontrolüyle ilgili başka neler yapabileceğiniz konusunda iyi fikirler edinebilirsiniz.
Örnek 5: Motor hızını değiştirme
Bazen step motorun hızını gerçek zamanlı olarak kontrol etmeniz gerekir. Örneğin teleskobunuz için bir motorlu montaj düzeneği yaptığınızı düşünün. Güzel bir redüktörlü step motor, 16 kat mikro adım özelliğine sahip bir Big Easy Driver alıp hepsini birbirine bağlıyorsunuz. Peki step motorun hızını, gökyüzündeki yıldızların hareket hızına nasıl uyarlayabilirsiniz?
Kolay yöntemlerden biri, kontrol edebileceğiniz analog bir gerilim çıkışı üreten potansiyometre kullanmaktır. Program, bu analog değeri analogRead() komutuyla okuyabilir. Ardından bu değeri kullanarak motorun hareket hızını değiştirebiliriz.
Bu yaklaşımın basit bir örneği aşağıda verilmiştir. Tek step motorlu devremize bir potansiyometre ve üç adet buton ekledik. S1 anahtarına basıldığında motor bir yönde, S3 anahtarına basıldığında diğer yönde döner. S2 anahtarına basıldığında ise motor durur. Motor adım atarken potansiyometreyi kullanarak hızını tam olarak ayarlayabilirsiniz. Kendi uygulamanıza ve kullandığınız düzeneğe bağlı olarak, koddaki MAX_SPEED ve MIN_SPEED değerlerini değiştirmek isteyebilirsiniz. Potansiyometrenin hız aralığını burada belirtilenden farklı ayarlamanız gerekebilir.
Bu devrelerin birbirine ne kadar benzediğini göstermek için chipKIT Uno32 kartıyla hazırlanmış bir şema sürümünü de ekledik. (Elbette tüm bu örneklerde herhangi bir Arduino veya chipKIT kartı kullanılabilir. Arduino Uno ve Uno32, şemalarını çizmek kolay olduğu için tercih edilmiştir.)


Bu örneğin kodu aşağıda gösterilmiştir:
Kod:
// Example5 code for Brian Schmalz's Easy Driver Example page
// http://www.schmalzhaus.com/EasyDriver/EasyDriverExamples.html
#include <AccelStepper.h>
// Define the stepper and the pins it will use
AccelStepper stepper1(1, 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);
}
// This will run the stepper at a constant speed
stepper1.runSpeed();
}
Ayrıca analog dönüşüm ile sonucu MAX_SPEED ve MIN_SPEED değerlerine ölçeklendirmek için gereken matematiksel işlem arasına bir runSpeed() çağrısı ekledik. Bunun nedeni, bu matematiksel işlemin de (göreceli olarak) uzun zaman almasıdır. Böylece bu iki zaman alan işlem arasında, gerektiğinde step motorun bir adım atmasına fırsat veriyoruz.
İstediğiniz hız aralığını elde etmek için MIN_SPEED ve MAX_SPEED değerlerini değiştirebilirsiniz. analogRead() komutunun döndürebileceği yalnızca 1024 farklı değer olduğunu ve bu nedenle motorun alabileceği ayrık hız değerlerinin de bu sayıyla sınırlı olduğunu unutmayın.
Bu örnekte, sabit bir hız elde etmek istediğimiz için AccelStepper kütüphanesinin normal run() çağrısını değil, runSpeed() çağrısını kullandık.
Örnek 6: Motor hızını değiştirme — Adafruit Motor Shield (v1) ile
Bu örnek, EasyDriver veya Big Easy Driver yerine Adafruit Motor Shield kullanılması dışında Örnek 5 ile tamamen aynı işi yapar. İlk kod, v1.2 sürümündeki motor sürücü kartı içindir. Bir sonraki kod ise (aşağıda verilmiştir) v2 sürümü içindir.
Ayrıca v1 AFMotorShield, dijital giriş/çıkış pinlerinin neredeyse tamamını kullandığından üç butonu analog girişlere bağlamak zorunda kaldık. Bu bir sorun değildir; çünkü analog giriş pinleri dijital giriş olarak da kullanılabilir. Bu örnekte mikro adım özelliğini de kullanmıyoruz. Bu nedenle motorumuz bir turda 200 adım atar.
Elbette Fritzing programında Adafruit Motor Shield bulunmadığından sizin için kolayca bir çizim hazırlayamıyorum. Ancak bağlantılar oldukça basittir: Step motoru Motor Shield üzerindeki M1 ve M2 terminallerine bağlayın. Motorun güç kaynağını kart üzerindeki M+ ve GND terminallerine bağlayın. Üç anahtarın kablolarını A5, A4 ve A3 pinlerine, potansiyometrenin orta ucunu A0 pinine bağlayın. Ardından tüm anahtarların diğer uçlarını GND'ye, potansiyometrenin üst ve alt uçlarını ise sırasıyla +5 V ve GND'ye bağlayın. Böylece devreniz hazır olur.
Bu kodu Arduino Uno ile test ettim. UNO32 ile de denedim ancak analog girişlerde dahili pull-up dirençlerini etkinleştiremedim. Bunun nedeninin UNO32 kartının bu özelliği desteklememesi olduğunu düşünüyorum.
Kod:
// Example6 code for Brian Schmalz's Easy Driver Example page
// http://www.schmalzhaus.com/EasyDriver/EasyDriverExamples.html
#include <AccelStepper.h>
#include <AFMotor.h>
// Define the stepper and the pins it will use
AF_Stepper motor1(200, 1);
// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
void forwardstep() {
motor1.onestep(FORWARD, SINGLE);
}
void backwardstep() {
motor1.onestep(BACKWARD, SINGLE);
}
AccelStepper stepper1(forwardstep, backwardstep); // use functions to step
// Define our three input button pins
#define LEFT_PIN A5
#define STOP_PIN A4
#define RIGHT_PIN A3
// Define our analog pot input pin
#define SPEED_PIN A0
// 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(500.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;
}
if (digitalRead(RIGHT_PIN) == 0) {
sign = -1;
}
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);
}
// This will run the stepper at a constant speed
stepper1.runSpeed();
}
V2 sürümünde Sol, Dur ve Sağ girişlerinin yeniden 2, 3 ve 4 numaralı dijital pinlere bağlandığına dikkat edin. Bunun nedeni, V2 motor sürücü kartının bu pinlere ihtiyaç duymaması ve bu nedenle bunları tekrar kullanabilmemizdir.
Kod:
// Example6 code for Brian Schmalz's Easy Driver Example page
// http://www.schmalzhaus.com/EasyDriver/EasyDriverExamples.html
#include <AccelStepper.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
// Define the stepper and the pins it will use
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_StepperMotor *motor1 = AFMS.getStepper(200, 1);
// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
void forwardstep() {
motor1->onestep(FORWARD, SINGLE);
}
void backwardstep() {
motor1->onestep(BACKWARD, SINGLE);
}
AccelStepper stepper1(forwardstep, backwardstep); // use functions to step
// Define our three input button pins
#define LEFT_PIN 2
#define STOP_PIN 3
#define RIGHT_PIN 4
// Define our analog pot input pin
#define SPEED_PIN A0
// 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() {
AFMS.begin();
// The only AccelStepper value we have to set here is the max speeed, which is higher than we'll ever go
stepper1.setMaxSpeed(500.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;
}
if (digitalRead(RIGHT_PIN) == 0) {
sign = -1;
}
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);
}
// This will run the stepper at a constant speed
stepper1.runSpeed();
}
Örnek 1 ile tamamen aynı donanım bağlantıları kullanılarak hazırlanan bu program, step motorun yönünü ve hızını seri port üzerinden gönderilen tek harfli basit komutlarla nasıl kontrol edebileceğinizi gösterir.
Kod:
// Example7 for Brian Schmalz's Easy Driver Example page
// http://www.schmalzhaus.com/EasyDriver/EasyDriverExamples.html
// We control the direction and speed of a stepper using the
// arduino serial port. Note that (if using the Serial Monitor)
// you will need to press Enter after each command.
#include <AccelStepper.h>
AccelStepper stepper(AccelStepper::FULL2WIRE, 8, 9);
int spd = 1000; // The current speed in steps/second
int sign = 1; // Either 1, 0 or -1
void setup()
{
Serial.begin(9600);
stepper.setMaxSpeed(1000);
stepper.setSpeed(1000);
}
void loop()
{
char c;
if(Serial.available()) {
c = Serial.read();
if (c == 'f') { // forward
sign = 1;
}
if (c == 'r') { // reverse
sign = -1;
}
if (c == 's') { // stop
sign = 0;
}
if (c == '1') { // super slow
spd = 10;
}
if (c == '2') { // medium
spd = 100;
}
if (c == '3') { // fast
spd = 1000;
}
stepper.setSpeed(sign * spd);
}
stepper.runSpeed();
}
Eklentiler
Son düzenleme: