ESP-01 I/O expander con due motori PWM

Update 20 Giu 2022: All parts together and translated into English
https://hackaday.io/project/185944-serial-io-expander

Questo è il primo “progetto del weekend” che faccio nella nuova “location”. Il mio laboratorio mobile è ridotto all’osso, ma la passione c’è sempre. Ho fatto delle aggiunte al progetto precedente  ESP-01 I/O expander via Serial port e quindi per maggiore chiarezza è opportuno fare riferimento a quello in caso di dubbi.

Come nel caso precedente, il firmware è diviso in due sezioni: la parte per il modulino WiFi ESP-01 e la parte per il micro ATtiny2313. Anche qui, la prima è sviluppata su Arduino e la seconda su IDE della IAR (Kickstart).

Per la parte su Arduino, ho scritto un’applicazione di test minimalista, ma con il vantaggio di poter usare un qualsiasi dispositivo dotato di browser web per inviare i comandi. In pratica, il programma appena acceso si mette a fare da Access Point ed esegue un web server minimalista che analizza la richiesta e la trasforma in comando su seriale verso il micro, riceve da questo la risposta e la rimanda come pagina html al dispositivo che ha fatto la richiesta.

L’Access Point si chiama “serio2mot” e risponde all’IP 10.0.0.1. Ogni comando è come se fosse una pagina web il cui nome comincia con “cmd.” (questa parte è fissa) ed è seguita dal comando vero e proprio. Attenzione, il browser, in genere, tende ad aggiungere il prefisso https (protocollo sicuro) che per il nostro uso non va bene. Per esempio, se nella barra degli indirizzi scriviamo: 10.0.0.1/cmd.Bg (comando per leggere la porta B) vedremo che questo viene trasformato in: https://10.0.0.1/cmd.Bg e quindi non riceveremo risposta. Sarà così necessario fare una piccola aggiunta e scrivere: 10.0.0.1:80/cmd.Bg che forzerà il browser ad usare una connessione http “normale” sulla porta 80. Raccomando di salvare i comandi come bookmark, per semplificare gli invii successivi.

Esempio comando motori stessa direzione, velocità sinistro 3 e destro 6

La parte di firmware per il micro ATtiny2313 è un’espansione della versione precedente. Ho usato un timer programmato per generare un interrupt ogni 5 mS e in tale funzione è gestito il controllo dei motori con pwm. Dato che il driver di potenza dei motori ha due linee di controllo per ogni motore, il PWM è mandato sull’una o sull’altra in funzione della direzione di rotazione. Per controllare due motori abbiamo quindi bisogno di 4 linee di I/O che ho assegnato, arbitrariamente alle porte PB.3-PB.2 (sinistro) e PB.1-PB.0 (destro). Si noti che, per compatibilità con la versione precedente, questo interrupt non agisce se non è stato ricevuto un comando “Mo”. Questo comando, infatti, forza i pin da PB.3 a PB.0 come output e abilita la funzione motore / PWM. Una volta abilitato, questo resta in funzione fino a quando non c’è un comando “Hr” (hardware reset).

A sinistra: speed 1 (giallo) speed 6 (verde)
A destra: speed 3 (giallo) speed 6 (verde) – trigger point al centro

Come driver di potenza per i motori ho usato un modulino MX-1508 acquistato on-line. Questo è lo schema dei cablaggi (fare riferimento allo schema generale del primo articolo). Come alimentatore ho usato un power-pack per ricaricare i telefoni, che fornisce 5V su una porta USB ed è ricaricabile…

I comandi a disposizione sono gli stessi della versione precedente con due aggiunte (nota: i comandi dati via web non hanno bisogno del “+”, viene aggiunto automaticamente dal firmware; per esempio, il comando web “cmd.Bg” viene trasmesso su seriale come “+Bg\n”). I nuovi comandi sono “Hr” (hardware reset) che provoca il reset da watchdog del micro Attiny2313 e “Modsds” che attiva i due motori. Vediamo quest’ultimo in dettaglio: “Mo” è il comando vero e proprio (Motor operate) e “dsds” sono direction and speed rispettivamente per il motore sinistro e destro. Direction può avere i valori ‘0’ e ‘1’ che sono avanti o indietro (poi, dipende dal cablaggio del motore!) mentre Speed può andare da ‘0’ a ‘7’. Il firmware non esegue controlli di validità di questi dati, ma solo un “and” tra il carattere ascii ricevuto e una maschera (1 nel primo caso, 7 nel secondo). Se speed è 0, il motore è spento, se è 7 il motore gira alla massima velocità, senza PWM. I valori da 1 a 6 provocano invece il pwm proporzionale al valore. Dalle mie prove, questa regolazione di velocità è sufficiente per tante applicazioni.

Ecco la “tartaruga rovesciata” durante la fase di test. Notare i motori servo modificati. Tutta l’elettronica interna è stata eliminata.

Veniamo infine al firmware. Nel file zippato (password: eficara) serio2mot_220522.zip troverete le cartelle di lavoro per Arduino e per IAR:

Nella cartella Release (di IAR) c’è il file .hex per chi vuole programmare il micro ATtiny2313 senza modifiche. La configurazione dei “fuses” la trovate in testa al file main.c e il file .eww lancia l’ambiente di sviluppo IAR (se installato!). Spero che questo progettino possa essere utile ad altri che come me, amano costruire le cose. Se usate il mio materiale per sviluppare altri progetti, per favore aggiungete un riferimento al mio sito, grazie!