[RESOLU] Differentes façons de charger un programme dans une carte Arduino

Bonjour à tous,
J'ai usé de la fonction recherche, et j'ai parcouru toutes les pages du forum (en me référant aux titres) mais je n'ai pas trouvé de réponses satisfaisantes.
Je vous expose donc mon soucis.
Je développe en ce moment un projet basé sur Arduino et la programmation en elle même est quasiment terminée.
Le programme est appelé à évoluer, et devra donc être mis à jour sur la carte Arduino.
Mais voila, il y a des contraintes :
Je ne pourrais par le faire par une liaison USB.
Est-ce possible à partir d'une liaison Bluetooth mais sans que le programme ne soit lisible (par exemple en en transformant le programme.ino en programme.exe ?
Sinon, est-ce faisable de transférer le programme a partir d'un module carte SD (exemple : un appui sur le bouton reset de la carte, va lire le programme dans la carte SD et pas dans la mémoire de la carte)
Cordialement
JP

aucun idée pour t'aider, mais la réponse m'intéresserai c'est pas mal cette idée de programme mis a jour, possible a distance après ca serais utile ! je vais commencer à m'y intéresser bientôt la.
Skizo !

Pas tout à fait ce que tu recherches, mais une piste à suivre :

Yop Yop,
Juste pour être certain, parce que je pense qu'il y a une petite confusion.
Lorsque tu transfères un programme dans la mémoire programme (sram) de ton µc (arduino), c'est une version compilée de ton .ino et non le fichier .ino qui est transféré .
Lorsque tu compiles ton code, celui ci est interprété et traité par ton compilateur pour obtenir un byte code d'instructions machine compréhensible par ton µc, à partir de ce moment là tu peux transférer en mémoire ...
Toute mes excuses si j'ai mal interprété.

Bonsoir à tous.
Je n'ai peut être pas su exprimer exactement ma demande.
Ce programme doit évoluer à partir des remarques des utilisateurs.
Je voudrais donc, que lors d'un appui sur le reset de la carte Arduino (ou bien d'un appui sur un autre bouton qui serait cablé sur la carte), le programme soit rechargé à partir de la carte SD et non à partir de la mémoire (flash) de la carte Arduino.
De cette façon, il sera très facile pour un utilisateur lambda d’effectuer le mise à jour: il enlevé la carte SD, il enfiche la nouvelle, un appui sur le bouton et hop le programme se recharge à partir de la carte SD
Le but étant d'effectuer la mise à jour sans aucune manipulation informatique.
Cordialement
JP

Il faudrait pourvoir charger la flash (et non le sram, j'ai écris trop vite dans le msg précédent :sleeping:) à partir de la sd ???
Là par contre je sais pas trop :~, à partir du bootloader au reset ???

C'est tout a fait possible.

Dans l'IDE Arduino, il y a 2 étapes :

  • Compilation de ton .INO pour faire un exécutable qui n'est pas un .EXE mais un .HEX (je simplifie par ce que c'est pas 100% çà mais presque)
  • Transfert du HEX dans la flash du ATmega avec AVRdude coté PC et le bootloader coté ATmega

Le transfert dans la flash utilise effectivement 2 programme :

  • AVRdude sur le PC qui va lire le fichier HEX, faire un reset de l'Arduino pour donner la main au bootloader et envoyer sur la liaison série (ou USB) le contenu du fichier HEX
  • Le bootloader sur l'ATMega qui est un tout petit programme reveillé par le reset et qui va recevoir les octets via la liaison série pour les écrire dans flash.

