Pages: [1]   Go Down
Author Topic: Téléinfo : probleme caracteres affiches  (Read 1622 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

aujourd'hui je souhaite lire les données téléinfo de mon compteur EDF.
Pour cela, j'ai mon Arduino branché en usb à mon pc sous vista, et réalisé le circuit téléinfo suivant :


Mon code de test est le suivant :
Code:
#include <SoftwareSerial.h>

//réception sur la pin 2
SoftwareSerial cptSerial(2, 3);

void setup() {
        Serial.begin(1200);     // opens serial port, sets data rate to 1200 bps
        cptSerial.begin(1200);
}

void loop() {
 
  if (cptSerial.available())
    Serial.write(cptSerial.read() & 0x7F);
}
code testé par un utilisateur ici : http://arduino.cc/forum/index.php/topic,89712.msg674636.html#msg674636

Le problème est que sur Putty, data 7bits, 1 bit stop, parité Paire, je reçois en boucle des informations mais illisibles :

Code:
qVldVRbrRrvryR'=_W
qVldVRbrRrvry"'=_W
qVldVR2rRrvryR#=_W
yvryR#=_W
qVldVRbrRrvryR#=_W
qVldVR2rRrvryR#=_W
qVldVRbrRrvryR'=_W
qVldVRbrRrvry"'=_W
qVldVR2rRrvryR#=_W
yvryR#=_W
qVldVRbrRrvryR#=_W
qVldVR2rRrvryR#=_W

Alors que je devrais avoir au moins quelque chose comme:
Quote
ADCO 02092xxxxxx @

Avez-vous une idée sur l'origine de mon problème ?
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Le problème est que sur Putty, data 7bits, 1 bit stop, parité Paire, je reçois en boucle des informations mais illisibles :
Pourquoi 7bits !?
La communication série PC <> arduino ce fait en 8 bits, pas de parité, 1 bit de stop, et pas de controle de flux.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Biganos
Offline Offline
Sr. Member
****
Karma: 2
Posts: 362
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salut
Essaye plutôt ça :

Et tiens nous au courant  smiley-grin
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

parce que la trame téléinfo (en france, ailleurs,je sais pas) est transmise selon le format 1200 bits/s, 7 bits/caractères, parité paire, 1 bit de stop.

plus d'info :
http://www.planete-domotique.com/blog/2010/03/30/la-teleinformation-edf/
http://vesta.homelinux.free.fr/site/wiki/demodulateur_teleinformation_edf.html
http://arduino.cc/forum/index.php?topic=82555.25;wap2

Le site suivant est très instructif :
http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertTeleinfoTestSimpleLectureTrame

Logged

pas taper... sauf application de l'article 35 ...

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

parce que la trame téléinfo (en france, ailleurs,je sais pas) est transmise selon le format 1200 bits/s, 7 bits/caractères, parité paire, 1 bit de stop.
Attention il faut bien différencier le port série software du port série hardware !
Le port série hardware tourne avec les caractéristiques données plus haut, le port série software tourne suivant comment tu le configure.

Il me semble qu'il n'est pas possible de faire du 7 bit + parité avec SoftSerial tu va devoir utiliser le port série hardware et manipuler les registres de l'ATMega pour le configurer correctement.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si la trame est en 7-bit + parité, ce n'est pas un problème.
Utilise SoftwareSerial en 8-bit.
Le 8eme bit (bit 7) sera le bit de parité.

Tu as le choix alors entre :
- Laisser tomber la vérification des erreurs et masquer tous les bits 7 par quelque chose du genre
Code:
for ( i = 0 ; i < bufferLen ; i++ )
  buffer[i] &= ~_BV(7);
- Te taper la vérification du code de parité et virer le message s'il y a eu une erreur

Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,
Merci à tous pour vos réponses, j'ai désormais un affichage correct !

@chabot380 : merci, j'ai réalisé ton schéma, et j'obtiens bien :

Code:
ADCO 0XX8011XXXXX 8
ADCO 0XX8011XXXXX 8
ADCO 0XX8011XXXXX 8
ADCO 0XX8011XXXXX 8

1.Pourquoi presque "inverser" la partie côté arduino a changé l'info ?

-----
Pour les 7 bits, oui je parviens du coup à les lire avec Putty.

2.Si j'essaie de comprendre ce que tu expliques, barbudor, il serait possible de communiquer et donc lire les infos envoyées par l'arduino en 8 bits comme "habituellement" ?
Ou alors je capte pas ?

3.Arf,  mon compteur n'est pas en mode téléinfo, je n'ai que le numéro de compteur... Va falloir payer EDF pour qu'un gars se déplace... :-(
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

2.Si j'essaie de comprendre ce que tu expliques, barbudor, il serait possible de communiquer et donc lire les infos envoyées par l'arduino en 8 bits comme "habituellement" ?
Ou alors je capte pas ?

Une transmission série 7-bit + parité est en fait une transmission -bit avec :
- 7 bit utiles dans les poids faibles (bit 0 à bit 6)
- 1 bit de parité c'est à dire un bit qui permet de vérifier la validité de l'octet pour se prémunir d'erreurs de transmission.
Le bit de parité est calculé de telle façon que :
- Parité Paire : la somme de tous les bits de l'octet y compris la parité est un nombre pair
- parité Impaire : la somme de tous les bits de l'octet y compris la parité est un nombre pair

Normalement, quand tu utilise une fonction série matérielle telle que le Serial de l'Arduino, c'est le composant qui gère cela.
Il va recevoir les 8 bits, vérifier la parité. Si la vérification de parité est ok, il masque le 8eme bit (parité) et remonte au code (lib HardwareSerial de l'Arduino) un octet dont le 8eme bit est toujours à zéro. Si la vérification est ko, il jète l'octet.

Résultat sur un message complet dont certains caractères sont erronés, tu ne reçoit pas les caractères erronés. Ca te fait une belle jambe parce que quand il manque des caractères "on n cmprd ps tot c qu di l'are" (on ne comprend pas tout ce que dit l'autre smiley-wink)
Donc le message est pourris de toute façon....
Autant ne pas tenir compte de la parité, laisser les caractères faux arriver et utiliser autre chose pour valider le message tel qu'un checksum par exemple.


La lib SoftwareSerial elle ne fait pas cette distinction. Elle reçoit les 8 bits et retourne à l'application les 8 bits que le 8eme bit soit un bit utile ou un bit de parité.
Le problème c'est que par exemple (exemple en parité paire) si pour le caractère 'A' code ASCII 65 (0x41), tu va bien recevoir 0x41 (2 bits sont à 1, le bit 0 et le bit 6) pour le caractère 'C' code ASCII 67 tu va recevoir 0xC3. Le transmetteur aura positionné le 8eme bit a 1 de façon que le nombre de bits à 1 soit pair (bits 0, 1, 6 et 7).

Il suffit donc de masquer chaque octet reçu par un "& 0x7F" (c'est la même chose que "& ~_BV(7)" et voilou.

Est-ce clair ?
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Génial, et merci pour ta réponse très précise !

En faisant le test,
Code:
Serial.write(cptSerial.read());
Sans masquer le 8eme bit, l'affichage dans le Serial Monitor n'est pas bon, c'est normal.


Code:
Serial.write(cptSerial.read() & 0x7F);
Le 8eme bit étant masqué, le caractère lu est le bon et la sortie est parfaite :-)

merci
« Last Edit: April 12, 2012, 05:15:59 pm by edoc » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

CQFD
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

0
Offline Offline
Full Member
***
Karma: 0
Posts: 175
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

c'est donc réglé avec le premier schéma ou le second ?

sinon, pour exemple : http://www.euvrard.net/teleinfo/
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hello,

C'est bien en réalisant le 2ème schéma que cela fonctionne, comme je l'ai écrit ;-)

D'où ma question à chabot380 pour comprendre pourquoi ce 2eme schéma est bon pour moi et pas le premier.
Logged

Biganos
Offline Offline
Sr. Member
****
Karma: 2
Posts: 362
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut

pourquoi ?  smiley-eek-blue
Quote
Le signal est modulé à 50 KHz : la présence de modulation correspondant à un 0 logique, l’absence à un 1 logique.
Donc pour avoir ça c'est le schéma que je t'ai indiqué, car le schéma que tu nous as donné faisait l'inverse !

voilà pourquoi !  smiley-grin

A+
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Pages: [1]   Go Up
Jump to: