Controllare motore hard disk con Arduino

Salve a tutti, ho un vecchio hard disk ormai rotto e vorrei utilizzarne il motore per fare una sorta di resistenza a una jogwheel. In pratica, attraverso la un potenziometro sarà possibile regolare la resistenza applicata alla rotazione di questa jogwheel. Avevo pensato di farlo con un motore del genere appunto, accendendo tutte le fasi contemporaneamente e in base al valore del potenziometro mappare il delay.
Quindi per prima cosa vorrei chiedervi: secondo voi funziona questa idea?

Ho effettuato delle prove per capire come controllare il motore con arduino e tuttavia non funziona…
Ho seguito moltissimi tutorial che alla fine facevano sempre la stessa procedura e con lo stesso sketch.
Dei 4 pin sotto il motore dell’hard disk ho trovato quello comune e poi ho usato il modulo driver incluso nel mio kit arduino per provare a controllarlo.
Il modulo è questo: ULN2003APG | Arduino stepper, Arduino stepper motor control, Stepper motor con il chip uln2003apg.
Vi spiego come ho connesso il tutto: ho collegato ai primi 3 in i pin digitali di arduino corrispondenti alle fasi che si attiveranno, ho collegato un generatore esterno da 12V stabilizzato a 5A ai due pin relativi (prima ho unito la passa di arduino e quella del generatore per evitare casini), ai pin di uscita in cui va collegato il motore in ordine partendo dal lato più esterno alla scheda ho collegato il pin comune e a seguire le altre tre fasi.
Una volta caricato lo sketch comunque il motore non dava segni di vita…
Lo sketch è questo:

int phase1 = 2;
int phase2 = 3;
int phase3 = 4;
int led = 12;

unsigned long stepLength = 40000;
int minStepLength = 1400;
int steps = 5;

void setup() {
  pinMode(led, OUTPUT);  
  pinMode(phase1, OUTPUT);
  pinMode(phase2, OUTPUT);
  pinMode(phase3, OUTPUT);
  digitalWrite(led, LOW); 
}

void loop() {
  switchStep(1);
  switchStep(2); 
  switchStep(3);
  
  if(stepLength > minStepLength)
  {
    stepLength = stepLength - steps;
  } else {
    // set the minimum pulse length
    stepLength=minStepLength;
  }
  
  if (stepLength < 39950) {
    digitalWrite(led, HIGH);   // second gear
    steps = 300;
  }
   
  if (stepLength < 20000) {
    digitalWrite(led, LOW);      // third gear
    steps = 50;
  }

  if (stepLength < 3000) {
    digitalWrite(led, HIGH);      // fourth gear
    steps = 2;
  }
}


void switchStep(int stage)
{
  switch(stage)
  {
  case 1:
    digitalWrite(phase1, HIGH);
    digitalWrite(phase2, LOW);
    digitalWrite(phase3, LOW);
    myDelay(stepLength);
    break;
    
  case 2:
    digitalWrite(phase1, LOW);
    digitalWrite(phase2, HIGH);
    digitalWrite(phase3, LOW);
    myDelay(stepLength);
    break;
    
  default:
    digitalWrite(phase1, LOW);
    digitalWrite(phase2, LOW);
    digitalWrite(phase3, HIGH);
    myDelay(stepLength);
    break;
  }  


}

void myDelay(unsigned long p) {
if (p > 16380) {
  delay (p/1000);
  } else {
  delayMicroseconds(p);
  }
}

In pratica fa partire il motore a velocità bassa aumentandola piano piano.

Non funziona nulla però, le luci sulla scheda driver si accendono e si vede che la l’intermittenza è sempre più veloce fino a diventare impercepibile.

A questo punto ho pensato che il motore sia rotto, però aprendolo le bobine sembrano apposto, però magari ci sarà qualcosa invisibile ad occhio.

Aspetto vostre risposte, grazie :slight_smile:

Non so che tipo di motore sia quello del tuo hard disk. Ipotizzando che sia uno stepper, hai provato a misurare la resistenza fra le coppie di fasi del motore? Questo nell'ipotesi che siano fisicamente accessibili.
A questo indirizzo trovi una guida che ti spiega come identificarle e come fare diagnosi col tester sulle medesime.

tutorial-motore-bipolare-passo-passo-riconoscere-le-fasi

