IMA4 2018/2019 P57
Sommaire
Présentation générale
Description
Les capteurs sont omniprésents dans le domaine de l'entreprise. Une usine peut disposer de plusieurs centaines de capteurs répartis dans toute sa structure. Ces capteurs ont des rôles différents comme la mesure de la température, la présence d'une pièce où encore la mesure métrique d'un élément.
Chacun de ces capteurs peut être amené a être mis à jour afin de modifier un temps de réponse ou changer la couleur de détection d'un capteur optique etc...
Ces mise à jours peuvent être fastidieuses à implémenter car nécessite l'intervention physique d'un opérateur et la mise à jour se fait pour chaque capteur individuellement.
Objectifs
L'objectif de ce projet est de proposer un système permettant de reprogrammer un capteur de manière OTA (Over The Air) sans aucune intervention physique.
Le système devra être :
- Sécurisé : la mise à jour devra être vérifié (provenance, checksum) avant l'implémentation.
- Économe en énergie : l'impact énergétique sera pris en compte dans le choix des technologies.
- (Bonus) Le système sera générique afin de pouvoir mettre a jour un groupe de capteur automatiquement
Analyse du projet
Positionnement par rapport à l'existant
Un système semble déjà exister pour les composants ATmega328P(arduino) [1]
Le but de ce projet sera de créer un module indépendant qui devra respecter certains critères afin de pouvoir être polyvalent et s'appliquer a chaque capteur. Ce module sera ajouté à chaque capteur lors de sa fabrication. Une étude du coup supplémentaire sera alors effectuée.
- Polyvalence : le module pourra s'implémenter à chaque capteur facilement sans ajouter un code particulier.
- Sécurisé : chaque mise à jour sera contrôlée avant l'implémentation du programme. (calcul du MD5 Checksum + Clée de décryptage)
- Économe en énergie : ce module devra utiliser le moins possible de courant. Les composants seront donc choisis pour leurs consommation.
Avantages :
- Hautement sécurisé : chaque mise à jour sera vérifiée à l'aide d'une clé de cryptage et d'un checksum.
- Peut théoriquement s'adapter à tout type de capteur.
- Temps de mise hors service très court. (Par rapport à une maintenance physique)
Inconvénients :
- Coûts de fabrication plus important
Analyse du premier concurrent
MYSBootloader by Tekka (Mysensors Team)
Ce système fonctionne en tant que bootloader uniquement sur les microcontrôleurs ATmega328P. Lors du boot du microcontroleur ou reset, il applique la mise à jour du code qu'il a reçu. Lors de la réception de la mise à jour le capteur doit être offline.
Ce système ne nécessite pas de mémoire externe.
Avantage :
- Si le firmware est défectueux, il est possible de réimplémenter
Inconvénients :
- Le capteur doit être en mode hors-ligne afin de pouvoir se mettre à jour (il doit rebooter)
- le bootloader dépend énormément du module radio (un bootloader différent pour chaque module radio)
Analyse du second concurrent
Dualoptiboot by Lowpowerlab
Cette solution est une solution codée dans le firmware à implémenter. Elle nécessite une mémoire externe afin de stocker le firmware reçu avant de le téléverser dans la mémoire interne du microcontrôleur. En incluant la librairie Dualoptiboot, un programme scrutant les mise-à-jour est continuellement exécuté.
Avantages :
- Ne dépend pas du module radio.
- Peut être mis à jour en fonctionnement
Inconvénients :
- Un firmware défectueux ne peut plus être mis-à-jour OTA
- Nécessite une mémoire externe
Positionnement par rapport a la concurrence
Les concurrents utilisent le système radio comme communication entre un serveur et plusieurs capteurs. Cette communication s'effectue dans les deux sens et permet de réaliser un diagnostic et envoyer les mises a jour en clair via les ondes radios. Cependant ces mises à jour ne sont pas cryptés. De plus n'importe quel ordinateur sur le réseau pourrait envoyer les mises à jour sans qu'il y ai de vérification de sécurité.
Pour faire simple, la solution proposée par les concurrents est surtout utilisé pour effectuer de la domotique ou d'autres taches au domicile. Cependant, la sécurité est quand a elle insuffisante pour l'implantation dans l'entreprise.
Une clée de cryptage sera attribuée à chaque entreprise.
Le système proposé sera différent de :
MYSBootloader par :
- Le bootloader contiendra toutes les fonctions permettant de décoder les trames reçues.
- Il exécutera en plus du code du capteur, un processus de scrutation du signal radio et lors de la réception d'une mise-à-jour, stockera et traitera les informations. Au lieu d'écrire directement. (Par l'implémentation d'un ordonnanceur)
- La mise à jour pourra être reçue en fonctionnement sans avoir a rebooter
Dualoptiboot par :
- Mis-a-part le checksum, aucune vérification de sécurité n'est réalisée.
- L'algorithme de sécurité contenant la clé de décryptage ne peut pas être contenue dans une librairie transmise au client. (Un usager mal intentionné pourrait exploiter ces données pour pouvoir diffuser de fausses mise-à-jour)
- L'utilisateur n'aura pas a recompiler à chaque fois la partie gestion du module radio.
Cependant ces différences apportent leurs lots de contraintes :
- Une place utilisée sur la mémoire interne de l'Atmega plus importante.
- Un temps de traitement plus long lors de la vérification des mises à jour
- La nécessité d'avoir une mémoire interne afin de réaliser le traitement
Scénario d'usage du produit ou du concept envisagé
Scénario :
Le chef d'entreprise doit mettre à jour ses capteurs afin de pouvoir gagner en productivité (envoi de donnée plus rapide). Un technicien doit démonter et reprogrammer un a un plusieurs centaines de capteurs alors que son chef lui demande d'aller plus vite car la chaine de production est interrompue. Quand SensorOTA propose de mettre a jour en quelques secondes tous les capteurs à l'aide d'une antenne et de la communication broadcast avec presque aucune coupure.
Réponse à la question difficile
Comment faire pour que l’ATMEGA puisse se reprogrammer toute seule ?
Pour pouvoir écrire dans l'EEPROM (la mémoire interne de l'ATMEGA), il faut posséder une autre mémoire (vive ou morte).
Le choix s’oriente vers une EEPROM pour plusieurs raisons :
- La consommation énergétique presque nulle en dehors des lectures et écritures.
- La mémoire conserve la mise à jour même si elle est déconnecté du réseau (mémoire morte).
Cependant, d'autres facteurs peuvent être contestés :
- Le coût est légèrement supérieur a un autre type de mémoire (mémoire vive)
- Durée de vie plus courte (10 000 écritures)
L'Atmega peut réécrire son programme interne grâce au bootloader. Le bootloader est une portion de code qui s'exécute avant le programme principal. Actuellement, le bootloader optimise la vitesse d'exécution du code.
Des bootloader alternatifs existent, c'est le cas notament de celui de Dave Berkeley site WEB[[2]] Github : [[3]]
Toutefois, celui-ci ne s'occupe pas de la sécurité nécessaire a une mise en production ainsi que l'identification d'un capteur spécifique.
Préparation du projet
Cahier des charges
Le projet choisi doit permettre une implémentation en usine ainsi qu'une commercialisation possible. Pour cela de nombreux aspects doivent êtres analysés.
- Le système devra avoir une portée suffisante (environs 50m)
- L'ATMEGA ne sera reprogrammé qu'après avoir acquis la certitude que la mise à jour est authentique (Algorithme par cryptographie symétrique + Checksum)
- La transmission de mise-à-jour devra être cryptée afin d'éviter qu'une écoute réseau révèle le contenu de celle-ci. (Données cryptées envoyées sur le réseau)
- La consommation du capteur ne devra pas augmenter de plus de 10% de la consommation habituelle
- Les performances du capteur ne devront pas être impactées en dehors des mises à jour.
De plus d'un point de vue architecture :
- Le système utilisera des composants répandus sur le marché afin de pouvoir être réparé a moindre frais
- Le système n'utilisera pas de CMS afin de pouvoir être entretenu par l'utilisateur. (Et aussi afin de pouvoir réduire les couts de fabrication)
- Un autre moyen de reprogrammation devra être implémenté afin de pouvoir mettre a jour manuellement (en cas de panne).
Choix techniques : matériel et logiciel
Matériel nécessaire : (pour la partie capteur)
- ATMEGA328P-Au x1 [4]
- USB-TTL Arduino Programmer
- Flash 128kB [5]
- SRAM 128kB [6]
- NRF24L01 [7]
- BreadBoard
- 16Mhz oscillator [8]
- Capacitors
- 3v3 regulator [9]
- Led x1
- Resistance x1
Matériel nécessaire : (pour la partie émetteur)
Choix Logiciel :
Je choisis de m'inspirer du programme concurrent MYSBootloader qui sera modifié afin de permettre la mise à jour pendant le fonctionnement. FreeRTOS pourra être utilisé dans ce projet.
L'architecture de la mémoire sera semblable a celle trouvée sur les Arduino.
Liste des tâches à effectuer
Taches à effectuer (dans l'ordre)
- Conception du capteur
- Mise en place de la Raspberry
- Mise en service de la Raspberry
- Création du programme de communication de la Raspberry
- Modification du bootloader afin d'écrire sur le programme principal
BONUS :
- Mise en place du protocole de sécurité
- Attribution de clés uniques via la Raspberry Pi (communication via le port série)
- Programme pour que la Raspberry puisse flasher le bootloader et attribuer la clé de sécurité
Calendrier prévisionnel
Réalisation du Projet
Feuille d'heures
Tâche | Prélude | Heures S1 | Heures S2 | Heures S3 | Heures S4 | Heures S5 | Heures S6 | Heures S7 | Heures S8 | Heures S9 | Heures S10 | Heures S11 | Total |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Analyse du projet | 0 | 4 | 8 | 4 | 4 | 5 | 5 | 7 | 6 | 6 | 6 | 15 |
Prologue
Semaine 1
Définition des fonctionnalités de la carte, première phase de conception, choix des composants selon les besoins du projet. Choix d'une technologie de mémorisation SRAM au lieu d'une technologie EEPROM (pour sa durée de vie, sa consommation électrique, son prix). La persistance des données n'étant pas un absolue. J'ai pris la décision de penser le programme différemment. Lors de la réception d'une mise à jour, le micro-contrôleur la stockera dans la mémoire SRAM et effectuera les vérifications de celle-ci. Une fois la mise à jour vérifiée, le micro-contrôleur transférera les données directement dans la mémoire de programme.
Concernant le module radio, un emplacement sera disponible (header) afin de pouvoir attacher le circuit directement sur la carte. Cela permet d'utiliser le modèle déjà existant et également pouvoir le changer pour de la maintenance.
Le schématique a été commencé et la recherche des différentes empreintes a commencé avec parfois, la requête à un service de création d'empreinte.
Semaine 2
Cette semaine, une semaine où la conception du circuit récepteur devient primordiale. Mise en place d'un schématique lisible qui permet de répondre aux besoins.
Une concertation avec les encadrants m'a permis de définir plusieurs choses. Premièrement, qu'il fallait mettre les deux types de mémoire afin de pouvoir les comparer d'un point de vue énergétique, pratique etc. Une mémoire flash sera donc ajoutée au schématique afin de permettre la commutation entre les deux mémoires.
La deuxième chose est que le programme OTABoot pourra se situer dans deux espaces :
- A la fin de la mémoire de programme en prenant garde que le programme à mettre dans l'espace mémoire de programme ne réécris pas cette partie.
- Dans la partie Bootloader (qui est extensible jusqu'à 4ko) ce qui évitera que celui ci soit supprimé par une manipulation utilisateur.
La fonction OTABoot devra pouvoir stocker temporairement dans la mémoire (RAM ou Flash) les données reçu jusqu'à la fin de la réception et vérifier la conformité des données reçu avant de flasher l'espace mémoire.
Semaine 3 à 7
Conception du circuit électronique
Changement de conception, dorénavant 2 types de mémoires seront implémentées. Une mémoire RAM et une mémoire FLASH. L'une étant volatile et l'autre non volatile. Cependant, la vitesse de lecture et d'écriture de la RAM est bien plus rapide que celle de la flash. Des tests seront donc effectués afin de déterminer laquelle est la plus efficace dans le cas étudié. De plus, il existe la possibilité de stocker une sauvegarde du programme d'usine dans la mémoire FLASH en cas d'erreur de mise à jour, il reste la possibilité de revenir a une version antérieur avec ce type de mémoire.
De nombreuses semaines se sont écoulées car il a fallu chercher des footprints et parfois demander la réalisation de nouveaux footprints. De plus le routage était plus fastidieux que prévu. Il a fallu changer les connexions entre chaque composant afin de pouvoir connecter les composants afin d’éviter de faire des vias qui devront être créés à la main.
Le routage s'est effectué de la manière suivante :
- Éviter de faire des croisements entre les fils symbolisant les routages à effectuer.
- Placer les composants sur la carte en fonction de leurs utilisation (stockage, alimentation, communication FTDI, communication ISP et communication avec le module radio).
- Il faudra ensuite effectuer les changements nécessaire afin d'éviter de faire des vias.
- Placer les capacités de découplages le plus proche possible des éléments qu'elles doivent filtrer.
Au départ, une erreur a été commise. Celle de vouloir utiliser l'outil d'autoroute qui me donnait des résultats possibles mais pas du tout efficaces.
A cause de l'impossibilité de faire des trous métallisés, il a fallu penser à effectuer toutes les connexions à l'opposé des headers présents sur la carte. Il a fallu faire passer toutes les connexions sur la bottom layer ce qui a augmenté le nombre de via.
De plus après avoir suivi ces règles, j'ai demandé conseils à M. Thierry Flamen afin d'avoir une expertise sur ma carte. De nombreux conseils m'ont été fortement utile afin de maximiser les chances de fonctionnement de mon prototypage. Notamment :
- Avoir une clearance plus importante (espacement entre les lignes) afin de facilité l'impression.
- Choisir des lignes parallèles.
- Placer plusieurs vias tout au long de la carte afin d'éviter les différences de potentiels entre les 2 plans de masses (en top layer et bottom layer).
Une fois le routage terminé une semaine fut nécessaire (S7) afin de corriger les erreurs et améliorer le routage. Certaines pistes étaient perpendiculaires, d'autres n'étaient pas parallèles, les règles de clearance modifiées empêchait une réalisation efficace, il a donc fallu modifier cela et reprendre une grande partie du routage.
La conception étant maintenant terminée, j'ai préparé une documentation permettant de visionner le travail réalisé rapidement. Ce document m'aidera aussi grandement lors de la soudure des composants.
Semaine 8
Cette semaine est consacrée a l'impression de la carte et une première vérification que tout est bien fonctionnel. La qualité d'impression est impressionnante, un seul coup de cutter était nécessaire afin de séparer 2 pistes. Après cela, j'ai souhaité placer les composants CMS avant la fin de cette séance. A l'aide de pâte à braser j'ai placer les composants les plus petits sur la carte, cette étape fastidieuse est très chronophage. Un passage dans le four à 150°C pendant 180s puis 220 pendant 150s et enfin un refroidissement rapide pendant 220s a permis la soudure des différents composants. Des tests sont à prévoir afin de vérifier si tous les composants ont bien étés soudés correctement.
En parallèle, j'ai souhaité commencer la partie sur la Raspberry. Forte heureusement les modules NRF24l01 compatibles avec la Raspberry pi 3 pourront fonctionner directement avec l’alimentation 3V3 de la Raspberry. De plus il existe de nombreux tutoriels permettant de faire communiquer ces modules avec une Arduino. Un premier test sera donc de communiquer avec une Arduino classique afin de prendre en main le système de communication et maitriser les librairies disponibles.
La raspberry a été configurée de la manière suivante :
- Installation de l'image de Raspbian (récupérée sur le site officiel)
- Création d'un fichier SSH dans la partition Boot afin d'autoriser les connexions SSH nativement
- Mise à jour des paquets
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get dist-upgrade
- Autorisation l'utilisation des SPI afin de pouvoir utiliser le module NRF24L01 (module radio) qui débloquera la communication via l'interface MISO MOSI présente sur le GPIO
$ sudo raspi-config -> Interfaces -> SPI -> yes
- Installation de la librairie NRF24L01
$ cd $ mkdir nrf24l01 $ cd nrf24l01 $ git clone https://github.com/TMRh20/RF24.git $ cd RF24 $ make $ sudo make install
Une documentation est disponible pour cette librairie : [13]
Semaine 9
Cette semaine, la carte doit être terminée et testée. On effectue des tests de continuité afin de détecter d'éventuels court-circuits et vérifier que chaque soudure a été correctement réalisée.
Un premier court-circuit a été détecté entre le VCC et le GND de la carte, ce court-circuit provient simplement du connecteur micro-USB. Celui-la même qui posait problème avant la soudure du composant. J'ai décidé de le retirer afin de ne pas perdre de temps à tenter de le ressouder. Cette prise n'étant pas nécessaire pour la programmation et l'alimentation de la carte. La suite des vérifications s'est effectuée sans encombres.
Résultats des test :
- ATMEGA328P : Aucune patte n'est mal soudée, aucun court-circuit entre 2 pattes voisines.
- Mémoires : Test visuel concluant, toutes les pattes sont correctement soudées.
- Prise micro-USB : pont formée entre le VCC et le GND voisin. Retrait de la prise micro-USB pour le moment.
- LM117MP : Correctement soudé, vérification au multimètre.
- Résistances, condensateurs : Test visuels, et dans le doute test au multimètre.
- LEDs : Sur les 7 leds connectées, une était montée à l'envers, elle a pu être dessoudée sans problème et ressoudée dans le bon sens à l'aide d'un pistolet à air chaud.
La suite était de finir de souder le reste des composants, les composants CMS étant correctement soudés. Premièrement, les composants restants sont soudés en surface, puis les headers sont soudés par le dessous et enfin les vias.
Une fois tous les composants soudés, une inspection visuelle m'a permis de refaire certaines soudure à l'aide, parfois, de la pâte à braser. La vérification visuelle appuyé par une vérification au multimètre m'a confirmé dans le choix de mettre sous tension le circuit. La mise sous tension à été effectuée à l'aide d'une alimentation stabilisé de laboratoire munie d'une limitation en courant qu'on fixera à 10mA et une tension d'entrée de 5V. L'alimentation globale s'est effectuée sans soucis, la led d'alimentation est bien allumée et on peut mesurer une tension de 3.3V en sortie du LM117MP. Les premiers signes sont plutôt concluants.
Cette semaine se terminera par le test final, l'envoie de données pour l'écriture du BOOTLOADER du micro-contrôleur. La carte est amenée à M. Redon (tuteur du projet) qui essaya de téléverser un programme, sans succès.
Le quartz était surdimensionné. Un ATMEGA328P alimenté en 3.3V ne peut fonctionner à une fréquence de 16MHz, un quartz de 8 MHz va donc le remplacer.
Semaine 10
Le remplacement du quartz a été effectué ainsi que des tests pour vérifier que la soudure est correcte. Par la suite, j'ai décider de me créer une Arduino capable de graver le bootloader du micro-contrôleur en lui transférant le programme Arduino_ISP ainsi qu'en déclarant qu'on utilise le programmateur Arduino_ISP avant d'essayer de graver un bootloader. L'envoie du bootloader fut, encore une fois, un echec.
Par la suite, après avoir essayer d'autres techniques comme changer d'Arduino et de version d'Arduino IDE, une vérification complète des tracés de connexion a été effectué avec l'aide de M. Redon. Aucune anomalie fut détectée.
La prochaine hypothèse est que le fait que les signaux logiques en 5 V alors que le micro-contrôleur est en 3.3V est problématique. La correction de ce problème fut simplement, d'utiliser un pont diviseur de tension afin d'abaisser la tension de 5V en 3.3V. Pour cela, on utilisera des résistances de 1kOhm et 1.8kOhms afin de passer d'une tension de 5V à une tension de 3.21V ce qui serait interprété par un signal logique 1 par le micro-contrôleur. De plus, comme il y a 4 signaux logiques ( Reset, SCK, MISO, MOSI), il faut 4 ponts diviseurs de tension.
Cette nouvelle idée n'a pas encore fourni de résultats concluant, d'autres tests doivent donc être menés afin de faire fonctionner cette carte.
Semaine 11
Pour vérifier la théorie du problème d'alimentation en 3v3 des entrées logiques MISO/MOSI, j'ai décidé d'utiliser une Arduino mini 3.3V qui enverrait directement les signaux logiques en 3.3V. Pour cela, il a fallu shunter le convertisseur de tension 5V en 3.3V afin d'effectuer les tests. Ces tests n'ont malheureusement pas été concluants.
En raison des nombreux problèmes rencontrés pour programmer le micro-contrôleur avec l'ancienne carte, j'ai décidé de recommencer la conception d'une nouvelle carte afin de pouvoir avancer sur la partie programmation pendant l'interruption pédagogique. Cependant, la cause du problème avec l'ancienne carte n'étant pas identifiée, il était dommage de passer à autre chose. Dans cette optique, monsieur Redon s'est proposé pour réaliser une seconde carte identique à la première afin de vérifier que la conception de carte n'était pas faussée. Après plusieurs heures, la cause du problème fut identifiée, il s’agissait d'une erreur de réalisation puisque le prototype réalisé par monsieur Redon fonctionnait alors que celle ci utilisait la même conception. La réalisation de la carte par une entreprise professionnelle aurait pu éviter ce genre de problème de réalisation.
Cependant, comme la partie programmation n'a pas pu être commencé j'ai décidé de me focaliser sur celle ci en concevant une nouvelle carte utilisant une Arduino mini et qui fonctionnerait de la même manière que la première conception.
Cette carte fonctionnant sur le modèle d'un shield fonctionnera à partir d'une alimentation 5V qu'elle convertira en alimentation 3.3V pour tous les autres composants. Les 2 types de mémoires restent présents sur la carte afin de laisser la possibilité de tester ces 2 types de mémoire. Cette carte devra pouvoir être programmée puis alimenté à l'aide d'un câble mini-USB.
La conception étant relativement similaire à la première version, elle ne me prendra que 5 heures, la réalisation quant à elle me prendra 4 heures. Les fichiers de documentations ont également été réalisés pour cette carte. Fichier:P57 2018 CarteV2.PDF
Des premiers tests m'ont permis de m’apercevoir que la partie module radio était 100% fonctionnelle. De futurs tests ont révélés que des problèmes subsistaient sur la partie mémoire, un court circuit entre la branche wp (wipe data) et le gnd empêchait les mémoires de communiquer.
Après de nombreux tests, la carte est 100% fonctionnelle à l'aide de 2 librairies :
- The SPIFlash library (pour les mémoires SPI) [14]
- The RF24 library (pour le module radio nrf24l01) [15]