28 listopada, 2020 Autor admin Wyłączony

Arduino i Multimaus

Przedstawiam sposób podłączenia Arduino do central współpracujących z manipulatorami Roco Mulitmaus.

Co będzie potrzebne? Na początek:

1. Płytka Arduino Uno lub Arduino Nano. Nie wnikając w kwestie techniczne powiem, że płytka Arduino Nano jest mniejsza i dla łatwiejszego się nią posługiwania będzie wymagać dodatkowej płytki (tzw. shield) z wyprowadzeniemi pinów portów procesora. Dlatego prościej jest użyć Arduino Uno, które takie wyprowadzenia ma już „na pokładzie”

2. Moduł konwertera sygnałów TTL na standard RS485. Komunikacja między centralkami pracującymi w standardzie Xpressnet (tu: Roco z21) a ich manipulatorami prowadzona jest właśnie w standardzie przesyłu danych RS485. Natomiast procesor znajdujący się w Arduino Uno do komunikacji wykorzystuje transmisję szeregową z wykorzystaniem wbudowanego interfejsu UART o poziomach sygnałów TTL. Jednym słowem: sygnały Uno nie są kompatybilne z sygnałami Xpressnet a kompatybilność tą zapewni moduł konwertera sygnałów.

3. Kabel łączący Arduino Uno z centralą z21. Kabel 4-żyłowy zakończony wtyczkami typu RJ12 (6p6c).

4. Biblioteka Xpressmaster – jako gotowy program usprawniający i upraszczający pisanie naszego własnego programu obsługi.

5. Nasz program obsługi Arduino Uno. Program napisany i wgrany do procesora za pośrednictwem środowiska Arduino IDE.

Idea działania tego mini manipulatora jest taka:

Program (Arduino Uno) odbiera informacje z dowolnych źródeł zewnętrznych (np. czujników, przycisków, przełączników, itp.) lub dane przesyłane za pośrednictwem UART (np. ciąg rozkazów przesłanych z PC z wykorzystaniem konwertera USB-TTL, komórki) i w reakcji na nie wysyła do centralki komendy już w standardzie Xpressnet, czyli takim, w jakim krążą dane między centralą a manipulatorem.

Na początek niezbędna będzie instalacja środowiska Arduino IDE. W tym celu można pobrać darmową aplikację ze strony: https://www.arduino.cc/en/software i zainstalować ją posiłkując się choćby tym poradnikiem.

Po poprawnym zainstalowaniu IDE i podłączeniu Uno warto spróbować wgrać przykładowy program i sprawdzić czy wszystko działa jak należy.

Podłączenia elektryczne

Testowo Arduino Uno zasilane jest z portu USB komputera. Docelowo można skorzystać z dwóch opcji: zasilanie z zewnętrznengo zasilacza DC 12V lub zasilanie z centrali (również 12V).

Schemat połączenia Arduino Uno przedstawiam poniżej. Tu, do transmisji danych do Uno, wykorzystywany jest sprzętowy interfejs UART na pinach 0 i 1, ale można do tego celu wybrać inne piny i zastosować sterowanie programowe (tzw. SoftSerial, do którego istnieją oddzielne biblioteki). Pin sterujący (4) może być również dowolnie wybranym pinem.

Jeśli nie korzystamy z zasilania centrali, linia 12V na złączu RJ12 pozostaje niewykorzystana. Podłączamy wtedy do płytki tylko 3 przewody wychodzące z centrali.

Ponieważ opis wtyczek i gniazd może siać niepewności, zamieszczam zdjęcie jak to wygląda od strony centrali i zarobionej wtyczki.

Opis pinów wygląda następująco:
1 – nie interesuje nas
2 – +12V
3 – linia A RS458
4 – linia B RS458
5 – masa
6 – nie interesuje nas

Zatem połączenie modułu RS485 do linii Xpressnet będzie wyglądało następująco:

Mamy już zmontowany układ, Arduino spięte z komputerem i dające się programować, pora więc na znalezienie i zainstalowanie biblioteki.

Biblioteka do obsługi Xpressnet znajduje się pod tym adresem. Po ściągnięciu jej i zapisaniu instalujemy ją zgodnie z tym poradnikiem.

Prosty program

Po zainstalowani biblioteki, zaczynamy zabawę z nowym programem obsługującym naszą mysz Arduino.

W najprostszej formie program wygląda tak:

#include <XpressNetMaster.h>
XpressNetMasterClass XpressNet;

Dołączenie biblioteki i definicja klasy.

#include <SoftwareSerial.h>
SoftwareSerial BT(2, 3); // RX | TX
byte dana_in[9];

Dodanie obsługi linii UART – to tylko w moim przykładowym programie do komunikacji z komputerem i odbioru z niego komend, potem kierowanych do centralki.

void setup()
{
   BT.begin(57600); //obsługa RS232
   XpressNet.setup(Loco128, 4); //pin 4
}

Konfiguracja programu. Tu występuje odwołanie do pinu sterującego 4 – zgodnego ze schematem połączeń. Można wykorzystać inny pin Uno, ale pamiętać o zmianie tego w programie.

void loop()
{
    if(BT.available()&gt;=9)  //Odbior danych BT
    {
        BT.readBytes(dana_in,9); //czyta 9 bajtów z BT
        if (dana_in[0]==200) //bajt identyfikujacy rozkaz
        {
       XpressNet.setSpeed(dana_in[1],0,dana_in[2],dana_in[3]);
        }
    }
    XpressNet.update();
}

Odbiór 9 bajtów rozkazu z komputera i reakcja na nie. Dlaczego 9? Bo skopiowałem z innego projektu i nie chciało mi się poprawiać.

Do wysterowania centrali wystarczą bajty takie jak np.: adres lokomotywy, prędkość, grupa funkcji F, funkcja F – czyli 4 bajty.

Lista „rozkazów” przesyłanych przez Arduino do centrali dostępna jest w pliku XpressNetMaster.h. Do sterowania lokomotywą w fazie testów wystarczająca jest funkcja SetSpeed, której parametrami są: adres lokomotywy, kroki manipulatora (domyślnie 128, więc 0 oznacza ustawienie domyślne), prędkość.
Za sterowanie funkcjami odpowiada kilka funkcji podzielonych ze względu na grupy klawiszy funkcyjnych: setFunc0to4, setFunc5to8, setFunc9to12, setFunc13to20. Przykładowo, zapalenie świateł (funkcja F0) będzie wyglądało następująco:

XpressNet.setFunc0to4(3, 16);

gdzie 3 to adres lokomotywy a 16 zakodowany na 8 bitach stan bitu (bit 4) odpowiedzialnego za funkcję F0.

Pełny kod programu:

#include <XpressNetMaster.h>
XpressNetMasterClass XpressNet;

#include <SoftwareSerial.h>
SoftwareSerial BT(2, 3); // RX | TX
byte dana_in[9];

void setup()
{
   BT.begin(57600); //obsługa RS232
   XpressNet.setup(Loco128, 4); //pin 4
}

void loop()
{
    if(BT.available()>=9)  //Odbior danych BT
    {
        BT.readBytes(dana_in,9); //czyta 9 bajtów z BT
        if (dana_in[0]==200) //bajt identyfikujacy rozkaz
        {
       XpressNet.setSpeed(dana_in[1],0,dana_in[2],dana_in[3]);
        }
    }
    XpressNet.update();
}