управление сервой на заданный угол
- Войдите на сайт для отправки комментариев
Пнд, 24/09/2012 - 07:09
Хотел сделать программу для управленией сервой через последовательный порт,что-бы серва становилась в положение от 0 до 180 ,так как новичок с ходу написать ее не вышло...нашел похожую программу, но она устанавливает положение по 9 точкам,пытался заменить строку int pos = map(data, 0, 9, 0, 180); на int pos = map(data, 0, 180, 0, 180); и простj убрать эту строку пробовал управляя через переменную data .
#include <Servo.h> int servoPin = 9; //Create Servo Object Servo myServo; void setup() { //Start Serial Serial.begin(9600); myServo.attach(servoPin); delay(500); } void loop() { while( Serial.available() == 0); int data = Serial.read() -'0'; int pos = map(data, 0, 9, 0, 180); pos = constrain(pos, 0, 180); Serial.println(pos); myServo.write(pos); Serial.flush(); }
Как-то так:
В нижнем примере за угал отвечает Номкр символа из ASCII-Таблици.
Тут описание библиотеки Servo.h
спасибо !Опробую вечером добавив constrain и '0' ,тогда поидее угол будет не выходить за рамки 0 и 180 и числа в нужной кодировке придут.я правильно понимаю?
А я тут недавно прочитал, что у Serial есть метод Serial.parceInt() и Serial.parceFloat(), правда, сам еще не пробовал. Поставте вместо Serial.read().
а можете по простому объяснить что они делают я на ардуино первый день программирую ,не понял что-то.Спасибо
Чего же проще? Первая декодирует из входного потока целое число (иначе вы получаете строку "23" вместо ожидаемого числа), вторая - число с плавающей запятой. И основной цикл будет выглядеть так:
а можете по простому объяснить что они делают я на ардуино первый день программирую ,не понял что-то.Спасибо
По простому читает строку из сериал и пытается перевести ее int
спасибо большое,все понятно.
Ага. Их, кажись, только в 1.0 ввели. Поэтому и руско-язычной доке про них вообще не упоминается.
А еще они имеют побочный эффект в виде "остановки скетча". Так что не всегда можно их применить (но для данной задачи - вроде можно).
P.S. только Serial.parseInt
И основной цикл будет выглядеть так:
А еще при этом, желательно в Serial мониторе выставить LineEnding например в NL (добавлять символ "конец строки" ко всему что вы шлете).
То есть работать будет и без этого, но может "чуть подтупливать". Так как понимать что "ввод числа закончился" он будет по TimeOut. А line ending - сразу после отсылки поймет (первый же символ не цифровой, означает "число приехало целиком и можно начинать парсить его").
А можно без Line эндинга. Добится того же эффекта. Просто, когда отправляете, добавлять в конце одну букву (любую). Как признак "конец числа".
Постоянно букву в этом слове путаю :)
А тормозят они скетч, потому что ждут конца строки из потока или окончания таймаута (он по умолчанию 1с, настраивается через setTimeout()) Так что если критично, лучше поток сложить в буферную String и применить String.toInt(), которая, кстати, на аглицком сайте до сих пор не описана.
Постоянно букву в этом слове путаю :)
У меня такая же беда с Serial.avaliable() - без copy-paste или интелесенса не могу его написать впринципе :)
А тормозят они скетч, потому что ждут конца строки из потока или окончания таймаута (он по умолчанию 1с, настраивается через setTimeout())
Не, ну "почему" - это понятно :) (вот поэтому я и вел речь про посылать буквенный символ, что-бы не ждать этого timeout).
Так что если критично, лучше поток сложить в буферную String и применить String.toInt(), которая, кстати, на аглицком сайте до сих пор не описана.
Хе... не знал. Хотя не полюбляю я этот String :( Сразу куча библиотек всяких отлетает которые умеют только с C-шными строками работать. Поэтому либо "ручками" либо atoi функция.
спасибо вы конечно помогли ,буду пробовать но последнии три ваших сообщения не совсем понял,я ж ламер еще.ну надеюсь со временем придет, надо что-то читать.
можете поподробнее об string.tolnt() по простому))
дописал с вашей помощью работает как хотел спасибо!
следующим шагом хочу сделать соединение с другим ардуио который будет использоваться как пульт и передавать сигнал через сериал порт по этому передатчику который куплюю через пару дней http://www.electronshik.ru/card/modul-radiotransivera-apc220-114373
можете поподробнее об string.tolnt() по простому))
Не можете. Так как string.toInt() - не существует. Пойдите в раздел "Програмирования" и, для начала, почитайте про string и String. Выясните чем они отличаются. Причем, я бы советовал, несмотря на то что String будет выглядеть проще в использовании, все-таки разобратся именно со string. Так как сталкиватся с ним будете гораздо чаще (можно еще какой-нибудь учебник по C посмотреть, работу со строками).
Можете по форуму попробовать поискать. Вопрос - регулярно всплывает. Например вот http://arduino.ru/forum/programmirovanie/perevod-prinyatogo-simvola-s-com-porta-v-chislo
Там можно найти "как это работает". Как самому "переводить". без использования функций (их раньше небыло). Ну или полезть в исходники ардуины и посмотретьк как этот toInt реализован.
#include <Servo.h> //подключение библиотеки
int pos = 0; //угол сервы
int servoPin = 9; //пин сервы
Servo myServo; //заданное пмя сервы
void setup()
{
Serial.setTimeout(100);
Serial.begin(9600); //скорость соединения
myServo.attach(servoPin); // Подключаем серву на 9 пин
}
void loop()
{
while( Serial.available() == 0); //ожидание данных с порта
pos = Serial.parseInt(); //прием и перевод в integer
pos = constrain(pos, 0, 180); //ограничение от 0 до 180
Serial.println(pos); //передача задаваемого угла обратно
myServo.write(pos); //установка угла
Serial.flush(); //фильтр мусора
}
/*********************
КОНЕЦ
**********************/
с таймаутом классно не тупит совсем
Как-то так:
В нижнем примере за угал отвечает Номкр символа из ASCII-Таблици.
Тут описание библиотеки Servo.h
У вас ошибка!!!! библиотека Servo.h у вас объявлена как servo.h (с маленькой буквы),в итоге будет выдавать ошибку servo does not name a type при компиляции . Простите это мой первый опыт в программировании