Conrad Posted January 26 Posted January 26 (edited) Projekt "Czuwak" gotowy. Zczytywanie pixeli z ekranu i sterowanie w ten sposób diodami led przez arduino. Dwa wydruki: całość: - szybka to akryl 3mm przyciemniony - diody to gotowe moduły z kopułką Działanie: 20250126_132514.mp4 Edited January 26 by Conrad 5
efla83 Posted February 2 Posted February 2 Witam, mam pytanie. W jaki sposób pobieracie informacje w czasie rzeczywistym? przez jaki protokół? jest wspaniale
Conrad Posted February 2 Posted February 2 4 godziny temu, efla83 napisał(a): Witam, mam pytanie. W jaki sposób pobieracie informacje w czasie rzeczywistym? przez jaki protokół? jest wspaniale Jeżeli pytasz o post powyżej to za pomocą Pythona, jutro wkleję kod to inni bedą mogli skorzystać. 1
Conrad Posted February 3 Posted February 3 (edited) Jak zasymulować czuwak za pomocą pythona oraz Arduino: Idea jest taka, że za pomocą pythona sprawdzamy kolor pixela i jeżeli jest prawie biały (RGB), to zapalamy za pomocą arduino dany LED i tyle 🙂 1. W Simrail Musimy ustawić sobie widok na stałe, wyłączyć symulowanie przechylania, mnożnik siły odśrodkowej =0, tak żeby ekran pulpitu był statyczny cały czas. 2. Mieć zainstalowanego Pythona 3. Stworzyć sobie plik ze skryptem "czuwak_arduino.py" sprawdzić czy macie i zainstalować brakujące biblioteki jak: pyautgui, serial, time, threading komendy do instalacji: python pip install pyautogui python -m pip install pyserial kod dla pliku "czuwak_arduino.py" - ustawić prawidłowy port COM dla Arduino (tutaj np. mam COM6) - przypisać pozycję pixela (najlepiej tego najjaśniejszego jaki występuje podczas zaplania lampki) dla SHP i Czuwaka dla swojej rozdzielczości i ustawień widoku kokpitu (przycisk 1). Warto sobie zrobić print screena i na spokojnie sprawdzić idealne pozycje dla tych pixeli. - tolerancja koloru pozwala mieć większą czułość reakcji, można to zwiększać wg uznania import pyautogui import serial import time import threading # Ustaw port COM Arduino (sprawdź w Menedżerze urządzeń) arduino_port = 'COM16' # Zmień na odpowiedni port COM baud_rate = 9600 arduino = serial.Serial(arduino_port, baud_rate) # Pozycje pikseli na ekranie pixel_1_x, pixel_1_y = 1141, 1305 # Pozycja 1. piksela pixel_2_x, pixel_2_y = 1238, 1294 # Pozycja 2. piksela # Oczekiwany kolor w RGB expected_color = (180, 180, 180) # Ustaw tolerancję dla każdej składowej koloru tolerance = 30 # Funkcja sprawdzająca, czy kolor jest bliski oczekiwanemu def is_color_close(color, target_color, tolerance): return ( abs(color[0] - target_color[0]) <= tolerance and abs(color[1] - target_color[1]) <= tolerance and abs(color[2] - target_color[2]) <= tolerance ) # Funkcja do sprawdzania kolorów i komunikacji z Arduino def check_colors_and_send(): try: while True: # Pobierz kolor pikseli color_1 = pyautogui.pixel(pixel_1_x, pixel_1_y) color_2 = pyautogui.pixel(pixel_2_x, pixel_2_y) # Zapalanie lampek LED w zależności od warunków if is_color_close(color_1, expected_color, tolerance): arduino.write(b'1') # Zapal LED-y na pinach 2 i 3 else: arduino.write(b'0') # Zgaś LED-y na pinach 2 i 3 if is_color_close(color_2, expected_color, tolerance): arduino.write(b'2') # Zapal LED-y na pinach 5 i 6 else: arduino.write(b'3') # Zgaś LED-y na pinach 5 i 6 time.sleep(0.05) # Zmniejszenie opóźnienia do 0,05 sekundy except KeyboardInterrupt: print("Zatrzymano program.") finally: arduino.close() # Uruchomienie funkcji w osobnym wątku color_thread = threading.Thread(target=check_colors_and_send) color_thread.start() kod dla arduino ledy wpięte w Piny 2,3,5,6 można to zmienić wg uznania, dana para zapala 5 i 6 Czuwak, a 2 i 3 SHP void setup() { pinMode(2, OUTPUT); // LED na pinie 2 pinMode(3, OUTPUT); // LED na pinie 3 pinMode(5, OUTPUT); // LED na pinie 5 pinMode(6, OUTPUT); // LED na pinie 6 Serial.begin(9600); // Komunikacja z komputerem } void loop() { if (Serial.available() > 0) { char command = Serial.read(); // Odczytaj polecenie z komputera if (command == '1') { digitalWrite(2, HIGH); // Zapal LED na pinie 2 digitalWrite(3, HIGH); // Zapal LED na pinie 3 } else if (command == '0') { digitalWrite(2, LOW); // Zgaś LED na pinie 2 digitalWrite(3, LOW); // Zgaś LED na pinie 3 } else if (command == '2') { digitalWrite(5, HIGH); // Zapal LED na pinie 5 digitalWrite(6, HIGH); // Zapal LED na pinie 6 } else if (command == '3') { digitalWrite(5, LOW); // Zgaś LED na pinie 5 digitalWrite(6, LOW); // Zgaś LED na pinie 6 } } } Jak już mamy wszystko odpalamy wiersz poleceń cmd i wpisujemy np. D:\python3 czuwak_arduino.py Uruchamiamy SimRail i powinno działać Edited February 4 by Conrad
sssss Posted February 3 Posted February 3 Sprytne rozwiązanie z tym odczytem z monitora, ale strasznie niewygodne i takie bardzo na około... Mogliby twórcy w końcu udostępnić jakiś interfejs API, ale nie ma o czym mówić skoro nawet nie można sobie skonfigurować żadnego kontrolera pod standardowe funkcje. 2
Conrad Posted February 3 Posted February 3 35 minut temu, sssss napisał(a): Sprytne rozwiązanie z tym odczytem z monitora, ale strasznie niewygodne i takie bardzo na około... Mogliby twórcy w końcu udostępnić jakiś interfejs API, ale nie ma o czym mówić skoro nawet nie można sobie skonfigurować żadnego kontrolera pod standardowe funkcje. Tak, to tylko takie zabawy zanim coś ludzkiego od devów dostaniemy. Głównie mobilizuje mnie to do pracy nad obudowami i pulpitem, tak żeby później przejść szybko i gładko do finalnego rozwiązania.
JarkPomsky Posted February 4 Posted February 4 No właśnie trochę naokoło, ale skoro motywuje, to czemu nie 🙂 Ja z kolei myślę nad pulpitem uniwersalnym, coś w stylu Dragona/Traxa z dwoma ekranami LINK i malinką. Nie repliką którejś, ale inspirowaną tymi lokomotywami. Nawet czat chciałbym wywalić na jeden z ekranów. A na ekranie komputera mieć czysty obraz jak za szybą: Jestem na etapie marzenia... 🙂 1
Conrad Posted February 4 Posted February 4 Teraz, JarkPomsky napisał(a): No właśnie trochę naokoło, ale skoro motywuje, to czemu nie 🙂 Ja z kolei myślę nad pulpitem uniwersalnym, coś w stylu Dragona/Traxa z dwoma ekranami LINK i malinką. Nie repliką którejś, ale inspirowaną tymi lokomotywami. Nawet czat chciałbym wywalić na jeden z ekranów. A na ekranie komputera mieć czysty obraz jak za szybą: Jestem na etapie marzenia... 🙂 Świetnie! Też o tym myślałem, ale ciężko się rozdwoić, na razie zabawa oldtimerami EN51, EP07 i ET22 bo są podobnie zbudowane. A taki Trax/Dragon, czy też Elfik z własnymi dashbordami które wyświetlasz na własnych ekranach i masz czysty widok z okna to właśnie taki cel, dlatego idź przodem i toruj nam droge na to rozwiązanie. Ja nie wiem jak jest zbudowany ten nastawnik jazdy, bo to jakieś bardziej skomplikowane rozwiązanie mechaniczne, trzeba będzie poszukać jakiś rysunków i spróbować to odtworzyć w druku 3d.
JarkPomsky Posted February 4 Posted February 4 Mam jeszcze jeden pomysł, jak wyciągnąć dane z gry pomimo zmieniających się offsetów po aktualizacji gry. Na razie wyciągnę jedną wartość(o ile się uda) i będę czekał do kolejnej aktualizacji czy zostanie czy nie 🙂 W sumie to nie dziwię się twórcom, że olewają temat API, skoro to pewnie dla mniej niż 1% graczy. API pewnie będzie na samym końcu 😕
Conrad Posted February 4 Posted February 4 16 minut temu, JarkPomsky napisał(a): Mam jeszcze jeden pomysł, jak wyciągnąć dane z gry pomimo zmieniających się offsetów po aktualizacji gry. Na razie wyciągnę jedną wartość(o ile się uda) i będę czekał do kolejnej aktualizacji czy zostanie czy nie 🙂 W sumie to nie dziwię się twórcom, że olewają temat API, skoro to pewnie dla mniej niż 1% graczy. API pewnie będzie na samym końcu 😕 Ja myślę, że nie doceniają wartości marketingowej naszej zabawy, która dobrze się pozycjonują w wyszukiwarkach. My otwieramy marzenia na większe doznania z symulacji w warunkach domowych. Zobacz jak się rozwija simracing, czy też akcesoria do flight simulatora, dcs, ets2 czy farming simulator (są jeszcze jakieś symulatory kosmiczne itd.). Jeżeli pojawią się np. proste dashbordy pod SimRail to już będą mieli przewagę na rynku symulatorów kolejowych i przyciągną nowych użytkowników ze świata. Tak to widzę. 1
LycanAnanas Posted February 4 Posted February 4 (edited) 17 hours ago, sssss said: Sprytne rozwiązanie z tym odczytem z monitora, ale strasznie niewygodne i takie bardzo na około... Mogliby twórcy w końcu udostępnić jakiś interfejs API, ale nie ma o czym mówić skoro nawet nie można sobie skonfigurować żadnego kontrolera pod standardowe funkcje. Twórcy nie dadzą żadnego API bo zacznie się użytek Simraila w celach komercyjnych w symulatorach robionych poprzez mikoli 🙂 Nawet jak by licencja Simraila zezwalała taki użytek ale, ze np. 60% dochodu trafia do Simraila to nikt by tego nie robił. Btw. takie api istnieje w Simkolu czyli branchu simraila pod komercyjne rzeczy. Edited February 4 by LycanAnanas 2 1
Gazz292 Posted February 4 Posted February 4 4 hours ago, JarkPomsky said: I, on the other hand, am thinking about a universal desktop, something like Dragon/Trax with two LINK screens and a Raspberry Pi. Not a replica of either, but inspired by these locomotives. Apologies in advance for writing in english again... A universal controller is a very good idea if you like to drive different trains, About 5 years ago i was making this: A small desktop controller for 'that other train game' tsw, to drive the typical modern european style trains (with the German style of controls), all 3D printed and laser cut parts, the brake levers are linked together, but pushing down on the dynamic brake levers knob unlinked them... just like the real thing, The levers had quick change 'notch plates' so i could change the detents the levers moved between when moved to suit different trains, All the switches and buttons are 3D printed assemblies too. Unfortunately i gave up on it when tsw devs told me they had no interest in implementing joystick input, and would never consider any kind of I/O system... that's why i got interested in SimRail as they promised that from the start. Since getting into SimRail, i have been making a set of ~half size controllers to go around my laptop (i have disabilities and am stuck in bed a lot, so use my laptop on an overbed table the most) but i've posted about those many times in the english part of this site. When i finish this project, i plan on starting to 3D print the controls to make a full size EU07 style driving desk. And in storage i have the real driving desk from a German BR111 Wittenberger Steuerwagen: But after getting into SimRail and falling in love with the EU07 style locomotives, i'll likely never complete the BR111 project (anyone want to swap for the driving desk parts from an EU07 style train 🙂 ) 3
JarkPomsky Posted February 4 Posted February 4 Właśnie coś takiego chodzi mi po głowie. Tylko z ekranami i pełnym hudem na nich. Softwarowo jest to zrobienia już teraz. Program który wyłapuje wciśnięcia joysticka i zamienia je na przyciski klawiatury też zdaje się można napisać. We wcześniejszych postach pokazałem jak wyciągać dane z gry bez API żeby ożywić wskaźniki. (Pracuje nad nowym sposobem) Wszystko można zrobić, tylko trzeba mieć czas (i pieniądze hehe) ;) 1
Gazz292 Posted February 4 Posted February 4 1 hour ago, JarkPomsky said: It seems that a program that detects joystick presses and converts them to keyboard buttons can also be written. I use JoyToKey to 'translate' the joystick button presses into keyboard key strokes for the sim, but i only use this for the buttons which are simple on / off signals, i never got it working well with joystick axis movements. I use 'FreeJoy' on cheap 'STM32f BluePill microcontrollers in my switch / button boxes, as they are easy to set up with a GUI, compared to endlessly rewriting text sketches in arduino's) However, for my power wheel and brake levers is use arduinos, they read the position of the potentiometer that moves as the lever or wheel is rotated, then it translates that to keyboard outputs. For my EN57 controllers and EU07 power wheel this is very easy, as every position the levers move to is a detent / notch, so the arduino just sends a keystroke when the potentiometer moves to a certain position... as it's always the same due to the detents, The keystroke sent changes depending if the control is moving left or right, to send the keys for increase or decrease power, or brakes etc. This is one of the arduino sketches i use to read the potentiometers position and send keystrokes as the lever is moved left or right: EN57_Brake_Lever.zip For my EU07 brake levers, they have smooth areas of movement with no detents, (the locomotive / independent brake lever is full smooth) so there the arduino sketch simply sends a keystroke every XX degrees the lever is moved, but this only works with a fixed FPS... i cap my FPS in the sim to 60, but it will occasionally drop below that in places, then the lever in the sim moves further than it should. 1
Gazz292 Posted February 4 Posted February 4 The problem is that we don't yet have joystick input available in SimRail, so everything has to pretend to be a keyboard, hopefully the Input / Output system will allow us to move smooth axis levers directly with joystick style inputs. For now there is that setting in SimRail to switch to a detent style brake lever, via the 'smooth brakes Controls' in the 'simulation' menu, that changes the smooth portion of the brake lever in the EU07, EP08, ET22, ED250 etc into set steps it moves to each time a key is sent. But i wanted to have the smooth part of the lever as in real life on my EU07 style train and locomotive brake levers, so i use the method of sending a keypress roughly every 2 or 3 degrees my lever moves. The arduino sketch to do that much simpler than the other one: EU07_Train_Brake_Lever_simple.zip But the FPS thing means it's not as precise, as the distance the lever in the sim moves per keypress is FPS dependent 😞 1
Gazz292 Posted February 4 Posted February 4 And an even simpler sketch i use for my 'locomotive / independent brake lever, which has no detents between full on and off) #include <Keyboard.h> const int potPin = A0; int val; void setup() { Keyboard.begin(); } void loop() { static int oldPotState = analogRead(potPin); val = analogRead(potPin); if (val > (oldPotState + 16) || val < (oldPotState - 16)) { if (val > (oldPotState + 16)) { // Moving anti clockwise / Apply Keyboard.write(230); // 'keypad 6' } else if (val < (oldPotState - 16)) { // Moving clockwise / Release Keyboard.write(233); // 'Keypad 9' } if ((val >= 0) && (val <= 3)) { Keyboard.press(233); // 'Keypad 9' extra steps to ensure lever moves all the way off delay(1000); Keyboard.release(233); } oldPotState = val; } } Simply sends a keystroke every time the pot moves 16 units from it's last position... different keystroke sent depending on the direction the lever is moving in. 1
Conrad Posted February 7 Posted February 7 Podczas oglądania F8 zauważyłem, że SimRail ma aż trzy atrybuty dla prędkości: prędkość "rzeczywista", prędkość gry (dolny prawy róg) oraz prędkość tachometru (to nas interesuje) Udało się złapać pamięć Parametr tej prędkości drga jak prawdziwy Hasler, falownik, więc jest to symulowane z poziomu gry i po wrzuceniu na silnik krokowy mamy podobne wrażenie. Pierwszy etap za mną, krokomierz podłączony, sprawdzony (tutaj okazało się, że Chinczyki pozamieniali Piny, przypadłość tych wersji i trzeba było odnaleźć prawidłową wersję), napisane przekazywanie danych do arduino, a dalej to już będzie zabawa z optymalizacją i odświeżaniem danych i symulowaniem poruszania się prędkości igły. signal-2025-02-07-115335.mp4 Manometry też złapałem, więc kolejna zabawa będzie z nimi. 5
JarkPomsky Posted February 7 Posted February 7 Tak samo jest z innymi rzeczami. Np. Shp i Ca ma stany lampek, ale można też złapać ten czerwony kwadracik z GUI.
Conrad Posted February 7 Posted February 7 40 minut temu, JarkPomsky napisał(a): Tak samo jest z innymi rzeczami. Np. Shp i Ca ma stany lampek, ale można też złapać ten czerwony kwadracik z GUI. SHP da sie znaleźć bo ma stan 1, ale Ca w trybie mrugania ma stan 0/1/0/1/0/1/... ciężko to mi zlokalizować, ale muszę pokombinować.
JarkPomsky Posted February 7 Posted February 7 Jak wyskakuje 1 to pauzuj grę przy włączonym f8 i wtedy skanuj. 1
Conrad Posted February 7 Posted February 7 6 minut temu, JarkPomsky napisał(a): Jak wyskakuje 1 to pauzuj grę przy włączonym f8 i wtedy skanuj. Hehe racja! dobry pomysł, a ja się bawie w łapanie danych podczas multi 😉
JarkPomsky Posted February 7 Posted February 7 1 minutę temu, Conrad napisał(a): Hehe racja! dobry pomysł, a ja się bawie w łapanie danych podczas multi 😉 Koniecznie pobierz ten scenariusz. Można jeździć w kółko i wszystko testować: 1
Conrad Posted February 9 Posted February 9 signal-2025-02-09-201815_.mp4 Pamięci zhackowane, można jeździć z TrackIR, ruszać kokpitem, pixele nie potrzebne. Okazuje się, że jednak czuwak zgłasza się jako 1 albo 0, bez mrugania w pamięci, ale znalezienie tego to masakra jakaś i nie do wszystkich lokomotyw działa. Pozostaje czekać na gotowe rozwiązanie ze strony devów, zabieram się za obudowę 3d print Haslera. Ktoś wie jak rozwiązane jest oświetlenie, ten zielonkawy kolor itp. ? 1
SIMRAIL Team Królik Uszasty Posted February 9 SIMRAIL Team Posted February 9 Pod tarczą (ale że w dół, nie w głąb) jest żarówka. Tarczka w swojej dolnej części jest odchylona do tyłu (wgłąb), żeby złapać to światło.
Recommended Posts