[résolu] Mega 2560 r2 : problème d'upload

Bonjour à tous et merci d'avance pour votre aide.

J'ai reçu récemment mon premier arduino : la mega 2560.
Le 1er jour, tout allait bien : j'ai pu testé le script blink avec plusieurs valeurs de vitesse de clignotement.
Le 2ème jour et les suivants : impossible d'uploader mes scripts.

J'ai l'erreur suivante :

avrdude: stk500_2_ReceiveMessage(): timeout

Je suis sous Linux Ubuntu et lorsque je passe sous Windows 7 je n'ai pas ce problème.

Après de nombreuses recherches, je pense que je suis sujet au problème évoqué là : http://www.gr-slb.com/blog/2011/04/02/arduino-mega-2560-upgrade/ (problème de connexion au port série sous GNU/Linux).

J'ai donc voulu upgrader mon firmware pour le micro-contrôleur ATmega8u2 comme indiqué mais la méthode pour réinitialiser le micro-contrôleur en court-circuitant des contacts n'est pas valable pour mon arduino car j'ai la révision 2 or la méthode donnée est pour la révision 1.
Voir ici les différences entre les 2 cartes : http://www.logiquefloue.ca/circuits/arduino/arduino-mega-2560-revisions-materielles/

J'ai eu beau chercher, je n'ai pas trouvé comment faire.
L'un de vous a t-il l'info ?

PS : Je préfère une méthode sans soudure et en français (car mon anglais est très pauvre)

Des problèmes de communication ayant été constatés à l'utilisation des cartes Arduino Uno et Mega 2560, un correctif est possible moyennant une mise a jour du firmware du composant assurant la liaison série (8U2)

la méthode de mise à jour est décrite ici

Détails de la mise à jour sous windows 7 quelques infos sont manquantes à ce niveau, la méthode sous linux a bien fonctionné si effectuée comme sur le lien ci dessus.

C'est un processus sans risque, en cas d’échec à la première tentative, vous pouvez réitérer l'opération.

Matériel nécessaire :
Pour tous : cordon USB

Arduino UNO SMD & Arduino Mega 2560 version 1 :
deux cordons mâle/mâle,

Arduino UNO SMD version 2 & Arduino Mega 2560 version 2 (noté R2 en face arrière) :
un cordon mâle/mâle,
un cordon mâle/femelle

Télécharger le logiciel Flip Atmel (version testée avec succès : 3.4.2)

Télécharger le driver certifié pour les OS windows 64 bits (Windows 7, Vista...)
Le logiciel Flip Atmel, nécessite un driver certifié pour les OS windows 64 bits,
on peut le trouver ici,
http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile&id=3842&showinfo=1
Télécharger le fichier zip et le dezipper

Télécharger le firmware mis à jour pour le µC 8U2
Le firmware se trouve sur le dépot github
Choisir la version correspondant à votre carte (Uno ou Mega 2560) soit
(utiliser bouton de droite, enregistrer sous...)
Uno -> arduino-usbserial/Arduino-usbserial-uno.hex
Mega 2560 -> arduino-usbserial/Arduino-usbserial-mega.hex

Les firmwares sont aussi disponibles dans le répertoire /hardware/arduino/firmwares/arduino-usbserial de vorte installation du logiciel Arduino

Connecter l'Arduino à l'aide du cable USB
De la même manière que pour uploader un sketch.

Ré-initialiser le µControlleur 8U2 (reset) et le placer en mode DFU
Pour ce faire, relier et maintenir la pastille reset (en haut à gauche de l'emplacement 6 points) à la masse (GND)
Les pastilles sont situées près du connecteur USB, comme indiqué sur l'image. Les relier avec un bout de câble.
Sur les versions 1 du mega2560 & Uno SMD, le connecteur 6 points n'est pas présent, mais il faut toucher la même pastille

Ensuite, avec un 2eme câble connecté à la masse (branché dans un emplacement GND) toucher brièvement le coté gauche du condensateur situé au dessus du marquage RESET-EN comme indiqué sur la photo

on peut alors débrancher les câbles, la carte est maintenant en mode DFU

Mise à jour du pilote signé pour Flip

Dans le gestionnaire de périphériques, le matériel Arduino Uno (ou Mega) DFU apparaît comme non installé

Choisir Arduino Uno (ou Mega) DFU, bouton de droite / Mettre à jour le pilote
Choisir Rechercher un pilote sur mon ordinateur
Choisir le chemin dans lequel le pilote signé Flip lib usb a été dézippé, par exemple...

C:\Users\Pamela Ewing\Downloads\Flip-libusb-signed-driver\driver

Cliquer sur Installer à l'affichage de la fenêtre de sécurité

Lorsque l'installation s'est correctement déroulée, le périphérique AT90USB82 apparaît comme installé

Fermer la fenêtre

Le périphérique AT90USB82 est visible et correctement installé dans le gestionnaire de périphérique

Mise à jour

Lancer le logiciel flip
Menu Device / Select
choisir AT90USB82 et confirmer

Puis menu Settings / Communication
Choisir USB et cliquer sur open

Ensuite, menu File / Load Hex File
Choisir le fichier correspondant a votre carte (ici un Uno) et valider

Enfin, cliquer sur Run,
Le µControlleur 8u2 est mis à jour (attention ça va vite !!) et tous les voyants sont au vert \o/

Débrancher puis rebrancher la carte
Le port série devrait réapparaître dans le menu Tools / Serial port du logiciel Arduino, ainsi que dans le gestionnaire de périphériques.

Sources et liens :
http://fourwalledcubicle.com/blog/2009/11/getting-flip-to-work-in-64bit-windows/

Bon courage,

Lionel

Génial, dommage que je ne puisse pas tester ça avant la semaine prochaine.

Je vous tiendrais au courant.

Merci Snootlab.

quand je vois tous les soucis avec les Uno, je ne suis pas mécontent d'être resté aux modèles FTDI XD

J'ai enfin trouvé le temps de tester cette procédure de mise à jour du fireware.
Tout c'est déroulé sans problème.

Encore un grand merci à toi Snootlab.
En espérant un jour te rendre service à mon tour (mais j'en doute vu ton niveau et le mien).

Avec plaisir, content que ça serve.
et si ce n'est pas moi que tu aides, pas de souci,
mais n'hésites pas a partager ce que tu sais et apprends, ça servira toujours à quelqu'un 8)

Bonjour à tous!

Je suis un parfait débutant en arduino, puisque j'ai n'ai pas encore réussit à uploader une seule fois. Ayant pour projet de piloter simultanément de nombreuses actions relativement simples, j'ai acheté directement un Mega. J'éssai d'appliquer des tuto tels que celui ci dessus (sous ubuntu 11.04 ou seven), mais ma ma carte ne ressemble pas à celle des photos, du coup je n'arrive pas à connecter les bornes comme indiqué. Voici ma carte (désolé pour la qualité, je n'ai que mon téléphone avec moi)

Uploaded with ImageShack.us

Pourriez vous m'indiquer quelles bornes je dois connecter pour passer la carte en mode DFU?

Merci par avance pour votre aide, j'ai des projets d’automatiquement d'aquarium et de bio réacteur à algue autonome plein la tête!

Bonjour/soir

Cette carte n'a pas besoin de mise à jour, puisqu'elle n'est pas équipée du circuit intégré 8u2 (c'est une "ancienne" génération), elle doit fonctionner directement,
Choix de la carte AT Mega 1280 dans le GUI (logiciel) arduino, choix du port série, et zou, upload du sketch
ça doit marcher direct

Lionel

Merci beaucoup!
Et zou!

Bonjour,

et désolé de déterrer un sujet marqué comme résolu ... :~

... mais j'ai le même soucis avec une Mega2560-R2, et la méthode décrite plus haut n'a pas réglé le problème.

Certains programmes passent bien (<10ko), mais celui que j'essai de mettre en place ne veut pas.
En activant le "mode verbose" de l'upload (en maintenant la touche shift), j'ai l'impression qu'il envoie bien le pgm (ce n'est qu'une impression, car en redémarrant la carte, ça ne se comporte pas comme le voudrait le programme), mais qu'il échoue sur la vérification (voir ci-dessous).

avrdude: 15586 bytes of flash written
avrdude: verifying flash memory against C:\DOCUME~1\xxxx\LOCALS~1\Temp\build1915595779033918899.tmp\test1_LCD_Ethernet.cpp.hex:
avrdude: load data flash data from input file C:\DOCUME~1\xxxx\LOCALS~1\Temp\build1915595779033918899.tmp\test1_LCD_Ethernet.cpp.hex:
avrdude: input file C:\DOCUME~1\xxxx\LOCALS~1\Temp\build1915595779033918899.tmp\test1_LCD_Ethernet.cpp.hex contains 15586 bytes
avrdude: reading on-chip flash data:

Reading | avrdude: Send: . [1b] N [4e] . [00] . [05] . [0e] . [06] . [80] . [00] . [00] . [00] . [d8] 
avrdude: Recv: 
avrdude: Recv: 
avrdude: stk500_2_ReceiveMessage(): timeout
avrdude: Send: . [1b] N [4e] . [00] . [01] . [0e] . [01] [ [5b] 
avrdude: Recv: 
avrdude: stk500_2_ReceiveMessage(): timeout

Me suis fais grondé parce que le message est trop long, je le coupe en 2, suite au prochain message ...

... Suite du message précédent

Le programme est un mix de 2 exemples trouvés sur le site www.mon-club-elec.fr, utilisant le shield ethernet et l'écran MI0283QT-2 (superbe matos au passage).

Les 2 exemples pris séparément fonctionnent sans problème (même si le shield ethernet et l'écran sont branchés en même temps), mais je désespère de faire passer le mix dont je donne le source ci-dessous à toute fin utile :

#include <SPI.h>
#include <Ethernet.h>
#include <Server.h>
#include <Client.h>

#include <MI0283QT2.h> // librairie de l'afficheur TFT MI0283QT2

#include <ADS7846.h> // inclusion de la librairie pour le touchpad

#define TOUCHPAD_EEPROMADDR (0x00) //adresse eeprom des données de calibration du touchpad

int posX=0; // variable position courante renvoyée par drawText
int pression=0, X=0, Y=0; // variable X,Y appui touchpad

//--- déclaration du tableau d'adresse MAC ---
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

//---- tableau de l'adresse IP de la carte Arduino
byte ip[] = { 192,168,0,127 }; // le PC a pour IP : 169.254.10.1

//----- tableau de l'adresse de la passerelle ---
byte passerelle[] = { 192, 168, 0, 2 }; // l'adresse du PC de connexion

//----- tableau du masque de sous réseau
byte masque[] = { 255, 255, 255, 0 }; // idem masque sous-réseau du PC : 255.255.255.0

//--- création de l'objet serveur ----
Server serveurHTTP(80); // crée un objet serveur utilisant le port 80 = port HTTP

MI0283QT2 lcd; // création d'un objet de type MI0283QT2 appelé lcd

ADS7846 touchpad; // création un objet touchpad de type ADS7846

#define blanc RGB(255,255,255)
#define bleu  RGB(0,0,255)
#define rouge RGB(255,0,0)
#define vert  RGB(0,255,0)

#define TAILLE_BOUTON 10

struct {
  int x;
  int y;
  int color;
} Boutons[]= {{60,5,rouge},
             {75,5,vert},
             {90,5,bleu}};

int nbBoutons = sizeof(Boutons)/sizeof(Boutons[0]);

void AfficheMenu()
{
  int i;
  
  lcd.clear(RGB(255,255,255)); // efface ecran en blanc
  lcd.drawRect(1,1,50,25,bleu);
  lcd.drawText(5,10,"Clear",1,bleu,blanc);
  for (i=0;i<nbBoutons;i++) {
    lcd.fillRect(Boutons[i].x,
                 Boutons[i].y,
                 Boutons[i].x+TAILLE_BOUTON,
                 Boutons[i].y+TAILLE_BOUTON,
                 Boutons[i].color);
  }
}

void setup()   
{ // --- ici instructions à exécuter au démarrage ---

  //---- initialise la connexion Ethernet avec l'adresse MAC, l'adresse IP et le masque
  Ethernet.begin(mac, ip, passerelle, masque);
  //---- initialise le serveur ----
  serveurHTTP.begin();

  //initialisation écran MI0283QT2  240x320 pixels
  lcd.init(4); //spi-clk = Fcpu/4
  lcd.clear(RGB(255,255,255)); // efface ecran en blanc

  //---- initialisation du touchpad de l'afficheur
  touchpad.init(); // initialisation du Touchpad
  touchpad_calibration(); // appelle la fonction de calibration du touchpad - voir code après fonction loop

  // Par défaut 0 = point 0,0 en regard connecteur USB
  // IMPORTANT : touchpad et afficheur doivent avoir la meme orientation !
  lcd.setOrientation(270); // configure orientation afficheur en degrés : 0,90,180,270
  touchpad.setOrientation(270); // configure orientation touchpad en degrés : 0,90,180,270

  lcd.led(25); // fixe luminosité

  AfficheMenu();
} // fin de la fonction setup()
// ********************************************************************************

void loopEther();
void loopLcd();

void loop(){
  loopEther();
  loopLcd();
}


void loopEther()
{ // debut de la fonction loop()

  Client client = serveurHTTP.available();

  if (client) { // le test est VRAI si le client existe
    while (client.connected()) { // tant que le client est connecté
      if (client.available()) { // le test est vrai si il y a au moins 1 octet disponible
        char c = client.read(); // lit l'octet suivant reçu du client (pour vider le buffer au fur à mesure !)
      } else { // si pas de caractères disponibles = requete client terminée
        // envoi d'une entete standard de réponse http
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();

        // envoie les chaines de caractères voulues = du code HTML

        // code HTML pour police jaune sur fond bleu
        // <body style="color: rgb(255, 255, 0); background-color: rgb(0, 0, 255);" >
        client.print("<body style="),client.print(byte(34)); // <body style="
        client.print("color: rgb(255, 255, 0); background-color: rgb(0, 0, 255);");
        //color: rgb(255, 255, 0); background-color: rgb(0, 0, 255);
        client.print(byte(34)),client.print(">") ;  // " >  
        client.println("
");

        // affiche chaines caractères simples
        client.print("Yo !");
        client.println("
"); // saut de ligne HTML
        client.print("Salut la compagnie !! ");
        client.println("
"); // saut de ligne HTML
        client.print("Bientot ca fera meme le cafe !!!");
        client.println("
"); // saut de ligne HTML

        // code HTML pour inclure une image à partir lien web
        client.println("
");// 

        client.print("<img src="),client.print(byte(34)); // <img src="
        client.print("http://www.arduino.cc/mes_images/clipart/logo_arduino_150.gif");
        client.print(byte(34)),client.print(">") ;  // " >  
        client.println("
");// 


        break; // on sort de la boucle while
      }
    } // --- fin while client connected

    // on donne au navigateur le temps de recevoir les données
    delay(1);

    // fermeture de la connexion avec le client
    client.stop();
  } //---- fin if client existe ----
} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

#define SEUIL_PRESSION 10

void loopLcd()
{ // debut de la fonction loop()
  static int PrevPression=0;
  static int PrevX;
  static int PrevY;
  int i;
  static int couleur = bleu;
    
  touchpad.service(); // lance la fonction de service du touchpad

  pression=touchpad.getPressure(); // renvoie la valeur courante de la pression sur le touchpad
  if (pression<SEUIL_PRESSION) pression=0;

  X=touchpad.getX(); // renvoie la valeur courante de X du touchpad
  Y=touchpad.getY(); // renvoie la valeur courante de Y du touchpad

  if (pression!=0) {
    if ((X>1) && (X<50) && (Y>1) && (Y<25)) {
      AfficheMenu();
      pression=0;
    } 
    for (i=0;i<nbBoutons;i++) {
      if ((X>Boutons[i].x) && (X<(Boutons[i].x+TAILLE_BOUTON)) &&
          (Y>Boutons[i].y) && (Y<(Boutons[i].y+TAILLE_BOUTON))) {
        couleur=Boutons[i].color;
        pression=0;
        break;
      }
    }
  }
  if (pression!=0) {
    if (PrevPression==0) { // on vient d'appuyer, tracer le point
      lcd.drawPixel(X,Y,couleur);
    } else { // on s'est déplacé, tracer la ligne
      lcd.drawLine(PrevX,PrevY,X,Y,couleur);
    }
  }
  PrevX=X;
  PrevY=Y;
  PrevPression=pression;
} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin

void touchpad_calibration(void) 
{
  // fonction classique de calibrage
} //------------------- fin fonction calibration touchpad -------------

// --- Fin programme ---

Pour finir, j'ai à l'origine eu ce problème sur une machine linux (ubuntu), mais le problème est le même avec une machine windows XP (les messages données plus haut).
Ce problème semble assez courant, souvent sans réelle solution (la carte est morte, "le bootloader a eu chaud" ...).

C'est le premier post que je trouve avec une solution qui hélas n'a pas fonctionné dans mon cas.

D'autres pistes à explorer ?

Merci

PS: La carte n'est alimentée que par le port USB lors de l'upload. Je vais essayer de lui apporter un supplément de jus par le connecteur d'alim, on ne sait jamais.

Bon, ben, avec ou sans alim externe, j'ai la même chose, l'upload du pgm de 15k tombe en timeout ...

pfff ...

Le fait que tes 2 programmes ne tournent pas ensembles alors qu'ils tournent spéarement est du à la gestion du port spi à mon avis.

Donc il faut trouver les méthodes qui permettent de donner la main au bon device quand on a besoin d'opérer dessus.

Tout dépend du shield ethernet dont tu disposes, donne nous plus d'infos à ce sujet.

A+

Bonjour Grag38,

J'ai quand même pu faire tourner le mix une fois (le petit serveur web + le mini paint sur l'écran), donc je ne pense pas qu'il y ai de conflit particulier à ce niveau là (c'est d'ailleurs ce que je voulais vérifier en faisant ce petit test).

D'ailleurs ce n'est pas l'exécution qui pose problème, c'est la mise en place du programme sur la carte.

Pour répondre à ta question, le shield ethernet est celui-ci http://arduino.cc/en/Guide/ArduinoEthernetShield.

Par contre avec le recul, la première version du programme (côté serveur web) logguait pas mal de choses sur le port série.
Est ce que le fait d'y toucher ne modifierait pas quelques petites choses au niveau du contrôleur série qui pourrait altérer les comm suivantes, notamment lors de l'upload ?

D'un autre côté, le fait de reprogrammer le contrôleur série doit remettre tout ça d'équerre ... mais ça buggue toujours ...

C'est bien frustrant tout ça ...

A+

Diantre !!

j'ai trouvé où ça lui faisait mal, mais je n'ai toujours pas compris pourquoi.

Dans la fonction loopEther, si je commente la ligne client.print("Bientot ca fera meme le cafe !!!"), ou si je remplace la chaîne par un autre texte, l'upload se passe sans problème ...

Faut croire que le matos Arduino n'aime pas le café. Faudra quand même qu'on m'explique le rapport avec la choucroute !?
Tout ça parce que j'ai voulu personnaliser les exemples ... tss tss tss ...

S'il y a des amateurs pour comprendre le phénomène, je tiens les fichiers à dispo (code source et .hex correspondants pour la version qui marche et celle qui ne marche pas).

Un petit dernier pour la route ...

Je viens de faire des essais, et il me suffit d'avoir une chaine de caractères avec 3 points d'exclamation consécutifs en fin de chaine pour avoir le problème d'upload.
La chaine doit être utilisée dans le programme, sinon l'optimisation du compilo fera qu'elle n'existera même pas dans le .hex final.

Le code 0x21 0x21 0x21 0x00 a-t-il une signification dans le protocole de transfert vers la carte ?

Bonne soirée, moi je vais pouvoir jouer maintenant XD