Серво не работает вместе с шаговиком.

Нет ответов
VladM
Offline
Зарегистрирован: 27.10.2016

Здравствуйте!

Скетч парсит 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

Подскажите, в чем может быть дело?

Спасибо!