Странное поведение сервы

Geronimo
Offline
Зарегистрирован: 06.05.2013

Поставил на ардуину мега  лсд шилд с кейпадом, на 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;
    }
}
 
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

В скетч не вникал, но, судя по 

>но при этом ком порт сходит с ума на компе,

очень похоже что слишком большое потребление. Или серва слишком мощьная, что-бы питатся от USB или где-то короткое замыкание. Может у вас серва не 5-ти, а 12-ти вольтовая?

Перепроверяйте схему. Отключите все оборудование и посмотрите что происходит.

Можно попробовать внешние питание (возможно тупо не хватает и контроллер в ребуты уходит) блоком помощьней. 

Но, перед внешним питанием - желательно амперметром померять "сколько оно в сумме жрет". Бо если есть КЗ где-то, внешние питание только усугубит ситуацию.

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

Серва вот такая:

http://amperka.ru/collection/servo/product/servo-fs5109m

сегодня зайду куплю ей одельный БП, посмотрю что выйдет..

leshak
Offline
Зарегистрирован: 29.09.2011

Похоже, все-таки 5-ти вольтовая.

Погодите покупать БП (хотя конечно "в хозяйстве" - он лишним не будет). БП - это уже лечение конкретной проблемы. Вначале желательно выяснить причину. Если причина в КЗ - то более мощьный блок просто поможет пустить дым, вместо перезагрузок.

Возмите тестер и замерте сколько какое у вас потребление тока все платы целиком сейчас. Померяйте напряжение на 5v пине, просаживается? (краткие импульсы-падения вы не заметите, но что-то более существенное - может стать видным).

Попробуйте тот же самый скетч пустить без физического подключения сервы. Происходят пропажи ком-порта?

А если подключить только серву, то примеры из библиотеки нормально ее крутят?

Если на экран выводится счетчик-таймер, в момент пропажи он сбрасывается в ноль или скет продолжает нормально работать?

Вообщем вначале желательно локализировать проблему.

 

Ну и банально перепроверте что у вас нигде проводок не коротит, что не перепутали подключение сервы, попробуйте другой USB кабель (может контакт плохой)  и т.п.

Geronimo
Offline
Зарегистрирован: 06.05.2013

сомневаюсь что там КЗ, только если повреждены заводские платы..

на мегу насажен Mega IO Shield, на него лсд и серва

пытался убрать все это хозяйство и проводами напрямую на контакты ардуины посадить серву, симптомы те же

без сервы скетч работает

таймер на лсд, так же как и отображения нажатий кнопок работают исправно несмотря на глюки ком порта и нерабочей сервы

 

если на эту установку залить скетч из примера sweep - то серва работает, но иногда заикается.

leshak
Offline
Зарегистрирован: 29.09.2011

 

>если на эту установку залить скетч из примера sweep - то серва работает, но иногда заикается.

Тогда да. Больше всего похоже именно на "не хватает питания".

Geronimo
Offline
Зарегистрирован: 06.05.2013

я  тут еще новичок, ардуину заполучил на той неделе, серву только вчера...

так что мне совсем непонятно что происходит, скетч выше, не трогает серву, пока не нажмешь кнопку,  но уже глючи с самого начала даже еще до момента когда начинается крутиться мотор.

если с сервы осоединить сигнальный кабель ( оставив +5 и землю) глюки пропадают..

vvadim
Offline
Зарегистрирован: 23.05.2012

Вам leshak расписал - проверьте правильность подключения сервы и запустите пример из библиотеки. Если не работает - или серва негодная или проблема в подключении. Как всё будет о.к. тогда уже заливайте свой скетч. При подключении сервы она сделает какое то движение туда-сюда, это нормально.

leshak
Offline
Зарегистрирован: 29.09.2011

Ну без замеров - тут уже тродно что-то сказать. Мерять какое напряжение на 5v пине. Мерять какой ток идет.

>если с сервы осоединить сигнальный кабель

Честно говоря не знаю какие должны быть симптомы если при подключении сервы перепутать 5v/сигнальный/землю, но, на всяк случай, распишите цвета проводов вашей сервы и куда вы их подключаете. 

А вообще, серва "начинает трогатся", не когда вы сделали  ms.write(pos);, а с момента ms.attach(20);  С этого момента на сигнальный кабель начинает идти PWM  (соотвествующий нулю градусов).

