我最近在做一個小車的專案,小車是由4個步進電機控制的,使用的是麥克納姆輪。所以我需要在arduino里面寫一段程式來控制步進電機走一段固定的距離。剛開始我寫了一段程式想要實作小車的基本移動,設想的是通過控制步進電機使小車先向前再向后,然后向左,最后向右移動回到起點。最后實驗下來的結果是,如果不加上左右的運動,小車只能前后運動,如果加上左右運動,理論上應該可以實作前后左右的運動了,但是結果是只能左右移動。想了很長時間,我覺得可能是步數的原因,但是不知道怎么去修改,所以向大佬們請教,希望大佬們能指出錯誤和不足的地方。代碼如下:
#include <AccelStepper.h>
//定義電機控制用常量
const int enablePin = 8;
const int x_Step_Pin = 2;
const int x_Dir_Pin = 5;
const int y_Step_Pin = 3;
const int y_Dir_Pin = 6;
const int z_Step_Pin = 4;
const int z_Dir_Pin = 7;
const int a_Step_Pin = 12;
const int a_Dir_Pin = 13;
//定義走多少步
const int moveSteps = 1600;
//定義一個時間
const int delayTime = 200;
int Speed = 100;
//定義電機物件
AccelStepper stepperx(1, x_Step_Pin, x_Dir_Pin);
AccelStepper steppery(1, y_Step_Pin, y_Dir_Pin);
AccelStepper stepperz(1, z_Step_Pin, z_Dir_Pin);
AccelStepper steppera(1, a_Step_Pin, a_Dir_Pin);
void setup() {
pinMode(x_Step_Pin, OUTPUT);
pinMode(x_Dir_Pin, OUTPUT);
pinMode(y_Step_Pin, OUTPUT);
pinMode(y_Dir_Pin, OUTPUT);
pinMode(z_Step_Pin, OUTPUT);
pinMode(z_Dir_Pin, OUTPUT);
pinMode(a_Step_Pin, OUTPUT);
pinMode(a_Dir_Pin, OUTPUT);
pinMode(enablePin, OUTPUT);
digitalWrite(enablePin, LOW);
//設定最大速度和加速度
stepperx.setMaxSpeed(1000);
stepperx.setAcceleration(200);
steppery.setMaxSpeed(1000);
steppery.setAcceleration(200);
stepperz.setMaxSpeed(1000);
stepperz.setAcceleration(200);
steppera.setMaxSpeed(1000);
steppera.setAcceleration(200);
}
void loop(){
MFord();
MBack();
MLeft();
MRight();
//電機運動
stepperx.run();
steppery.run();
stepperz.run();
steppera.run();
}
void MFord() { //向前移動
if (stepperx.currentPosition() == 0) {
stepperx.moveTo(moveSteps);
}
if (steppery.currentPosition() == 0) {
steppery.moveTo(-moveSteps);
}
if (stepperz.currentPosition() == 0) {
stepperz.moveTo(moveSteps);
}
if (steppera.currentPosition() == 0) {
steppera.moveTo(-moveSteps);
}
return 0;
}
void MBack() { //向后移動
if (stepperx.currentPosition() == moveSteps) {
stepperx.moveTo(0);
}
if (steppery.currentPosition() == -moveSteps) {
steppery.moveTo(0);
}
if (stepperz.currentPosition() == moveSteps) {
stepperz.moveTo(0);
}
if (steppera.currentPosition() == -moveSteps) {
steppera.moveTo(0);
}
return 0;
}
void MLeft() { //向左移動
if (stepperx.currentPosition() == 0) {
stepperx.moveTo(-moveSteps);
}
if (steppery.currentPosition() == 0) {
steppery.moveTo(-moveSteps);
}
if (stepperz.currentPosition() == 0) {
stepperz.moveTo(moveSteps);
}
if (steppera.currentPosition() == 0) {
steppera.moveTo(moveSteps);
}
return 0;
}
void MRight() { //向右移動
if (stepperx.currentPosition() == -moveSteps) {
stepperx.moveTo(0);
}
if (steppery.currentPosition() == -moveSteps) {
steppery.moveTo(0);
}
if (stepperz.currentPosition() == moveSteps) {
stepperz.moveTo(0);
}
if (steppera.currentPosition() == moveSteps) {
steppera.moveTo(0);
}
return 0;
}
}
另外我仍然對怎么去控制步進電機走固定的距離感到很迷茫,步進電機的原理,距離的計算公式我都查閱過相關的資料,也看過一些相關的視頻,但是就是不知道怎么去寫程式。想請教一下各位大佬,怎么去寫這段程式?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275246.html
標籤:單片機/工控
上一篇:arm-linux-ld:arch/arm/kernel/vmlinux.lds:812: parse error
下一篇:EXSI主機的CPU總大小都只有32Ghz,而其中一臺虛擬機的CPU使用量達到了35.8GHZ?求助大佬們,為什么會出現這種情況?
