Déploiement d’un noyau sur Snowball depuis les sources du noyau Igloo.Deploy Snowball system from Igloo kernel sources with wlan features

Voici un arbre git permettant de déployer un système avec wifi fonctionnel sur la Snowball de Calao Système en utilisant le noyau fournit par la communauté Igloo.

Pour le recupérer :

git clone https://github.com/Evanok/snowball_builder.git.

Vous pouvez aussi télécharger directement la tarball correspondant au dernier commit de l’arbre pour ne pas vous embarrasser de l’arbre git complet :

wget https://github.com/Evanok/snowball_builder/tarball/master -O snowball_builder.tar.gz

Dans l’arborescence du projet, vous trouverez un Makefile. Vous n’avez qu’a faire make pour démarrer la construction du système avec les paramètres par défauts. A savoir un noyau Android 3.3 avec une distribution Debian.

Les deux principaux éléments du projet sont le script builder.sh et le script shell config_creator. Ce sont donc ces deux fichiers que vous devrez modifier pour toute modification de la procédure.

Dans builder.sh, les étapes sont :

  • Récupération des éléments necessaires : source du noyau Igloo, compilateur croisé ARM
  • Génération du uImage à l’aide du configure donné en paramètre
  • Génération des modules noyaux
  • Génération de 3 scripts utilisés par multistrap pour générer le rootfs à l’aide de config_creator
  • Construction du rootfs à l’aide du multistrap

Description des scripts utilisés par multistrap :

snowball_multistrap_configuration 

C’est le principal script utilisé par multistrap, il fera référence aux deux autres. Vous pouvez y ajouter par exemple les paquets installés à la génération du système.

snowball_setup_script.sh

Ce script défini les opérations à effectuer sur le rootfs avant de le compresser sous la forme d’une tarball. On y défini les utilisateurs, récupère les modules du noyau, défini le fichier network/interfaces ou encore procédons à la création de certain bloc de /dev. Si vous souhaitez ajouter des élements au rootfs pendant la génération c’est ici que vous devrez effectuer vos modifications.

snowball_config_script.sh

Ce script permettra de configurer la Snowball lors du premier démarrage. On en profitera aussi pour installer le patch du package debian bluez ainsi que de proceder au test du wlan.

Le système déployée par défaut est un noyau Android et une distribution Debian Squeeze. En effet ici seul nous intéresse la fonctionnalité du WIFI.

Enfin un script permet de déployer de façon automatisée le système produit sur une micro sd. Attention votre carte micro sd devra avoir été formatée correctement auparavant en deux partitions afin d’y recueillir l’image du noyau d’un coté et le rootfs de l’autre.

Ensuite vous n’avez plus qu’a démarrer votre Snowball avec la sd carte. Attention votre Snowball doit être reliée à internet par le port Ethernet au démarrage. Une fois démarrée, vous n’avez plus qu’a lancer le script de configuration /snowball_config_script.sh

Enfin pour déployer le wifi au démarrage après chaque redémarrage de la Snowball :

  • hciattach -a 23 -n -s 115200 /dev/ttyAMA0 cg2900 115200 flow &
  • modprobe cw1200_core
  • modprobe cw1200_wlan
  • ifconfig wlan0 up

Et voila, on va pouvoir commencer à faire mumuse avec notre nouveau jouet.

This is a git tree which allow you to deploy a Snowball system from Igloo kernel sources with wlan features.

Get the git tree :

git clone https://github.com/Evanok/snowball_builder.git.

You can also download directly the tarball which fetch the last commit of the git tree to have lighter Snowball builder :

wget https://github.com/Evanok/snowball_builder/tarball/master -O snowball_builder.tar.gz

In the project tree, you will find a Makefile. You just have to run make to start the building process with default parameters. These defaults parameters are the branch linux-android-3.3 of the igloo kernel and a basic configure. The system will run with Debian Squeeze distribution.

The two most important files of the project tree are the script builder.sh and config_creator.sh. Theses two scripts must be modify if you wan customize your building process.

builder.sh steps :

  • Clone some git trees : Igloo kernel sources, cross arm compiler
  • Building uImage
  • Installing kernel modules
  • Generate scripts ubing by Multistrap
  • Building rootfs with Multistrap

Description of scripts using by Multistrap

snowball_multistrap_configuration 

Main script using by Multistrap, you can find for example debian package installed in the Snowball system

snowball_setup_script.sh

This script define command to run before compress the rootfs. We will define users, copying kernel modules in rootfs, define some configurations files like network/interfaces… If you want add some directory to the rootfs, you must customize this script !

snowball_config_script.sh

This script will allow to configure the Snowball system at the first booting. For example we will mount /proc or installing bluez package patch for hciattach command.

Finaly a script which allow to deploy Snowball system on micro sd card. Be carefull, your sd card must be partionned correctly. You must have two partitions, in one hand, a partition for kernel image and in the other hand a partition for the rootfs.

Ensuite vous n’avez plus qu’a démarrer votre Snowball avec la sd carte. Attention votre Snowball doit être reliée à internet par le port Ethernet au démarrage. Une fois démarrée, vous n’avez plus qu’a lancer le script de configuration /snowball_config_script.sh

Next you just have to boot yoour Snowball with micro sd card. With some Snowball you must use Ethernet cable to connect your Snowball to Internet to boot it correctly. After booting, you just have to run the configuration script : /snowball_config_script.sh which configure the rootfs the first time that you start your system board.

To enable wlan, command are :

  • hciattach -a 23 -n -s 115200 /dev/ttyAMA0 cg2900 115200 flow &
  • modprobe cw1200_core
  • modprobe cw1200_wlan
  • ifconfig wlan0 up

And now we can start to play we our new toy !

Premier programme avec Arduino : Evitement d’obstacle – Partie 2

Mis en avant

Voici la seconde partie de l’article concernant l’évitement d’obstacle.

Etape 4 : Programme d’évitement d’obstacle

Le code est plus ou moins proche d’une version fonctionnelle et finale. Voici tout d’abord le code source :

motor.c : Ce fichier définit les fonctions permettant de commander les moteurs à travers des fonctions associées à différents types de mouvement.

#include "motor.h"

void move_forward()
{
  analogWrite (E2, SPEED);
  digitalWrite(M2,LOW);
  analogWrite (E1, SPEED);
  digitalWrite(M1,HIGH);
}

void move_backward()
{
  analogWrite (E2, SPEED);
  digitalWrite(M2,HIGH);
  analogWrite (E1, SPEED);
  digitalWrite(M1,LOW);
}

void turn_right ()
{
  analogWrite (E2, 0);
  digitalWrite(M2,LOW);
  analogWrite (E1, SPEED);
  digitalWrite(M1,HIGH);
}

void turn_left ()
{
  analogWrite (E2, SPEED);
  digitalWrite(M2,LOW);
  analogWrite (E1, 0);
  digitalWrite(M1,HIGH);
}

void rotate_right ()
{
  analogWrite (E2, SPEED);
  digitalWrite(M2,HIGH);
  analogWrite (E1, SPEED);
  digitalWrite(M1,HIGH);
}

void rotate_left ()
{
  analogWrite (E2, SPEED);
  digitalWrite(M2,LOW);
  analogWrite (E1, SPEED);
  digitalWrite(M1,LOW);
}

void stop_motor ()
{
  analogWrite (E1, 0);
  analogWrite (E2, 0);
}

sensor.c : Gestion des obstacles.

#include "sensor.h"

int static r = 0;

void handle_obstacle ()
{
   int i;
   int left_avg = 0;
   int right_avg = 0;

   if (r == 1024)
   r = 0;

   for (i = 0; i < 5; i++)
      left_avg += analogRead(LEFT_SENSOR);

   for (i = 0; i < 5; i++)
      right_avg += analogRead(RIGHT_SENSOR);

   left_avg = left_avg / 5;
   right_avg = right_avg / 5;

   // zero obstacle in the both side
   if (left_avg < CONF_SENSOR && right_avg < CONF_SENSOR)   
   {
      move_forward();
      delay (300);
   } 
   // one obstacle on the left side   
   else if (left_avg >= CONF_SENSOR && right_avg < CONF_SENSOR)   
   {     
      turn_right ();  
      delay (300);   
   }   
   // one obstacle on the right side  
   else if (right_avg >= CONF_SENSOR && left_avg < CONF_SENSOR)
   {
      turn_left ();
      delay (300);
   }
   else
   {
      stop_motor();
      move_backward();
      delay(500);
      if (r % 2)
         rotate_left();
      else
         rotate_right();
      r++;
      delay (1500);
   }
}

Enfin le “main” de mon programme :

romeo.c : Fonction main du programme

#include "motor.h"
#include "sensor.h"

void setup(void)
{
  int i;
  for (i = 6; i     pinMode(i, OUTPUT);

  Serial.begin(19200);
  move_forward();
}
void loop(void)
{
  handle_obstacle();
  move_forward();
  delay(15);
}

Ainsi dans le fichier sensor.c, nous retrouvons le code correspondant à la gestion des obstacles. Nous avons deux capteurs actuellement sur la plateforme mobile.

TODO : AJOUTER PHOTO ROBOT + CAPTEURS + AJOUT CONE VISIBILITE

Le code ici reste très simple, nous allons récupérer 5 fois les valeurs sur nos capteurs et nous calculons la moyenne des valeurs obtenues. Cette étape permet d’augmenter la précision puisque les capteurs peuvent parfois renvoyer des valeurs erronées.

Ensuite nous avons 3 cas à gérer :

  1. Aucun obstacle détecté par nos capteurs : J’avance tout droit
  2. Un obstacle détecté sur l’un des capteurs : Je me dirige dans la direction opposé a l’obstacle détecté
  3. Les deux capteurs détectent un obstacle : Je recule, effectue une rotation à 90° sur la gauche ou la droite.

Les résultats sont plutot encourageants comme vu lors d’un article précédent.

Cocotix

Afin de débuter, j’ai aussi décidé de faire un petit robot basic faisable en quelques heures. Cela m’a permit de tester ma motivation et de faire l’achat de quelques outils de bases, typiquement un fer a souder. Ma dernière soudure remontait au collège…

J’ai donc suivis pour cela un tutoriel très bien fait, trouver sur le site robot-maker, ce tutoriel a été écrit par Robocop. J’en profite pour faire de la pub pour un magasin que je trouve pas mal sur paris : http://www.selectronic.fr

Voici donc une photo du montage terminé :

Enfin une seconde photo après customization

TODO

Ce robot est vraiment simple, il ne possède aucun carte, juste de l’électronique. Il faut avouer que le projet a l’avantage d’être vraiment simpliste et bon marché mais assez frustrant une fois terminé. Il n’y a rien de programmable la dedans.