Pages: [1]   Go Down
Author Topic: liaison radio 2,4GHz faible puissance  (Read 927 times)
0 Members and 1 Guest are viewing this topic.
Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,

J'aimerais faire une liaison radio basée sur deux modules nRF24L01 .

D'après ce que j'ai pu voir ces modules permettent de communiquer avec le protocole SPI.

Sur cette page Wiki, le protocole est décrit, il est spécifié que l'esclave ne valide pas la réception d'informations, ne serait-il pas possible de faire une sorte de CRC avec un renvoi ACK ou NACK ?

Autrement avec le SPI qu'elle est la nature des informations que l'on fait passer, quelles formes de codage ?
 Sachant que l'émetteur et le récepteur seront couplés à un Mega168, est ce important d'avoir un codage spécifique ou peut on imaginer envoyer par exemple du décimal et lire en réception du décimal ?


De plus si l'on veut reprogrammer le µc il faut prévoir de brancher les pins SPI différements pour cette opération.

Merci pour vos réponses.
« Last Edit: February 16, 2009, 01:37:42 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le SPI sert à communiquer entre ton µC et le module, pas entre les deux cartes à µC, je ne sais pas si c'était clair de ton côté.

Il y a un auto ack directement ainsi qu'un CRC entre les deux modules, pas la peine de le faire toi même.

Donc pour écrire, pour lire et bien sûr pour sélectionner le mode, tu utilises une liaison SPI toute simple.

Je n'ai jamais entendu dire qu'il fallait déconnecter les périphériques SPI quand tu utilisais l'ISP de reprogrammation.
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, c'est clair pour la communication entre le module et le Mcu, les modules doivent avoir un protocole qui leurs est propre et dont je ne devrais pas avoir à me soucier.

Ma question est assez mal tournée ...  smiley-grin

Je ne sais plus ou j'ai lu qu'il fallait prévoir un switch sur les pins SPI, mais il me semble que lors de mes essais de programmation si quelque chose était branché sur ces pins cela ne fonctionnait pas (je me trompe peut-être  smiley-wink )

