sensore e software IFM, le osservazioni fatte con il sensore era per avere un valore globale delle vibrazioni sullo stampo e vedere se ci sono differenze sostanziali, ma senza grandi risultati, ma bella esperienza
sono riuscito a recuperare il coperchio delle masse eccentrice
ho avvolto un filo attorno al coperchio
appoggiato sensore hall e quando la massa ferrosa si trova di fronte al sensore analogico hall arduino rileva una differenza nel valore analogico
a bobina spenta ho provato mettere un magnete sul lato opposto del sensore e quando metto la massa ferrosa di fronte la variazione del valore analaogico e' anche maggiore
provo a percorrere questa ultima strada
Ah ben, se tu vuoi applicare il campo magnetico tramite un magnete permanente puoi usare gli hall , devi aggiungere altri componenti elettronici, i sensori magnetico hanno tutto dentro
cerco un sensore con una sensibilita maggiore del 49E che sto provando
google mi dice : A1301: Sensibilità elevata, pari a (5 mV/gauss)
ne avete altri da suggerire?
grazie
Bisogna aggiungere dei componenti elettronici per condizionare il segnale in guadagno e banda passante, ottenere il bias desiderato, compensare in temperatura, e impostare la soglia di commutazione, come ti dicevo nel #43 i sensori magnetici hanno tutto dentro, non potrai MAI farlo con il solo sensore hall analogico, a parte che il A1301 ha la stessa sensibilità del 49E cioè 2.5mV/Gauss non ci sono sensori con sensibilità molto superiore a 5mV/Gauss
ordinato un sensore magnetico
vediamo cosa riesco a combinare
Ma tu vorresti usare un solo sensore ? ... perche' la vedo dura, usare un solo sensore per rilevare il senso di rotazione di qualcosa non visibile (rileveresti la velocita', non la direzione) ... per la direzione ti servono almeno due sensori, disposti ad un certo angolo l'uno dall'altro (possono bastare anche 10 o 20 gradi soltanto), cosi puoi definire se uno commuta prima o dopo l'altro e sapere quale sia la direzione
Ah, ok, non avevo capito bene io, scusa ... si, cosi dovrebbe funzionare senza problemi allora.
ne ho ordinato 1 per capire se riuscivo a leggere il movimento
dalle prove fatte sembra funzionare, quindi il secondo e' in arrivo
![]()
#define encoder0PinA 2
#define encoder0PinB 3
#define CW_led 4
#define CCW_led 5
volatile unsigned int encoder0Pos = 0;
volatile unsigned int encoder0PosNew = 0;
void setup() {
pinMode(encoder0PinA, INPUT_PULLUP);
pinMode(encoder0PinB, INPUT_PULLUP);
pinMode(CW_led, OUTPUT);
pinMode(CCW_led, OUTPUT);
digitalWrite(encoder0PinA, HIGH);
digitalWrite(encoder0PinB, HIGH);
// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, doEncoderA, RISING);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, doEncoderB, RISING);
Serial.begin(115200);
}
void loop() {
if (encoder0Pos != encoder0PosNew) {
Serial.println(encoder0Pos); // use for debugging - remember to comment out
}
encoder0PosNew = encoder0Pos;
}
void doEncoderA() {
if (digitalRead(encoder0PinA) == HIGH) // look for a low-to-high on channel A
{
if (digitalRead(encoder0PinB) == LOW) // check channel B to see which way encoder is turning
{
encoder0Pos = encoder0Pos + 1; // CW
digitalWrite(CW_led, HIGH); //CW led on
digitalWrite(CCW_led, LOW); //CCW led off
} else {
encoder0Pos = encoder0Pos - 1; // CCW
}
} else // must be a high-to-low edge on channel A
{
if (digitalRead(encoder0PinB) == HIGH) // check channel B to see which way encoder is turning
{
encoder0Pos = encoder0Pos + 1; // CW
} else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
//Serial.println (encoder0Pos); // use for debugging - remember to comment out
}
void doEncoderB() {
if (digitalRead(encoder0PinB) == HIGH) // look for a low-to-high on channel B
{
if (digitalRead(encoder0PinA) == HIGH) // check channel A to see which way encoder is turning
{
encoder0Pos = encoder0Pos + 1; // CW
} else {
encoder0Pos = encoder0Pos - 1; // CCW
digitalWrite(CW_led, LOW); //CW led off
digitalWrite(CCW_led, HIGH); //CCW led on
}
}
// Look for a high-to-low on channel B
else {
if (digitalRead(encoder0PinA) == LOW) // check channel B to see which way encoder is turning
{
encoder0Pos = encoder0Pos + 1; // CW
} else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
//Serial.println (encoder0Pos); // use for debugging - remember to comment out
}
buongiorno
sto facendo prove al banco con i sensori, ho due impulsi distinti completi
i risutati sembrano molto soddisfacenti
i led si accendono come dovrebbero, la massa metallica ruotando scherma il magnete esterno e questo disattiva il sensore
a massa ferma lontano dal sensore i campo del magnete attiva il sensore
quello che non capisco e' perche' nello switch i led non si spengono a massa ferma
sotto lo sketch, migliorabile?
/*
*/
#define PinA 2
#define PinB 3
#define CW_led 4
#define CCW_led 5
byte stato, i, k;
unsigned long timeA;
unsigned long timeB;
void setup() {
pinMode(PinA, INPUT_PULLUP);
pinMode(PinB, INPUT_PULLUP);
pinMode(CW_led, OUTPUT);
pinMode(CCW_led, OUTPUT);
// encoder pin on interrupt 0 (pin 2)
attachInterrupt(digitalPinToInterrupt(2), doEncoderA, RISING);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(digitalPinToInterrupt(3), doEncoderB, RISING);
for (k = 6; k <= 12; k++) {
pinMode(k, OUTPUT);
digitalWrite(k, LOW);
}
timeA = 0;
timeB = 0;
stato = 0;
i = 0;
delay(5000);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
Serial.begin(9600);
}
void loop() {
if (timeA > timeB && i == 2) {
stato = 1;
timeA = 0;
timeB = 0;
i = 0;
}
if (timeB > timeA && i == 2) {
stato = 2;
timeA = 0;
timeB = 0;
i = 0;
}
switch (stato) {
case 1:
{
digitalWrite(CW_led, LOW);
digitalWrite(CCW_led, HIGH);
}
break;
case 2:
{
digitalWrite(CW_led, HIGH);
digitalWrite(CCW_led, LOW);
}
break;
default:
{
digitalWrite(CW_led, LOW);
digitalWrite(CCW_led, LOW);
}
}
} //fine loop
void doEncoderA() {
timeA = millis();
i++;
}
void doEncoderB() {
timeB = millis();
i++;
}
Le variabili che usi negli interrupt dovrebbero essere dichiarate volatile .
Perchè nessuno resetta lo stato? Prova ad aggiungere stato=0 all'inizio del loop();
Ciao, Ale.
buonasera
sotto l ultima versione
#define PinA 2
#define PinB 3
#define CW_led 4
#define CCW_led 5
byte stato, k;
volatile unsigned long timeA;
volatile unsigned long timeB;
volatile byte i;
void setup() {
pinMode(PinA, INPUT_PULLUP);
pinMode(PinB, INPUT_PULLUP);
pinMode(CW_led, OUTPUT);
pinMode(CCW_led, OUTPUT);
// encoder pin on interrupt 0 (pin 2)
attachInterrupt(digitalPinToInterrupt(2), doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(digitalPinToInterrupt(3), doEncoderB, CHANGE);
for (byte k = 6; k <= 12; k++) {
pinMode(k, OUTPUT);
digitalWrite(k, LOW);
}
timeA = 0;
timeB = 0;
stato = 0;
i = 0;
delay(500);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
Serial.begin(9600);
}
void loop() {
if (timeA > timeB && i == 10) {
digitalWrite(CW_led, LOW);
digitalWrite(CCW_led, HIGH);
timeA = 0;
timeB = 0;
i = 0;
}
if (timeB > timeA && i == 10) {
digitalWrite(CW_led, HIGH);
digitalWrite(CCW_led, LOW);
timeA = 0;
timeB = 0;
i = 0;
}
} //fine loop
void doEncoderA() {
timeA += millis();
i++;
}
void doEncoderB() {
timeB += millis();
i++;
}
i led CW e CCW si accendono come da rotazione oraria o anti oraria rispettivamente
ma quello che succede e' che talvolta il led CW si spegne e si accende per un breve istante il led CCW e viceversa
la spiegazione che mi sono dato e' legata ai tempi di ciclo del programma
