Нужна помощь в написании программы
- Войдите на сайт для отправки комментариев
Чт, 24/05/2012 - 16:10
Друзья, накидайте простую програмку, плиз. В благодарность пошлю лучиков добра и кину 500руб на телефон.
Есть сервопривод продолжительного вращения, ардуина и кнопка. Надо, чтобы при старте привод начинал крутиться пока не нажмется кнопка, после нажатия задержка 30сек и опять крутиться в туже сторону. И так покругу. Грубо говоря нажатие кнопки должно останавливать серво на полминуты
Привод на 9 выходе, а кнопка на аналоговом входе 0
А у сервы нулевое положение когда она не крутится какое? myservo.write(???) И у вас точно серва, а не мотор-редуктор?
Хм... не совсем я ясно что за "сервопривод продолжительного вращения", у него есть имя? Какая-то документация?
Если срочно - можете контакты, свои, какие-то оставить, может в скайпе это быстрее решится.
Черновик будет выглядить примерно так (в предопожении что для вращения на 9-ты пин нужно просто 5v, а кнопка подключена к земле (хотя зачем ее садить на аналоговый?).
Кнопка при нажатии должна замыкать 4 пин на землю (GND).
Сервомотор такой http://www.electronshik.ru/card/servomotor-analogoviy-87-kg8729sm-sm-s4309r-360176-112475
В течении часа отпишусь как работает код
Выдает
sketch_may24b.cpp: In function 'void loop()':
sketch_may24b:21: error: 'myservo' was not declared in this scope
Перекопируйте еще раз, я поправил.
Ну раз это, все-таки серва, то мой код будет примерно проапдейтится до такого:
Возможно нужно будет поигратся, подобрать константы ROTATE и STOP (условные углы при которых серва крутит и стоит, они могут отличатся от экземпляра к эксземпляру).
P.S. Кнопка на нулевом аналоговом пине, как вы описали в стартовом посте, подключена от пина к земле.
Максим вы уже второй раз меня выручаете. Телефон у вас не менялся?
Скиньте мне свою почту или скайп, чтоб я в следующий раз напрямую
а я бы так сделал:
Серво на пин 9;
кнопка должна замыкать GND и RESET
А если это не просто лежащие на столе серва и кнопка, которую кто-то нажимает, а некое устройство у которого серва что-то вращает, а кнопка выступает например в качестве концевого выключателя, т.е. серва делает один оборот и нажимает на кнопку, кнопка остается нажатой пока серва не начнет снова крутиться.
Да я смеюсь :)
Да я смеюсь :)
В смысле?
В смысле мой sketch - это шутка:)
Если просто кнопка и серва то нормальный скейтч, только можно myservo.write(20); из лупа в сетап перенести.
Добрый день.Maksim вы не поможете написать небольшой скетч по техзаданию?
Помогу.
Максим,скайп включите пожалуйста.
Я сейчас на работе, дома буду примерно через час, вы пока в скайпе в контакты добавьтесь и техзадание подготовьте.
Доброе время суток. По работе возникла необходимость осуществлять контроль изменения погодных условий. А именно скорости и направления ветра, ну и температуры (как дополнение).
Для осуществления контроля температуры - датчик ds18b20, скорость ветра будет измеряться путем счета количества импульсов в единицу времени (для этого планируется использовать энкодер от шариковой мышки, подключенный к чашечному анемометру), а направление ветра будет определяться путем считывания трехзначного бинарного кода с оптопар, расположенных под флюгером, к которому будет зактреплен диск с прорезями, разделенный на 8 секторов (в соответствии с количеством сторон света и промежуточными - С, С-З, З, Ю-З, Ю, Ю-В, В, С-В). В качестве устройства отображения информации будет использован LCD дисплей 16*2. Ну и конечно часы реального времени на микросхеме DS1307. Программку накатал, используя уже имеющиеся проекты (за неё прошу сильно не бить - знаю, что много проблеммных вопросов, поэтому и выкладываю, чтоб помогли, если что не так). Вот, собственно она родимая и есть:
Вот собственно и все. За замечания и исправления (в частности по работе с массивом при определении направления ветра) буду очень признателен.
Можно считать не количество импульсов за единицу времени, а время между импульсами. Тогда информация будет более оперативной и точной, а если оперативность не нужна, то можно упростить и сделать более надежной конструкцию тахометра - использовав датчик Холла (взятый, например, из куллера от компа).
И как то вы не в тему здесь об этом написали, можно было бы создать новую...
Ну как бы тут люди с вопросом помощи написания программы обращаются, вот я и подумал, что можно сюда свои вопросы воткнуть... Хотя согласен, можно было и в отдельную тему закинуть...
По поводу использования двигателя от компа в качестве измерителя скорости ветра читал довольно много статеек в интернете. Там говорят, что зависимость напряжения на выходе от скорости вращения нелинейная, а значит падает точность измерения.
Ну а на счет времени между импульсами - идея интересная, хотя я пока плохо себе представляю как это должно выглядеть в программе. И, честно говоря, хотелось бы обойтись без #include <TimerOne.h>...
Подскажите, пожалуйста, как можно решить возникшую в моей программе проблему с массивами при определении направления ветра. Весь мозг себе сломал...
Спасибо.
Использовать нужно не сам куллер (хотя можно и сам) а датчик Холла, который в нем установлен и нужно мерить не напряжерие, а сигнал с этого датчика, который дает импульс за один оборот куллера - это более простой и более надежный способ, чем ИК-энкодер от мышки. Т.е. если не хотите (или не нужно) использовать сам куллер, то разбераете его, достаете оттуда датчик Холла (или покупаете датчик Холла отдельно), затем на вращающуюся часть анемометра устанавливаете магнит, который при вращении будет проходить рядом с датчиком. Вот темка, там есть пример кода
А по поводу определения направления не совсем понятно что у вас там такое.... каким образом оно определяется?
p1 у вас объявлен как массив из двух элементов, и читаете вы тоже два элемента. А пытаетесь сравнить с массиво из трех элементов.
Так что вопрос, даже, не в том что вы сравниваете массивы неправильно, а в том что сравниваете нестравнимое. Вернее "сравнимое", но совпадений у вас не будет никогда. Два байта никогда не будут равны трем байтам :)
И еще, массивы-то, конечно можно сравнить, только массивы вам тут не нужны (и уж тем более массив int-ов). У вас же digitalRead возвращает 0 и 1, то есть биты. И нужно вам их 3 штуки. Для их хранения с лихвой хватит одного байта (в него восемь бит влезть может). И память экономите (в шесть раз) и сравнивать можно обычными операторами сравнения.
Немного перемудрил с чтением ног. Хотя будет работать, но можно чуток попроще
Ё-моё, а я и не задумался, что он всего два значения считывает... leshak, огромное спасибо, что помогли разобраться с этим вопросом! Шутка с ёжиком понравилась - включу в программу эту строку! :-)
maksim, прочитал про датчик Холла и не могу понять почему это будет надежнее... Разница с оптопарой лишь в физике процесса получения сигнала на датчик. Механику придется по-другому продумывать... А так один в один...
Очень благодарен вам за то, что не оставили мою проблему без внимания.
maksim, ссылочку, которую вы дали - там осуществляется счет времени между импульсами и высчитывается количество оборотов за минуту? Для проверки подключал кнопку. Выдает просто нереальные значения... Бывали и отрицательные. Скорее всего я что-то неправильно понимаю...
Из-за дребезга вашей кнопки получаются не реально короткие промежутки между импульсами, поэтому вы и получаете такие огромные значения, а так как переменная rpm имеет тип int, то ее максимальное значение 32767 (чего более чем достаточно для об/мин) отсюда при переполнении этой переменной у вас получаются отрицательные числа.
Проверил на кнопке с параллельно включенным ей конденсатором - все замечательно работает.
Так как анемометр стоит на открытой местности, то прийдется защищать ИК датчик от солнца и от пыли. И не нужно думать как закрепить колесо от мышки на анемометре, магнит закрепить гараздо проще.
И то верно... Хотя у меня в планах было сделать корпус, ведь там еще и ИК датчики от флюгера будут...
А в этих строках:
в зависимости от того какую строку закомментировать будет зависеть какой уровень (лог. 1 или лог. 0) будет ожидать на pin2?
Почти. Эти строки указывают при каком событии должна быть вызванна функция RPM (обработчик прерывания)
По сути, при отключенных датчиках скорости и направления ветра он должен показывать Ю-В 0 м/с, но по факту скорость ветра скачет и показывает три значения: -10, -11, -91... Хотя просто вставил эти строки в программу.
Где-то я накосячил... :-(
Вот как это выглядит на деле
>скорость ветра скачет
А зачем вам так часто обновлять показания ветра?
Просто заведите счетчик, увеличивайте его в обработчике прерывания.
А в loop, раз в секунду выводите его умноженный на 60-т (для перевода в минуту). Вот у вас и получится "усредненное за секунду". Уже не будет так прыгать. Если датчик оборотов дает дребезг, можно в этом обработчике еще запоминать время, когда был последний импульс, если прошло, например, менше 200 миллесекунд - игнорить, это дребезг.
За совет, конечно, огромное спасибо, но для моего уровня знания Ардуины - это крутовато... Ладно, будем эксперементировать...
А нужно было не боятся, а попробовать его реализовать. Голова боится, а руки делают. Тем более что в свое изначальном скетче, хоть и кривовато, но именно по этому пути вы вначале и пошли.
Счас попробую накидать. Я правильно понял, что у вас один тик RMP-ма означает метр в секунду?
Вообщем примерно так:
Если на маленьких скоростях датчик не успевает тикнуть вообще ни разу (или слишком редко), можно репортить не раз в секунду, а раз в 10-ть сек
Вот это круто! После такого подробного описания и помощи желание изучать это устройство возрастает в разы! Даже не знаю как и благодарить...
Как только дождусь посылку с заказанными радиоэлементами, полностью соберу механику и выложу готовое устройство.
Уважаемые знатоки, у меня возник резонный вопрос следующего содержания - какую длину проводника осилит Ардуино? Другими словами на какую длину провода я смогу вытянуть свои датчики?
http://bit.ly/KRORwa
Изучил, спасибо.
А есть ли возможность при работе с микросхемой DS1307 выводить на дисплей год не полностью, а лишь последние две цифры?
Действующие лица:
Гопник: эй, мужик!!! какой сейчас год?
Прохожий: (смотрит на часы), сейчас....(начинает вывод на дисплей)
-----
Вопрос: сможет ли прохожий сказать гопнику только последние цифры года? Как связанна полнота ответа прохожего с моделью часов?
:-D Очень доступно и с юмором!!! :-D Спасибо за разъяснение!
По последнему вопросу нашел решение. В кусочке программы
достаточно изменить строку 62 следующим образом:
и выводиться на дисплей будет не 17/06/2012, а 17/06/12