[RISOLTO] ESP32-CAM + Arduino Uno (e rilevazione movimento)

Buonasera,
sta per arrivarmi questo modulo ESP32-CAM, del quale allego l'unico documento leggibile che ho trovato.

Vorrei provare a collegarlo via seriale ad Arduino per interagire con la camera (scattare foto, accendere flash, sperando che si possa fare!), come se fosse una periferica, il tutto naturalmente per sfizio :slight_smile:

Domanda (spero di non dire sciochezzze :confused: ):
da quello che ho potuto capire dal datasheet ridotto (allegato), sembrerebbe che i pin Esp32 lavorino a 3.3V (anche se ha un ingresso a 5V), e quindi per collegarlo ad Arduino (TX-RX) dovrei utilizzare un Level Shifter.
Corretto?

Se è corretto, quindi, per avere una comunicazione bidirezionale, mi conviene prendere un modulo tipo questo.

Altra domanda, ho trovato anche questo, ma non capisco se c'è una reale differenza con l'altro.
Il dubbio mi viene solo perchè vedo scritto TX RX, quindi sembrerebbe più adatto a comunicazioni seriali!
Sbaglio?

TIA
Federico

[EDIT]
Ho modificato il titolo, visto che il thread ha preso anche altre strade :slight_smile:

Ai-Thinker-ESP32-CAM Product Specification.pdf (174 KB)

Altra domanda, ho trovato anche questo, ma non capisco se c'è una reale differenza con l'altro.
Il dubbio mi viene solo perchè vedo scritto TX RX, quindi sembrerebbe più adatto a comunicazioni seriali!
Sbaglio?

Questo ha certamente un canale 5 to 3.3 passivo (cioè solo resistenze), mentre il canale 3.3 to 5 è attivo.

Le scritte sul PCB mi confondono, perché:

5V 3.3
TX --> RX passivo
RX <-- TX attivo

Quindi una schedina per due connessioni seriali.

L'altro non lo capisco.

Comunque alla fine perché non prendi un convertitore USB to serial che lavora direttamente a 3.3V, così eviti collegamenti aggiuntivi.

Mi pare di averne visti alcuni in cui c'è un jumper per selezionare tra 5V o 3.3V.

Ciao.

Maurotec:
L'altro non lo capisco.

Grazie, ho indagato meglio e ho trovato le descrizioni tecniche sul sito Sparkfun.

Il secondo (quello TX-RX per intenderci) non è più in produzione ed è stato sostituito dal primo (LV-HV).
Tra gli esempi di utilizzo, c'è proprio "Using the BD-LLC for Serial", cioè quello che vorrei provare a fare :slight_smile:

Maurotec:
Comunque alla fine perché non prendi un convertitore USB to serial che lavora direttamente a 3.3V, così eviti collegamenti aggiuntivi.
Mi pare di averne visti alcuni in cui c'è un jumper per selezionare tra 5V o 3.3V.

In realtà ne ho già preso uno, questo, per poter programmare ESP32, ma volevo lasciare libera la USB di Arduino.. e poi mi piace complicarmi le cose, altrimenti dove sta il divertimento :slight_smile:

Visto che ci siamo, non conosco l'ESP32, ma in teoria, lasciando da parte la comunicazione seriale, sarebbe possibile collegare direttamente (sempre abbassando la tensione) un pin digitale Arduino (mode output) e un pin ESP32 (mode input)?

[Edit]
ed in questo caso per abbassare la tensione, basterebbe un semplice Partitore di tensione (5V->3.3V)?

TIA
Federico

Visto che ci siamo, non conosco l'ESP32, ma in teoria, lasciando da parte la comunicazione seriale, sarebbe possibile collegare direttamente (sempre abbassando la tensione) un pin digitale Arduino (mode output) e un pin ESP32 (mode input)?

Si, ma per fare il contrario ti serve per forza un componente attivo.

Visto che ci siamo, non conosco l'ESP32

ah ma neanche io, ma comunque da wikipedia apprendo che è un CPU dual core a 32-bit alimentata a 3.3V.

Mi sembra proprio roba complicata assai. Ma se lo programmi con IDE arduino avrai anche la pinMode ecc e allora si semplifica molto.

Ciao.

Maurotec:
Si, ma per fare il contrario ti serve per forza un componente attivo.

Per quello che ho in mente, mi basta Arduino->ESP32

Maurotec:
Ma se lo programmi con IDE arduino avrai anche la pinMode ecc e allora si semplifica molto.

Esattamente :slight_smile:

Appeno riesco a provare, ti aggiorno :slight_smile:

Grazie
Federico

