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

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1464
  • Рейтинг: 542
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #90 -: 27 Февруари 2018, 08:49:20 »
В този им вид двете ключета са проектирани да подават захранване на сърцето на стрелката, т.е. те са вързани към релсовите вериги => съгласно FREMO правилата не могат да се използват за захранване на други принадлежности.

Те обаче наистина могат да участват във верига на бистабилни релета, от които едната им управлявана верига да храни сърцето, а другата да се ползва за обратна връзка към Арлекиното.

Павка без чертане на ел. схемите няма да се разминеш. Въпросът е дали искаш малко кабели, тъй като гарата е на доста модули и ще трябва преходници между модулите на кабеляка, + малко портове  или ще се ходи на лесна конфигурация с повечко кабели и повече Арлекинота

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #91 -: 27 Февруари 2018, 09:55:54 »
Цитат на: mitko0888 link=topic=4987.msg110854#msg110854 date=1519668777
Смятай че стрелките, управлявани с мотори, или серво, нямат две положения, а имат поне три: "ляво", "дясно" и "някъде по средата".

На ардуиното ти предлагам да използваш по три пина на стрелка: един за сервото, един за "на ляво", един за "на дясно". Да подаваш 0 за задействане в съответната посока. Не знам как си го мислил само с един бутон да управляваш една стрелка?.....

В този клип дето си дал като пример в по-преден пост гледам, че с един бутон го правят. За това реших, че може да стане.

https://www.youtube.com/watch?v=akvCsXheF6A

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12271
  • Рейтинг: 1314
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #92 -: 27 Февруари 2018, 10:35:20 »
Павка на клипа е точно - един бутон, а ардуиното брои всяко негово натискане, като изпълнява последователно следващо действие. То се вижда че е с един пин/ проводник а бутона е на "+"
през резистор.
Впрочем човека показва и отговор на твоя въпрос - за ресет
при първоначално вкл. на захранването, независимо къде са ти
спрели машинките.
Остава да влезеш във връзка с човека илида намериш кода,
който сигурно го е публикувал някъде.
има линкове в профила му от тубата към Фейсбук и VK, както и към гогле+!!!

Само ще трябва да експериментираш за общия брои на машинките.
Впрочем като стигнеш до това, може някой от тях да ти "жужат"
Оправяло се чрез прецизиране на тайминга ( таймерите).
Успех!
 :yes: ;D

ПП. Впрочем човека ( явно е в Щатите) е реализирал и DCC  управление с ардуиното. ...някой тук май правеше опити за такова.
« Последна редакция: 27 Февруари 2018, 10:42:28 от pach »

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #93 -: 27 Февруари 2018, 10:46:44 »
С едно бутонче да превключваш стрелката - може да стане, и кодът е точно за такова включване. Аз съм написъл че "на мен ми е сложно". ТАNО си ги прави така - с по едно бутонче, което превключва стрелката от текущото положение в другото. Поне такива спомени имам. Само че той си реди и маршрути - през цялата гърловина и през всички стрелки с начало и край на маршрута, като за релетата на стрелките има и друго управление - ляво и дясно.

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

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

За сърцата: ако на модула има по едно реленце, управлявано от тези ключета на рамото на сервото, ако има захранване на модула (напр. 5 волта, което ще трябва и за сервото, и за ардуиното) ще е захранено и сърцето. Бистабилни релета ще си останат в състоянието, дори и ако се откачи захранването, а положението може да е грешното. Ако не е включено 5-те волта, просто сързето ще остане изолирано, но няма да направи късо или друг проблем. Ще драсна довечера една схемичка, но в крайна сметка всеки си го прави както му харесва.

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #94 -: 27 Февруари 2018, 10:53:56 »
Цитат на: pach link=topic=4987.msg110861#msg110861 date=1519720520
Павка на клипа е точно - един бутон, а ардуиното брои всяко негово натискане, като изпълнява последователно следващо действие. То се вижда че е с един пин/ проводник а бутона е на "+"
през резистор.
Впрочем човека показва и отговор на твоя въпрос - за ресет
при първоначално вкл. на захранването, независимо къде са ти
спрели машинките.
Остава да влезеш във връзка с човека илида намериш кода,
който сигурно го е публикувал някъде.

има линкове в профила му от тубата към Фейсбук и VK, както и към гогле+!!!

Само ще трябва да експериментираш за общия брои на машинките.
Впрочем като стигнеш до това, може някой от тях да ти "жужат"
Оправяло се чрез прецизиране на тайминга ( таймерите).
Успех!
 :yes: ;D

ПП. Впрочем човека ( явно е в Щатите) е реализирал и DCC  управление с ардуиното. ...някой тук май правеше опити за такова.

