Jump to content

Conrad

Member
  • Posts

    161
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by Conrad

  1. Co do GUI to pogrzebcie po katalogach to tam znajdziecie grafiki pod to z SimRaila,
  2. Pozostaje przetestować i to w dniu kiedy pojawił się brakujący wagon z DLC 🙂 Są tylko znaki ...
  3. Ja na razie nie sprawdzę, na urlopie jestem.
  4. I jak tam zadziałało przesunięcie?
  5. coś takiego znalazłem https://darpol.bydgoszcz.pl/sklep/tabor-szynowy/hasler/zarowka-oswietlenia-tarczy-szybkosciomierza-51534167/ Chyba zamontowana jest pod licznikiem, ale zastanawia mnie ta poświata wokół, co to za element, to on wysyła to zielonkawe światło.
  6. Skąd ta barwa zielona, zielona żarówka?
  7. 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. ?
  8. Hehe racja! dobry pomysł, a ja się bawie w łapanie danych podczas multi 😉
  9. 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ć.
  10. 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.
  11. 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ę.
  12. Ś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.
  13. 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.
  14. 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ć
  15. Jeżeli pytasz o post powyżej to za pomocą Pythona, jutro wkleję kod to inni bedą mogli skorzystać.
  16. Jestem ciekaw czy ktoś już odpalał Simrail na Intelu Arc B580? I jaka wydajność?
  17. I would like to present a working element of the czuwak/shp lamp for EP/EU07. The project runs on python and reads the pixel value and sends it to arduino to control the LED. 3d print Case with acrylic 3mm and led module with dome. How it works 20250126_132514.mp4
  18. 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
  19. Już wcześniej napisałeś, że jesteś krótkofalarzem. Tylko my tutaj rozmyślamy jak można to łatwo wprowadzić do symulatora, gry SimRail, a nie tworzyć symulacji rozchodzenia się fal radiowych chyba że lubisz czekać ponad rok na nowe ficzery 🙂
  20. Na radiu jest przycisk szumu, jakby się nakładał na dźwięk radia (kiedy głośnik pracuje) mielibyśmy namiastkę tego co napisałeś.
  21. Dzisiaj pobawilem się tą pamiecią, faktycznie da sie znalezc wartosci, np SHP, czy moment zalaczenia dzwieku dla czuwaka itp, ale po ponownym uruchomieniu SR gubi te dane 😕 Na razie testuje rozwiazanie na zczytywaniu danych rgb danego pixela. W weekand jak uruchomie drukarke pokaze dzialajacy element. Na razie mały test: 20250121_221626.mp4
  22. Też się tego obawiałem, że jak się tak stanie to nie ma sensu tego tak prowadzić. Pokazałeś i udostępniłeś alternatywę, więc ukłony, może pogrzebię w tym temacie, ale chłopaki w SimRail niech obiecają rzadkie aktualizacje 😉 albo udostępnią I/O dla nas, prosimy @uetam 🙂
  23. Thx Co do nanometrów to wartość rzeczywista podzielona przez 100 na skali manometrów, czyli 4,19 to wartość 0,419 Nie mam silników krokowych na razie, więc tutaj niepoeksperyemntuje, ale na razie działa to co pokazałeś powyżej.
  24. @JarkPomsky właśnie udało mi się przekazać dane z JSON do arduino 🙂 Na razie zrobiłem test zapalania się lampki LED kiedy wartość przekroczy >100 z tego co opublikowałeś Kod dla Arduino Leonardo (8bit) #include <ArduinoJson.h> // Pin dla diody LED const int ledPin = 10; // Zmienna do przechowywania ostatniego czasu unsigned long previousMillis = 0; const long interval = 1000; // Czas oczekiwania w ms void setup() { Serial.begin(9600); // Inicjalizacja portu szeregowego pinMode(ledPin, OUTPUT); // Ustawienie pinu diody LED jako wyjścia digitalWrite(ledPin, LOW); // Wyłączenie diody na start Serial.println("Uruchomiono Arduino."); } void loop() { // Sprawdzanie, czy dostępne są dane na porcie szeregowym if (Serial.available() > 0) { String jsonData = Serial.readString(); // Odczyt danych JSON Serial.print("Odebrane dane: "); Serial.println(jsonData); // Przetwarzanie JSON StaticJsonDocument<1024> doc; DeserializationError error = deserializeJson(doc, jsonData); if (error) { Serial.print("Błąd przetwarzania JSON: "); Serial.println(error.c_str()); return; } // Odczytanie wartości value_1 if (doc.containsKey("value_1")) { float value_1 = doc["value_1"]; Serial.print("Odczytana wartość: "); Serial.println(value_1); // Sterowanie diodą LED w zależności od wartości if (value_1 > 100) { digitalWrite(ledPin, HIGH); // Włącz diodę Serial.println("Dioda WŁĄCZONA"); } else { digitalWrite(ledPin, LOW); // Wyłącz diodę Serial.println("Dioda WYŁĄCZONA"); } } else { Serial.println("Brak klucza 'value_1' w danych JSON."); } } } Jako, że mam Arduino po kablu USB-> to w pythonie zrobilem API do czytania danych import serial import time import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # Ustawienia portu szeregowego serial_port = "COM11" # Zmień na właściwy port, do którego podłączone jest Arduino baud_rate = 9600 # URL API api_url = "http://192.168.0.66:5000/api/receive_data" # Konfiguracja sesji z ponownymi próbami session = requests.Session() retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504]) session.mount("http://", HTTPAdapter(max_retries=retries)) def main(): try: # Inicjalizacja połączenia szeregowego ser = serial.Serial(serial_port, baud_rate, timeout=1) print(f"Połączono z Arduino na {serial_port}") while True: try: # Pobierz dane z API z timeoutem i zamykaniem połączenia with session.get(api_url, timeout=5) as response: if response.status_code == 200: json_data = response.json() # Przetwarzanie odpowiedzi JSON print(f"Otrzymane dane z API: {json_data}") # Wysyłanie danych JSON do Arduino ser.write((str(json_data) + "\n").encode('utf-8')) else: print(f"Błąd API: {response.status_code}") time.sleep(1) # Odczekaj 1 sekundę przed kolejnym żądaniem except requests.exceptions.RequestException as e: print(f"Błąd połączenia z API: {e}") time.sleep(0.01) # Odczekaj przed kolejną próbą except Exception as e: print(f"Wystąpił błąd podczas pętli głównej: {e}") break except KeyboardInterrupt: print("Zakończono działanie.") except Exception as e: print(f"Wystąpił błąd: {e}") finally: if 'ser' in locals() and ser.is_open: ser.close() print("Zamknięto port szeregowy.") if __name__ == "__main__": main() Działa 🙂 edit: dodalem zabezpieczenie do limitu otwartych połączeń sieciowych na określony portm, żeby jego nie zamykał.
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy