Controller l'aiguille d'un disque dur

Bonjour,

Je cherche a contrôler une aiguille de disque dur HDD pour en faire un métronome.

J'ai fait des tests avec une carte Arduino UNO et un pont en H L298N.
D'après ces tests, quand l'aiguille est alimenter en +5V, elle va heurter l'axe du moteur, quand je l'alimente en -5V, elle se met à fond de l'autre coté.
J'ai essayer de l'alimente ne PWM pour tenter de mettre l'aiguille à une position intermédiaire : ça ne marche pas :sob:, mais ça fait de joli sons...

L'idée serait de pouvoir mettre l'aiguille autre part que sur les extrémités.

Toute aide sera la bienvenue pour m'aider sur ce projet...
Merci d'avance.

Bonsoir
Les bras des anciens dique dur etaient actionnevpar un moteur pas a pas
Les actionneurs actuel sont commandé en courant faut peut etre essayer avec une resistance en serie et faire un genre de generateur de courant.

Ah, je ne savais pas...
Ce qui est sur dans mon cas, s'est que l'aiguille est actionnée par une bobine placé entre deux aiments. Sa résistance est de 10,4 Ω.

Pourriez vous être plus précis ?
Je n'arrive pas a trouver plus d'infos sur internet...

Calculez une resistance en serie pour avoir 10 ma de courant sous 5v par exemple
Regardez le deplacement et ajustez la resistance pour avoir un courant plus grand ou plus petit si necessaire.
Determinez une resistance qui permet d avoir un déplacement qui convient
Puis essayez en pwm sous 5v pour observer ce qui se passe en changeant la valeur.

Si on neglige les 10 ohm
5v pour 10ma il faut 500 ohm essayez avec 470 si deplacement trop grand 1 k etc..
Si deplacement trop petit 220 ohm puis 100 ohm etc..
Methode empirique

D'accord, donc si je comprend bien, vous me dites de mettre une résistance en série avec la bobine du disque dur, et de l'ajuster afin du régler l'intensité qui traverse la bobine ?
Se sera donc un peut le même principe qu'un pont diviseur de tension, mais pas avec le même objectif…

Merci de votre réponse, je vais essayer ça demain.

Finalement j'ai testé ce soir.

Avec 470Ω en série, l'aiguille est à moin de 10⁰ de sa position max. Si j'augmente la valeur, l'aiguille ne bouge plus du tout...
En inversant l'alimentation, j'ai un débattement plus important, mais sa n'est pas ce qui m'intéresse...

Dans mon idée, il faudrait que l'aiguille soit au centre de la plage de son débattement en position "repos". Mais je vois qu'à +5V elle est a fond coté moteur, et a -5V, a fond de l'autre côté. Donc si mon analyse est bonne, il faudrait 0V pour qu'elle soit au centre. Impossible car si je ne l'alimente pas, elle est n'importe où sur son débattement...

Il y a une légère incompréhension du principe de fonctionnement.

  • Le système peut être assimilé à un galvanomètre sans ressort de rappel.
  • Lorsqu'on fait circuler un courant dans la bobine, une force de répulsion est créée qui tend à faire tourner le bras dans un sens ou dans l'autre suivant le sens du courant.
  • Tant que le courant circule, cette force existe et repousse donc le bras et ce quelque soit le courant. C'est pourquoi le bras va toujours en buté.
  • Plus le courant est élevé plus le couple est fort. Si le courant est très faible, il peut ne pas être suffisant pour dépasser le couple résistant causé par les frottements et le flex qui raccorde le bras à la carte électronique. C'est pourquoi lorsque le courant est faible le bras se déplace plus loin dans un sens que dans l'autre.

Il ne faut pas oublier que dans le disque dur, ce galvanomètre se trouve dans une boucle d'asservissement qui maintient le têtes au-dessus d'une piste magnétique. Le courant change en permanence pour garder la position.

Pour ton application, il faudrait monter une paire de ressorts qui tiendraient le bras en position centrale au repos. Ensuite il suffit d'appliquer une tension en dent de scie alternativement positives et négatives.

