Управление сервоприводом по Serial

andruum
Offline
Зарегистрирован: 03.11.2012

Как управлять сервоприводом с использованием 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;
        }
    }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы в каком виде отправляете данные в дуину? Если вопрос не ясен, то откуда отправляете данные? из сериал-монитора?

Почитайте эту тему.

Если из монитора, то идете в раздел Программирование и изучаете типы данных.

Так вот приоткрою вам секрет, когда вы набираете в мониторе число 1000 монитор отправляет в дуину 4 символа кодами ASCII - '1','0','0','0' в десятичном виде это 49,48,48,48, и вот что происходит в вашем коде: так как Serial.flush(); не очищает буфер у вас после чтения всех символов в переменной income хранится число от 48 до 57, собственно его вы и передаете в функцию servo1.writeMicroseconds(income); и серва уходит в крайнее положение и все.
Самое простое решение, оно есть в теме выше, это использовать Serial.parseInt() эта функция читает буфер и собирает число из символов.

andruum
Offline
Зарегистрирован: 03.11.2012

Спасибо, стало получаться ) Я думал что на этом сайте написаны все функции ардуины

hugoboss317
Offline
Зарегистрирован: 21.03.2013

 

Приветствую всех. Тут такое дело. 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 строке это:





ISR(TIMER_INTR_NAME)

А в 103 сервы Это:



SIGNAL (TIMER1_COMPA_vect)

 

maksim
Offline
Зарегистрирован: 12.02.2012

Все правильно обе библиотеки пытаются использовать один и тот же обработчик прерывания, да и если даже вы избавитель от ошибки все равно не заработает, нужно что бы IRremote.h пользовала не первый таймер, так как первый пользует Servo.h.

Клапауций
Offline
Зарегистрирован: 10.02.2013

Я библиотеку IRremote вообще вынес на отдельный камень(atmega8) по многим причинам, в том числе и по причине потенциальной программной несовместимости с кодом на основном процессоре - ничего так себе работает на внутреннем тактовом генераторе 8 мегагерц.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я забыл упомянуть, на дуине 2560 всё отлично работает и остальные библиотеки вместе.

попробую мегу 32 в одной из библиотек перенести на другой таймер...

 

 

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Что то не получается, если две бибы компелирует, серва не работает. Больше идей нет?(на ондом контроллере)

maksim
Offline
Зарегистрирован: 12.02.2012

#4

hugoboss317
Offline
Зарегистрирован: 21.03.2013

maksim пишет:

 нужно что бы IRremote.h пользовала не первый таймер

Это возможно?

maksim
Offline
Зарегистрирован: 12.02.2012

ага

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Нет, тут дело не в таймерах... Контроллеры, не прописанные в  вышеупомянутых лайброритеках и проходят в них под грфом "else", но на которых основаны дуины (168, 328 и т.п.) хавают эти таймеры и не парятся по поводу его номера (повторюсь, на меге 2560 всё работает). Атмега32 же точнее биба сервы сразу при компелировании только этой библиотеки не может распознать TIFR1, TIMSK1 и прочее пока в ней не поковыряешься и после чего вектора7 глючат. Я думаю это файлы бутлоудера, вариантов и остальное что этого касается. Таймеры тут не при чём.

вот доказательства:

биба ИК



// Atmega8
#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
  #define IR_USE_TIMER1   // tx = pin 9

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else  // тут Атмега32 
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3   //как видим №2
#endif

биба сервы:



#else  // everything else  //и тут 32
#define _useTimer1  // вот и таймер №1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ;                  
#endif

получается



TIMER2 != Timer1

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ритуальные танци с бибами и таймерами результата не дали, воплотил модульную конструкцию которую предложил Клапауций.

zelayza
Offline
Зарегистрирован: 18.02.2019

Помогите разобраться , почему у меня при подключении , сервомотор запитываю от внешнего питания , а ардуино запитываю от USB и как только подцепляю общий минус GND У МЕНЯ ПРОИСХОДИТ ЗАМЫКАНИЕ, МЕЖДУ АРДУИНО И КОМПОМ? НА СЕРВОМОТОРЕ ПРОВОДА КОРИЧНЕВЫЙ МИНУС, ОРАНЖЕВЫЙ СИГНАЛЬНЫЙ,И КРАСНЫЙ ПЛЮС.Заранее благодарю, плата УНО