Skocz do zawartości

Arduino w modelarstwie kolejowym


Pomocna odpowiedź

To 

1 minutę temu, prezesedi napisał:

Bardziej nie widzę możliwości wciśnięcia 5 jako kolejny semafor czy też litery E jako kolejna tarcza

To ile chcesz tego mieć, mówiłeś o ośmiu urządzeniach (czyli dwa PCF-y), cztery semafory i cztery tarcze, skąd piąta tarcza? Bo w tej wersji programu jest miejsce na 14 urządzeń... 

A 5 jako kolejny semafor oczywiście da się wcisnąć, ale to już będzie trzeci PCF. Może jednak powiesz ile ich docelowo ma być, bo da się w sumie 16 przy zajęciu obu szyn I2S. Tyle że 256 led raczej nie będziesz łączył do jednego ESP... a nawet przy czterech PCF-ach masz 72 przewody prowadzące od semaforów do panela (nie, nie można dać 5m kabla na linie i2c, te kabelki się liczy w centymetrach).

 

 

(edytowany)
26 minut temu, ethanak napisał:

To ile chcesz tego mieć

Żadnych planów. Tylko zamysł. Bo skoro opcja podpięcia drugiego PCF to nasuwa się myśl o kolejnych urządzeniach. Stąd 5ty semafor czy tarcza pod E (tak wiem. Nie ma E).

Może jednak powiesz ile ich docelowo ma być

To tylko luźne myślenie było. 4 semafory i 4 tarcze są wystarczające. Super robota. Nadal nie pozbierałem szczęki z podłogi.

Edytowano przez prezesedi

Na rybkę: a - semafor; b - tarcza; c- wyświetlacz; d - zapowiedź. Masz 10 semaforów i 10 tarcz (14 jeśli używasz rownież a-d). Chcesz to łaczyć do jednego esp?

I zastanów się nad tym płynnym rozjaśnianiem/wygaszaniem, to już chyba przesada, da się zrobić ale koszty rosną.

Nie wiem o co chodzi z tą rybką choć w wolnej chwili jestem wędkarzem 😁

Jestem otwarty na propozycje

9 godzin temu, prezesedi napisał:

Jestem otwarty na propozycje

Na razie mi wyszło coś takiego:

  • Na wyświetlaczu 128x64 można zmieścić 8 linii, w każdej dwie pozycje, co daje 16 urządzeń.
  • Do wygodnego i intuicyjnego wprowadzania z  klawiatury trzeba ograniczyć się do 9 par tarcza-semafor. Biorąc pod uwagę wielkość wyświetlacza warto ograniczyć się do 8 par. Przy większej ilości operowanie 16-klawiszową klawiaturą może być mocno upierdliwe.
  • 8 par daje 4 pcf-y i mnóstwo kabli, ale o tym pomyślimy później jeśli będzie to konieczne.

Pytanie: czy para tarcza-semafor jest w jakiś sposób zależna (tzn. jeśli semafor wyświetla X to tarcza bezwarunkowo wyświetla Y, i vice versa)?

Jeszcze mam pytanie co do wyświetlaczy na peronach: ile jest różnych wyświetlaczy? Bo powinien być jeden wyświetlacz dla każdego toru.

W ogóle jaki jest układ tych wyświetlaczy? Rozumiem że są to OLED-y 128x32, ew. spięte w parę (dwustronny wyświetlacz). Ile takich (na dziś i maksymalnie)?

 

 

 

20 minut temu, ethanak napisał:

Pytanie: czy para tarcza-semafor jest w jakiś sposób zależna (tzn. jeśli semafor wyświetla X to tarcza bezwarunkowo wyświetla Y, i vice versa)?

Nie ma takich zależności. Rozważając kilka wątków wcześniej sytuację "para semafor-tarcza" chodziło raczej o sterowanie ich z jednego 8622. Nie ma zalązności, że sygnał na urządzeniu A jest zależny od sygnału na urządzeniu B.

23 minuty temu, ethanak napisał:

Jeszcze mam pytanie co do wyświetlaczy na peronach: ile jest różnych wyświetlaczy? Bo powinien być jeden wyświetlacz dla każdego toru.

