在網上找到一個案例,用搖桿控制兩個步進電機,註釋爲法語,通過翻譯軟件和自己對代碼的理解進行了翻譯。
源代碼見文章最後部分。
以下是代碼解析:
/*
* Controllo di due motori passo passo con Arduino e un Joystick
* 用Arduino和操縱桿控制馬達
* Autore : Andrea Lombardo
* Web : http://www.lombardoandrea.com
* Post : http://wp.me/p27dYH-KQ
*/
//Inclusione delle librerie 包含一下庫
#include <AccelStepper.h>
#include <Bounce2.h>
//definizione delle costanti dei pin di Arduino arduino 引腳定義
const int ledEnable = 13; // LED控制引腳
const int pinSwEnable = 7; //搖桿按鍵接線引腳
const int pinEnable = 8; //A4988驅動使能引腳定義
unsigned long debounceDelay = 10; //去抖動延時
const int jX = A0; //搖桿X軸引腳定義
const int stepX = 3; //步進電機X脈衝輸出引腳
const int dirX = 4; //步進電機X方向控制引腳
long speedX, valX, mapX; //電機X相關變量
const int jY = A1; //搖桿Y軸引腳定義
const int stepY = 5; //步進電機Y脈衝輸出引腳
const int dirY = 6; //步進電機Y方向控制引腳
long speedY, valY, mapY; //電機X相關變量
//AccelStepper 庫使用的變量
const int maxSpeed = 1000; //Arduino UNO受晶振限制最大到4000
const int minSpeed = 0; //電機最小速度
const float accelerazione = 50.0; //加速度
const int treshold = 30; //柵域
long tresholdUp, tresholdDown; //變量
boolean abilitato, muoviX, muoviY, enable; //移動變量
Bounce btnEnable = Bounce(); //使用一個庫,檢測按鍵抖動
//AccelStepper庫電機定義
AccelStepper motoreX(AccelStepper::DRIVER, stepX, dirX);
AccelStepper motoreY(AccelStepper::DRIVER, stepY, dirY);
void setup() {
//變量初始化
speedX = speedY = 0;
enable = false;
//引腳模式定義
pinMode(ledEnable, OUTPUT);
pinMode(pinEnable, OUTPUT);
pinMode(pinSwEnable, INPUT_PULLUP); //按鍵定義輸入,並置高
digitalWrite(ledEnable, enable);
digitalWrite(pinEnable, !enable); //A4988拉高
//使用按鍵去抖的一個什麼庫,檢測按鍵是否按下
btnEnable.attach(pinSwEnable); //檢測搖桿按鍵
btnEnable.interval(debounceDelay); //按鍵檢測間隔,去抖時間間隔
//確定搖桿的位置值
tresholdDown = (maxSpeed / 2) - treshold;//之前treshold賦值30 470
tresholdUp = (maxSpeed / 2) + treshold; //530
//配置步進電機參數
motoreX.setMaxSpeed(maxSpeed);//設置最大速度
motoreX.setSpeed(minSpeed);//設置運行速度
motoreX.setAcceleration(accelerazione);//設置加速度
motoreY.setMaxSpeed(maxSpeed);
motoreY.setSpeed(minSpeed);
motoreY.setAcceleration(accelerazione);
}
void loop() {
checkEnable();
digitalWrite(ledEnable, enable); //控制LED
digitalWrite(pinEnable, !enable); //控制電機驅動使能端
//獲取搖桿兩個方向的模擬變量值
valX = analogRead(jX);
valY = analogRead(jY);
//對從搖桿上獲取的值進行速度變換
mapX = map(valX, 0, 1023, minSpeed, maxSpeed);
mapY = map(valY, 0, 1023, minSpeed, maxSpeed);
pilotaMotori(mapX, mapY);
}
void pilotaMotori(long mapX, long mapY) {
if (mapX <= tresholdDown) {
//變換的X速度小於470
speedX = -map(mapX, tresholdDown, minSpeed, minSpeed, maxSpeed);//小於470爲負方向
muoviX = true;
} else if (mapX >= tresholdUp) {
//變換的X速度大於530
speedX = map(mapX, maxSpeed, tresholdUp, maxSpeed, minSpeed);//大於530爲正方向
muoviX = true;
} else {
//電機不動
speedX = 0;
muoviX = false;
}
if (mapY <= tresholdDown) {
speedY = -map(mapY, tresholdDown, minSpeed, minSpeed, maxSpeed);
muoviY = true;
} else if (mapY >= tresholdUp) {
speedY = map(mapY, maxSpeed, tresholdUp, maxSpeed, minSpeed);
muoviY = true;
} else {
speedY = 0;
muoviY = false;
}
if (muoviX) {
motoreX.setSpeed(speedX);
motoreX.run();
} else {
motoreX.stop();
}
if (muoviY) {
motoreY.setSpeed(speedY);
motoreY.run();
} else {
motoreY.stop();
}
}
void checkEnable() {//按鍵檢測
btnEnable.update();
if (btnEnable.fell()) {
enable = !enable;
}
}
法國人的邏輯是真不易一樣。
/*
* Controllo di due motori passo passo con Arduino e un Joystick
* 用Arduino和操縱桿控制馬達
* Autore : Andrea Lombardo
* Web : http://www.lombardoandrea.com
* Post : http://wp.me/p27dYH-KQ
*/
//Inclusione delle librerie 包含一下庫
#include <AccelStepper.h>
#include <Bounce2.h>
//definizione delle costanti dei pin di Arduino arduino引腳定義
const int ledEnable = 13; //il led on board ci mostrerà lo stato di attivazione dei motori
const int pinSwEnable = 7; //il bottone presente nel modulo joystick che abilita o disabilita il controllo
const int pinEnable = 8; //i pin che comandano lo stato ENABLE dei driver A4988 sono in collegati in serie per questo basta un solo pin per gestirli entrambi
unsigned long debounceDelay = 10; //millisecondi per il debonuce del bottone
const int jX = A0; //pin analogico che legge i valori per le X
const int stepX = 3; //pin digitale che invia i segnali di STEP al driver delle X
const int dirX = 4; //pin digitale che invia il segnale DIREZIONE al driver delle X
long speedX, valX, mapX; //variabili di gestione movimenti motore X
const int jY = A1; //pin analogico che legge i valori per le Y
const int stepY = 5; //pin digitale che invia i segnali di STEP al driver delle Y
const int dirY = 6; //pin digitale che invia il segnale DIREZIONE al driver delle Y
long speedY, valY, mapY; //variabili di gestione movimenti motore Y
//variabili utilizzate dalla libreria AccelStepper
const int maxSpeed = 1000; //stando alla documentazione della libreria questo valore può essere impostato fino a 4000 per un Arduino UNO
const int minSpeed = 0; //velocità minima del motore
const float accelerazione = 50.0; //numero di step al secondo in accelerazione
const int treshold = 30; //la lettura dei potenziometri non è mai affidabile al 100%, questo valore aiuta a determinare il punto da considerare come "Stai fermo" nei movimenti
long tresholdUp, tresholdDown; //variabili di servizio per espletare il compito descritto sopra
boolean abilitato, muoviX, muoviY, enable; //variabili di gestione dei movimenti
Bounce btnEnable = Bounce(); //istanzia un bottone dalla libreria Bounce
//istanzia i motori
AccelStepper motoreX(AccelStepper::DRIVER, stepX, dirX);
AccelStepper motoreY(AccelStepper::DRIVER, stepY, dirY);
void setup() {
//inizializza valori
speedX = speedY = 0;
enable = false;
//definizione delle modalità dei pin
pinMode(ledEnable, OUTPUT);
pinMode(pinEnable, OUTPUT);
pinMode(pinSwEnable, INPUT_PULLUP); //l'input dello switch ha bisogno di essere settato come INPUT_PULLUP
digitalWrite(ledEnable, enable);
digitalWrite(pinEnable, !enable); //I driver A4988 disabilitano i comandi al motore se sul pin ENABLE ricevono un segnale HIGH per questo motivo il valore è opposto a quello del LED
//configura il bottone del joystick utilizzando la libreria Bounce
btnEnable.attach(pinSwEnable);
btnEnable.interval(debounceDelay);
//calcola range valori entro i quali considerare la posizione del joystick come "Stai fermo"
tresholdDown = (maxSpeed / 2) - treshold;
tresholdUp = (maxSpeed / 2) + treshold;
//configura parametri dei motori
motoreX.setMaxSpeed(maxSpeed);
motoreX.setSpeed(minSpeed);
motoreX.setAcceleration(accelerazione);
motoreY.setMaxSpeed(maxSpeed);
motoreY.setSpeed(minSpeed);
motoreY.setAcceleration(accelerazione);
}
void loop() {
//esegui funzione di controllo e lettura del bottone che determina lo stato di abilitazione
checkEnable();
digitalWrite(ledEnable, enable); //mostra stato di abilitazione tramite il led su pin 13
digitalWrite(pinEnable, !enable); //imposta valore opposto sui pin ENABLE dei driver
//esegui lettura analogica dei valori provenienti dai potenziometri del joystick
valX = analogRead(jX);
valY = analogRead(jY);
//mappa i valori letti in funzione della velocità inima e massima
mapX = map(valX, 0, 1023, minSpeed, maxSpeed);
mapY = map(valY, 0, 1023, minSpeed, maxSpeed);
//esegui funzione di comando dei motori
pilotaMotori(mapX, mapY);
}
void pilotaMotori(long mapX, long mapY) {
if (mapX <= tresholdDown) {
//x va indietro
speedX = -map(mapX, tresholdDown, minSpeed, minSpeed, maxSpeed);
muoviX = true;
} else if (mapX >= tresholdUp) {
//x va avanti
speedX = map(mapX, maxSpeed, tresholdUp, maxSpeed, minSpeed);
muoviX = true;
} else {
//x sta fermo
speedX = 0;
muoviX = false;
}
if (mapY <= tresholdDown) {
//y va giù
speedY = -map(mapY, tresholdDown, minSpeed, minSpeed, maxSpeed);
muoviY = true;
} else if (mapY >= tresholdUp) {
//y va su
speedY = map(mapY, maxSpeed, tresholdUp, maxSpeed, minSpeed);
muoviY = true;
} else {
//y sta fermo
speedY = 0;
muoviY = false;
}
if (muoviX) {
motoreX.setSpeed(speedX);
motoreX.run();
} else {
motoreX.stop();
}
if (muoviY) {
motoreY.setSpeed(speedY);
motoreY.run();
} else {
motoreY.stop();
}
}
void checkEnable() {
btnEnable.update();
if (btnEnable.fell()) {
enable = !enable;
}
}