Arduino flashen über Bluetooth (Anleitung)

nero76

Moderator
Hallo zusammen,

manchmal gibt es Situationen da ist es einfach nervig, einen Arduino per Kabel ständig neu zu flashen - Ein Rasenroboter gehört auch dazu. Hier eine Lösung wie man nie wieder ein Kabel zum Roboter ziehen muss :):

Ihr benötigt: 1x HC-05 und einen Bluetooth-USB Stick (oder 2x HC-05 Bluetooth Module - für diese Kombination habe ich das Flashen jedoch noch nicht getestet) und ein paar Elektronikteile die jeder zu Hause haben sollte.

1.Vorbereitung am Roboter:
1.1. Das erste HC-05 Modul am Roboter als "Slave" über ein Terminal konfigurieren. Dazu Modul mit Strom versorgen und dann "Pin KEY" mit 5 Volt versorgen. Richtige Baudrate einstellen nicht vergessen:

Code:
AT+VERSION           <-- wenn das nichts zurück liefert habt ihr zuvor etwas falsch gemacht
AT+ORGL              <-- alles auf Default
AT+RMAAD             <-- alte Pairings löschen
AT+PSWD=1234         <-- die Pin für den Slave
AT+ROLE=0            <-- als Slave konfigurieren
AT+UART=115200,0,0   <-- die Baudrate des Arduino-Bootloaders
AT+POLAR=1,0         <-- Modul Pin32 (PIO9) soll auf HIGH gehen bei einer Verbindung


1.2. Das Modul setzt jetzt bei einem Verbindungsaufbau den Modul-Pin 32 (PIO9) auf HIGH. Das nutzen wir aus um damit den Arduino mit folgender Schaltung zu "resetten":

arduino_bluetooth_programming.png


hc_05_pin32.png


Ihr baut also die Schaltung für den Pin32 wie im Schaltbild auf. Dann schließt ihr das Modul an RX0 und TX0 des Arduino an. Auf der Ardumower PCB Platine findet ihr RX0 und TX0 an folgenden Pins:

Ardumower Res.Pin0: VCC,GND,RX0 (P27)
Ardumower Res.Pin1: VCC,GND,TX0 (P29)
https://raw.githubusercontent.com/A.../Platinenbilder/Platine Vordersansicht 3D.jpg
An den benötitgten Reset-Pin könnt ihr über den Pad auf Rückseite des Ardumower PCB gelangen - hier die Platine von der Bauteilseite gesehen:

reset_pin.png



2. Vorbereitung am PC:

2.1. Bluetooth-Stick für den PC besorgen (ich benutzer einen DeLock Class 1 EDR 150m USB Bluetooth Stick). In Windows müsst Ihr den Stick zunächst mit dem Slave-Modul koppeln/pairen.

ODER:

3. ein zweites Bluetooth-Modul HC-05 besorgen welches ihr über RS232-USB Adapter an den PC anschließt. Das HC-05 Modul müsst ihr zuvor noch im Terminal als "Master" konfigurieren:
3.1 Modul mit Strom versorgen und dann "Pin KEY" mit 5 Volt versorgen. Richtige Baudrate einstellen.

Code:
AT+VERSION     <-- wenn das nichts zurück liefert habt ihr zuvor etwas falsch gemacht
AT+ORGL        <-- alles auf Default
AT+RMAAD       <-- alte Pairings löschen
AT+ROLE=1      <-- als Master konfigurieren
AT+RESET       <-- einmal RESET
AT+CMODE=1     <-- kein Adressfilter
AT+INQM=0,5,5  <-- nach 5 Sek. Geräte suchen stoppen
AT+PSWD=1234   <-- die Pin für das Slave-Modul
AT+INIT        <-- Bluetooth starten
AT+INQ         <-- Slave suchen - ab hier seht ihr die Adresse des Slave-Moduls:   +INQ:address,type,signal
AT+RNAME? <address>    <-- hier ersetzt ihr die Slave-Adresse (alle Doppelpunkte in der Slave-Adresse durch Komma ersetzen!)
AT+PAIR=<address>,10   <-- Pairing mit Slave-Adresse
AT+BIND=<address>      <-- Binding mit Slave-Adresse 
AT+CMODE=0             <-- Keine anderen Verbindungen zulassen
AT+LINK=<address>      <-- Endlich verbinden


4. In der Arduino IDE wählt Ihr den richtigen COM-Port des Master-Moduls aus. Bei jedem Verbindungsaufbau sollte der Arduino jetzt neu Starten und über diese serielle Verbindung kann dann auch der Arduino geflasht werden.

Falls ihr eine Unterspannungsschaltung für das Ardumower PCB verwendet, müsst ihr für die Dauer des Flashens den Einschalt-Taster dauerhaft gedrückt halten bzw. auf geschlossen stellen da ja keine USB-Spannungsversorgung mehr vorliegt und der Roboter sich sonst selber ausschalten würde (Ardumower-Software ist beim Flashen nicht mehr aktiv).

Gruss,
Alexander
 
Diesmal geht es um's programmieren/flashen über Bluetooth mit dem Arduino Due.

Wir werden wieder den Bluetooth-Adapter HC-05 nach dem obigen Schaltplan einsetzen und an den Arduino Due RX0/TX0 Pins anschließen.

