... rgl
Télémétrie
appliquée aux Modèles RC
(c) Rg.LEGAT
|
SOMMAIRE:
01 - Introduction - Présentation - Généralités
02 - Transmission de la tension d'une batterie par HC-12 (433Mhz)B
03 - Transmission d'une température par HC-12 (433Mhz) et DS18B20
04 - Contrôle des données transmises par CRC (Cyclic Redundancy Check)
05 - x
Introduction - Présentation - Généralités |
La Télémétrie consiste à transmettre des données propres au modèle radio-commandé vers le pilote.
Il peut s'agir de l'état de charge d'une ou plusieurs batteries, de la position GPS, de l'altitude, de la température d'un moteur ou d'un accu, d'une alerte niveau d'eau, ..., ..., ...
Le dispositif sera constitué d'un émetteur placé dans le modèle et d'un récepteur, muni d'un afficheur, placé au niveau de l'émetteur pilotant le modèle.
Nous avons vu , sur ce site, quelques circuits conçus pour traiter, émettre et recevoir des données numériques (ADS1115, nRF24L01+, HC-12, ...).
Cette page reprendra donc quelques programmes utilIsant l'un ou l'autre de ces composants spécifiques.
Faisons une rapide analyse des capteurs utiles et des composants annexes nécessaires pour se lancer dans la conception de quelques modules utiles:
Estimation des besoins . Ports des MicroContrôleurs
|
La table suivante montre les différences fonctionnelles primaires entre les µC PICAXE usuels :
Standard : (800-1800 ligne de mémoire, pour chacun des emplacements distincts (jusqu'à 2)
08M2 5 E/S configurables 0-3ADC 32MHZ
14M2 11 E/S configurables 0-7 ADC 32 MHZ
18M2 16 E/S configurables 0-10 ADC 32 MHZ
20M2 16 E/S configurables 0-11 ADC 32 MHZ
Avancé : (2000-3200 lignes de mémoires, pour chaque emplacement séparé (jusqu'à 4)
20X2 18 E/S configurables 0-8 ADC 64 MHZ
28X2 22 E/S configurables 0-16 ADC 64 MHZ
40X2 33 E/S configurables 0-27 ADC 64 MHZ
Tous les composants fonctionnent par défaut à 4 MHz (8 MHz pour les références X2).
Pour une utilisation à une plus grande vitesse, voir la commande 'Setfreq'. |
Transmission de la tension d'une batterie par HC-12 (433Mhz) |
' ***** Module HC-12 - 433 MHz + ADS115 *****
' *******************************************
' Nom du fichier: TX_HC12_ADS1115.bas
' Fonction: Utilisation des modules HC-12 a 433 MHz plus
' module ADS1115 pour transmettre une TENSION par RF
' Parametres HC-12: voir routine de Configuration
'
' PinOut HC-12 TX
' ---------------------------
' VCC = 1 | Vcc Antenne O|--->>>>>
' GND = 2 | Gnd |
' RXD = 3 > RXD Module HC-12 |
' TXD = 4 < TXD |
' SET = 5 | SET |
' ---------------------------
' Placer un condensateur electrolytique de 10uF 16V entre VCC et GND
' Utiliser une alimentation délivrant au moins 1A
'
' PinOut ADS1115
' ---------------------------
' 5VCC | Vcc |
' Gnd /-Battery | Gnd |
' SCL | SCL i2c |
' SDA | SDA i2c |
' GND = 0h48 | ADDR Module ADS1115 |
' Not Used | ALRT |
' +Battery > A0 |
' Not used > A1 |
' Not used > A2 |
' Not used > A3 |
' ---------------------------
'
' PinOut Picaxe 08M2
' ----------
' 5VCC | 1 8 | GND
' C.5 - S.RX > 2 7 > C.0 - S.TX (Used by Terminal)
' C.4 To RX.HC12 <--| 3 6 | C.1 - hi2c.SCL
' C.3 Not Used -->| 4 5 | C.2 - hi2c.SDA
' ----------
' Programidentification
Sertxd ("------------------------------------------------",cr,lf)
Sertxd (" TX - HC12 + ADS1115.bas",cr,lf)
Sertxd ("------------------------------------------------",cr,lf)
'[ Directives ]
#PICAXE 08M2
#sim shield
#TERMINAL 4800
'[ Directions - Connexions ]
Output C.4 'To pin3 RXD.HC-12
'------------------------------------------------------------------
' - - - DIGITAL OUTPUT PINS - - -
Symbol RxD = C.4 'Pin de connexion sur HC-12 RxD
' -----[ Constantes ]
Symbol BAUD = T4800_8 'Vitesse en Baud pour l'envoi avec uC de 4 MHz
'--------------------------------------------------------------------------
' -----[ Variables ]
Symbol Vin = w0
'Symbol Config = W1
Symbol MSBconfig = b2 'W1
Symbol LSBconfig = b3 'W1
'Symbol ADC = W2
Symbol MSBVal = b4 'W2
Symbol LSBVal = b5 'W2
Symbol Coef = b6
'------------------------------------------------------------------
'i2C Config
'--------------
Hi2csetup i2cmaster, %10010000, i2cfast_8, i2cbyte 'address with grounded ADDR_pin (0h48)
'
' Calculation Coef ADS1115 - Pas necessaire car le traitement se fera au Recepteur
'-------------------------------------------------------------------------------------
' Coef = 8 ' 4,096v_FS PGA=001
' Coef = 16 ' 2,048v_FS PGA=010 (Default)
' Coef = 32 ' 1,024v_FS PGA=011
' Coef = 64 ' 0,512v_FS PGA=100
' Coef = 128 ' 0,256v_FS PGA=101/110/111
Sertxd (" START CONFIGURATIONS",cr,lf)
Sertxd ("------------------------------------------------",cr,lf)
Pause 500
'Configuration of the HC-12
'---------------------------------------------
'Gosub Config ' Pas possible avec le 08M2 car il faut disposer d'une sortie supplementaire pour gerer la broche SET du HC-12
'Configuration of the CONFIG Register ADS1115
'------------------------------------------------
Hi2cout (%00000001,%11000010,%10000011) 'Write Pointer Reg, MSB, LSB (Configure AIN0)
'Hi2cout (%00000001,%10000100,%10000011) 'Write Pointer Reg, MSB, LSB (Configure AIN0)
' PGA = bits[11:9] =001 --> (4,096V Full Scale) Coef W1=8
' MUX = bits[14:12]=100 --> (AINP = AIN0 and AINN = GND)
' MODE = bit[8]=0 --> (Continuous)
Gosub Read_CFG 'Read Reg.CONFIG ADS1115 (Facultative)
' -----[ Initialisation ]
Serout RxD,BAUD,("UUUUUUUUUU") 'Synchro HC-12
Pause 50
'Programme Principal
'*******************
DO 'Debut de boucle infinie
Hi2cout (%00000000) ''Set Pointer to Reg.Conversion
Pause 500
Hi2cin (MSBVal,LSBVal) 'Read MSB,LSB
*** La conversion se fera à la reception ***
Sertxd ("---> MSB = ",#b4," LSB = ",#b5,cr,lf) ' ," MilliVolts = ",#W0,cr,lf)
Serout RxD,BAUD,("@",MSBval,LSBval) 'Emission RF
LOOP 'Boucle infinie
'============================================================
' Sub ROUTINES
'============================================================
Config: ' Write config HC-12
' Default parameters=
' Alimentation: 5V
' Puissance: 20dBm (100mW)
' Mode: FU3 (16mA)
' Canal: C001
' Baud:9600, Parite:Aucune, Data Bits:8, Stop Bits:1
' Ne sera possible qu'avec un µC disposant d'une pin output supplementaire pour gerer la broche SET du HC-12 !
' Donc, à titre didactique
Low Pin_Set
Serout RxD,BAUD,("AT+xxx",13) 'Parametre de Config au choix sur RxD
High Pin_Set
return
'------------------------------------------------------------------
Read_CFG:' Read config ADS1115
Hi2cin (MSBconfig,LSBconfig) ' Read Register CONFIG
Pause 500
Sertxd (" MSBcfg = ",#b2," LSBcfg = ",#b3,cr,lf,cr,lf)
SerTxd("MSBcfg = %", #bit23,"-", #bit22, #bit21, #bit20,"-", #bit19, #bit18, #bit17,"-", #bit16," " )
SerTxd("LSBcfg = %", #bit31, #bit30, #bit29,"-", #bit28,"-", #bit27,"-", #bit26,"-", #bit25, #bit24, cr,lf )
Sertxd (" MUX PGA MODE DR",cr,lf)
Sertxd ("------------------------------------------------",cr,lf)
Pause 2000
Return
END 'Fin du programme
'--- FIN ---------------------------------------------------------
' ***** Module HC-12 - 433 MHz + Serial OLED *****
' *************************************************
' Nom du fichier: RX_HC12_OLED.bas
' Fonction: Utilisation des modules HC-12 /433 MHz
' Affichage du VOLTAGE lu par un module ADS1115 en envoye par RF.
' Parametres HC-12: voir routine de Configuration
'
' PinOut HC-12 RX
' ---------------------------
' VCC = 1 | Vcc Antenne O| <<<<<---
' GND = 2 | Gnd |
' RXD = 3 > RXD Module HC-12 |
' TXD = 4 < TXD |
' SET = 5 | SET |
' ---------------------------
' Placer un condensateur electrolytique de 10uF 16V entre VCC et GND
' Utiliser une alimentation délivrant au moins 1A
'
' PinOut Picaxe 08M2
' ----------
' 5VCC | 1 8 | GND
' C.5 - S.RX > 2 7 > C.0 - S.TX (Used by Terminal)
' C.4 To OLED <--| 3 6 | C.1 - hi2c.SCL
' C.3 From TX.HC12 -->| 4 5 | C.2 - hi2c.SDA
' ----------
'
' Afficheur OLED 2 X 16 plus interface Picaxe serial AXE133
'[ Program identification ]
Sertxd ("------------------------------------------------",cr,lf)
Sertxd (" RX - HC12 VOLTAGE OLED.bas",cr,lf)
Sertxd ("------------------------------------------------",cr,lf)
'[ Directives ]
#PICAXE 08M2
#sim shield 'directive allows the on screen layout to match the pinout of the shield.
#TERMINAL 4800
'[ Directions - Connexions ]
Output C.4 'Connecte a la pinIN du module serie de l'Oled
Input C.3 'Connecte a la pin4.TXD du HC-12
'------------------------------------------------------------------
' - - - DIGITAL INPUT PINS - - -
Symbol TxD = C.3 'Pin de connexion sur HC-12 TxD
Symbol RxD = C.xxx 'Pin de connexion sur HC-12 RxD pour config (mais pas possible avec 08M2 sortant sur la console!
' - - - DIGITAL OUTPUT PINS - - -
Symbol OLED = C.4 'Pin de connexion de l'Oled
' -----[ Constantes ]
Symbol BAUD = T4800_8 'Vitesse en Baud pour la reception sur un uC a 4 MHZ
'-------------------------------------------------------------------------------
'[ Variables ]
Symbol Vin = w0
'Symbol CONFIG = W1
Symbol MSBconfig = b2 'W1
Symbol LSBconfig = b3 'W1
'Symbol VAL = W2
Symbol MSBVal = b4 'W2
Symbol LSBVal = b5 'W2
Symbol Coef = b6 'W3
Symbol Volt = w4
Symbol CentiVolt = w5
'Calculation Coef
'---------------------
Coef = 8 ' 4,096v_FS PGA=001
' Coef = 16 ' 2,048v_FS PGA=010 (Default)
' Coef = 32 ' 1,024v_FS PGA=011
' Coef = 64 ' 0,512v_FS PGA=100
' Coef = 128 ' 0,256v_FS PGA=101/110/111
' [ Initialisation ]
'Configuration of the HC-12
'---------------------------------------------
'Gosub Config ' Pas possible avec le 08M2 car il faut disposer de sorties supplementaires pour gerer les broches SET et RxD du HC-12
Serout OLED, N2400,(254,1) 'Commande d'effacement de l'Oled
Pause 30 'Pause apres la cde
'------------------------------------------------------------------
'***************************
'*** Programme Principal ***
'***************************
DO
Serin TxD, BAUD, ("@"),MSBVal,LSBVal 'Qualifier + Reception des datas
Gosub Convert
sertxd ("Volt = ",#Volt,".",#CentiVolt,cr,lf)
Gosub Affi_Oled
Pause 50
LOOP 'Boucle infinie
END 'Fin du programme
'------------------------------------------------------------------
'*********************
'*** Sous Routines ***
'*********************
Config: ' Write config HC-12
' Default parameters=
' Alimentation: 5V
' Puissance: 20dBm (100mW)
' Mode: FU3 (16mA)
' Canal: C001
' Baud:9600, Parite:Aucune, Data Bits:8, Stop Bits:1
'
' Ne sera possible qu'avec un µC disposant de pins output supplementaires pour gerer les broches SET et RxD du HC-12 !
' Donc, à titre didactique
Low Pin_Set
Serout RxD,BAUD,("AT+xxx",13) 'Parametre de Config au choix sur RxD
High Pin_Set
return
'------------------------------------------------------------------
Convert:
Vin = MSBVal * 256 'Shift MSB <<8
Vin = Vin + LSBVal 'MSBVal + LSBVal
Vin = Vin/Coef 'Result in milliVolt !
Vin = Vin / 10 'on supprime les milliemes de volt
Volt = Vin /100 'on recupere les volts
CentiVolt = Vin // 100 'Modulo pour les centiemes de volt
' Volt = Vin>>2
' SerTxd("-",#Volt,".",#CentiVolt,cr,lf)
Return
'-----------------------------------------------------------------
Affi_Oled:
;Serout OLED, N2400,(254,1) 'Commande d'effacement de l'Oled
;Pause 30 'Pause apres la cde
Serout OLED, N2400,(254,192) 'Lin.2/Col.1
' Serout OLED, N2400,("Volt = ",#b11,".",#b12) '
Serout OLED, N2400,("Volt = ",#Volt,".",#CentiVolt) '
return
'------------------------------------------------------------------
Transmission d'une température par HC-12 (433Mhz) |
x
Côté émission
On va ici créer un CRC constitué de 2 bytes.
Ils seront placés et transmis dans la chaîne des Bytes de Datas.
Principe:
Avant d'envoyer les données série, chaque octet est placé, tour à tour, dans la variable Data_Byte et un appel à CrcAdd est effectué.
Lorsque tous les octets ont ainsi été traités on obteint le CRC.
Les données sont alors envoyées et le CRC, composé de deux octets, est également joint et transmis à la fin, ou, n'importe où dans le message.
Lorsque le message est reçu, la même procédure est appliquée : chaque octet (sauf ceux du CRC reçu), dans le même ordre, sont placés dans la variable Data_Byte et un appel à CrcAdd est effectué.
Le CRC calculé est comparé au CRC reçu: s'ils sont identiques, on peut considérer que les données série reçues sont correctes.
S'ils diffèrent, le message reçu est corrompu.
Programme TEST TX
'-------------------------------------------------------
' TEST CRC TX 00 (A tester sur simulateur Picaxe)
'-------------------------------------------------------
' [ Directives ]
#PICAXE 28X2
#simspeed 50 'vitesse d'execution du simulateur
' [ Connexions - Directions ]
Output C.1 'connecte a la pin3 (RXD) du HC-12
Input C.2 'connecte a la pin2 (DQ) du BS18B20 (1Wire)
' [ Variables ]
Symbol Data_Byte = b0 'Byte de traitement [b0]; [b1] non utilise
Symbol CRC = w1 '[b2,b3]
symbol Lsb_Crc = b2
symbol Msb_Crc = b3
Symbol K = w2 '[b4,b5] 'Word de travail
Symbol POLYNOME = W3 '[b6,b7] $A001 = 40961 = 1010 0000 0000 0001
'other possible value : $8408 = 33800 = 1000 0100 0000 1001
Symbol DEGRES = w4 '[b8,b9]
symbol Lsb_Degres = b8
symbol Msb_Degres = b9
Symbol i = b20 'Variable de travail b6
Symbol BAUD = T9600_8 'Vitesse en Baud pour l'envoi avec uC de 8 MHz
Symbol BS18B20 = C.2 'Pin de connexion de la sonde de temperature
Symbol TXpin = C.1 'Pin de connexion sur HC-12 RxD
' [ Initialisation ]
Serout TXpin,BAUD,("UUUUUUUUUU") 'Synchro TX HC-12
Pause 50
'===== Programme PRINCIPAL =============================================
DO
Readtemp BS18B20, DEGRES 'stockee dans 2 bytes [b8,b9]
Let DEGRES = 31345 ' Forcage pour la simulation
Sertxd (" DEGRES= ",#DEGRES)
'Mettre ici d'eventuelles autres mesures d'autres capteurs a stocker dans d'autres Bytes
Let CRC = $FFFF
Let POLYNOME = $A001
Gosub Crea_Crc
Sertxd (" CRC = ",#CRC,cr,lf)
Serout TXpin,BAUD,("@",Msb_Degres, Lsb_Degres, Msb_Crc, Lsb_Crc)
LOOP
END
'******************************
' *** SUB ROUTINES ***
'******************************
Crea_Crc:
'----------------------------
' Methode (Byte par Byte)
'----------------------------
' Data_Byte=[first_byte]
' Gosub CrcAdd
' Data_Byte=[second_byte]
' Gosub CrcAdd
' ...
' Serout serout_pin, serout_speed, (first_byte,second_byte,MSB_CRC, LSB_CRC)
Let Data_Byte = Msb_Degres 'b8
Gosub CrcAdd
Let Data_Byte = Lsb_Degres 'b9
Gosub CrcAdd
return
'--------------------------------------------------------------------
CrcAdd:
sertxd(cr,lf)
For i = 0 to 7 'Operation bit a bit
sertxd (" DataByte= ",#Data_Byte, cr,lf)
Sertxd (" i= ",#i)
K = Data_Byte ^ CRC & 1 '^ = XOR, & = AND
Sertxd (" K= ",#K)
if K = 0 then CrcAdd1
k = POLYNOME
CrcAdd1:
CRC = CRC / 2 ^ K
Data_Byte = Data_Byte / 2
sertxd (" DataByte= ",#Data_Byte)
sertxd (" CRC= ",#CRC,cr,lf)
Next i
return
'==== END OF PRG ======================================================
Résultat Console: CRC final = 62690
Côté réception
1. On récupère les bytes datas et les deux bytes du CRC, émis par le TX.
2. On place le CRC reçu dans une variable Word. (CRC_Recu)
3. On calcule le nouveau CRC, avec les datas reçues (sans le CRC reçu), de la même manière et dans le même ordre que dans la routine d'émission. (CRC_Control)
4. On compare alors le CRC_Recu avec le CRC recalculé (CRC_Control).
S'ils sont identiques, OK, on traite normalement les datas reçues, sinon, on affiche un message d'erreur et on relance une nouvelle lecture de la prochaine salve de Datas + CRC.
xxx