Alternative to built-in OTA library please?

Ok, I got OTA working with an Arduino R4 but it wasn't easy!

I'm posting here the steps I took so that others may find it useful. If there is anything inaccurate in my post then please let me know as I don't want to make it worse!

The way I did it involved using ArduinoOTA libray from Juraj here: ArduinoOTA

Firstly the examples given use a WiFi library which I couldn't get working so I changed from #include 'WiFiNINA.h' to #include 'WiFiS3.h'. I only had to change one line in the sketch to get that one working: if (WiFi.status() == WL_NO_SHIELD) becomes if (WiFi.status() == WL_NO_MODULE).

The README.md files contain a lot of good information but there is no working example for OTA using Arduino R4 only for some other boards. When I first got into it I could not establish a network connection from the IDE. This is a known issue and Juraj gives a workaround and says it's the best way to go anyway.

What you are doing is making a 'fake' programmer inside the IDE that points at the network address for your Arduino once it has connected to the WiFi.

The key steps are: 'Copy platform.local.txt next to platform.txt in the hardware package of your board'. On my PC for the R4 it is "C:\Users\paul\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.2.1". You have to copy 'platform.local.txt' from the ArduinoOTA library download.

You also have to edit programmers text to add the section in the readme given below. You'll have to edit the name and IP address to suit your own device.

arduinoOTA104.name=Arduino OTA (192.168.1.104)
arduinoOTA104.program.tool=arduinoOTA
arduinoOTA104.program.tool.default=arduinoOTA
arduinoOTA104.ip=192.168.1.104

But I still couldnt get an upload working and that turned out to be because the changes you made to programmers.txt are only read once the first time the IDE attempts to find a board. To make it accept the changes you made you have to make the IDE reset by deleting a folder as described here and restarting the IDE: Changes to programmers.txt are not recognized #591

My example code is here. It includes a bit of Blink.ino so you can prove it works for you.:

/*

 This example connects to an WPA encrypted WiFi network.
 Then it prints the  MAC address of the Wifi shield,
 the IP address obtained, and other network details.
 It then polls for sketch updates over WiFi, sketches
 can be updated by selecting a network port from within
 the Arduino IDE: Tools -> Port -> Network Ports ...

 Circuit:
 * WiFi shield attached

 created 13 July 2010
 by dlf (Metodo2 srl)
 modified 31 May 2012
 by Tom Igoe
 modified 16 January 2017
 by Sandeep Mistry
 modified again 16 September 2024 
 by moomelon
 */
 

#include <SPI.h>
// #include <WiFiNINA.h>  // PT
#include "WiFiS3.h"
#include <ArduinoOTA.h>

#include "arduino_secrets.h" 
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
/////// Wifi Settings ///////
char ssid[] = SECRET_SSID;      // your network SSID (name)
char pass[] = SECRET_PASS;   // your network password

int status = WL_IDLE_STATUS;

void setup() {

  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);

  //Initialize serial:
  Serial.begin(115200);

    while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

  }

  // check for the presence of the shield:

  // if (WiFi.status() == WL_NO_SHIELD) {                              // Use this for WiFiNINA.h
  //  Serial.println("WiFi shield not present");                      // Use this for WiFiNINA.h

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

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 5 seconds for connection:
    delay(5000);
  }

  // start the WiFi OTA library with internal (flash) based storage
  ArduinoOTA.begin(WiFi.localIP(), "Arduino", "password", InternalStorage);

  // you're connected now, so print out the status:
  printWifiStatus();
}

void loop() {
  // check for WiFi OTA updates
  ArduinoOTA.poll();

  // add your normal loop code below ...

  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(200);                      // wait for a bit
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(200);                      // wait for a bit



}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

1 Like