После Serial.print код выполняется не корректно
- Войдите на сайт для отправки комментариев
Пт, 22/09/2017 - 11:25
#include <AccelStepper.h> #include <max6675.h> MAX6675 thermocouple(30, 32, 31); AccelStepper Stepper1(1,50,51); int dir = 1; void setup() { Serial.begin(9600); Stepper1.setMaxSpeed(2000); Stepper1.setAcceleration(23000); } void loop() { Serial.print(thermocouple.readCelsius()); Serial.println(" "); if(Stepper1.distanceToGo()==0){ Stepper1.move(6400*dir); dir = dir*(-1); delay(1000); } Stepper1.run(); }
Не туда кликнул, тема создалась, теперь не могу найти как редоктировать...
Т.е. Без
Serial
.print все работает, если его добавить, то на движок подается что-то непонятное.
П.С. *некорректно
вот это што?
AccelStepper Stepper1(1,50,51);
Если 1 в скобках это номер ноги, то так и должно быть
Первый режим драйвера, пины 50 и 51. Говорю же, без
Serial
.print все работает.
Виноват, невнимательно посмотрел код и написал глупость :(
Эх, а я уже обрадовался, что проблемма решина, хоть и каким-то странным методом. Так что же делать? (
Попробуйте перед строкой 25 вставить cli(); а после неё sei(); Скажите поможет ли.
Не помогло.
А если тоже самое со строкой 21 (и 25-ую оставьте - обе сделайте). И, если не поможет, дайте текущий скетч.
а если так
Не помогло
Vasilisk, имейте ввиду, что строкой Serial.print(thermocouple.readCelsius()); вы вызываете две функции. Может сериал тут и не имеет никакого отношения, особенно если принять во внимание что функция thermocouple.readCelsius() использует тормозную ардуиновскую библу.
Даже если оставить только строчку
Serial
.println(
" "
);
, все рано не работает. Двигатель не шевелится, только попискивает, как буд-то бы на него помехи идут.Ну, похоже, приплыли, надо внимательно смотреть библиотеку двигателя. Она же, сволочь, асинхронно работает, а сериал свои прерывания гонит, вот там что-то ломается с таймингами. Я бы посмотрел, но у меня сейчас нет под рукой нужного железа, извините :(
Всё, что молу посоветовать - запускайте мотор через драйвер (типа там A4988), тогда Вы не будете чувствительны к таймингам, там и без библиотеки всё элементарно делается
У меня TB6560. И мне важно обеспечить очень плавный ход. Сейчас попробую через другую библиотеку.
У меня TB6560. И мне важно обеспечить очень плавный ход. Сейчас попробую через другую библиотеку.
А лучше вовсе безо всякой библиотеки. Там всё настолько элементарно делается. Вот, посмотрите примерчик маленький. Он, конечно, для A4988, но разницы-то нет особо никакой!!! У TB6560 тоже есть step-pin и dir-pin, осталось только шаг сконфигурить.
Даже если оставить только строчку
Serial
.println(
" "
);
, все рано не работает. Двигатель не шевелится, только попискивает, как буд-то бы на него помехи идут.Ну по крайней мере поднимите скорость до 115200 :)
Сделал как у вас... результат тот же.
Может я где-то очень глупо ошибся, и вы даже не подумали бы о таком?
Сделал как у вас... результат тот же.
Это как у меня в примере или о чём-то другом речь?
И что, без сериала работает?
Давайте уточним без чего именно работает.
1. Полностью удаляем работу с сериалом (при этом в строке 18 сериал убираем, а thermocouple.readCelsius() оставляем!)
2. Оставим только строку 9
3. Оставим строки 9 и 18
4. Как сейчас.
Распишите, пожалуйста как работает, а как нет.
Если оставить только thermocouple.readCelsius(); то не работает. Если оставить только
Serial
.println(
" "
);
, то дергается, как буд-то бы шаги пропускает.Если оставить только thermocouple.readCelsius(); то не работает. Если оставить только
Serial
.println(
" "
);
, то дергается, как буд-то бы шаги пропускает.Лучше бы Вы по пунктам расписали.
Я правильно пнимаю, что если Сериал убрать вовсе, а thermocouple.readCelsius(); - оставить, то уже не работает? Так?
Пожалуйста! Сделайте так, как написал Евгений, то есть 4 варианта:
И про КАЖДЫЙ напишите. Иначе неясно как искать черную кошку в темной комнате.
1.
2.
3.
4.
Ну и если грешите именно на Serial, логично было бы проверить, как изменится работа при выводе на LCD1602.
1) Не работает. На движок подаются помехи, он не двигается, но побулькивает.
2) Не работает. На движок подаются помехи, он не двигается, но побулькивает.
3) Не работает. На движок подаются помехи, он не двигается, но побулькивает.
4) Не работает. На движок подаются помехи, он не двигается, но побулькивает.
5) Работает движок (с таким кодом плохо, но работает)
Вот фото, не кидайтесь тапками за сопли. Маленький драйвер обесточен, он идет к другому движку.
Ага, значит дело вовсе не в сериале, похоже. Т.к. с полностью уделённой работой с сериалом всё равно не работает.
Давайте-как ещё одине тест.
Serial оставляем вместе с печатью, но полностью удаляем термопару, вплоть до #include - полностью, чтоб даже следова не было.
Если в таком виде работает, то давайте сразу, чтобы время не терять, сылку откуда брали библиотеку термопары(если не помните, то саму библиотеку) и опять же свежий скетч. Чтобы мы были уверены, что смотрим не одно и тоже.
Во, а я про термопару сразу сказал в #11 :)
А если вынести serial.print в сетап и посмотреть как отработает. Если заработает, то выводить в сериал не каждый цикл loop а, например, раз в секунду или две. Температура все равно инертна, нет смысла каждые миллисекунды её измерять.
Убрал. Вот так работает, но не правильно, совсем не так, как вообще без Serial.println(" ");. Такое ощущение, что Serial.println(" "); отправляет пустую строчку на драйвер. Попробовал вместо Serial.println(" "); написать Serial.println(" Text ");, движок начал дергаться и пещать.
Да, не удивлюсь, если в термопарной библиотеке стоит delay(100500)
Может что-то с заземление не так подключил и он помехи отправляет?
Я же отключил библиотеку.
Vasilisk, я вам писал сделать скорость сериала 115200, какого х.. у вас опять 9600 ?
Не знаю, как это должно помочь, сделал, все так же.
Дубль два, попробуйте в сериал выводить не каждый цикл а раз в две три секунды
ТС тупо переписал пример у Евгения. Для этого драйвера 1 мкс это мало.
ТС тупо переписал пример у Евгения. Для этого драйвера 1 мкс это мало.
Даже если мало, то и с библиатеками под этот драйвер не работает. Так что суть не в этом.
А если вынести serial.print в сетап и посмотреть как отработает. Если заработает, то выводить в сериал не каждый цикл loop а, например, раз в секунду или две. Температура все равно инертна, нет смысла каждые миллисекунды её измерять.
Все равно будет передавать помехи раз в пару секунд, это не решение проблемы. Но позже попробую и отпишусь. Просто вы отправили сообщение одновременно с моим и я его не заметил.
ТС тупо переписал пример у Евгения. Для этого драйвера 1 мкс это мало.
Даже если мало, то и с библиатеками под этот драйвер не работает. Так что суть не в этом.
Если Вы хотите решения задачи, то я могу помочь. Если обсуждения, как в гараже с мужиками "от чего искра в землю ушла?", то я прошу прощения за вмешательство.
1. В тестировании без участия вывода в сериал, вы написали, что двигатель работает, но не очень хорошо, поэтому подставьте не 1, а 50 мкс. в код примера 5, сообщения 26.
2. если все нормально стало. то идем дальше. Вы писали, что вывод в сериал "текст" делает хуже, чем просто " ", так?
Это потому, что "текст" длиннее. На 115200 на одну букву уходит больше 80 мкс. на 5 букв - почти полмиллисекунды.
Поэтому следующий тест - это длинный - 50 или 100 мкс - импульс и задержка на 10 миллис. если норм, то пойдем дальше, если нет - покажу вам, как сделать управление двигателем неблокирующим, на таймере. Но это потом.
======
и забудьте про бред с помехами от сериала. Этого просто не бывает, как бабы Яги и деда Мороза.
-----------------
Никакие библиотеки вам не помогут, так как почти все они содержат только блокирующие реализации.
Вам же нужно и для термопары и для двигателя - неблокирующие...
Суть понял. Попробовал то, что вы написали, скорость упала настолько, что почти не заметно вращения.
Однако если попробовать вот так (использовать Serial.println(" text "); в качестве задержки), то работает норм, но скорость все равно в несколько раз меньше, чем при работе с помощью библиотеки. Да и регулировать таким образом скорость - костыли какие-то.
Да-да, я понял, что импульс в 1 мкс недостаточно, я пробовал сравнивать 1 и 50, зрительно разницы нет. Если это влияет на что-то еще, то напишите на что, я не понимаю.
Попробовал так же с библиатекой "AccelStepper", из-за Serial.println(" ") скорость упала настолько, что практически не заметно движения.
Попробовал так:
Все работает, но скорость двигателя примерно шаг в секунду. И с библиатекой "AccelStepper" вообще не двигается соответственно.
Попробуйте так
Не понял как это работает, но если поставить после вызова функции температуры delay(500);, то работает. Без задержки температура не отображается. Ну и скорость двигателя само собой очень низкая.
Попробовал вот так, все еще не знаю, как это работает, но работает. Прошу объяснить. И можно ли увеличит скорость двигателя? Если у меня несколько двигателей и их скорость зависит от датчиков, то как таймером пользоваться?
Почитаю. Всем спасибо за помощь! Надеюсь, что дальше сам разберусь.