Официальный сайт компании Arduino по адресу arduino.cc
Счетчик импульсов + SoftwareSerial + дисплей
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всем доброго времени суток! Прошу помоч: через "уно" опрашиваю энекодер на прерываниях, через монитор порта он выводит данные, все прекрасно, но когда захотел вывести информацию на дисплей "nextion" там используются программная шина UART, то столкнулся с ошибкой компиляциипри подключении SoftwareSerial.h и я так понимаю получается конфликт т.к. SoftwareSerial тоже использует прерывания.
кто может подсказать:
1. есть ли возможность опрашивать энкодер с помощью ардуины с высокой частотой подсчитывая все фронты не использую прерывания?
2. можно ли с "уны" опрашивающий энкодер на прерываниях каким то образом передавать значение переменной на "Мегу 2650" а с уже с "Меги" выводить переменную на экран через SoftwareSerial.h ?
3. Может есть другой способ оправать энкодер с высокой частотой не используя прерывания?
пытался использовать вот этот код:
[code] #include <SoftwareSerial.h> const uint8_t pinRX = 4; // Опр. номер вывода Arduino RX программного UART, подключается к выводу TX дисплея const uint8_t pinTX = 5; SoftwareSerial softSerial(pinRX,pinTX); volatile char ABprev = 0; const int increment[16] = {0,-1,1,0, 1,0,0,-1, -1,0,0,1, 0,1,-1,0}; float chetchic = 0.000; ISR (PCINT0_vect) { // char AB = PINB & 3; chetchic += increment[AB+ABprev*4]; ABprev = AB; } void setup() { pinMode(8, INPUT); // A pinMode(9, INPUT); // B PCICR |= (1 << PCIE0); // PCMSK0 |= 3; ABprev = PINB & 3; Serial.begin(115200); } void loop() { if(millis()%50<=2){delay(2); // Следующее действие выполням каждые 50мс softSerial.print((String)"t3.txt=\""+chetchic/1000+"\""+char(255)+char(255)+char(255)); // Отправляем команду дисплею: «t3.txt="текст"» заканчивая её тремя байтами 0xFF. Эта команда устанавливает значение для текстового поля t3 } [/code]
1. есть ли возможность опрашивать энкодер с помощью ардуины с высокой частотой подсчитывая все фронты не использую прерывания?
Например, "ежегодно" - это высокая частота или нет?
2. можно ли с "уны" опрашивающий энкодер на прерываниях каким то образом передавать значение переменной на "Мегу 2650" а с уже с "Меги" выводить переменную на экран через SoftwareSerial.h ?
1. По скорости изменения импульсов у меня на энкодере планируется до 8000 имп/с.
2. А по поводу СофтСериал и Мега, то не знаю как ещё вывести информацию на дисплей "nextion" без него, т.к. в описании библиотеки описан способ именно через CофтСериал, если есть другой способ буду благодарен если подскажете.
А можно огласить весь список пожалуйста? То есть что за задучу надо решить? Почему именно 8000 имп/с и сошелся ли свет клином на Некситоне?
Энкодер 1000 имп на оборот, ожидается скорость вращения до 8 об/с, соответственно 8000 имп/с. Некстион в наличи, хотелось бы все таки использовать его (если конечно это возможно).
Скорость вращения чего? И что именно надо выводить на дисплей?
8 об/с у ШД который вращает ШВП, на дисплей хочу выводить количество импульсов, в дальнейшем планирую откалибровать и перевести в относительные координаты.
Еще раз спрашиваю - опишите подробно, какую задачу вам нужно решить, а не куски какие-то.
Шаговый двигатель вращает ШВП, к которой прикреплен столик за перемещением которого я хочу следить. (как на станках хочу перемещать столик и видеть на сколько он у меня сместился). На вал ШД хочу поставить энкодер для того что бы отслеживать обороты и переводить в растояние...
1. По скорости изменения импульсов у меня на энкодере планируется до 8000 имп/с.
когда я только начинал поделки на ардуине, купил нано 328р
и одна из функций моей первой поделки была измерение оборотов двигателя по датчику холла
тогда у меня еще был говнокод по полной со всеми его тормозами
так вот обычный "дигиталрид" и вывод на дисплей через СПИ на 7219 (7ми сигментный 8 разрядов) сводобно считал 15000 оборотов! (тестировал на дремеле с 15к скоростью вращения).....
так тчо ваши 8000 - это детский лепет для ардуины, даже самой дешевенькой... тат даже тини 13 справится считать это
Шаговый двигатель вращает ШВП, к которой прикреплен столик за перемещением которого я хочу следить. (как на станках хочу перемещать столик и видеть на сколько он у меня сместился). На вал ШД хочу поставить энкодер для того что бы отслеживать обороты и переводить в растояние...
не людите мозги - поставьте датчик хола и считайте его (как нажатия обычной кнопки...) арда без напрягов посчитает вам и 8 000 и 80 000 и даже 800 000 оборотов/мин
к тому же датчик хола не имеет "дребезга" - так что вам просто остается в шарманке смотреть порт на его состояние... всего кода 2 стройчи.... (притом вторая для вывода на экран результата через какую либо библиотеку для этого...)
...к тому же датчик хола не имеет "дребезга"...
Очень спорное утверждение, особенно в случае вращающихся поблизости магнитомягких масс. Даже в кнопочках на датчиках хола при медленном нажимании отлично виден дребезг от микромоторики пальца. Надо брать со встроенным гистерезисом, что бы дребезга не было. Во всяком случае из самых доступных - из вентиляторов компьютера- дребезг виден замечательно.
конденсатор паралельно кнопке/датчика на несколько нф решает проблему (100нф примерно = 7мс)
для 8000 обм/м хватит на 3-5нф
у меня задача не количество оборотов посчитать - а расчитать перемещение стола исходя из данных полученных от энкодера, на сколько градусов повернулся вал. точность в один оборот это грубовато..)
в целом не важно, код программы от этого не поменяется... что д.холла, что оптидатчики, что энкодер - это просто источник импульсов...
\\кстати для точности оптический датчик и зебра на валу могут дать точность очень высокую - именно это используется например в станках балансировки колес, где надо точность до единиц градусов
и да, зачем софтваресериал? у меги 4 аппаратных сериала!!!
переписал код через аппаратный сериал, копиляцию проходит, загружается но на экран не выводит, кто может подсказать в чем может быть проблема?
Сварог, ты в ВУЗе когда-нибудь учился? Что такое "инженерное исследование" изучал?
Суть проблемы мы ищем аналитически, то есть разделяя задачу на составляющие.
1. выводим показания энкодера в стандартный сериал, тот который виден в "мониторе порта".
2. Подключаем к Меге, к сериал3, USB-UART и проверяем, получается ли печатать в третий сериал.
3. проверяем работу Некстиона на Сериал3, без энкодера.
4. и вот теперь проверям все вместе.
Строка 23: что, по вашему мнению, должно отправляться на Nextion? Как по мне - то точно не значение счётчика, а текст для поля t3.txt, со значением "chetchic/1000"
тогда у меня еще был говнокод по полной
А сейчас у тебя что, можно поинтересоваться? Говнокод на 20-ти языках?
нет, теперь у меня полуговнокод на 21 языке
Первое - как Вы защищены от дребезга, я не увидел, или у Вас энкодер очень хороший?
По поводу Вашей программы - не нужно делать так называемых оптимизаций- строка 8, если у Вас массив двумерный, то не стоит руками превращать его в одномерный, компилятор это сделает лучше Вас.
Далее - Вы действительно хотите вывести на экран строку "chetcik/1000" или все таки значение переменной, деленное на 1000.
Ну и в заключение - Вы уверены, что Seril3 доступен, настроен и подключен к Вашему порту? И что означает выдача трех кодов 0xFF в конце сообщения?
Энкодер хороший, с защитой от дребезга.
Про chetcik/1000 уже понял, поменяю, просто думал раз в через монитор порта это срабатывает то и на экран сможет вывести. ну это не вопрос сделаю доп переменную.
Про сериал 3 не уверен что настроен и подключен так как и простейший пример не смог через него работать. не подскажете как его можно настроить?
Про три 0xFF, то это по описанию библиотеки для nextion так закончивается отправка команды на дисплей - тремя байтами 0xFF.
Про сериал 3 не уверен что настроен и подключен так как и простейший пример не смог через него работать. не подскажете как его можно настроить?