Estágio Mouchaud sobre Bluetooth 4.0 e 6lowpan

De MediaWiki do Campus São José
Revisão de 12h31min de 17 de junho de 2014 por Corentin.m (discussão | contribs) (Semaine 9 - 09/05/2014)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para: navegação, pesquisa

Page de Corentin Mouchaud

Description du Stage

Etude sur l'implantation du protocole 6lowpan sur une communication Bluetooth 4.0 dans une carte nrf51 de Nordic Semiconductors. Il s'agit de l'Equipement Kit, avec deux carte : la carte pca10000 et pca10001

A gauche : pca10001, à droite : pca10000

Programme de Travail

Anglais

(1) Basic study of the Nordic board including ARM Cortex 0 and Radio Module. (2 weeks)

(2) Basic study of the implementation of Bluetooth 4.0 on the Nordic board (C programming knowledgement is needed). (2 week). Note that the protocols is already implemented by Nordic.

(3) Small development (to be defined) showing the communication of a tablet with the nordic board using B4.0. Samples are provided then we do not expect problems in this phase.(2 weeks)

(4) Study of 6lowpan and the Contiki implementation. (2 weeks)

(5) Viability analyses to port Contiki on the Nordic Board. (2 weeks)


Français

(1) Etude basique de la carte Nordic qui inclue un processeur ARM Cortex M0 et un module radio. (2 semaines)

(2) Etude basique de l'implantation d'un Bluetooth 4.0 sur la carte Nordic (Connaissance de la programmation C requise). (2 semaines). A noter que le protocole est deja implanté par Nordic.

(3) Petit développement (a définir) pour montrer la communication d'une tablette avec la carte Nordic utilisant le Bluetooth 4.0. Les exemples sont fournis alors nous ne nous attendons pas à avoir de problèmes dans cette phase. (2 semaimes)

(4) Etude du protocole 6lowpan et de l'implantation Contiki. (2 semaines)

(5) Analyse de la viabilité de mettre Contiki sur la carte Nordic. (2 semaines)

Semaine 1 - 14/04/2014

Etape (1): Basic study of the Nordic board including ARM Cortex 0 and Radio Module.

Projet pratique


Développer un logiciel pour contrôler a distance deux LEDs dans une carte de l'Equipement Test nrf51 (pca10001). Le programme principal doit s’exécuter dans un PC lié a une première carte nrf51 (pca10000) a travers un portserial/USB. Cette carte doit executer un programme pour envoyer les commandes via RADIO a une seconde carte nrf51 (pca10000).

Diagramme de l'exemple

Réalisation


Le travail a été réalisé sous Windows :

1 - Il a d'abord fallut que je me documente sur les deux cartes nRF51822, de l'Evaluation Kit, misent a ma disposition (pca10000 et pca10001).

2 - En suivant le guide d'utilisation de l'Evaluation Kit j'ai télécharger le logciel KEIL MDK-ARM. Ce logiciel permet de compiler des programmes dans les cartes.

3 - Toujours en suivant la documentation, j'ai du telecharger J-Link Software de Segger pour configurer les cartes ( ATTENTION : la version de J - Link Software doit correspondre a la version de Keil ) .

4 - Ensuite j'ai télécharger, sur le site Nordic Semiconductor, plusieurs exemples de programme pouvant être mis sur les deux cartes.

5 - J'ai ensuite pris le terminal Realterm, me permettant de communiquer avec les programmes.

6 - J'ai d'abord implanter un exemple de programme sur la carte pca10001 en passant par KEIL. Ce programme fait clignoter les deux LEDs l'une après l'autre. J'ai pu voir que la carte fonctionnait correctement.

7 - Cette fois ci j'ai mis dans les deux cartes les deux programmes exemple LEDs_RADIO. Une fois mis il a fallut configurer le terminal pour qu'il puisse communiquer avec la carte pca10000. Le programme dans cette carte demande une valeur : soit 0, soit 1. on rentre la valeur dans le terminal et la carte envoie un paquet a la seconde carte. Celle ci lit le paquet et en fonction de la valeur, allume le LED0 et éteins la LED1, ou inversement.

Semaine 2 - 21/04/2014

Etape (1): Basic study of the Nordic board including ARM Cortex 0 and Radio Module.

Projet pratique