Guarda che il modulo ti arriverà senza nessun firmware.
Devi
installare il core ESP32
nelle schede scegliere il modulo ESP32-CAM AI-thinker
caricare l'esempio CameraWebServer
modificarlo leggendo i commenti nell'esempio (per l'AI Thinker)
mettere l'ESP32 in flash mode (GPIO0 a massa)
Collegare un convertitore USB-seriale che funzioni a 3.3V e sia anche in grado di alimentare il modulo sempre a 3.3V oppure a 5V (ma cambia il pin di ingresso!)
programmarlo.

Stacca il ponte tra GPIO0 e GND e premi il reset
Sulla seriale vedrai che mette su un server WEB cui potrai connetterti usando un browser. Si deve però connettere ad una WiFi o mettere su una sua WiFi cui dovrai collegarti.

Se leggi il codice puoi vedere che non serve l'arduino per comandarlo ma poi usare il modulo stesso.

Il LED si accende agendo sul GPIO4 se non ricordo male

In rete ci sono anche esempi che prendono una foto e la salvano sulla microSD. PErò trovi solo roba in inglese e poco in italiano.

zoomx:
Guarda che il modulo ti arriverà senza nessun firmware.
Devi ...

Grazie, ho già studiato tutto e sono pronto :slight_smile:

zoomx:
Se leggi il codice puoi vedere che non serve l'arduino per comandarlo ma poi usare il modulo stesso.

Lo so, ma per quello che ho in mente, mi piacerebbe riuscire ad inviargli qualche comando da Arduino, cioè usarlo come fosse una periferica.

Ho già Arduino collegato via Bluetooth allo smartphone (mia app), e quindi vorrei riuscire ad inviare comandi a ESP32 via Arduino che li riceve da smartphone.
Chiaramente le immagini le riceve direttamente l'app sullo smartphone via wifi da ESP32.
In questo modo ho solo Arduino connesso via BT e posso sfruttare il wifi di ESP32 per lo streaming delle immagini.

Per il momento è solo un'idea, ma in teoria dovrebbe funzionare... spero :slight_smile:

Grazie
Federico

Se usi lo smartphone puoi comandarlo via WiFi direttamente.
MA se vuoi utilizzare il bluetooth forse potresti usare sempre quello del modulo, lo usi per ricevere il comando, poi lo spegni e avvii il WiFi per mandare la foto, spegni il WiFi e riaccendi il bluetooth.

Oppure usi il modulo con Arduino, potresti usare un pro micro a 3.3V.

Un'ultima cosa, accanto al connettore dell'antenna controlla dove è stata saldata la piccolissima resistenza SMD perché se è saldata verso il connettore l'antenna su PCB è disabilitata. Il mio modulo è arrivato così.

zoomx:
Un'ultima cosa, accanto al connettore dell'antenna controlla dove è stata saldata la piccolissima resistenza SMD perché se è saldata verso il connettore l'antenna su PCB è disabilitata. Il mio modulo è arrivato così.

Avevo già letto un tuo post dove ne parlavi :slight_smile:
Comunque grazie, se arriva cosi, ti chiedo in dettaglio come procedere.

Federico

AGGIORNAMENTO

Finalmente dopo aver ricevuto un modulo USB-TTL (CP2102), sono riuscito a fare i primi test di comunicazione seriale tra i moduli in oggetto.
Purtroppo ho avuto difficoltà a trovare un buon SoftwareSerial su ESP, ma alla fine ho trovato questa che sembra funzionare bene (almeno nei test), ma ho dovuto utilizzare la board esp32 1.0.3-rc1.

Allego lo schema utilizzato con il convertitore di livello logico (5V-3.3V) per il collegamento seriale e la prova di comunicazione :slight_smile:

Federico

ESP32-CAM_ArduinoUno_Test.png

Dici che la SoftwareSerial non funziona con l'attuale core e hai dovuto installare una Release Candidate?

Io nel frattempo ho spostato il resistore ma mi sa che il flusso video con l'antenna integrata non ce la fa (vedo disturbi) per cui credo che tornerò a spostare quel dannato resistore e ad installare l'antenna esterna che, nel frattempo, è arrivata.

zoomx:
Dici che la SoftwareSerial non funziona con l'attuale core e hai dovuto installare una Release Candidate?

Esattamente, ricevevo un errore in fase di compilazione, poi ho trovato questo, quindi ho provato la RC e sembra funzionare con un semplice codice di test, ma... appena sposto il tutto sul codice CameraWebServer, si incasina non poco e non trova la "camera".

Su ESP32-Cam ho usato i pin 12 e 14

#include <SoftwareSerial.h> //https://github.com/plerup/espsoftwareserial
#define TX_PIN 14
#define RX_PIN 12
#define BAUD_RATE 57600
...
sSerial.begin(BAUD_RATE, RX_PIN, TX_PIN, SWSERIAL_8N1, false, 95, 11);
...
sSerial.println(WiFi.localIP());
...

