A la découverte des modules MRF24J40MA, du protocole MWI et de mplabX de Microchip

Ayant acheter il y a quelques temps 3 modules MRF24J40MA, j'ai essayé de les mettre en œuvre sur des platines de ma conception.

Il y a quelques temps, je m'étais acheté 3 modules MRF24J40MA afin de piloter à distance diverses fonctions de mon installation domotique, et ce sans tirer de câbles supplémentaires.
Pour de multiples raisons, le projet a été abandonné. De nouveaux projets entrainant certains changement, je réfléchis a une nouvelle installation domotique plus autonome et plus complète.
Cet article est donc le premier d'une longue série (du moins je l'espère) concernant la domotique.
Concernant l'automatisation, je vous conseille de lire l'excellent site de Mr Bigonoff , qui traite parfaitement le développement à base de PIC et je vous conseille également la partie Domocan qui devrait certainement me servir de base pour ma prochaine automation.

Installation de l'environnement de travail

Installation et configuration de MPLABX

Avant de commencer à travailler, nous allons installer MPLABX, IDE que je trouve beaucoup plus agréable à utiliser que MPAB. De plus, MPLABX est disponible pour Linux, Windows et Mac.
% Après avoir téléchargé et installé MPLABX, ainsi que le ou les compilateurs associés, nous obtenons un environnement de travail très agréable à utiliser, avec l'auto complétion, accès direct au code source et pleins d'autres avantages que je vous laisse découvrir.
Attention, c'est encore une beta version.

Le seul problème que j'ai rencontré avec cette version est la non détection de mon PicKit3. En fouinant un peu sur le net, j'ai pu trouver une solution qui a résolu ce soucis. Il suffit d'éditer le fichier mplab-ide.conf qui se situe dans le sous dossier "mplab_ide\etc" du dossier d'installation.
Dans mon cas, mon OS est Windows Seven 64, et en suivant l'installation par défaut, le fichier de configuration se situe dans le dossier "C:\Program Files (x86)\Microchip\MPLABX\mplab_ide\etc".
Ouvrer le fichier de configuration avec votre éditeur de texte favori, localiser la ligne contenant jdkhome, enlever l'éventuel commentaire (#) et indiquer le chemin d'installation de Java. Dans mon cas, j'ai donc une nouvelle ligne qui contient : jdkhome="C:\Program Files (x86)\Java\jre6".
Attention, il ne faut pas indiquer le sous dossier bin dans la clé jdkhome.

Installation des "Microchip Application Libraries" : M.A.L

Microchip a l'excellente idée de nous fournir des fichiers sources de librairies, des exemples, des fichiers d'aide qui sont disponible ici.

Il suffit de télécharger et d'installer les fichiers pour avoir accès à un ensemble de code sources permettant d'utiliser rapidement les fonctionnalités des composants MMicrochip.

Configuration de notre première application MiWi

Petits rappels.

Microchip utilise toujours un fichier de configuration HardwareProfile.h pour décrire la partie physique. Ce fichier est obligatoire.
Pour un projet MiWi, il faudra également obligatoirement un fichier "ConfigApp.h" et un fichier "SystemProfile.h"

Création d'un projet et ajout des fichiers nécessaires

Je passe les détails de création d'un nouveau projet Stand Alone. Vu que je travaille sur une carte propriétaire à base de PIC18F4550, j'ai choisi ce device, puis j'ai indiqué que j'utilisé un Pickit 3 et le compilateur C18. Par défaut, l'architecture du projet proposé est celle là :
baseprojet.png
Pour suivre un peu la logique Microchip et organiser un peu les différents fichiers, j'ai rajouter les dossier virtuels (Virtual Folder) "Common", "Protocols" et "Transceiver" dans les dossiers "Header Files" et "Sources". Ce ne sont que des dossiers virtuels permettant de trier les fichiers. Aucun dossier n'est créé sur le disque dur.
J'ai délibérément choisit de copier les différents fichiers nécessaires des "Microchip Application Libraries" dans le dossier et les sous dossiers du projet. Il y a plusieurs raisons à ce choix :

  • L'IDE a un peu de mal à retrouver ces petits (auto complétion, aller à la définition d'une fonction en appuyant sur Ctrl + Clique gauche de la souris).
  • Il faut définir un ensemble de chemin d'inclusion dans le projet pour que le fichier miwi.c du M.A.L puisse connaitre le fichier ConfigApp.h de votre projet
  • J'utilise plusieurs PCs pour développer, certains sous Linux, d'autres sous Windows. Les chemins d'installations des différents composants ne sont pas forcement les mêmes.
  • J'utilise également un contrôle de source (SVN). Je peux donc travailler sur mes sources depuis n'importe quel PC, sans avoir à installer les M.A.L
  • C'est également un moyen de contrôler les mises à jours des fichiers utilisés.

J'ai donc créer un dossier "Transceivers" et "WirelessProtocols" dans le dossier du projet, tel que le montre cette copie d'écran :
arborescence.png

Copie des fichiers nécessaires.

