Bonjour ,
je suis débutant en Arduino et également en programmation, je suis sur un ambitieux projet de simulation d'un tableau de bord de camion, qui fonctionnerait avec EuroTruck Simulator 2, American Truck simulator.
Le boitier est déjà fait et est fonctionnel, les boutons fonctionnent bien, interagissent bien avec les jeux cité ci-dessus, jusque là pas de problème.
Mais là où cela coince, c'est que dans le boitier (tableau de bord), j'y ai inclus un LCD (2X 16 caractères), et des servos pour afficher les données du jeu tels que les kilomètres, la vitesse enclenchée, et pour les servos, le régime moteur, la vitesse du véhicule et les niveaux de pression et de carburant, et la température moteur.
J'ai pu voir sur internet le github de skyhisi voici le lien:
venant de Silas Parker :
J'ai bien suivi toutes les instructions et j'ai bien regardé au numéro de port.
J'ai testé la récupération des données de télémétrie du jeu sur ma carte UNO, cela fonctionne, mais comme précisé plus haut, je souhaite utiliser la carte Due car j'utilise l'émulation du Keyboard pour mes boutons. Ce qui m'oblige d'utiliser le port natif de la carte DUE, de ce fait les boutons fonctionnent, mais je n'arrive pas à lire les données provenant du plugin de télémétrie du jeu, via "SerialUSB.read()" en effet "Serial.read()" ne fonctionne que pour le Programming Port.
Donc le plugin du jeu envoie les données de télémétrie au numéro port COM attribué à l'arduino mais je n'arrive pas à faire en sorte que mon DUE lise ces données via SerialUSB.read();
Comment faire pour que mon DUE branché en Native Port lise les données envoyées par le jeu au port COM ?
Je vous joints ci-dessous la partie lecture de données
code du Setup
void setup() {
// Lancement de la librairie Keyboard, Mouse , LCD et Port Serie.
lcd.begin(16, 2);
Keyboard.begin();
Mouse.begin();
SerialUSB.begin(115200);
...
}
code de la LOOP
void loop()
{
if (SerialUSB.available() < 16)
{
lcd.clear();
lcd.print(SerialUSB.available());
}
else
{
serial_byte = SerialUSB.read();
if (serial_byte != PACKET_SYNC)
{
lcd.clear();
lcd.print(serial_byte);
}
else
{
serial_byte = SerialUSB.read();
if (serial_byte != PACKET_VER)
{
lcd.clear();
lcd.print(serial_byte);
}
else
{
read_serial_byte_set_servo_270_d(Tachy, SERVO_DIR_INVERT); // Tachymetre
read_serial_byte_set_servo_270_d(CptTrs, SERVO_DIR_INVERT); // Regime Moteur
read_serial_byte_set_servo_180_d_air(Pression, SERVO_DIR_NORMAL);
skip_serial_byte(); // Brake air pressure
skip_serial_byte(); // Brake temperature
read_serial_byte_set_servo_180_d_fuel(Carbu, SERVO_DIR_NORMAL);
skip_serial_byte(); // Oil pressure
skip_serial_byte(); // Oil temperature
read_serial_byte_set_servo_180_d_water(Temp, SERVO_DIR_NORMAL);
skip_serial_byte(); // Battery voltage
// Truck lights byte
serial_byte = SerialUSB.read();
digitalWriteFromBit(LEDClignoGauche, serial_byte, 5);
digitalWriteFromBit(LEDClignoDroit, serial_byte, 4);
// Warning lights bytes
serial_byte = SerialUSB.read();
digitalWriteFromBit(LEDTemp, serial_byte, 0);
digitalWriteFromBit(LEDCarbu, serial_byte, 3);
digitalWriteFromBit(LEDPression, serial_byte, 5);
// Enabled flags
serial_byte = SerialUSB.read();
// Text length
int text_len = SerialUSB.read();
// Followed by text
if (0 < text_len && text_len < 127)
{
lcd.clear();
for (int i = 0; i < text_len; ++i)
{
while (SerialUSB.available() == 0) // Wait for data if slow
{
delay(2);
}
serial_byte = SerialUSB.read();
if (serial_byte < 0 && serial_byte > 127)
{
lcd.clear();
lcd.print("wrong size");
}
if (serial_byte == '\n')
{
lcd.setCursor(0, 1);
}
else
{
lcd.print(char(serial_byte));
}
}
}
}
}
}
... // codes boutons
}
//code des fonctions de lecture et de traitement des données reçues
void read_serial_byte_set_servo_270_d(Servo& servo, bool invert)
{
serial_byte = SerialUSB.read();
serial_byte = (serial_byte < 0) ? 0 : ((serial_byte > 180) ? 180 : serial_byte);
//changement de base de 180° vers 270°
int convertValueToBase270 = ((serial_byte / 180) * 270);
if (invert)
servo.write(270 - convertValueToBase270);
else
servo.write(convertValueToBase270);
}
void read_serial_byte_set_servo_180_d(Servo& servo, bool invert)
{
serial_byte = SerialUSB.read();
serial_byte = (serial_byte < 0) ? 0 : ((serial_byte > 180) ? 180 : serial_byte);
if (invert)
servo.write(180 - serial_byte);
else
servo.write(serial_byte);
}
void read_serial_byte_set_servo_180_d_water(Servo& servo, bool invert)
{
serial_byte = SerialUSB.read();
//Changement de base de 110° vers 180 °
serial_byte = ((serial_byte / 110) * 180);
serial_byte = (serial_byte < 0) ? 0 : ((serial_byte > 180) ? 180 : serial_byte);
if (invert)
servo.write(180 - serial_byte);
else
servo.write(serial_byte);
}
void read_serial_byte_set_servo_180_d_air(Servo& servo, bool invert)
{
serial_byte = SerialUSB.read();
//Changement de base air Max = 12 bars => 180°
serial_byte = serial_byte * 15;
serial_byte = (serial_byte < 0) ? 0 : ((serial_byte > 180) ? 180 : serial_byte);
if (invert)
servo.write(180 - serial_byte);
else
servo.write(serial_byte);
}
void read_serial_byte_set_servo_180_d_fuel(Servo& servo, bool invert)
{
serial_byte = SerialUSB.read();
//Changement de base valeur maximale = 1 => 180°
serial_byte = serial_byte * 180;
serial_byte = (serial_byte < 0) ? 0 : ((serial_byte > 180) ? 180 : serial_byte);
if (invert)
servo.write(180 - serial_byte);
else
servo.write(serial_byte);
}
void skip_serial_byte()
{
(void)SerialUSB.read();
}
void digitalWriteFromBit(int port, int value, int shift)
{
digitalWrite(port, (value >> shift) & 0x01);
}