Здравствуйте уважаемые участники форума.Прошу прощения за столь примитивную задачу которую не могу решить без вашей помощи.Задача заключается в следующем,требуется проверить привод на шаговом двигателе,а точнее повторяемость.Повторяемость это погрешность которая возникает в любом механизме перемещения из за неточностей в передаче.Проще говоря имеется передача на рейке,с одной стороны стоит микрометр,требуется замерить какая ошибка накопится при перемещении каретки влево вправо 10раз.Имеется драйвер шагового двигателя с входами STEP и DIR (шаг и направление).Нужен такой код,который бы позволял гонять каретку влево вправо 10 раз и на несколько секунд останавливался в левом положении и цикл продолжался.Говоря другим языком на вход DIR (каретка движиться влево) подать лог 0, на вход step нужно подать 1000 импульсов, на 1001 импульс подать сигнал на вход DIR лог1 (изменится направление движения каретки вправо) спустя еще 1001 т.е на 2002 импульс снять сигналс DIR (лог0 каретка опять поедет влево ) и так 10 раз,после 5 секунд задержаться в левом положении(лог 0 на DIR 5сек) при этом импульсы на Step не подавать,по истечении 5 секунд возобновить все что было написано выше.5 секунд требуется для того что бы снять показания с микрометра.
Пока для генератора импульсов STEP думаю использовать готовый пример без Delay const int STEPPin = 13; // номер выхода, подключенного к STEP int STEPState = LOW; // этой переменной устанавливаем состояние STEP long previousMillis = 0; // храним время последнего переключения STEP long interval = 10; // интервал между STEP (0,01 секунда) void setup() { pinMode(STEPPin, OUTPUT); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; if (STEPState == LOW) STEPState = HIGH; else STEPState = LOW; digitalWrite(STEPPin, STEPState); } } как дальше включить счетчик который бы позволял на 1001раз запускать DIR(менять направление движения) и как осуществить прерывание импульсов на 5 секунд после 10 переключений DIR ? (десяти ходов каретки влево вправо для снятия показаний с микрометра)
Заведите переменную. Увеличивайте ее значение после выполнения каждого шага. Затем проверяйте - если дотикало до 1001, меняйте направление вращения. Считайте при этом, сколько раз направление поменялось. В нужный момент делайте паузу.
Просто вроде STEP уже объявлен переменной или Вы имеете ввиду создать совсем новую?как тогда ей присвоить порт если он уже присвоен другой?
Что значит "присвоить порт переменной" и зачем? Вы же реализовали задержку при помощи переменной previousMillis, что мешает посчитать циклы при помощи другой переменной?
Конечно не верно,но хоть в том направлении??? int DIRPIN = 12 const int STEPPin = 13; // номер выхода, подключенного к STEP int STEPState = LOW; // этой переменной устанавливаем состояние STEP long previousMillis = 0; // храним время последнего переключения STEP long interval = 10; // интервал между STEP (0,01 секунда) void setup() { pinMode(STEPPin, OUTPUT); pinMode(DIRPin, OUTPUT) } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; if (STEPState == LOW) STEPState = HIGH; else STEPState = LOW; digitalWrite(STEPPin, STEPState); For (int STEPPin = 0 ;int STEPPin >1000) DijitalWrite (12, High) If (int STEPPin >2000) DijitalWrite (12, Low) } }
Вы хоть попробуйте скомпилировать программу сперва, потом уже выкладывайте. Что за "DijitalWrite @? что такое "For"? Почему половина строк не заканчивается символом ";"? А перед вставкой кода на форум нажимайте Ctrl+T в Arduino IDE и используйте тэг CODE.
Код (Text): const int STEPPin = 13; // номер выхода, подключенного к STEP int DIRPin = 12 // номер выхода для DIR (направление движения) int STEPState = LOW; // этой переменной устанавливаем состояние STEP long previousMillis = 0; // храним время последнего переключения STEP long interval = 10; // интервал между STEP (0,01 секунда) void setup() { pinMode(STEPPin, OUTPUT); pinMode (DIRPin, OUTPUT); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; if (STEPState == LOW) STEPState = HIGH; else STEPState = LOW; digitalWrite(STEPPin, STEPState); for (int STEPPin = 0 ;int STEPPin >1000); // если прошло больше 1000 импульсов digitalWrite (12, High); //подать сигнал,чтоб каретка ехала обратно if (int STEPPin >2000); //если прошло больше 2000 импульсов digitalWrite (12, Low); //убрать сигнал лог1 чтоб каретка поехала в другую сторону } }
помогите,я совсем новичок в программировании,это устройство нужно уже очень срочно,а я ничего не могу придумать путевого и в голове каша,если нужно Вас отблагодарить,сделаю это с удовольствием
Начните с изучения языка. Постарайтесь ответить себе на вопросы: - что делает строка "for (int STEPPin = 0 ;int STEPPin >1000);" и почему именно это? - что делает строка "if (int STEPPin >2000);" и почему? - зачем в конце оператора ставится символ ";" и что он означает? Ошибка компиляции - не просто абстрактная строка, которую зачем-то выдает компилятор. В тексте ошибки компилятор ясно дает понять, что ему не понравилось. Например, сообщение: говорит о том, что "в файле sketch_feb10a на строке 3 отсутствует символ ";" или "," перед "int". Т.е. пропущена запятая или точка с запятой.
Вы правы,нужно завести переменную которая подсчитывала бы значения на выходе STEP например intSchetchik но как ее заставить считать?
Переменная сама по себе ничего считать не будет, "заставить" ее что-то делать не получится. Но можно прибавлять ее значение каждый раз, когда происходит смена направления вращения (в любую сторону или только в нужную - как удобней) и при этом следить за моментом, когда ее значение достигнет искомого.