---Einschub für Due China Clones (bitte die gezeigte Modifikation nur dann durchführen falls es nicht ohne sie funktioniert!)---
Leider habe ich für meine beiden Due Boards noch keine Lösung gefunden welche ohne eine Modifikation auskommt. Wir müssen also noch eine kleine Modifikation am Arduino-Board vornehmen weil sonst ein Buffer-IC (74LVC1G125DCK) auf einigen China Clones die Kommunikation stört (für Interessierte: das Buffer-IC schaltet laut Schaltplan das TX-Signal des Atmega 16u2 nur bei einem LOW-Pegel zum Due RX-Pin durch, sonst ist sein Ausgang hochohmig - in der Theorie - leider funktioniert dies aus noch nicht geklärten Gründen nicht wie im Schaltplan gedacht

Hier seht ihr wie ich die Ausgangsleitung des Buffer-ICs getrennt habe. Bitte seid extrem vorsichtig beim durchtrennen und trennt nur so tief wie nötig (es ist ein Multi-Layer Board). Danach könnt ihr den "USB Programming-Port" nicht mehr verwenden. Der "USB Native Port" steht aber weiterhin zum programmieren/flashen zur Verfügung. Ebenso können jetzt die RX0/TX0 Pins zum flashen verwendet werden.

arduino_due_buffer_ic.png


---Ende Einschub für Due China Clones---

Das Schaltbild zum Anschluss des Bluetooth-Modul HC-05 an die Arduino Due Pins RX0/TX0 findet ihr oben weiter (Schaltbild wie beim Mega 2560, dabei aber den Widerstand R3 an 3.3v anstatt 5v anschließen).

Damit der Arduino Due aber neu programmiert werden kann, muss zuvor ein darauf befindliches Programm gelöscht werden. Über Bluetooth werden wir dies so lösen: der Arduino Due muss sich selber löschen. Über ein Kommando welches wir in jedes unserer Programme einbauen können wir den Due wie folgt löschen:


Code:
#include <Reset.h>

void setup(){
  Serial.begin(115200);
}

void loop(){
  if (Serial.available()){
    String s = Serial.readString();
    if (s == "ERASE_ARDUINO_DUE"){  // jemand schickt uns die passende Nachricht zum löschen über Bluetooth
      initiateReset(250);  // dieser Befehl löscht das Programm im Arduino Due
    } 
  }



Falls eurer Programm mal nicht auf den Lösch-Befehl reagieren sollte gibt es nur noch eine Chance das Programm zu löschen: über den Due eingebauten "ERASE" Taster (an diesen Fall haben die Entwickler des Due zum Glück gedacht ;-)).

Damit kann auch der Arduino Due über Bluetooth geflasht werden :)
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/905/arduino_due_buffer_ic.png/
 
Zuletzt bearbeitet von einem Moderator:
Ich habe für meine CNC-Fräse die Kommunikation mit deiner Hilfe auf HC-05-Bluetooth umgestellt. Das eine modul ist der Master, das andere Modul ist der Slave. Klappt super, ich habe aber noch folgende Seiten zur ergänzenden Hilfe genommen, da bei der Konfiguration des Master was fehlte:
http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode/ https://alselectro.wordpress.com/2014/10/21/bluetooth-hc05-how-to-pair-two-modules/
Nachdem dann beide die korrkte Baudrate eingestellt bekommen haben (115200 baud) war die Kommunikation hergestellt und die Fräse steht jetzt nicht mehr direkt am PC (der damit auch nicht mehr vollgestaubt wird) sondern ein paar Meter weg.



Danke!

Gruß,
Jem
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/1536/photo_2016-03-18_22-34-00.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Noch ein kleiner Nachtrag für den Arduino Due: wenn man die Arduino IDE auch zum Löschen des Due über Bluetooth verwenden möchte (statt ERASE-Taster), kann man mit einem Trick das ERASE über die Arduino IDE Funktion Upload auslösen. Die IDE schickt zum Flashen die Sequenz "€€#N#w00000000,4#" (das ist Teil des SAM-BA Protokolls). Empfängt eurer Programm also diese Sequenz beim Programmstart, kann es den Arduino Due selber löschen. Man betätigt also zweimal den Button "Upload" in der IDE: das erste mal führt eurer Programm den ERASE durch, wartet dann im Booatloader und das zweite mal "Upload" werden die Daten zum Due Bootloader übertragen.


Code:
#include <Reset.h>

void setup(){
  Serial.begin(115200);    
  
  // Due ERASE übe Bluetooth - Zunächst warten auf serielle Daten der Arduino IDE  
  while (millis() < 1000);  
 
  while ( Serial.available() ){               
    char ch = Serial.read();    
    switch (ch){     
      // Arduino IDE sends:  €€#N#w00000000,4#  ( [URL]https://sourceforge.net/p/lejos/wiki-nxt/SAM-BA%20Protocol/[/URL] )
      case 'N': 
        char ch = Serial.read();
        if (ch == '#'){          
            initiateReset(250);  // ERASE                                 
            while(true);            
        }
        break;
    }
  }
}

void loop(){
  // Testprogramm
  Serial.print("loop ");
  Serial.println(millis());
  delay(1000);    
}
 
Oben