Dans le Playground j'ai trouvé plein d'info sur la communication SPI, je vais regarder ça plus en détails.
« Last Edit: February 16, 2009, 03:35:15 pm by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon ... d'après ce que j'ai compris (si c'est faux, il faut me le dire  smiley ), les informations qui passent sont en binaire.

il y a quatre lignes qui servent à la communication entre le ou les modules, dont un est le maître, ces lignes sont :

    * Master In Slave Out (MISO) - Ligne d'envoi des données de l'esclave au maître.
    * Master Out Slave In (MOSI) - Ligne d'envoi des données du maître à l'esclave.
    * Serial Clock (SCK) - Signal d'horloge donnés par le maître, synchronisant le passage des données.
    * Slave Select pin - ligne permettant au maître de choisir l'esclave avec lequel il veut communiquer.

Ce n'est pas une nécessité de passer par la librairie "SPI", dans ce cas il faut définir les pin de communication comme suis (ou de façon similaire) :

Code:
#define DATA_OUT 11            //MOSI
#define DATA_IN 12                        //MISO
#define Signal_d_Horloge_Spi  13    //sck
#define SLAVESELECT 10                //ss

Le signal d'horloge peut être utilisé de trois façon numéroté de 0 a 3:

* front montant
* front haut
* front descendant
(0 a 3 ça fait 4 position et je n'ai pas trouvé la quatrième  :-? )


Ensuite il faut paramétrer le registre de contrôle SPI (SPCR) qui comporte 8 bits.

SPCR
|   7    |  6    |  5       |    4    |    3    |  2     |    1    |   0    |
| SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |

SPIE - Permet d'interrompre le SPI lorsque  1
SPE - Permet le SPI lorsque 1
DORD - envoie de données moins importantes A partir du moment où Bit est a 1, plus importantes si le Bit est a 0.
MSTR - Définit le maître avec 1, mode esclave avec 0.
CPOL - (pas compris)
ACSP - Les données passent sur le front descendant de l'horloge de données lors de 1, sur le front montant si il est mis à 0.
SPR1 et SPR0 - Définit la vitesse de SPI, 00 est le plus rapide (4MHz) 11 est le plus lent (250KHz).

Pour l'instant j'en suis là... je n'ai pas encore compris comment coder ça, mais je continue de chercher  smiley
« Last Edit: February 18, 2009, 06:15:01 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Jusqu'à preuve du contraire, toutes les informations qui passent dans un microcontrôleur sont en binaires, 0 et 1. Même l'utilisation d'entiers ou de caractères dans le code Arduino n'est ni plus ni moins que du binaire mis bout à bout et lu par paquet de 8.

Ce n'est pas une nécessité de passer par la librairie SPI, mais elle ne fait ni plus ni moins que que s'occuper des quatre lignes et du registre SPCR (SPI Control Register, au pif).

Concernant les interruptions, je doute que tu puisses "interrompre le SPI". Les interruptions sont des petits drapeaux qui sont levés par le hardware pour avertir le software qu'il y a un événement qui vient de se produire. Par exemple, on parle "d'interruption externe" quand un événement (niveau bas, front montant, front descendant, tout front) se produit sur une patte particulière (que 2 sont en interruptions externes sur l'ATmega168). Donc dans ton cas, ce bit du registre de contrôle du hardware SPI signifie qu'un caractère vient d'arriver (par exemple, par analogie avec ce qui se passe sur l'UART, la liaison série).

"je n'ai pas encore compris comment coder ça" : en faisant appel à une librairie SPI, pour sûr smiley

Et je peux déjà te donner cette information : c'est ton µC qui sera le maitre et ton modem radio qui sera l'esclave.
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Et je peux déjà te donner cette information : c'est ton µC qui sera le maitre et ton modem radio qui sera l'esclave.

ça  j'avais déjà compris...  ;D

Pour le reste c'est ce que j'ai trouvé sur le playground et que j'ai essayé de traduire et de comprendre par la même occasion.

Merci pour ces quelques précisions qui sont toujours utiles à souligner.
« Last Edit: February 18, 2009, 12:07:41 pm by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai été sur cette page pour clarifier deux trois trucs qui n'était pas clair pour moi :

Un octet sera toujours un octet que ce soit en binaire, décimal, hexadécimal ou autre.

Ce que je ne comprenais pas c'est lorsque l'on parlait d'octet et qu'il était représenté comme ça : 0x2a

C'est un octet de 8 bits qui représente le chiffre 42 (DEC)

Le x  entre le 0 et 2a est là pour signaler que c'est de l'hexadécimal.

Ici un convertisseur en ligne Binaire, Ternaire, Quintale, Octale, Décimale, Hexadécimale.

Donc en fait la "machine" interprètera  tout en binaire, qu'on l'écrive en Ascii, décimal hexadécimal ou autre.

C'est lors de l'envoi de l'info qu'il faut determiner ce que l'on a envoyé dans le tube afin de savoir ce que l'on va recevoir de l'autre coté du tube ... la machine, elle, enverra toujours du binaire.

Est-ce que cette fois je suis sur la bonne voie ?
« Last Edit: February 18, 2009, 01:48:12 pm by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, c'est en bonne voie.

Quelques précisions. 0x pour le hexadécimal, et 0b pour le binaire, utile pour faire des masques : 0b11101101 si je veux "éteindre" les bits 1 et 5 d'un octet, c'est plus clair que 0xED

Il faut savoir quels octets sont envoyés, mais on peut très bien parler octet hexadécimal d'un côté (Serial.print(0x42)) et entier de l'autre (Serial.read() == 42) ou même ASCII (Serial.read() == '*')

Par contre il faut faire attention si on utilise deux machines d'architecture différentes, par exemple un microcontrôleur 8 bits et un ordinateur 16 ou 32 bits, car vous pourrez très bien envoyer "42" d'un côté et recevoir "-86" de l'autre s'ils ne codent pas les entiers de la même manière. Mais ce sont des subtilités qu'Arduino ne connait pas, car ils ont eu la bonne idée (ou mauvaise, à cause des perfs) de coder les entiers sur 16 bits contrairement à ce qu'on fait d'habitude sur un microcontrôleurs (AVRgcc est en 8 bits non signés).
Logged

Pages: [1]   Go Up
Jump to: