Partendo dalla fine del precedente articolo AS5600 Knob 3D ti invito a guardare il video che mostra come assemblare la parte elettronica e il case stampato in 3D:
per ottenere un esempio di manopola 3D, 3D Knob, basata sull’encoder assoluto magnetico AS5600.
Il video
nel video potrai vedere tutte le fasi di montaggio dell’AS5600 Knob 3D:
e all’inizio ed alla fine del video degli esempi di uso del progetto come mouse simulando la rotella sia per lo zoom sia per lo scroll .. ma questo lo faremo fare ad Arduino Leonardo.
Lo schema
come in ogni progetto che coinvolge l’elettronica è necessario avere uno schema dei collegamenti anche se semplici come in questo caso:
in cui avrai notato che i pin SDA e SCL vanno rispettivamente al pin 2 e 3 dell’Arduino Leonardo e questo è legato al fatto che sono su questi pin i segnali I2C che ci servono.
Avrei potuto scegliere anche i pin SAD e SCl presenti in alto a destra, sarebbe stato identico.
Passiamo alle librerie necessarie per leggere i segnali provenienti dall’AS5600 Knob code.
AS5600 Knob code library
Come spesso accade ci avvaliamo di librerie che ci agevolano nella scritttura del codice permettendoci di ignorare una serie di specifiche informazioni sui segnali diretti all’AS5600 e ricevuti dallo stesso.
In questo articolo ti mostro la libreria che ho usato dopo averne provate alcune, perché non sempre al primo colpo trovi quella che ti soddisfa o che trovi compatibile con il tuo progetto.
La libreria che fo scelto è quella scritta e rilasciata da SeedStudio che dovrai scaricare da questo link e procedere a caricare nel tuo IDE:
seleziona la possibilità di aggiungere una libreria in formato .ZIP e indica al software Arduino IDE la posizione in cui l’hai scaricata:
in modo che sia disponibile nel tuo IDE per eseguire un primo test:
leggendo l’angolo e convertendolo in gradi visualizzati sul monitor seriale.
L’esempio di codice che ti mostro dovrebbe farti ottenere un risultato simile al segunete:
in cui l’AS5600 Knob code legge la posizione assoluta della manopola e la converte in un valore numerico che puoi leggere sul monitor seriale.
Passiamo al codice che ti permette di ottenere quanto visto.
AS5600 Knob code
lo sketch che hai selezionato è quello di esempio fornito con la libreria.
E’ sufficiente ad eseguire un primo test ed ottenere il risultato mostrato nella gif precedente.
ecco lo sketch:
#include <Wire.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; 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.087; return retVal; } void loop() { SERIAL.println(String(convertRawAngleToDegrees(ams5600.getRawAngle()),DEC)); }
Descrizione del codice
vediamo come funziona partendo dalle prime linee 01-02 in cui includi le due librerie necessarie per colloquiare con l’AS5600.
Poiché la comunicazione avverrà attraverso l’I2C dovrai includere anche la libraria Wire.h
Le linee 03-09 servono al codice per impostare il corretto modo di colloquiare con la Seriale ( ricorda che i valori li vedremo visualizzati sul monitor seriale ) e il voltaggio di lavoro che per i microcontrollori basati su SAMD è di 3,3v contro i 5v di quelli Atmega, come nel nostro caso;
linea 11: inizializza l’istanza ams5600 come parte della libreria AMS_5600;
linea 13: imposta e inizializza la variabile usata per mantenere il valore numerico dell’angolo;
linee 17-18: avviano rispettivamente la comunicazione seriale e I2C delle rispettive classi;
linee 20-32: controllano che il magnete sia presente usando il metodo detectMagnet() in modo da poter procedere con le fasi successive solo quando il sensore AS5600 vede il magnete.
Notice
Durante i test, alcune volte, il magnete non veniva rilevato in quanto la manopola non era perfettamente inserita nel cuscinetto.
Il sensore è molto sensibile e percepisce la distanza come un errore.
linea 41: definisci una funzione di tipo float il cui scopo è quello di convertire il valore letto dal sensore ed inviato via i2c all’arduino in gradi;
linee 44-45: la prima converte il valore passato alla funzione in gradi moltiplicando tale valore per 0.087 che deriva dall’operazione 360 gradi /4096 la risoluzione del sensore sul giro completo;
linea 49: invia al monitor seriale il risultato della lettura eseguita dal sensore e trasformata in gradi dal dalla funzione presente alle linee 41-46;
Il risultato sul tuo monitor seriale dovrebbe essere simile al seguente:
Nel prossimo articolo proveremo a scrivere un codice che simuli il mouse del computer.
Utilizzeremo i valori letti sull’AS5600 in scroll di una pagina internet o zoom in un programma 3D.