Simulare controller USB a potenziometro con Leonardo

Salve a tutti, vorrei realizzare un freno a mano a potenziometro da usare affiancato al logitech g27. La parte meccanica è già pronta...purtroppo non riesco a programmare la scheda arduino leonardo dato che non mi sono mai occupato di elettronica. Sono soltanto riuscito a collegare il potenziometro slider lineare alla scheda e a verificarne il corretto funzionamento tramite il monitor seriale di arduino.

Vorrei sapere se qualcuno di voi esperti del forum mi potrebbe scrivere uno sketch in modo che arduino venga rilevata dal computer come un controller usb o come tastiera e non come mouse, perchè il mouse non è rilevato nell'assegnazione dei comandi del gioco in cui vorrei utilizzarlo(richard burns rally). Specifico che in questo gioco la potenza del freno a mano può essere regolata(per questo ho acquistato il potenziometro).

Ovviamente sarei disposto anche a pagarvi per l'aiuto.
Grazie mille

Scarica il file zip dell'IDE 1.0.6 per il tuo sistema operativo (http://arduino.cc/en/Main/Software#toc2) e estrailo in una cartella. (anche su desktop)
In "IDE1.0.6"\hardware\arduino\cores\arduino\ sostituisci i file
--> http://www.imaginaryindustries.com/arduino/leoJoy/USBAPI.h
--> http://www.imaginaryindustries.com/arduino/leoJoy/HID.cpp
Apri il nuovo IDE clikkando su Arduino.exe e seleziona la porta COM e la scheda Leonardo.

Carica questo sketch aulla Leonardo
--> http://www.imaginaryindustries.com/arduino/leoJoy/leoJoy.ino

Al riavvio della scheda nel pannello di controllo tra le periferiche di gioco dovresti trovare anche la Leonardo che si muove a caso.

Se tutto funziona bisogna modificare leggermente lo sketch per simulare il freno a mano.
(GitHub - devonshire/arduino-joystick: Arduino Leonardo based USB Digital Joystick)

ho provato a fare così ma al caricamento mi dello sketch mi da una serie di errori

C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:117: error: prototype for 'void Serial_::begin(long unsigned int)' does not match any in class 'Serial_'
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\/USBAPI.h:33: error: candidate is: void Serial_::begin(uint16_t)
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:122: error: prototype for 'void Serial_::begin(long unsigned int, byte)' does not match any in class 'Serial_'
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\/USBAPI.h:33: error: candidate is: void Serial_::begin(uint16_t)
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp: In member function 'virtual int Serial_::available()':
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:133: error: 'peek_buffer' was not declared in this scope
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp: In member function 'virtual int Serial_::peek()':
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:141: error: 'peek_buffer' was not declared in this scope
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:143: error: 'peek_buffer' was not declared in this scope
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp: In member function 'virtual int Serial_::read()':
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:148: error: 'peek_buffer' was not declared in this scope
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp: In member function 'virtual size_t Serial_::write(uint8_t)':
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:163: error: no matching function for call to 'Serial_::write(uint8_t*, int)'
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:161: note: candidates are: virtual size_t Serial_::write(uint8_t)
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp: At global scope:
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:166: error: prototype for 'size_t Serial_::write(const uint8_t*, size_t)' does not match any in class 'Serial_'
C:\Users\luca\Desktop\arduino-1.0.6-windows\arduino-1.0.6\hardware\arduino\cores\arduino\CDC.cpp:161: error: candidate is: virtual size_t Serial_::write(uint8_t)

io ho scaricato dall'area download l'ide 1.0.6 (Windows ZIP file (for non-administrator install)) e dentro ho sostituito quei file che mi hai detto. per scaricarli sono andato al link e dal menù di chrome ho cliccato su 'salva con nome' e questi vengono salvati come file .H e .CPP. Ho provato anche a sostituire i file nell'installazione che avevo già di arduino nella cartella programmi ma dà lo stesso errore. Ho provato anche a disinstallare arduino dal pc ed esegurlo solo dalla cartella sul desktop ma il risultato è sempre lo stesso.

Probabilmente i file sono per una versione dell’IDE precedente.

EDIT.
OK usa questi allegati. Ho aggiornato i file del nuovo IDE aggiungendo la funzione Joystick.

HID.cpp (17.6 KB)

USBAPI.h (5.81 KB)

leoJoy.ino (970 Bytes)

Dopo aver fatto come mi hai detto il computer e il gioco mi riconoscono la leonardo come controller. Ho provato a modificare il codice escludendo tutti i comandi e lasciando solo l'asse x(che a quanto mi pare di aver capito è impostato sul pin AO). Il gioco ora rileva solo l'assex però non lo rileva correttamente(quando il potenziometro è al minino la barra dell'assex è al massimo, mentre quando aumento il valore la barra scorre continuamente assumendo valori random)
questo è il codice

/*
Arduino Leonardo Joystick!
*/

JoyState_t joySt;

void setup()
{
 pinMode(13, OUTPUT);


 joySt.xAxis = 0;
 joySt.yAxis = 0;
 joySt.zAxis = 0;
 joySt.xRotAxis = 0;
 joySt.yRotAxis = 0;
 joySt.zRotAxis = 0;
 joySt.throttle = 0;
 joySt.rudder = 0;
 joySt.hatSw1 = 0;
 joySt.hatSw2 = 0;
 joySt.buttons = 0;
}


void loop()
{
 joySt.xAxis = analogRead(joySt.xAxis);


 if (joySt.xAxis >13 )
   digitalWrite(13, HIGH);
 else
   digitalWrite(13, LOW);


 // Call Joystick.move
 Joystick.setState(&joySt);
}

Prova con

 joySt.xAxis = 255 - analogRead(A0)/4;  // Legge dal pin A0

Modifica il post precedente e includi il codice col tag CODE è più leggibile (vedi nel regolamento il punto 7)

perfetto..ora funziona correttamente. Soltanto un ultima cosa: questi potenziometri slider(ne ho due uguali) hanno un piccolo problema, con la barra al minimo mandano sempre un po di segnale (circa 15/1024)...è possibile fare in modo che fino a quel valore il potenziometro non venga letto? Perchè in questo modo il freno rimane sempre leggermente tirato
Grazie ancora

Con calibrazione. :grin:

/*
Arduino Leonardo Joystick!
*/

const int sensorPin = A0;    // pin that the sensor is attached to
const int ledPin = LED_BUILTIN;        // pin that the LED is attached to

// variables:
int sensorValue = 0;         // the sensor value
int sensorMin = 1023;        // minimum sensor value
int sensorMax = 0;           // maximum sensor value

JoyState_t joySt;

void setup()
{
  pinMode(ledPin, OUTPUT);

  joySt.xAxis = 0;
  joySt.yAxis = 0;
  joySt.zAxis = 0;
  joySt.xRotAxis = 0;
  joySt.yRotAxis = 0;
  joySt.zRotAxis = 0;
  joySt.throttle = 0;
  joySt.rudder = 0;
  joySt.hatSw1 = 0;
  joySt.hatSw2 = 0;
  joySt.buttons = 0;
}

void loop()
{
  sensorValue = analogRead(sensorPin);

  if (sensorValue > sensorMax) sensorMax = sensorValue;
  if (sensorValue < sensorMin)sensorMin = sensorValue;

  sensorValue = map(sensorValue, sensorMin, sensorMax, 255, 0);
  sensorValue = constrain(sensorValue, 0, 255);

  joySt.xAxis = sensorValue;

  if (sensorValue > 13 )
    digitalWrite(LED_BUILTIN, HIGH);
  else
    digitalWrite(LED_BUILTIN, LOW);

  // Call Joystick.move
  Joystick.setState(&joySt);
}

Per calibrarlo appena acceso alza e abbassa la leva.
Lui registra continuamente il massimo e il minimo e li imposta come 0 e 255.

Se vuoi ridurre le dimensioni puoi prendere un Arduino Micro (http://arduino.cc/en/Main/ArduinoBoardMicro).
E’ una Leonardo mignon.

ora funziona perfettamente..grazie ancora

Puoi postare una foto della leva del freno col potenziometro? :grin:

eh aspetta perchè devo ancora trovargli un supporto dove appoggiare tutto. Appena sono pronto la metto :slight_smile:

Ok.
Buone feste. :grin: