Problema surriscaldamento stepper

Salve a tutti :)!
Premetto che sono abbastanza un principiante in elettronica...

Per il primo progetto "serio" avevo preso questo motore stepper: 193314 - PM42L-048-17 950g-cm Unipolar Stepper , da Phidgets a € 8,33 su Robot Italy e uso un darlington array per controllarlo, come nel tutorial MotorKnob.

C'è scritto che è da 12 volt, ma siccome non ho bisogno nè di velocità nè di coppia (deve ruotare un foglio di carta) alimento lui e arduino a 9 volt.

Così com'è funziona perfettamente, ma si surriscalda notevolmente anche quando è fermo, arriva a 44 gradi, e dato che c'è della carta vorrei evitarlo...
Volevo sapere se c'è un modo di tenerlo "spento" quando non deve girare.
Ho provato con un MOSFET IRF520, e anche con un fotoaccoppiatore che controlla il mosfet usando i 9 volt sul gate, ma il motore non si muove. Il circuito sembra essere giusto perchè riesco ad accendere e spegnere un led, ma il motore finora non fa un passo... Ho anche provato ad usare i 12 volt, ma non è cambiato niente

posta lo schema elettrico e il codice, altrimenti andiamo alla ceca.

Per esempio la prima impressione che ho è dire che stai pilotando lo stepper come un comune DC...

Eh, non ho uno schema elettrico, sto sperimentando… Vedrò di farlo.
Comunque, è un fotoaccopiatore connesso al pin A0, la cui uscita è connessa al gate di un mosfet N (la source è a terra) il cui drain è connesso ai due cavi di alimentazione dello stepper e all’alimentazione del darlington array. Poi quattro cavi collegano i pin 2,3,4 e 5 al darlington, e dall’altra parte dello stesso ci sono i cavi dello stepper.

Il codice eccolo qua, c’è la parte sul Bluetooth ma per il momento uso il serial del pc

#include <Stepper.h>

#define STEPS 48
Stepper stepper(STEPS, 2, 3, 4, 5);

int redLed = 9;   
int greenLed = 10;
int blueLed = 11;

int controlLed = A5;

int AngoloStep=0;
int NewAngoloStep=0;
int AngoloStepDelta=0;

void setup() {
    
  Serial.begin(9600);  
  pinMode(13,OUTPUT);
  
  setupBlueToothConnection();
  
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
    
  // set the speed of the motor to 15 RPMs e prepara il pin di controllo del fotoaccoppiatore
  stepper.setSpeed(30);
  pinMode(controlLed,OUTPUT);
  digitalWrite(controlLed,HIGH);
  
  
  //analogWrite(redLed, 129);
  digitalWrite(13,HIGH);

}

void loop() {
    char rCh;
    delay(5);
    if(Serial.available()){//check if there's any data sent from the remote bluetooth shield
      rCh = (char)Serial.read();
      int rval=0;

      //Aggiorna i colori dei led
      if (rCh == 'r'){
        rval = Serial.parseInt();
        red(rval);
      }
      if (rCh == 'g'){
        rval = Serial.parseInt();
        green(rval);
      }      
      if (rCh == 'b'){
        rval = Serial.parseInt();
        blue(rval);
      }
      
      //Muovi il motore fino al NewAngoloStep
      if (rCh== 'a'){
        NewAngoloStep=Serial.parseInt();  
        
        AngoloStepDelta=NewAngoloStep-AngoloStep;
        AngoloStep=NewAngoloStep;
        
       /* Serial.print("AngoloStepDelta = ");
        Serial.print(AngoloStepDelta);
        Serial.flush();
        */
        moveStepper(AngoloStepDelta);
      }
    } 
}

void setupBlueToothConnection()
{
  
  Serial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  Serial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  Serial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  Serial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  Serial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable 
  Serial.println("The slave bluetooth is inquirable!");
  delay(2000); // This delay is required.
  Serial.flush();
}

void red(int redval){
  analogWrite(redLed, redval);
}


void green(int greenval){
  analogWrite(greenLed, greenval);
}


void blue(int blueval){
  analogWrite(blueLed, blueval);
}

void moveStepper(int AngoloStepPar){
  digitalWrite(controlLed,HIGH);
  delay(2);
  stepper.step(AngoloStepPar);
  delay(5);
  digitalWrite(controlLed,LOW);
}

Comunque non credo di sbagliare a pilotare il motore, come ho detto funziona e gira come dovrebbe, quando è connesso direttamente all’alimentazione. Ma quando è connesso al drain del mosfet, non dà segni di vita. Però un led di prova si accende…

mi inserisco pure io perchè sono interessato all' argomento...anche io ho lo stesso problema ma uso l6208 della st ...sta di fatto che anche a me scalda tantissimo , sarà che è normale che raggiunga quella temperatura visto che parliamo di elettronica e non di essere viventi ma per me scalda un po' troppo sia il motore sia il driver, può essere colpa della bassa alimentazione che causa una caduta di tensione maggiore sui mosfet, ma per quanto riguarda i motori non so come fare nemmeno io.
però è ovvio che scalda se rimane fermo se ci colleghi un amperometro vedi quanta corrente circola e basta fare resistenza di avvolgimento*corrente da fermo e vedi quanti W disperde...
mi scuso ancora per l' intromissione , saluti !!
questo è il video dove provo il driver scusate la qualità complessiva haha

Risolto. Non mi ero reso conto che il led era già collegato a +9 volt e che il transistor lo collegava quindi a terra, mentre ovviamente il motore ha bisogno di essere collegato al voltaggio positivo. Ho collegato quindi il drain non più a terra ma ai 9 volt. Per ora sembra che tutto funzioni

Ho parlato troppo presto, adesso sembra sempre acceso... Vabbé ci penserò domani.

secondo me se prendi un oglio di carta e disegni lo schema elettrico come lo hai collegato (e non come lo vorresti) qualche magagna salta fuori.. se no scannerizzzi e posta qui :slight_smile:

  1. Un motore passo passo viene alimentato sempre e percui si riscalda sempre.
  2. Il motore passo passo ha molto poca forza quando non é alimentato.
  3. Il motore passo passo regge temperature tra 80 e 120 gradi
  4. Il motore nominato (12V e 280mA) ha una dissipazione di energia di 3,3W o 6,6W a secondo del tipo di pilotaggio.
    Puoi spegnere il motore mettendo quando il motore é fermo tutte le uscite dove é collegato il motore a LOW. Nel caso dello sketch incollato i pin 2,3,4,5.
    "Stepper stepper(STEPS, 2, 3, 4, 5);"

Ciao Uwe

Bene, il problema era che un transistor N ha bisogno di avere la source collegata a terra, mentre qua devo collegarla per forza a 9v. Ho sostituito il mosfet N con uno P e adesso funziona come previsto. Beh, spero solo di non aver rotto il mosfet N...

Comunque probabilmente farò come dice Uwe, che risparmio un pò di pezzi. Grazie a tutti per la disponibilità :slight_smile: !

Però già che ci sono chiedo una cosa, il Bluetooth aveva preimpostato un baudrate di 38400, così ho provato a usarlo, ma sembra che non riesca a inviare i dati ma solo a riceverli. E comunque, al di là del bluetooth, se connetto arduino al pc ma con il baudrate invece che a 9600 a 38400 ricevo solo caratteri incomprensibili. Se tento di cambiare il baudrate sul pc con il menù a tendina, ricevo un errore:

Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
	at java.lang.String.substring(String.java:1937)
	at processing.app.SerialMonitor$6.actionPerformed(SerialMonitor.java:137)
	at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1240)
	at javax.swing.JComboBox.setSelectedItem(JComboBox.java:567)
	at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:603)
	at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:816)
	at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
	at java.awt.Component.processMouseEvent(Component.java:6263)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:480)
	at java.awt.Component.processEvent(Component.java:6028)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2475)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

hai una vecchia versione di ide, scarica la 1.0.4 o usa la lingua inglese x l'errore

per il baud rate se leggi a 9600, allora il baud del modulo è quello... magari devirisettarlo ogni riavvio?

Ho aggionato e adesso funziona da pc, ma il bluetooth no. Il bluetooth è questo, Bluetooth Shield‏‎ - Seeed Wiki, dovrebbe supportarlo, però non riesco neanche a connettermi con questo codice:

void setup() {
  Serial.begin(38400);
  setupBlueToothConnection();
}

void loop() {
  char rCh;
  if(Serial.available()){
    rCh=(char)Serial.read();
    Serial.print(rCh);
  }
}

void setupBlueToothConnection()
{
  
  Serial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  Serial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  Serial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  Serial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  Serial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable 
  Serial.println("The slave bluetooth is inquirable!");
  delay(2000); // This delay is required.
  Serial.flush();
}

Anche senza attaccarlo all'usb, sembra che il serial Hardware non funzioni con questo modulo. Resta il serial software, che sembra funzionare, ma avrei voluto evitarlo, vabbè.

se funziona il soft sunziona anche l'HW.. non è che hai lasciato aattaccato il serialmonitor del PC? sicuro che sia 38400 e non 9600??

Sono sicuro, non era attaccata al pc, era attaccata col jack. E il modulo bluetooth era già preimpostato a 38400, se non va bene quello preimpostato... Comunque il serial software va, a 38400.
Soprattutto, il modulo bluetooth non "sa" se i dati gli arrivano dal software o dall' hw, dato che devo scegliere fisicamente i pin da cui ricevere dati con dei connettori, e come farebbe a distinguere? Io penso sia un problema del serial hw del mio Arduino.

se così fosse non potresti caricare gli skecth.

evita l'udo di Serial.flush(); che ha cambiato signficato nelle varie versioni di IDE e tra Soft e HardSerial.. magari basta solo quello.

poi posta il codice funzionante (soft) e quello non funzionate (hard) e vediamo che cambia.

Basta, sto diventando scemo, alcuni programmi di prova funzionano e arduino riesce a inviare ma il mio originale no. Quindi mi accontento, tutti i dati staranno sul tablet che li reinvierà all'avvio. Vorrei almeno sapere se qualcuno è riuscito a far funzionare questo shield Bluetooth... Comunque per ora basta così, grazie a tutti per l'aiuto.