M5Stack Unit Encoder

Introduction

Photo de l'avant et l'arrière du M5Stack Unit Encoder

Le M5Stack Unit Encoder est un capteur de rotation infinie équipé de 2 pixels RGB.

C'est un Unit de type I²C tel qu'identifié par son connecteur rouge.

Bibliothèque M5Unit-Encoder

La bibliothèque M5Unit-Encoder permet d'interfacer avec le M5Stack Unit Encoder.

Installation

La bibliothèque M5Unit-Encoder est disponible dans le gestionnaire de bibliothèques d'Arduino.

Code à ajouter à l'espace global, i.e. avant setup()

Importer la bibliothèque, créer une instance de la classe Unit_Encoder et créer une variable pour mémoriser la rotation précédente :

#include "Unit_Encoder.h"
Unit_Encoder myEncoder;

int myEncoderPreviousRotation;

Code à ajouter à setup()

Dans setup(), démarrer la connexion I2C (si elle n'a pas déjà été démarrée) et démarrer la connexion avec l'encodeur :

Wire.begin(); // Démarrer la connexion I2C

myEncoder.begin(); // Démarrer la connexion avec l'encodeur

Code à utiliser dans loop()

Obtenir la rotation accumulée de l'encodeur:

int encoderRotation = myEncoder.getEncoderValue();

Alternativement, obtenir la rotation effectuée depuis la dernière récupération de rotation et mémoriser cette valeur dans encoderRotationChange:

int encoderRotation = myEncoder.getEncoderValue();
int encoderRotationChange = encoderRotation - myEncoderPreviousRotation;
myEncoderPreviousRotation = encoderRotation;

Obtenir l'état du bouton (0=appuyé, 1=relâché):

  int encoderButton = myEncoder.getButtonStatus();

Changer la couleur du premier pixel en blanc (la couleur est en valeur hexadécimale où le symbole # est remplacé par 0x) :

myEncoder.setLEDColor(1, 0xFFFFFF);

Changer la couleur du deuxième pixel en noir (la couleur est en valeur hexadécimale où le symbole # est remplacé par 0x) :

myEncoder.setLEDColor(2, 0x000000);

Exemples de couleurs hexadécimales en C++ :

uint32_t rouge = 0xFF0000;
uint32_t orange = 0xFF8800;
uint32_t vert = 0x00FF00;
uint32_t cyan = 0x00FFFF;
uint32_t mauve = 0xFF00FF;

Exemple avec M5Unit-Encoder

// Le code de base pour le M5Stack Atom

// Inclure la librairie M5 (version pour M5Atom) :
// https://github.com/m5stack/M5Atom
#include <M5Atom.h>

// Inclure la librairie FastLED qui va gérer le pixel :
// https://github.com/FastLED/FastLED
#include <FastLED.h>

// Un tableau qui contient une variable de type CRGB.
// Il y a un seul pixel, mais il doit être dans un tableau.
// CRGB est un type de couleur défini par la lirairie FastLed :
// https://github.com/FastLED/FastLED/wiki/Pixel-reference#crgb-reference
CRGB mesPixels[1];


#include "Unit_Encoder.h"
Unit_Encoder myEncoder;
int myEncoderPreviousRotation;

unsigned long myChronoStart;


void setup() {
  // Démarrer la libraire M5 avec toutes les options de pré-configuration désactivées :
  M5.begin(false, false, false);

  // Démarrer la connexion sérielle :
  Serial.begin(115200);

  // Ajouter le pixel (il y en a un seul) du M5Atom à la librairie FastLED :
  FastLED.addLeds<WS2812, DATA_PIN, GRB>(mesPixels, 1);

  Wire.begin();

  myEncoder.begin();

  // Animation de démarrage
  while (millis() < 5000) {
    mesPixels[0] = CHSV((millis() / 5) % 255, 255, 255 - (millis() * 255 / 5000));
    FastLED.show();
    delay(50);
  }
  mesPixels[0] = CRGB(0, 0, 0);
  FastLED.show();
}

void loop() {
  // Toujours inclure M5.update() au début de loop() :
  M5.update();

  if (millis() - myChronoStart >= 50) {
    myChronoStart = millis();

    int encoderRotation = myEncoder.getEncoderValue();
    int encoderRotationChange = encoderRotation - myEncoderPreviousRotation;
    myEncoderPreviousRotation = encoderRotation;

    int encoderButton = myEncoder.getButtonStatus();

    uint32_t myColorOn = 0xFFFFFF;
    uint32_t myColorOff = 0x000000;

    if (encoderButton == 0) {
      myEncoder.setLEDColor(2, myColorOn);
      myEncoder.setLEDColor(1, myColorOn);
    } else {
      if ( encoderRotationChange > 0) {
        myEncoder.setLEDColor(1, myColorOn);
        myEncoder.setLEDColor(2, myColorOff);
      } else if (encoderRotationChange < 0) {
        myEncoder.setLEDColor(1, myColorOff);
        myEncoder.setLEDColor(2, myColorOn);
      } else {
        myEncoder.setLEDColor(1, myColorOff);
        myEncoder.setLEDColor(2, myColorOff);
      }
    }
  }
}