Geronimo
Offline
Зарегистрирован: 06.05.2013

коричневый - земля в gnd

красный - в 5v

оранжевый в 20 пин

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

vvadim пишет:

Вам leshak расписал - проверьте правильность подключения сервы и запустите пример из библиотеки. Если не работает - или серва негодная или проблема в подключении. Как всё будет о.к. тогда уже заливайте свой скетч. При подключении сервы она сделает какое то движение туда-сюда, это нормально.

пример с библиотеки работает, но не очень стабильно, иногда на секуду серва замирает

vvadim
Offline
Зарегистрирован: 23.05.2012

Вероятнее всего просадка напряжения. Запитайте серву отдельным источником питания и обязательно соедините землю сервы и ардуины. Я все свои эксперименты делал с отдельным питанием сервы и никогда не было проблем.

leshak
Offline
Зарегистрирован: 29.09.2011

Geronimo пишет:

коричневый - земля в gnd

красный - в 5v

оранжевый в 20 пин

 

Вроде верно все. Вообщем "мерять и питать" осталось. Ну и банально "протирать контакты"

Geronimo
Offline
Зарегистрирован: 06.05.2013

Эту проблему решил запитав серву от внешнего питания ( раздербанил старую зарядку телефона ).

Глючить перестало.

Пример работает как часы. Порты не отваливаются.

Убрал все из  лупа, оставил только одну команду серве

пробовал менять углы и перезаливать, но в таком варианте серва только тикает и не крутится....

 


#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(20);  // attaches the servo on pin 9 to the servo object 

} 
 
 
void loop() 
{ 

   myservo.write(60);
   while(1);

} 

 

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Что-то не очень ясно чего вы тут хотите добится.

С чего ей крутится?

Вы ей сказали "стань в 60 градусов". Ее дело встать в эту позицию и стоять. Все. Дальше скетч у вас останавливается

P.S. Можно было myservo.write сделать просто в конце setup(), а loop() - оставить пустым. Был бы тот же результат и while(1) - не потребовался бы.

Geronimo
Offline
Зарегистрирован: 06.05.2013

leshak пишет:

Что-то не очень ясно чего вы тут хотите добится.

С чего ей крутится?

Вы ей сказали "стань в 60 градусов". Ее дело встать в эту позицию и стоять. Все. Дальше скетч у вас останавливается

P.S. Можно было myservo.write сделать просто в конце setup(), а loop() - оставить пустым. Был бы тот же результат и while(1) - не потребовался бы.

да, далее я поправил скетч заменив на другой угол, но она не поехала на новый, а осталась стоять как была,

вернул пример, снова закрутилась

leshak
Offline
Зарегистрирован: 29.09.2011

Ну может скетч банально не залился и вы не заметили этого?

Geronimo
Offline
Зарегистрирован: 06.05.2013

к примеру


#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  Serial.begin(9600);
  myservo.attach(20);  // attaches the servo on pin 9 to the servo object 
  Serial.println("step0");  
  myservo.write(0);
  delay(5000);
  Serial.println("step1");
  myservo.write(90);
  delay(5000);
  Serial.println("step2");
  myservo.write(170);
  delay(5000);
  Serial.println("step3");
} 
 
 
void loop() 
{ 
    Serial.println("LOOP");
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
} 

в мониторе вижу:

Step0

Step1

Step2

Step3

LOOP

и только как написало LOOP она начала крутиться

leshak
Offline
Зарегистрирован: 29.09.2011

Хм... немного бредово звучит. Может тайминги у сервы нестандартные?

После рестарта ардуины (нажать кнопку Reset, или закрыть/открыть моинтор) - четко воспроизводится это поведение? (стоит на step и начинает крутится на Loop)?

А если после myservo.write(pos), добавить

Serial.print("pos=");Serial.println(pos);

Есть такое что вращение идет не на всех углах, а только на каких-то определенных? Что-то типа "начало крутится при pos=47 и т.п.?

Ну и проверте, опять банальное, что какой-нибудь проводок на серву не отходит. Что контакты нормальные.

Geronimo
Offline
Зарегистрирован: 06.05.2013

Может и тайминги не те, модифицировал пример, сделал шаг не 1 градус, а 10, не крутится(

Geronimo
Offline
Зарегистрирован: 06.05.2013

Надо достать другую севу и на ней потестить...