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

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1464
  • Рейтинг: 542
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #30 -: 28 Юли 2017, 10:04:43 »
Паце, схемите в примерите са примерни от нета, като имат за цел единствено да покажат разнообразието в писането на кода.

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

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

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

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

Милен предложи JMRI софтуер, но хардуерната връзка ми бяга в тъча.

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #31 -: 28 Юли 2017, 11:24:12 »
JMRI е набор от програми и библиотеки на Java, предназначени за контрол и управление на влакове и макети чрез компютър. Компютърът служи за основна станция (централа), откъдето могат да се командват локомотиви, стрелки, сигнали и т.н. Връзката между компютъра и самия макет става през някоя от множеството поддържани фабрични централни станции или през направи-си-сам решения като напр. DCC++ - централа на базата на Ардуино със собствен софтуер с отворен код. Самото управление може да е напълно автоматизирано, като за всеки влак се задава маршрут, разписание и т.н. и макета се превръща в изложба за зрители (като в Miniatur Wunderland) или да е ръчно, от човек, който използва компютъра като един вид по-удобна мишка. Вместо компютър, може да се ползва таблет, телефон или каквото и да е устройство с браузър за визуализиране на контролните панели на гарите и за управление на локомотивите.

Колкото до връзката между JMRI и текущо обсъжданото управление за стрелки с Ардуино - не мсиля, че има готово решение. По-скоро трябва да се заделят два входа в ардуиното и да му се вмъкне малко код за разпознаване на DCC адреси и команди и да се предприема съотетното действие при подадена към него команда. Това ще реши проблема със създаването на механичен контролен панел с множество бутони, но ще създаде други проблеми, тъй като си е ръчкане и писане на доста код. Но пък ще е готино, ако стане - началник-гарата ще се мотае наоколо с един таблет в ръка и ще командва всичко от там.

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

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12256
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #32 -: 28 Юли 2017, 11:29:56 »
Препоръчвам ардуиното уно R3 (digital+pwm), защото
Нано-то бързо ще ти отеснее с оглед желанието да повече серво и т.н.

 Колкото до връзка не само с тъчскрийн, но лаптоп и базова
станция която надстроява DCC до DCC++ e именно връзката между DCC и С++ (от там заглавието на надстройката) реализирана чрез отворен код.
Сайта на DCC++ e:
https://github.com/DccPlusPlus/BaseStation/wiki/What-is-DCC--Plus-Plus

Youtube canell:
https://youtu.be/8cBQoI1NfHI

И основното за проекта:
https://sites.google.com/site/dccppsite/home

Като допълнение може и тук:
http://jmri.org/help/en/html/hardware/dccpp/index.shtml

Впрочем допълнителните модули в добавка,
 са също на приемливи цени!

Тъчскрийна е от друг проект в допълнение:
http://sguggiari.ch/5_dcc_arduino.php

Имаше и конкретно за гърловина с графичен тъч,
 но в момента нямам време да го потърся.

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12256
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #33 -: 28 Юли 2017, 12:16:37 »
Ето го въпросния проект за тъч-а!
http://www.wcmrra.org/content.aspx?page_id=2507&club_id=407609&item_id=1260



Въпрос на графика и реализация  де ...
« Последна редакция: 28 Юли 2017, 12:21:03 от pach »

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #34 -: 28 Юли 2017, 13:28:25 »
Гледам от известно време: зелената точка си мисля че схванах за какво е (т.е. аз за какво бих я нарисувал на това място и в такъв цвят). Ама двете червени топки - няма да се справя ... Имам някакво подозрение, че ако пипна дясното червено топче то ще позеленее и ще включи двете стрелки за преход от най-долния на средния коловоз. А пък ако пипна зеленото - то ще стане червено и отдясно ще се влиза направо в, а не в отклонение.

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

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

emilchaushev

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


Повече подробности за любопитните: https://playground.arduino.cc/Main/ArduinoPinCurrentLimitations


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

Ето и опитната постановка:

Разчитаме на резисторите на изходите за ограничаване на тока, като дори да използваме от старите светодиоди, можем да направим сметка при 5V и 17мА ток какъв резистор да си сложим

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


#include <Servo.h>

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

// Константни променлилви за пиновете, които се използват
const int divergent_led = 6;
const int straight_led = 7;
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);
  pinMode(straight_led, OUTPUT);
  pinMode(divergent_led, OUTPUT);
 
  // инициализация на сервото
  myservo.attach(servopin);  // attach to the servo on pin 9
  myservo.write(pos); // set the initial servo position
 
  // настройка на първоначалния статус на светодиодите
   digitalWrite(straight_led, HIGH);
    digitalWrite(divergent_led, LOW);
}

void loop()
{
 // всяка итерация започва с промяна на състоянието на бутона
 // при натиснат бутон (reads HIGH), се премества сервото
  int button_state = digitalRead(buttonpin);
  if(button_state == HIGH){
    // Изключва LED-а
    if(pos == straight){
              digitalWrite(straight_led, LOW);
          } else {
              digitalWrite(divergent_led, LOW);
          }
    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); // пауза
      }
    }
    // Запалва съответния LED.
    if(pos == straight){
            digitalWrite(straight_led, HIGH);
        } else {
            digitalWrite(divergent_led, HIGH);
       }
  }
}// край
« Последна редакция: 28 Юли 2017, 15:24:36 от emilchaushev »

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12256
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #36 -: 28 Юли 2017, 15:58:46 »
Митко, съжалявам за езика там....но така пишат понякога хамершканците. Още повече, щото смятат, че те са целия свят!!!
"Голяма работа", че например ние не знаем нито кой е Рик Флин,
нито какъв е другия клуб от който са взели макета и какво по дяволите е "Стъфи" дето не работел достатъчно много по него....
 
Примера по-горе е от план А (в момента са на план С) и съм го
дол само са се види, че едно ардуиното модулче има капацитета и
може да управлява до три стрелки и тъчскрийн цветен дисплей от 5 см.

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

Нали разбираш, че план С, вероятно ще си остане в хамершканците и едва ли ще го споделят със света (дето не го и знаят), така че, излишно си се мъчил да си превеждаш текста - той само казва какво правят, но не и начина по който (ще) става!
 :drinks:

А сега като "зарибих" и други за дисплей (и тъчскрийн),
 ще следя с интерес  темата и уроците от Чаушев!
 :hi:

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12256
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #37 -: 15 Септември 2017, 20:00:51 »
Не знам Емчо докъде е докарал проекта ...лято...море... отпуски!!!
 :drinks: bg&flag :beach:

Но докато сме на страничната тема за тъч дисплей  :victory:
ето едно мноооого приятно възможно решение:
https://youtu.be/E0iDrJERb98
Въпрос на проектиране и всичко което се полага, за да стане
един красив "екранопулт" за управление заедно с ардуйно-то на десет машинки ( разклонения)!
... примерно!!!
Редактора е много готин, но си иска и един тъч на ръка, за да се експериментира все пак за пълните му възможности.
Но за това, като го докарате до екран-а!!!
 :hi:

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #38 -: 02 Ноември 2017, 12:11:03 »
Цитат на: emilchaushev link=topic=4987.msg108558#msg108558 date=1501244503
.......


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


#include <Servo.h>

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

// Константни променлилви за пиновете, които се използват
const int divergent_led = 6;
const int straight_led = 7;
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);
  pinMode(straight_led, OUTPUT);
  pinMode(divergent_led, OUTPUT);
 
  // инициализация на сервото
  myservo.attach(servopin);  // attach to the servo on pin 9
  myservo.write(pos); // set the initial servo position

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

void loop()
{
 // всяка итерация започва с промяна на състоянието на бутона
 // при натиснат бутон (reads HIGH), се премества сервото
  int button_state = digitalRead(buttonpin);
  if(button_state == HIGH){
    // Изключва LED-а
    if(pos == straight){
              digitalWrite(straight_led, LOW);
          } else {
              digitalWrite(divergent_led, LOW);
          }
    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); // пауза
      }
    }
    // Запалва съответния LED.
    if(pos == straight){
            digitalWrite(straight_led, HIGH);
        } else {
            digitalWrite(divergent_led, HIGH);
       }
  }
}// край