D'accord,
Merci de votre réponse très claire !

Je vais essayer ça se soir.

J'ai essayer, avec un rapport 50/50 et ce code :

int aig = 11;
int sens1 = 10;
int sens2 = 9;

void setup() {
  pinMode(sens1, OUTPUT);
  pinMode(sens2, OUTPUT);
  pinMode(aig, OUTPUT);

}

void loop() {
  digitalWrite(aig, HIGH);
  digitalWrite(sens1, HIGH);
  digitalWrite(sens2, LOW);
  delayMicroseconds(1); 
  digitalWrite(sens1, LOW);
  digitalWrite(sens2, HIGH);
  delayMicroseconds(1); 
}

L'aiguille fait un bruit horriblement aigue, mais ne bouge pas...

Si j'augmente la valeur du délai, sa ne change rien, le bruit deviens juste un peut plus grave.

Si je met, par exemple, 5us et 1us, l'aiguille se colle du coté ou la valeur est la plus forte, mais le résultat est le même que si je l'alimentait directement en 5V.

Je ne sais pas comment augmenter encor la fréquence, d'autant que je suis déjà au-delà des spécification technique du pont en H...

Bonsoir,

Je prend au vol le sujet, mais un métronome qui marche en microsecondes!

Ce n'est pas plutôt diminuer la fréquence pour augmenter la période qu'il faut faire?

Oui mais comme déjà expliqué, il faut travailler en courant pas en tension.
Et pour déplacer le bras il faut que le sens du courant change le fait de faire varier le rapport cyclique ne change pas le sens du courant.

En fait, le soucis s'est la course de l'aiguille.

En effet, pour la faire frapper le moteur, et fait un son, je vais d'abord la mettre du coté opposé, puis je change la polarité ce qui l'envoie frapper le moteur.
Mais, si je demande un rythme top rapide, elle n'a pas le temps de frapper le moteur car elle fait demis tours avant...

Donc l'idée serait d'arrêter l'aiguille au milieux de ça course, pour qu'elle est moins de distance a parcourir.

.

Désolé, mais je ne comprend pas...
Sa dépasse mes connaissances.

Pourriez vous me dire à quoi ça devrait ressembler dans la pratique ?
Merci d'avance.

Bonsoir,

Je me permet mes remarques:

fdufnews écrit

Le "pont en H" permet 2 choses.
1, régler dans votre cas, la distance maxi parcourue dans un sens à partir du point de repos, et cela, vous pouvez le régler avec le rapport cyclique (pour créer la dent de scie de @fdufnews )

2, de régler le sens de déplacement de l'aiguille

Si vous prefferez.
-l'aiguille est au repos, le pont H positionné sur sens 1, aller vers la gauche.
-vous faites varier progressivement le rapport cyclique de 0 (position repos) à 100% (à fond dans le sens 1, à gauche), l'aiguille va de + en + à gauche
-vous faites varier le rapport cyclique de 100% à 0, l'aiguille revient à sa position repos.
-vous inversez le sens du pont H

-vous faites varier progressivement le rapport cyclique de 0 (position repos) à 100% (à fond dans le sens 2, à droite), l'aiguille va de + en + à droite
-vous faites varier le rapport cyclique de 100% à 0, l'aiguille revient à sa position repos.

Etc ...

Votre code ne fait pas une dent de scie, et change trop rapidement de sens je pense.

Essayez un truc du genre

  digitalWrite(aig, HIGH);
  digitalWrite(sens1, HIGH);
  digitalWrite(sens2, LOW);
  delayMilliseconds(10); 

  digitalWrite(aig, LOW);
  delayMilliseconds(250); 

  digitalWrite(aig,HIGH);
  digitalWrite(sens1, LOW);
  digitalWrite(sens2, HIGH);
  delayMilliseconds(10);

  digitalWrite(aig, LOW);
  delayMilliseconds(250); 

ca fait un signal de période (grosso modo) de 520 ms, soit 1,92Hz.

