Jump to content

Recommended Posts

Posted (edited)

Projekt "Czuwak" gotowy.

Zczytywanie pixeli z ekranu i sterowanie w ten sposób diodami led przez arduino.

 

Dwa wydruki:

20250126_133212.thumb.jpg.ce6dcaa3104eaa6aa336bd6b68f12405.jpg

 

całość:

- szybka to akryl 3mm przyciemniony

- diody to gotowe moduły z kopułkąimage.png.7ffa0cc332f71c8ae623a0e984b978b3.png

 

20250126_133152.thumb.jpg.8783a8258b510ecd1c46a2c69631f0eb.jpg

 

Działanie:

 

 

Edited by Conrad
  • Like 5
Posted

Witam, mam pytanie. W jaki sposób pobieracie informacje w czasie rzeczywistym? przez jaki protokół? jest wspaniale

Posted
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ć.

  • Thanks 1
Posted (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)
image.thumb.png.d1fa21f6cc6dc621644ee94ffbf06679.png
- 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.
image.thumb.png.3e59622ae2390c51b1bfa3761fe2ee42.png

image.png.7e82a5c69ce454a3761b2b14d152bd52.png

- 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
image.thumb.png.8236888d68da9f930028003f3a7e853f.png

Uruchamiamy SimRail i powinno działać

image.png

Edited by Conrad
Posted

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.

  • I agree 2
Posted
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. 

Posted

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... 🙂

20241219205504_1.jpg

  • Like 1
Posted
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... 🙂

20241219205504_1.jpg

Ś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.

Posted

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 😕

Posted
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ę.

 

  • I agree 1
Posted (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 by LycanAnanas
  • Confused 2
  • Haha 1
Posted
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: 
image.thumb.png.fde2bf3732388c296496be16153ba063.png

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.
image.thumb.png.80d2f3354cf4ec301fca9bdef79c2995.png

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.

EU07Controls04-02-25.thumb.jpg.2e194814f92e964020550f6d6245c11a.jpg

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: 
image.thumb.png.f1c8dd7c112a0ca527c90948e91f8c8b.png

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 🙂

  • Like 3
Posted

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)  ;)

  • Like 1
Posted
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. 

  • Like 1
Posted

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 😞

  • Like 1
Posted

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. 

  • Like 1
Posted

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ęć
image.png.7914273b3e3bdeec43dcfe25cc17f857.png

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.
 



Manometry też złapałem, więc kolejna zabawa będzie z nimi. 
  • Like 5
Posted
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ć.

Posted
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 😉

Posted
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ć:

 

  • Like 1
Posted


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. ?

 

  • Like 1
  • SIMRAIL Team
Posted

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.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy