UART и мигалка проблема в коде помогите улучшить код
- Войдите на сайт для отправки комментариев
Пт, 19/09/2014 - 08:36
Добрый день написал простенькую программку для управления шима и мигалки по rs232 шим работает нормально от 0 до 250 управляю через rs232 а скорость мигалки не меняется хотелось бы управлять скоростью мигалки чтоб и шим и мигалка синхронна работали
int motorPin = 5; int led = 13; void setup() { pinMode(motorPin, OUTPUT); pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { if (Serial.available()) { int speed = Serial.parseInt(); if (speed >= 0 && speed <= 255) { analogWrite(motorPin, speed); } digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(motorPin); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(motorPin); } }
А че вообще код делает? Типа лепила из того что было, а потом долго руки мыла?
Нет мигалка будет управлять шаговым двигателем а шим подключон на чп частотник я уже настроил все работает отлично вот только проблема в мигалке
Она не мигает?
нет не мигает через ком отправляю значение один раз моргнет и все (
Вот же печаль то какая. А если внимательно посмотреть на код. То там вообще не ясно почему оно должно мигать чаще 1 раза.
Я только начинаю изучать Arduino я чайник в этом ) и врядли смогу найти ошибку в коде подскажите пожалуйста что я не так делаю ?
В теле управляющего оператора if сидит вся ваша программа и запускается она только если
Serial
.available()>0 . Это значит что лампочка моргнет только когда Вы в очередной раз выведете что-то в порт. А моторчик конечно крутиться будет если его проинициализировать.
Еще советую вместо delay использовать конструкцию if millis() ...
что-то типа if millis()>=(oldmillis+delay) { PORTD ^= 1<<8}
В теле управляющего оператора if сидит вся ваша программа и запускается она только если
Serial
.available()>0 . Это значит что лампочка моргнет только когда Вы в очередной раз выведете что-то в порт. А моторчик конечно крутиться будет если его проинициализировать.
Еще советую вместо delay использовать конструкцию if millis() ...
что-то типа if millis()>=(oldmillis+delay) { PORTD ^= 1<<8}
спасибо огромное еще один вопрос а возможно ли два void loop написать что бы друг другу не мешали чтоб и шим и моргалка брали одно значение ? зарание спасибо.
описать функцию loop можно и 10 раз но компилятор такое просто так не скомпилирует)))
правильно вашу задачу решить с помощью прерываний. но пока вам рано, поэтому работайте с конструкцией if millis()>=
http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Не получается вообще (((
что именно?
а, пофиг на теорью, просто
1. вынесите 4 строки начинающиеся на d... за пределы оператора if {}
2. объявите speed в заголовке (сделате переменную глобальной)
3. в тех строках которые начинаются на d... переменную motorpin поменяйте на speed и 255-speed соответственно
delay(motorPin); - как, по вашему, что делает эта строка?
здесь скорость мигалки управляю через ацп хотел как здесь сделать но только не через ацп а uart
>здесь скорость мигалки управляю через ацп хотел как здесь сделать но только не через ацп а uart
Ну, дык а что вам мешает?
В изначальном посте у вас же есть пример. Как прочитать число в переменную из Serial. А потом эту переменую использовать со своими функциями.
Читать в переменную speed и потом использовать ее в функции analogWrite у вас получилось же.
Что мешает аналогично, сделать переменную, скажем pause и использовать ее с фунцией delay()?
Кстати, в #13, зачем вам столько analogRead-дов? Вы же уже сохранили значение АЦП в переменную sensorValue. Почему ее не использовать? delay(sensorValue);
Потом останется только заполнять sensorValue не через analogRead, а через serial.parseInt
и все.
>здесь скорость мигалки управляю через ацп хотел как здесь сделать но только не через ацп а uart
Ну, дык а что вам мешает?
В изначальном посте у вас же есть пример. Как прочитать число в переменную из Serial. А потом эту переменую использовать со своими функциями.
Читать в переменную speed и потом использовать ее в функции analogWrite у вас получилось же.
Что мешает аналогично, сделать переменную, скажем pause и использовать ее с фунцией delay()?
как и я сказал я новичек и совсем не представляю как это сделать да и с русским у меня проблемы если что не так простите ) можете показать пример буду очен благодарен.
что именно?
а, пофиг на теорью, просто
1. вынесите 4 строки начинающиеся на d... за пределы оператора if {}
2. объявите speed в заголовке (сделате переменную глобальной)
3. в тех строках которые начинаются на d... переменную motorpin поменяйте на speed и 255-speed соответственно
так ?
>так ?
А чего вы меня спрашиваете? Проверте :) Мало ли кто чего на форуме насоветует.
Недостатки есть, но... ход мысли - верный.
1. int
speed в шапку
2.
int
speed =
Serial
.parseInt() заменить на
speed =
Serial
.parseInt()
3. в 25 строке напишите
delay(255-speed);4. надо вынести все что касается лампочки из под действия оператора if вроде вы это сделали но зачем там строки 27 и 28?
нет, там со скобками явная проблема... их много и они встречаются слишком часто )))
вместо 21 нарисуйте } а 27 и 28 удалите.
хотя я бы сделал по-другому.
А недостаток в следующем: вы используете одну и ту же переменную и для скорости и для "какая пауза между миганиями".
Естественно из-за этого вы не сможете выставлять их "раздельно".
Вам нужно две переменные. Одну для скорости, другую для паузы. Я же писал: " сделать переменную, скажем pause"
Но.... вам тогда нужно будет, придумывать еще как отличать, что означает прочитанное с помощью parseInt число. Что это, скорость или пауза? В какую переменную сохранять? Какой-то маркер, перед этим нужно слать значит... читать его....
По хорошему, именно так и нужно делать. Что-то типа
и цифры свои слать уже в виде строк "s200" - установить скорость в 200, "p150" - установить паузу в 150.
Но.... если "пусть и криво, зато проще.." (меньше переделок от текущего). Можно вывернуться и по другому.
Обойтись, все-таки одной переменной.
Смотрите в свой код.... у вас же не любое число, для скорости, "принимается к исполнению". А только в интервале от 0 до 255.
Следовательно мы можем договорится что пришедшие числа "от 0 до 255" - это скорость, а все остальное - это паузы. И отличать их по этому признаку.
Что-бы еще проще.... мы можем считать, что "положительные числа означают скорость, а отрицательные - паузу".
Тогда делаем что-то типа
И теперь будем слать числа типа:
"150" - установить скорость в 150
"-180" - установить паузу в 180
то есть, знак "-" перед числом и будет у нас тем признаком, по которому мы отличаем, что нам пришло. скорость или время паузы.
1. int
speed в шапку
2.
int
speed =
Serial
.parseInt() заменить на
speed =
Serial
.parseInt()
Не помешает, но и не обязательно. Разницы в работе - не будет. analogWrite у нас вызывается только если пришло вменяемое число. А если не пришло, то... analogWrite "помнит" значение последнего вызова.
А вот delay() - таким "эффектом памяти" - не обладает. Вот тут уже однозначно пришлось бы применять ваш рецепт "в шапку".
Ну либо, использвоать ключевое слово static, как я и сделал в #20. Дает тот же эффект. Значение переменной не теряется между вызовами loop().
Все так.