Skocz do zawartości
Wojt

System sterowania rozjazdami na makiecie kolejowej

Pomocna odpowiedź

Witam,
Dopiero zaczynam moją przygodę z Arduino i mam zamiar zrealizować projekt systemu sterowania rozjazdami na mojej makiecie kolejowej. Każdy rozjazd ma być przesuwany za pomocą zamontowanego pod makietą serwomechanizmu SG90 (razem 10 serwomechanizmów). Każde serwo reagować ma na zmianę pozycji swojego przełącznika dwupozycyjnego - w momencie przełączenia, zmienić pozycję o około 30 stopni i w niej pozostać, przy zmianie pozycji przełącznika do pierwotnej - serwo również ma wrócić do pozycji pierwotnej. Dodatkowo, przy każdym przełączniku mają być dwie diody, zawsze świecić ma się jedna z nich w zależności od pozycji, w jakiej znajduje się dany serwomechanizm. Posiadam Arduino Uno, oraz Adafruit servo shield pozwalający na podłączenie do 16 serw. Stąd moje pytanie do bardziej doświadczonych kolegów: czy przy użyciu Adafruit mogę coś takiego zrobić? Czy w ogóle przełączniki dwupozycyjne z dźwignią są do zastosowania w tego typu projekcie? Uwagi dotyczące połączeń i zaprogramowania mile widziane, za każdą pomoc z góry dziękuję 😀

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Wojt witam na forum 🙂

1 godzinę temu, Wojt napisał:

Posiadam Arduino Uno, oraz Adafruit servo shield pozwalający na podłączenie do 16 serw. Stąd moje pytanie do bardziej doświadczonych kolegów: czy przy użyciu Adafruit mogę coś takiego zrobić?

Tak, shield do sterowania serwami będzie pomocny.

1 godzinę temu, Wojt napisał:

Czy w ogóle przełączniki dwupozycyjne z dźwignią są do zastosowania w tego typu projekcie?

Pewnie 🙂 Wystarczy, że np. jedna pozycja przełącznika będzie oznaczała stan wysoki, a druga stan niski. Nie będzie z tym problemu (przy 3 pozycjach byłoby ciężej). Do podłączenia tylu przełączników wygodnie będzie wykorzystać ekspander portów na I2C.

Udostępnij ten post


Link to post
Share on other sites

Przy 10 przełącznikach nie będzie potrzebny żaden ekspander. Przełączniki podpinasz do wejść 2 do 11, ekspander do a4 i a5 - i zostają wolne wejścia 12 i 13 oraz analogowe a0 do a3.

Oczywiście ledy sterowane bezpośrednio z przełączników, inaczej ekspander może być potrzebny^Wprzydatny.

Możesz też zastosować trick - wykorzystać pozostałe sześć wyjść sterownika serw do sterowania ledami, cztery ledy podpinasz do a0...a3, zostają jeszcze piny 12 i 13 oraz rx/tx do wykorzystania.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Sam kiedyś interesowałem się takimi makietami. Na YT są 2 świetne kanały: Luke Towan, a drugi to Woodland Scenics. Ten pierwszy to kanał twórcy, który naprawdę może zaskoczyć pomysłowością. Co prawda wykorzystuje on gotowe moduły, ale możesz podpatrzeć coś dla siebie. Ten drugi to bardziej materiał reklamowy pewnej marki, ale są tam przypadki użycia, które mogą też być inspiracją do zrobienia czegoś podobnego.

W zasadzie sterowniki do makiet niewiele różnią się od układów PLC, tylko że sterują mniejszymi siłownikami.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
6 godzin temu, ethanak napisał:

Oczywiście ledy sterowane bezpośrednio z przełączników, inaczej ekspander może być potrzebny^Wprzydatny.

Słusznie, trochę przesadziłem z interpretacją założeń.

8 godzin temu, Wojt napisał:

Dodatkowo, przy każdym przełączniku mają być dwie diody, zawsze świecić ma się jedna z nich w zależności od pozycji, w jakiej znajduje się dany serwomechanizm.

Sugerują się powyższym fragmentem uznałem, że diody mają świecić tylko, gdy serwo ustawi się już w odpowiedniej pozycji*, a podczas samego przełączania diody mają być wyłączone. Jeśli ma to działać prościej to oczywiście ekspandery będą zbędne 🙂

*bazują np. na sztywno założonym czasie, który jest potrzebny do zmiany położenia.

Udostępnij ten post


Link to post
Share on other sites

A ja zapomniałem o jeszcze jednej możliwości - charlieplexingu (pinów wystarczy). Tylko czy jest sens? Przy proponowanym przez @Treker bazowaniu na czasie potrzebnym do przekręcenia serwa i założonym kącie 30° będzie to 50 msec, czyli czas praktycznie niezauważalny. Do realnego sprawdzania pozycji zwrotnicy i tak pinów nie wystarczy... ale to przecież makieta!

Pozostałbym przy bezpośrednim podłączeniu led do przełączników. 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
23 godziny temu, ethanak napisał:

