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

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Arduino за стрелки
« -: 20 Юли 2017, 10:27:15 »
Здравейте,

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

Един контролер за 8 серво-та е от порядъка на долар- два, самото серво също е в този порядък.
Възниква в мен единствено въпросът за обръщането на поляритета на сърцето на стрелката. Аз се сещам за два начина- с бистабилно реле на 5V, което се обръща с ключа за задаване на командата или с механична връзка на краен изключвател към сервото в двете крайни му позиции, които да захранват сърцето.

Естествено в темата можем да поместване кодове за управление, както и различни хитринки, за управлението на механизмите.
В последните години виждам все повече гари направени по този начин, като те или са с управление от компютър или със стандартното изпълнение от пулт с ключета и/или бутони.

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

Old Boris

  • Trade Count: (0)
  • Sr. Member
  • ****
  • Публикации: 322
  • Рейтинг: 133
Re: Arduino за стрелки
« Отговор #1 -: 20 Юли 2017, 12:32:52 »
Идеята е добра и ако се развие полезна дискусия без излишни изхвърляния, ще е успех за форума.
Бих добавил към казаното от Емил "И понеже във форума има хора, за които това не е непозната област, реших, че е хубаво да си имаме отделна тема", че ще е много полезно и за хора като мен не толкова навътре в тази област. :hi:
 

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #2 -: 20 Юли 2017, 13:07:32 »
Нека да започнем с ръководствата на български език.

https://playground.arduino.cc/Bulgarian/Nachalo
https://playground.arduino.cc/Bulgarian/Rykovodstva

На сайта има доста примери, както и в самите книжлета


Ето пример за Arduino Nano контролер: https://www.aliexpress.com/item/Freeshipping-Nano-3-0-controller-compatible-for-arduino-nano-CH340-USB-driver-NO-CABLE/32341832857.html?spm=2114.search0104.3.7.a8Q37b&ws_ab_test=searchweb0_0,searchweb201602_3_10152_10065_10151_10068_10171_10084_10083_10119_10080_10304_10082_10081_10110_10137_10111_10302_10060_10112_10113_10155_10114_10154_438_10056_10055_10054_10182_10059_100031_10099_10078_10079_10103_10073_10102_10120_5360020_10052_10053_10142_10107_10050_10051-10050_10120,searchweb201603_1,ppcSwitch_5&btsid=37b64b9e-2a67-4e83-8835-68e6a4795b78&algo_expid=a5ab6583-1f33-42e6-a6b7-b35a10e914db-3&algo_pvid=a5ab6583-1f33-42e6-a6b7-b35a10e914db

И за 10 бр серво моторчета: https://www.aliexpress.com/item/Free-Shipping-10PCS-SG90-9g-Mini-Micro-Servo-for-RC-for-RC-250-450-Helicopter-Airplane/32551162930.html?spm=a2g0s.8937460.0.0.zkgGpD


Та какво представлява контролера:


Пълното му описание е тук:https://www.itead.cc/wiki/Iteaduino_Nano

Характеристики:
Размери: 43mm x 18mm
Микроконтролер: Atmel ATmega328P
Flash: 32KB, от които свободни 30KB, a 2KB заети от буутлоудъра
RAM: 2KB
EEPROM: 1KB
Тактова честота: 16MHz
Зареден с Arduino Nano буутлоудър
Захранване: 5V от USB или пин 5V, или 6V – 12V на пина Vin
Работно напрежение: 5V
Входно/изходни портове (I/O): 20 броя, от които:
Цифрови портове: до 20 бр.
Аналогови входове: до 8 бр.
PWM (ШИМ): до 6 бр.
UART, I2C и SPI интерфейси
USB-сериен порт конвертор: CP2102
Програмира се с Ардуино IDE, като Ардуино Нано


За по-лесно включване на захранвания, както и комуникацията със серво машинките може да се вземе една платчица, на която да набодете контролера:

Best Ripper

  • Trade Count: (17)
  • Hero Member
  • *****
  • Публикации: 3377
  • Рейтинг: 550
  • Освободил се от форуми...
Re: Arduino за стрелки
« Отговор #3 -: 21 Юли 2017, 09:24:01 »
Офф.. Това е прекалено силно казано "аналогово" управление... Чиста проба си е цифрово.. И следователно не е за тоя раздел...

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #4 -: 21 Юли 2017, 11:03:19 »
Преди да разчепкаме контролера, портовете му, и кода за управление ще сложа малко снимки, предоставени ни от румънските ни приятели. Те са на изработената стойка за серво машинките, така, както те са я проектрали и използват.

Стойката е от 2мм плексиглас, рязана на лазер и залепена и служи за закрепване на сервото, двата крайни изключвателя, които се ползват за обръщане поляритета на сърцето на стрелката (не за спиране завъртането на сервото), както и фиксиране на лостчето за преместване на езика на стрелката (изработено от 0,8мм стоманена тел)




























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

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

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #5 -: 21 Юли 2017, 15:17:19 »
Ето и каталожния номер на крайния изключвател:
http://www.tme.eu/ro/details/msm-22/microcomut-cu-lama-cu-mont-prin-apas/ninigi/msw-22/

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #6 -: 21 Юли 2017, 15:21:43 »
Та да подхванем контролера.

ето му схемата на всички варианти на пиновете




Ето и описанието на пиновете, както и възможните позиции и функции, които могат да изпълняват:
https://www.arduino.cc/en/uploads/Main/ArduinoNanoManual23.pdf

Всички лилавки портове могат да бъдат използвани, т.е. имаме 18/19 порта,  на които трябва да включим серво, ключета за указване на посоката на сервото, и ако искаме светлинна индикация индикация. Тъй като всичко е въпрос на програмиране имаме няколко възможности:

1. да използваме ЦК ключе с което да задаваме посоката на езика на стрелката- при този вариант ще имаме 3 пина за стрелка (2 за посока и един за серво) или 5 пина ако искаме да имаме и индикация.... при този вариант на един контролер ще съберем 3 стрелки

2. ако изполваме маршрути и с един бутон оказваме маршрут, тогава с един бутон ще управляваме всички стрелки по маршрута. При този вариант може да имаме 8 серво машинки и 10 маршрута, но без обратна индикация. Индикацията можем да я вземем от например крайните изключватели (напомням, че е забранено да се захранват принадлежности от DCC верига). Така можем да покрием едната гърловина на поне 7 коловозна гара.

3. Има и трети вариант в който може да се закачат 6 сервота, 6 управляващи вериги и 6 индикатора за посоката на стрелката.


« Последна редакция: 21 Юли 2017, 15:31:06 от emilchaushev »

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2206
  • Рейтинг: 853
  • H0, еп. I, II, III, IV, София
Re: Arduino за стрелки
« Отговор #7 -: 21 Юли 2017, 17:12:55 »
Цитат на: emilchaushev link=topic=4987.msg108453#msg108453 date=1500639703
...
1. да използваме ЦК ключе с което да задаваме посоката на езика на стрелката- при този вариант ще имаме 3 пина за стрелка (2 за посока и един за серво) или 5 пина ако искаме да имаме и индикация.... при този вариант на един контролер ще съберем 3 стрелки
...

Ако на ЦК ключетата едниният края е на „-“ - GND, ти трябват само по ЕДИН пин за управление на стрелка, и на него ще подаваш “-“ (GND) ако искаш да преместиш стерлката в “минусовото“ и положение, или няма да подаваш нищо (резистор към плюса) ако искаш стралката да отиде в нормалното си “плюсово“ положение (например). И още един пин за сервото.

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #8 -: 25 Юли 2017, 12:47:52 »
Започвам стъпка по стъпка да опитам да обясня как се конфигурира контролера. Споменатото от Митко ще го обяснявам с конкретни примери при разглеждане вариантите на реализиране.


За да конфигурирате Ардуино ви е необходим безплатен софтуер (IDE). Чрез него пишете кода и го уплоудвате на контролера. Наличен е софтуер за windows, Linux, Mac OS X.

https://www.arduino.cc/en/Guide/HomePage

Инсталационната процедура за Windows: https://www.arduino.cc/en/Guide/Windows


Писането на кода е много подобен на С++

Първата стъпка ще е само едно серво свързано към Ардуино, за да тестваме различни комбинации:

Постановка И ЗА ДВАТА ПРИМЕРА:


Пример 1: Свързваме сервото към порт 9, караме сервото да се позиционира на 90 градуса

===================================
Кода:

#include <Servo.h> // compiler directive to get the servo library
 
Servo myservo;  // създаваме обект серво, а с ПРОМЕНЛИВАТА "MYSERVO" ЩЕ ДОСТЪПВАМЕ И КОНТРОЛИРАМЕ ОБЕКТА