W ogóle jaki jest układ tych wyświetlaczy? Rozumiem że są to OLED-y 128x32, ew. spięte w parę (dwustronny wyświetlacz). Ile takich (na dziś i maksymalnie)?

Jest jeden wyświetlacz 128x64 działający jako główny (coś jak wyświetlacz przy kasach lub na dworcu budynku). Pokazuje zbiorczo - po dwa tory dla każdego peronu.

43 minuty temu, prezesedi napisał:

Nie ma takich zależności.

Jasne - myślałem że będzie można jakoś uprościć sterowanie ale widzę że się nie da.

43 minuty temu, prezesedi napisał:

coś jak wyświetlacz przy kasach lub na dworcu budynku

Hm... chyba zawsze są dwa wyświetlacze (przyjazdy i odjazdy), oprócz Białegostoku na dwóch końcach dworca żeby człowiek mógł pospacerować. Poza tym jakbyś chciał robić makietę dworca w BB to nie trzeba wyświetlacza - wystarczy na niebiesko podświetlony napis "przeglądarka chromium została nieprawidłowo zamknięta" 🙂

W każdym razie sterowanie byłoby w stylu:

  • wybierz linię
  • wybierz komunikat
  • zatwierdź

I teraz komunikaty:

  • czy standardowy (nazwa miejscowości + godzina), ograniczenie do 29 znaków nazwy
  • czy jakiś inny - ograniczenie do 31 znaków komunikatu

Dobrze kombinuję? Bo zmieniony kod (inna obsługa klawiatury) wyślę jak go tylko uporządkuję, a wyświetlacze to trochę bardziej skomplikowana sprawa i nie spodziewaj się wcześniej niz w przyszłym tygodniu (muszę zainstalować IDE na terminalu).

 

1 godzinę temu, ethanak napisał:

Poza tym jakbyś chciał robić makietę dworca w BB to nie trzeba wyświetlacza - wystarczy na niebiesko podświetlony napis "przeglądarka chromium została nieprawidłowo zamknięta" 🙂

Jakie to prawdziwe 😄

No to kombinujeny dalej.

I tu od razu uwaga: kody służące do komunikacji ze smartfonem pozostawiam na razie bez omawiania - większość to JavaScript (i to nieco prowizoryczny), jakiś Python do przygotowania danych, czyli wykracza to poza tematykę działu. W każdym razie kody pozostawiam bo komuś mogą się przydać (wtedy sobie zajrzy).

Ponieważ jak zwykle okazuje się, że to co program robi to za mało, trzeba przede wszystkim przerobić sposób wprowadzania danych. Na szczęście jest to proste i poza jednym plikiem (getcommand.cpp) wymaga tylko paru kosmetycznych zmian.

Zacznę może od założeń.

Pierwszym wciśniętym klawiszem jest klawisz wyboru ustawień. Na razie obsługujemy jedynie semafory i tarcze, niech więc 'A' oznacza wybór semafora, 'B' wybór tarczy. Inne klawisze będą mogły obsługiwać np. wyświetlacze, komunikaty cy cokolwiek nam się jeszcze wymarzy. Oczywiście pozostaje '*' służąca do wyświetlania stanu semaforów.

Następny klawisz to wybór urządzenia. Założyłem, że może być maksymalnie 20 urządzeń, tak więc klawisze 1..0 odpowiadają konkretnemu urządzeniu w danej kategorii.

Dalej jak poprzednio: wybór ustawienia i zatwierdzenie.

Zacząłem od drobnych zmian w semafor.cpp - praktycznie zmieniła się tylko mapa semaforów, która wygląda teraz tak:

int8_t semaforMap[32]={
    // semafory 0..15
    0, // zawsze zero
    1,2,3,4,     // semafory na pozycjach 1..4
    0,0,0,0,0,0,0,0,0,0,
    0, // zawsze zero

    //tarcze 16..31
    0, // zawsze zero
    5,6,7,8,
    0,0,0,0,0,0,0,0,0,0,
    0 // zawsze zero
};

Jak widać podzieliłem to na dwa bloki zwiększając jednocześnie liczbę urządzeń do 28 (2 x ilość dostępnych klawiszy).

