Magnetoterapia alta frequenza con Arduino

Per questo progetto sono disponibili i circuiti stampati aggiornati. Vedere l’articolo presente a questo link.

Per chi conosce Nuova Elettronica, famosa rivista di elettronica in Italia attiva fino al 2012, la magnetoterapia non è cosa nuova. La rivista aveva infatti presentato alcuni kit, a distanza di tempo, di vari modelli di magnetoterapia più o meno complessi, fino ad arrivare a modelli con microcontroller, display, uscite di potenza.

Avendo provato il modello LX811 (rivista 119) e avendone constatato la funzionalità ho deciso di progettarne una simile ma con l’aiuto dell’onnipresente Arduino, che permettesse di avere un timer elettronico e la possibilità di cambiare la frequenza di modulazione dell’onda.

Per le spiegazioni “mediche” di tale effetto vi rimando caldamente alla lettura degli articoli di Nuovo Elettronica relativamente alle varie magnetoterapie realizzate negli anni, lettura che vi verrà utile per capirne il funzionamento e le possibillità. Vi verrà utile avere l’elenco dei loro kit, la sigla e la rivista sulle quali apparvero tramite questo link

Elenco kit Nuova Elettronica

Qui invece il link per scaricare tutte le riviste di Nuova Elettronica

Riviste Nuova Elettronica

Per quanto riguarda il mio progetto ho adottato come stadio di uscita quello della magnetoterapia LX711 (rivista 101-102) modificato leggermente, dotandolo di timer e di modulazioni selezionabili, riducendole a quelle che più mi hanno dato prova di essere funzionali.

I tempi impostabili sono 20, 40 e 60 minuti mentre le frequenze di modulazione sono 80, 160 e 320Hz.

La selezione avviene tramite pulsante (una pressione=un incremento in avanti con ritorno al primo livello) mentre con il pulsante START/STOP è possibile avviare il ciclo per la durata impostata precedentemente. Per avvisarci della “partenza” del ciclo abbiamo a disposizione un beeper piezoelettrico e durante tutta la durata del ciclo i led di indicazione, che lampeggeranno per avvisare che la magnetoterpaia è in funzione. Una sequenza breve di beep ci indicherà che il tempo di trattamento è concluso ed i led torneranno a rimanere accesi senza più lampeggiare.

Per la generazione della frequenza principale a 2Mhz sfruttiamo la la possibililtà di fornire sul’uscita D9 Arduino (UNO) un’onda quadra costante, indipendente dal programma, ad una frequenza selezionabile di 8, 4, 2, 1 Mhz. Il maggior effetto l’ho riscontrato a 2Mhz ma allo sperimentatore più estroso non sarà difficile, vista anche la presenza di numerosi I/O lasciati inutilizzati, di aggiungere anche una selezione della frequenza di generazione delle onde quadre “principali” giusto per sperimentare un po’.

Per le placchette di uscita ho preferito, al posto del flat cable utilizzato nel LX711, le bobine circolari del LX811, più pratiche.

Ho poi anche dotato il progetto di uno stadio “sensore” per controllare che dalle placchette uscisse davvero l’onda generata per controllare che tutto funzioni regolarmente ed individuare eventuali guasti (o al circuito o al cavo di collegamento). Avvicinando la placchetta da controllare al “sensore” durante il funzionamento si dovrà accendere il LED “TEST”che ci indicherà la ricezione delle onde in alta frequenza uscenti. Il sensore costituito dal transistor BFQ32 e dai diodi limitatori ha semplicemente bisogno di una piccola antenna al suo ingresso costituita da uno spezzone di filo di circa 10 cm connesso a C2.

In aggiunta ad Arduino (nel mio caso ho usato il mini pro con ATMEGA328) vi è anche un integrato aggiuntivo per pilotare l’accensione e lo spegnimento delle uscite tramite il timer. Tale integrato, un 74LS02 permette di realizzare l’interruttore elettronico comandato dall’uscita D12 di arduino. Con 1 su D12 le uscite saranno bloccate, mentre con 0 su D12 il treno di impulsi proveniente da D9 potrà passare e polarizzare i transistor degli stadi di uscita. La modulazione del treno di onde avviene da programma interrompendo ciclicamente l’uscita D12.

Gli stadi di uscita sono alimentati a 15V per avere una forma d’onda

sulle placchette che si aggira sui 100..120V.

Le bobine le avevo già e si trovano in commercio, sono da 4.7mH avvolte su nucleo di ferrite.

Induttanza 4.7mH

PCB è pensato per poter staccare la sezione dei pulsanti e dei led per poterlo posizionare in un mobiletto in maniera semplice.

Schema elettrico
Schema elettrico

 

Nello Schema elettrico vedete che ci sono i ponticelli indicati con J1, J2, etc…

I finali non scaldano e nemmeno il regolatore 7805, in ogni caso dispongono di una piccola superficie di dissipazione realizzata sul circuito stampato. Montandoli avrete l’accortezza di usare un po’ di pasta termica, come quella usata per i processori da PC.

Codice per Arduino

#include <Arduino.h>
#include "Ticker.h"

void stopGenerate();
void switchOut();

#ifdef __AVR_ATmega2560__
  const byte CLOCKOUT = 11;  // Mega 2560
#else
  const byte CLOCKOUT = 9;   // Uno, Duemilanove, etc.
#endif

#define isBuzzerActive 1
#define clockSwitch 12
#define MAX_FREQ 3
#define startButton 8
#define freqButton 11
#define timeButton 10
#define buzzer 13

#define ON LOW
#define OFF HIGH

#define lON HIGH
#define lOFF LOW

Ticker tTimer(stopGenerate, 1000, 0, MILLIS); 
Ticker tSwitch(switchOut, 6250 ,0, MICROS_MICROS);

unsigned int frequency[MAX_FREQ] = {6250, 3125, 1562};
unsigned int tfrequency[MAX_FREQ] = {80, 160, 320};
byte freqIndex = 0;
unsigned int timeCount[MAX_FREQ] = {1200, 2400, 3600}; // 20, 40, 60 minuti
byte timeIndex = 0;
byte lFreq[3] = {5, 6, 7};
byte lTime[3] = {2, 3, 4};

bool onOff= OFF;
bool switchFrequency;
int passedTime = 0;
bool blinkFlag = false;

void setOutput(void) {
  if (onOff==ON) {
    digitalWrite(clockSwitch, ON);
    blinkFlag=true;
  } else {
    digitalWrite(clockSwitch, OFF);
    blinkFlag=false;
    tTimer.stop();
    tSwitch.stop();
    buzzSound(4);
  }
}

void switchOut() {
  if (onOff==OFF) return;
  switchFrequency=!switchFrequency;  
  if (switchFrequency) digitalWrite(clockSwitch, ON); else digitalWrite(clockSwitch, OFF);
}

void stopGenerate() {
  passedTime--;
  blinkFlag=!blinkFlag;
  digitalWrite(clockSwitch, !blinkFlag);
  if (passedTime==0) {
    onOff=OFF;  
    setOutput();
  }
}

void showLeds(void) {
  if (blinkFlag) {
    for (int i=0; i<MAX_FREQ; i++) {
      digitalWrite(lFreq[i], LOW);
      digitalWrite(lTime[i], LOW);
    }
    return;
  }
  for (int i=0; i<MAX_FREQ; i++) {
    if (freqIndex==i) digitalWrite(lFreq[i], HIGH); else digitalWrite(lFreq[i], LOW);
  }

  for (int i=0; i<MAX_FREQ; i++) {
    if (timeIndex==i) digitalWrite(lTime[i], HIGH); else digitalWrite(lTime[i], LOW);
  }
}

void buzzSound(byte nRepeat) {
  for (int i=0; i<nRepeat; i++) {
    #if defined(isBuzzerActive)
      digitalWrite(buzzer, HIGH);
      delay(50);
      digitalWrite(buzzer, LOW);
      delay(50);
    #else
      tone(buzzer, 2000, 50);
      delay(50);
    #endif
  }
}

void setup () {
  pinMode (CLOCKOUT, OUTPUT); 
  for (int i=0; i<MAX_FREQ; i++) {
    pinMode(lFreq[i], OUTPUT); 
    digitalWrite(lFreq[i], LOW);
    pinMode(lTime[i], OUTPUT); 
    digitalWrite(lTime[i], LOW);
  }
  pinMode (buzzer, OUTPUT);
  digitalWrite(buzzer, LOW);

  Serial.begin(115200);
  
  pinMode (clockSwitch, OUTPUT);
  digitalWrite(clockSwitch, OFF);
  pinMode (startButton, INPUT_PULLUP); 
  pinMode (freqButton, INPUT_PULLUP); 
  pinMode (timeButton, INPUT_PULLUP); 
  // set up Timer  2 Mhz output on pin 9 (CLOCKOUT)
  TCCR1A = bit (COM1A0);  // toggle OC1A on Compare Match
  TCCR1B = bit (WGM12) | bit (CS10);  // CTC, no prescaling
  OCR1A =  3;                         // output every cycle 2Mhz - 
                                      // 2 = 2.67 Mhz, 1 = 4Mhz, 0 = 8 Mhz
  tSwitch.interval(frequency[freqIndex]);
  
  buzzSound(5);
}  // end of setup

void loop (){
  tTimer.update();
  tSwitch.update();
  if (!digitalRead(freqButton)) {
    buzzSound(1);
    if (freqIndex<MAX_FREQ-1) {
      freqIndex++;
    } else {
      freqIndex=0;
    }
    Serial.print("Frequenza selezionata: ");
    Serial.print(tfrequency[freqIndex]);
    Serial.println(" Hz");
    delay(300);
    while (!digitalRead(freqButton));
    tSwitch.interval(frequency[freqIndex]);
  }
  if (!digitalRead(timeButton)) {
    if (onOff==OFF) {
      buzzSound(1);
      if (timeIndex<MAX_FREQ-1) {
        timeIndex++;
      } else {
        timeIndex=0;
      }
      Serial.print("Periodo selezionato: ");
      Serial.print(timeCount[timeIndex]);
      Serial.println(" minuti");
      delay(300);
      while (!digitalRead(timeButton));
    }
  }
  if (!digitalRead(startButton)) {
    long lastTime = millis();
    onOff=!onOff;
    delay(300);
    while (!digitalRead(startButton));
    if (onOff==ON) {
      passedTime=timeCount[timeIndex];
      tTimer.start();
      tSwitch.start();
      buzzSound(2);
    } else {
      tTimer.stop();
      tSwitch.stop();
      setOutput();
    }
  }
  
  showLeds();
}  // end of loop

All’ingresso dell sensore che fa capo a C2 basterà collegare un semplice filo di una decina di cm. Avvicinadno la placchetta al filo il led rosso si dovrà accendere con una intensità inversamente proporzionale alla distanza a partire da qualche cm.

Le bobine (placchette) d’uscita, così come da immagini di Nuova Elettronica
piastre magnetoterapia

montaggio piastre magnetoterapia, da NE n. 119

piastre plastica
inclusione piastre in un contenitore plastico

 

Placca
La placca realizzata con una scatolina in plexiglass per monete riempita di resina epossidica

 

PCB magnetoterapia
PCB magnetoterapia finito. Si notano alcune correzioni sul PCB ed i condensatori “scaldati” dovuti all’intervento!

 

Forma d'onda
Forma d’onda impulsiva ad una delle uscite

La nuova versione del PCB non ha bisogno di alcun aggiustamento ed è leggermente meno ingombrante come da disegno qui sotto. In alcuni casi la versione di Arduino installata non presenta il GND sul lato alto della foto (dopo D3..D2). Nel caso basterà ponticellare tale PIN con il GND in basso (dopo a VCC..RST). A questo link il nuovo articolo relativo.

Nuovo PCB
Nuovo PCB

Miglioramenti (vecchia versione del PCB):

Alcuni esemplari mettevano in evidenza un fenomeno detto latch-up che si manifestaca nel 74LS02 quando si abilitavano le uscite e si collegavano le sonde. Questo si tramutava in un blocco del circuito e simultaneamente con un assorbimento anomalo superiore ai 700mA continui. Il fenomeno è stato eliminato inserendo due diodi 1n4007 in antiparallelo ai due transistors finali, come da schema allegato e foto. Se ancora si manifestasse il problema di blocco all’accensione o dopo un certo tempo di funzionamento la soluzione è eliminare il NOR IC1C. Si dovrà quindi sollevare dalle piste il pin 10 di tale IC e connettere con una pallina di stagno o con un filo i PIN 8-9-10 sul circuito stampato facendo attenzione che il PIN 10 dell’integrato non tocchi più le piste.

Modifica
Modifica
modifica IC1C
modifica IC1C

 

Ponticello alimentazione
Ponticello alimentazione da effettuare sul PCB tra uscita del 7805 e piedino 14 dell’IC 74LS02

Lo schema elettrico e il circuito stampato in formato EAGLE qui

La libreria Ticker qui

43 Risposte a “Magnetoterapia alta frequenza con Arduino”

  1. ho costruito con successo questo ottimo aggiornamento della magnetoterapia ne lx711, grazie allo stampato e alle bobine radiali fornite dall’autore e’ di facile costruzione, neanche a farlo apposta
    ieri mi sono bloccato la schiena per una lombalgia , con cicli di 60 minuti e di 80 hz di modulazione il dolore si sta attenuando.

    concludendo grazie di cuore all’autore per aver condiviso il suo progetto

    1. Grazie, ho avuto altri riscontri positivi in merito alla diminuzione del dolore e anche io ne sono testimone. Sembra incredibile che delle semplici onde elettromagnetiche possano dare simili risultati senza controindicazioni ed invece… A volte le cose semplici sono le più efficaci.

  2. salve, essendo un principiante con arduino,e vedendo lei dal codice un esperto programmatore C++,potrebbe inserire nel codice la selezione della frequenza di generazione delle onde quadre (8, 4, 2, 1 Mhz) , con un nuovo pulsante su pin 1.
    GRAZIE

    1. Basta modificare OCR1A

      OCR1A = 3; // output every cycle 2Mhz –
      // 3 = 2Mhz, 2 = 2.67 Mhz, 1 = 4Mhz, 0 = 8 Mhz

  3. salve, volevo aggiungere un nuovo pulsante ad es. sul pin digitale 1 libero, ed a ogni pressione incrementare una variabile associata a OCR1A per variare da pannello la freq. principale.
    saluti

  4. Salve, vorrei acquistare tutto il materiale possibile solo che non ho carte di credito!
    1) E’ possibile l’acquisto in contrassegno?
    2) Lo stampato e’ gia corretto ? (la foto in articolo ha correzioni!!!)
    3) Non ho capito se le uscite dei bd139 vanno direttamente ai dischi irradianti o bisogna aggiungere il circuito dell’ lx711 con il bfy51 ?
    4) Se così è già funzionale, come fa il bd139 a lavorare con AF?
    5) Ma la frequenza base dell’lx711 non era di 9 Mhz ?
    Attendo con ansia le risposte
    Grazie

    1. 1) No, spiacente. In caso di non ritiro io mi sobbarcherei sia i costi di spedizone che quelli di contrassegno.
      2) Lo stampato ha solo un ponticello da effettuare. Quello in foto dell’articolo è stato pesantemente rimaneggiato.
      3) Le uscite vanno direttamente ai dischi.
      4) il BD190 arriva come Ft a 190Mhz, in ogni caso lavora nella magnetoterapia lavora a 2Mhz, il resto sono armoniche.
      5) Si, ma si lavorava anche in quel caso sulle armoniche.

  5. Ti ringrazio x l’immediata risposta.
    E’ possibile avere i due stampati insieme ai componenti + gli stampati dei 2 dischetti ? (Per acquistare i componenti discreti devo fare
    oltre 50 km andata + 50 km ritorno (abito in paesino distante da Bologna!!!!)
    Se tutto o.k. mi dai il totale da caricare sulla carta che acquisterò domattina e (poichè non l’ho mai fatto) come fare?
    Grazie mille

  6. Ciao, la busta con i dischetti mi è giunta oggi.
    Sia sulla rivista NE 119 (LX811) che dalle tue foto non capisco se il dischetto và saldato con
    filo centrale e massa o solo con centrale, ovvero è una bobina chiusa su stampato o,
    come nel LX711, è solo una piasrina irradiante, tipo antenna aperta.
    Delucidami, se puoi
    Grazie

  7. Ciao, va tutto O.K.! Una sola cosa non mi torna: nel progetto originale si marca sulla durata dell’OFF
    che pilota i Mhz, ovvero 64us in OFF ed il resto in ON. Nel Tuo progetto io con l’oscilloscopio leggo
    la 320, 160, 80 con duty-cycle del 50%. E’ normale? Se SI’, perchè la rivista marca molto il rispetto dei tempi ON e OFF? Fammi sapere (anche perchè lo sto usando e sembra che abbia effetto, maggiore della versione lx711 che all’epoca potenziai)
    Grazie

  8. In realtà nell’articolo parlano di 64uS in ON non in OFF. sempre nell’articolo comunque dicono che anche con pause diverse l’unica cosa che cambia è tempo di esposizione per ottenere lo stesso effetto. Per semplificare quindi il codice ho preferito semplicemente pilotare in on-off con il duty cycle della frequenza scelta. In ogni caso il codice è chiaramente modificabile per i propri scopi.

  9. Non ho provato ma cambiando la routine switchOut dovrebbe raggiungere il suo scopo

    void switchOut() {
    if (onOff==OFF) return;
    digitalWrite(clockSwitch, ON);
    delayMicroseconds(64);
    digitalWrite(clockSwitch, OFF);
    }

  10. Ho acquistato tutta la serie di circuiti stampati (compreso i dischetti), che sono arrivati in un paio di giorni.
    Sono fatti veramente bene, e poi, la comunicazione è fantastica.
    Voglio vedere se riesco ad estendere le funzionalità del dispositivo.
    Grazie mille di tutto.

  11. Ho provato; funge!!!!
    Ti dirò di più, sono andato a rileggere la rivista 119 di N.E. dove dice che il tempo della semionda deve essere di 90uS e così ho fatto.
    FUNGE!!!
    A proposito, alla riga “unsigned int frequency[MAX_FREQ] = {6250, 3125, 1562};” ho dovuto modificare i tre valori delle frequenze con una serie di tantissime prove. Forse dipende pe le diversità tra gli arduino?
    il mio non è originale ed addirittura l’Arduino IDE non me ne riconosce la scheda, anche se funziona ugualmente bene (credo). di nuovo un
    GRAZIE.

    P.S. Se qualche conoscente, amico o parente mi chiede di montarglielo Tu puoi procurarmi tuttto il materiale come la volta precedente? (é una ipotesi)

  12. Salve, non essendo un esperto di Arduino chiedevo: il listato codici arduino da lei pubblicato esiste in un file da poter essere caricato sul modulo? Grazie.

  13. Salve sto mettendo insieme il materiale elettronico ma ho due domanda sulla magnetoterapia:
    – di che tipo sono i due condensatori c5 e c6, sono in metallo
    – dovrei dimensionare l’allimentatore e mi interessa circa la potenza 30 40 watt
    Grazie

  14. La cosa migliore è utilizzare condensatori a disco con tensione di 250V. Altri tipi di condensatore, purché di tensione adeguata, possono in ogni caso funzionare.

    l’alimentatore non deve fornire molta corrente, l’assorbimento non arriva ai 100..150mA

    2W sono sufficienti a 15V

  15. Saluti,
    ho appena ricevuto il kit e sto per montarlo. Le due placche che ho ricevuto hanno le spire disposte diversamente dalla struttura a spirale visibile nelle foto e negli articoli di N.E., esse sono inoltre stampate su entrambi i lati della vetronite.
    Da una risposta precedente ho capito che sulle due placchette si salda solo il centrale (la calza viene saldata sul c.s.).
    Domanda: In questa versione di placche dove devo collegare il centrale? Nel foro al centro ? Uso cavo RG58 o basta uncavetto per audio a BF ?
    Grazie
    Marco

    1. È necessario usare un cavo schermato saldando la massa e il capocaldo sullo spinotto che arriva dal circuito stampato mentre sulla placchetta solo centrale nel buchino al centro.

  16. Certo. basta modificare le linee:

    unsigned int frequency[MAX_FREQ] = {6250, 3125, 1562};
    unsigned int tfrequency[MAX_FREQ] = {80, 160, 320};

    mentre tFrequency è solo una indicazione restituita via seriale (per debugging) la variabile frequency[] indica invece il numero di uS di un semiperiodo ovvero la metà del periodo della frequenza desiderata.

    Quindi 40Hz corrisponderanno a 12500uS e 640Hz a 781uS

  17. Grazie, occorre però anche modificare l’accensione dei led, senza doverne aggiungere altri due. Una soluzione ad esempio, potrebbe essere che a 40Hz si accendono contemporaneamente i due led a destra e 640 Hz i due a sinistra.
    Comunque grazie per la risposta la contatterò eventualmente per l’acquisto dei componenti. È possibile utilizzare arduino nano, dato che ne ho alcuni?

    1. Si è possibile usare l’arduino nano ma ovviamente non è più possibile utilizzare il PCB a meno di usare un adattatore.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.