Странное поведение сервы
- Войдите на сайт для отправки комментариев
Втр, 21/05/2013 - 10:17
Поставил на ардуину мега лсд шилд с кейпадом, на 20-тый пин повесил серву.
написал такой скетч, Залил, серва не реагирует на кнопки, но при этом ком порт сходит с ума на компе, то появляется то исчезает постоянно
экран пашет, на кнопки реагирует, счетчик секунд работает.
Подскажите пожалуйста, что тут не так?
//Sample using LiquidCrystal library #include <LiquidCrystal.h> #include <Servo.h> /******************************************************* This program will test the LCD panel and the buttons Mark Bramwell, July 2010 ********************************************************/ // select the pins used on the LCD panel LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Servo ms; int pos; // define some values used by the panel and buttons int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // read the buttons int read_LCD_buttons() { adc_key_in = analogRead(0); // read the value from the sensor // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 195) return btnUP; if (adc_key_in < 380) return btnDOWN; if (adc_key_in < 555) return btnLEFT; if (adc_key_in < 790) return btnSELECT; return btnNONE; // when all others fail, return this... } void setup() { lcd.begin(16, 2); // start the library lcd.setCursor(0,0); lcd.print("Push the buttons"); // print a simple message ms.attach(20); pos = 90; } void loop() { lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over lcd.print(millis()/1000); // display seconds elapsed since power-up lcd.setCursor(0,1); // move to the begining of the second line lcd_key = read_LCD_buttons(); // read the buttons switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { pos+=10; ms.write(pos); lcd.print("RIGHT "); break; } case btnLEFT: { pos-=10; ms.write(pos); lcd.print("LEFT "); break; } case btnUP: { lcd.print("UP "); break; } case btnDOWN: { lcd.print("DOWN "); break; } case btnSELECT: { lcd.print("SELECT"); break; } case btnNONE: { lcd.print("NONE "); break; } } }
В скетч не вникал, но, судя по
>но при этом ком порт сходит с ума на компе,
очень похоже что слишком большое потребление. Или серва слишком мощьная, что-бы питатся от USB или где-то короткое замыкание. Может у вас серва не 5-ти, а 12-ти вольтовая?
Перепроверяйте схему. Отключите все оборудование и посмотрите что происходит.
Можно попробовать внешние питание (возможно тупо не хватает и контроллер в ребуты уходит) блоком помощьней.
Но, перед внешним питанием - желательно амперметром померять "сколько оно в сумме жрет". Бо если есть КЗ где-то, внешние питание только усугубит ситуацию.
Серва вот такая:
http://amperka.ru/collection/servo/product/servo-fs5109m
сегодня зайду куплю ей одельный БП, посмотрю что выйдет..
Похоже, все-таки 5-ти вольтовая.
Погодите покупать БП (хотя конечно "в хозяйстве" - он лишним не будет). БП - это уже лечение конкретной проблемы. Вначале желательно выяснить причину. Если причина в КЗ - то более мощьный блок просто поможет пустить дым, вместо перезагрузок.
Возмите тестер и замерте сколько какое у вас потребление тока все платы целиком сейчас. Померяйте напряжение на 5v пине, просаживается? (краткие импульсы-падения вы не заметите, но что-то более существенное - может стать видным).
Попробуйте тот же самый скетч пустить без физического подключения сервы. Происходят пропажи ком-порта?
А если подключить только серву, то примеры из библиотеки нормально ее крутят?
Если на экран выводится счетчик-таймер, в момент пропажи он сбрасывается в ноль или скет продолжает нормально работать?
Вообщем вначале желательно локализировать проблему.
Ну и банально перепроверте что у вас нигде проводок не коротит, что не перепутали подключение сервы, попробуйте другой USB кабель (может контакт плохой) и т.п.
сомневаюсь что там КЗ, только если повреждены заводские платы..
на мегу насажен Mega IO Shield, на него лсд и серва
пытался убрать все это хозяйство и проводами напрямую на контакты ардуины посадить серву, симптомы те же
без сервы скетч работает
таймер на лсд, так же как и отображения нажатий кнопок работают исправно несмотря на глюки ком порта и нерабочей сервы
если на эту установку залить скетч из примера sweep - то серва работает, но иногда заикается.
>если на эту установку залить скетч из примера sweep - то серва работает, но иногда заикается.
Тогда да. Больше всего похоже именно на "не хватает питания".
я тут еще новичок, ардуину заполучил на той неделе, серву только вчера...
так что мне совсем непонятно что происходит, скетч выше, не трогает серву, пока не нажмешь кнопку, но уже глючи с самого начала даже еще до момента когда начинается крутиться мотор.
если с сервы осоединить сигнальный кабель ( оставив +5 и землю) глюки пропадают..
Вам leshak расписал - проверьте правильность подключения сервы и запустите пример из библиотеки. Если не работает - или серва негодная или проблема в подключении. Как всё будет о.к. тогда уже заливайте свой скетч. При подключении сервы она сделает какое то движение туда-сюда, это нормально.
Ну без замеров - тут уже тродно что-то сказать. Мерять какое напряжение на 5v пине. Мерять какой ток идет.
>если с сервы осоединить сигнальный кабель
Честно говоря не знаю какие должны быть симптомы если при подключении сервы перепутать 5v/сигнальный/землю, но, на всяк случай, распишите цвета проводов вашей сервы и куда вы их подключаете.
А вообще, серва "начинает трогатся", не когда вы сделали ms.write(pos);, а с момента ms.attach(20); С этого момента на сигнальный кабель начинает идти PWM (соотвествующий нулю градусов).
коричневый - земля в gnd
красный - в 5v
оранжевый в 20 пин
Вам leshak расписал - проверьте правильность подключения сервы и запустите пример из библиотеки. Если не работает - или серва негодная или проблема в подключении. Как всё будет о.к. тогда уже заливайте свой скетч. При подключении сервы она сделает какое то движение туда-сюда, это нормально.
пример с библиотеки работает, но не очень стабильно, иногда на секуду серва замирает
Вероятнее всего просадка напряжения. Запитайте серву отдельным источником питания и обязательно соедините землю сервы и ардуины. Я все свои эксперименты делал с отдельным питанием сервы и никогда не было проблем.
коричневый - земля в gnd
красный - в 5v
оранжевый в 20 пин
Вроде верно все. Вообщем "мерять и питать" осталось. Ну и банально "протирать контакты"
Эту проблему решил запитав серву от внешнего питания ( раздербанил старую зарядку телефона ).
Глючить перестало.
Пример работает как часы. Порты не отваливаются.
Убрал все из лупа, оставил только одну команду серве
пробовал менять углы и перезаливать, но в таком варианте серва только тикает и не крутится....
Что-то не очень ясно чего вы тут хотите добится.
С чего ей крутится?
Вы ей сказали "стань в 60 градусов". Ее дело встать в эту позицию и стоять. Все. Дальше скетч у вас останавливается
P.S. Можно было myservo.write сделать просто в конце setup(), а loop() - оставить пустым. Был бы тот же результат и while(1) - не потребовался бы.
Что-то не очень ясно чего вы тут хотите добится.
С чего ей крутится?
Вы ей сказали "стань в 60 градусов". Ее дело встать в эту позицию и стоять. Все. Дальше скетч у вас останавливается
P.S. Можно было myservo.write сделать просто в конце setup(), а loop() - оставить пустым. Был бы тот же результат и while(1) - не потребовался бы.
да, далее я поправил скетч заменив на другой угол, но она не поехала на новый, а осталась стоять как была,
вернул пример, снова закрутилась
Ну может скетч банально не залился и вы не заметили этого?
к примеру
в мониторе вижу:
Step0
Step1
Step2
Step3
LOOP
и только как написало LOOP она начала крутиться
Хм... немного бредово звучит. Может тайминги у сервы нестандартные?
После рестарта ардуины (нажать кнопку Reset, или закрыть/открыть моинтор) - четко воспроизводится это поведение? (стоит на step и начинает крутится на Loop)?
А если после myservo.write(pos), добавить
Есть такое что вращение идет не на всех углах, а только на каких-то определенных? Что-то типа "начало крутится при pos=47 и т.п.?
Ну и проверте, опять банальное, что какой-нибудь проводок на серву не отходит. Что контакты нормальные.
Может и тайминги не те, модифицировал пример, сделал шаг не 1 градус, а 10, не крутится(
Надо достать другую севу и на ней потестить...