Помогите разобраться со скетчем

kyty3ov
kyty3ov аватар
Offline
Зарегистрирован: 07.03.2015

Доброго времени суток, нашел я на просторах данный скетч, но что то не могу разобраться что к чему.

/*
  Motor Test - with AccelStepper
  Run the BigEasy motor driver board
*/

#include <AccelStepper.h>

//Pins
int ms1 = 12;
int st = 5;
int dr = 4;

// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::DRIVER, st, dr);

void setup() {
  // all interface pins to output
  pinMode(ms1, OUTPUT);
  
  // set options --
  // half stepping
  digitalWrite(ms1, HIGH);

  // set up stepper
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(1000);
  stepper.setMinPulseWidth(200);
  
  Serial.begin(115200);
}

void loop() {
  
  char chr, args, step_hi, step_lo, time_hi, time_lo, i;
  word accel;
  static short steps = 0;

  if(Serial.available() > 0) {
    chr = Serial.read();
    
    if (chr == 'G') {
      stepper.move(steps);
      // should be able to interleave running the motor and receiving
      // commands in the future
      while(stepper.distanceToGo() != 0) {
        stepper.run();
      } 
      Serial.write(0x55);
    } else if (chr == 'Y' || chr == 'y') {
      while(Serial.available()==0);
      args = Serial.read();
      while(Serial.available()==0);
      step_hi = Serial.read();
      while(Serial.available()==0);
      step_lo = Serial.read();
      steps = (((unsigned char) step_hi) << 8) | ((unsigned char) step_lo);
      if(chr == 'y') {
        steps = -steps;
      }
    } else if (chr == 'T') {
      while(Serial.available()==0);
      args = Serial.read();
      while(Serial.available()==0);
      time_hi = Serial.read();
      while(Serial.available()==0);
      time_lo = Serial.read();
      accel = (((unsigned char) time_hi) << 8) | ((unsigned char) time_lo);
      stepper.setAcceleration(accel);
    } else {
      while(Serial.available()==0);
      args = Serial.read();
      for (i=0;i<args;++i) {
        while(Serial.available()==0);
        chr = Serial.read();
      }
    }
  }
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

таже проблема))

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Это пример из библиотеки для Изидрайвера. Фишка конкретно этой библиотеки - возможность задавать ускорение для шаговика.

kyty3ov
kyty3ov аватар
Offline
Зарегистрирован: 07.03.2015

Ок, можно по конкретнее?)и такой вот еще вопрос, что нужно отправить в сом порт, что б проверить скечт, я уже что только не слал. 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

kyty3ov пишет:

Ок, можно по конкретнее?)и такой вот еще вопрос, что нужно отправить в сом порт, что б проверить скечт, я уже что только не слал. 

Смущает меня ваша аватарка. Ну да ладно...

Берете Ардуино, шаговый мотор, изидрайвер, отдельный блок питания. Все это подключаете и загружаете в Ардуино скетч.

Через порт вы будете управлять мотором. Конкретно "G", "Y", "T"

kyty3ov
kyty3ov аватар
Offline
Зарегистрирован: 07.03.2015

Спасибо)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Смущает меня ваша аватарка. Ну да ладно...

миня тоже смутило ........... отсутствие повязки :)

скорее всего не он побил Наполеона :) , а вот демократизатор в руке - прикольно :) ( ещё и левша )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

посложнее - чем G, Y, y, T

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

судя по коду

G -запуск,  без параметров

Y или y - будет ждать ввода ( последовательного ) args, step_hi, step_lo

T - будет ждать ввода ( последовательного ) args, step_hi, step_lo

_ - ввод args

 

 

что значат args, step_hi, step_lo,  а также time_hi, time_lo  - как в тумане :(

kisoft - правильнее подскажет, чё нано вводить в COM

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Не, мне не интересно, разбираться со скетчем, про который даже написали, для чего он.
Написал бы, скетч для управления шаговым двигателем, может быть и посмотрел, а так, не интересно.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

моя вас хотел спросить про - чё делает код в плане приёма по сериалу ? мине сам ВЕСЬ код - тоже не интересен :)

см. #8 - где моя не прав ? чё не досмотрел ?

спасибо :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

kisoft пишет:
Не, мне не интересно, разбираться со скетчем, про который даже написали, для чего он. Написал бы, скетч для управления шаговым двигателем, может быть и посмотрел, а так, не интересно.

типа :

"пива нет"

и

"ПИВА НЕТУУУУ и НЕ БУДЕТ !!!!!!!!!!!!!!!!!"

:)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Распил скетча следующий. Какашек хватает.

0. Библиотеку AccelStepper взял отсюда. Скетч компилируется (выбрал плату Леонардо). Не проверял, неохота подключать драйвер и искать шаговый движок.

1. Переменные в loop объявлены как char, реально некоторые конвертируются в ходе действий в unsigned char, замечательно. Хотите глюков, продолжайте в том же духе.

2. Объявлены переменные ms1, st, dr как int. Хотя достаточно uint8_t. Плюс это константы, можно так сразу и описать const uint8_t msi и т.п. С т.з. программы без разницы, а с тз понимания = более читабельно.

3. Предполагаю, что в setup лучше поменять местами команды pinMode(ms1, OUTPUT); и digitalWrite(ms1, HIGH);, а то как сейчас, скорей всего будет короткая иголка на этом пине, а если наоборот, то выход не будет дергаться туда-сюда. Сам не пробовал, при случае гляну осциллом.

4. Вот это, как я уже говорил, мрак: char chr, args, step_hi, step_lo, time_hi, time_lo, i; Скорей всего нужно объявить с типом uint8_t для всех этих переменных.

5. loop выполняет следующее:

Ждем один символ (команду). Далее в зависимости от символа:

'G':
stepper.move(steps);
и ждем, когда он туда прибудет.
В сериал выводим 0x55 ('U')

'Y' или 'y':
Ждем символ из сериала, записываем в args (далее не используется)
Ждем step_hi & step_lo, преобразуем в
steps = (((unsigned char) step_hi) << 8) | ((unsigned char) step_lo); // Что то я не уверен, правильно ли это будет работать, потому что при сдвиге байта влево на 8 бит он должен обнулиться.
Если команда 'y', то шаги отрицательные (меняем знак).

'T':
Ждем args, time_hi, time_lo
Рассчитываем
accel = (((unsigned char) time_hi) << 8) | ((unsigned char) time_lo);
Установка параметра ускорение в библиотеке
stepper.setAcceleration(accel);

Иначе, если команда другая:
Ждем args
Затем ждем args символов из сериала, но нигде не используем.
 
Резюме: Команды 'Y', 'y', 'T' подготовительные, они устанавливают нужные параметры, которые используются в команде 'G'.
Y & y - устанавливают количество шагов.
T - устанавливает ускорение.
G - запускает двигатель на заранее установленное кол-о шагов и с указанным ускорением и ждем, когда это кол-во шагов будет выполнено, после чего выводит в сериал символ 'U'.
Всё это похоже на то, что есть внешняя программа, которая в UART Arduino заливает данные, потом Arduino их выполняет, в ответ выдает символ 'U', что означает конец выполнения шага и внешняя прога может выполнять другой шаг.
 
Вот и сказочке конец..
Если где ошибся, может быть.
 
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

спасибо :)

kyty3ov
kyty3ov аватар
Offline
Зарегистрирован: 07.03.2015

kisoft, Спасибо большое)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

SU-27-16 пишет:

посложнее - чем G, Y, y, T

"y" - для эстетов