Het dashboard project (in Linux!)

Deze pagina gaat over hetzelfde project, maar uitdrukkelijk over het werkend krijgen ervan in Linux. Dus niet de ontwikkelingen op het gebied van de elektronica zelf, maar het zoeken naar de mogelijkheid om het werkend te krijgen in ArchLinux.

Daarbij bestaat het dashboard uit twee afzonderlijke delen: De Arduino Mega die naar signalen uit de spellen luistert en de Arduino Due die het overgrote deel van de joystickzijde verzorgt. De Fanatec stuurwielbasis hoort er ook bij.

De Arduino Mega en Monocoque

Monocoque is een Linux-alternatief voor het Windows programma SimHub en stuurt telemetrie informatie uit spellen naar een Arduino op basis van de configuratie. Ik gebruik een Arduino Mega met daarop een begin van de code zoals gebruikt voor SimHub. De Custom-Serial mogelijkheid van Monocoque staat net als SimHub het gebruik van zelfbouw modeules toe, maar lijkt zowel qua installatie als gebruik bij lange na nog niet op de Windows tegenhanger.

Het installeren vereist handmatig compileren en daarmee meerdere afhankelijkheden, waarvan sommige óók handmatig gecompileerd moeten worden, met soms elk hun eigen afhankelijkheden: de zogenaamde “dependency hell”. Veel van deze afhankelijkheden hebben in ArchLinux de naam die ze in de documentatie van Monocoque hebben en was óók een van de redenen om voor ArchLinux te kiezen, naast de VR-ondersteuning.

Door de vele Linux-versies zal ik mij dan ook niet op de installatie richten, maar op de configuratie. Om met een Arduino te verbinden, moet je deze juist instellen via het volgende configuratiebestand:

$user is jouw eigen gebruikersnaam. In deze map vind je het bestand monocoque.config dat er op mijn machine zo uitziet:

sim = “default” is voor spellen waar geen “vertaalbrug” voor nodig is, zoals ETS2. Dat geld wel alleen voor de “Native Linux” versie, elke Proton-versie is in feite gewoon de Windows versie. Daardoor zoekt Monocoque op de verkeerde plek naar telemetriegegevens. Voor OMSI2 ontbreekt op dit moment dan ook de ondersteuning.

type = “custom” verwijst naar het gebruik van zelfbouw-modules en lijkt veel op de CustomProtocol/CustomSerial functie van SimHub. Hiermee kun je individuele LED’s aansturen, of andere dingen die je niet kant-en-klaar in de winkel koopt. Het gebruik van twee Arduino’s, heeft te maken met een pin-tekort op de Arduino Mega, daarom is de snelheidsmeter aangesloten op een Uno.

config = “” is het bestand dat de telemetriegegevens bevat die je wil versturen, net als in SimHub. Dit bestand vind je in:

$user is opnieuw jouw eigen gebruikersnaam.

Deze map bevat meerdere voorbeeldconfiguraties voor modules zoals LED-vlaggen en B/C-merken toerentalmeters. Ook de “custom serial” apparaten stel je hier in. Voor de Arduino Mega verstuur ik in het custom.lua bestand de volgende waardes:

Dit bestand kun je trouwens ook vinden op de Github-pagina van het project.

Voordat je een spel start, moet je in de terminal navigeren naar de locatie waar je monocoque hebt gecompileerd en het volgende commando uitvoeren:

./monocoque -- play

Op dit moment ben ik heel blij dat dit al werkt en het dashboard er (tot op zekere hoogte) correct op reageert. Het veranderen van waardes lukt me echter nog niet. Na het starten van Monocoque, zie je bij een “aangehaakt” spel in de terminal 3 waardes verschijnen: de snelheid, toerental en de gebruikte versnelling. En die laatste, scheen en zeker licht op het moeten aanpassen van de verstuurde waardes.

Syntax

Stel, je moet een letter of karakter omzetten in een nummer zodat je deze in de Arduino code goed kunt gebruiken, dan moet je deze aanpassen. In zowel SimHub, dat gebruik maakt van NCalc en in Monocoque, dat LUA gebruikt, begrijp ik hiervoor de syntax maar heel beperkt. Het uitvoeren van meer gegevens uit ETS2 lukt dan ook nog niet zonder een foutmelding te veroorzaken bij het starten van monocoque.

Ga je vooruit wordt de versnelling met getallen van 1 tot en met 14 aangegeven (in het geval van mijn vrachtwagen althans). In de terminal wordt het echter wel “zwart” na versnelling 8. Bij het achteruitrijden in Windows, zie je -1 tot en met -4. In Monocoque zien we dan echter -, * en / (de vierde waarde kan ik niet goed waarnemen, daarvoor moet ik te hard achteruit rijden). Hoe dit om te zetten is in een “R” of juist op te pakken is met de Arduino code weet ik nog niet. Hierover moet ik meer informatie inwinnen bij de ontwikkelaar.

Dat ik mij op ETS2 richt is omdat ik vooral ergens wil beginnen: er hoeft geen vertaalslag gemaakt te worden, wat de configuratie vergemakkelijkt. Als daarin alles werkt, zal ik mij op The Bus en OMSI2 gaan richten. Ik vrees dat vooral deze laatste een uitdaging zal worden.

Van het in Linux deels werkende dashboard maakte ik een korte video. Het turbine-achtige geluid is dat van de kleine Lenovo die het héél erg warm had…

Euro Truck Simulator 2 voert succesvol telemetrie uit in ArchLinux

De Arduino Due in Linux

Voor de joystickzijde van het dashboard gebruik in een Arduino Due met de Heironimus joystick-bibliotheek die een joystick met 87 knoppen en 0 assen creëert. In Windows “ziet” “Spelbesturingen Instellen” maar 32 knoppen, maar spellen die meer knoppen ondersteunen “zien” de rest wel. Voor OMSI2, waarvoor dat niet opgaat gebruikte ik virtuele joysticks via Universal Control Remapper, die na 31 knoppen een nieuwe joystick aanmaakte, met een unieke naam, Dat is belangrijk, want OMSI2 accepteert het gebruik van joysticks met dezelfde naam niet.

Het is precies deze opstelling die me in mijn overstap naar Linux meteen pittig hoofdpijn bezorgde, op meerdere manieren. De Linux-kernel ondersteund, in theorie maximaal 80 knoppen, maar die is met een kernel-aanpassing te verhogen naar 104. Een aangepaste kernel compileren is niet iets dat ik een net overgestapte Linux-gebruiker zie doen. Bovendien is het proces gevoelig voor de introductie van fouten: elke kernel-update moet je handmatig toepassen.

Ter test probeerde ik de aanpassing wel uit en gebruikte dit verzoek tot officieel aanpassen van de kernel om te weten waar ik moest zijn. Na een paar uur compileren en het opstarten in de gewenste kernel zag ik meer dan 80 knoppen in KDE’s Spelbesturingen (in “Instellingen”). Dat zag er dus goed uit en starte, erg in mijn nopjes met het resultaat ETS2 om meteen tegen een nieuw probleem aan te lopen.

Of het ligt aan Steam, evdev, SDL of de joydev module is mij onbekend, maar ETS2 pikte het absoluut niet: het gebruik van elke knop boven nummer 80, zorgde voor een fatale crash. Dit beloofde weinig goeds voor het gebruik van virtuele joysticks voor OMSI2… En dat was het tweede probleem: geen van de programma’s die ik vond (AntiMicroX, Input Remapper) is in staat tot de creatie van virtuele joysticks met een unieke naam.

Bovendien heeft vooral AntiMicroX 1 groot probleem: de gecreëerde virtuele joystick is een gamepad, met minder dan 31 knoppen. Kom je knoppen tekort, moet je een nieuwe aanmaken en van elke knop onthouden aan welke virtuele joystick die gekoppeld is. Dit wordt gemakkelijk vreselijk onoverzichtelijk.

Dus veranderde ik de Joystick code op de Due zodat deze 3 virtuele joysticks aan zou maken. Zo kan OMSI er een volledig zelf oppakken en hoef ik er nog maar twee via AntiMicroX naar virtuele joysticks uit te voeren. Helaas zag ik deze joysticks geen moment terug in Linux: ik bleef maar 1 Arduino Due zien…

USB-Quirks

Een zoektocht leerde mij dat dit een veelvoorkomend probleem is, van joysticks tot andere apparatuur die door de functionaliteit niet in 1 USB-descriptor past (een descriptor bevat de naam, functiemogelijkheden en adresruimte die nodig is om deze functies aan te kunnen spreken).

Om 1 fysiek HID apparaat meerdere virtuele apparaten te laten creëren zoals met de Arduino Due, moet je een “usb.quirk” regel toevoegen aan de opstartregel. Op de Wikipagina van de joystick bibliotheek, wordt hierover een melding gemaakt. Voor de Due werkt dit ook, zolang je de juiste informatie toevoegt, die hieronder gemarkeerd is:

De combinatie van nummers en letters achter “ID” slaat op de VID en de PID: Vendor ID en Product ID. Arduino als bedrijf, gebruikt 2341. Deze zal voor veel Arduino’s dus hetzelfde zijn. De Product ID, 003e verteld ons dat het een Arduino Due betreft. Voer lsusb niet uit als de Due verbonden is met de programmeerpoort, want die heeft PID 003d en kun je in Linux niet gebruiken om je joystick mee te laten werken in spellen.

Deze toevoeging is een aanpassing van een opstartregel in

en ziet er als volgt uit. De rest van het document doet niet ter zake en laat ik weg. Ik heb de toevoeging gemarkeerd voor de duidelijkheid:

Voer hierna “sudo grub-mkconfig” uit om deze wijziging in grub op te nemen, anders start je kernel op zonder deze aanpassing. Toen ik dat gedaan had, was het tijd om opnieuw op te starten (en hopen dat ik niet toch iets verkeerd gedaan had). Toen ik jstest-gtk startte, zag ik dat het ook voor de Due werkt:

Het is een bewuste keuze om voor 31 knoppen te kiezen, voor OMSI2. Nu is het een kwestie van de hele Arduino code omzetten: elke knop boven 31 moet worden ondergebracht in een nieuwe joystick, waar het tellen van knoppen opnieuw begint. Voor de eerste joystick lukt dat nog wel redelijk makkelijk, maar daarna moet ik goed opletten en rekenen. De fysieke pin op een Arduino was in de oude situatie namelijk gelinkt aan het joystick-knopnummer dat je manipuleert.

Wordt dus vervolgd.

Scroll naar boven