Имаме следният случай -  сервото е на позиция 90 градуса, когато схемата се изключва.
При следващо включване при инициализацията /отбелязаното в тъмно/ е дадено сервото да се завърти на 90 градуса.
Реално то е на тези градуси. Какво ще се случи? - Сервото няма да мръдне или ще направи движение?

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12256
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #39 -: 02 Ноември 2017, 12:28:13 »
Няма да мръдне!
То си е изравнило исканите показания и подава
обратно,   че Е на 90 градуса.
« Последна редакция: 02 Ноември 2017, 12:29:55 от pach »

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #40 -: 02 Ноември 2017, 12:32:38 »
Цитат на: pach link=topic=4987.msg109398#msg109398 date=1509618493
Няма да мръдне!
То е изравнило и подава показания че Е на 90 градуса.

Това означава ли, че по този начин решаваме въпроса поставен по-горе от Митко

Цитат на: mitko0888 link=topic=4987.msg108508#msg108508 date=1501158605
.....

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

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12256
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #41 -: 02 Ноември 2017, 12:39:51 »
Значи горе се изразих грешно...
НЕ " подава" а всъщност сравнява.
От ардуиното получава правоъгълен сигнал с честотата му,
която съответства за 90 градуса.



Когато сравни този сигнал
със настоящият си вътрешен който е за 90 градуса, " вижда"
че няма къде да "ходи". Тук има една тънкост - зависи колко финно е настроен сигнала от вън и сервото с какво качество е.
Ако има минимална разлика то ще я изравни чрез помръдвване,
което може и да не се отрази на управляевото разклонение.
За това се предвиждат винаги пружинни елементи в "трансмисията" които обикновенно са пружинна тел която компенсира такива потрепване и наместване.
Тоест тук няма значение какво иска ардуиното в новото си пускане, а какво може да изпълни сервото. Ако то се окаже
на други градуси , ще има други данни в себе си и ще се движи докато не ги изравни с тези подавани му отвън.

Пример:
Начално включване.
Ардуиното подава сигнал "дай на 90 градуса" което е с една честота от 1.5 ms.
Сервото получава захранване и понеже датчика му е на 90 градуса само си генерира вътрешния сигнал също от 1.5 ms
Сравнява двата сигнала и мръдва само ако се различават.

Това се отнася за цифровите серво. Аналоговите са по грубички и сравняват не честота, а напрежение ( май), но всъщност вече едва ли някой ползва аналоговите някъде
« Последна редакция: 02 Ноември 2017, 12:48:46 от pach »

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #42 -: 02 Ноември 2017, 13:32:16 »
Цитат на: pavel75 link=topic=4987.msg109399#msg109399 date=1509618758
Това означава ли, че по този начин решаваме въпроса поставен по-горе от Митко

Нещата са малко по-дебели.

Има кодове в нета, при които след всяка команда към сервото положението му се записва във флеша. А при стартиране се чете от там последното записано положение. Така при включване на тока всичко тръгва от там където си е било.

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

Тука хитринката се прави с едно РЕЛЕ, управлявано от ардуиното, което да включва захранването на серво машинките само по команда от програмата. Така можеш да инициализираш всичко, вкл. управляващия пин на сервото, и чак тогава да му щракнеш захранването. Също така захранването можеш и да го изключиш след завъртане на сервото, т.е. след изпълнение на командата и завъртането му докъдето трябва. Така сервото няма да жужи около зададенто му положение.

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

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12256
  • Рейтинг: 1308
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #43 -: 02 Ноември 2017, 13:35:41 »
Мдааааа ...ето още един тънък момент - куплирането  му със ардуиното. Интересно другите как са решили тази тънкост?
Митко дава една доста интересна и лесна реализация!
 :hi:
...и е прав - трябва на живо да се експериментира до задоволителен резултат.

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #44 -: 02 Ноември 2017, 21:19:06 »
Цитат на: pach link=topic=4987.msg109398#msg109398 date=1509618493
Няма да мръдне!
То си е изравнило исканите показания и подава
обратно,   че Е на 90 градуса.

Никой нищо не подава обратно. Сервото не може да се чете къде е останало. Ардуиното помни положението от последната команда. Т.е. функцията read() връща положението от последната write() команда, а не къде е сервото в действителност. Ако сервото е било на 90 гр. и му подадеш команда да отиде на 90 гр, то няма да мръдне, а след командата ардуиното ще запомни че вече е на 90 гр.