a12ed64b
rcavalie
recepteur ok
|
1
|
////////////////////////////////////////////////////////////////////////////////
|
8c2393cd
rcavalie
travail reception...
|
2
3
4
5
6
|
/*EMETTEUR LoRa
par : Robin Cavalieri
IMA5SC
PFE 2018 */
////////////////////////////////////////////////////////////////////////////////
|
a12ed64b
rcavalie
recepteur ok
|
7
8
|
//Headers
#include "mbed.h"
|
7e1ad503
rcavalie
fichiers départ +...
|
9
10
11
|
#include "main.h"
#include "sx1276-hal.h"
#include "debug.h"
|
a12ed64b
rcavalie
recepteur ok
|
12
|
////////////////////////////////////////////////////////////////////////////////
|
f766505c
rcavalie
création d'une tr...
|
13
|
#define DEBUG_MESSAGE 0
|
a12ed64b
rcavalie
recepteur ok
|
14
15
|
////////////////////////////////////////////////////////////////////////////////
//Modulation LoRa active
|
7e1ad503
rcavalie
fichiers départ +...
|
16
17
|
#define USE_MODEM_LORA 1
#define USE_MODEM_FSK !USE_MODEM_LORA
|
a12ed64b
rcavalie
recepteur ok
|
18
19
20
21
22
23
24
25
26
|
//Paramètres
#define RF_FREQUENCY 868000000 //Hz : Fréquence de travail pour UE
#define TX_OUTPUT_POWER 14 //dBm : puissance de sortie du signal
#define LORA_BANDWIDTH 1 // 0:125 kHz de BP
#define LORA_SPREADING_FACTOR 10 // [SF7..SF12] Portée du débit. grande portée inutile
#define LORA_CODINGRATE 1
#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
#define LORA_SYMBOL_TIMEOUT 5 // Symbols
#define LORA_FIX_LENGTH_PAYLOAD_ON false
|
78cb1342
rcavalie
transmission rece...
|
27
|
#define LORA_FHSS_ENABLED false //true initial
|
a12ed64b
rcavalie
recepteur ok
|
28
29
30
31
32
|
#define LORA_NB_SYMB_HOP 4
#define LORA_IQ_INVERSION_ON false
#define LORA_CRC_ENABLED true
#define RX_TIMEOUT_VALUE 3500 // in ms
#define BUFFER_SIZE 32 // Define the payload size here
|
0ae07db2
rcavalie
emetteur ok
|
33
|
#define TRAME_SIZE 13
|
a12ed64b
rcavalie
recepteur ok
|
34
35
36
37
|
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//Variables globales
|
7e1ad503
rcavalie
fichiers départ +...
|
38
39
40
41
|
typedef enum
{
LOWPOWER = 0,
IDLE,
|
7e1ad503
rcavalie
fichiers départ +...
|
42
43
|
TX,
TX_TIMEOUT,
|
7e1ad503
rcavalie
fichiers départ +...
|
44
45
46
47
48
|
CAD,
CAD_DONE
}AppStates_t;
volatile AppStates_t State = LOWPOWER;
|
7e1ad503
rcavalie
fichiers départ +...
|
49
|
static RadioEvents_t RadioEvents;
|
7e1ad503
rcavalie
fichiers départ +...
|
50
|
SX1276MB1xAS Radio( NULL );
|
7e1ad503
rcavalie
fichiers départ +...
|
51
52
|
uint16_t BufferSize = BUFFER_SIZE;
uint8_t Buffer[BUFFER_SIZE];
|
7e1ad503
rcavalie
fichiers départ +...
|
53
54
|
int16_t RssiValue = 0.0;
int8_t SnrValue = 0.0;
|
0ae07db2
rcavalie
emetteur ok
|
55
|
uint8_t testMsg[TRAME_SIZE];
|
f766505c
rcavalie
création d'une tr...
|
56
57
58
|
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
|
b0846b68
rcavalie
communication en ...
|
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
//Fonctions utiles
//Debug pour savoir si le message a été transmis
void OnTxDone( void )
{
Radio.SetChannel( HoppingFrequencies[0] );
Radio.Sleep( );
State = TX;
debug_if( DEBUG_MESSAGE, "\nEnvoye \n\r" );
}
//Time out de transmission. Échec de l'envoi
void OnTxTimeout( void )
{
Radio.SetChannel(HoppingFrequencies[0]);
Radio.Sleep( );
State = TX_TIMEOUT;
debug_if( DEBUG_MESSAGE, "Echec de l'envoi \n\r");
}
//Modification du canal d'emission
void OnFhssChangeChannel( uint8_t channelIndex )
{
Radio.SetChannel(HoppingFrequencies[channelIndex]);
debug_if(DEBUG_MESSAGE, "F%d-", channelIndex);
}
//fonction permettant de convertir int en uint8_t (ASCII)
uint8_t RandAscii(int nb)
{
int return_var;
if (nb == 0) {
return_var = 0x30;
}
else if (nb == 1) {
return_var = 0x31;
}
else if (nb == 2) {
return_var = 0x32;
}
else if (nb == 3) {
return_var = 0x33;
}
else if (nb == 4) {
return_var = 0x34;
}
else if (nb == 5) {
return_var = 0x35;
}
else if (nb == 6) {
return_var = 0x36;
}
else if (nb == 7) {
return_var = 0x37;
}
else if (nb == 8) {
return_var = 0x38;
}
else if (nb == 9) {
return_var = 0x39;
}
return return_var;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
|
0ae07db2
rcavalie
emetteur ok
|
126
127
128
129
|
void TrameCreation()
{
//Création d'une trame
/*
|
b0846b68
rcavalie
communication en ...
|
130
131
132
|
[1...6] : ID de l'emetteur
[7...11] : ID du recepteur cible
[12...13] : Température communiquée ici 20 pour l'exemple
|
0ae07db2
rcavalie
emetteur ok
|
133
|
*/
|
b0846b68
rcavalie
communication en ...
|
134
135
136
137
138
139
|
//Génération aléatoire des températures
int dizaines_i = rand()%10;
int unites_i = rand()%10;
uint8_t dizaines_c = RandAscii(dizaines_i);
uint8_t unites_c = RandAscii(unites_i);
|
0ae07db2
rcavalie
emetteur ok
|
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
//Converti en ASCII
testMsg[0] = 0x46; //emetteur F
testMsg[1] = 0x33; //emetteur 3
testMsg[2] = 0x30; //emetteur 0
testMsg[3] = 0x33; //emetteur 3
testMsg[4] = 0x52; //emetteur R
testMsg[5] = 0x45; //emetteur E
//
testMsg[6] = 0x46; //recepteur F
testMsg[7] = 0x30; //recepteur 0
testMsg[8] = 0x39; //recepteur 9
testMsg[9] = 0x31; //recepteur 1
testMsg[10] = 0x43; //recepteur C
//
|
b0846b68
rcavalie
communication en ...
|
154
155
|
testMsg[11] = dizaines_c; //temperature 2 dizaines
testMsg[12] = unites_c; //temperature 0 unités
|
a12ed64b
rcavalie
recepteur ok
|
156
157
158
159
160
161
162
163
|
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//Main emission
int main( void )
{
uint8_t i;
|
f766505c
rcavalie
création d'une tr...
|
164
|
debug("\nEmetteur SX1276 \n\n\r");
|
7e1ad503
rcavalie
fichiers départ +...
|
165
166
167
|
// Initialize Radio driver
RadioEvents.TxDone = OnTxDone;
|
7e1ad503
rcavalie
fichiers départ +...
|
168
|
RadioEvents.TxTimeout = OnTxTimeout;
|
a12ed64b
rcavalie
recepteur ok
|
169
170
|
RadioEvents.FhssChangeChannel = OnFhssChangeChannel;
Radio.Init(&RadioEvents);
|
7e1ad503
rcavalie
fichiers départ +...
|
171
|
|
a12ed64b
rcavalie
recepteur ok
|
172
173
|
//Véification de la connexion avec la carte
while(Radio.Read(REG_VERSION) == 0x00)
|
7e1ad503
rcavalie
fichiers départ +...
|
174
|
{
|
a12ed64b
rcavalie
recepteur ok
|
175
176
|
debug("Aucune radio detectee\n\r", NULL);
wait(1);
|
7e1ad503
rcavalie
fichiers départ +...
|
177
178
|
}
|
a12ed64b
rcavalie
recepteur ok
|
179
|
//Checking du matériel connecté
|
f766505c
rcavalie
création d'une tr...
|
180
181
|
debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ), "\n\r Materiel detecte : SX1276MB1LAS \n\r" );
debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ), "\n\r Materiel detecte : SX1276MB1MAS \n\r" );
|
7e1ad503
rcavalie
fichiers départ +...
|
182
|
|
a12ed64b
rcavalie
recepteur ok
|
183
184
|
//Paramétrage du canal
Radio.SetChannel( HoppingFrequencies[0] );
|
7e1ad503
rcavalie
fichiers départ +...
|
185
|
|
a12ed64b
rcavalie
recepteur ok
|
186
|
#if USE_MODEM_LORA == 1
|
7e1ad503
rcavalie
fichiers départ +...
|
187
|
|
f766505c
rcavalie
création d'une tr...
|
188
189
|
debug_if( LORA_FHSS_ENABLED, "\n\n\r LORA FHSS Mode \n\n\r" );
debug_if( !LORA_FHSS_ENABLED, "\n\n\r LORA Mode \n\n\r" );
|
7e1ad503
rcavalie
fichiers départ +...
|
190
|
|
a12ed64b
rcavalie
recepteur ok
|
191
192
193
194
195
196
197
198
199
|
//Configuration du modem transmission
Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
LORA_SPREADING_FACTOR, LORA_CODINGRATE,
LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
LORA_IQ_INVERSION_ON, 4000 );
#else
#error "Aucun modem defini"
#endif
|
7e1ad503
rcavalie
fichiers départ +...
|
200
|
|
a12ed64b
rcavalie
recepteur ok
|
201
|
debug_if( DEBUG_MESSAGE, "Procedure d'emission lancee\r\n" );
|
a12ed64b
rcavalie
recepteur ok
|
202
203
|
//Boucle d'émission infinie
while(1)
|
7e1ad503
rcavalie
fichiers départ +...
|
204
|
{
|
0ae07db2
rcavalie
emetteur ok
|
205
206
207
208
209
|
//On génère la trame
TrameCreation();
debug("\nTentative d'envoi... \r\n");
strcpy((char*)Buffer, (char*)testMsg);
for(i=TRAME_SIZE; i<BufferSize; i++)
|
a12ed64b
rcavalie
recepteur ok
|
210
|
{
|
0ae07db2
rcavalie
emetteur ok
|
211
|
Buffer[i] = i - TRAME_SIZE;
|
a12ed64b
rcavalie
recepteur ok
|
212
|
}
|
0ae07db2
rcavalie
emetteur ok
|
213
|
debug("Trame : %s\r\n",(char*)Buffer);
|
a12ed64b
rcavalie
recepteur ok
|
214
|
Radio.Send(Buffer, BufferSize);
|
0ae07db2
rcavalie
emetteur ok
|
215
|
debug("Message envoye \r\n");
|
ec8f6a65
rcavalie
enregistrement du...
|
216
|
wait_ms(1000);
|
7e1ad503
rcavalie
fichiers départ +...
|
217
218
|
}
}
|
f766505c
rcavalie
création d'une tr...
|
219
|
////////////////////////////////////////////////////////////////////////////////
|