Автор Тема: Arduino за стрелки  (Прочетена 56346 пъти)

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #15 -: 27 Юли 2017, 14:09:43 »
Значи този метод не е много сигурен. Ако се спрем на него трябва да има задължително обратна връзка, което усложнява проекта.

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12257
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #16 -: 27 Юли 2017, 14:45:27 »
 Би трябвало да има и други възможности.
Например да "смята", че бутона е натиснат за определено време.
Опция за таймер или нещо от сорта.
Или пък да брои колко градуса трябва да стигнат до едно или друго крайно положение. Тоест отново да смята бутона за натиснат до отброяване на определени градуси.
( Май спомена че цикъла ти се състои от стъпки по 1 градус)
Всъщност обратната връзщо в сервото е подобна.
Там разбира, че е завъртял сервото в едно от крайните си  положения,
когато изравни показанията на зададените, с тези получени от вградения променлив резистор. Тоест изравнява честотите и спира. Нали всъщност чрез входните честоти, сервото тръгва в определена посока до достигане на нужния ъгъл.
Или нещо такова...
 ;D

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #17 -: 27 Юли 2017, 15:21:21 »
Защо го правиш в цикъл? Не става ли нещо като това:

if (digitalRead(2) == HIGH)
{
  servo.write(25); 
}
elseif (digitalRead(3) == HIGH)
{
  servo.write(50); 
}

С цилъл и забавяне, стрелката вероятно ще превключва по-бавно (по-мазно, по-реалистично ;D), но трябва допълнителен флаг в кода, за да не се налага бутона да се държи постоянно натиснат. Нещо като напр:

bool button1on = false;  // флаг за натиснат бутон

button1on == (digitalRead(2) == HIGH);  // проверка преди основния цикъл

// основен цикъл

while (button1on && (pos < 110))  // нататък мисля е ясно
« Последна редакция: 27 Юли 2017, 15:26:23 от Mixy »

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #18 -: 27 Юли 2017, 15:30:05 »
Цитат на: pavel75 link=topic=4987.msg108505#msg108505 date=1501153783
Значи този метод не е много сигурен. Ако се спрем на него трябва да има задължително обратна връзка, което усложнява проекта.

Примерчетата по-горе са доста елементарни и не ви съветвам да ги ползвате в този вид. Разбира се те са чудесни за начало, а могат спокойно и да си останат в този вид.

Бутоните могат да се четат по различен начин, с еднократно натискане, със задържане докато сервото стигне до края, с натискане за алтернативна смяна на посоката и т.н. Не е много сложен код.

ПС: Микси написа нещо докато аз се туткам на клавиатурата: тези цикли ги правят хората за да се похвалят колко е хубаво сервото да врътне стрелката за 3 секунди от единия край до другия. Или за 2, ако трябва. Иначе став щрак-щрак.

ПС2: Това атачване по едно време беше където трябва, нещо в последните примери пак избяга където не трябва.

Сериозният проблем е че при изключване на управлението (захранването) стрелките остават в положението, в което са в този момент. При ново включване с тези програмки се приема че сервото е в положение 0, или 90 или колкото сте му написали, но не и колкото е в действителност (а то може и да е 180). На теория това не може да се реши, освен ако няма "крайни изключватели", които да се четат преди въобще да се атачне порта на сервото. Трябва да са направени и да се четат така, че да се разпознават не само двете крайни положения, но и това че стрелката не е преместена докрай (случва се доста често).  С първия пример може да си натискате бутона на порт 3 за да "нулирате" стрелката, ама тя хич няма да мръдне, защото ардуиното си знае че е в положение 0. Така че "реалната" програмка за стрелки ще изглежда доста различно.


Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #19 -: 27 Юли 2017, 15:49:49 »
Цитат на: mitko0888 link=topic=4987.msg108508#msg108508 date=1501158605
Сериозният проблем е че при изключване на управлението (захранването) стрелките остават в положението, в което са в този момент... Така че "реалната" програмка за стрелки ще изглежда доста различно.

Напълно вярно. По принцип, при всяко включване на захранването, следва да има инциализиране със завъртане на сервото "еди-колко-си-градуса", които градуси да са повече от реалния възможен ход. Това гарантира поставяне в едното крайно положение на стрелката, което се приема за изходно (начално). Дали сервото ще има вграден ограничител/изключвател (да не напъва да върти повече от допустимия механичен ход), зависи от модела и най-вече от цената. Има и такива, които "напъването" не им пречи. Но опрделено трябва да се помисли и за това - как коректно ще се инициализира системата при включване на захранването.
« Последна редакция: 27 Юли 2017, 16:13:32 от Mixy »

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1464
  • Рейтинг: 542
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #20 -: 27 Юли 2017, 15:53:28 »
Е аз исках темата да бъде и обучителна, и да има примерчета, за да се види как всичко започва. Няма как да плесна код за готова стрелка и 90% от четящите да не разберат нищо.

Искам темата да е полезна, защото е евтино и няма смисъл да пълним хазните на Конрад или Хофман.

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

Ще дойде и по- сложния код, ама нека да стигнем до там. После може да предлагаме кодове и оптимизации, но трябва всички четящи да са на една вълна.

Това, което Милен е предложил ще стане като код. Мислех и аз да направя оптимизация на кода за вариант само с моментно натискане, но все пак съм на работа и го правя при наличие на свободно време :).. Поне е хубаво, че става дискусия, за да родим накрая нещо полезно.

А и в момента чакам да ми дойде поръчката на контролера и сервотата за да мога да тествам всеки код, преди да го плесна тук.
« Последна редакция: 27 Юли 2017, 16:04:13 от emilchaushev »

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #21 -: 27 Юли 2017, 16:27:32 »
Искаме и клипчета от тестовете, а не само код, защото едно клипче струва колкото хиляда реда код. 

https://www.youtube.com/watch?v=3XVtUUtfjJE

 :lol:  :pleasantry:  :drinks:

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1464
  • Рейтинг: 542
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #22 -: 27 Юли 2017, 16:44:37 »
Цитат на: Mixy link=topic=4987.msg108511#msg108511 date=1501162052
Искаме и клипчета от тестовете, а не само код, защото едно клипче струва колкото хиляда реда код. 

https://www.youtube.com/watch?v=3XVtUUtfjJE

 :lol:  :pleasantry:  :drinks:

Ихххх начи, сега трябва да чакам две -три седмици да дойдат чарколаците. Обаче приемем предложението, защото е градивно и наистина ще има смисъл=> хем проверен и публикуван код, хем нагледен резултат.

Даже ще изтествам наистина дали сервото се ресетира при изключване на захранването, в зависимост от декларирането и атачването в кода.

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #23 -: 27 Юли 2017, 16:53:50 »
Цитат на: emilchaushev link=topic=4987.msg108513#msg108513 date=1501163077
Ихххх начи, сега трябва да чакам две -три седмици да дойдат чарколаците

Само се бъзикам, щото цял ден си мисля, че е петък, а то... Давай още кодове :)

Цитат на: emilchaushev link=topic=4987.msg108513#msg108513 date=1501163077
Даже ще изтествам наистина дали сервото се ресетира при изключване на захранването

Това не знам как ще става, освен ако няма някаква пружина вътре. Ще е интересно да се тества.  :good:

Дай някакъв datasheet за това моторче, че не намерих в ali-то...

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12257
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #24 -: 27 Юли 2017, 17:09:23 »
Цитат на: Mixy link=topic=4987.msg108511#msg108511 date=1501162052
Искаме и клипчета от тестовете, а не само код, защото едно клипче струва колкото хиляда реда код. 

https://www.youtube.com/watch?v=3XVtUUtfjJE

 :lol:  :pleasantry:  :drinks:
ФТТ

 :lol: :lol: :lol: :lol: :lol: :heat:

ПП. То вярно, че зависи какво качество на сервото сте избрали, но крайни изключватели само усложняват всичко.
След изключване на захранването и последващо възстановяване,
може преди всички операции, да се изпраща до всички машинки,
"установи се на 0 градуса" и готово. Няма да има никакво напъване защото самата им конструкция не го позволява.

Дори да е аналогова машинка (нали се търси  простота в схемата и бюджетно изпълнение), ако при началното установяване към всички налично свързани машинки се подаде командата
"отиди на 0 градуса" (широчина на импулса 1 mS), то командата ще изпълнят само тези на които вградения потенциометър им
позволява това. Тоест другите ( не изпълняващи командата) ще
са сравнили данните и просто няма да се завъртят.



А тези които се завъртят, ще спрат в момента който също изравнят подаваните импулси с вътрешната си информация.
И няма да има никакво насилване на машинките.

Всъщност това с "нулирането" им, си е почти задължително,
за да може да се прави периодично с оглед премахването на
натрупаната грешка, която е неизбежна при аналоговите
 (същите са от евтините) сервомашинка.
Колкото повече не се "нулират" - толкова повече  и натрупаната грешка стана по-голяма, като може дори са се стигне,
 че тя (грешката) да не се компенсира от пружинния ефект на лостчето предаващо механичното движение от рамото на сервото, до пластината местеща езика на разклонението.

При  цифровите сервомашинка, това е елиминирано, включително и от механични и температурни влияния, но те струват значително по-скъпо...тоест не са предмет на този проект.
 :hi:

ПП2. Горе нещо се бъгна и качи само първата част от поста ми...
Ще помоля Милен да го изтрие там - тук е целият пост!
 :hi:
« Последна редакция: 27 Юли 2017, 17:13:39 от pach »

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1464
  • Рейтинг: 542
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #25 -: 27 Юли 2017, 18:00:44 »
Сега ще сложа един малко по- сложен код за управление на сервото между 90 и 110 градуса, като в кода се вижда, че с декларирането и атачването се заема положение"Право" на стрелката.

Опитната постановка е за упраление с един бутон, свързан към пин 8 и серво на пин 9, като на пин 8 имаме оново резистор, който да държи масата. Всяко натискане на бутона води до превключване в противоположното положние на стрелката.


================
КОД:

#include <Servo.h>

// константни променливи използвани за ъглите на сервото в градуси
const int straight = 90;
const int divergent = 110;

// Константни променлилви за пиновете, които се използват
const int buttonpin = 8;
const int servopin = 9;

// константа със стойност за забавяне на движението на сервото в милисекунди
const int step_delay = 70;

// декларираме сервото
Servo myservo; 
 
// глобални променливи за запомняне позицията на сервото
int pos = straight; // current
int old_pos = pos; // previous

void setup()
{
  // деклариране на пина за бутона
  pinMode(buttonpin, INPUT);
   
  // ето тук казваме директно след атачването да се обърне в права позиция сервото
  myservo.attach(servopin);  // attach to the servo on pin 9
  myservo.write(pos); // set the initial servo position
}

void loop()
{
 // всяка итерация започва с промяна на състоянието на бутона
 // при натиснат бутон (reads HIGH), се премества сервото
  int button_state = digitalRead(buttonpin);
  if(button_state == HIGH){
   
    old_pos = pos;   // запазва текущата позиция
   
    // променя позицията в обратното състояние
    pos = pos == straight ? divergent: straight;
       
    // премества сервото до новата позиция
    if(old_pos < pos){   // ако новия ъгъл е по- голям
      // завърта (увеличава) серво позицията от старото до новото състояние
      for(int i = old_pos + 1; i <= pos; i++){ 
        myservo.write(i); // записва следващата позиция на сервото
        delay(step_delay); // пауза
      }
    } else {  // обратно новия ъгъл е по- малък и ли равен
      // завърта (намалява) серво позицията
      for(int i = old_pos - 1; i >= pos; i--){
        myservo.write(i); // записва следващата позиция на сервото
        delay(step_delay); // пауза
      }
    }
   
  }
}// край на цикъла

jopeto

  • Trade Count: (16)
  • Hero Member
  • *****
  • Публикации: 1339
  • Рейтинг: 206
Re: Arduino за стрелки
« Отговор #26 -: 27 Юли 2017, 19:49:51 »
Темата я следя от самото началао. Според мен, трябва да махнете сервото от цялата схема. Направете го със стъпково моторче. На него може да му регулирате градусите, стъпките, броят обороти и скоростта. В записвачките за CD и флопитата има достатъчно малки такива.

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1464
  • Рейтинг: 542
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #27 -: 27 Юли 2017, 20:15:01 »
Jope, отвори тема за стъпкови моторчета и управлението им, за да не мешаме знанието.
Тук темата е за серво и Ардуино. Виждал съм готови гари и искам да я разчоплим до край. Аз в нета примери за стъпкови не съм виждал, и като нямам знанията няма и какво да напиша, но нека не разводняваме.
Необходима ни е конкретика, знание и факти.

Ако имаш такива ги сподели с нас, но не очаквай че ще подхвърляш идея и някой друг ще трябва да я чопли и развива
« Последна редакция: 27 Юли 2017, 20:27:03 от emilchaushev »

jopeto

  • Trade Count: (16)
  • Hero Member
  • *****
  • Публикации: 1339
  • Рейтинг: 206
Re: Arduino за стрелки
« Отговор #28 -: 28 Юли 2017, 08:50:05 »
Без да разводнявам темата, ето един пример, който намерих в нета веднага. Достатъчное е изчерпателно описани са кодовте, има и туториали. Нужно ви е единствено да се просветите как действат стъпковите мотори, разликите в тяхната конструкция размери и видове драйвъри. Подкарване на стъпков с драйвър  http://www.makerbothy.com/arduino-stepper-motor-control/ и подкарване на стъпков направо с ардуиното http://forum.arduino.cc/index.php?topic=91442.0 Ардуиното е много добър вариант за нас понеже има евтини китайски реплики, които са на достъпна цена. Това ни позволява да се качим на по-горното ниво в хобито. Така, някой от нас имат шанса  да развихрим творческото си въображение, като накараме един макет или модул да "оживее" в буквалният смисъл на думата. Ардуиното е приложимо не само за стрелки, ами и за сигнали,бариери, обръщатели отваряне и затваряне на врати(на депото например), задвижване на индустрии и всичко каквото ви дойде на ум. http://www.electroingenio.com/arduino-en/stepper-motor-with-mobile-app/  :hi:
« Последна редакция: 28 Юли 2017, 08:53:05 от jopeto »

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12257
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #29 -: 28 Юли 2017, 09:42:00 »
Eмчо, ако може да задам въпрос? Може би няколко.

С кой от китовете разполагаш/работиш?
На една от скиците виждам кит с неясно означение (не се чете ясно) Digital + PWM.
Това ли ти е експерименталния кит? Може би е версия R3?
По старите версии нямат възможност да ползват генератор за импулси, а те си трябват независимо кои сервомашинки ще ползваш.

И последен въпрос - смяташ ли да ползваш тъчскрийн дисплей
за визуализация на осъществяваното управление? В мрежата има вече доста такива схеми решения, включително и за малки гарички или контролни постове за стрелкови гърловини. Дори и цветни!
Все пак това зависи и от площа на употребявания тъч дисплей де, а реализацията им явно е много улеснена съгласно ардуиното.
 ;D