Pozostałbym przy bezpośrednim podłączeniu led do przełączników. 

Tak też zrobię! Dziękuję wszystkim kolegom za cenne rady, spróbuję na razie zrobić sprawny układ dla 1 kompletu (serwo, przełącznik, dwie diody). Jeśli wyjdzie dla jednego to dla 10 też 😄 

A jak powinien wyglądać kod dla takiego układu z uwzględnieniem biblioteki Adafruit? 

Edytowano przez Wojt

Udostępnij ten post


Link to post
Share on other sites

A z czym masz problem? W sumie robi się to prawie tak samo jak dla zwykłej biblioteki servo. Spróbuj napisać kod dla zwykłego serwa podłączonego bezpośrednio do Arduino, jak wyjdzie to spróbuj to przerobić na Adafruita, jak wyjdzie to zrób kod dla 10 serw... a jak nie wyjdzie to się zgłoś, coś podumamy 🙂

 

Udostępnij ten post


Link to post
Share on other sites

Coś tam się udało wykombinować 😁 Problem jedynie z diodami... Przy każdym przełączniku, jedna działa dobrze, a druga ledwo się "żarzy", kiedy powinna świecić, nawet gdy nie ma rezystora i nie bardzo wiem co z tym zrobić, w ostateczności zrezygnuję z diód i zostawię same przełączniki 🤐

#include <Servo.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

Servo servo;
int swich = 2;
int high = 600;
int low = 150;

void setup() {
  
pinMode(swich, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);

  pwm.begin();
  pwm.setPWMFreq(1000);
  Wire.setClock(400000);
  
}

void loop() {
 
 int state2;
 int state3;
 int state4;
 int state5;
 int state6;
 int state7;
 int state8;
 int state9;
 int state10;
 int state11;
 
 state2 = digitalRead(2);
  state3 = digitalRead(3);
   state4 = digitalRead(4);
    state5 = digitalRead(5);
     state6 = digitalRead(6);
      state7 = digitalRead(7);
       state8 = digitalRead(8);
        state9 = digitalRead(9);
         state10 = digitalRead(10);
          state11 = digitalRead(11);
 if (state2 == HIGH){
 pwm.setPWM(0, low, 0);
 }
 if (state2 == LOW){
  pwm.setPWM(0, 0, high);
 }
if (state3 == HIGH){
 pwm.setPWM(1, low, 0);
 }
if (state3 == LOW){
  pwm.setPWM(1, 0, high);
 }
  if (state4 == HIGH){
 pwm.setPWM(2, low, 0);
 }
 if (state4 == LOW){
  pwm.setPWM(2, 0, high);
 }
  if (state5 == HIGH){
 pwm.setPWM(3, low, 0);
 }
if (state5 == LOW){
  pwm.setPWM(3, 0, high);
 }
  if (state6 == HIGH){
 pwm.setPWM(4, low, 0);
 }
 if (state6 == LOW){
  pwm.setPWM(4, 0, high);
 }
 if (state7 == HIGH){
 pwm.setPWM(5, low, 0);
 }
 if (state7 == LOW){
  pwm.setPWM(5, 0, high);
 }
 if (state8 == HIGH){
 pwm.setPWM(6, low, 0);
 }
 if (state8 == LOW){
  pwm.setPWM(6, 0, high);
 }
 if (state9 == HIGH){
 pwm.setPWM(7, low, 0);
 }
 if (state9 == LOW){
  pwm.setPWM(7, 0, high);
 }
 if (state10 == HIGH){
 pwm.setPWM(8, low, 0);
 }
 if (state10 == LOW){
  pwm.setPWM(8, 0, high);
 }
 if (state11 == HIGH){
 pwm.setPWM(9, low, 0);
 }
 if (state11 == LOW){
  pwm.setPWM(9, 0, high);
 }
 delay(50);
}

 

Udostępnij ten post


Link to post
Share on other sites

Pokaż jak podłączyłeś diody bo przy prawidłowym podłączeniu muszą się ładnie świecić.

Udostępnij ten post


Link to post
Share on other sites

Tak to wygląda. Różnica jest duża i nie jest to na pewno wina pojedynczej diody, bo przy podłączeniu innej albo zamianie miejscami jest to samo.

dioda1.jpg

dioda2.jpg

Udostępnij ten post


Link to post
Share on other sites

Wiesz co... szczerze mówiąc co ja nieco przyślepawy jestem (wiesz, wiek i tak dalej) i za cholerę z Twojch pięknych zdjęć nie mogę wywnioskować co tam sknociłeś. Obiło Ci się może o uszy tajemnicze słowo "schemat"?

Na przykład taki:

kolejdy.thumb.png.c94901db3a2c84934f8744ecd2905ebb.png

Podłącz przełączniki w ten sposób, zamień INPUT_:PULLUP na INPUT w swoim programie i powinno działać.

A z czystej ciekawości pokaż schemat swoich połączeń.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...