Dans un cas de démarrage normal, le bootloader ne recevant pas de commande d'AVRdude au bout de quelques secondes va donner la main au programme en flash.
(En fait le bootloader est aussi en flash au tout début et n'occupe qu'environ 2KO suivant les versions sur les 32KO d'un ATmega328).

Corrolaire : le programme de l'Arduino ne s'exécute JAMAIS en RAM. L'ATmega étant une architecture Harvard à mémoire programme et donnée séparées. La flash est dans l'espace programme, la RAM est dans l'espace donnée. La RAM ne comporte d'ailleurs que 2KO.

Une première méthode de reflashage serait d'utiliser la liaison série (ou USB) afin d'utiliser un PC avec l'utilitaire AVRdude et le fichier HEX pour remettre à jour la carte Arduino.
Mais apparemment tu dis que ce n'est pas possible.
Dommage parce que c'est vraiment le plus simple.

Si tu veux pouvoir remettre à jour la flash à partir d'un nouveau programme sur la carte SD, c'est possible.
Pour cela il faut ré-écrire un nouveau bootloader qui va être capable de lire la carte SD. S'il y trouve un fichier UPDATE.HEX par exemple, il va reflasher la mémoire flash avec le nouveau programme.
Comme dans le cas du bootloader série, le bootloader ne doit pas s'effacer lui même mais mettre le nouveau programme juste après lui-même dans la flash.

Si le principe me parait jouable, j'ai peur qu'un bootloader utilisant la lib SD soit un peu volumineux et consomme une bonne partie de la flash.
Par exemple, il faut peut être s'attendre à ce qu'il utilise la moitié des 32KO de flash, ne laissant que 16K0 de flash disponible pour ta propre application.

Je travaille pour le moment sur une Mega 1280.
Quelle serait l'impact sur ce type de carte ?
JP

Avec la Mega1280 tu à 128KO de flash total.
Normalement le bootloader t'en prend ~2KO donc il reste 126KO pour ton application.

Si un bootloader SD (estimation sans garantie) prend 16 à 20KO, il te reste un peu plus de 100KO pour ton application.

Pour connaitre la taille de ton application si elle existe déjà, utilise le bouton "Verify" pour compiler sans uploader
La dernière ligne donne la taille :

Binary sketch size: 1026 bytes (of a 32256 byte maximum)

Bonjour,

bricopin:
Mais voila, il y a des contraintes :
Je ne pourrais par le faire par une liaison USB.
Est-ce possible à partir d'une liaison Bluetooth mais sans que le programme ne soit lisible
Sinon, est-ce faisable de transférer le programme a partir d'un module carte SD (exemple : un appui sur le bouton reset de la carte, va lire le programme dans la carte SD et pas dans la mémoire de la carte)

C'est possible par bluetooth mais uniquement avec des modules de qualité possédant un temps de latence trés faible.
Sinon il existe un bootloader Serial / SD : 2boots: Arduino/AVR serial and SD card bootloader – Dangerous Prototypes

(par exemple en en transformant le programme.ino en programme.exe ?)

Stop! .ino -> fichier source arduino, .exe -> fichier éxécutable pour windows.
C'est pas du tout la même chose !

Le chemin standard d'une compilation :
.ino (code source arduino) -> .cpp (code source c/c++) -> .elf (fichier de debug / compilation gcc) -> .bin (fichier binaire contenant le code asm assemblé)-> .hex (fichier intel hex utilisable avec un programmateur)

osaka:
Lorsque tu transfères un programme dans la mémoire programme (sram) de ton µc (arduino), c'est une version compilée de ton .ino et non le fichier .ino qui est transféré .

AVR -> architecture de type havard (Architecture de type Harvard — Wikipédia), les données sont stocké en RAM mais le programme est stocké en FLASH.

bricopin:
Ce programme doit évoluer à partir des remarques des utilisateurs.
Je voudrais donc, que lors d'un appui sur le reset de la carte Arduino (ou bien d'un appui sur un autre bouton qui serait cablé sur la carte), le programme soit rechargé à partir de la carte SD et non à partir de la mémoire (sram) de la carte Arduino.
De cette façon, il sera très facile pour un utilisateur lambda d’effectuer le mise à jour: il enlevé la carte SD, il enfiche la nouvelle, un appui sur le bouton et hop le programme se recharge à partir de la carte SD
Le but étant d'effectuer la mise à jour sans aucune manipulation informatique.

