Go Down

Topic: Projet Arduino Ethernet + SD card et modules RF 433Mhz (Read 3841 times) previous topic - next topic

swatre

Oct 28, 2011, 09:49 pm Last Edit: Oct 28, 2011, 10:03 pm by swatre Reason: 1
Bonjour et d'avance merci pour les personnes qui voudront prendre de leur temps pour m'aider.
Je me suis passionné pour Arduino depuis 2 mois. J'ai pour projet de contrôler des équipements électriques chez moi depuis Internet.
La première chose à y passer sera ma chaudière.

J'utilise pour cela :
Ce qui me sert de centrale
- Arduino UNO + Shield Ethernet avec SD card tout 2 officiels
- un module temps réel à base de DS1307
- un capteur de température I2C TMP102
- un émetteur et un récepteur RF 433 Mhz acheté chez Sparkfun
- d'autres elts devraient venir se greffer par la suite.

Un module relais sans fil (pour commander ma chaudière)
- arduino pro mini 5v
- récepteur RF 433 Mhz
- 1 module relais acheté sur ebay

Un module de température sans fil sur pile 9v pour recevoir la température extérieure toutes les 30", le but est d'anticiper l'allumage de la chaudière en fonction de la différence entre la consigne demandée et la température externe :
- arduino pro mini 3.3v
- emetteur RF 433 Mhz
- module I2C de température TMP102

Mon projet avance bien puisque mon module de température sans fil est opérationnel et même installé à l'extérieur de chez moi
Le module relais sans fil fonctionne aussi de façon autonome.
Coté centrale (arduino UNO) j'avançais aussi plutôt bien. la partie thermostat programmable en fonction des jours et heures de la journée pilotent bien à vide (pas encore raccordé à la chaudière) le module relais. Avant de m'attaquer à la partie Internet pour laquelle j'ai déjà fait pas mal de tests, je voulais profiter de la présence d'une interface SD card pour enregistrer des logs.

ET DONC VOICI MON PROBLEME
Ce n'est pas indispensable pour mon projet mais cela m'embête de ne pas savoir d'où vient le problème et en plus cela fait plusieurs jours que je tourne en rond.
Je n'arrive pas à écrire sur la SD CARD j'ai fini par trouvé quel était l'élément qui empêchait d'écrire c'est mon émetteur RF. Mon programme utilise la librairie  VirtualWire.h

Je vous propose ci-dessous le morceau de code qui pose problème :
Code: [Select]
#include <VirtualWire.h>
#include <SD.h> // librairie SD Card
#include <SPI.h>

byte relais[4]; // tableau contenant les infos relais transmises par RF
// SD Card
char fileName[]=("log.txt"); // nom du fichier de stockage sur la SD Card
File myFile; //init class File accès aux fichiers de la carte SD
const byte chipSelect = 4;
String dataString = "";

void setup(){
 Serial.begin(57600);
 vw_set_tx_pin(7);
 vw_setup(2000);
 Serial.print("Initializing SD card...");
 pinMode(10, OUTPUT);
 if (!SD.begin(chipSelect)) {
   Serial.println("initialization failed!");
   return;
 }
 Serial.println("initialization done.");
 relais[0]=1; //N° de l'arduino émeteur
 relais[3]=2; //N° de l'arduino récepteur
}

void loop(){
 relais[1]=0;
 relais[2]=0x55;
 vw_send((uint8_t *)relais, sizeof(relais));
 vw_wait_tx();  // Wait for message to finish
 delay(2000);
 dataString="hello";
 myFile = SD.open(fileName, FILE_WRITE);
 if (myFile) {
   myFile.println(dataString);
   myFile.close();
   Serial.println(dataString);
 }  
 else {
   Serial.println("error opening file");
 }
  delay(2000);
}


J'obtiens "error opening file"
Si je commente les lignes :
Code: [Select]
//   vw_send((uint8_t *)relais, sizeof(relais));
//   vw_wait_tx();  // Wait for message to finish

Cela fonctionne.
Pouvez-vous m'aider, merci d'avance ?

al1fch

Bonjour
La fonction  vw_wait_tx() bloquante.
La documentation de VirtualWire dit en gros :
vW_wait_tx() : "bloque et attend que l'émetteur ait fini son travail"

comment l'emetteur utilisé signale-t-il qu'il a émis le message ? En est-il capable ?


swatre

Bonjour
Quote
La fonction  vw_wait_tx() bloquante.
La documentation de VirtualWire dit en gros :
vW_wait_tx() : "bloque et attend que l'émetteur ait fini son travail"


Je pensais que cela permettait au process d'être certain que la transmission soit terminée avant de passer à la suite mais de toute façon qu'on l'ajoute ou non ne change rien à mon problème

Quote
comment l'emetteur utilisé signale-t-il qu'il a émis le message ? En est-il capable ?


Tout simplement j'ai un autre montage (relais) à 2 mètres qui s'active de ce coté là je n'ai pas de PB.
Je viens d'essayer la librairie  sdFat et c'est toujours le même problème, la ligne

Code: [Select]
vw_send((uint8_t *)relais, sizeof(relais));

bloque l'accès à la SDCard

al1fch

peut etre un conflit entre VirtualWire et les librairies de gestion de carte SD en raison de l'utilsation intensive (?) des interruptions par VirtualWire. (Timer1)
Il faudrait peut etre tenter une désactivation de VirtualWire le temps d'écrire sur la carte SD , ou du moins masquer temporairement l'autorisation de l'interruption par débordement du timer1 qui semble etre au coeur du fonctionnement de VirtualWire

lokan

Bonjour,

Je suis interessé par une partie de votre montage !
Fournissez-vous des plans? :-)
D'avance merci

skywodd

Bonjour,

Pour éviter tout probléme de timer :
Code: [Select]
cli(); // Désactive tout les interruptions
// ... code SD
sei(); // Réactive le interruptions

(Pas sûr que VirtualWire apprécie le subterfuge mais bon, à tester)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up