И кода го има в поста на Митко:
http://www.railwaypassion.com/forums/index.php/topic,4987.msg109426.html#msg109426

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

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #95 -: 27 Февруари 2018, 12:21:37 »
Цитат на: mitko0888 link=topic=4987.msg110862#msg110862 date=1519721204
С едно бутонче да превключваш стрелката - може да стане, и кодът е точно за такова включване. Аз съм написъл че "на мен ми е сложно".

Така е - всичко е въпрос на програмиране и удобство. Не е задължително бутоните да са "вързани" към положенията/посоките на стрелките (2 бутона за 2 положения), защото при тройна или английска стрелка ще има два мотора с 4 положения и съответно ще трябват 4 бутона, което води до усложнения по таблото и повече заети входове в контролера. 1 бутон върши чудесна работа като просто някъде в програмата (в променлива или масив) се помни текущото положение (в права или крива, условно 0 или 1) за съответната стрелка и всяко следващо натискане обръща мотора и съответно сменя стойността в променливата. За английска стрелка съответно положенията ще са 0, 1, 2 и 3. За всяко следващо положение ще се превключват два мотора и стойността на променливата ще се увеличава, а при достигане на положение 4 се прави преход към 0 и все сначале. Може дори да се ползват бутони не за стрелки, а за нагласяне на маршрути по съответните коловози. Примерно за 10 коловоза ще има 10 бутона и всяко натискане ще превключва съответните стрелки в съответните позиции. А при желание, може всичко да става и само с 1 бутон - всяко натискане редува маршрут за всеки следващ коловоз, но това вече е извратено, дори и за мен  ;D

Тук естествено съм спестил, че трябва да се отчита и липсата на положение (моментът в който сервото върти и е "някъде по средата", както казва Митко), защото това води до усложнения при реденето на маршрути, а именно дали всички стрелки от маршрута да се превключват едновременно (повече стрелки => по-голяма консумация) или една след друга (повече стрелки => повече време за установяване) и как да бъде разпределено това в програмата със съответните проверки и прехващане на всички възможни грешки и изключения. Но както казах и в началото, всичко е въпрос на (правилно) програмиране и (търсено) удобство ;)
« Последна редакция: 27 Февруари 2018, 12:27:09 от Mixy »

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #96 -: 27 Февруари 2018, 14:33:28 »
Хубаво е, ако може, да има и малка прилика с действителността  ;D

svetljjjo

  • Гост
  • Trade Count: (0)
Re: Arduino за стрелки
« Отговор #97 -: 27 Февруари 2018, 16:32:37 »
една идея ако искате от мен
щом ви трябват много пинове и много бутони може да пробвате това

ардуино има аналогови входове
аналоговите входове могат да четат стойност на напрежението от 0 до 5 волта като за тоя диапазон изарват стойност на променливата от 0 до 1024 .
Та идеята е следната последователно вързани съпротивления от + захранване към маса примерно 10 броя по 1ком
между всяко от тях единия край на бутона и другия край общ за всички бутони към пин 3 примерно
и с analogRead()  се взима стойноста тя ще е разбична за всеки бутон но ще може да се натиска само по 1 едновремено
и като имаш стойност после с мойта любима
switch (var) {
  case label1:
    // statements
    break;
  case label2:
    // statements
    break;
  default:
    // statements
}


може и с
if (condition)
{
  //statement(s)
}

ако ви е по любима.  Това е само идея не съм го пробвал но съм пробвал потенциометър и ардуиното си чете както споменах по горе има го и като пример в самата програма за аналогови примери. А е твърде възможно и 20 съпротивления да се вържат по 470 ома и трябва да се види само дали при всяко натискане на един и същ бутон дава една и съща стойност ако има малки разлики
няма да е проблем да се направи диапазон с if
прпимерно нещо такова

Цитат
int analogPin = 3;     
                     
int val = 0;         

void setup()
{
  Serial.begin(9600);              //  setup serial
}

void loop()
{
  val = analogRead(analogPin);     // read the input pin
  Serial.println(val);             // debug value

 if (val>0 && val<10){  //код за задействане на серво }
  if (val>10 && val<30){  //код за задействане на серво}
   //и така нататък за всички бутони
  }
 }
}

Най вероятно стойноста няма да е еднаква всеки път ще се различава в некъв малак диапазон щото това зависи от моментната стойност на напрежението все пак входа е доста чувствителен 1024 / 5 = 204,8 еденици на 1 волт се падат
« Последна редакция: 27 Февруари 2018, 16:39:55 от svetljjjo »

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #98 -: 27 Февруари 2018, 16:58:05 »
Като гледам най-сложната гърловина има 7 стрелки, които могат да се управляват с 10 бутона по "моя си" начин. 20 пина ще стигнат.

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #99 -: 02 Март 2018, 12:19:37 »
Искам да се похваля с напредъка.
Дали се вижда този клип?:

https://www.dropbox.com/s/9rrjgm746wd7b73/VIDEO0007.mp4?dl=0

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #100 -: 02 Март 2018, 12:54:56 »
Ето и кода който съм ползвал. Не е мой. Емо го е дал като пример на по-предна страница. Аз само го нагодих малко и сложих малко по-разбираеми /поне за мен/ имена на константите и променливите:

#include <Servo.h>

// константи за градусите на сервото
const int pravo = 0;
const int diasno = 90;

// константи за пиновете, които ще се използват
const int butonpin = 6;
const int servopin = 5;
const int led_pravo = 7;
const int led_otklonenie = 9;

// константа за периода на забавяне на върнете на сервото
const int period = 100;

//декрарираме сервото
Servo Strelka1;

//променливи за запомняне позицията на сервото
int pos = pravo; // текуща позиция
int pos_old = diasno; // предишна позиция

void setup() {
  // изпълнява се веднъж при пускане на програмата

// декрарираме пиновете, които ще се ползват
pinMode (butonpin,INPUT);
pinMode (led_pravo, OUTPUT);
pinMode (led_otklonenie, OUTPUT);

 // атачваме сервото и го караме да се обърне в права позиция
 Strelka1.attach(servopin); // закача сервото на пин 5
 Strelka1.write(pos); //сервото се обръща в права позиция
 //Strelka1.detach();

 // настройка първоначален статус на светодиодите
 digitalWrite (led_pravo, HIGH);
 digitalWrite (led_otklonenie, LOW);
}

void loop() {
  // изпълнява се постоянно


// с всяко натискане на бутона се променя позицията на сервото

int buton_push = digitalRead(butonpin);

if(buton_push ==HIGH){
  // изключва светодиода за право
  if(pos == pravo){
  digitalWrite (led_pravo, LOW);}
  else{
  digitalWrite (led_otklonenie, LOW);
  }

pos_old = pos; //запазва текущата позиция
 
  if(pos==pravo)
  {pos=diasno;}
  else{pos=pravo;}
 
        //pos=pos==pravo ? diasno:pravo; // променя позицията в обратно състояние
      //Strelka1.attach(servopin);
      if(pos_old<pos){
            for(int i = pos_old + 1; i <=pos; i++){
              Strelka1.write(i); // записва следващата позиция на сервото
              delay(period); // забавяне
             // Strelka1.detach();
            }
           
      }
      //Strelka1.attach(servopin);
      if(pos_old>pos){
       {
              for(int i = pos_old - 1; i >=pos; i--){
              Strelka1.write(i); // записва следващата позиция на сервото
              delay(period); // забавяне
             // Strelka1.detach();
              }
             
            }
      }
            // Светва съответния пин

            if (pos == pravo){
              digitalWrite (led_pravo, HIGH);
            }
            else{
              digitalWrite (led_otklonenie, HIGH);
            }
           
      }
           
}

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

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #101 -: 02 Март 2018, 13:49:48 »
Цитат на: pavel75 link=topic=4987.msg110880#msg110880 date=1519988096

Както ще видите в кода съм се опитал да закачам и после да откачам сервото при всяка операция, но не се получи. Явно не съм го сложил на правилното място.


Премести тези detach с един ред надолу (след скобата) и ще стане. Ама и това attach го мръдни да е след първата скоба на if. Пък на втория  if имаш и един комплект излишни скоби.

      if(pos_old<pos){
              Strelka1.attach(servopin);
              for(int i = pos_old + 1; i <=pos; i++){
                  Strelka1.write(i); // записва следващата позиция на сервото
                  delay(period); // забавяне
              }
              Strelka1.detach();
      }
      if(pos_old>pos){
              Strelka1.attach(servopin);
              for(int i = pos_old - 1; i >=pos; i--){
                  Strelka1.write(i); // записва следващата позиция на сервото
                  delay(period); // забавяне
              }
              Strelka1.detach();
      }
« Последна редакция: 02 Март 2018, 13:53:14 от mitko0888 »

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #102 -: 02 Март 2018, 14:17:51 »
Миткооооо.
Велик си. Стана. Работи като часовник.

 :drinks:

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #103 -: 02 Март 2018, 19:08:40 »
Остана сега да реша другия проблем.
Като спра захранването когато е в основното положение, като го включа всичко е точно.
Обаче, когато го изключа в отклонение не става баш добре. Светодиода светва като за направо, защото така е дадено в програмата, но сервото не мърда. Натискам копчето и все едно платката се събужда - прави един бърз ход до положение "право" и после бавно се придвижва до "оклонение" като светва и съответния светодиод.

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #104 -: 02 Март 2018, 19:43:28 »
Ще трябва да си поиграеш още малко за да го видиш откъде е. Сложи някакъв delay(1000) в началото, преди първия attach, че и още един след него, преди първия write. След това нали има detach? Това всичкото да е в setup()