STM32F1 Blue-pill: shield WiFi (WiFiNINA)

Spread the love

Prima di tutto, leggi l’articolo “STM32: WiFiNINA con un ESP32 come WiFi Co-Processor“, dove ci sono tutte le basi per capire meglio l’utilizzo di questo shield.

STM32F1 blue pill wifi shield (WiFiNINA)
STM32F1 blue pill wifi shield (WiFiNINA)

Per me è molto importante la connessione di rete e la limitazione della rete su STM32 è molto fastidiosa. Adafruit offre una soluzione, ma penso che uno shield sia più utilizzabile.

Quindi ho progettato uno shield per aggiungere il WiFi al mio STM32F1 blue-pill.

PCB

Puoi avere il PCB per pochi dollari.


PCB STM32F1 blue pill shield wifi PCBWay
PCB from PCBWay

Il PCB è abbastanza semplice e aggiungo anche un’interfaccia per aggiornare il firmware su esp32. Stranamente, l’esp32-s sembra aggiornarsi meglio dell’esp32-wroom-32. Probabilmente il filo sottile che ho usato come connessione aggiunge rumore al trasferimento seriale.

ESP32 S pinout low resolution
ESP32 S pinout low resolution

Qui la mia selezione di esp32 ESP32 Dev Kit v1 - Selectable - TTGO T-Display 1.14 ESP32 - NodeMCU V3 V2 ESP8266 Lolin32 - NodeMCU ESP-32S - WeMos Lolin32 CP2104 CH340 - ESP32-CAM programmer - ESP32-CAM bundle - ESP32-WROOM-32 - ESP32-S

È fondamentale selezionare un stm32f1 di buona qualità. Alcuni dispositivi clone hanno problemi.

Pinout STM32 STM32F1 STM32F103 STM32F103C8 low resolution
Pinout STM32 STM32F1 STM32F103 STM32F103C8 low resolution

Qui la mia selezione di stm32 STM32F103C8T6 STM32F401 STM32F411 ST-Link v2 ST-Link v2 official

Ecco il disegno del PCB.

STM32F1 blue pill wifi shield (WiFiNINA)
STM32F1 blue pill wifi shield (WiFiNINA)

Il risultato è questo PCB. Ecco la vista dall’alto:

STM32F1 blue pill wifi shield: up
STM32F1 blue pill wifi shield: up

ed ecco il sotto.

STM32F1 blue pill wifi shield: bottom
STM32F1 blue pill wifi shield: bottom

In alto, puoi vedere il pad da saldare per selezionare il pin CS del modulo WiFi (fare riferimento all’articolo sul coprocessore Wifi).

ESP32DescriptionSTM32
GPIO05CSPB1, PB0, PA4
GPIO18SCKPA5
GPIO23MISOPA6
GPIO14MOSIPA7
GPIO33BUSY/READY (IRQ)PA3
EN (reset on LOW)RST/ENPA2
GPIO0 (Flash)FlashPA1 (not needed)
GNDGNDGND
VIN3.3vFrom 5v to a voltage regulator

Sotto aggiungo un terminale SH1.0 orizzontale per interfacciarsi con l’FTDI e due pulsanti per programmare e resettare l’esp32.

Qui i terminali SH1.0 Terminal sh1.0 jst1.25 zh1.5 ph2.0 xh2.54 - 2.54mm PCB Screw Terminal Blocks

Puoi fare riferimento all’articolo “ESP32-wroom-32, esp32-S: flash, piedinatura, spec e config dell’IDE Arduino” che spiega come programmare esp32 senza una scheda di prototipazione.

esp32-wroom-32 programming flash connection breadboard
esp32-wroom-32 programming flash connection breadboard

Assemblaggio del PCB

La scheda è molto semplice da montare. Hai bisogno:

  • un esp32-s o un esp32-wroom-32

Il co-processore WiFi ESP32 Dev Kit v1 - Selectable - TTGO T-Display 1.14 ESP32 - NodeMCU V3 V2 ESP8266 Lolin32 - NodeMCU ESP-32S - WeMos Lolin32 CP2104 CH340 - ESP32-CAM programmer - ESP32-CAM bundle - ESP32-WROOM-32 - ESP32-S

  • Regolatore di tensione SMD AMS1117-3.3V

Regolatore di voltaggio AliExpress SMD (AMS1117) - AliExpress 3.3v (LM1117) - AliExpress 5v (7805) - AliExpress 9v (7809)AliExpress 12v (7812) - AliExpress 3.3v TO-92 (78L33)

  • Pulsanti SMD

SMD buttons SMD buttons 3X6X2.5

  • Terminale SH1.0

Terminal Terminal sh1.0 jst1.25 zh1.5 ph2.0 xh2.54 - 2.54mm PCB Screw Terminal Blocks

  • Resistenza 805 SMD (10uF)
  • Header femmina