Przy okazji zmieniłem definicję w Makieta.h (bo nie wiem co mi jeszcze odbije, a nie chcę już tam gmerać):

extern int8_t semaforMap[];

W pliku display.cpp dodałem funkcję wyświetlającą wybór:

void displayKbdSel(const char *sel)
{
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(64-6*8,0);
    display.print("Wybierz:");
    display.setCursor(64-strlen(sel)*6,16);
    display.print(sel);
    display.display();
    displayMode = DPM_KBD;
}

i oczywiście do Makieta.h powędrowała deklaracja:

extern void displayKbdSel(const char *sel);

Reszta zmian dotyczy wyłącznie pliku getcommand.cpp

Na początek trzeba było zrobić jakąś sensowną tablicę, przyporządkującą klawisz do wyboru oraz zmienną przechowującą ów wybór. Trzeba również dodać wybór do możliwych stanów klawiatury:

// dodana możliwość
enum {
    KBD_RELAX=0,
    KBD_SEMA, // wybrano semafor
    KBD_PROG, // wybrano ustawienie semafora
    KBD_SELECTSEM, // wybrano semafor lub tarczę
    KBD_MAX
};


static struct keySel {
    uint8_t mode;
    uint8_t param;
    const char *name;
} keySel[16] = {
    {0}, // zawsze zero
    {0},{0}, {0}, {0}, {0}, // klawisze 1..5
    {0},{0}, {0}, {0}, {0}, // klawisze 6..0
    {KBD_SELECTSEM, 0, "Semafor"},          // klawisz A: semafor
    {KBD_SELECTSEM, 16, "Tarcza"},          // klawisz B: tarcza
    {0}, {0},               // klawisze C i D
    {0} // zawsze 0
};

uint8_t kbdSelection;


Nowa wersja (przy okazji nieco uporządkowana) wygląda tak:

uint16_t getCommand()
{
    int g=keypad.getKey();
    
    if (!g) {
        if (kbdStatus && millis() - lastKeyPressed > 5000UL) {
            kbdStatus=KBD_RELAX;
            displayKbdStatus();
            
        }
        return 0;
    }
    lastKeyPressed = millis();
    
    if(!kbdStatus) {
        if (g == KEY_HASH) return 0;
        if (g == KEY_ASTERISK) return CMD_DISPLAYALL;
        if (keySel[g].mode) {
            kbdStatus = keySel[g].mode;
            kbdSelection = g;
            displayKbdStatus();
        }
        return 0;
    }
    if (g == KEY_HASH) {
        kbdStatus = KBD_RELAX;
        displayKbdStatus();
        return 0;
    }

    switch(kbdStatus) {
    
        case KBD_SELECTSEM:
        if (g > 14) break;
        g += keySel[kbdSelection].param;
        if (!semaforMap[g]) break;
        kbdStatus = KBD_SEMA;
        kbdSema = g;
        displayKbdStatus();
        break;

        case KBD_SEMA:
        if (g == KEY_ASTERISK) break;
        if (!semafor[semaforMap[kbdSema]-1].prog(g)) break;
        kbdStatus  = KBD_PROG;
        kbdProg = g;
        displayKbdStatus();
        break;

        case KBD_PROG:
        if (g == KEY_ASTERISK) {
            displayKbdStatus(true);
            kbdStatus = KBD_RELAX;
            return (semaforMap[kbdSema] << 8) | kbdProg;
        }
        g += keySel[kbdSelection].param;
        if (!semafor[semaforMap[kbdSema]-1].prog(g)) return 0;
        kbdProg = g;
        displayKbdStatus();
        break;

        default:
        kbdStatus = KBD_RELAX;
        displayKbdStatus();
    }
    return 0;
}

No i również uporządkowana (choć nie do końca) funkcja wyświetlania stanu klawiatury:

