Loading...
Pages: 1 2 3 [4]   Go Down
Author Topic: protocole de communication série bi-directionnel entre carte  (Read 1492 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pause à la transmission !
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 0
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ça avait été en réception je me serais dis que c'était histoire d'avoir tout le paquet en un coup, en transmission je vois pas ?
Donc je dirais pas besoin de pause.
A moin que tu te bases sur mon code et le petit delay sur le bus rs-485 en fin de trame ?
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non pas forcément...

J'arrive pas trop à comprendre. Il existe des bus terrains, pas moyen de trouver quelque-chose de correct. Donc je vais faire je pense un travail au cas par cas.

Etape 1, recevoir le start bit lancer la réception des données jusqu'au stop bit.
Etape 2, travailler sur le lenght.
Etape 3, Traiter les datas.
Etape 4, sécuriser.

Donc là, j'en suis à l'étape 1.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Des nouvelles du projets.

Ayant passé pas mal de temps à glané des informations, je suis arrivé à un compromis qui me va bien. Je n'ai pas repris complètement ton travail Osaka et pour cause de simplicité dans ma façon de traiter les évènements. Néanmoins je me suis inspirer de la philosophie de ton travail et des interventions sur mon sujet.

Ceci me donne le protocole suivant.

1 - Le start bit est unique et détermine le début de trame. Il est invariablement déterminé par 0x00.
2 - Le stop bit n'est pas présent il est remplacer par le CRC.
3 - Le type de donné est fourni dans la trame. Il permet suivant le tableau de déterminer le type de sortie associé dans les data(s).
4 - Le lenght fourni la quantité de data nécessaire à un type donné.
5 - CRC à l'étude. Le CRC sert de bit stop en plus d'être une some de contrôle à décalage. L'opération consistera en une addition des bits data et en un décalage du résultat vers la gauche.
6 - Tableau des types :
0x10 -> Entrée tout ou rien sur 1 data (0x00 = 0v / 0x01 = 5v)
0x11 -> Sortie tout ou rien sur 1 data (0x00 = Éteint / 0x01 = Allumer)
0x12 -> PWM sur 2 data (Data1 = temps du front haut et Data2 = total du créneau)
0x13 -> Servo ou Variateur (PWM sur 20ms) 1 Data ici on donnera un angle de 0 à 180°. 90° étant la position centrale. Un data pouvant envoyé de 0 à 255, 0 à 180 rentre dedans. plus besoin de décaler quoi que ce soit.
0x14 -> Urgence (Ce cas prendra 1 bit et est nécessaire au retour si une avarie ou une grave anomalie est détecter) 0x00 = RAS / 0x11 = Urgence

Voila donc à quoi ressemblera le pilotage du 5 ième servo moteur sur mon sous-marin: 0x00 0x13 0x02 0x05 0x03 0x20

Dé tramage de 0x00 0x13 0x02 0x05 0x03 0x20 :
0x00 -> début de communication
0x13 -> c'est un servo donc PWM entre 1 et 2 ms, toute autres valeurs conduira à une erreur
0x02 -> On attends 2 data
0x05 -> C'est le cinquième servo reliée à la patte 12
0x03 -> Ici on passe l'angle en clair. 0 à 180°, sachant que cela rentre dans 0 à 255 d'un octet.
0x20 -> Oui par ce que 0x05 + 0x03 = 0x08 -> 00001000 en binaire, décaler vers la gauche 000100000 donc 0x20

Je pense que c'est bon. A moi de codé ça avec de belles sous-outine ou une librairie perso. J'ai un penchant pour la librairie perso mais bon...
« Last Edit: April 12, 2012, 04:06:16 am by Geeks » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Modification du protocole:

Trame à envoyer : 0x00 0x13 0x02 0x05 0x5A 0xE8

0x00 = start
0x13 = Sortie en PWM pour faire fonctionné un servo
0x02 = 2 datas
0x05 = data1 = servo N° 5
0x5A = data2 = position ° de 0 à 180. Cela rentre dans les 0 à 255 d'un octet. Ici, c'est 90°.
0xE8 = CRC

CRC en emission:
0x13 + 0x02 + 0x05 + 0x5A = 0x74
0x74 / 255 = 0
0x00 = 00000000 en binaire, décaler vers la gauche 00000000 donc 0x00

CRC en réception:
Type + Lenght + Data1 + Data2 = Somme
Somme décalé vers la gauche = CRC
CRC = CRC trame

En théorie, si une erreur survient, la comparaison devient mauvaise et une erreur est levée.
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 0
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ayant passé pas mal de temps à glané des informations, je suis arrivé à un compromis qui me va bien. Je n'ai pas repris complètement ton travail Osaka et pour cause de simplicité dans ma façon de traiter les évènements. Néanmoins je me suis inspirer de la philosophie de ton travail et des interventions sur mon sujet.

Yop yop, c'est ça l'avantage avec un tel protocole il est facilement adaptable à son besoin.  smiley-surprise
Par contre je ne suis pas certain qu'utilisé le 0 en (byte/octet) start soit des plus judicieux, celui-ci je le réserve généralement aux données du fait qu'elle soit l'une des deux valeur du système binaire (base2), 0 et 1 (LOW/HIGH, ouvert/fermé, faux/vrai, ... ), ses deux valeurs sont celles rencontrée le plus fréquemment dans une communication sous forme d'octets et manipulations de ports.  smiley-confuse
Attention le crc même dans ça version simplifié en 8bit, c'est un modulo '%' (reste de la division) et non une division qui est appliqué à la somme.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En effet, c'est bien d'adapter un protocole. Tien pour info, le lenght risque de disparaitre de mon protocole car j'utilise rarement plus de deux datas. Du coup, ça simplifierais encore la manip.

Pour la division; ah donc, là j'ai besoin d'explication. Comment récupérer le reste d'une division ?

Ok pour le 0x00 qui sera remplacé par un 0x0F, par exemple.
« Last Edit: April 12, 2012, 06:44:59 pm by Geeks » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Plop,

Afin de ne pas se dispersé, je reprends la suite du protocole.

J'en suis arrivé à l'étape de coder, maintenant que j'ai quelque-chose de correct. Pour info par rapport à ce que j'ai écrit dessus sur mon protocole, je fais une division / 256 puis un modulo afin de ne récupérer que la partie 8 bit du CRC.

A cette étape, je préférerais coder une librairie afin de la réutilisé dans mes projets.  Ceci permettant de fonctionner de façon totalement transparente entre les deux cartes dans les deux sens.

Comment réaliser une librairie ? Par quoi commencé ? Quelqu'un à une idée, sans parler du protocole au dessus ?
Logged

France
Offline Offline
Edison Member
*
Karma: 12
Posts: 1800
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Pour la division; ah donc, là j'ai besoin d'explication. Comment récupérer le reste d'une division ?
L'opérateur modulo %
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok  pour le modulo smiley-wink

Bon, et bien, je m'attaque à ma librairie smiley-grin
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon, j'avance lentement mais surement.

Pour l'heure j'essaie de faire en sorte que ma librairie me fournisse 0xFFFF quand je lui demande d'initialisé une connexion. Avant de coder le programme principal, je test ma lib. Normal, je préfère de loin que ce soit bon.

J'ai toutefois un souci de compilation avec ce qui suit.
Quote
In file included from sketch_apr13a.cpp:1:
/home/geeks/Install/arduino-1.0/libraries/GSerieLib/GSerieLib.h:12: erreur: ‘Byte’ does not name a type
J'ai donc un problème dans mon .h  smiley-sad-blue

Mon .h contient ceci pour le moment:
Code:
#if defined(ARDUINO) && ARDUINO >= 100 
#include "Arduino.h" 
#else 
#include "WProgram.h" 
#endif


//Classe
class Gsl {
public:
Gsl(); //Constructeur
Byte StartBit(); //Start bit
private:
};

Et mon .cpp cela :
Code:
/**
 *
 *
 * */

#include "Arduino.h"
#include "GSerieLib.h"

//Constructeur
Gsl::Gsl() {
}

//Start Bit
Byte Gsl::StartBit() {

return "0xFFFF";
}

Enfin mon programme est vide et c'est normal. Ceci afin de tester la librairie sans son code, pour le moment  smiley
Code:
#include <GSerieLib.h>

void setup() {
}

void loop() {
}

Est-ce que j'ai bien compris ou je ne peux pas retourné de Byte ? Ou bien est-ce que je ne dois pas mettre le 0x devant ?
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Plop,

Petite modification dans ma classe.

Je vais mettre deux méthodes à exécutions. La première sera mylib.envoie(type, lenght, data1data2data3...) et la seconde sera déclenché depuis l’interruption sur RX à savoir mylib.recep() qui aura pour but de charger des variables qui seront mise à jour dans le loop.

Ce qui donnera:

setup
- initialiser les pins
- mettre dans les variables les données de base

loop
- sortie 1 -> var 1
- sortie 2 -> var 2

Je ne sait pas si c'est faisable. De toute façon par mesure de sécurité, en cas de problème, on reprends les valeurs par défauts et on lève une exception.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 101
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Plop,

Je compte me remettre au travail sur la conversation entre carte  smiley-mr-green

Je me heurte à un souci bien simple.
Pour être sûr que ma trame de départ soit complète, je compte envoyer 0xAAFF en start bit, puis finir avec 0xFFFF. Je pense que ce n'est pas faisable en l'état vue que on est censé n'envoyer qu'un seul bit. Donc ceci m’amène à pensé qu'il doit y avoir une solution plus abordable avec les composants interne tel que:
Code:
void loop() {

    // Vérifier si des caractères sont reçu sur le port série
    if (Serial.available() > 0) {
     
       // Variable temporaire pour copier le byte
       byte byteRecu;
       // Lire un Byte
       byteRecu = Serial.read();
     
       // Si c'est le start bit
           // Traiter le type
           // Traiter le lenght
           // Boucler tant que c'est < à lenght
               //Traiter data
               ++
           // En fonction d'un tableau de data, affecter à la commande en fonction du type
           // Traiter CRC ou Stop bit
    }
     
     // Retour au programme d'écriture des données
  }

Bon, en même temps, ce n'est que le principe... J'ai pas vraiment eu le temps de tester.
Logged

Pages: 1 2 3 [4]   Go Up
Print
 
Jump to: