Stepper motor tester con App Android BLE

update 23 Jun 2022: project translated into English and copied to https://hackaday.io/project/186033-stepper-motor-tester-with-ble-android-app

Vi presento un’altra applicazione del dongle USB della Nordic con il SoC nRF52840. In questo caso, il modulo viene utilizzato, insieme ad un apposito circuito di controllo, per comandare uno stepper motor. Tutte le informazioni su come programmare il modulino con l’applicazione in oggetto si possono trovare nel precedente articolo.

Hardware

Vediamo subito lo schema elettrico:

Per una visione più dettagliata e nitida, potete scaricare il PDF originale da questo link.

Il componente principale è, ovviamente, il modulino con il SoC (System on Chip) nRF52840 della Nordic. Dovendo però pilotare uno stepper motor, ho aggiunto un altro modulino che fa da driver di potenza e ne ho trovato uno già pronto, basato sul chip 4988 della Allegro. Questo driver permette di avere diverse opzioni sul pilotaggio del motore, ma io ho usato solo il ponticello JP4 per la scelta, limitando il pilotaggio alle modalità Full step (senza ponticello) o Half step (con ponticello). Altra caratteristica di questo driver è che la tensione per il motore va da un minimo di 8 a un massimo di 35Volt. Per le mie prove, uso piccoli motori che funzionano bene tra 9 e 12Volt e allora ho aggiunto un convertitore di tensione CC step-up per usare una sola alimentazione (5Volt) per tutto il circuito. Nello schema vedete che questo convertitore è opzionale, cioè si può benissimo alimentare il motore con una sorgente esterna, se è richiesta una tensione (o una corrente) maggiore di quella che si può ottenere dal circuito.

Sullo schema troviamo inoltre il connettore per il motore bipolare (4 fili). Se disponiamo di un motore unipolare (3 fili per avvolgimento, con presa centrale) potremo comunque usare solo i due fili esterni, ignorando il centrale (vale per entrambi gli avvolgimenti).

Con il driver usato in questo circuito, si usano solo i fili 1,2,3 e 4. In caso di dubbi, per determinare quali sono, misurate con un tester le resistenze tra i vari fili.

Abbiamo poi un connettore per interfaccia J-Link e per una console seriale (tramite convertitore USB-seriale a 3.3Volt). Per programmare il modulino, l’interfaccia J-Link non serve, potete inserire il firmware attraverso il connettore USB del dongle stesso, come spiegato nel precedente articolo. Nel caso voleste comunque usare l’interfaccia J-Link, vi consiglio il modello J-Link EDU Mini, della Segger. Ho sperimentato anche dei “cloni” cinesi, ma l’originale costa solo qualche euro in più e ha tutti i driver garantiti e il supporto per il debug funzionante al 100%. Unica cosa critica, il piccolo connettore d’uscita, che costringe a farsi un adattatore “home made” per andare sul classico passo 0.1″ usato nelle schede per prototipi. Io l’ho fatto così:

Sulla parte hardware, dato che si utilizzano tutti moduli commerciali, non c’è niente di speciale da dire. Per il convertitore CC step-up, consiglio di tararlo per la tensione desiderata (c’è un trimmer a bordo) prima di collegarlo al circuito. Ovviamente, l’alimentatore esterno a 5Volt deve essere in grado di “reggere” il carico del circuito e del motore. Il convertitore CC step-up che ho usato, viene dichiarato con un’efficienza superiore al 77% e una corrente massima di 1A, quindi va bene per piccoli motori. Io ho usato per le prove un alimentatore da 5V-1.5A e uno stepper motor ULM-15 da 24 (full) steps per giro. Il convertitore CC step-up è tarato per un’uscita di 10V. Ho inoltre selezionato con il ponticello JP4 la modalità Half-Step, così per un giro completo servono 48 clocks.

Nel video che segue, ecco il circuito in funzione. Per rendere le cose più divertenti, ho messo sull’asse del motore un magnetino e ho chiuso tutto in una scatola; poi, ho preso una graffetta per documenti e l’ho incollata su un pezzo di carta sul quale ho disegnato una macchinina e così, quando il motore gira, la graffetta viene trascinata dal magnete e sembra una macchina in pista!

Qui sotto c’è un vecchio prototipo meccanico, costruito con il Lego, in cui viene usato uno stepper demoltiplicato modello 28BYJ-48. Sul connettore si vedono 5 fili, ma come abbiamo detto, ne vengono usati solo 4. Notate che il circuito presentato in questo articolo NON è appropriato per motori stepper funzionanti a 5Volt. Il driver 4988, infatti, lavora con una Vmot da 8 a 35Volt e sotto gli 8Volt non è affidabile o non funziona proprio. Per motori stepper a bassissime tensioni (3 o 5Volt), suggerisco di usare i soliti ULN2003 (in caso di motori con 5 o 6 fili) oppure qualcosa tipo il Sanyo LB1909M (obsoleto) o suoi discendenti per motori con solo 4 fili. Purtroppo, sia con il primo che con il secondo di questi  drivers, abbiamo un funzionamento completamente diverso da quello del 4988 di Allegro (o dei funzionalmente equivalenti LM297 – LM298). Il pilotaggio NON avviene mediante i segnali RST, EN, DIR, CLK, ma accendendo e spegnendo i singoli avvolgimenti del motore con una specifica sequenza. Un driver con la stessa modalità di funzionamento  del 4988, ma con tensione di lavoro da 2.5 a 10.8Volt è il DRV8834 della TI. Anche per questo, esiste un modulino già pronto con il pinout a passo 0.1″. Per il momento, andiamo avanti con questa versione di firmware e con il driver 4988; può darsi che io debba comunque sviluppare anche una versione con pilotaggio diretto del motore, per utilizzare i miei micro motori recuperati da vari apparecchi.

firmware

Ho sviluppato il firmware per il micro nRF52840 sulla piattaforma gratuita RTOS Zephyr della Linux Foundation. Il programma è abbastanza semplice: c’è una procedura iniziale in cui vengono inizializzate tutte le periferiche e vengono lanciati due thread, uno per la console seriale e l’altro per la gestione del bluetooth. Sia la console seriale che il bluetooth servono per dare i comandi e ricevere le risposte. Dato che tutti e due funzionano contemporaneamente, è possibile gestire lo stepper motor sia tramite un terminale seriale con interfaccia USB-TTL a 3.3V (protocollo 115200,N,8,1) sia tramite bluetooth (vedremo in seguito l’App per Android). Per rendersi conto di cosa si può fare, vediamo lo screenshot del mio PC usato come terminale. Nota: il programma miterm, scritto da me in FreeBasic, è disponibile nel pacchetto di download allegato all’articolo.

Ecco la lista completa dei comandi che si possono inviare tramite console. Alcuni sono a singolo tasto (una lettera è già il comando) mentre altri hanno bisogno di un parametro. Vediamo l’elenco:
h – comando immediato: stampa l’help con la lista dei comandi
p – comando immediato: manda un impulso di reset al driver
e – comando Enable, segue parametro e CR; se 1 disabilita, se 0 abilita il driver
s – comando Steps, segue parametro e CR; gli steps vanno da -9600 a -1 (antiorario) o da 1 a 9600 (orario)
f – comando Frequenza max, segue parametro e CR; i valori vanno da 1 a 20 (* 25), quindi il valore 1 è 25 SPS (Steps per Second) mentre 20 è 500 SPS
r – comando Rampa, segue parametro e CR; attualmente accetta solo i valori 0 (niente rampa) e 1 (rampa attiva)

A proposito della rampa, in questa release del firmware l’ho realizzata in modo non lineare. Con la rampa il motore parte sempre dalla velocità minima f1 (25 SPS) per arrivare in rampa a quella impostata, supponiamo f20 (500 SPS) per poi rallentare di nuovo sino a f1. Per ogni frequenza c’è un numero di passi proporzionale: ci sarà un solo step con f1, due con f2, tre con f3, sino a 20 con f20. Se il numero di passi impostato per il movimento è troppo basso per poter fare una rampa completa, il firmware riduce automaticamente la frequenza massima impostata.

Sul dongle USB vengono utilizzati due led. Quello verde, lampeggia al reset e poi rimane spento finché non si esegue un movimento del motore (comando s). Durante l’esecuzione del comando, il led si accende, per poi rispegnersi alla fine. Il secondo led è parte di quello RGB presente sul modulo. Si accende in blu per 250mS quando viene ricevuto un comando da Bluetooth. Un altro elemento importante è il pulsantino. Questo serve come “emergency button”, cioè se avete dato un comando sbagliato che fa girare il motore fino a scontrarsi con qualcosa, premendo il pulsantino tutto si fermerà e il driver del motore verrà disabilitato. Ciò è particolarmente utile perché il comando di movimento, una volta avviato non può essere fermato.

software

Ho già realizzato in passato una piccola applicazione in VisualBasic per testare dei motori stepper. Questo è lo screenshot:

Se vi interessa, tra la vecchia documentazione trasferita su questo sito (non in WP) c’è questo riferimento nella vecchia sezione CNC. Vi faccio notare che sono passati un po’ di anni e il mio sito www.numerico.it non esiste più, o se esiste, non è più il mio!

Ora ho scritto una App per Android che fa più o meno le stesse cose, ma ha il vantaggio di collegarsi al firmware tramite Bluetooth BLE, il che fa comodo perché non serve avere un PC accanto per dare i comandi. Ecco l’icona dell’App:

Come al solito, l’icona è molto minimalista! Ho scritto il software con B4A della Anywhere Software. Io comprai questo software (magnifico, credetemi) nel 2011, ma oggi è GRATIS e vi consiglio caldamente di scaricarlo dal sito del produttore per cominciare ad usare il vostro smartphone in modo creativo.

Ecco come si presenta l’App una volta installata. Attenzione: non è su Google Play, ma trovate l’apk nel file zip allegato. Dovete autorizzare sul vostro smartphone l’installazione da “fonti sconosciute”, se no non sarà possibile eseguirlo.

Nel riquadro a sinistra vediamo cosa accade appena lanciata l’App. Se abbiamo Android dalla versione 6 in poi, ci verrà richiesto di autorizzare l’accesso all’ubicazione. Questo non ha nessuna logica apparente, ma se volete che il Bluetooth BLE funzioni, dovete abilitarla (chiedete a Google perché, non a me). Nel riquadro a destra vediamo invece cosa succede se abbiamo autorizzato l’ubicazione, ma non abbiamo acceso il Bluetooth! Vi ricordo che dovete attivare anche l’ubicazione (io uso la modalità “solo GPS”). Supponiamo di aver fatto tutto quanto necessario… Ci troviamo adesso in questa situazione:

Clicchiamo “connect” e il programma farà una scansione dei dispositivi Bluetooth “visibili” nelle vicinanze. Se ne troviamo uno che si chiama StepTest_xxxx, siamo a posto. Il campo xxxx varia a seconda del chip nRF52840. Sono gli ultimi due bytes (in HEX) del device ID imposto dalla Nordic. Non è un numero univoco, ma è estremamente improbabile trovarne due uguali. In ogni caso, a noi serve solo nel caso in cui abbiamo più circuiti e vogliamo decidere quale controllare. Per selezionare ed effettuare il collegamento, premiamo a lungo sull’elemento della lista (nota: se siete in un ufficio vedrete una marea di dispositivi, selezionate quello giusto!)

Ecco a sinistra la finestra dei comandi, appena inizializzata. Per i comandi, valgono le stesse cose dette per la versione tramite terminale seriale. In effetti le cose girano in parallelo ed è possibile dare comandi sia da terminale seriale, sia da Bluetooth (una volta connessi). Nella finestra azzurra dei messaggi si vedranno le risposte che vengono dal circuito e/o gli errori in caso di errato inserimento dei dati. Per inserire i dati, per esempio la frequenza, scrivere il numero desiderato nella casella di edit e dopo ricordarsi di premere il pulsante a sinistra, che provoca la trasmissione del dato (se corretto) al circuito. A destra vediamo un esempio di comandi inviati. Il motore ha girato per 24 passi a frequenza 1 (25 SPS) e senza rampa. Per convenzione, i passi positivi si intendono in senso orario e quelli negativi in senso antiorario. Se sul vostro circuito funziona alla rovescia, scambiate i fili degli avvolgimenti del motore.

Conclusioni e allegati

Questo è tutto. Nell’allegato trovate, zippati, diversi files. Vediamoli:

miterm.exe è un mio piccolo terminale seriale, davvero elementare, che però funziona e non richiede installazione.
miterm-com4-115200.bat è un batch file che lancia l’applicazione con i parametri Com4, 115200,N,8,1 (si può editare il batch per cambiare velocità o porta Com).
steppertest.apk è la App per Android che abbiamo visto
steppertest_200511.hex è il file da programmare nel dongle USB Nordic (vedere istruzioni nel precedente articolo).

Il file zip ha una password che è “eficara”. Ho usato il programma 7Z per comprimere e cifrare il file. Prima di ogni operazione di unzip / exec sui files scaricati da Internet, verificate il codice SHA-1 per essere sicuri che il file sia integro e non manipolato da altri. In questo caso l’hash deve essere:

SHA-1: 57A57B4673FBCBCA0C972787D8C88BFACF4A878B

Infine il link per il download: steppertest_200511.zip

La legge è legge

Vi ricordo che non mi assumo nessuna responsabilità per eventuali problemi che dovessero sorgere con il download e/o l’installazione del materiale messo a disposizione. Si tratta di materiale di natura hobbistica e messo a disposizione in forma gratuita, perciò voi, utilizzandolo, vi prendete la piena responsabilità. Non sono un esperto di “legalese”, ma spero che il concetto sia sufficientemente chiaro.