Управление сервоприводом по Serial
- Войдите на сайт для отправки комментариев
Втр, 18/12/2012 - 21:30
Как управлять сервоприводом с использованием Serial ? Мой код устанавливает только в одно значение, и больше не меняет положения.
#include <Servo.h> Servo servo1; int income; byte incomeb; void setup() { Serial.begin(38400); servo1.attach(53); } void loop() { if (Serial.available() > 0) { incomeb = Serial.read(); Serial.flush(); if (incomeb > 0){ income = int(incomeb); servo1.writeMicroseconds(income); income = 0; } } }
Вы в каком виде отправляете данные в дуину? Если вопрос не ясен, то откуда отправляете данные? из сериал-монитора?
Почитайте эту тему.
Если из монитора, то идете в раздел Программирование и изучаете типы данных.
Так вот приоткрою вам секрет, когда вы набираете в мониторе число 1000 монитор отправляет в дуину 4 символа кодами ASCII - '1','0','0','0' в десятичном виде это 49,48,48,48, и вот что происходит в вашем коде: так как
Serial
.flush();
не очищает буфер у вас после чтения всех символов в переменной income хранится число от 48 до 57, собственно его вы и передаете в функцию servo1.writeMicroseconds(income); и серва уходит в крайнее положение и все.Самое простое решение, оно есть в теме выше, это использовать Serial.parseInt() эта функция читает буфер и собирает число из символов.
Спасибо, стало получаться ) Я думал что на этом сайте написаны все функции ардуины
Приветствую всех. Тут такое дело. Atmega32 и servo.h , ну там понятно мега32 не прописана, поменял в библиотеке мега 8 на мега 32, всё нормально стало, но в код включается ещё IRremote.h в которой та же проблема. Решил подобным рбразом, по отдельности работают, а вместе ((( вот:
IRremote\IRremote.cpp.o: In function `__vector_7':
.\..\Atmel\arduino-1.0.4\libraries\IRremote/IRremote.cpp:311: multiple definition of `__vector_7'
Servo\Servo.cpp.o:/\ ...\Atmel\arduino-1.0.4\libraries\Servo/Servo.cpp:103: first defined here
В 311 строке это:
А в 103 сервы Это:
Все правильно обе библиотеки пытаются использовать один и тот же обработчик прерывания, да и если даже вы избавитель от ошибки все равно не заработает, нужно что бы IRremote.h пользовала не первый таймер, так как первый пользует Servo.h.
Я библиотеку IRremote вообще вынес на отдельный камень(atmega8) по многим причинам, в том числе и по причине потенциальной программной несовместимости с кодом на основном процессоре - ничего так себе работает на внутреннем тактовом генераторе 8 мегагерц.
Я забыл упомянуть, на дуине 2560 всё отлично работает и остальные библиотеки вместе.
попробую мегу 32 в одной из библиотек перенести на другой таймер...
Что то не получается, если две бибы компелирует, серва не работает. Больше идей нет?(на ондом контроллере)
#4
нужно что бы IRremote.h пользовала не первый таймер
Это возможно?
ага
Нет, тут дело не в таймерах... Контроллеры, не прописанные в вышеупомянутых лайброритеках и проходят в них под грфом "else", но на которых основаны дуины (168, 328 и т.п.) хавают эти таймеры и не парятся по поводу его номера (повторюсь, на меге 2560 всё работает). Атмега32 же точнее биба сервы сразу при компелировании только этой библиотеки не может распознать TIFR1, TIMSK1 и прочее пока в ней не поковыряешься и после чего вектора7 глючат. Я думаю это файлы бутлоудера, вариантов и остальное что этого касается. Таймеры тут не при чём.
вот доказательства:
биба ИК
биба сервы:
получается
Ритуальные танци с бибами и таймерами результата не дали, воплотил модульную конструкцию которую предложил Клапауций.
Помогите разобраться , почему у меня при подключении , сервомотор запитываю от внешнего питания , а ардуино запитываю от USB и как только подцепляю общий минус GND У МЕНЯ ПРОИСХОДИТ ЗАМЫКАНИЕ, МЕЖДУ АРДУИНО И КОМПОМ? НА СЕРВОМОТОРЕ ПРОВОДА КОРИЧНЕВЫЙ МИНУС, ОРАНЖЕВЫЙ СИГНАЛЬНЫЙ,И КРАСНЫЙ ПЛЮС.Заранее благодарю, плата УНО