Reguler la vitesse de rotation d'un servomoteur

Bonjour à tous,
Je suis un débutant en matière d'arduino.
Je travaille sur un projet de verrou automatique avec une une temporisation de 20 seconde de l'ouverture et fermeture d' une armoire a pharmacie avec contrôle de l'ouverture par RFID.
le concept est simple, une led bleue clignotante signale que le verrou est en stand-by, une led verte indique l'ouverture du verrou, un afficheur a segment indique les 10 dernières secondes avant la fermeture automatique du verrou puis une led rouge s'allume 2 secondes et le cycle recommence.
Le prototype sur breadboard est satisfaisant mais j'aimerai toutefois que le servomoteur effectue sa rotation plus lentement.
Je ne pense pas qu'un potentiomètre est indiqué selon ce que j'ai appris.
Ma question première :
Peut-on réduire de moitié sa vitesse de rotation grâce au code? si oui; quelqu'un serait t'il m'aider a inclure ces lignes de codes au bon endroit dans le programme ?
Seconde question :
peut-on envisager d'ajouter un système de secours (en cas de problème RFID) grâce au module infrarouge KY*022IR et de la télécommande ?
La encore, un peu d'aide serait appréciable.
je met le code, ne soyez pas trop sévère avec moi, je ne suis qu'un débutant de 50 ans qui n'a que 1 semaine d'expérience en arduino. Merci à tous.

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
/**************************PARAMETERS******************************/
const int ipadd[4] = {3, 128, 69, 183}; //ip address à modifier selon la carte
int servoOpen = 90;
int servoClose = 0;
int delayBeforeClosing = 10000;
/******************************************************************/
// INPUT
#define SS_PIN 53
#define RST_PIN 9
// OUTPUT
const int servoPin = 49;
const int ledPin = 47;
const int ledPinR = 45;
Servo servo;
MFRC522 rfid(SS_PIN, RST_PIN);
bool approved = 0, oldApproved = 0;
// Init array that will store new NUID
byte nuidPICC[4];
void setup() {
 	Serial.begin(9600);
 	SPI.begin(); // Init SPI bus
 	rfid.PCD_Init(); // Init MFRC522
 	pinMode(ledPin, OUTPUT);
  pinMode(ledPinR, OUTPUT);
  pinMode(43, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
 	servo.write(servoClose);
 	servo.attach(servoPin);
 	Serial.println(F("Scan RFID NUID..."));
  digitalWrite(ledPinR, LOW);
}
void loop() {
   digitalWrite(43, HIGH);
    delay(25); // Wait for 500 millisecond(s)
    digitalWrite(43, LOW);
    delay(20000); // Wait for 500 millisecond(s)

 	readRFID();
 	if (nuidPICC[0] == ipadd[0]
 					&& nuidPICC[1] == ipadd[1]
 					&& nuidPICC[2] == ipadd[2]
 					&& nuidPICC[3] == ipadd[3]) {
 			approved = true;
 			if (approved != oldApproved) {
 					Serial.println(F("Card approved!"));
 					digitalWrite(ledPin, HIGH);
          digitalWrite(ledPinR, LOW);
 					servo.write(servoOpen);
 					delay(delayBeforeClosing);
          digitalWrite(2, HIGH);
          digitalWrite(3, HIGH);
          digitalWrite(4, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(7, HIGH);
          digitalWrite(8, LOW);
          delay(1000);
          digitalWrite(2, HIGH);
          digitalWrite(3, HIGH);
          digitalWrite(4, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(7, HIGH);
          digitalWrite(8, HIGH);
          delay(1000); 
          digitalWrite(2, LOW);
          digitalWrite(3, LOW);
          digitalWrite(4, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(7, LOW);
          digitalWrite(8, LOW);
          delay(1000); // Wait for 1000 millisecond(s)
          digitalWrite(2, HIGH);
          digitalWrite(3, HIGH);
          digitalWrite(4, HIGH);
          digitalWrite(5, LOW);
          digitalWrite(6, HIGH);
          digitalWrite(7, HIGH);
          digitalWrite(8, HIGH);
          delay(1000); // Wait for 1000 millisecond(s)
          digitalWrite(2, HIGH);
          digitalWrite(3, HIGH);
          digitalWrite(4, HIGH);
          digitalWrite(5, LOW);
          digitalWrite(6, HIGH);
          digitalWrite(7, HIGH);
          digitalWrite(8, LOW);
          delay(1000); // Wait for 1000 millisecond(s)
          digitalWrite(2, HIGH);
          digitalWrite(3, HIGH);
          digitalWrite(4, LOW);
          digitalWrite(5, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(7, LOW);
          digitalWrite(8, LOW);
          delay(1000); // Wait for 1000 millisecond(s)
          digitalWrite(2, HIGH);
          digitalWrite(3, LOW);
          digitalWrite(4, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(7, HIGH);
          digitalWrite(8, LOW);
          delay(1000); // Wait for 1000 millisecond(s)
          digitalWrite(2, HIGH);
          digitalWrite(3, LOW);
          digitalWrite(4, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(6, LOW);
          digitalWrite(7, HIGH);
          digitalWrite(8, HIGH);
          delay(1000); // Wait for 1000 millisecond(s)
          digitalWrite(2, LOW);
          digitalWrite(3, HIGH);
          digitalWrite(4, LOW);
          digitalWrite(5, LOW);
          digitalWrite(6, LOW);
          digitalWrite(7, LOW);
          digitalWrite(8, HIGH);
          delay(1000); // Wait for 1000 millisecond(s)
          digitalWrite(2, LOW);
          digitalWrite(3, HIGH);
          digitalWrite(4, HIGH);
          digitalWrite(5, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(7, HIGH);
          digitalWrite(8, HIGH);
          delay(1000); // Wait for 1000 millisecond(s)
          digitalWrite(2, LOW);
          digitalWrite(3, LOW);
          digitalWrite(4, LOW);
          digitalWrite(5, LOW);
          digitalWrite(6, LOW);
          digitalWrite(7, LOW);
          digitalWrite(8, LOW);   
                   
 			}
 			nuidPICC[0] = 0;
 			nuidPICC[1] = 0;
 			nuidPICC[2] = 0;
 			nuidPICC[3] = 0;
 	} else {
 			approved = false;
 			if (approved != oldApproved) {
 					Serial.println(F("Card incorrect!"));
 					digitalWrite(ledPin, LOW);
          digitalWrite(ledPinR, HIGH);                
 					servo.write(servoClose);
          delay(2000);
          digitalWrite(ledPinR, LOW);
 			}
 	}
 	oldApproved = approved;
}
//
void readRFID()
{
 	// Look for new 1 cards
 	if ( ! rfid.PICC_IsNewCardPresent())
 			return;
 	// Verify if the NUID has been readed
 	if ( 	!rfid.PICC_ReadCardSerial())
 			return;
 	if (rfid.uid.uidByte[0] != nuidPICC[0] ||
 					rfid.uid.uidByte[1] != nuidPICC[1] ||
 					rfid.uid.uidByte[2] != nuidPICC[2] ||
 					rfid.uid.uidByte[3] != nuidPICC[3] ) {
 			Serial.println(F("A new card has been detected."));
 			// Store NUID into nuidPICC array
 			for (byte i = 0; i < 4; i++) {
 					nuidPICC[i] = rfid.uid.uidByte[i];
 			}
 			Serial.print(F("RFID tag in dec: "));
 			printDec(rfid.uid.uidByte, rfid.uid.size);
 			Serial.println();
 	}
 	// Halt PICC
 	rfid.PICC_HaltA();
 	// Stop encryption on PCD
 	rfid.PCD_StopCrypto1();
}
/**
 		Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
 	for (byte i = 0; i < bufferSize; i++) {
 			Serial.print(buffer[i] < 0x10 ? " 0" : " ");
 			Serial.print(buffer[i], DEC);
 	}

}

il me semble que tu utilises cette librairie pour piloter ton servo ?
Je ne crois pas que cette librairie possède une fonction pour gérer la vitesse, en tout cas je n'en ais pas vu.
Donc il faut le gérer toi même en demande dans ton programme des angles intermédiaires en fonction de la vitesse que tu souhaites.
Mais il me semble qu'il existe des librairies qui permettent de définir la vitesse ?

Oui c'est tout a fait possible, si ton Arduino a encore une broches de disponible.
de la même façon que tu lis la puce RFID, il faut réceptionner le message envoyer par la télécommande infra-rouge avec une librairie dédié.
Les librairie offres souvent des exemples, comme par exemple IRremote

Le potentiomètre n'est pas une méthode pour ralentir, par contre, cela peut l'être pour définir la vitesse de rotation.
Donc je ne sais pas trop à quoi correspond ta remarque.

Bonsoir foxtrot70113

Changes de bibliothèque pour la VarSpeedServo
Elle permet de régler la vitesse et bien d'autres choses.

Pour le potentiomètre, si tu veux pouvoir régler cette vitesse pendant le fonctionnement, pourquoi pas. Mais, en fin de compte c'est VarSpeedServo qui s'occupe de ça.

Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.