J'ai décider de tester le Miwi, j'ai donc commencer par copier dans le dossier de base les fichiers suivant :

  • ConfigApp.h pris d'un des exemples fournis par Microchip
  • SystemProfile.h pris d'un des exemples fournis par Microchip (ce sont tous les mêmes)
  • HardwareProfile.h pris d'un des exemples fournis par Microchip et que j'ai modifié pour correspondre à mes besoins.

J'ai ensuite créer un fichier source simple, ou j'ai appeler les premières fonctions de l'API Miwi (MiApp_) et résolu les problèmes de compilation un par un en copiant les fichiers nécessaires.
Voici une copie d'écran de mon dossier de projet :
dossierproject.png
On peut remarque qu'on ne trouve que les 3 fichiers de définitions cités plus haut, ainsi que tous les fichiers sources nécessaire. Le seul fichier que j'ai écrit se nomme "MasterCommander.c".

Les fichiers de définition.

Les dossiers "WirelessProtocols" et "Transceivers" contiennent une copie des fichiers de définition fourni par Microchip. J'ai volontairement ajouté que les fichiers nécessaire.

Contenu du dossier WirelessProtocols :

wirelessprotocols.png

Contenu du dossier WirelessProtocols\Miwi :

miwi.png

Contenu du dossier "Transceivers" :

transceivers.png

Contenu du dossier "Transceivers\MRF24J40" :

mrf24j40.png

Définition des chemins d'inclusion de fichier

Suite à la question de Stéphane, je me suis rendu compte que j'avais également oublié de vous présenter les modifications des "Include Directories" pour que le programme puisse compiler.
includeMplabx.png

Schéma de le platine de test

Vu que l'environnement à l'air relativement fonctionnel, il faut maintenant s'attaquer à la conception électronique. Le schéma de base est simple. Un PIC18F4550 nous sert de "moteur". Il faut lui ajouter un quartz à 20 MHz pour continuer plus tard avec la communication USB, le module MRF24J60MA, une alimentation 3.3V, quelques capacités, des leds afin de visualiser rapidement le bon fonctionnement.
Le schéma de base est donc le suivant :
schemabase.png
La connexion est simple, on utilise le port SPI du PIC18F4550, l'interruption externe INT2 (RB1), le tout étant alimenté par un [MCP1702 |https://ww1.microchip.com/downloads/en/DeviceDoc/21983A.pdf] qui nous fournis une alimentation de 3.3V.
J'ai utilisé des plaquettes de test pour faire les premiers essais, le résultat n'est pas très esthétique, mais il fonctionne :
plaque1.JPG
Le problème, c'est que pour communiquer, il faut être 2, j'ai donc recopié le même schéma sur une autre plaque de test :
plaque2.JPG
On voit bien le PIC, ainsi que les modules de communication MRF24J40MA.

Premiers programmes et premiers tests.

Il est temps de commencer l'écriture des premières lignes de code. On commence donc par modifier le fichier ConfigApp.h pour indiquer que l'on veut utiliser le protocole Miwi et jouer le rôle de PAN, de décrire la "connectique" dans le fichier HardawareProfile.h. N'hésitez pas à envoyer un petit message pour plus d'explications sur la configuration.

Configuration des fusibles

On poursuit en décrivant la configuration des fusibles du PIC dans le fichier MasterCommander.c de la façon suivante :
#pragma config PLLDIV = 5 //Based on 20MHz oscillator
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config VREGEN = ON //USB Voltage Regulator
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
#pragma config STVREN = ON
#pragma config LVP = OFF

Configuration des interruptions, des ports, etc...

Tous ces configurations sont regroupées dans la fonction BoardInit(). void BoardInit(void)
{
// primary internal oscillator
//OSCCON = 0x7B;
WDTCONbits.SWDTEN = 0;
INTCONbits.GIEH = 1;
//On autorise les interruptions
RFIF = 0;
RFIE = 1;
INTCON2bits.INTEDG2 = 0;
CCP1CON = 0x00;
//Congiguration des ports
TRISC = TRISC & 0xB8;
TRISB = 0x00;
TRISD = 0xFC;
//Pull up
PORTEbits.RDPU = 1;
INTCON2bits.RBPU = 0;
//On valide les interruptions
INTCONbits.GIEH = 1;
}

Ces initialisations sont identiques quelque soit le programme, PAN ou End Device.
Activation du Master

DWORD channelMap = 0x00000001;
DisableIntSPI;
//Voir note de microchip, il est toujours recommandé de fermer le SPI avant de de configurer
CloseSPI();
//Ouverture du port SPI, on travaille en mode 0,0
OpenSPI(SPI_FOSC_64,MODE_00,SMPMID);
MiApp_ProtocolInit(FALSE);
//On définit un port par défaut
MiApp_SetChannel(16);
//On recherche un canal pas trop brouillé
value = MiApp_NoiseDetection(0x07FFF800,10,NOISE_DETECT_ENERGY,&noise);
//On recalcule le channelMap
channelMap = channelMap << value;
//On lance le PAN sur le channel le moins bruité,
value = MiApp_StartConnection(START_CONN_ENERGY_SCN,10,channelMap);
MiApp_ConnectionMode(ENABLE_ALL_CONN);

Le programme complet

Je viens de découvrir que MPLABX est capable de générer un package du projet. Voici donc l'intégralité du projet sous forme de fichier .ZIP

Haut de page