Développer un logiciel pour contrôler a distance deux LEDs dans une carte de l'Equipement Test nrf51 (pca10001). Le programme principal s'exécuteras finalement dans la première carte nrf51 (pca10000) a travers un portserial/USB. Cette carte doit exécuter un programme pour envoyer les commandes via RADIO a une seconde carte nrf51 (pca10001). Par la suite, commencer a étudier CONTIKI et son implantation sur la carte.

Réalisation


J'ai modifier les deux programmes exemples LEDs_RADIO pour pouvoir commander indépendamment les deux LEDs présentent sur la carte pca10001. Dans le premier programme, sur la carte pca10000, j'ai modifier le code pour envoyer différents paquets.

int main(void)
{
  init(); // initialisation
  simple_uart_putstring((const uint8_t *)"\n\rPress '1' pour allumer la LED 0\n\rPress '2' pour eteindre la LED 0\n\rPress '9' pour allumer la LED 2\n\rPress '0' pour eteindre la LED 2\n\r "); 
  // ce qu'affiche le terminal
  while(true)
  {
    uint8_t c = simple_uart_get(); // lecture de la valeur
    if (c != '1' && c != '2' && c != '9' && c != '0') // seules valeurs qui fonctionnent : 1, 2, 9, 0
      continue; 
    simple_uart_put(c); // sauvegarde de la valeur

Au niveau du second programme, j'ai modifier le code pour pouvoir qu'en fonction de la valeur du paquet envoyer par le premier programme, celui réalise différentes actions :

if (NRF_RADIO->CRCSTATUS == 1U) // écrit la valeur reçu
    {
      switch(packet[0])
      {
        case '1': // valeur reçu : 1
          nrf_gpio_pin_set(LED0); // La lED 0 s'allume
          break;
        case '2': // valeur reçu : 2
          nrf_gpio_pin_clear(LED0); // La LED 0 s’éteint
          break;
	case '9': // valeur reçu : 9
          nrf_gpio_pin_set(LED1); // La lED 1 s'allume
          break;
	case '0': // valeur reçu : 0
          nrf_gpio_pin_clear(LED1); // La LED 1 s’éteint
          break;
      }
    }

Finalement il n'est pas nécessaire pour l'instant de passer par un troisième programme sur l'ordinateur. Ceci sera réaliser ultérieurement.

Le premier programme envoie des données, tandis que le second reçoit des données. Pour que les deux programmes puissent recevoir et envoyer, il est nécessaire de créer deux fonctions, "recevoir" et "envoyer", dans chaque programmes. Ceci est en cours de réalisation.

En parallèle j'ai commencer a me documenter sur le CONTIKI ainsi que son implantation sur la carte. Des recherches plus approfondies vont m'être nécessaires concernant sont fonctionnement et son implantation.

Semaine 3 - 28/04/2014

Etape (5): Viability analyses to port Contiki on the Nordic Board.

Projet pratique


Mettre le système d'exploitation Contiki sur les cartes EK nrf51, puis ensuite ajouter et faire fonctionner dans les cartes les deux programme créer dans l’étape précédente.

Réalisation



Il a d'abord fallut que je me documente sur la structure/architecture des systèmes d'exploitation. Je me suis donc intéresser aux noyaux de systèmes d’exploitation, et plus précisément aux noyaux temps réels. Dans un second temps a l’exécution multitâche d'un système d'exploitation.

J'ai ensuite étudier les outils de travail, car le travail sera réalisé sous Linux, qui est un système d'exploitation qui m'est quasiment inconnu. J'ai notamment étudier le GCC (GNU Compiler Collection), qui permet de compiler différents langages de programmation. GCC a été porté sur de nombreux microprocesseur. Celui qui nous intéresse est le GCC-ARM. Le dernier outil que j'ai étudié est le logiciel Make. Ce dernier a pour objectif de construire automatiquement des fichiers, souvent exécutables, ou des bibliothèques à partir d'éléments de base tels que du code source.

Pour finir j'ai étudié les mécanismes interne du système d'exploitation Contiki (Timers, Multi-Threading, etc...)


Semaine 4 - 05/05/2014

Etape (5): Viability analyses to port Contiki on the Nordic Board.

Projet pratique


Mettre le système d'exploitation Contiki sur les cartes EK nrf51, puis ensuite ajouter et faire fonctionner dans les cartes les deux programme créer dans l’étape précédente.

Réalisation


A partir de là, le travail sera réalisé sous linux. Il a donc fallut repartir de zero:

1 - J'ai d'abord du télécharger JLink Software de SEGGER. Pour cela il faut rentrer le numero de serie d'une des deux cartes. Ensuite le software s'installe automatiquement dans /opt/SEGGER/JLink. Une fois installé, Je lance le programme JLinkExe : cd /opt/SEGGER/JLink/

./JLinkExe </syntaxhighlight>

Une fois le programme lancé, on a la possibilité d'utiliser les commandes JLinkExe. Elles nous permettront de configurer la carte pca10000

2 - Ensuite il faut brancher la carte pca10000 sur un port USB. On utilise la comande dmesg dans le terminal. On peut ainsi voir que la carte a été detectée ttyACM0 (la fonction détaille précisemment la carte).

3 - On peut ensuite utiliser la fonction ls /dev qui nous nous permet d'afficher le contenu du repertoire dev qui contient tous les peripheriques matériels. Cela nous permet de voir que le peripherique ttyACM0 a été ajouté.

4 - Par la suite, j'ai installer Cutecom : sudo apt-get install cutecom </syntaxhighlight>

Ce programme est un termial graphique. On le lance avec la commande suivante : sudo cutecom. Une fois Cutecom ouvert, il faut regler les parametres pour communiquer avec la carte :

Device : /dev/ttyACM0

Baud rate : 38400

Data bits : 8

Stop bits : 1

Parity : None

5 - Je telecharge ensuite la chaine de compilation GNU-GCC. Je prend le Linux installation tarball. En revanche il s'agit de programmes en 32 bit, alors que je tourne sur ubuntu 64 bit. Pour pouvoir faire tourner les programmes, j'installe la librairie 32-bit : sudo apt-get install ia32-libs </syntaxhighlight>

6 - Ensuite je dois telecharger sur le site de Nordic Semiconductor : nRF51-SDK-zip. Ce fichier contient des documentations et des exemples de codes a faire tourner sur les cartes nrf51.


A partir de la nous nous servirons des projet mis a dispositions par Earthlord :

1 - Il faut premièrement télécharger de l'exmple de Earthlord.

2 - Il faut ensuite télécharger Eclipse, puis le C/C++ Developers. Une fois fait, il faut installer CDT GNU Cross Development Tools. Cela nous permettras de compiler correctement sur Eclipse.

4 - Maintenant, dans Eclipse, il faut importer le projet exemple (File->Import->General Tab-> Existing projects into workspace). On selectionne le dossier et on termine.

5 - Une fois ceci fait, on remarque deux erreurs. Il faut donc aller dans les propriétés du projet. Il faut premierement aller dans 'Settings' de la section 'C/C++ Build'. A partir de la il faut selectionner 'Use Global Toolchain Path' puis ajouter le Global Path : /home/corentin/Bureau/Work/gcc-arm-none-eabi-4_8-2013q4/bin. Dans un second temps il faut aller dans 'Path and Symbols' de la section 'C/C++ General'. Dans /Languages/GNU C, il faut editer la location du Global Path, comme precedemment : /home/corentin/Bureau/Work/gcc-arm-none-eabi-4_8-2013q4/arm-none-eabi/include.

6 - Il ne reste plus qu'à mettre a jour le Makefile. Il faut mettre le bon dossier pour le GCC_INSTALL_ROOT : /home/corentin/Bureau/Work/gcc-arm-none-eabi-4_8-2013q4.

7 - Le programme peut etre compilé (CTRL+B). Il faut maintenant ouvrir le terminal. Je me place dans le dossier du projet : cd /home/corentin/Bureau/Work/nrf51Demo-master </syntaxhighlight>

Je lance la commande make upload. Le programme se lance dans la carte pca10000. Pour voir ce qui s'ecrit dans la carte, il suffit d'ouvrir un autre terminal et de lancer la commande sudo cutecom. Dans Cutecom il suffit d'ouvrir le device pour voir le fonctionnement du programme.

Dans le terminal, d'autre commandes sont possible :

make all : Compile le projet

make clean : Supprime les fichier crées.

make upload : Télecharge le programme dans la cible

make erase-all : Supprime le programme dans la cible


Maintenant que j'ai reussi a faire tourner un programme sur la carte, je dois mettre Contiki sur la carte :

1 - Je télécharge le code source de EarthLord. Il s'agit du code source de Contiki, a la seule difference, qu'il a rajouter un exemple pour porter Contiki sur la carte pca10000.

2 - Je lance dans un premier temps l'exemple hello-world. Pour cela je vais dans le dossier : cd /home/corentin/Bureau/Work/contiki-master/examples/hello-world </syntaxhighlight> Une fois dans le dossier je lance la commande make. Il y a d'abord eu une erreur. Il manquait une librairie pour lancer curses.h. J'installe donc la librairie 'libncurses5-dev' avec la fonction apt-get install libncurses5-dev qui me permet d'installer cette librairie. Je peux donc de nouveau lancer la commande make. Cela creer le 'hello-world.native'. Pour le lancer j'utilise la commande : ./hello-world.native </syntaxhighlight>

Le programme se lance dans le terminal.

Semaine 5 - 12/05/2014

Etape (?)

Projet pratique


Etudier et réaliser une communication UDP client - serveur sur l'ordinateur, qui se verra plus tard etre implanter sur les cartes

Réalisation


Je me suis d'abord documenter sur ce protocole, car il m'etait inconnu. Le rôle de ce protocole est de permettre la transmission de données de manière très simple entre deux entités, chacune étant définie par une adresse IP et un numéro de port. Contrairement au protocole TCP, il fonctionne sans négociation : il n'existe pas de procédure de connexion préalable à l'envoi des données. Donc UDP ne garantit pas la bonne livraison des datagrammes à destination, ni leur ordre d'arrivée.

Semaine 6 - 19/05/2014

Etape (?).

Projet pratique


Etudier et réaliser une communication UDP client - serveur sur l'ordinateur, qui se verra plus tard etre implanter sur les cartes

Réalisation


J'ai donc réaliser deux programmes: un programme client et un programme serveur.


Programme client: /*UDP client */

  1. include <sys/socket.h>
  2. include <netinet/in.h>
  3. include <stdio.h>

int main(int argc, char**argv) {

  int sockfd,n;
  struct sockaddr_in servaddr,cliaddr;
  char sendline[1000];
  char recvline[1000];
  if (argc != 2)
  {
     printf("usage:  udpcli <IP address>\n");
     exit(1);
  }
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr=inet_addr(argv[1]);
  servaddr.sin_port=htons(32000);
  while (fgets(sendline, 10000,stdin) != NULL)
  {
     sendto(sockfd,sendline,strlen(sendline),0,
            (struct sockaddr *)&servaddr,sizeof(servaddr));
     n=recvfrom(sockfd,recvline,10000,0,NULL,NULL);
     recvline[n]=0;
     fputs(recvline,stdout);
  }

} </syntaxhighlight>

Programme serveur: /*UDP serveur */

  1. include <sys/socket.h>
  2. include <netinet/in.h>
  3. include <stdio.h>

int main(int argc, char**argv) {

  int sockfd,n;
  struct sockaddr_in servaddr,cliaddr;
  socklen_t len;
  char mesg[1000];
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  servaddr.sin_port=htons(32000);
  bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
  for (;;)
  {
     len = sizeof(cliaddr);
     n = recvfrom(sockfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&len);
     sendto(sockfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
     printf("-------------------------------------------------------\n");
     mesg[n] = 0;
     printf("Reception des commandes:\n");
     printf("%s",mesg);
     printf("-------------------------------------------------------\n");
  }

} </syntaxhighlight>

Semaine 7 - 26/05/2014

Voyage Sao Paulo

Semaine 8 - 02/05/2014

Etape (?).

Projet pratique


Test du programme UDP sur le simulateur Cooja. Réalisation ensuite d'un programme utilisant le protocole 6lowpan sur Cooja

Réalisation


Cooja est un programme qui nous permet de simuler les programmes.

Pour cela nous allons nous servir des exemples founis par Contiki.

Cooja ne tourne que sur un envrionnement Linux, mais il s'emblerrait que de nombreux paquets soit necessaire pour pouvoir le faire tourner sans encombre. Après plusieurs essais je n'ai pas reussi a lancer le programme Java. J'ai donc télécharger Instant Contiki qui est un environnement complet de développement Contiki. Il s'agit d'une machine virtuelle Ubuntu Linux qui s'exécute dans VMware Player sur laquelle tous les outils de développements, de simulations et de compilations Contiki sont deja installés et configurer.

Une fois la machine vituelle lancée, il faut se connecter grace au mot de passe: user. Une fois connecter il suffit de lancer de terminal, de se mettre dans le dossier cooja, puis ensuite de lancer le programme. cd /home/user/contiki-2.7/tools/cooja ant run </syntaxhighlight>

Cooja se lance, on doit maintenant créer une nouvelle simulation. Il faut choisir un nom adapter, pour ma part se sera 'Communication IPv6'. Les autres paramètres ne sont pas forcément a changer. On créer la simulation.

Ensuite il faut créer les motes. Les motes recevront les codes. On choisit 'Sky mote', que l'on nomme 'Border Routeur'. Dans cette mote, on place le code 'border_routeur.c' ou le le fichier binaire 'bordeur_routeur.sky' si on a compilé le code au préalable. Une fois le fichier sélectionner, il ne reste plus qu'à soit compiler si ce n'est pas déjà fait, soit a créer la mote. Il ne faut faut pas ajouter de mote pour l'instant car nous devons en créer une nouvelle, de type 'Sky mote'. Nous nommerons cette mote 'Serveur UDP'. On place dans cette mote le code 'UDP_server.c' ou le binaire 'UDP_server.sky'. On compile et on créer.

Maintenant que les motes sont créer, on peut les placer. Je place une première mote Bordeur Routeur, puis ensuite je place 5 motes Serveur UDP. Ces motes sont placées aléatoirement. On peut les bouger a volonté avec la souris. Il est possible de voir l'environnement entre ces motes en cliquant sur une mote. Deux cercles apparaissent. Le premier cercle, vert, représente l'aire dans laquelle la mote reçoit un signal valide avec les autres motes. Le second cercle, gris, représente l'aire dans laquelle il peut y avoir des interférence radio entre ces motes.

Le réseau a été configuré, mais avant de pouvoir lancer la simulation, il faut créer une passerelle le réseau RPL. Pour cela on ajoute a la mote Bordeur Routeur une 'Serial Socket (SERVER)'. Cela créer un port serie sur la mote Bordeur Routeur qui est accessible par le numéro de port UDP 60001 sur la machine.

On peut donc commencer la simulation. On fois la simulation lancer il faut ouvrir un terminal pour entrer les commandes suivantes: cd contiki-2.7/tools make tunslip6 sudo ./tunslip6 -a 127.0.0.1 aaaa::1/64 </syntaxhighlight>

Cela permet de configurer la passerelle du réseau RPL, via la mote Bordeur Routeur. Toutes les motes commenceront par 'aaaa::/64. A la suite de cette commande, on voit apparaître ceci:

slip connected to ``127.0.0.1:60001 opened tun device ``/dev/tun0 ifconfig tun0 inet `hostname` up ifconfig tun0 add aaaa::1/64 ifconfig tun0 add fe80::0:0:0:1/64 ifconfig tun0

tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

         inet addr:127.0.1.1  P-t-P:127.0.1.1  Mask:255.255.255.255
         inet6 addr: fe80::1/64 Scope:Link
         inet6 addr: aaaa::1/64 Scope:Global
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:500 
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
      • Address:aaaa::1 => aaaa:0000:0000:0000

Got configuration message of type P Setting prefix aaaa:: Server IPv6 addresses:

aaaa::212:7401:1:101
fe80::212:7401:1:101

</syntaxhighlight>

Cela montre que la passerelle est installée et que le Border Routeur est configurer à l'adresse aaaa::212:7401:1:101. Il est possible de vérifier cette adresse en utilisant la commande 'ping6'. L'adresse IP pour la mote 2 est aaaa :: 212:7402:2:202 et ainsi de suite.

Semaine 9 - 09/05/2014

Etape (2): Basic study of the implementation of Bluetooth 4.0 on the Nordic board

Projet pratique


Étude du Bluetooth et de son implantation sur la carte.

Réalisation


Etude du Bluetooth Low Energy

References