static void displayKbdStatus(bool done=false)
{
    if (done) {
        displaySemaState(kbdSema, kbdProg, true);
        printf("ZAPISANO %s %s\r\n",
            semafor[semaforMap[kbdSema]-1].name(),
            semafor[semaforMap[kbdSema]-1].pgname(kbdProg));
        return;
    }
    switch(kbdStatus) {
        case KBD_RELAX:
        displaySemaState();
        printf("--\r\n");
        break;

        case KBD_SELECTSEM:
        printf("SEL %s\r\n",
            keySel[kbdSelection].name);
        displayKbdSel(keySel[kbdSelection].name);
        break;

        
        case KBD_SEMA:
        printf("SEMA %s\r\n",
            semafor[semaforMap[kbdSema]-1].name());
        displaySemaState(kbdSema);
        break;

        
        case KBD_PROG:
        displaySemaState(kbdSema, kbdProg);
        printf("SEMA %s PROG %s\r\n",
            semafor[semaforMap[kbdSema]-1].name(),
            semafor[semaforMap[kbdSema]-1].pgname(kbdProg));
        break;

        default: // tu nie powinno dojść!
        break;
    }
}

Warto prześledzić zachowanie funkcji getCommand - podobnie skonstruowane funkcje mogą być przydatne przy wprowadzaniu sekwencji z klawiatury!

Jak zwykle załączam kompletny kod: prezesedi8.zip

No i jako że kolega @prezesedi zażyczył sobie dodatkowych wodotrysków - trzeba będzie coś wykombinować. Stay tuned!

Dzień dobry,

dzisiaj siądę do najnowszej wersji kodu i przetestuję.

Niestety żona wygnała mnie z domu na weekend i zabrała telefon póki nie zrobię zaległych prac (mini remont, działka i takie tam) 🤣. Zagroziła nawet strajkiem kuchennym i aneksją lodówki 😱, więc nie miałem wyjścia i musiałem przeznaczyć wolne na "męskie czynności domowo-działkowe". Domyślam się, że tak będzie w całym letnim okresie.

Popołudniu zamieszczę informację nt. funkcjonalności

  • Lubię! 1
43 minuty temu, prezesedi napisał:

Popołudniu zamieszczę informację nt. funkcjonalności

Spokojnie - to na razie próba zrobienia czegoś sensownego na 16-klawiszówce i umożliwienia obsługiwania czegoś więcej niż semafor.

A ja na razie kombinuję jak tu w sensowny sposób pozbyć się nadmiaru kabli... ale to nie temat na dzisiaj.

 

24 minuty temu, ethanak napisał:

Spokojnie - to na razie próba zrobienia czegoś sensownego na 16-klawiszówce i umożliwienia obsługiwania czegoś więcej niż semafor.

A może zamiast małej klawiaturki podpiąć PC AT? Przy okazji sporo gpio się uwalnia.

20 minut temu, _LM_ napisał:

A może zamiast małej klawiaturki podpiąć PC AT? Przy okazji sporo gpio się uwalnia.

Kolega chciał na 16-klawiszówce z ceraty. A można ją podpiąć przez PCF8574 i wtedy w ogóle GPIO nie zajmuje bo leci po I2C (i tak wykorzystany).

Szczerze mówiąc gdybym ja to miał robić, podpiąłbym jakąś fajną klawiaturkę typu mini - coś w tym stylu: trochę roboty z oprogramowaniem tego ale pewnie dałoby się zrobić. Do tego jakiś sensowny wyświetlacz... Tyle że ja ten program tworzę raczej po to żeby pokazać jak to się robi...

2 godziny temu, ethanak napisał:

podpiąłbym jakąś fajną klawiaturkę typu mini - coś w tym stylu

Bardzo ciekawa ta klawiatura - czy została przetestowana, czy tylko wstawiona jako przykład?

Zastanawia mnie możliwość sterowania komputerem będącym w drugim pomieszczeniu - często przesyłam obraz z komputera na TV (filmy)

5 minut temu, prezesedi napisał:

czy została przetestowana, czy tylko wstawiona jako przykład?

To był przykład, ale mam podobną (z donglem na usb, zasilana z akumulatorka). Sprawdza się do sterowania, ale do pisania słabo się nadaje (chociaż jak siedzę w barze to podpinam ją do telefonu, nie lubię macać po milimetrowych kneflach na ekranie, a ta się mieści w kieszeni).

Dowolna klawiatura bezprzewodowa powinna wystarczyć, w Botlandzie masz kilka różnych.

  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...