Misurare e registrare lo sforzo di un motore

Buongiorno a tutti.

Apro questo 3D per chiedervi consiglio sulla lista della spesa per il mio primo progetto con Arduino.

Funzionalità del progetto

a) Il sistema deve misurare e registrare lo sforzo che fa un motore a posizionarsi da 0° a -30° e da 0° a 30°.

b) La forza che deve esprimere il motore dev'essere di circa 200 grammi ( deve muovere un elemento meccanico piccolo e delicato )

c) Deve raggiungere le posizioni sopra indicate in (circa) 6 secondi

Considerazioni sull'Hardware

d) Scelta e dimensionamento del motore

Per il posizionamento dell'albero motore sarebbe scontato utilizzare uno stepper,
ma avrei difficoltà a misurarne lo sforzo nel movimento.
Con un motore DC potrei misurare e registrare la corrente assorbita nel movimento per determinare lo sforzo,
ma avrei necessità di un encoder per leggere il posizionamento dell'albero.
Per ottenere una velocità del motore così blanda ( 1 giro ogni 72 secondi) non vorrei utilizzare un riduttore ( ne aumenterebbe la potenza in trazione ). Posso gestire la cosa con un potenziometro ?
Esempi di motori in commercio ?

e) Scelta Encoder
I motori DC Encoder economici che trovo in commercio sono di tipo "incrementale" e spesso non hanno scheda tecnica a corredo. Posso aggiungere ad un motore DC un encoder Assoluto ? La precisione di posizionamento non dev'essere elevata. La tolleranza può essere di +-5°

f) Scelta della scheda di controllo
Ho un aduino uno di qualche anno fa. E' sufficiente ?

g) posso pilotare un motore DC di bassa potenza direttamente da Arduino ? Cosi facendo mi è più semplice registrare i dati di assorbimento di corrente ? Oppure mi affido a un driver ?

Sono aperto a ogni consiglio.
Grazie a tutti per il tempo e la pazienza.

Salute
LMD

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Aggiusto il tiro del primo post.

Volendo usare un servomotore di quelli che escono dai kit, tipo l'HTX900, posso misurarne la corrente assorbita con un ACS712 ?
Esiste un sensore di corrente più sensibile, per leggere correnti nell'ordine delle centinaia di milliampere ?

Salute

Questo potrebbe essere una valida alternativa.

Ciao, Ale.

non so

ho un dubbio

temo i motori dei servo siano azionati in PWM

e il sensore INA219 fa le misure campionando

temo che ogni tanto legga 0, ogni tanto legga una corrente elevata

ma senza sapere le due frequenze del PWM e del campionamento, temo non sarà facile fare le medie

intorno a gennaio ricordo uno che chiedeva una cosa simile, ma mi sembra che abbia lasciato perdere....

Se usi un servo da modellismo, non so se ne esistano di "digitali" che incorporino anche feedback come le unita' industriali ... se usi un motore DC con motoriduttore, e le due posizioni da raggiungere sono sempre le stesse, ti bastano tre forcelline ottiche ed un disco di plastica o alluminio con delle tacche o fessure ... che poi ti darebbero una posizione anche piu precisa, se i 30 gradi li devi fare lentamente (parli di 6 secondi), e senza bisogno di encoder ...

Per quanto riguarda invece la misura dello sforzo, serve sapere se ti basta un'indicazione "di massima", e allora anche leggere la corrente del motore puo andare (ma ti devi fare tu una tabella comparativa prima, facendo dei test applicando determinate forze al motore e leggendo le correnti), o se ti serve una misura il piu precisa possibile, e qui mi viene in mente un'idea cattivissima sull'uso alternativo delle celle di carico :wink:

Ma poi lo sforzo che devi misurare e' rotativo (sull'asse del motore) o lineare (su una leva o altro elemento mosso dall'asse) ? ... ed e' quello del motore, del riduttore, o quello applicato dal sistema all'oggetto finale ?

Standardoil:
...
temo i motori dei servo siano azionati in PWM
...

Credo dipenda dai modelli ... la maggior parte di quelli "economici" usano ancora il vecchio M51660L della Mitsubishi, o una delle sue tante copie ... questo e' piu o meno il datasheet, dallo schema si vede che usa un ponte mezzo dentro l'integrato (gli NPN) e mezzo fuori (i PNP), ma non specifica molto altro ... alcuni invece si sono fatti i loro integrati, e se sono custom non si trovano datasheet ... poi se sono digitali potrebbe esserci di tutto, ma in genere c'e' dentro una piccola MCU o un controller, ad esempio come in questodella hitec dove dallo schema si vede la presenza di un'AT90LS4433A ... mi sa che l'uni co modo per saperlo di sicuro e' munirsi di oscilloscopio e motosega utensili per aprire il servo ...

Grazie a tutti per gli spunti.

Standardoil:
temo i motori dei servo siano azionati in PWM

Hai centrato il mio dubbio. Sono motori DC pilotati tramite PWM.
Come si comporta la corrente assorbita in funzione del tempo,
da un motore DC pilotato tramite PWM,
con un aumento costante e lineare dello sforzo del motore ?
(ho trovato in rete tesi suo motori DC con formule matematiche al di fuori della mia portata.)

ilguargua:
Questo potrebbe essere una valida alternativa.

Avevo visto questa scheda ma non ho trovato nessun tutorial in italiano sul suo utilizzo.
Comunque da questo sito si evince che è più sensibile dell'ACS712 . Indirizzo li il mio acquisto.
Grazie.

Etemenanki:
... se usi un motore DC con motoriduttore, e le due posizioni da raggiungere sono sempre le stesse, ti bastano tre forcelline ottiche ed un disco di plastica o alluminio con delle tacche o fessure ...

Dato che il progetto è ancora in fase embrionale, e conoscendo eventuali necessità di future modifiche,
la funzionalità, versatilità ed economicità dei servo 0° 180° da modellismo mi renderebbe la vita molto facile.
Troppo bello per essere vero ... tengo il tuo consiglio come ultima spiaggia.

Etemenanki:
Per quanto riguarda invece la misura dello sforzo, serve sapere se ti basta un'indicazione "di massima", e allora anche leggere la corrente del motore puo andare (ma ti devi fare tu una tabella comparativa prima, facendo dei test applicando determinate forze al motore e leggendo le correnti), o se ti serve una misura il piu precisa possibile, e qui mi viene in mente un'idea cattivissima sull'uso alternativo delle celle di carico :wink:

Dovendo misurare il lavoro dell'albero del motore durante il suo posizionamento,
credo che misurare la corrente assorbita da un motore DC sia la soluzione ideale.
Mi aspetto che l'albero lavori in un range da 0 a 4 Nm.
Quanto questo lavoro si traduca in corrente assorbita dal motore è tutto da "tabbellare", come giustamente hai detto tu.
Spero di avere un sensore di corrente sufficientemente sensibile da potermi permettere di avere un valore in Nm con una cifra decimale.
Per l'uso delle celle di carico ... do uno sguardo.

Grazie a tutti per il tempo ed i consigli.

Buongiorno a tutti.
Torno a chiedervi consiglio per migliorare il progetto.

Come HW sto utilizzando

  • Arduino UNO
  • INA 219, per misurare la corrente assorbita dal servo
  • Display OLED 128*32, per visualizzare la potenza
  • Servo HTX900

Questo è lo sketch:

#include <SPI.h>
#include <Wire.h>
#include <Servo.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#include <Adafruit_INA219.h>
Adafruit_INA219 ina219;
Servo servo_1;

void setup()   {
  //Servo su pin 9
  servo_1.attach(9);                    
  
  //Impostazione modulo INA219
  uint32_t currentFrequency;
  ina219.begin();
  
  // Impostazione modulo display con indirizzo I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  // Cancellazione schermo e buffer
  display.clearDisplay();
  
  // Messaggio iniziale
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Wattmetro");
  display.setTextColor(BLACK, WHITE); // Inverte il colore del testo
  display.println("Dinamometro");
  display.display();
  delay(10);
}

void loop()
{
  //Movimento Servo
    for(int i = 90; i < 141; i++){
    servo_1.write(i);
    delay(20);
  }  
  for(int i = 140; i >= 40; i--){
    servo_1.write(i);
    delay(20);
  }  
  for(int i = 40; i <= 91; i++){
    servo_1.write(i);
    delay(10);
  }
  
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  loadvoltage = busvoltage + (shuntvoltage / 1000);

  //display.clearDisplay();   // clears the screen and buffer
  display.setTextSize(2);
  display.setTextColor(WHITE);
  //display.setCursor(0,0);
  //display.print("V:"); display.print(loadvoltage, 2); display.println(" V");
  //display.print("A:"); display.print(current_mA,1); display.println(" mA");
  //display.display();
  //delay(1);
  display.clearDisplay();   // clears the screen and buffer
  display.setCursor(0,0);
  display.println("Potenza");
  display.print((current_mA*loadvoltage)/1000);  display.print(" W");
  display.display();
  delay(1);
}

In sostanza, il servo si muove alla posizione stabilita, leggo la potenza e visualizzo a schermo.
Il problema è che nel Void Loop la lettura di potenza avviene DOPO il movimento e non DURANTE.
Questo comporta una lettura inutile della potenza a motore fermo (0,03 W)

Come posso ovviare a questo problema ?

Pensavo di utilizzare 2 arduino nano, uno per pilotare il motore, l'altro per misurare e stampare il valore,
ma mi sembra di ammazzare una mosca con un cannone.

La programmazione non è il mio forte. Se esiste un escamotage software, ogni indicazione è bene accetta.

Salute

Devi semplicemente spostare la parte di lettura e visualizzazione dentro i tre cicli for che muovono il servo

Domanda stupida: ma misurare l'assorbimento di un motore attraverso la caduta di tensione su una resistenza, non si usa più?
Io misuro l'assorbimento istantaneo di un motore cc da 150 w con una resistenza da 0,27 ohm - 25w
Non è più semplice di usare una schedina dedicata (e delicata)? Per la serie "quello che non c'è non si rompe..."

Bidirezionale?

Non così facile

Standardoil:
Devi semplicemente spostare la parte di lettura e visualizzazione dentro i tre cicli for che muovono il servo

Proverò stanotte, grazie della dritta.
Altra domanda, e chiedo scusa se dico una belinata:
per migliorare la qualità della misurazione, c'è un modo per sincronizzare la lettura dell INA219 con la frequenza del PWM ?
Grazie

Domanda stupida: ma misurare l'assorbimento di un motore attraverso la caduta di tensione su una resistenza, non si usa più?

E' esattamente quello che fa lo INA219...

Ciao, Ale.

Certo, ma certe volte mi chiedo che senso abbia complicare un circuito per la lettura di un assorbimento in analogico trasformato poi in DIGITALE quando si può leggere direttamente e in tempo reale in analogico dato che Arduino UNO lo legge egregiamente.
Poi sono d'accordo che la differenza la fa la risoluzione, però certe volte mi chiedo perché complicarsi la vita...

Poi sono d'accordo che la differenza la fa la risoluzione

Non solo quella, che in fondo sarebbe il male minore. Per leggere decentemente la caduta di tensione su uno shunt con l'arduino bisogna che questa sia abbastanza alta (diciamo intorno ad 1 volt, usando il riferimento interno), tensione che comunque togli al carico. Poi c'è il discorso del calore e dell'ingombro di un simile shunt : il tuo da 0,27 ohm 25W ad occhio me lo immagino più grande della breakout board dell'INA219. Aggiungiamo anche che una simile resistenza è più difficile (e costosa) da trovare con specifiche giuste di precisione e deriva termica. Quindi se si vuole/deve usare uno shunt di valore più basso la lettura va comunque amplificata, e meglio a quel punto usare qualcosa di dedicato piuttosto che mettersi a giocare con gli OP e resistenze di precisione.
Preciso che non voglio aver ragione per forza o fare polemica, è solo per aggiungere qualche considerazione al discorso.

Ciao, Ale.

Si, non solo

La misura dovrebbe essere bi direzionale, lo avevo già segnalato

Quindi niente shunt sul Gnd, anche perché i servo hanno il Gnd in comune tra motore e comando

Quindi la misura va fatta high side, dovrebbe essere chiaro

E quindi lo ADC di arduino è poco adatto

Quanto poi a sincronizzare INA219 con il PWM del servo....
Io ci rinuncerei da subito, servono altri motori, non servo

scusa, Petroliere ( :wink: ) , ma non serve che sia bidirezionale se la misuri sull'alimentazione del servo ... l'inversione la fa direttamente il ponte interno, la polarita' dell'alimentazione del servo non cambia ... :slight_smile:

(diverso il caso se la misuri direttamente sul motore, ovvio)

Vero

Non ci pensai

Vado a comperare un po' di cenere da capo, per coprirmelo