Servo et lecteur audio VS1053

Bonjour,
Je suis sur une réalisation de passage à niveau.
Fermeture à l'aide de servo SG90.
Sonnerie enregistrée sur une micro-SD et lue via une carte shield VS1053.
Arduino UNO.
Globalement cela fonctionne.
Mais, lors de la fermeture des barrières, donc quand la sonnerie est activée, je constate des à coups sur le servo (que je ne vois pas à l'ouverture).

Qui aurait une idée sur les causes et une idée de correction?

Jean-Michel

Bonjour Jean-Michel,
Pourriez vous poster votre code, s'il vous plaît ?
Je ne pense pas que le problème vienne du matériel... Après je ne suis pas un grand connaisseur des servomoteurs, donc je peux me tromper.

Bonne soirée,
Cordialement
Pandaroux007

Bonsoir,

Ci-dessous le code.
Pour la partie VS1053, j'avoue ne pas avoir compris toutes les lignes de code.
A l'appui d'un bouton poussoir (sur A4), la sonnerie se déclenche et la barrière s'abaisse.
La sonnerie s'arrête 2s une fois que la barrière est en bas.
Appui sur l'autre bouton, la barrière se relève.
Il y aura aussi une commande de led clignotante.

/**
* Commande d'un PN SAL
*/
//Librairies
#include <Servo.h>        
#include <SPI.h>
#include <SdFat.h>
#include <vs1053_SdFat.h>

int track;
int8_t current_track = 0;

int speedServo = 50;  // Regle la vitesse de mouvement des barrieres
int posServo; // position courante
int posOuvert = 135;  // barriere a 10° de la verticale
int posFerme = 0; // barriere a l'horizontale (90° de la verticale)

//Instanciation de la librairie SERVO
Servo servo1;
//Instanciation de la librairie SdFat
SdFat sd;
 //Instanciation de la librairie vs1053
vs1053 MP3player;

void setup() {
 
  Serial.begin(115200);
  servo1.attach(10); // servo sur pin 10
  // initialisation des barrieres en position fermee
  servo1.write(posOuvert); // barriere 1 OUVERTE à l'initialisation
  delay(2000);
  pinMode (A5, INPUT_PULLUP); //commande manuelle ouverture
  pinMode (A4, INPUT_PULLUP); //commande manuelle fermeture

  if(!sd.begin(9, SPI_HALF_SPEED)) sd.initErrorHalt();
  if (!sd.chdir("/")) sd.errorHalt("sd.chdir");

  MP3player.begin();
  MP3player.setVolume(10,10);
}  
// fin de setup

void loop() {

// Below is only needed if not interrupt driven. Safe to remove if not using.
  #if defined(USE_MP3_REFILL_MEANS) \
    && ( (USE_MP3_REFILL_MEANS == USE_MP3_SimpleTimer) \
    ||   (USE_MP3_REFILL_MEANS == USE_MP3_Polled)      )
  MP3player.available();
  #endif

    // ouverture barriere
    if (digitalRead(A5) == LOW){
      while (posServo <= posOuvert){
      posServo = posServo + 1;
      servo1.write(posServo);
      delay(speedServo);
      }
    }  
 // fermeture barriere
 if (digitalRead(A4) == LOW){
      MP3player.playTrack(1); //début sonnerie
      while (posServo >= posFerme){
      posServo = posServo - 1;
      servo1.write(posServo);
      delay(speedServo);
    }
    delay (2000);
    MP3player.stopTrack();  //arret sonnerie
 }
  
}  // fin de loop

Cordialement
Jean-Michel

Il semblerait que la librairie VS1053 utilise une interruption pour remplir le buffer du circuit. Pendant le traitement de cette interruption i est possible que celle utilisée par la librairie servo ne soit pas servie.
Si la SDcard le supporte, en utilisant SPI_fULL_SPEED à la place de SPI_HALF_SPEED les transferts de la SD card vers le VS1053 seront plus rapides et bloqueront moins longtemps le reste du code.

Bonjour,

Effectivement je pensais à quelque chose en rapport avec une interruption.
J'ai remplacé le HALF par FULL mais cela n'améliore pas franchement le mouvement. Toujours des saccades.
Je vois deux solutions: je remplace la VS1053 par une carte indépendante genre Module de lecture vocale DY-SV5W que je pilote via un relais ou bien je pilote le servo depuis un ATTiny45.

Jean-Michel

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