Prima di assemblare caricare il firmware su esp32, il piccolo connettore SMD può generare delle interferenze e alcuni esp32-wroom-32 non consentono di caricare il firmware.

Prima di assemblare caricare il firmware WiFi su esp32

È inoltre necessario saldare il relativo pad al pin CS selezionato.

Utilizzare il connettore per caricare il firmware sull’esp32

Puoi fare riferimento a questo articolo “ESP32-wroom-32, esp32-S: flash, piedinatura, spec e config dell’IDE Arduino” per avere informazioni complete sul processo.

Come ho già detto, ho aggiunto un connettore per caricare il firmware sull’esp32. Per usarlo, è necessario un FTDI.

FTDI AliExpress USB to TTL CH340G - AliExpress USB to TTL FT232RL


Devi anche crimpare un cavo e puoi vedere la posizione dei pin sul PCB (G, V, Tx e Rx).

STM32 WiFi shield with FTDI to update firmware nina-fw
STM32 WiFi shield with FTDI to update firmware nina-fw

Il processo di caricamento è semplice:

  • Collegare l’FTDI;
  • Tenere premuto il pulsante Prog;
  • Fare clic e rilasciare il pulsante EN;
  • Rilascia il pulsante Prog (ora esp32 è in modalità download);
  • Avvia il processo di caricamento sulla porta del tuo FTDI.

Puoi trovare il processo completo e il firmware nel relativo articolo “STM32: WiFiNINA con ESP32 WiFi Co-Processor”.

Primo test di comunicazione

Ora metti il ​​tuo STM32F1 sul tuo shield.

STM32F1 blue pill wifi shield
STM32F1 blue pill wifi shield

E andremo a testare una comunicazione di base tra il tuo ESP32 e il tuo STM32.

Sketch controllo firmware

Lo sketch richiede la versione del firmware installato sull’ESP32.

/*
 * This example check if the firmware loaded on the NINA module
 * is updated.
 *
 * modified by Renzo Mischianti <www.mischianti.org>
 *
 * www.mischianti.org
 *
 */
#include <SPI.h>
#include <WiFiNINA.h>

#define SPIWIFI       SPI  // The SPI port
#define SPIWIFI_SS    PA4   // Chip select pin
#define ESP32_RESETN  PA2   // Reset pin
#define SPIWIFI_ACK   PA3   // a.k.a BUSY or READY pin
#define ESP32_GPIO0   -1

void setup() {
  // Initialize serial
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // Print a welcome message
  Serial.println("WiFiNINA firmware check.");
  Serial.println();

  // Set up the pins!
  WiFi.setPins(SPIWIFI_SS, SPIWIFI_ACK, ESP32_RESETN, ESP32_GPIO0, &SPIWIFI);

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  // Print firmware version on the module
  String fv = WiFi.firmwareVersion();
  String latestFv;
  Serial.print("Firmware version installed: ");
  Serial.println(fv);

  latestFv = WIFI_FIRMWARE_LATEST_VERSION;

  // Print required firmware version
  Serial.print("Latest firmware version available : ");
  Serial.println(latestFv);

  // Check if the latest version is installed
  Serial.println();
  if (fv >= latestFv) {
    Serial.println("Check result: PASSED");
  } else {
    Serial.println("Check result: NOT PASSED");
    Serial.println(" - The firmware version on the module do not match the");
    Serial.println("   version required by the library, you may experience");
    Serial.println("   issues or failures.");
  }
}

void loop() {
  // do nothing
}

Ricordarsi di selezionare il pin CS corretto (in base alla saldatura del pad)

#define SPIWIFI_SS    PB0   // Chip select pin

Se tutto è a posto, l’output dello sketch è:

Firmware version installed: 1.7.4
Latest firmware version available : 1.2.1

Check result: PASSED

Questo è bene, ma il test non è sufficiente per essere sicuri che tutto funzioni correttamente. Ora carichiamo uno sketch per scansionare tutte le reti wifi.

Sketch dello scanner di rete Wi-Fi

/*

 This example  prints the board's MAC address, and
 scans for available Wifi networks using the NINA module.
 Every ten seconds, it scans again. It doesn't actually
 connect to any network, so no encryption scheme is specified.

 Circuit:
 * Board with NINA firmware on it (In this case its an Adafruit AirLift)

 created 13 July 2010
 by dlf (Metodo2 srl)
 modified 21 Junn 2012
 by Tom Igoe and Jaymes Dec
 modified 17 May 2022
 by Renzo Mischianti

 */


#include <SPI.h>
#include <WiFiNINA.h>

#define SPIWIFI       SPI  // The SPI port
#define SPIWIFI_SS    PA4   // Chip select pin
#define ESP32_RESETN  PA2   // Reset pin
#define SPIWIFI_ACK   PA3   // a.k.a BUSY or READY pin
#define ESP32_GPIO0   -1

void printMacAddress(byte mac[]);
void printEncryptionType(int thisType);
void listNetworks();

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("WiFi Scanning test");

  // Set up the pins!
  WiFi.setPins(SPIWIFI_SS, SPIWIFI_ACK, ESP32_RESETN, ESP32_GPIO0, &SPIWIFI);

  // check for the WiFi module:
  while (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    delay(10000);
  }
  String fv = WiFi.firmwareVersion();
  Serial.println(fv);
  if (fv < "1.0.0") {
    Serial.println("Please upgrade the firmware");
    while (1) delay(10);
  }
  Serial.println("Firmware OK");

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC: ");
  printMacAddress(mac);
}

void loop() {
  // scan for existing networks:
  Serial.println("Scanning available networks...");
  listNetworks();
  delay(10000);
}

void listNetworks() {
  // scan for nearby networks:
  Serial.println("** Scan Networks **");
  int numSsid = WiFi.scanNetworks();
  if (numSsid == -1) {
    Serial.println("Couldn't get a wifi connection");
    while (true);
  }

  // print the list of networks seen:
  Serial.print("number of available networks:");
  Serial.println(numSsid);

  // print the network number and name for each network found:
  for (int thisNet = 0; thisNet < numSsid; thisNet++) {
    Serial.print(thisNet);
    Serial.print(") ");
    Serial.print(WiFi.SSID(thisNet));
    Serial.print("\tSignal: ");
    Serial.print(WiFi.RSSI(thisNet));
    Serial.print(" dBm");
    Serial.print("\tEncryption: ");
    printEncryptionType(WiFi.encryptionType(thisNet));
  }
}

void printEncryptionType(int thisType) {
  // read the encryption type and print out the name:
  switch (thisType) {
    case ENC_TYPE_WEP:
      Serial.println("WEP");
      break;
    case ENC_TYPE_TKIP:
      Serial.println("WPA");
      break;
    case ENC_TYPE_CCMP:
      Serial.println("WPA2");
      break;
    case ENC_TYPE_NONE:
      Serial.println("None");
      break;
    case ENC_TYPE_AUTO:
      Serial.println("Auto");
      break;
    case ENC_TYPE_UNKNOWN:
    default:
      Serial.println("Unknown");
      break;
  }
}


void printMacAddress(byte mac[]) {
  for (int i = 5; i >= 0; i--) {
    if (mac[i] < 16) {
      Serial.print("0");
    }
    Serial.print(mac[i], HEX);
    if (i > 0) {
      Serial.print(":");
    }
  }
  Serial.println();
}

Se ottieni un output come questo, la scheda è ok.

Scanning available networks...
** Scan Networks **
number of available networks:6
0) reef-casa-sopra	Signal: -49 dBm	Encryption: WPA2
1) reef-casa-orto	Signal: -69 dBm	Encryption: WPA2
2) reef-casa-centro	Signal: -78 dBm	Encryption: WPA2
3) reef-casa-centro	Signal: -83 dBm	Encryption: WPA2
4) reef-casa-sotto	Signal: -87 dBm	Encryption: WPA2
5) TIM-18355607	Signal: -91 dBm	Encryption: WPA2

Grazie

  1. STM32F1 Blue Pill: piedinatura, specifiche e configurazione IDE Arduino (STM32duino e STMicroelectronics)
  2. STM32: programmazione (STM32F1) via USB con bootloader STM32duino
  3. STM32: programmazione (STM32F1 STM32F4) tramite USB con bootloader HID
  4. STM32F4 Black Pill: pinout, specifiche e configurazione IDE Arduino
  5. STM32: ethernet w5500 standard (HTTP) e SSL (HTTPS)
  6. STM32: ethernet enc28j60 standard (HTTP) e SSL (HTTPS)
  7. STM32: WiFiNINA con un ESP32 come WiFi Co-Processor
    1. STM32F1 Blue-pill: shield WiFi (WiFiNINA)
    2. STM32F4 Black-pill: shield WiFi (WiFiNINA)
  8. Come utilizzare la scheda SD con l’stm32 e la libreria SdFat
  9. STM32: memoria flash SPI FAT FS
  10. STM32: RTC interno, sistema orario e backup batteria (VBAT)
  11. STM32 LoRa
  1. STM32 Risparmio energetico
    1. STM32F1 Blue-Pill gestione clock e frequenza
    2. STM32F4 Black-Pill gestione clock e frequenza
    3. Introduzione e framework Arduino vs STM
    4. Libreria LowPower, cablaggio e Idle (STM Sleep).
    5. Sleep, deep sleep, shutdown e consumo energetico
    6. Sveglia da allarme RTC e Seriale
    7. Sveglia da sorgente esterna
    8. Introduzione al dominio di backup e conservazione delle variabili durante il RESET
    9. Registro di backup RTC e conservazione della SRAM

Spread the love

Lascia un commento

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