Серво не работает вместе с шаговиком.
- Войдите на сайт для отправки комментариев
Здравствуйте!
Скетч парсит g-code с com-порта и шевелит шаговым двигателем и сервоприводом.
#include <stepperQ.h> #include <Servo.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 int dir_pin = 7; int step_pin = 4 ; Servo servo; 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: stepperq.setMaxSpeed(1600*parsenumber('F',0)/60); stepperq.move(1600*parsenumber('Z',0)); stepperq.start(); break; default: break; } cmd = parsenumber('M',-1); switch(cmd) { case 3: servo.write(parsenumber('S',45)); delay(200); break; case 5: servo.write(0); delay(200); break; case 17: digitalWrite(8,LOW); break; case 18: // disable motors digitalWrite(8,HIGH); break; } } void setup() { servo.attach(13); servo.write(0); delay(15); Serial.begin(115200); sofar=0; stepperq.init(dir_pin, step_pin); //stepperq.setMaxSpeed(200); stepperq.setAcceleration(32000); pinMode(8,OUTPUT); digitalWrite(8,HIGH); pinMode(A3,LOW); } void loop() { if ( stepperq.distanceToGo() == 0 ) { while(Serial.available() > 0) { // if something is available char c=Serial.read(); // get it if(sofar<MAX_BUF-1) buffer[sofar++]=c; // store it if(c=='\n') { buffer[sofar]=0; // end the buffer so string functions work right processCommand(); Serial.print("ok\n"); sofar=0; } } } }
G-код подается такой: M5 G1 Z6.0 F200.0 G1 Z-5.95 F200.0 M3 S45 (циклично)
M5 - выставить серву в ноль, G1 Z6.0 F200.0 - перемещение по Z на 6мм со скоростью 200, G1 Z-5.95 F200.0 - вернуться обратно на 5.95 мм M3 S45 - повернуть серву на 45 градусов.
Проблема: серва не срабатывает. Просто лежит без признаков жизни. Шаговик отрабатывает всё как надо. Отдельно все команды выполняются. Если послать код M5 M3 S45 то серва шевелится туда-сюда, как положено. Т.е. парсится всё нормально. Если определить для M5 и M3 мигание светодиодом, то всё работает (диод мигает и шаговик крутится). Но стоит заменить диод на серву - перестает. Если шаговик запитан, но команды на перемещение не подаем, то серва работает (т.е. на питание шаговика ей пофиг, её смущают только перемещения). Пробовал запитать серву отдельно (думал, может питания не хватает), не помогло. Пробовал вешать её на разные выводы - тоже нет. Даже не знаю куда копать.
Используется стандартная библиотека для серво и форк библиотеки AccelStepper - StepperQ для шаговика https://github.com/achest/stepperQ/wiki
Подскажите, в чем может быть дело?
Спасибо!