Go Down

Topic: Probléme de code incompréhensible pour un débutant (Read 2431 times) previous topic - next topic

lemat

Jun 28, 2013, 11:13 pm Last Edit: Jun 28, 2013, 11:21 pm by lemat Reason: 1
Bonsoir a tous, je me tourne a vous suite a mes déboire avec mon arduino, je réalise un système de laser game (jeux de tir avec des led ir) et je bloque sur une série de beugs suite a l'ajout d'un lecteur SD.

Le lecteur Sd fonctionne mais certaines section de mon code me crée des erreur le problème étant que même en commentant par section je n'arrive pas à isoler les erreurs.

Je sais simplement qu'en commentant toutes la partie réception IR il n'y a pas de beug donc je suppose que le problème vient de cette partie.

J'aurais tendances a pencher pour un problème de mémoire ou d'optimisation (la c'est évident que c'est pas au top).

Lors de ces beug l'afficheur lcd va m'afficher des caractère aléatoire ou des texte non complet ou l'arduino redémarre après le setup il arrive que le chronométre crée avec millis() dérapé et m'affiche des chiffre incohérent.

Il arrive également que l'arduino redémarre sur l'appuie d'un bouton.

Si vous pouvez m'aidez a corriger mes erreur voir même a optimiser mon code de débutant que je suis, je vous en serais reconnaissant   ;)

ps: j'utilise une Arduino UNO.

Sans plus attendre le code :

http://pastebin.com/8uUUbvNi

Merci d'avance.

infobarquee

bonjour,
déjà un blem à mon avis
Quote

int reload = 4;

    Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4.

lemat

Bonjour, merci de ton aide alors en effet le commentaires mentionne la pin 4 mais c'est celle par défaut qu'utilise la librairie SD moi j'utilise la 10 pour la broche matérielle SS :

Code: [Select]

   pinMode(10, OUTPUT);
 
  if (!SD.begin(10)) {

lemat

Personne ? peut être que je ne suis pas assez clair  :.

Pour revenir sur les erreur que ça me provoque avec le code afficher ci dessus, la carte redémarre a chaque fois que j'appuie sur le bouton de tir ou de rechargement.

J'aurais finalement tendances a pencher a une incompatibilité entre certaines des librairie que j'utilise car les problème apparaissent des que j'utilise la librairie SD.h.

Je pense que la syntaxe et l'organisation de mon code est aussi en cause mais je ne voit pas trop comment faire autrement :/


68tjs

Quote
Pour revenir sur les erreur que ça me provoque avec le code afficher ci dessus, la carte redémarre a chaque fois que j'appuie sur le bouton de tir

Un peu de logique :
Quand tu appuis sur le bouton de Tir c'est que tu utilise le laser.
Si tu utilise le laser il consomme du courant   -> et quel est son courant ? combien de mA ?
Comme c'est probable tu dois alimenter ton montage sur le 5 V de l'arduino.

Et qu'est ce qui se passe quand on tire trop de courant sur une alim ?
Eh bien elle s'écroule.

Et qu'est-ce qui se passe quand  l'alim du micro-controleur s'écroule ?
Eh bien il redémare...............

lemat

Bonsoir et merci de ton aide, j'avais effectivement penser a une chute de tension ce qu'il y a c'est que j'utilise une simple led infrarouge et pas un laser la led ne consomme quasiment rien donc je ne pense pas que ce soit le problème je pense que c'est purement un problème de code.

Il y a peu de composant en réalité le lecteur sd quelque résistance une led ir et un récepteur ir type tsop je suppose que les 500mA du port usb sont suffisant non ?

Je me répète mais c'est pour être bien clair dans mes explication, si je sort la partie SD tout fonctionne très bien et le lecteur SD avec un shield d'exemple fonctionne également.

Existe t'il des incompatibilité connue entre mes librairie je n'ai rien réussi a trouver a ce sujet ?

68tjs

Quote
la led ne consomme quasiment rien

Cette réponse ne veut rien dire.
La seule réponse correcte est : mon émetteur consomme x mA.
Et pas x mA trouvés dans la notice mais mesurés, parce que si c'est l'émetteur qui ne fonctionne pas correctement c'est pas dans la notice que tu le verra.
Quand cela ne fonctionne pas on ne peux pas se contenter d'à peu près.
Pareil pour le reste des composants.
Quote
un récepteur ir type tsop

Le terme TSOP correspond à une taille de boîtier cela n'a rien à voir avec la consommation.
Si c'est du tsop ce n'est sûrement pas toi qui l'a soudé et donc c'est une carte toute faite. La consommation doit être précisée quelque part. Sur le boîtier il y a une référence, avec cette référence on trouve une datasheet(notice technique), dans cette datasheet on trouve la consommation.  Cela donne un début de réponse car sur la carte il peut y avoir d'autres composants qui consomment  le mieux est de faire la mesure avec un multimètre positionné en ampèremètre.

Sur un phénomène de Reset intempestif en cours de programme ce n'est pas la peine de chercher des poux dans la tête du code tant que le matériel n'est pas mis hors de cause.

lemat

Exact je suis tout a fait d'accord je supposer simplement que cela était suffisent car j'ai déjà aperçue des projet bien plus important fonctionnant avec le port usb.

Ce que je vais faire c'est essayer le programme en laissant que le bouton de tir pour voir si le reset survient toujours, pour les mesure je connait bien mais mon multimètre ma lâcher donc je ne peut rien mesurer pour le moment :(

Pour ce que j'appelle le tsop il est sur une breadboard avec ça résistance.

Je vous donne des nouvelles demain et des photo du montage, merci pour ton aide en tous cas 68tjs ;)

68tjs

Quote
Pour ce que j'appelle le tsop il est sur une breadboard avec ça résistance

Un tsop monté sur breadbord : vite les photos  :smiley-mr-green: :smiley-mr-green:

lemat


Un tsop monté sur breadbord : vite les photos  :smiley-mr-green: :smiley-mr-green:


Je comprends pas ton étonnement je pense que l'on ne parle pas de la même chose : http://pdf.datasheetcatalog.com/datasheets/2300/301522_DS.pdf

Voila une photo du montage :


Uploaded with ImageShack.us
Le tsop est en haut a droite, les 2 fil du bas corresponde au bouton de tir et de rechargement.

J'ai essayer de ne laisser que le bouton de cabler l'arduino ne boot pas si la librairie SD et déclaré mais pas cablé je l'ai donc recablé seulement le lecteur et le bouton et le problème persiste l'arduino plante a chaque action c'est pas vraiment un reset, il retourne au setup m'affiche un message du genre "Initialis^vion o cour ." a la place de "Initialisation en cours" et revient sur l'osd.


68tjs

Tu vas comprendre mon étonnement :
Ce que tu appelle tsop est en fait un circuit intégré dont le vrai nom est TSOPXXXX comme par exemple TSOP1780.

Quand on parle de boîtier tsop on parle d'un boîtier dans lequel on peut trouver une grande variété de puces électroniques.
Ce boîtier est un CMS c'est à dire à montage de surface avec des pattes de 2mm de long et espacées de 0,5mm c'est pourquoi je demandais à voir un tel boîtier dans une breadbord. C'est important de livrer toute l'information.

Refait un câblage propre et utilise un vrai bouton et non pas 2 fils à court-circuiter qui peuvent à l'occasion faire des court-circuits partout et surtout là où il ne faut pas. Place un condensateur de 100nF en parallèle sur le bouton : le bouton à obligatoirement des rebonds mécaniques, le condensateur les masquera.
Utilise des fils courts. On peut très bien câbler proprement avec breadbord en utilisant juste du fil dénudé en extrémité et plaqué contre la breadbord et donc sans longueur inutile.

