Arduino leonardo mouse joystick control

Buonasera a tutti,

come ho accennato nel mio post di presentazione, sto sviluppando un nuovo progetto, si tratta di un controller per aumentare le funzionalità della mia postazione per simulatori di volo.

il controller dovrebbe emulare il mouse ed alcuni tasti della tastiera per consentirmi nel simulatore di gestire le varie visuali esterne al cockpit.

Ho dunque acquistato una scheda Leonardo e mi sono messo a sfogliare le risorse per utilizzarla.

tra gli esempi ho trovato questo documento :

https://www.arduino.cc/en/Tutorial/joystickMouseControl

ovviamente essendo un superprincipiante mi sfugge qualcosa ....

dallo schema dei collegamenti vedo che viene utilizzato il pin 6 mentre, leggendo il codice, mi pare che il pin utilizzato per collegare l'interruttore che abilita il controllo mouse sia invece il 2

dove sbaglio ?

Grazie dell'attenzione.
Lorenzo

Non ti sei sbagliato, nel programma hanno usato un pin diverso da quello dello schema.
Poco male, tu usa il numero di pin che andrai a usare.

Ok grazie!

in realtà non credo sia un errore ma solo che l'esempio sia fuorviante e che il codice riferisca al pin2 (non mostrandone il collegamento nello schema) e che lo schema mostri invece il collegamento del pin6 allo switch dello stick per usarlo per le funzioni ad esempio citate dalla riga 80 alla 94......

al di la di queste considerazioni, ho fatto questi collegamenti :

e messo assieme questo codice

#include "Mouse.h"

// set pin numbers for switch, joystick axes, and LED:
const int switchPin = 4;      // switch to turn on and off mouse control
const int xAxis = A0;         // joystick X axis
const int yAxis = A1;         // joystick Y axis
const int ledPin = 5;         // Mouse control LED

// parameters for reading the joystick:
int range = 3;               // output range of X or Y movement
int responseDelay = 5;        // response delay of the mouse, in ms
int threshold = range / 4;    // resting threshold
int center = range / 2;       // resting position value


bool mouseIsActive = false;    // whether or not to control the mouse
int lastSwitchState = LOW;        // previous switch state

// parametri encoder rotativo
int valore = 0;
int letturaPrecedente = HIGH;

void setup() {

  // setup Encoder rotativo
  pinMode (6, INPUT_PULLUP); // mousewheel UP
  pinMode (7, INPUT_PULLUP); // mousewheel DOWN
  Serial.begin (9600);
  // end setup Encoder rotativo

  //setup mouse joystick
  pinMode(switchPin, INPUT_PULLUP);       // the switch pin
  pinMode(ledPin, OUTPUT);         // the LED pin
  // take control of the mouse:

  Mouse.begin();
  // end setup mouse joystick

}

void loop() {

  // loop encoder rotativo
  int n = digitalRead(6);
  if ((letturaPrecedente == HIGH) && (n == LOW)) {
    if (digitalRead(7) == HIGH) {
      valore--;
      // scroll direzione 1
      Mouse.move(0, 0, 1);
    } else {
      valore++;
       // scroll direzione 2
      Mouse.move(0, 0, -1);
    }
    Serial.println(valore);
  }
  letturaPrecedente = n;

  // end loop encoder rotativo

  // loop mouse joystick

  // read the switch:
  int switchState = digitalRead(switchPin);
  // if it's changed and it's high, toggle the mouse state:
  if (switchState != lastSwitchState) {
    if (switchState == HIGH) {
      mouseIsActive = !mouseIsActive;
      // turn on LED to indicate mouse state:
      digitalWrite(ledPin, mouseIsActive);
    }
  }
  // save switch state for next comparison:
  lastSwitchState = switchState;

  // read and scale the two axes:
  int xReading = readAxis(A0);
  int yReading = readAxis(A1);

  // if the mouse control state is active, move the mouse:
  if (mouseIsActive) {
    Mouse.move(xReading, yReading, 0);
  }

  delay(responseDelay);
}

//reads an axis (0 or 1 for x or y) and scales the analog input range to a range from 0 to <range>

int readAxis(int thisAxis) {
  // read the analog input:
  int reading = analogRead(thisAxis);

  // map the reading from the analog input range to the output range:
  reading = map(reading, 0, 1023, 0, range);

  // if the output reading is outside from the rest position threshold, use it:
  int distance = reading - center;

  if (abs(distance) < threshold) {
    distance = 0;
  }

  // return the distance for this axis:
  return distance;

  // end loop mouse joystick

}

A questo punto ho due domande da supernoob :

1 - Come potere vedere porto al pulsante sulla breadboard solo il GND, che problema c'è a usare un collegamento di questo tipo senza portare 5V e senza resistenza ?

2- se la cosa di cui sopra è lecita, dovendo aggiungere dei pulsanti per fornire al mio progetto la possibilità di includere Keyboard.h ed emulare anche alcuni tasti della tastiera, posso usare lo stesso sistema senza portare loro 5V e senza impiegare resistori ?

Grazie dell'attenzione e perdonate le mie domande da poppante.

Buona serata.
Lorenzo

1)Un pulsante può funzionare in pull down o pull up, e prevede sempre l'uso di resistenze. Adesso arduino implementa da solo il pull up e usa resistenze interne. Per cui sia che tu usi una resistenza per creare un pulsante in pull up, o definisci il pin INPUT_PULLUP, il circuito è lo stesso e funziona allo stesso modo.

2)Per keyboard.h non ho mai usato questa libreria e faccio un po di confusione con keypad.h che funziona in modo diverso :slight_smile: dagli esempi che ho visto, leggi la pressione di un pulsante e invii un valore al PC, per cui i pulsanti possono anche essere in INPUT_PULLUP ...

Signori buongiorno,
avevo parcheggiato questo progetto con uno sketch funzionante mentre mi occupavo di disegnare e stampare l'involucro in plastica che andrà a contenerlo, ora mi sono reso conto che la scheda Leonardo che ho utilizzato, è troppo grande per stare all'interno del guscio, ed ho quindi acquistato una scheda Micro.
La scheda è sorprendentemente piccola e sarebbe perfetta per lo scopo ma, mio malgrado, ho notato che i pin di tipo digitale presenti sono davvero pochissimi.
Mi chiedevo dunque come posso sostituire la porzione di codice relativa all'encoder rotativo dovendolo collegare a pin di tipo analogico ed anche come fare con i vari tasti che devo implementare in quanto anche loro, sulla board Leonardo, erano collegati a pin digitali mentre sulla Micro andrei a collegarli per forza a pin analogici.

Grazie dell'attenzione.
Lorenzo

Ciao,
:smiley: i pin analogici li puoi indifferentemente utilizzare sia come analogici che digitali, basta solo che li dichiari.
«The Micro is a microcontroller board based on the ATmega32U4 (datasheet), developed in conjunction with Adafruit. It has 20 digital input/output pins (of which 7 can be used as PWM outputs and 12 as analog inputs)»

(Ovviamente i pin digitali non si possono utilizzare per leggere valori analogici non essendoci all'interno del microchip l'hardware necessario)

D