AS5600 Knob mouse code

AS5600 Knob mouse code ti permette di realizzare con il tuo encoder magnetico l’effetto scroll del mouse:

as5600 knob mouse code zoom

Potrai usare questo esempio di codice sia in una pagina web, o altro programma,  sia per ottenere un effetto zoom per i programmi di grafica 3D.

Poiché l’encoder AS5600 ha una elevata risoluzione, potrai ottenere un effetto decisamente fluido in entrambi i casi.

Se non hai letto i precedenti articoli dedicati al progetto ti invito a farlo:

In cui trovi la descrizione del progetto e come realizzare la manopola in 3D,  ed il primo codice di test.

In questo articolo partiremo dal codice usato per il test e implementeremo solo le parti che riguardano le funzioni relative al mouse.

Ti ricordo che le funzioni mouse su arduino sono disponibili con tutte le schede della famiglia ATmega32u4 come l’Arduino Leonardo.

Lo sketch

Iniziamo subito dal codice completo necessario per realizzare questo progetto:

#include <Wire.h>
#include <Mouse.h>
#include <AS5600.h>

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
  #define SERIAL SerialUSB
  #define SYS_VOL   3.3
#else
  #define SERIAL Serial
  #define SYS_VOL   5
#endif

AMS_5600 ams5600;

int ang = 0;
long oldPosition  = -999;

void setup()
{
  SERIAL.begin(115200);
  Wire.begin();
  SERIAL.println(">>>>>>>>>>>>>>>>>>>>>>>>>>> ");
  if(ams5600.detectMagnet() == 0 ){
    while(1){
        if(ams5600.detectMagnet() == 1 ){
            SERIAL.print("Current Magnitude: ");
            SERIAL.println(ams5600.getMagnitude());
            break;
        }
        else{
            SERIAL.println("Can not detect magnet");
        }
        delay(1000);
    }
  }
}
/*******************************************************
/* Function: convertRawAngleToDegrees
/* In: angle data from AMS_5600::getRawAngle
/* Out: human readable degrees as float
/* Description: takes the raw angle and calculates
/* float value in degrees.
/*******************************************************/
float convertRawAngleToDegrees(word newAngle)
{
  /* Raw data reports 0 - 4095 segments, which is 0.087 of a degree */
  float retVal = newAngle * 0.087890625;
  return (int) retVal;
}
void loop()
{
    long newPosition = convertRawAngleToDegrees(ams5600.getRawAngle());
    if (newPosition != oldPosition) {
      if ( oldPosition > newPosition ) { Mouse.move(0,0,  1); }
      if ( oldPosition < newPosition ) { Mouse.move(0,0, -1); }
      oldPosition = newPosition;
    }
    SERIAL.println(String(convertRawAngleToDegrees(ams5600.getRawAngle())));
}

in cui vedi da subito che la maggior parte delle linee di codice sono identiche a quelle usate per il test dell’AS5600 Knob mouse code.

Le linee differenti sono:

linea 02: include la libreria Mouse.h che userai per simulare le funzioni mouse attraverso l’arduino leonardo;

linea 16: definisci una nuova variabile, di tipo long che chiami oldPosition e ti servirà per memorizzare il valore di posizione dell’encoder ad ogni ciclo di loop per valutare la differenza tra quello letto in tempo reale;

Nella funzione setup() non ci sono modifiche.

Nella funzione di conversione: convertRawAngleToDegrees c’è una sola modifica:

linea 48: il valore ritornato dalla funzione, dopo la conversione dell’angolo è trasformato ( si dice castato, ossia è stato eseguito un cast = una conversione ) ad un valore intero;

Tale modifica è utile nella funzione loop per valutare più semplicemente l’angolo in quanto una precisione di 1 grado è più che sufficiente per questo progetto.

Nulla ti vieta di non eseguire questa conversione e utilizzare il valore come float ottenendo una variazione più significativa.

Nella funzione loop dovrai fare delle modifiche:

linea 52: imposta una variabile newPosition di tipo long in cui memorizzerai il valore corrente letto dall’encoder AS5600 Knob mouse code;

linea 53: confronta il valore appena ottenuto con quello presente nella variabile oldPosition per capire se ci sono state variazioni;

linee 54-55: se c’è stata una variazione dovrai definire se la variazione è stata in verso orario o antiorario, ossia se il valore letto è maggiore o minore del precedente. Per ciascuna variazione deciderai se inviare al computer un valore di scroll positivo ( 1 ) o negativo ( -1 ) 

linea 56: infine riassegna il valore corrente dalla variabile newPosition alla variabile oldPosition per prepararti alla successiva valutazione nel prossimo ciclo di loop();

Lo sketch è completo e non resta che provarlo:

Ottimizziamo il codice

Puoi ottimizzare il codice dell’AS5600 Knob mouse code cambiando la funzione loop() come segue:

void loop()
{
    long newPosition = convertRawAngleToDegrees(ams5600.getRawAngle());
    if (newPosition != oldPosition) {
      Mouse.move(0,0, (oldPosition - newPosition));
      oldPosition = newPosition;
    }
    delay(1);
}

in cui ho eliminato gli If presenti alle linne 54-55 e calcolato il valore di variazione tra oldPosition e newPosition come la differenza tra loro, passando il valore ottenuto direttamente alla funzione move del mouse;

Durante i test ti accorgerai che è necessario aggiungere un piccolo delay (1 ) al posto della  linea 57 per rallentare leggermente l’esecuzione del codice evitando l’uso della porta seriale.

Il risultato del progetto, ossia l’effetto finale non cambia rispetto a quanto visto nel video.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/as5600-knob-mouse-code.html

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.