come puoi immaginare, il mio primo obiettivo è cercare di inviare l'IP ad Arduino, ma ho il sospetto che non sia possibile utilizzare quei pin, anche se non si utilizza la SD!

Si trova pochissima documentazione, ma vorrei fare un tentativo utilizzando i pin 0 e 16, pare non siano utilizzati (a parte durante la compilazione). Il 16 è dichiarato come U2RXD, ma non trovo nulla dove se ne parli!

Altro tentativo possibile, sempre con la EspSoftwareSerial, utilizzare un unico pin per RX/TX; c'è tra gli esempi, ma devo ancora guardarci.

Diciamo, che è una bella sfida, e visto che non ho le competenze per dire non è possibile, faccio tutti i tentativi che riesco :wink:
Naturalmente se anche tu ci provi, almeno possiamo scambiarci i risultati :slight_smile:

Tra le varie prove, ho anche eliminato la SoftwareSerial è utilizzato i pin UART predisposti (1 e 3); la trasmissione avviene, anche se molto sporca! Ho cercato di disabilitare tutti i log (Serial.print), ma da qualche parte continuano ad esistere :frowning:

zoomx:
Io nel frattempo ho spostato il resistore ma mi sa che il flusso video con l'antenna integrata non ce la fa (vedo disturbi) per cui credo che tornerò a spostare quel dannato resistore e ad installare l'antenna esterna che, nel frattempo, è arrivata.

Mi spiace, quello che è arrivato a me funziona benino con la sua antenna integrata.
Fammi sapere come va con l'esterna, se il "flusso" fosse più fluido, non mi dispiacerebbe.

Federico

Ti segnalo questo post

che descrive i pin usati per la SDcard (per i moduli AI-Thinker che la hanno)
GPIO 2: Data 0
GPIO 4: Data 1 (also connected to the on-board whiteLED)
GPIO 12: Data 2
GPIO 13: Data 3 (also connected to a small red led)
GPIO 14: CLK
GPIO 15: CMD

A quanto pare la Face Recognition non funziona con gli ultimi core. Ancora mai provata.

zoomx:
Ti segnalo questo post
...
A quanto pare la Face Recognition non funziona con gli ultimi core. Ancora mai provata.

Grazie, i pin li conosco, nel primo post ho messo il "datasheet" :slight_smile:
Ieri sera ho testato la camera con la RC, ed effettivamente ho notato qualche problema anche solo con lo streaming; il flusso si interrompeva, ma devo verificare meglio, potrebbe essere colpa delle modifiche che ho fatto al codice :slight_smile:

Comunque farò qualche altro tentativo, poi torno alla versione 1.01/1.02 ed elimino la SoftwareSerial, peccato!

Federico

PS
Certo che sto modulino potevano farlo un po' meglio! Tra cavetti a destra e manca e reset nella parte posteriore, è impossibile maneggiarlo!

Qui

parla delle altre seriali hardware.
Non capisco perché bisogna specificare i pin visto che è hardware ma potrebbe essere che la serial2 si può definire su porte hardware diverse.

I pin della U2UXD sono il 16 e il 17. Solo che il 16 c'è sui pin esterni mentre il 17 andrebbe tirato fuori dal modulino ESP32 interno.

zoomx:
I pin della U2UXD sono il 16 e il 17. Solo che il 16 c'è sui pin esterni mentre il 17 andrebbe tirato fuori dal modulino ESP32 interno.

Attenzione, il 17 sembra che sia usato dalla PSRAM (guarda schema allegato), quindi forse non è il caso di toccarlo :slight_smile:

Federico

ESP32_CAM_V1.6.pdf (26.2 KB)

AGGIORNAMENTO

Sono riuscito ad utilizzare la EspSoftwareSerial con le release 1.0.1 e 1.0.2 di ESP32, applicando una piccola modifica nel file "SoftwareSerial.h".

Riesco a comunicare tra ESP32-CAM e Arduino, ma, come previsto, appena configuro la CameraWebServer con la SoftwareSerial, va in errore in fase di reboot e non riconosce la camera.
Ho provato con tutte le combinazioni dei pin liberi niente.

In definitiva, per il momento, abbandono l'idea iniziale della seriale software :frowning:

Federico

Evidentemente la SoftwareSerial usa qualcosa che è utilizzata anche dalla camera. Se non è un pin mi sa che è qualche timer o l'interrupt interferisce con altro.
Se non devi usare comandi complessi ma semplici potresti rilevare semplicemente lo stato di un pin.

zoomx:
Se non devi usare comandi complessi ma semplici potresti rilevare semplicemente lo stato di un pin.

Ma no, è solo uno esercizio fine a se stesso; comunque quello era il prossimo passo :slight_smile:

Grazie
Federico

A me invece è venuto il sospetto che la USB2 del portatile non fornisca corrente suffciente e i disturbi che ho notato siano dovuti a quello. O anche a quello.