void setup() // setup функцията се изпълнява веднъж при стартиране
{
  myservo.attach(9);  // СВЪРЗВАМЕ СЕРВОТО КЪМ ПИН 9
  myservo.write(90);  // ПОЗИЦИОНИРАМЕ СЕРВОТО НА 90 ГРАДУСА
}
 

void loop()       // функцията се изпълнява постоянно и последователно докато не се изключи захранването
{
  // в случая не правим нищо
}
====================================


Пример 2: Свързваме сервото към порт 9, караме сервото да се завърта от 0 до 180 градуса и обратно на стъпки през един градус
====================================
Кода

#include <Servo.h> // compiler directive to get the servo library
 
Servo myservo;  // създаваме обект серво
int pos=0       // променлива за съхранение на позицията на сервото

void setup() //  setup функцията се изпълнява веднъж при стартиране
{
  myservo.attach(9);  //  СВЪРЗВАМЕ СЕРВОТО КЪМ ПИН 9
}
 
void loop() //функцията се изпълнява постоянно и последователно
{
for(pos=0;pos,180;pos+=1) //преминава от 0 до 180 градуса през един градус
   {
   myservo.write(pos);  //казва на сервото да се позиционира на позиция равна на pos
   delay(15)      //чака 15 ms сервото да достигне позицията
   }
for(pos=180;pos>=1;pos-=1)// преминава от 180 до 0 градуса през един градус
   {
   myservo.write(pos);  //казва на сервото да се позиционира на позиция равна на pos
   delay(15)      //чака 15 ms сервото да достигне позицията
   }
}

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #9 -: 25 Юли 2017, 12:59:52 »
Пример 3 със същата постановка: Сервото се върти от 0 до 180 и обратно с пауза от 2 секунди.

В този пример ще сменя умишлено името на обекта

#include <Servo.h> // compiler directive to get the servo library
 
Servo Servo1;  // създаваме обект серво

void setup() //  setup функцията се изпълнява веднъж при стартиране
{
  myservo.attach(8);  //  СВЪРЗВАМЕ СЕРВОТО КЪМ ПИН 8
}
 
void loop() //функцията се изпълнява постоянно и последователно
{
   Servo1.write(180);  //казва на сервото да се позиционира на позиция равна на 180
   delay(2000)      //чака 2000 ms
   Servo1.write(0);  //казва на сервото да се позиционира на позиция равна на 0
   delay(2000)      //чака 2000 ms
}

jopeto

  • Trade Count: (16)
  • Hero Member
  • *****
  • Публикации: 1219
  • Рейтинг: 150
Re: Arduino за стрелки
« Отговор #10 -: 25 Юли 2017, 18:09:54 »
С аруиното може да движиш и стъпкови мотори., може би с тях ще имате по-голям успех от колкото със серво машинка.

stefanoff

  • Trade Count: (0)
  • Full Member
  • ***
  • Публикации: 119
  • Рейтинг: 154
  • Варна, морето, сините вълни........
    • laser-cut cardmodels
Re: Arduino за стрелки
« Отговор #11 -: 25 Юли 2017, 20:40:18 »
Да споделя моя скромен опит с Ардуино. Не претендирам че съм специалист на тема електроника и програмиране но
имам и се базикам и с трите варианта на контролера или  реплики на оригинала с имената "Нано", "Уно" и "Мега".
IMG_20170725_190745 by Dimitar Stefanoff, on Flickr
Разликата между тях са размерите, броя портове и размера на паметта и процесорите. Имам разни датчици, бутони, превключватели, релета, експериментални "дъски" ,"шилдове"и не на последно място серво и стъпкови мотори - всичко окабелено и стандартизирано.
IMG_20170725_191249 by Dimitar Stefanoff, on Flickr
IMG_20170725_191313 by Dimitar Stefanoff, on Flickr
IMG_20170725_191642 by Dimitar Stefanoff, on Flickr
 Та по темата:
Нямам задвижено на макета нищо за в момета, но експериментирам с програмирането на платките и свързването на елементите. Когато всичко подкарам, тогава ще запоя всичко по шилдовете. На малкия макет си бях направил автоматизация. Управлявах автоматично бариерата когато наближи или се отдалечи влака, влака спираше плавно на перона изчакваше и пак плавно потегляше - "ШИМ" на захранването управлявано от рид-ампули между релсите и магнит на локомотива.
Пограмирам на "miniBloq" това графична среда за програмиране на Ардуино, не може да се сравнява с оригиналния софтуер  но за задачите които имам ми стига. Единственото ограничение което имам там е че не мога да програмирам повече от 3 сервомотора на платка, но съм го решил с увеличаване на броя на платките. Управлението на сърцата на стрелките може да стане според мен с обикновено реле, Ардуино си има готови модули, доста от нещата съм ги прибрал на високо и не можах да ги издиря да снимам. Захранвам с най обикновено зарядно за телефон с USB. Забавно е и е доста идейно след като почнеш. Поздрави.

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #12 -: 26 Юли 2017, 13:42:54 »
Пример 4:

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

