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()>=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();
}
Na których liniach Arduino obsługuje RS-232? Nie spotkałem się jeszcze z mikrokontrolerem, który by miał wbudowany transceiver RS-232. To są zupełnie inne (wyższe) napięcia niż na UART (piny 0 i 1). Nawet podpięcie przez dzielnik rezystorowy nie pomoże, bo sygnały na RS-232 są zanegowane w porównaniu z UART.