Je m'essaye au code, qui veut m'aider à identifier mes erreurs de noob?

Rebonjour frenchydude08

Je te montre un exemple de traitement d'un codeur 600 tics/tour avec interrupt A et B et événement CHANGE, ce qui donne 2400 tics/tour.

/*
    Name:       Test_RotencQuadra.ino
    Created:	01.10.2021
    Author:     jpbbricole
*/

//------------------------------------- Encodeur rotatif
#define rotencApin 2     // 2 pin pour A et B du CR
#define rotencBpin 3     // Ces 2 pin sont des entrees avec interrupt sur le UNO ou Nano

//-------------------------------------Définition de la structure (objet) Rotary Encoder CR
struct rotencDef 
{
	volatile int stepIncrement;     // Valeur d'incrément
	volatile long posSteps;     // Position en pas
};
rotencDef rotenc;

boolean rotencPosNew = false;     // Quan nouvelle position de l'encodeur

void setup()
{
	Serial.begin(115200);

	//--------------------------------- Initialisation des interruptions du CR
	//                                  Activation des pins d'entrée du CR avec r?sistances de polarisation (PULLUP)
	pinMode(rotencApin, INPUT_PULLUP);
	pinMode(rotencBpin, INPUT_PULLUP);
	//------------------------------------ Activation des interrupts du CR avec renvoi ? la routine de traitement (Hasndling)
	attachInterrupt(digitalPinToInterrupt(rotencApin), rotencAchangeHandling, CHANGE);
	attachInterrupt(digitalPinToInterrupt(rotencBpin), rotencBchangeHandling, CHANGE);

	rotenc.stepIncrement = 1;
}

void loop()
{
	if (rotencPosNew)
	{
		Serial.print(F("Position:\t")); Serial.println(rotenc.posSteps);
		rotencPosNew = false;
	}
}

//------------------------------------- Rotary encoder Traitement des interruptions
void rotencAchangeHandling()     // Sortie A
{
	if (!digitalRead(rotencApin) == !digitalRead(rotencBpin))
	{rotenc.posSteps -= rotenc.stepIncrement;} else {rotenc.posSteps += rotenc.stepIncrement;}
	rotencPosNew = true;
}

void rotencBchangeHandling()     // Sortie B
{
	if (!digitalRead(rotencApin) == !digitalRead(rotencBpin))
	{rotenc.posSteps += rotenc.stepIncrement;} else	{rotenc.posSteps -= rotenc.stepIncrement;}

	rotencPosNew = true;
}

Tout cela est de l'intérêt d'étudier les interruptions et les codeurs rotatifs mais si c'est pour "lire" un simple codeur rotatif manuel tu as tout intérêt à utiliser une bibliothèque comme l'Encoder.

Cordialement
jpbbricole

1 Like