Levitazione Magnetica tesina (aiutooo)

Ciao sono Andrea , ho 19 anni e tra 3 settimane iniziano gli esami :'( :fearful: :astonished: :astonished: .

Per la tesina ho deciso di fare un progetto , ovvero la levitazione magnetica. Ho tutti i componenti e sto usando Arduino UNO.

Oggi(lo so è un po tardi) ho iniziato la fase di "costruzione / progettazione" e ho subito incontrato dei problemi (e sono già in ansia e panico).

Per la rilevazione dell' oggetto ho deciso di optare per un fototransistor ed un IRled.

Fototransistor: BPW96C http://www.vishay.com/docs/81532/bpw96.pdf IRled: TSHA 6203 IR TX https://www.vishay.com/docs/81021/tsha620.pdf

Il collegamento(riferito soltanto e unicamente ai due componenti, anche perchè ho fatto solo quello) è uguale identico a questo http://www.experiencingphysics.com/wp-content/uploads/2015/04/arduinoMagLev.pdf (pag.4)

Per iniziare ho voluto provare il funzionamento di questi due componenti. Quindo ho fatto un programma semplicissimo : Tengo acceso il led infrarossi e leggo sulla seriale i valori del transistor

Qui ho riscontratto il primo problema (qui inoltre è iniziata a salirmi l' ansia :D )

-Teoricamente dovrebbe funzionare cosi: Quando c'è un oggetto in mezzo ai due che blocca tutti i raggi infrarossi il fototransistor dovrebbe darmi il valore 0 (1023- valore misurato) Quando non c'è niente in mezzo ai due il fototransistor dovrebbe darmi 1023.

-Invece a me funziona cosi:

Prima ho tenuto il led infrarossi fuori dalla visuale del transistor e sulla seriale ho letto il valore 0. Poi ho messo il led infrarossi dentro la visiale del transistor, tenendolo ad una distanza di circa 6-7 cm e sulla seriale ho letto dei valori molto bassi , i valori non andavano altre l' 8-9, se aumentavo la distanza il valore tornava a 0. Poi ho messo il led infrarossi davanti, proprio attaccato al transistor , e sulla seriale ho letto valori che si aggiravano intorno a 150

Domande: -Cosa posso fare per leggere dei valori migliori? -Come faccio ad aumentare la distanza tra i due (12-13 cm) e leggere comunque dei buoni valori? -Come faccio a stabilire il valore di set-point , dove il magnete dovrà levitare?

PS:questo è soltanto il primo ostacolo , andando avanti ce ne saranno sicuramente altri , quindi continuerò a tartassarvi con altre domande e chiarimenti :D ;D .

Ho disperatamente bisogno di una mano. Grazie in anticipo per l'attenzione e per l' aiuto.

Buongiorno e benvenuto sul forum, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, [u]NON[/u] necessariamente inerenti alla tua domanda: - serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - pinout delle varie schede by xxxPighi: Pinout - link [u]generali[/u] utili: Link Utili

AGGIORNAMENTO: problema dei sensori risolto (sono un pirla avevo sbagliato qualche collegamento 8) :D )

Avrei però bisogno di qualche dritta sul MOSFET n-Channel

Il mosfet che utilizzo è il IRF520N, lo schema di collegamento è sempre quello di prima.

Il programma è questo: http://www.dangerouslymad.com/download/chapter-13-levitation

Questo è quello che ho capito io:

Questo mosfet serve per ampificare il segnale che viene dal PWM , da 5 V e 20mA ,a 12V e 2A.

Il G va collegato al PWM L' S va a massa Il D va all 'elettromagnete

Questo è quello che succede quando controllo il funzionamento con il multimetro:

Mettendo il puntale sul G noto che riceve i segnali del PWM correttamente (i risultati vanno da 0 a 5V, a seconda dei sensori) Mettendo il puntale sul D noto che è sempre a 12V e anche la corrente è fissa non cambia mai.

La mia domanda è questa: il D non dovrebbe cambiare di conseguenza come il G?

PS: molto probabilmente sono domande sceme ( come il sottoscritto ) e sto sicuramente sbagliando qualcosa o proprio non ho capito un tubo di come dovrebbero andare le cose , grazie per la pazienza :slightly_smiling_face:

