UPLOAD SU SCHEDA ARDUINO UNO DA Visual Studio Code

Buonasera sto imparando ad utilizzare il PYTHON utilizzando Visual Studio Code. Poichè ho sviluppato un programma c++ che muove un braccio meccanico e funziona correttamente , volevo un aiuto su come effettuare , da PYTHON , l'upload dell'eseguibile del mio programma sulla scheda Arduino . Ho sviluppato un codice , in PYTHON, che apre una finestra e propone un Bottom. Lo scopo è che se l'utente clicca sul Bottom, deve essere trasferito il programma eseguibile sulla scheda Arduino Uno. Sono in difficolta' perchè non riesco a farlo e non trovo documentazione in merito. Premetto che se utilizzo il Visual Studio Code, l'operazione di upload è possibile farla sfruttando un tasto in basso all'editor che lo trasferisce. In effetti funziona e il braccio si muove correttamente. Lo scopo pero' è quello di fare l'upload sulla scheda dall'interno del programma scritto in python nel momento in cui si clicca sul bottom. Spero in un vostro supporto. Grazie

Il trasferimento del firmware avviene attraverso un programma esterno di nome avrdude. Da python dovrai documentarti su come lanciare processi esterni. Non sono in grado di darti delle indicazioni per python ma posso dirti che l'ho scritto in C++ un programma (frontend) che lancia avrdude e se si può fare in C++ si può fare in python.

Dovrai fornire degli argomenti al programma avrdude e puoi provarlo da riga di comando. La doc di avrdude è qui.

Puoi anche avvantagiarti se analizzi quello che fa visual studio oppure usa arduino IDE e abilita "verbose mode" o simile.

Ciao.

Per python puoi documentarti a questo link

In base alla versione di python cambia il metodo e i moduli da importare, quindi se hai python < 2.7 documentati per questa versione.

PS: non prendere tutto per oro colato, non uso python da anni.

Buongiorno volevo prima di tutto ringraziarti per la disponibilita' ma, poichè sono alle prime armi nella programmazione , sarebbe possibile avere un breve esempio di come utilizzare averdude poihè , non mi è molto chiaro dai link visionati. Lo scopo è quello di inviare un eseguibile ( arm.cpp.o ) sulla scheda arduino uno dall'interno di una funzione python. In definitiva mi servirebbe il comando e i parametri da utilizzare. Grazie ancora

sky70:
... Lo scopo è quello di inviare un eseguibile ( arm.cpp.o ) sulla scheda arduino uno ...

... perdona, ma il nome di quel file mi fa venire un dubbio ... arm.cpp.o ... non è che stai cercando di caricare qualche cosa fatto per architettura ARM su un AVR vero? Stai compilando per ATmega328P giusto?

Guglielmo

Buonasera il nome corrisponde al compilato in c++ da visual studio code di un programma scritto originariamente in wiring su interfaccia ide arduino. .Il programma funziona correttamente sia su ide arduino sia da Visual Studio code trasferendo il programma con la funzione che sta dietro il segno di spunta proposto in basso da Visual Studio code. Lo scopo è quello di trasferire il programma sulla scheda arduino da python. E' qui che sono in difficolta' Grazie

Nell'IDE vai nelle impostazioni e metti il segno di spunta per avere i dettagli sia della compilazione che del caricamento.

Fatto questo carica il programma da IDE ... nella finestrella in basso ti apparirà la riga esatta che richiama avrdude, con tutti i parametri necessari ... te la copi, le la studi e la lanci dal tuo applicativo python.

Guglielmo

... ad esempio, se compili Blink per Arduino UNO, al termine della complilazione hai:

Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
/Applications/Arduino/Arduino 1.8.13 Portable.app/Contents/Java/portable/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude -C/Applications/Arduino/Arduino 1.8.13 Portable.app/Contents/Java/portable/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf -v -patmega328p -carduino -P/dev/cu.usbmodem1471501 -b115200 -D -Uflash:w:/var/folders/q6/1r2cyccx60d9ckl35pk_nb980000gn/T/arduino_build_158501/Blink.ino.hex:i

... ovvero una riga che ti dice la memoria occupata ed una che lancia avrdure con i vari parametri (... nel mio caso sono con una versione "portable" su macOS quindi vedi la riga per tale os, su win comunque vale la stessa cosa.

In pratica ti interessa la parte:

arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude -C/Applications/Arduino/Arduino 1.8.13 Portable.app/Contents/Java/portable/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf -v -patmega328p -carduino -P/dev/cu.usbmodem1471501 -b115200 -D -Uflash:w:/var/folders/q6/1r2cyccx60d9ckl35pk_nb980000gn/T/arduino_build_158501/Blink.ino.hex:i

in cui trovi:

  • dove si trpva l'avrdude che devi lanciare (arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude)
  • il parametro -C che gli dice dove è il file di configurazione avrdude (-C/Applications/Arduino/Arduino 1.8.13 Portable.app/Contents/Java/portable/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf)
  • alcuni parametri dipendenti dalla scheda (-v -patmega328p -carduino -P/dev/cu.usbmodem1471501 -b115200 -D)
  • il file che deve programmare ed il suo formato (-Uflash:w:/var/folders/q6/1r2cyccx60d9ckl35pk_nb980000gn/T/arduino_build_158501/Blink.ino.hex:i)

Tu devi fare la stessa cosa da python.

Guglielmo

In effetti il nome del file "arm" è ambiguo per cui nasce spontaneo il dubbio.

Premessa:
Non conosco VSC. Non conosco Windows, lavoro con linux, per cui non posso guidarti passo passo.

Rispondo per punti.

  1. Devi documentarti su avrdude. Ciò è fondamentale. Avrdude è tool a riga di comando con la quale (riga di comando) devi avere confidenza per potere lanciare il programma avrdude. Io da console bash scrivo il comando "avrdude --help", tu dovresti essere in grado di fare lo stesso con la dos-shell.

  2. Il file da trasferire nella flash della MCU non ha estensione .o ma .hex o .ihex (non ricordo) comunque il file è in formato "Intel Hex". I file .o sono nel formato "oggetto" e su questi opera il linker il quale genera il file binario in formato "elf" e questo viene depurato e tradotto nel file Intel Hex pronto per essere trasferito nella flash della MCU.

  3. Arduino IDE avvia il comando avrdude, comando che puoi vedere nella finestra sotto il codice sorgente.
    Ti devi compiare questo comando e provare a scriverlo nella dos-shell.

Solo dopo puoi porti il problema di come si fa in python ciò che hai fatto da shell.

Ciao.

Mi sono copiato cio' che ho visto da terminale quando trasferisco attraverso VS CODE. Dovro' studiarlo . Effettivamente esce quanto segue:

 Executing task: C:\Users\loris\.platformio\penv\Scripts\platformio.exe run --target upload <

Processing uno (platform: atmelavr; board: uno; framework: arduino)
-------------------------------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/uno.html
PLATFORM: Atmel AVR (2.2.0) > Arduino Uno
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 31.50KB Flash
DEBUG: Current (simavr) On-board (simavr)
PACKAGES:
 - framework-arduino-avr 5.0.0
 - tool-avrdude 1.60300.200527 (6.3.0)
 - toolchain-atmelavr 1.50400.190710 (5.4.0)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 14 compatible libraries
Scanning dependencies...
Dependency Graph
|-- <EEPROM> 2.0
|-- <Octopus> 7.5.0
|   |-- <Wire> 1.0
|-- <OctopusLab-Library> 0.1
|-- <Wire> 1.0
Building in release mode
Checking size .pio\build\uno\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=         ]  12.0% (used 246 bytes from 2048 bytes)
Flash: [==        ]  16.8% (used 5420 bytes from 32256 bytes)
Configuring upload protocol...
AVAILABLE: arduino
CURRENT: upload_protocol = arduino
Looking for upload port...
Auto-detected: COM4
Uploading .pio\build\uno\firmware.hex

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file ".pio\build\uno\firmware.hex"
avrdude: writing flash (5420 bytes):

Writing | ################################################## | 100% 0.88s

avrdude: 5420 bytes of flash written
avrdude: verifying flash memory against .pio\build\uno\firmware.hex:
avrdude: load data flash data from input file .pio\build\uno\firmware.hex:
avrdude: input file .pio\build\uno\firmware.hex contains 5420 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.70s

avrdude: verifying ...
avrdude: 5420 bytes of flash verified

avrdude: safemode: Fuses OK (E:00, H:00, L:00)

avrdude done.  Thank you.

============================================================= [SUCCESS] Took 5.54 seconds =============================================================
Terminale verrà riutilizzato dalle attività, premere un tasto qualsiasi per chiuderlo.

Vi faro' sapere quanto prima. Grazie di tutto

Fai la cosa dall'IDE, mi sembra che VS ti sta nascondendo delle cose e così non capisci cosa devi passare ad avrdude.

Guglielmo

Buonasera cio' che sono riuscito a fare in python è:

import time
import subprocess
import serial
import arduino
import sys
import binascii 
import os
import tkinter as tk
window = tk.Tk()
window.geometry("600x200")
window.title("Hello World")
window.resizable(False, False)
window.configure(background="yellow")
srl = serial.Serial('COM4',57600)

def str_arm():
    from subprocess import run
     
    run(["C:/Program Files (x86)/Arduino/hardware/tools/avr/bin/avrdude", '-CC:/Program Files (x86)/Arduino/hardware/tools/avr/etc/avrdude.conf', "-v", "-patmega328p", "-cavr109", "-PCOM4", "-b57600", "-D", "-Uflash:w:C:/Users/loris/Documents/PlatformIO/Projects/MOVE_ARM/.pio/build/uno/firmware.hex:i"])
    
    

def fine_arm():
    time.sleep(1)
    arduino.close()


first_button=tk.Button(text="Start Robotic Arm",  command=str_arm)
first_button.place(x=220, y=60)

second_button=tk.Button(text="End Robotic Arm" , command=fine_arm)
second_button.place(x=220, y=100)

if __name__== "__main__": 

   window.mainloop()

mi restituisce il seguente errore:

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:/Program Files (x86)/Arduino/hardware/tools/avr/etc/avrdude.conf"

         Using Port                    : COM4
         Using Programmer              : avr109
         Overriding Baud Rate          : 57600
avrdude: ser_open(): can't open device "\\.\COM4": Accesso negato.


avrdude done.  Thank you.

Se faccio la prova a caricarlo da IDE Arduino , il programma viene regolarmente trasferito sulla scheda e la com4 è regolarmente attiva . Verificato anche dalla gestione dispositivi di WIN 10 . La scheda associata è la Arduino UNO correttamente. Ho provato anche ad inserire , prima della istruzione run, il comando srl.open(). L'errore è che la COM4 è gia' aperta. Non ne vengo fuori . i potete aiutare?. Grazie

Mah ... qualcuno sta usando la COM4: ... il tuo programma NON deve assolutamente aprirla né usarla, altrimenti, quando parte avrdude, la trova già occupata ... ::slight_smile:

Del resto, non mi sembra che sotto Win bisogna vere diritti particlari per aprire una COMx (come sotto linux).

Guglielmo

Se la libreria serial che usi in python è questa non devi creare istanza poiché la porta viene aperta e avrdude la trova già impegnata.

Per cui commenta la riga:

srl = serial.Serial('COM4',57600)

Seconda cosa, non mi risulta che il programmatore giusto sia "avr109" ma "arduino" o "stk500".

Inoltre -b115200.

Insomma fai prima a copiare il comando lanciato dall'ide arduino anziché tirare ad indovinare.

Ciao.

Salve effettivamente commentando la specifica

srl = serial.Serial('COM4',57600)

e modificando i parametri come indicato, ha funzionato tutto correttamente. Siete stati straordinari. Grazie mille.Saluti