Кода
=========================
#include <Servo.h>

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

const int servoPin = 2;// декларираме изхода за контрол на сервото

void setup() {
  servo.attach(servoPin); // атачваме сервото за първоначално позициониране
  servo.write(90); // завъртаме го на 90 градуса
  delay(500); //пауза
  servo.detach(); //детачваме сервото да за не шуми
  delay(500); //пауза
}

void loop() {
  servo.attach(servoPin);  //атачваме сервото, като посочваме и пина

  servo.write(60); //завъртаме на 60 градуса
  delay(500); //пауза
  servo.write(120);  //завъртаме на 120 градуса
  delay(500); //пауза
  servo.write(90); // завъртаме на 90 градуса

  servo.detach(); //детачваме
  delay(500); //пауза
}

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #13 -: 27 Юли 2017, 09:48:16 »
От тук нататък ще пристъпим към използване на бутони/ключета за контрол на сервото, като входни портове.

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

Описание на опитната постановка:

Използвам схемата от картинката, при която на порт 2 връзвам единия ключ, на порт 3 другия. На порт 9 се връзва сервото. Портове 2 и 3 са постоянно подвързани през резистори 1кОм към маса. Това се налага за да гарантираме и осигурим стабилен нисък потенциал на порта в спокойно състояние, което със сигурност да се отличава от +5V, (висок потенциал), които ще подаваме и ще бъде критерий за превключването.




===================
КОД 1: Завъртаме сервото на 0 градуса за право и 180 градуса за отклонение

Трябва да отбележа, че използваме завъртане през 1 градус до достигане на противоположната позиция като след всеки градус изчакваме с по 15 ms с цел по- бавно завъртане.

#include<Servo.h>
int pos = 0;  //декларираме променлива, в която да се записва текущата позиция на завъртането
Servo servo1; //декларираме сервото с име servo1
void setup() {
 pinMode(2, INPUT);  //декларираме порт 2 за входен
 pinMode(3, INPUT);  //декларираме порт 3 за входен
 servo.attach(9);       //декларираме порт 9 за сервото
}
void loop() {
 while (digitalRead(2) == HIGH && pos < 180)
{
   pos++;
   servo1.write(pos);
   delay(15);
 }
 while (digitalRead(3) == HIGH && pos > 0)
{
   pos--;
   servo1.write(pos);
   delay(15);
 }
}


====================
КОД2: Ако искаме например завъртането за право да е на 70 градуса, а за отклонение на 110, като началната инициализация на сервото е на 90 градусова позиция, горния код се преработва до следния:

#include<Servo.h>
int pos = 90;  //декларираме променлива, в която да се записва текущата позиция на завъртането
Servo servo1;  //декларираме сервото с име servo1
void setup() {
 pinMode(2, INPUT);  //декларираме порт 2 за входен за отклонение
 pinMode(3, INPUT);  //декларираме порт 3 за входен за право
 servo.attach(9);       //декларираме порт 9 за сервото
 servo1.write(pos);    //поставяме сервото на 90 градуса
}
void loop() {
 while (digitalRead(2) == HIGH && pos < 110)
 {
   pos++;
   servo1.write(pos);
   delay(15);
 }
 while (digitalRead(3) == HIGH && pos > 70)
 {
   pos--;
   servo1.write(pos);
   delay(15);
 }
}
« Последна редакция: 27 Юли 2017, 09:51:01 от emilchaushev »

emilchaushev

  • Trade Count: (0)
  • Hero Member
  • *****
  • Публикации: 1446
  • Рейтинг: 525
  • N scale 1:160- реален моделизъм
Re: Arduino за стрелки
« Отговор #14 -: 27 Юли 2017, 13:11:30 »
Недостатък или предимство на горните два кода е, че трябва бутона да бъде натиснат през целия ход на сервото. Ако го пуснете преди да е стигнало крайна позиция сервото ще спре.

Ето и видео демонстрация: https://youtu.be/Y6l4wRgkX-w