Prima di tutto, dovresti cambiarlo con un IRL520, o uno di portata maggiore, ma sempr elogic-level ... gli IRF520 sono mosfet standard, che per commutare correttamente ON/OFF, necessitano di circa 9 - 10 V sul gate (ed una logica a 5V non glie li puo ovviamente dare, per cui rimani sempre in zona lineare, con surriscaldamenti e spreco di energia, oltre a non funzionarti bene il tutto), mentre gli equivalenti di tipo logic-level commutano gia con 3 o 4 V (alcuni anche meno), e quindi sono adatti ad essere pilotati dalle logiche ...

Ah, si, fra il pin del PWM ed il gate sarebbe meglio metterci una resistenza, anche solo da 100 ohm ...

Poi che frequenza di PWM usi ? ... se e' troppo alta (piu di un paio di KHz, diciamo), potrebbe essere necessario un driver per il gate ...

Grazie per i consigli :) .

Quindi nel mosfet devo andare nella zona di saturazione per poter pilotare l' elettromagnete con la tensione e la corrente aplificata?Nelle zona lineare invece questo non accade?

La frequenza del PWM non l ho toccata , quindi penso sia quella di defaul del pin 11 (488) guisto?

Drei: Quindi nel mosfet devo andare nella zona di saturazione per poter pilotare l' elettromagnete con la tensione e la corrente aplificata?Nelle zona lineare invece questo non accade?

No, nella zona di saturazione ha una resistenza tra Source e Drain minore che nella zona lineare e percui la potenza dissipata é miore e la tensione sul carico é maggiore.

Ciao Uwe

Come detto da uwe ... in pratica, in saturazione si comporta come un'interruttore, e la sua resistenza e' la RdsON che trovi sul datasheet ... poche decine di milliohm, se il mosfet e' di potenza anche solo pochi milliohm ...

Ovviamente, per pilotarci un carico in PWM, dove serve la funzione ON/OFF, e' molto meglio se il mosfet lavora in saturazione, che in zona lineare ... per una frequenza di 488Hz, ma anche un KHz volendo, non serve driver, basta la resistenza in serie per ridurre il carico dell'uscita ...

Io al massimo pero' ti consiglierei di sostituire il 520 con il 540 (sempre IRL, non IRF) ... il 520 ha una corrente massima di 6A ed una RdsON di 270milliohm (su 2A di corrente, fanno 0.54V di caduta, ma soprattutto circa 1.1W di dissipazione, serve un dissipatore altrimenti diventa bollente ... il 540 ha una RdsON di 77 milliohm, che su 2A fanno 0.15V circa di caduta, e poco piu di 300mW di dissipazione (scalda comunque, ma molto meno, anche senza dissipatore) ... se poi volessi usarne uno anche migliore, tipo ad esempio IRLB8721 (giusto perche' costano poco, da mouser sugli 80 centesimi :D), 30V 62A 9 milliohm di RdsON, che su un paio di Ampere significano circa 0.02V di caduta, e quindi circa 40mW di dissipazione (dovrebbe diventare si e no tiepido, a quella corrente) ...

Aggiornamento: il progetto funziona yeeeeee.
Però ho qualche domanda:

1)Come mai il magnete che levita ruota?
3)Una cosa che mi è poco chiara è il funzionamento del mosfet.I 0-5V e 0-20 mA che gli arrivano dall’arduino li aplifica fino a 0-12V e 0-2A ?Oppure funziona in un altro modo?
2) Questo è il programma che ho compiato da un sito
(metterò degli asterischi nel programma delle cose che nello specifico non ho capito e delle quali ho bisogno di chiarimenti)

#define coilPin 11
#define irPin 13
#define sensorPin 0

int A = 2;
// Adjust B to improve stability
int B = 60;
int C = 20;
int D = 1000;

int maxPower = 255;
long powerCountThreshold = 300000; *( non capisco a cosa serve e perchè prorpio 300000)
int objectPresent = 0;
int monitoring = false;