Ce n'est pas un signal en dents de scie, mais vous pouvez augmenter la fréquence en diminuant le 250ms.

PS: j'ai modifié mon code initial en rajoutant un "delay"

Merci,
Je vais essayer sa ce soir.

@jef59, j'ai tester avec le bout de code que vous m'avez envoyer en faisant varier les différents délais :

  • A basse fréquence, l'aiguille va à toute vitesse d'un coté a l'autre
  • Avec une fréquence plus élevée, elle ne bouge plus, et fait un bruit très aigu

Bref, sa ne fonctionne pas...

Par contre, au fur a mesure des mes expérimentation, je me suis rendu compte que l'aiguille pouvait "battre" largement assez vite.
Donc vu que je n'ai pas beaucoup de temps pour ça en ce moment, tant pis pour le positionnement intermédiaire de l'aiguille.

J'ai refait un code qui va bien pour faire un métronome (jusqu'à 500BPM sans soucis) :

/*
- Arduino UNO
- Pont en H L289N sur circuit

11 -> ENA
10 -> IN1
9 -> IN2

*/

int aig = 11;
int sens1 = 10;
int sens2 = 9;

int LED = 13;

int rytme = 120; // Rytme en BPM
int temps = 4; // Nombre de temps


void setup() {

  freq = 60000/rytme; // conversion du rytme en frequence (ms)

  pinMode(sens1, OUTPUT);
  pinMode(sens2, OUTPUT);
  pinMode(aig, OUTPUT);

  Serial.begin(9600);
  Serial.println(freq);
}

void loop() {

  for( int i = 0; i< (temps-1); i++){
    digitalWrite(aig, HIGH);
    digitalWrite(sens1, LOW);
    digitalWrite(sens2, HIGH);
    delay(35); 

    digitalWrite(sens1, HIGH);
    digitalWrite(sens2, LOW);
    delay(freq-35);
  }

  digitalWrite(aig, HIGH);
  digitalWrite(sens1, LOW);
  digitalWrite(sens2, HIGH);
  delay(25); 

  digitalWrite(sens1, HIGH);
  digitalWrite(sens2, LOW);
  delay(freq-25);
}

Merci de votre aide !

Bonjour,

Pour moi, SI ma piste fonctionne, vous n'avez juste pas prit le temps de l'exploiter à fond.

Moi je ne suis pas à votre place devant votre machine pour voir ce qui se passe, ni dans votre cerveau pour voir ce que vous voulez.

Je devine seulement de ce que vous dites que si vous demandez à votre machine d'aller trop vite, elle n'a plus le temps de bien se déplacer, alors elle "vibre" et "siffle" autour d'une position médiane.

Par contre si vous lui demandez de faire de la

C'est, je pense, parce que votre "basse fréquence" n'est pas assez basse pour que l'aiguille aille lentement d'un coté à l'autre, mais l'aiguille va bien d'un côté à l'autre!

Par curiosité, je vais "prendre le temps" de regarder de plus prés votre code qui me semble à premiére vue tres particulier.

Dans l'absolu, vous mélangez période et fréquence, et oubliez que la péride, cnest le temps entre 2 coups du même coté, 1 coup d'un côté puis un autre de l'autre côté, pour moi, ce n'est pas un cycle complet.

comme l'indique @jef59, le nommage de tes variables est ambigu.
ce que tu appel freq est une période en millisecond.

Pourrait tu détailler ce que doit faire ton code?

Car pour moi dans un métronome les deux demi-période devrait être identique?

De même je ne vois pas ce que tu veux faire avec le nombre de temps de la mesure, suivi d'un aller-retour à une période différente?

Mon code sert a faire taper l'aiguille du disque dur sur le moteur.

Re voici le code avec plus de commentaire :

/*
- Arduino UNO
- Pont en H L289N sur circuit

11 -> ENA
10 -> IN1
9 -> IN2

*/

int aig = 11;
int sens1 = 10;
int sens2 = 9;

int LED = 13;

int rytme = 120; // Rytme en BPM
int temps = 4; // Nombre de temps


void setup() {

  freq = 60000/rytme; // conversion du rytme en frequence (ms)

  pinMode(sens1, OUTPUT);
  pinMode(sens2, OUTPUT);
  pinMode(aig, OUTPUT);

  Serial.begin(9600);
  Serial.println(freq);
}

void loop() {

  for( int i = 0; i< (temps-1); i++){ // on joue les 3 temps "faible"

    digitalWrite(aig, HIGH);           // on met l'aiguille du coté moteur
    digitalWrite(sens1, LOW);      
    digitalWrite(sens2, HIGH);   
    delay(35);                                  // delay de 35ms pour avoir un sons plus étouffé

    digitalWrite(sens1, HIGH);  // on met l'aiguille de l'autre coté 
    digitalWrite(sens2, LOW);
    delay(freq-35);                     // on attend la fin du temps pour continuer
  }

  //  temps "fort"
  digitalWrite(aig, HIGH);             // on met l'aiguille du coté moteur
  digitalWrite(sens1, LOW);
  digitalWrite(sens2, HIGH);
  delay(25);                                   // delay de 25ms pour avoir un sons plus aigue

  digitalWrite(sens1, HIGH);    // on remet l'aiguille de l'autre coté
  digitalWrite(sens2, LOW);
  delay(freq-25);                        // on attend la fin du temps
}

En relisant mes précédant message, je me rend compte que j'ai oublié (excusez en moi) de vous donner deux infos :

  • L'aiguille ne fait du bruit que si elle tape du coté moteur, de l'autre elle ne touche rien
  • En fonction du temps que passe l'aiguille du coté moteur, le sons est plus ou moins étouffé.

Je peut vous assurer que, par pas de 5ms, il n'y as pas d'état intermédiaire entre l'aiguille qui va à toute vitesse d'un coté et de l'autre, et l'aiguille qui ne bouge plus en faisant un bruit très aigue.

Maintenant, en écrivant ce message, je me dit que je pourrais faire un code qui ferait varier la fréquence avec un pas de 25us automatiquement pour voir quel sera le résultat...

tu utilises toujours le mot freq pour la période :frowning:
Si je ne me suis pas trompé, tu as une périodes de 500.
Ton code active le pont en H 35ms dans un sens, 500-35=465ms dans l'autre.
C'est vraiment ce que tu veux faire ?

Oui

Afin d'essayer de mettre l'aiguille dans une position intermédiaire, j'ai teste ce code :

int aig = 11;
int sens1 = 10;
int sens2 = 9;

int x = 0;
int y = 0;

void setup() {
  pinMode(aig, OUTPUT);
  pinMode(sens1, OUTPUT);
  pinMode(sens2, OUTPUT);

  Serial.begin(9600);
}

void loop() {
  for( int i = 0; i<100; i++ ){
    x=0;
    y=y+25;

    Serial.print("Changement de la durée d'allumage -> ");
    Serial.print(y);
    Serial.println("us");
    
    for( int i = 0; i<100; i++ ){
      x = x + 25;

      Serial.print("Changement de la durée entre l'allumage -> ");
      Serial.print(x);
      Serial.println("us");
      
      //for( int i = millis(); (millis()-i)<2000; i=i ){
      for( int i = 0; i<100; i++){
        digitalWrite(sens1, HIGH);
        digitalWrite(sens2, HIGH);
        digitalWrite(aig, HIGH);
        delayMicroseconds(y);
      
        digitalWrite(aig, LOW);
        delayMicroseconds(x);
      
        digitalWrite(sens1, LOW);
        digitalWrite(sens2, HIGH);
        digitalWrite(aig, HIGH);
        delayMicroseconds(y);
      
        digitalWrite(aig, LOW);
        delayMicroseconds(x);
      }
    }
  }
  for( int i = 0; i<1; i=i){
    delay(10000);
  }
}

Résultat : j'ai mal a la tête a cause du bruit affreux du disque dur, et il ne s'est rien passer, l'aiguille n'a pas bouger d'un pouce...