自動滑軌項目_參考案例2

在網上找到一個案例,用搖桿控制兩個步進電機,註釋爲法語,通過翻譯軟件和自己對代碼的理解進行了翻譯。

 

源代碼見文章最後部分。

以下是代碼解析:

/*
 * 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;
  }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章