помощь с энкодером
- Войдите на сайт для отправки комментариев
Всем привет.
Помогите , пжл))
Что имею:
2 оси, на каждой по такому набору.
1. Диск с прорезями ( 25 шт на оборот, диаметр 25 мм)
2. Сдвоенный энкодер оптический. ( т.е. в ардуину входит 2 пина)
3. Шаговый двигатель ( драйвер L298N, но планирую поменять на DRV8825)
4. Физический ограничитель угла поворота в видео металлического стопора, который не дает поворачиваться дальше.
При включении необходимо чтоб устройство крутило каждую ось до упора против часовой стрелки.
В программировании не силен, но интуитивно понимаю как это может выглядеть.
Например,
Двигатель крутится.
Если задержка между тиками (переходами из 0 в 1 или из 1 в 0 ) больше скольки-то милисекунд, то он считает это нулевой точкой и отправляет на 20 шагов в обратную сторону.
Либо так.
Если скорость вращения энкодера 0 , то считать , что ось встретилась с упором и это начальная точка, а потом прибавить 20 шагов в обратную строну.
А помощь-то Вам в чём нужна? Вы не задали ни одного вопроса!
И, да, прочитайте пожалуйста вот этот топик. особенно обратите внимание на п.5 (но, прочитайте все).
А помощь-то Вам в чём нужна? Вы не задали ни одного вопроса!
Точно) Сорри!)) Просто думал обрисовать задачу и будет все понятно. Но!
Исправляюсь и уточняю.
Как мне реализовать такой скетч?
Я так понимаю, что нужно испольть Библиотеку TimerOne ?
Полностью согласен с правилами)) Но я прям не знаю с чего мне начать...прям ступор какой-то)) Сейчас попробую набросать то как это я вижу)) Но потом вы же в меня палками и будете кидать))
Полностью согласен с правилами)) Но я прям не знаю с чего мне начать...прям ступор какой-то)) Сейчас попробую набросать то как это я вижу)) Но потом вы же в меня палками и будете кидать))
Начните с алгоритма - обычными словами опишите, что вам надо сделать. Типа, сделать чай - После появления желания, встать со стула, подойти к чайнику, протянуть руку, взяться за крышку, снять крышку, положить крышку, протянуть руку, взяться за ручку чайника, поднять чайник, подойти к крану и т.д. Надеюсь поняли. Задача должна быть разбита на минимальные действия, которые могут быть исполнены оператором языка. Если выполнение одной командой-функцией невозможно, подзадача дробится на более мелкие.
Потом берете свой алгоритм и транслируете его в операторы Ардуино.
Когда человек пишет сам, пусть и с ошибками, нормально воспринимает критику и пытается исправить ошибки, никто над ним смеяться не будет.
Хм, пока это не алгоритм, а все теже хотелки. Вы хотя бы раздел программирование, проштудировали? Напомню: "Если выполнение одной командой-функцией невозможно, подзадача дробится на более мелкие."
Подключаете библиотеки, какие? Используя библиотеку надо знать ее систему команд, иначе писать в алгоритм будет нечего.
Определяете переменные и вместо оператора присваивания (=), пишете оператор сравнения (==). Старайтесь имена переменных делать более менее осмысленными.
"МК определяет наличие......" - МК не умеет ничего определять, он умеет считывать нолики-единички и исполнять команды языка.
и т.д. Незачет.)))))
Может поставить два концевика, а не страдать с энкодером?
Может поставить два концевика, а не страдать с энкодером?
К сожалению, нет.
во-первых, их просто некуда ставить.
во-вторых, У этого устройства уже есть мешаническая часть и ее переделать будет сложнее, чем придумать как реализовать програмную часть.
Хотя, вы правы, так было бы намного удобнее.
НО почему во всех подобных штуках именно энкодеры стоят
Незачет.)))))
Совершенно с этим согласен)) Но я сделал своими простыми словами))
Дальше , как вы и говорили будем наращивать и переводить на другой язык))
Алгоритм действий есть, просто он не совсем структурирован, но в целом понятно, думаю, что именно должно происходить))
Судя по описанию - двигатель ходит туда-сюда на расстояние 20 шагов. Т.е. длина пробега известна. Если железка крепкая, то достаточно один раз пойти по часовой на 20 шагов, точно упереться, попропускать шаги и потом туда-сюда мотать по 20 шагов.
Я не против вашей идеи с энкодером, просто боюсь, что не дотянете до финала.
туда-сюда на расстояние 20 шагов.
Не, немного не так. до полного стопа около 1200 шагов. 20 шагов нужны тогда, когда ось уперлась, и обратно отмотать 20 шагов чтоб без напряжения ось была и была готова крутиться.
Я не против вашей идеи с энкодером, просто боюсь, что не дотянете до финала.
Все может быть, но я настройчивый)) В любом случае сделаю. Уверен, что на этом форуме есть добрые люди, которые напрявят в нужное русло эту реку))
#include <TimerOne.h> #include <AccelStepper.h> // ПОдключаются библиотеки ( Двигатель, таймер) //переменные volatile long int countX = 0; // Счетчик volatile long int countY = 0; // Счетчик volatile long int oldcountX = 0; // Для вычисления скорости volatile long int oldcountY = 0; // Для вычисления скорости volatile float spdX = 0; // значение скорости) volatile float spdY = 0; // значение скорости) //переменные загрузки int a = 0; int b = 0; int c = 0; // МК определяет наличие Шаговых двигателей Dir\step // ось х #define ST1_DIR 4 #define ST1_STEP 5 // ось y #define ST2_DIR 7 #define ST2_STEP 6 AccelStepper stepper1(AccelStepper::DRIVER, ST1_STEP, ST1_DIR); AccelStepper stepper2(AccelStepper::DRIVER, ST2_STEP, ST2_DIR); //------------SETUP-------------// void setup() { // параметры двигателей stepper1.setMaxSpeed(1200); // максимальная скорость stepper2.setMaxSpeed(1200); // // МК определяет наличие оптических датчиков ( 2 шт по 2 канала) на 4х пинах. pinMode(2, INPUT); //encX1 pinMode(8, INPUT); //encX2 pinMode(3, INPUT); //encY1 pinMode(9, INPUT); //encY2 //функция для считывания скорости attachInterrupt(0, countEncX, RISING); attachInterrupt(1, countEncY, RISING); Timer1.initialize(1000000); // определяет таймер Timer1.attachInterrupt(speedEncX); Timer1.attachInterrupt(speedEncY); Serial.begin(9600); } //------------LOOP-------------// void loop() { if (spdX == 0 && a == 0) { // ТУТ БУДЕТ РАБОТА С LCD 2004 a = 1 ; } //Загрузка мотора 1// if ( a == 1) //Если а равно 1 двигатель крутится до остановки { digitalWrite(4, HIGH); //DIR Pin в режим high digitalWrite(5, HIGH); //STEP Pin в HIGH delay(1); // digitalWrite(5, LOW); //STEP Pin в LOW delay(1); // } else if (a == 1 && spdX == 0) // a = 1 и скорость = 0 , то а = 2 и движение от стоп до 0 позиции { digitalWrite(5, LOW); //STEP Pin в LOW a = 2; // установить а = 2 } if (a == 2) // { digitalWrite(4, LOW); //DIR Pin в LOW (в другую сторону) if (b <= 20) //b <= 20 --> 20 шагов в другую сторону { digitalWrite(5, HIGH); //STEP Pin в HIGH delay(1); // digitalWrite(5, LOW); //STEP Pin в LOW delay(1); // b = b + 1; //увеличивать b на 1 } if (b == 21) //если b = 21 { a = 3; // то а = 3 } } //-Загрузка мотора 2// if (a == 3) //если а = 3, то крутим мотор 2 до упора { digitalWrite(7, HIGH); //DIR Pin в направление HIGH digitalWrite(6, HIGH); //STEP Pin в HIGH delay(1); //Delay von 1 ms digitalWrite(6, LOW); //STEP Pin в LOW delay(1); // } else if (a == 3 && spdY == 0) // а = 3 и скорость = 0 { digitalWrite(6, LOW); //STEP Pin в LOW a = 4; // а = 4 } if (a == 4) // а если а = 4 , то двигаем до нулевой точки из упора { if (c <= 20) // c <= 20 --> 20 шагов { digitalWrite(7, LOW); //DIR Pin в другую сторону digitalWrite(29, HIGH); //STEP Pin в HIGH delay(1); // digitalWrite(29, LOW); //STEP Pin в LOW delay(1); // c = c + 1; //увеличиваем на c на 1 } } if (c == 21) //если с = 21 { a = 5; } } //------------ФУНКЦИЯ countEnc (счетчик)------------// void countEncX () { countX++; } //------------ФУНКЦИЯ SpeedEnc ( вычисление скорости)-------------// void speedEncX() { spdX = float(countX - oldcountX); oldcountX = countX; } //------------ФУНКЦИЯ countEncY (счетчик)------------// void countEncY () { countY++; } //------------ФУНКЦИЯ SpeedEncY ( вычисление скорости)-------------// void speedEncY() { spdY = float(countY - oldcountY); oldcountY = countY; }Ну в общем, что-то родил)) Совершенно запутался местами. Хочется услышать критику)))
Работает?
Еще не проверил))) В телефоне накидал
Тогда понятно. Как считаете - есть шанс у "a" перекатится в значение 2?
Тогда понятно. Как считаете - есть шанс у "a" перекатится в значение 2?
Как только spdX ,будет равна нулю, то почему бы и нет)
Или я ошибся где -то? к чему эта интрига ? Если видите ошибку, то направьте, пжл
Главное - строки 46 и 47. Два обработчика на одно прерывание повесить нельзя.
По мелочи - не вижу, для чего переменным spdX и spdY тип float.
Работает?
С чего бы?
Тогда понятно. Как считаете - есть шанс у "a" перекатится в значение 2?
Как только spdX ,будет равна нулю, то почему бы и нет)
Или я ошибся где -то? к чему эта интрига ? Если видите ошибку, то направьте, пжл
Да какая тут интрига. Я считаю, что у "a" и "b" нет шансов получить значение 2. Поэтому и спрашиваю - работает или нет.
Тогда понятно. Как считаете - есть шанс у "a" перекатится в значение 2?
Как только spdX ,будет равна нулю, то почему бы и нет)
Или я ошибся где -то? к чему эта интрига ? Если видите ошибку, то направьте, пжл
Да какая тут интрига. Я считаю, что у "a" и "b" нет шансов получить значение 2. Поэтому и спрашиваю - работает или нет.
Так а почему вы так считаете?
Хочется услышать критику)))
а чего Вам ещё хочется?
Запустите, проверьте, и, если после этого будут конкретные вопросы, - задавайте.
А то, ведёте себя как ленивая задница. Накидал он! В телефоне! Да хоть в телевизоре, запустите, проверьте и задавайте конкртеные вопросы. Сам он видите-ли не проверял, занят шибко, а все остальные щас должны кинуться проверять за него. С какого перепугу? И, да, кстати, накидывают бабы платки на плечи, а набрасывают навоз на грядки.
Так а почему вы так считаете?
Да, посмотрите ж Вы, наконец, на строки №№ 60 и 69 и скажите: при каких обстоятельствах условие в строке 60 НЕ сработает, а в строке 69 - сработает?
Посмотрите и ответьте.
Да какая тут интрига. Я считаю, что у "a" и "b" нет шансов получить значение 2. Поэтому и спрашиваю - работает или нет.
Так а почему вы так считаете?
Строки 60 и 69 - какая из них будет выигрывать?
И зачем аксельстеппер присобачен в сетапе?
Спасибо за замечания :) Теперь давайте подробнее:)
Главное - строки 46 и 47. Два обработчика на одно прерывание повесить нельзя.
Нужно завести второй таймер? или какая-то другая библитека?
По мелочи - не вижу, для чего переменным spdX и spdY тип float.
Могу предполождить, что нужно int ? Пока не особо понимаю чем они отличаются кроме того, что float для цифр с плаваюбщей запятой, а int для целых
Нужно завести второй таймер?
или какая-то другая библитека?
Нет, тут нужен другой разработчик, которому религия позволяет сделать обе операции в одном обработчике.
А то, ведёте себя как ленивая задница. Накидал он! В телефоне! Да хоть в телевизоре, запустите, проверьте и задавайте конкртеные вопросы.
Благодарю Вас за столь откровенное высказывание и напутствие, но пока нет необходимости проверять на физическом уровне, так как я и не рассчитывал, что програмно сделаю все верно с первого раза. Если и так очевидно, что есть ошибки, то смысл запускать? Мне очень гордо, что вы не прошли мимо и все-таки указали на ошибки, что реально мне помогло. НО если вам совсем тяжело и даже противно от моих скудных знаний, то я очень извиняюсь, что потревожил вас.
Когда человек пишет сам, пусть и с ошибками, нормально воспринимает критику и пытается исправить ошибки, никто над ним смеяться не будет.
А вы говорите :))) тут уже околоОскорбления и какой-то злорадный юмор на тему "не той религии" пошли.
Ты умеешь это делать? Хотелось бы посмотреть.
Могу ошибаться, но насколько мне известно в arduino 3 таймера можно запустить.
Решил убрать пока одну ось. Думаю, что будет правильно решить вопрос с одной, а потом по аналогии за вторую браться. Ну и чтоб место сэкономить.
#include <TimerOne.h> #include <AccelStepper.h> // ПОдключаются библиотеки ( Двигатель, таймер) //переменные volatile long int countX = 0; // Счетчик volatile long int oldcountX = 0; // Для вычисления скорости volatile int spdX = 0; // значение скорости) //переменные загрузки int a = 0; int b = 0; //двигатели AccelStepper stepper1(AccelStepper::DRIVER, 5, 4); AccelStepper stepper2(AccelStepper::DRIVER, 6, 7); //------------SETUP-------------// void setup() { // датчик pinMode(2, INPUT); //encX1 //функция для считывания скорости attachInterrupt(0, countEncX, RISING); Timer1.initialize(1000000); // определяет таймер Timer1.attachInterrupt(speedEncX); Serial.begin(9600); } //------------LOOP-------------// void loop() { if (spdX == 0 && a == 0) { // ТУТ БУДЕТ РАБОТА С LCD 2004 a = 1 ; } //Загрузка мотора 1// if ( a == 1 && countX == 0 ) //Если а равно 1 и счетчик countX = 0 двигатель крутится до остановки { digitalWrite(4, HIGH); //DIR Pin в режим high digitalWrite(5, HIGH); //STEP Pin в HIGH delay(1); // digitalWrite(5, LOW); //STEP Pin в LOW delay(1); // } else if (a == 1 && spdX == 0) // a = 1 и скорость = 0 , то а = 2 и движение от стоп до 0 позиции { digitalWrite(5, LOW); //STEP Pin в LOW a = 2; // установить а = 2 } if (a == 2) // { digitalWrite(4, LOW); //DIR Pin в LOW (в другую сторону) if (b <= 20) //b <= 20 --> 20 шагов в другую сторону { digitalWrite(5, HIGH); //STEP Pin в HIGH delay(1); // digitalWrite(5, LOW); //STEP Pin в LOW delay(1); // b = b + 1; //увеличивать b на 1 } if (b == 21) //если b = 21 { a = 3; // то а = 3 } } } //------------ФУНКЦИЯ countEnc (счетчик)------------// void countEncX () { countX++; } //------------ФУНКЦИЯ SpeedEnc ( вычисление скорости)-------------// void speedEncX() { spdX = int(countX - oldcountX); oldcountX = countX; }Когда человек пишет сам, пусть и с ошибками, нормально воспринимает критику и пытается исправить ошибки, никто над ним смеяться не будет.
А вы говорите :))) тут уже околоОскорбления и какой-то злорадный юмор на тему "не той религии" пошли.
А кто тут пишет сам? Ты не пишешь, ты "накидываешь", а отлаживать "не видишь смысла", хочешь чтобы другие за тебя ляпы вылавливали. Это и называется "ленивая задница".
Могу ошибаться, но насколько мне известно в arduino 3 таймера можно запустить.
Я и спросил, "ты умеешь это делать"?
Вот вы считаете, что правы? Прямо с порога заявляя, я не запускал, зачем? Никто и никогда не написал программу с первого раза, она пишется, заливается и начинается отлов багов. Иначе никак.
Sadman задал вопрос, вы начали искать интригу. А интриги нет, вы сами должны найти ошибку, а найти ее можно только запустив в работу.
Прямо с порога заявляя, я не запускал, зачем? Никто и никогда не написал программу с первого раза, она пишется, заливается и начинается отлов багов. Иначе никак.
Все верно. Так и будет сделано, но чуть позже, когда хотя бы логично всё будет. Я благодарен каждому кто хотя бы прочитал то, что я тут пишу. Но реально сейчас я понимаю, что запуск ( всего механизма) не даст вообще ничего...будет просто тишина, а как я пойму ошибки, если я в этом не очень понимаю и каких-то сигналов мне наподаст устройство. Так как это не программа а ПОКА #кучамала , и на это мне уже несколько человек указали. Работаю и думаю дальше и ни разу не думал о лени в заднице.
И вот как раз сейчас занимаюсь этим :)
Все верно. Так и будет сделано, но чуть позже, когда хотя бы логично всё будет. Я благодарен каждому кто хотя бы прочитал то, что я тут пишу. Но реально сейчас я понимаю, что запуск ( всего механизма) не даст вообще ничего...будет просто тишина, а как я пойму ошибки, если я в этом не очень понимаю и каких-то сигналов мне наподаст устройство. Так как это не программа а ПОКА #кучамала , и на это мне уже несколько человек указали. Работаю и думаю дальше и ни разу не думал о лени в заднице.
Лень в заднице родилась из неочевидного для вас факта: ЕвгенийП, обычно берет чей-то код, заливает и смотрит как это работает. Какая должна быть его реакция? Лучше извинитесь.
Получить от устройства сигналы очень просто, ставите в ключевых точках вывод в сериал и смотрите как себя ведет программа. В случае сомнений, также через сериал мониторите значения переменных.
Перед каждым, кого расстроил в этой ветке искренне извиняюсь.
ЕвгенийП , bwn , Sadman41 , Ворота и другие, если про кого-то не заметил.
Спасибо вам большое за помощь :) И давайте чуть-чуть меньше агрессии, пжл. Если можно) Я только учусь
Я только учусь
В том-то и дело, что не учишься. а пытаешься всех заставить на себя работать, сам нихера не делая. Тебе это уж тут несколько человек пытаются объяснить.
Я только учусь
В том-то и дело, что не учишься. а пытаешься всех заставить на себя работать, сам нихера не делая. Тебе это уж тут несколько человек пытаются объяснить.
Опять 25ть... вроде проехали уже.
Да! я нихрена не умею в этой области! Сразу в первых строках темы это написал. Но про "НЕ УЧИШЬСЯ" - ошибка. и лишний вывод. Я сегодня третий раз IDE открыл и уже что-то попробывал сделать. Уверен, что это уже прогресс. Откуда и почему у тебя столько негатива?
Такие как ты здесь появляются несколько раз в неделю. Главные тезисы:
1. Я навичёк!
2. Я ни хера не знаю!
3. Изучать мне "некогда"/"не охота"/"зачем на один раз" ... и т.д., вот ты выдал "не вижу смысла"
4. Вы должны мне пабыстрому помочь сделать модуль посадки на Луну, для Вас же это на 5 минут (ну и минет, заодно)
5. Иначе, зачем вообще такой форум?
Знаешь, как задрало уже?
Да! я нихрена не умею в этой области! Сразу в первых строках темы это написал. Но про "НЕ УЧИШЬСЯ" - ошибка. и лишний вывод. Я сегодня третий раз IDE открыл и уже что-то попробывал сделать. Уверен, что это уже прогресс. Откуда и почему у тебя столько негатива?
Для Вас этот проект пока сложен. Разбивайте на маленькие части - отдельно кнопки, двигатели, энкодеры, прерывания и т.д. Осваивайте всё по частям. Пишите код, запускайте, проверяйте, исправляйте - пока он не заработает так как Вам нужно и в нём не будет понятна каждая строка. А сейчас советы по решению Вашей задачи будут Вам просто не понятны.
p.s. Почитайте форум. Про энкодеры, помню, большая тема была. Да и не одна.