Introduit tes composants les uns après les autres , à chaque étape limite leur nombre au strict nécessaire : par exemple l'écran LCD n'est pas obligatoire dans un premier temps tu peux faire des sorties sur le serial monitor.
Fais des tests intermédiaires.
Contrôle les courants à chaque fois : un multimètre se trouve à moins de 10 €

Construit une bonne masse. Sur la photo on a l'impression que les deux cartes arduino ont leur masse reliée par les câbles USB : si c'est ça, ce n'est pas terrible.
Essaye de dessiner un schéma électrique, un vrai avec un crayon et une gomme.
Attention pour moi le "machin Fritzing"  ne fait pas de schéma, il fait juste un dessin pour placer les composants.

Affiche un maximum d'action de débogage sur le sérial monitor afin d'identifier exactement où cela plante.


lemat

#12
Jul 02, 2013, 12:51 pm Last Edit: Jul 02, 2013, 01:16 pm by lemat Reason: 1
Ah ok je voit excuse moi je pensais qu'il n'y avait pas plusieurs appellation pour TSOP, j'ai refait le câblage avec des fil court selon tes conseil ça n'a pas changer le problème mais je gagne en clarté ;)



Je vient de tester en mettant un sketch exemple pour chaque partie (IR en réception et en émission, Le LCD, Le lecteur SD ...), toutes les parties fonctionne a merveille.

Je vient de cerner un autre beug incompréhensible, si je dé-commente les ligne correspond a la carte SD dans ce sketch (pas la partie réception) :
http://pastebin.com/xgcaUaMH

La variable "test" déclaré ligne 24 et afficher ligne 303 sans traitement supplémentaire, fait défilé a toute vitesse sur l'afficheur des chiffres aléatoires, si je remplace cette variable par "NumArme" comme c'était le cas avant le résultat est le même, encore plus étrange si j'échange la position de "NumArme" et de "myteam" c'est cette dernière qui se met a défiler.

Je précise que le serial monitor m'affiche le même résultat que l'écran lcd et que le retirer ne change pas le problème.

Lorsque je dé-commente la partie réception le problème ci dessus n'est plus présent, mais lorsque j'utilise le bouton de tir l'écran m'affiche des caractère inattendue pendant quelque seconde comme ceci :



Et si je commente toutes la partie SD tout rentre a nouveau dans l'ordre  :smiley-sleep:

PS: je n'utilise qu'un seul arduino pour le moment ;)

fdufnews

Code: [Select]
#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <string.h>
#include <SD.h>


Cela fait beaucoup de librairies. Je pencherai pour un problème de saturation de la mémoire. Surtout avec les symptômes que tu décris:
Quote
lorsque j'utilise le bouton de tir l'écran m'affiche des caractères inattendues pendant quelque secondes comme ceci

Cela ressemble vraiment à une chaîne de caractères qui déborde
   - soit parce qu'il y a un problème d'allocation cela arrive souvent lorsqu'on concatène des chaînes pour en faire une plus longue
   - soit parce que la mémoire est saturée et des tampons ne peuvent plus être alloués dynamiquement et les fonctions ne le testant souvent pas on écrase à ce moment là d'autres données.

La librairies SD est je crois assez gourmande en mémoire car elle conserve des buffers ouverts en permanence. Et la librairie String est aussi connue pour sa gestion de mémoire peut optimisée.

Regardes là: http://playground.arduino.cc/Code/AvailableMemory
Cela permet de contrôler la mémoire disponible. Tu peux faire afficher la mémoire disponible à différents moments vers la console pour tenir à l'oeil l'état de la mémoire.

lemat

Merci fdufnews, tu en revient donc a ma première idée cela dit je n'avait pas penser a ce que fessais les librairie en background je vais tester AvailableMemory je vous dirais  ce qu'il en ai merci pour ton aide.

Go Up