Voir mon lien si dessus.
Attention : la flash d'un AVR est programmable un nombre limité de fois !
Si tu écris le programme à chaque reset ton micro-contrôleurs rendra l'âme en trés peu de temps !
Il faut prévoir un bouton annexe lançant le bootloader, sinon tu te retrouvera avec des cartes hors d'usage en très rapidement.

skywodd:

osaka:
Lorsque tu transfères un programme dans la mémoire programme (sram) de ton µc (arduino), c'est une version compilée de ton .ino et non le fichier .ino qui est transféré .

AVR -> architecture de type havard (Architecture de type Harvard — Wikipédia), les données sont stocké en RAM mais le programme est stocké en FLASH.

osaka:
(et non le sram, j'ai écris trop vite dans le msg précédent :sleeping:)

:grin:

Par contre au final vouloir placer son programme d'une autre manière que par l'usb (uart) semble lourd quand même ? :sweat_smile:

Et avec un duo de µc ?

Le premier ne servirait qu'à charger le deuxième en cas de changement de programme....

osaka:

osaka:
(et non le sram, j'ai écris trop vite dans le msg précédent :sleeping:)

:grin:

Par contre au final vouloir placer son programme d'une autre manière que par l'usb (uart) semble lourd quand même ? :sweat_smile:

Oups, j'avais pas vu désolé :sweat_smile:
Le bootloader SD n'est pas compliqué a mettre en place, par contre il réduit la taille de mémoire flash dispo de manière assez conséquente.

Hello,
J'ai trouvé ca sur le net. A priori il y a un project en cours. Si ca peut t'aider
http://baldwisdom.com/bootdrive/
Serge

Salut,

DFRobot propose un module de programmation sans-fil pour Arduino. Peut-être une piste à étudier...

++

Bonjour à tous
Barbudor : Pas de problème de taille, j'ai largement la place.
Skywodd : A priori d’après ce que je peux déchiffrer ça irait dans le bon sens ; mais, le problème c'est mon anglais qui ne me permet de tout comprendre.
Gerse : je pense que c'est pour programmer un Arduino à partit d'un autre Arduino.
SesechXP : Oui, mais nécessite des manipulations informatiques.
Conclusion, il faut que j’essaie de comprendre ce qui il a dans le lien préposé par Skuwodd.
Cordialement
JP

bricopin:
Skywodd : A priori d’après ce que je peux déchiffrer ça irait dans le bon sens ; mais, le problème c'est mon anglais qui ne me permet de tout comprendre.
(...)
Conclusion, il faut que j’essaie de comprendre ce qui il a dans le lien préposé par Skywodd.

D'aprés ce que j'ai compris de ton problème le bootloader 2boot serait parfait.
Par contre l'anglais faudra t'y faire tout les bootloaders sont documenté en anglais :wink:

En fait si j'ai bien compris, le but final serait de proposer une solution à des utilisateur lambda sans qu'ils soient obliger de passer par compil et up arduino pour faire des mise à jour?
Donc ce n'est pas toi qui a le besoin, mais d'autre personnes n'ayant pas l'expérience pour le faire manuellement de manière classique ?

Sinon un truc simple même pour un utilisateur lamba :

  • fournir le .hex de la màj avec un petit programme implémentant le protocole stk500,
  • l'utilisateur branche l'usb,
  • il lance le prog,
  • le prog charge le nouveau programme tout seul,
  • l'utilisateur est content.

Yep!

Il y avait eu une discution sur la possibilité de loader un programme par sdcard. La modification gonflait le bootloader à 4 Kbytes.

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1260909294/30

EDIT1 : Le shield :

Le projet ici :

Donc, à priori rien d'impossible...

@+

Zoroastre.