Это код для управления шаговым двигателем сначала в одну сторону,затем после паузы в три сек в другую сторону.В основном код понятен,код правельный,двигатель вращается,но чего я не могу понять ,так это строчки 15,16,17 ,я в Ардуино C++ в самом начале изучению,изучаю для того,что хочу понимать что написано в коде,на котором станок будет работать,непонятна логика действий .В обьявлении написано stepn23=0,spedn23=0, значит в 15 строке устанавливаются условия для следующих операторов,и если я правильно понимаю в 16 строке от spen23 минусуется единица,для того чтобы stepn 23<0 и тогда начнет действовать логическая строка 17,в которой единыжды сравнивается значение count и вот тут логика становится непонятна, понятно что count++ снова добавляет единицу count становится не нулем а единицей, короче 17 строчка вообще непонятна.Если кто понимает,обясните новенькому логику данного кода . Спасибо.
- Код нужно вставлять целиком и текстом.
- Код нужно вставлять в тэг " < / > ".
Начинать нужно со строк 1 и 2: в них должны быть комментарии, описывающие назначение переменных. Если этого нет, трудоемкость разбора кода увеличивается раз в 100. Причем, работа по разбору кода начинается именно с составления этих комментариев.
Вряд ли можно разбирать код, не зная арифметики.
PS. Код писал явно новичок в программировании, так что, если хотите использовать именно этот код, приготовьтесь к тому, что его долго и нудно придется очищать от ошибок.
Вы никогда не встречали в этих ваших интернетах такое?
По рзеузльаттам илссоевадний одонго анлигсйокго унвиертисета, не иеемт занчнеия, в каокм проякде рсапжоолены бкувы в солве
Это к тому, как мозг воспринимает слова, и к тому, как Вы назвали свои переменные stepn23
и spedn23
. Компилятору, конечно, все равно, но ведь этот код также читает и человек, и при беглом просмотре одну переменную очень легко принять за другую.
Народ, зачем тут что-то обсуждать?
Код, вставленный картинкой - это сразу повод закрыть сообщение и забыть об авторе
@aleksandrplastic - вставьте код как текст в новое сообщение, используя теги.
Тогда можно будет поговорить о коде
long stepn23 = 0;
long spedn23 = 0;
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
void loop() {
stepn23 = 309;
spedn23 = 100;
if (stepn23 < 0 && spedn23 > 0){
stepn23 = stepn23*-1;
for (int count = 0; count < stepn23; count++) {
digitalWrite(2, 0);
digitalWrite(3, 1);
delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
digitalWrite(3, 0);
delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
}
stepn23 = stepn23*-1;
}
if (stepn23 > 0 && spedn23 > 0){
for (int count = 0; count < stepn23; count++) {
digitalWrite(2, 1);
digitalWrite(3, 1);
delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
digitalWrite(3, 0);
delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
}
}
if (stepn23 == 0 | spedn23 == 0){
digitalWrite(2, 0);
digitalWrite(3, 0);
}
delay(3*1000);
stepn23 = (-309);
spedn23 = 100;
if (stepn23 < 0 && spedn23 > 0){
stepn23 = stepn23*-1;
for (int count = 0; count < stepn23; count++) {
digitalWrite(2, 0);
digitalWrite(3, 1);
delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
digitalWrite(3, 0);
delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
}
stepn23 = stepn23*-1;
}
if (stepn23 > 0 && spedn23 > 0){
for (int count = 0; count < stepn23; count++) {
digitalWrite(2, 1);
digitalWrite(3, 1);
delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
digitalWrite(3, 0);
delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
}
}
if (stepn23 == 0 | spedn23 == 0){
digitalWrite(2, 0);
digitalWrite(3, 0);
}
delay(3*1000);
}
Это весь код сгенерирован на сайте арду блок из блоков моторы и время, точнее: Основные -программа,Моторы-А4988,Время -задержка,задержка,моторы,задержка,моторы .Вот так появился данный код,и главное код работает.Я вижу критиковать можете,а получше что то можете придумать с обьяснением данного кода!?
Спасибо за код,.
Это вот тут? Думаете минусуется?
Не знаю как Вам, а для меня это умножение на -1
stepn23 = stepn23 * (-1);
Объяснить код, написанный машиной по указаниям новичка может только машина. Или экстрасекс.
это не отменяет того, что код местами бредовый. Например тут (line 13)
Как может быть stepn23 меньше нуля, если вы двумя строками выше присвоили ей значение 309? Итог - блок кода в строках 15-25 НИКОГДА не выполнится и его можно просто выкинуть.
Ровно то же самое относится к блокам в строках 35-38 и 63-66
if (stepn23 == 0 | spedn23 == 0){
он никогда не выполнится, потому эти две переменные в вашем коде никогда не приравниваются нулю.
Все еще думаете, что код “работает”?
увы, но местами в этом коде логика полностью отсуствует, как я показал на примерах выше. Можно попытаться восстановить, чтоже пытался тут изобразить автор кода… но для этого нужно чтобы вы детально сформулировали задачу - то есть что и в какой последовательности должны делать моторы.
Признавайтесь, код сгенерирован на каком-нибудь сервисе искусственного интеллекта, типа ЧатГПТ? Если да - то почему бы вам не попросить того же робота исправить ошибки?
И ножкой топни ещё. Ты погоди, это главные критики пока не подключились. Ох как они любят новичков с такими наездами.
ладно ,пусть покритикуют,код придуманный автором сайта ардуино блок,если смогут,а вот думающим по существу вопрос по данному коду: при ожидании 3 секунды шаговой мотор гудит,мотор нема17 1.5А ,как будто он под напряжением в период ожидания,существует ли возможность осуществлять задержку так,чтобы фаза мотора вообще отключалась и он не гудел,то есть отключать питание в момент ожидания.Спасибо.Любителям пофлудить просьба не беспокоиться
это он от ненависти гудит, к ардублоку
Да просто пятница - все гудят.
Пока ENA им не отключишь.
Основное это научиться двигать валы ДВУХ и более моторов на произвольно разное число шагов в любую сторону за ОДНО и тоже время. И тогда можно станочек и т.д. Поэтому “делей” не катит от слова совсем.
Хотите получить объяснения, выполните сначала озвученные рекомендации.
В таком виде разбираться в коде - напрасная трата времени.
Если критика не воспринимается, какой смысл продолжать обсуждение?
Это не “как будто”, это нормальный режим работы шагового двигателя.
Отключать питание, конечно, можно, но при этом будет сдвигаться положение ротора.
Вы настолько наивны, что не понимаете, что “сгенерированный на сайте” не равно “придуманный автором” ?
Или просто откровенно врете?
Не вижу смысла далее обсуждать этот “работающий” код. Сначала исправьте указанные ошибки.
#define STEP_PIN_X 2 //пины двигателя Х
#define DIR_PIN_X 5
#define ENABLE_PIN 8 //пин включения общий
#define STEP_PIN_Y 3 //пины двигателя Y
#define DIR_PIN_Y 6
//Пин кнопки
#define start_button A2
//Здесь можно настроить время поворота и паузы
#define move_forward_time 1700 //время прямого хода в мсек
#define move_back_time 1706 //время обратного хода в мсек
#define pause_time 4000 //время паузы в мсек
#define frequency_X 2300 //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц,
//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц
//Таймер для millis()
uint32_t timer = 0;
//Логический флаг для рабочего режима
bool flag = 0;
void setup() {
pinMode(start_button, INPUT_PULLUP); //Подтягиваем кнопку к питанию
pinMode(STEP_PIN_X , OUTPUT); //Настраиваем пины управления
pinMode(DIR_PIN_X , OUTPUT);
pinMode(STEP_PIN_Y , OUTPUT); //Настраиваем пины управления
pinMode(DIR_PIN_Y , OUTPUT);
pinMode(ENABLE_PIN , OUTPUT);
digitalWrite(ENABLE_PIN , HIGH); //Выключаем моторы, чтобы не грелись
}
void loop () {
if (digitalRead(start_button)) { //Если нажали на кнопку
digitalWrite(ENABLE_PIN , LOW); //Включаем моторы
flag = 1; //Активируем флаг рабочего режима
timer = millis(); //Запускаем таймер
}
if (flag) { //Если флаг активирован
digitalWrite(DIR_PIN_X , HIGH); //Задаем направление вращения двигателя X
// for (int i = 0; i < 200; i++) { //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
// digitalWrite(STEP_PIN , HIGH);
// delayMicroseconds(frequency);
// digitalWrite(STEP_PIN , LOW);
// }
// flag = 0;
do { //Крутим движок X move_forward_time мсек
digitalWrite(STEP_PIN_X , HIGH);
delayMicroseconds(frequency_X);
digitalWrite(STEP_PIN_X , LOW);
} while (millis() - timer < move_forward_time);
delay(700); //Пауза 0.7 сек
digitalWrite(DIR_PIN_Y , HIGH); //Задаем направление вращения двигателя Y
timer = millis(); //Снова запускаем таймер
do { //Крутим движок Y move_forward_time мсек
digitalWrite(STEP_PIN_Y , HIGH);
delayMicroseconds(frequency_X);
digitalWrite(STEP_PIN_Y , LOW);
} while (millis() - timer < move_forward_time);
delay(pause_time); //Пауза pause_time мсек
digitalWrite(DIR_PIN_X , LOW); //Задаем направление вращения двигателя X
digitalWrite(DIR_PIN_Y , LOW); //Задаем направление вращения двигателя Y
timer = millis(); //Снова запускаем таймер
do { //Крутим движки X и Y move_back_time мсек
digitalWrite(STEP_PIN_X , HIGH);
digitalWrite(STEP_PIN_Y , HIGH);
delayMicroseconds(frequency_X);
digitalWrite(STEP_PIN_X , LOW);
digitalWrite(STEP_PIN_Y , LOW);
} while (millis() - timer < move_back_time);
flag = 0; //Гасим флаг
digitalWrite(ENABLE_PIN , HIGH); //Выключаем моторы, чтобы не грелись
delay(2000); //Вот здесь добавил паузу 2 сек
}
}
в ютьюбе какой то мужик подсказал,скачал,сохранил,пока не пользовался,может кому пригодится
Вы понимаете разницу между одновременно и по очереди ? В принтере одновременно 3 шаговика двигают механику по разному. Никаких delay, делеймикро и т.д. В примере они синхронно идут, т.е. с одинаковым числом шагов на одно и тоже время.