После 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-ую оставьте - обе сделайте). И, если не поможет, дайте текущий скетч.
а если так
#include <AccelStepper.h> #include <max6675.h> MAX6675 thermocouple(30, 32, 31); AccelStepper Stepper1(1,50,51); int dir = 1; double tt; void setup() { Serial.begin(9600); Stepper1.setMaxSpeed(2000); Stepper1.setAcceleration(23000); } void loop() { tt = thermocouple.readCelsius(); Serial.print(tt); Serial.println(" "); if(Stepper1.distanceToGo()==0){ Stepper1.move(6400*dir); dir = dir*(-1); delay(1000); } Stepper1.run(); }Не помогло
#include <AccelStepper.h> #include <max6675.h> MAX6675 thermocouple(30, 32, 31); AccelStepper Stepper1(1,22,23); int dir = 1; void setup() { Serial.begin(9600); Stepper1.setMaxSpeed(2000); Stepper1.setAcceleration(23000); } void loop() { Serial.print(thermocouple.readCelsius()); Serial.println(" "); delay(1000); if(Stepper1.distanceToGo()==0){ //проверка, отработал ли двигатель предыдущее движение cli(); Stepper1.move(6400*dir); //устанавливает следующее перемещение на 1600 шагов (если dir равен -1 будет перемещаться -1600 -> противоположное направление) sei(); dir = dir*(-1); //отрицательное значение dir, благодаря чему реализуется вращение в противоположном направлении delay(1000); //задержка на 1 секунду } cli(); Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя sei(); }Vasilisk, имейте ввиду, что строкой Serial.print(thermocouple.readCelsius()); вы вызываете две функции. Может сериал тут и не имеет никакого отношения, особенно если принять во внимание что функция thermocouple.readCelsius() использует тормозную ардуиновскую библу.
Даже если оставить только строчку
Serial.println(" ");, все рано не работает. Двигатель не шевелится, только попискивает, как буд-то бы на него помехи идут.Ну, похоже, приплыли, надо внимательно смотреть библиотеку двигателя. Она же, сволочь, асинхронно работает, а сериал свои прерывания гонит, вот там что-то ломается с таймингами. Я бы посмотрел, но у меня сейчас нет под рукой нужного железа, извините :(
Всё, что молу посоветовать - запускайте мотор через драйвер (типа там A4988), тогда Вы не будете чувствительны к таймингам, там и без библиотеки всё элементарно делается
У меня TB6560. И мне важно обеспечить очень плавный ход. Сейчас попробую через другую библиотеку.
У меня TB6560. И мне важно обеспечить очень плавный ход. Сейчас попробую через другую библиотеку.
А лучше вовсе безо всякой библиотеки. Там всё настолько элементарно делается. Вот, посмотрите примерчик маленький. Он, конечно, для A4988, но разницы-то нет особо никакой!!! У TB6560 тоже есть step-pin и dir-pin, осталось только шаг сконфигурить.
Даже если оставить только строчку
Serial.println(" ");, все рано не работает. Двигатель не шевелится, только попискивает, как буд-то бы на него помехи идут.Ну по крайней мере поднимите скорость до 115200 :)
Сделал как у вас... результат тот же.
Может я где-то очень глупо ошибся, и вы даже не подумали бы о таком?
Сделал как у вас... результат тот же.
Это как у меня в примере или о чём-то другом речь?
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { Serial.print(thermocouple.readCelsius()); Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }И что, без сериала работает?
Давайте уточним без чего именно работает.
1. Полностью удаляем работу с сериалом (при этом в строке 18 сериал убираем, а thermocouple.readCelsius() оставляем!)
2. Оставим только строку 9
3. Оставим строки 9 и 18
4. Как сейчас.
Распишите, пожалуйста как работает, а как нет.
Если оставить только thermocouple.readCelsius(); то не работает. Если оставить только
Serial.println(" ");, то дергается, как буд-то бы шаги пропускает.Если оставить только thermocouple.readCelsius(); то не работает. Если оставить только
Serial.println(" ");, то дергается, как буд-то бы шаги пропускает.Лучше бы Вы по пунктам расписали.
Я правильно пнимаю, что если Сериал убрать вовсе, а thermocouple.readCelsius(); - оставить, то уже не работает? Так?
Пожалуйста! Сделайте так, как написал Евгений, то есть 4 варианта:
И про КАЖДЫЙ напишите. Иначе неясно как искать черную кошку в темной комнате.
1.
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { // Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { // Serial.print(thermocouple.readCelsius()); volatile int a = thermocouple.readCelsius(); // Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }2.
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { // Serial.print(thermocouple.readCelsius()); volatile int a = thermocouple.readCelsius(); //Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }3.
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { Serial.print(thermocouple.readCelsius()); // Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }4.
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { Serial.print(thermocouple.readCelsius()); Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }Ну и если грешите именно на Serial, логично было бы проверить, как изменится работа при выводе на LCD1602.
1) Не работает. На движок подаются помехи, он не двигается, но побулькивает.
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { // Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { // Serial.print(thermocouple.readCelsius()); volatile int a = thermocouple.readCelsius(); // Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }2) Не работает. На движок подаются помехи, он не двигается, но побулькивает.
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { // Serial.print(thermocouple.readCelsius()); volatile int a = thermocouple.readCelsius(); //Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }3) Не работает. На движок подаются помехи, он не двигается, но побулькивает.
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { Serial.print(thermocouple.readCelsius()); // Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }4) Не работает. На движок подаются помехи, он не двигается, но побулькивает.
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { Serial.print(thermocouple.readCelsius()); Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }5) Работает движок (с таким кодом плохо, но работает)
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }Вот фото, не кидайтесь тапками за сопли. Маленький драйвер обесточен, он идет к другому движку.
Ага, значит дело вовсе не в сериале, похоже. Т.к. с полностью уделённой работой с сериалом всё равно не работает.
Давайте-как ещё одине тест.
Serial оставляем вместе с печатью, но полностью удаляем термопару, вплоть до #include - полностью, чтоб даже следова не было.
Если в таком виде работает, то давайте сразу, чтобы время не терять, сылку откуда брали библиотеку термопары(если не помните, то саму библиотеку) и опять же свежий скетч. Чтобы мы были уверены, что смотрим не одно и тоже.
Во, а я про термопару сразу сказал в #11 :)
А если вынести serial.print в сетап и посмотреть как отработает. Если заработает, то выводить в сериал не каждый цикл loop а, например, раз в секунду или две. Температура все равно инертна, нет смысла каждые миллисекунды её измерять.
Убрал. Вот так работает, но не правильно, совсем не так, как вообще без Serial.println(" ");. Такое ощущение, что Serial.println(" "); отправляет пустую строчку на драйвер. Попробовал вместо Serial.println(" "); написать Serial.println(" Text ");, движок начал дергаться и пещать.
#define DIR_PIN 23 #define STEP_PIN 22 void setup() { Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); } void loop() { Serial.println(" "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(1); }Да, не удивлюсь, если в термопарной библиотеке стоит 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 "); в качестве задержки), то работает норм, но скорость все равно в несколько раз меньше, чем при работе с помощью библиотеки. Да и регулировать таким образом скорость - костыли какие-то.
void loop() { Serial.println(" text "); digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); delay(0); }Да-да, я понял, что импульс в 1 мкс недостаточно, я пробовал сравнивать 1 и 50, зрительно разницы нет. Если это влияет на что-то еще, то напишите на что, я не понимаю.
Попробовал так же с библиатекой "AccelStepper", из-за Serial.println(" ") скорость упала настолько, что практически не заметно движения.
Попробовал так:
void loop() { digitalWrite(STEP_PIN, HIGH); delayMicroseconds(1); digitalWrite(STEP_PIN, LOW); Serial.print(thermocouple.readCelsius()); }Все работает, но скорость двигателя примерно шаг в секунду. И с библиатекой "AccelStepper" вообще не двигается соответственно.
Попробуйте так
#include <max6675.h> #define DIR_PIN 23 #define STEP_PIN 22 MAX6675 thermocouple(30, 32, 31); void setup() { // Serial.begin(9600); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); digitalWrite(DIR_PIN, HIGH); // Инициализировать TIMER1 noInterrupts (); // отключить все прерывания TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 125; // сравнить регистр 16 МГц / 256/500 Гц (2ms=125) TCCR1B |= (1 << WGM12); // Режим СТС TCCR1B |= (1 << CS12); // 256 делитель TIMSK1 |= (1 << OCIE1A ); // включить таймер сравнить прерываний interrupts(); // включить все прерывания } ISR (TIMER1_COMPA_vect) // Функция прерывания таймера { static bool steper; digitalWrite(STEP_PIN, steper); steper = !steper; } void loop() { volatile int a = thermocouple.readCelsius(); Serial.print(a); Serial.println(" "); }Не понял как это работает, но если поставить после вызова функции температуры delay(500);, то работает. Без задержки температура не отображается. Ну и скорость двигателя само собой очень низкая.
Попробовал вот так, все еще не знаю, как это работает, но работает. Прошу объяснить. И можно ли увеличит скорость двигателя? Если у меня несколько двигателей и их скорость зависит от датчиков, то как таймером пользоваться?
#include <max6675.h> #include <AccelStepper.h> MAX6675 thermocouple(30, 32, 31); AccelStepper Stepper1(1,22,23); int dir = 1; void setup() { Serial.begin(9600); Stepper1.setMaxSpeed(1000); Stepper1.setAcceleration(200); // Инициализировать TIMER1 noInterrupts (); // отключить все прерывания TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 125; // сравнить регистр 16 МГц / 256/500 Гц (2ms=125) TCCR1B |= (1 << WGM12); // Режим СТС TCCR1B |= (1 << CS12); // 256 делитель TIMSK1 |= (1 << OCIE1A ); // включить таймер сравнить прерываний interrupts(); // включить все прерывания } ISR (TIMER1_COMPA_vect) // Функция прерывания таймера { if(Stepper1.distanceToGo()==0){ //проверка, отработал ли двигатель предыдущее движение Stepper1.move(10000*dir); //устанавливает следующее перемещение на 1600 шагов (если dir равен -1 будет перемещаться -1600 -> противоположное направление) dir = dir*(-1); //отрицательное значение dir, благодаря чему реализуется вращение в противоположном направлении delay(1000); //задержка на 1 секунду } Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя } void loop() { Serial.print(thermocouple.readCelsius()); Serial.println(" "); delay(1000); }Почитаю. Всем спасибо за помощь! Надеюсь, что дальше сам разберусь.