void setup()
{
pinMode(coilPin, OUTPUT);
pinMode(irPin, OUTPUT);
pinMode(sensorPin, INPUT);
Serial.begin(9600);
Serial.println(“Ready”);
Serial.println(“m - toggle monitoring”);
Serial.println(“B - increase B”);
Serial.println(“b - decrease B”);
}

void loop()
{
static int count = 0;
static int oldPosition = 0;
static int ambient = 0;
static long powerCount = 0;
count ++;

if (count == 1000)
{
ambient = readAmbient();
count = 0;
objectPresent = (powerCount < powerCountThreshold);
powerCount = 0;
}
int raw = 1024 - analogRead(sensorPin);
// position from top (0) of sensor region to the bottom (650)
int position = raw - ambient;
// positive value means going downwards, negative going upwards
int velocity = position - oldPosition;
int power = position / A + velocity * B + C; *(qui del PID viene utilizzato solo il P e il D? Perchè la A ha un valore cosi piccolo?)

powerCount += power;( non capisco a cosa corrisponde e a cosa serve)
oldPosition = position;

// clip
if (power > maxPower) power = maxPower;
if (power < 0) power = 0;

checkSerial();

if (monitoring)
{
Serial.print(position); Serial.print(",");
Serial.println(velocity);
}

analogWrite(coilPin, power * objectPresent);
delayMicroseconds(D);
}

int readAmbient() //todo try speding up delay in micros
{
digitalWrite(irPin, LOW);
// allow time for LED and phototransistor to settle
delayMicroseconds(100);
int ambient = 1024 - analogRead(sensorPin);
digitalWrite(irPin, HIGH);
return ambient;
}

void checkSerial()
{
if (Serial.available())
{
char ch = Serial.read();
if (ch == ‘m’)
{
monitoring = ! monitoring;
}
if (ch == ‘B’)
{
B += 5;
Serial.println(B);
}
if (ch == ‘b’)
{
B -= 5;
Serial.println(B);
}
}
}

Ti avevo pregato di leggere con MOLTA attenzione il regolamento ma … evidentemente non lo hai fatto ::slight_smile:

In conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Guglielmo

Drei: ... 1)Come mai il magnete che levita ruota? 3)Una cosa che mi è poco chiara è il funzionamento del mosfet.I 0-5V e 0-20 mA che gli arrivano dall'arduino li aplifica fino a 0-12V e 0-2A ?Oppure funziona in un altro modo? ...

La rotazione del magnete sospeso dipende dalla precessione ... si puo limitarla, mettendo un secondo magnete in fondo, ed un blocchetto di rame sotto, in modo che resti ad un paio di mm dal magnete ... le correnti indotte dal movimento del magnete nel blocchetto di rame causeranno un'effetto "freno" elettromagnetico, e dovrebbero limitare rotazioni ed oscillazioni varie ...

Il mosfet n quel caso funziona come interruttore, piu che amplificare ... immaginalo come un rele', quando alimenti il gate con una certa tensione, chiude drain e source insieme ... molto semplificato, ma da l'idea ...

Premetto che ancora non ho preso il caffé. Iniziamo da power. E' il valore che stabilisce l'intensità del campo magnetico creato dalla bobina. Va da 0 a 255 per cui potrebbe essere un byte invece che int ma mi par di capire che dai calcoli possono spuntare valori sotto lo zero o sopra 255. powerCount rappresenta la somma nel tempo dei 1000 valori di power e finché è minore di powerCountThreshold significa che il magnete è presente e objectPresent è uguale ad 1 altrimenti è uguale a zero. Qui si spiega perché power è un int. Evidentemente se l'oggetto non è presente il valore di power assume valori maggiori di 255 per cui la somma di 1000 di essi supera powerCountThreshold che è 300000 e il clipping a 255 viene effettuato dopo. Se il clipping fosse effettuato prima o si usasse un byte la somma al massimo farebbe 255000.

infine

analogWrite(coilPin, power * objectPresent);

se objectPresent è zero, power è anche zero (la moltiplicazione fa zero) e quindi la bobina non è alimentata. Altrimenti viene scritto il valore di power calcolato e normalizzato tra 0 e 255.

Metti il codice nei tag appositi, come ti ha già detto Guglielmo.