Duhas писал(а):может я чего не понимаю, но в функции setup должны задавать настройки, к каким команда move в моем восприятии относиться не может. с другой стороны имеется команда run, которая либо запускает на выполнение поставленную задачу либо просто разрешает работу оси. В целом совет один - почитать документацию к библиотеке.. ну и составить для себя алгоритм работы, для начала на бумажке.
Насчет move вопрос спорный, т.к. это не команда, а скорее место хранения информации о расстоянии, на которое нужно переместиться. Сама по себе эта "команда" ничего не запускает. А вот запускается непосредственно перемещение командой run(), точнее её непрерывным повторением.
В любом случае, в исходном скетче, где впервые была замечена эта проблема move в setup не было. Вот изначальный код:
Код: Выделить всё
#include <AccelStepper.h>
#define MAX_BUF (64)
char buffer[MAX_BUF]; // where we store the message until we get a newline
int sofar; // how much is in the buffer
AccelStepper Zaxis(1, 4, 7);
float parsenumber(char code,float val) {
char *ptr=buffer;
while(ptr && *ptr && ptr<buffer+sofar) {
if(*ptr==code) {
return atof(ptr+1);
}
ptr=strchr(ptr,' ')+1;
}
return val;
}
void processCommand() {
int cmd = parsenumber('G',-1);
switch(cmd) {
case 1:
Zaxis.setSpeed(1600*parsenumber('F',0)/60);
Zaxis.move(1600*parsenumber('Z',0));
//Serial.print(parsenumber('F',0));
//Serial.print(parsenumber('Z',0));
break;
default: break;
}
}
void setup() {
Serial.begin(115200);
sofar=0;
Zaxis.setMaxSpeed(12000);
Zaxis.setAcceleration(16000);
}
void loop() {
// listen for serial commands
while(Serial.available() > 0) { // if something is available
char c=Serial.read(); // get it
//Serial.print(c); // repeat it back so I know you got the message
if(sofar<MAX_BUF-1) buffer[sofar++]=c; // store it
if((c=='\n') || (c == '\r')) {
// entire message received
buffer[sofar]=0; // end the buffer so string functions work right
//Serial.print(F("\r\n")); // echo a return character for humans
processCommand();
Serial.print("ok\n");
sofar=0;
}
}
Zaxis.run();
}
Примитивный парсер g-code для управления одним двигателем. Парсится всё правильно, setSpeed() и move() получают нужные значения. Но при отрицательных значениях перемещения такое странное поведение двигателя. При положительных, повторюсь, всё нормально.