Arduino – Firmware upload via webinterface
In dit voorbeeld laten we zien hoe je een “firmware upgrade” kan doen op een Arduino UNO/NANO die is aangesloten op bijvoorbeeld de Raspberry Pi, het uploaden van het bestand gaat via een webinterface.
Ik had een voorbeeld hier gezien en heb deze aangepast/verbeterd!
Hoe werkt het eigenlijk?
De arduino “firmware” is een HEX code, en kan onttrokken worden vanaf de arduino volgens deze handleiding, je kan dit HEX bestand via AVRdude weer uploaden naar de Arduino.
Wat heb je nodig?
1) AVRdude / installeer met het commando:
sudo apt-get install avrdude
2) Lighttpd (webserver) / installeer met het commando:
sudo apt-get install lighttpd
3) php5 (programmeertaal) / installeer met het commando:
sudo apt-get install php5-common php5-cgi php5
Wat moet je nog extra doen?
1) Nu moet er nog toegang tot seriele connecties worden gegeven (in Linux heet dat dialout) voor Lighttpd anders krijg je foutmeldingen als:
avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied ioctl("TIOCMGET"): Inappropriate ioctl for device
De gebruiker voor Lighttpd is www-data, deze “gebruiker” geef je toegang tot serial devices (dialout) met het commando:
sudo usermod -a -G dialout www-data of sudo adduser www-data dialout
2) Nu moeten de rechten voor de seriele poort nog goed gezet worden, in dit voorbeeld ttyACM0, met het commando:
sudo chmod a+rw /dev/ttyACM0 en/of sudo chmod a+rw /dev/ttyUSB0
3) (Optioneel?) Geef Lighttpd (user: ‘www-data’) ook toegang om sudo commando’s uit te voeren, met het commando: sudo visudo -f /etc/sudoers
Onderaan dit bestand, voeg deze regel toe:
www-data ALL=(ALL) NOPASSWD: ALL
4) Maak een folder aan /var/web/firmware met het commando:
sudo mkdir /var/web/firmware
HTML FORM
Om te beginnen moet de gebruiker via een webinterface een bestand uploaden en tevens moet de gebruiker informatie aanleveren zoals Arduino type (ivm met de baudrate) en ‘serial device’.
we maken daarvoor gebruik van een HTML FORM script:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<form enctype="multipart/form-data" action="firmwarewriter.php" method="POST"> Selecteer het Arduino firmware bestand (HEX): <input name="firmwarebestand" type="file"><br> <br> Selecteer Arduino type:<br> <input type="radio" name="arduino_type" value="arduino_uno">Arduino UNO<br> <input type="radio" name="arduino_type" value="arduino_nano">Arduino NANO<br> <br> Serial device /dev/tty: <input type="text" name="serial_device" value="USB0"> (bijvoorbeeld USB0 of ACM0)<br> <br> <input type="submit" value="Firmware wegschrijven!" /> </form> |
Noem het bijvoorbeeld index.html, het ziet er zo uit:
Deze FORM roept het bestand ‘firmwarewrite.php’ aan met de variabelen, nu kunnen we dit script draaien om een firmware te schrijven naar een arduino op de Raspberry Pi.
Het PHP script ziet er zo uit (commentaar staat tussen de regels)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php // Gegevens van de FORM uitlezen. $bestandsnaam = basename($_FILES['firmwarebestand']['name']); // Toegangsrechten geven voor serial device. exec('chmod a+rw /dev/tty' . $_POST['serial_device']); // Kijk of het bestand goed is geuoploaded. if (move_uploaded_file($_FILES['firmwarebestand']['tmp_name'], $bestandsnaam)) { echo "Het Arduino firmware (HEX) bestand: " . $bestandsnaam . " is succesvol geuploaded."; } else { echo "Er is een fout opgetreden bij het uploaden van het Arduino firmware (HEX) bestand."; exit; } echo ", hieronder volgt de AVRdude output:"; ?> <div style="background-color:black; color:white; border-color:#ADD6FF; border-style:ridge; border-width:5px; padding: 10px 10px"> <?php $baudrate = 115200; //standaard if ($_POST['arduino_type'] == "arduino_uno") { $baudrate = 115200; } if ($_POST['arduino_type'] == "arduino_nano") { $baudrate = 57600; } // Start avrdude. // Ter info: "2>&1" moet op het eind, anders zien we geen output! $output = shell_exec('/usr/bin/avrdude -F -v -c arduino -p ATMEGA328P -P /dev/tty' . $_POST['serial_device'] . ' -b ' . $baudrate . ' -U flash:w:' . $bestandsnaam . ' 2>&1'); // Geef output weer. echo "<pre>$output</pre>"; // Wis firmware bestand. unlink($bestandsnaam); ?> |
Plaats ‘index.html‘ en ‘firmwarewrite.php‘ in dezelfde folder en voer de gegevens in, na de knop ingedrukt te hebben en een wachttijd zo tussen de 5 a 15 seconden, zie je ade AVRdude output in de webrowser, zo kun je meteen controleren of het updaten van de firmware goed is gegaan!
Onder op deze pagina kun je het hele pakketje downloaden inclusief een paar HEX dumps!
Succes!
[#/arduino/arduino_firmware_webinterface_bestanden” ]