I motori degli hard disk in genere sono brushless trifase da alimentare (in corrente controllata perche' le bobine hanno resistenze abbastanza basse) simulando tre sinusoidi sfasate di 120 gradi ... non so se possano essere pilotati come se fossero stepper, ma ne dubito fortemente ...

Se ti serve come freno, puoi semplicemente cortocircuitare tutte le fasi, dovrebbe comportarsi come un freno elettromagnetico ... altrimenti, dovrai probabilmente usare un driver per brushless trifase, oppure un driver per voice-coil trifase se e' molto vecchio (dipende da modello e costruzione, ma quelli nuovi sono di solito brushless) ...

Etemenanki:
I motori degli hard disk in genere sono brushless trifase da alimentare (in corrente controllata perche' le bobine hanno resistenze abbastanza basse) simulando tre sinusoidi sfasate di 120 gradi ... non so se possano essere pilotati come se fossero stepper, ma ne dubito fortemente ...

Se ti serve come freno, puoi semplicemente cortocircuitare tutte le fasi, dovrebbe comportarsi come un freno elettromagnetico ... altrimenti, dovrai probabilmente usare un driver per brushless trifase, oppure un driver per voice-coil trifase se e' molto vecchio (dipende da modello e costruzione, ma quelli nuovi sono di solito brushless) ...

Sì è un motore brushless, l'unico problema è che non riesco davvero a farlo funzionare. Lo sketch che ho postato in tutti i video faceva girare il motore, però a me non funziona...
Ho misurato la resistenza tra le coppie di pin e ho individuato quello comune e ho quindi collegato tutto di conseguenza, ma nulla, non va...

Il chip su quel driver dovrebbe essere un array di transistor, quindi non penso che il driver sia il problema. Oltretutto sono transistor Darlington come quelli che consigliavano nel video che più ho seguito, ovvero il seguente: Hard disk motor op arduino - YouTube

Ora l'unica cosa che non mi torna è la sinusoide di cui parli, io sto usando i pin digitali di arduino, dovrei ottenere una quadra o vado errato?

Si, puo andare anche con un'onda quadra, ma ovviamente andra' un po a scatti, non fluido come sull'hard disk ... pero', che resistenza hai misurato sulle bobine ? ... non e' che sia troppo bassa e ti mandi in tilt i transistor, o piu probabilmente l'alimentatore, se non ce la fa a fornire abbastanza corrente ?

Inoltre, per sicurezza, servirebbero i tre diodi di ricircolo, o sulle bobine o sui transistor, perche' si rischia di strinarli, e' pur sempre un carico induttivo ... per giunta, pilotato ad impulsi ...

Ciao ragazzi, scusate se non mi sono più fatto sentire, allora:
ho trovato un video youtube abbastanza esplicativo e chiaro grazie al quale sono riuscito ad individuare il comune e come controllare le tre fasi.
Fino a questo punto tutto bene, mi sono fatto il circuito raffigurato nel video sulla breadboard usando i transistor TIP120.
La prima prova tutto bene.
Giorni dopo ho riprovato con altri transistor di potenza (usati generalmente negli amplificatori audio) ed è successa una cosa strana, ovvero poggiando (sì non ho ancora saldato nulla ahah) i jumpers sui pin dell'hard disk si aveva una rotazione ma alla seconda fase si otteneva una scintilla e dopo questa non funzionava più nulla...
Premettendo che mi sono servito dell'aiuto di un'altra persona per poggiare i pin sulle fasi dell'hard disk e che per scomodità abbiamo usato solo due delle tre fasi del motore e siamo stati attentissimi a non far toccare i pin tra di loro, il circuito lo ho ricontrollato più volte ed era tutto apposto...
Il circuito è identico a quello dello schema che si vede nel video al minuto 4:47, tranne che per i diodi, quelli non li ho messi.
Dopo la scintilla il transistor relativo alla fase che aveva scintillato non funziona più (o almeno al momento non funzionava più, quindi poi effettuerò altre prove in altri circuiti magari).
Lo sketch usato è stato un semplice digitalWrite HIGH e dopo delay quello LOW per ogni fase (tutte insieme ovviamente dato che deve essere un freno magnetico). Ho provato anche con lo sketch che fa invece girare il motore usato nel video e disponibile nella descrizione dello stesso, ma nulla, le scintille si verificano lo stesso.
Come alimentazione esterna ho preso i 12V da un alimentatore per pc.
A cosa potrebbero essere dovute le scintille? Quei diodi nel circuito li dovrei mettere e perchè? Può essere che se saldo i fili non ottengo più risultati del genere? E' normale che i transistors si scaldino un pochino (diventano tiepidini)?

Aspetto con ansia le vostre risposte :slight_smile:

Il link del video che ho seguito è questo: Hard disk motor op arduino - YouTube

  1. col ULN2003 non ho capito dove avevi collegato il comune del motore.
  2. col TIP120 hai messo diodi di protezione?
    Ciao Uwe

uwefed:

  1. col ULN2003 non ho capito dove avevi collegato il comune del motore.
  2. col TIP120 hai messo diodi di protezione?
    Ciao Uwe

Ciao Uwe, allora quell'integrato lo ho lasciato perdere, avevo sbagliato i collegamenti e lo ho fuso...
Per quanto riguarda il circuito col TIP120 mi chiedevo appunto a cosa servissero quei diodi, perchè al momento non li ho messi. Potresti spiegarmi il loro funzionamento nel circuito?
Cioè, io so che è per evitare una sorta di ritorno, ma la scintilla che avviene è una cosa normale quando i pin sono volanti in questo caso? Se metto i diodi semplicemente la scintilla si verifica lo stesso ma fondo loro invece dei TIP120?
Se è così allora oltre ai diodi bisogna capire cos'altro non va :\

Intanto, quando si parla di carichi induttivi, NON BISOGNEREBBE MAI collegare i fili “al volo” mentre c’e’ tensione … la “scintilla” potrebbe essere il normale picco di corrente dell’assorbimento extratensione momentaneo all’apertura del carico (EDIT: errore mio, scusate), ma puo facilmente diventare un picco anche ripetitivo di extratensione (che potrebbe arrivare anche al centinaio di volt con facilita’ ) dato dal veloce attacco-stacco del circuito (di cui magari neppure ti accorgi, tanto e’ veloce), e questo puo facilmente strinare il transistor (anzi, mi sa che l’hai gia strinato) … il diodo in antiparallelo serve proprio per “spegnere a massa” l’extratensione inversa generata dalla bobina quando si scollega l’alimentazione (o come nel tuo caso, quando “fa la scintilla” per scarso contatto) … i carichi, tutti, ma specialmente quelli capacitivi o induttivi, vanno SEMPRE collegati con connessioni stabili, preferibilmente saldature o morsetti a vite, MAI volanti …

@Etemenanki
Con induttanze e corrente continua non hai picchi di corrente di accensione ma picchi di tensione nella interruzione della alimentazione (corrente). Un induttanza ha la tendenza di mantenere stabile la corrente (condensatore tiene costante la tensione) e perci quando una viene separata dall alimentazione crea per via della controinduzione un picco di tensione inverso alla alimentazone precedente per cercare di tenere costante la corrente che circolava nella induttanza prima della interruzione.

Ciao Uwe

uwefed: lo so, io mi riferivo al fatto che lui collegasse il motore "al volo" facendo toccare un filo sul contatto in presenza di tensione ... questo e' l'equivalente di un "mega-rimbalzo" da interruttore difettoso, se il filo non viene saldato o tenuto ben premuto in contatto ... decine, o centinaia, di connessioni e disconnessioni velocissime dovute al possibile sfregamento del filo sul contatto, anche se per poco tempo ... immagina quanti picchi di extratensione possono essere arrivati a quel povero transistor, con tutte quelle disconnessioni velocissime, nel tempo che a lui e' sembrata solo "una scintilla" ... :wink:

Grazie mille ragazzi, siete stati utilissimi!
Avevo il sospetto che fosse anche dovuto ai fili volanti ma non me lo sapevo spiegare ahah
Ora, che diodi mi consigliate di usare per sistemare la questione?

Etemenanki:

uwefed: lo so, io mi riferivo al fatto che lui collegasse il motore "al volo" facendo toccare un filo sul contatto in presenza di tensione ... questo e' l'equivalente di un "mega-rimbalzo" da interruttore difettoso, se il filo non viene saldato o tenuto ben premuto in contatto ... decine, o centinaia, di connessioni e disconnessioni velocissime dovute al possibile sfregamento del filo sul contatto, anche se per poco tempo ... immagina quanti picchi di extratensione possono essere arrivati a quel povero transistor, con tutte quelle disconnessioni velocissime, nel tempo che a lui e' sembrata solo "una scintilla" ... :wink:

Tutto questo non dubito.
Non mi piaceva la Tua affermazione di "picco di corente dell'assorbimento del carico,"

Ciao Uwe

uwefed:
...
Non mi piaceva la Tua affermazione di "picco di corente dell'assorbimento del carico,"
...

Si, quello e' stato un mio errore di scrittura, parlavo di picchi di extratensione e per distrazione ho scritto corrente di assorbimento (e finche' non me l'hai fatto notare, neppure me n'ero accorto ... corretto adesso, grazie)

Risolto; allora ci siamo capiti.
Ciao e buona giornata Uwe