Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
transmission_433mhz [2018/04/30 08:55] 88.164.131.165 [Module Arduino low cost] |
transmission_433mhz [2018/05/01 16:21] (Version actuelle) 88.164.131.165 [Si4432] |
||
---|---|---|---|
Ligne 8: | Ligne 8: | ||
{{::si4432_.jpg?200|}} | {{::si4432_.jpg?200|}} | ||
+ | ==== Schema Arduino ==== | ||
+ | {{::si4432_arduino.jpg?direct}} | ||
+ | |||
+ | [[https://www.amazon.fr/gp/product/B077P28RVW/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1|Carte Arduino Uno 3.3V]] | ||
==== Introduction ==== | ==== Introduction ==== | ||
Il s'agit d'un module RF paramétrable qui peut être utilisé pour différent types de protocoles de communication. | Il s'agit d'un module RF paramétrable qui peut être utilisé pour différent types de protocoles de communication. | ||
Ligne 30: | Ligne 34: | ||
* [[https://www.amazon.fr/gp/product/B077P28RVW/|Carte Arduino 3.3V - 8Mhz]] | * [[https://www.amazon.fr/gp/product/B077P28RVW/|Carte Arduino 3.3V - 8Mhz]] | ||
+ | ===== Analyser et reproduire une trame 433Mhz ===== | ||
+ | |||
+ | ==== Outil ==== | ||
+ | J'utilise un [[http://www.nooelec.com/store/nesdr-smart.html|SDR NooElec NESDR SMArt]] qui fonctionne avec le logiciel [[https://airspy.com|SDRSharp]] - [[https://airspy.com/?ddownload=3130|Téléchargement]] | ||
+ | ==== Installation ==== | ||
+ | * Télécharger SDRSharp | ||
+ | * Lancer install-rtlsdr.bat | ||
+ | * Lancer Zadig.exe | ||
+ | * Dans Options : Cocher List All Devices et Décocher Ignore Hubs or composite Parents | ||
+ | * Sélectionner RTL2838UHIR vérifier USB ID 0BDA 2838 | ||
+ | * Sélectionner WinUSB | ||
+ | * Cliquer sur Reinstall Driver | ||
+ | |||
+ | {{::zadigrtl2838.png?400|}} | ||
+ | |||
+ | ==== Utilisation ==== | ||
+ | |||
+ | * Démarrer SDRSharp | ||
+ | * Dans source RTL-SDR (USB) | ||
+ | * Dans configuration, sélectionner Generique RTL2832U OEM | ||
+ | |||
+ | {{::configsdrsharp.png?600}} | ||
+ | |||
+ | * Cliquer sur le bouton play | ||
+ | |||
+ | Exemple d'appui sur le bouton de la télécommande de mon portail | ||
+ | |||
+ | {{::sdrsharp_433.jpg?direct}} | ||
+ | |||
+ | * Enregistrement des données transmises par la télécommande | ||
+ | |||
+ | Dans le menu Recording cliquer sur le bouton record puis appuyer sur le bouton de votre télécommande. | ||
+ | SDRSharp | ||
+ | |||
+ | {{:sdrsharprecording.png?200|}} | ||
+ | |||
+ | SDRSharp va créer un fichier audio dans son répertoire : | ||
+ | |||
+ | {{::sdrsharp_record_file.png?direct}} | ||
+ | |||
+ | Il est possible d'ouvrir ce fichier avec [[https://www.audacityteam.org/|Audacity]] ou [[https://fr.wavosaur.com/|Wavosaur]] que je préfère et qui permet de facilement mesurer les temps des différents états de la trame. | ||
+ | |||
+ | * Ouvrir le fichier avec Wavosaur | ||
+ | |||
+ | Trames reçues : | ||
+ | {{::wavosaur_trames.png?direct|}} | ||
+ | |||
+ | Détail d'une trame : | ||
+ | {{::wavosaur_trame.png?direct|}} | ||
+ | |||
+ | Décodage d'une trame OOK : | ||
+ | {{::wavosaur_trame_binaire.png?direct|}} | ||
+ | |||
+ | Mesure des temps : | ||
+ | |||
+ | Sélectionner la partie de trame à mesurer puis faire un clic droit et propriétés. | ||
+ | Wavosaur indique que la fréquence échantillonnage est de 2 400 000 Hz et que 3253 échantillons sont sélectionnés. La période est donc de 1/2400000*3253 = 1.355ms | ||
+ | |||
+ | {{::wavosaur_mesure_temps.png?direct|}} | ||
+ | |||
+ | ===== Reproduction du code ===== | ||
+ | |||
+ | Une fois que le code lu, vous pouvez utiliser le code ci dessous pour le revoyer facilement vers un transmetteur 433Mhz. | ||
+ | |||
+ | Indiquer les temps en micro seconde à l'état haut et l'état bas quand un bit est à '1' ou '0' | ||
+ | <code csharp> | ||
+ | unsigned int TimeHighLevelHigh = 1088; | ||
+ | unsigned int TimeLowLevelHigh = 272; | ||
+ | unsigned int TimeHighLevelLow = 408; | ||
+ | unsigned int TimeLowLevelLow = 952; | ||
+ | </code> | ||
+ | |||
+ | <code csharp |main.ino> | ||
+ | #include "RfManager.h" | ||
+ | |||
+ | RfManager rfManager = RfManager(); | ||
+ | |||
+ | unsigned char code[] = { 1,0,1,1,1,1,1,0,1,0,0,1,1,1,0,1,1,0,1,0,0,0,1,0,0}; //Code bouton | ||
+ | |||
+ | void setup() { | ||
+ | |||
+ | rfManager.setTransmitPin(4); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | |||
+ | if (digitalRead(6) == 0) | ||
+ | { | ||
+ | rfManager.send(code, sizeof(code)); | ||
+ | //Attend 10 ms | ||
+ | delay(10); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | <code csharp |RfManager.cpp> | ||
+ | #include "RfManager.h" | ||
+ | |||
+ | unsigned char TransmitPin = 0; | ||
+ | |||
+ | unsigned int TimeHighLevelHigh = 1088; | ||
+ | unsigned int TimeLowLevelHigh = 272; | ||
+ | unsigned int TimeHighLevelLow = 408; | ||
+ | unsigned int TimeLowLevelLow = 952; | ||
+ | |||
+ | RfManager::RfManager() { | ||
+ | |||
+ | } | ||
+ | |||
+ | void RfManager::send(unsigned char* code, unsigned int length) | ||
+ | { | ||
+ | for (int i = 0; i <length; i++) { | ||
+ | if (code[i] == 1) | ||
+ | transmit(1); | ||
+ | else | ||
+ | transmit(0); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void RfManager::setTransmitPin(unsigned char pin) | ||
+ | { | ||
+ | TransmitPin = pin; | ||
+ | pinMode(TransmitPin, OUTPUT); | ||
+ | } | ||
+ | |||
+ | void RfManager::transmit(unsigned char bit) { | ||
+ | |||
+ | if (bit == 1) | ||
+ | { | ||
+ | digitalWrite(TransmitPin, 1); | ||
+ | delayMicroseconds(TimeHighLevelHigh); | ||
+ | digitalWrite(TransmitPin, 0); | ||
+ | delayMicroseconds(TimeLowLevelHigh); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | digitalWrite(TransmitPin, 1); | ||
+ | delayMicroseconds(TimeHighLevelLow); | ||
+ | digitalWrite(TransmitPin, 0); | ||
+ | delayMicroseconds(TimeLowLevelLow); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | <code csharp |RfManager.h> | ||
+ | #ifndef _RfManager_h | ||
+ | #define _RfManager_h | ||
+ | |||
+ | #if defined(ARDUINO) && ARDUINO >= 100 | ||
+ | #include "Arduino.h" | ||
+ | #endif | ||
+ | |||
+ | #include <stdint.h> | ||
+ | |||
+ | class RfManager { | ||
+ | |||
+ | public: | ||
+ | RfManager(); | ||
+ | void send(unsigned char* code, unsigned int length); | ||
+ | void setTransmitPin(unsigned char pin); | ||
+ | |||
+ | private: | ||
+ | void transmit(unsigned char bit); | ||
+ | }; | ||
+ | |||
+ | #endif | ||
+ | </code> | ||
+ | |||
+ | Résultat sur la sortie de l'Arduino : | ||
+ | {{::capture2.png?direct|}} | ||