Помогите разобраться со скетчем
- Войдите на сайт для отправки комментариев
Сб, 07/03/2015 - 19:55
Доброго времени суток, нашел я на просторах данный скетч, но что то не могу разобраться что к чему.
/*
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();
}
}
}
}
таже проблема))
Это пример из библиотеки для Изидрайвера. Фишка конкретно этой библиотеки - возможность задавать ускорение для шаговика.
Ок, можно по конкретнее?)и такой вот еще вопрос, что нужно отправить в сом порт, что б проверить скечт, я уже что только не слал.
Ок, можно по конкретнее?)и такой вот еще вопрос, что нужно отправить в сом порт, что б проверить скечт, я уже что только не слал.
Смущает меня ваша аватарка. Ну да ладно...
Берете Ардуино, шаговый мотор, изидрайвер, отдельный блок питания. Все это подключаете и загружаете в Ардуино скетч.
Через порт вы будете управлять мотором. Конкретно "G", "Y", "T"
Спасибо)
Смущает меня ваша аватарка. Ну да ладно...
миня тоже смутило ........... отсутствие повязки :)
скорее всего не он побил Наполеона :) , а вот демократизатор в руке - прикольно :) ( ещё и левша )
посложнее - чем G, Y, y, T
судя по коду
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
Не, мне не интересно, разбираться со скетчем, про который даже написали, для чего он.
Написал бы, скетч для управления шаговым двигателем, может быть и посмотрел, а так, не интересно.
моя вас хотел спросить про - чё делает код в плане приёма по сериалу ? мине сам ВЕСЬ код - тоже не интересен :)
см. #8 - где моя не прав ? чё не досмотрел ?
спасибо :)
типа :
"пива нет"
и
"ПИВА НЕТУУУУ и НЕ БУДЕТ !!!!!!!!!!!!!!!!!"
:)
Распил скетча следующий. Какашек хватает.
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 - устанавливают количество шагов.
спасибо :)
kisoft, Спасибо большое)
посложнее - чем G, Y, y, T
"y" - для эстетов