Encoder rotativo forza

Ciao a tutti, faccio un altro tentativo, per chiedervi un parere, un aiuto.

Sto utilizzando Arduino uno
Un encoder rotativo Wisamic 600P / r incrementale Rotary Encoder Dc5-24v larga di tensione di alimentazione 6 millimetri albero,
L’ho montato su un mozzo di diametro 30mm, all’ estremità di questo mozzo un disco di diametro 25cm peso 4kg.

Ora sto utilizzando un codice che mi fornisce gli rpm nei due sensi.
Problema come posso calcolare l’accelerazione angolare ed inserire una variante tempo nella formula, per calcolare la forza impressa a questo disco per girare?

 const int encoder_a = 2; // Pin 3
const int encoder_b = 3; // Pin 5
long encoder_pulse_counter = 0;
long direction = 1;

void encoderPinChangeA()
{
    encoder_pulse_counter += 1;
    direction = digitalRead(encoder_a) == digitalRead(encoder_b) ? -1 : 1;
}

void encoderPinChangeB()
{
    encoder_pulse_counter += 1;
    direction = digitalRead(encoder_a) != digitalRead(encoder_b) ? -1 : 1;
}

void setup() 
{
    Serial.begin(9600);
    pinMode(encoder_a, INPUT_PULLUP);
    pinMode(encoder_b, INPUT_PULLUP);
    attachInterrupt(0, encoderPinChangeA, CHANGE);
    attachInterrupt(1, encoderPinChangeB, CHANGE);
}

void loop()
{
    long speed = encoder_pulse_counter/600.00*60; // For encoder plate with 1024 Pulses per Revolution
    Serial.print(" ");
    Serial.println(direction*speed);
    encoder_pulse_counter = 0; // Clear variable just before counting again 
    delay(100);
}

Il tempo è 100 ma

La velocità angolare è 2 per pigreco diviso 60 per gli rpm

L'accelerazione angolare è la differenza tra due letture della velocità angolare diviso il tempo tra le letture

La forza?

Dipende se il volano ha distribuzione uniforme o no

E se vuoi forza o coppia

Un buon manuale del perito e si sa

La velocità angolare con la formula che descrivi ero riuscito ad inserirla nel codice,
Il problema principale resta come modificarlo ed avere nella formula la variante tempo .

CeleLucio83:
La velocità angolare con la formula che descrivi ero riuscito ad inserirla nel codice,

beh, potevi dirlo...

per il resto, basta all'inizio della loop fare la differenza tra una variabile memorizzata e il valore attuale appena calcolato di omega
poi memorizzare nella variabile il valore attuale di omega

la differenza è l'accelerazione nel quanto di tempo

Grazie per il sostegno, mi scuso per aver omesso involontariamente qualche dettaglio,
Comincia ad essere più chiaro così come ricavare la costante che cerco,
Praticamente come andresti a modificare il codIce?

CeleLucio83:
Comincia ad essere più chiaro così come ricavare la costante che cerco,

Che comunque non è una forza, ma una velocità angolare... :wink:

Lui cerca l'accelerazione angolare
E da lì la forza applicata al volano
E qui si aprirà un mondo, tra momenti del secondo ordine e momenti delle forze; ma per il momento (di tempo) ci si accontenta del primo step

E scusate se per un momento ho fatto un gioco di parole, è durato solo pochi momenti

Praticamente quello, passando gradualmente almeno ad ottenere l’accelerazione angolare, per poi arrivare alla forza, essendo per me importate il processo di apprendimento di questa tematica, vi ringrazio per il sostegno.

#define encoder_a 2 
#define encoder_b 3 
volatile long encoder_pulse_counter = 0;
volatile byte dir = 1;
#define TEMPO 100
float v;
#define PASSI_GIRO 600.0
#define ATTRITO 0//La forza necessaria a mantenere in moto la cosa
#define MASSA 4.000 //peso della cosa

void encoderPinChangeA()
{
    encoder_pulse_counter += 1;
    dir = digitalRead(encoder_a) == digitalRead(encoder_b) ? -1 : 1;
}

void encoderPinChangeB()
{
    encoder_pulse_counter += 1;
    dir = digitalRead(encoder_a) != digitalRead(encoder_b) ? -1 : 1;
}

void setup()
{
    Serial.begin(9600);
    pinMode(encoder_a, INPUT_PULLUP);
    pinMode(encoder_b, INPUT_PULLUP);
    attachInterrupt(0, encoderPinChangeA, CHANGE);
    attachInterrupt(1, encoderPinChangeB, CHANGE);
}

void loop()
{
    float vel = encoder_pulse_counter/PASSI_GIRO*60*dir; // Non capisco questa formula, conto i passi / passi di ogni giro * 60?

    Serial.println(((v-vel)/TEMPO)*MASSA+ ATTRITO);
    encoder_pulse_counter = 0; // Clear variable just before counting again
    v=vel;
    delay (TEMPO);
}

Ma la delay() rimane precisa anche con chiamate a Isr?

Che comunque bisogna ancora distinguere tra massa e momento d'inerzia, mi sembra evidente che non hai studiato quello che ti segnalavo

sto cercando di capire, non è semplice per me..

Beh parliamo di cinematica rotazionale, ossia partendo dalla posizione istantanea va calcolata la velocità angolare media (omega = delta theta/delta t), da questa puoi ottenere l'accelerazione angolare, quindi calcolare l'energia del corpo in rotazione passando dal momento di inerzia (parliamo di un disco o ha una forma diversa?), e quindi dalla variazione di energia calcolare la forza applicata.

Se non sono chiari questi passaggi, la codifica su Arduino temo che sia proprio l'ultimo dei problemi. :wink:

certo non posso ricordare tutte le formule, ma le dispense ancora non sono state cestinate....però grazie del consiglio.