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.

Premier programme avec Arduino : Moteur, Capteur et évitement d’obstacle

Mis en avant


Etape 1 : Mise en place de l’environnement

Sur Windaub rien de plus simple, il suffit de télécharger l’IDE Arduino ici

Concernant la configuration la encore c’est très simple, il suffit de :

  • Choisir le modèle de sa carte dans la liste disponible du menu Tools > board
  • Définir le port de communication utilisé dans Tools >Serial Port

De plus il existe un système de débug via le port série via le menu Tools >Serial Monitor, celui ci permet de debugguer son programme assez facilement a l’aide de la fonction Serial.write (XXX). Nous pouvons même simuler l’envoi de commande via une entrée standard toute prête.

Etape 2 : Premier programme : Test des moteurs

Voici un petit code permettant de tester vos branchements moteurs

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M2 Direction Control

int speed = 200;

void run_motor()
{
analogWrite (E2, speed);
digitalWrite(M2,LOW);
analogWrite (E1, speed);
digitalWrite(M1,HIGH);
}
void setup(void)
{
int i;
for(i=6;i<=9;i++)
pinMode(i, OUTPUT);

Serial.begin(19200); //Set Baud Rate
}
void loop(void)
{
run_motor();
}

Un programme arduino se compose de deux fonctions principales. Une fonction setup correspondant a l’initialisation et une fonction loop correspondant au programme qui sera exécuté comme son nom l’indique en continue.

Dans la fonction setup, nous définissons que les pin correspondant aux commandes moteurs sont en mode output. En effet nous avons besoin d’envoyer des valeurs a nos moteurs, donc en toute logique nous choisissons le mode output. Ici les pins correspondant aux moteurs vont de 4 a 7, attention selon la version de votre board, ces pins peuvent être différents, ceci est a déterminer a l’aide des indications sur les datasheets ou plus simplement directement sur la carte. Enfin le serial.begin permet de définir la vitesse de transmission du port série. Celle ci doit être la même dans le mode sérial monitor si vous voulez communiquer de façon correcte avec votre carte.

Dans la fonction loop, nous appelons la fonction qui active les moteurs. AnalogWrite comme son nom l’indique permet d’écrire sur un pin analogique tandis que le DigitalWrite permet d’écrire sur un pin digitale. Ainsi sur le pin de direction on peut envoyer LOW ou HIGH selon que vous vouliez mettre vos moteurs en marche arrière ou avant, ensuite pour ce qui est des pins de vitesse, on y définit une vitesse celle ci étant en bytes la fourchette de valeur est 0 – 255.

Vous allez me dire qu’il y a un problème dans mon code ? Et bien oui mes deux moteurs ne semblent pas tourner dans le même sens. Et bien pas vraiment, au cours de mon montage j’ai donc branché deux moteurs en parallèles sur chaque contrôleur moteur ( Il y en a que deux sur la carte, 4 moteurs donc pas le choix). Cependant j’ai fait mes soudures au hasard, ainsi il s’est avéré que mes deux moteurs ne sont pas branchés dans le même sens de polarité. Ainsi si je veux aller en marche avant avec l’un je dois lui envoyer LOW, tandis que l’autre a besoin de HIGH. Ceci n’est pas très gênant étant donné qu’on programme notre petite fonction une fois et qu’après on n’y touche plus.

Pour tester le programme rien de plus simple, il y a un bouton upload. Attention sur certaine carte dont la Romeo, il est nécessaire de reset la carte entre chaque nouveau upload de code. Pour cela, il y a en général un bouton sur la carte. Ainsi il vous suffira d’appuyer sur le bouton de reset brièvement juste avant de lancer l’upload.

Finalement, on débranche son robot, on enclenche l’interrupteur et on espère que cela fonctionne, sinon a vous la chasse au faux contact, mauvaise soudure, etc..

Etape 3 : Intégration de capteur et arrêt de la plateforme a la rencontre d’un obstacle

capteur utilisé :  Module capteur de distance infrarouge Sharp GP2Y0A21  (datasheet)

Nous allons tout d’abord brancher notre capteur. Celui que nous utilisons est analogique, nous allons donc le brancher sur les pins analogique. Cependant votre bon sens vous dira que si celui ci est digital vous devrez utiliser les pins correspondant. Concernant notre cher capteur, pour le brancher rien de plus simple, un connecteur JST est deja plugguer sur le capteur, donc plus qu’a le brancher de façon très simple. Tout d’abord en lisant notre datasheet, nous repérons que le cable rouge est le plus (Vcc sur le schéma), Nous devons brancher ce Vcc sur le pin 5V de l’analogique, le Gnd sur le Gnd et enfin le Vo sur le S. Dans mon cas, j’ai branché mon capteur sur le pin 0.

extrait du datasheet du capteur sharp

Voici un petit programme très simple permettant de tester son bon fonctionnement :


//Standard PWM DC control

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M2 Direction Control

int front_sensor = 0; // pin analog 0
int speed = 200;

// mootor functions

void run_motor()
{
 analogWrite (E2, speed);
 digitalWrite(M2,LOW);
 analogWrite (E1, speed);
 digitalWrite(M1,HIGH);
}

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

// sensor functions

boolean detect_obstacle (int sensor)
{
 if (analogRead(sensor) > 200)
 return true;
 return false;
}

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

Serial.begin(19200); //Set Baud Rate
}
void loop(void)
{

if (detect_obstacle (front_sensor) == false)
 {
 run_motor();
 }
 else
 {
 stop_motor ();
 }
}

Dans ce code, nous avons donc une fonction permettant de détecter les obstacles. Dans le cas ou nous détectons un obstacle, nous stoppons le robot. Le capteur est analogique, nous utilisons donc la fonction AnalogRead, le paramètre qui lui est passé correspondant a la valeur du pin sur lequel est branché le capteur a savoir 0. Enfin on définit le fait de tomber sur un obstacle lorsqu’on est a une certaine distance de celui ci. Il faut savoir que plus la valeur renvoyée par le capteur et plus l’obstacle sera proche. Donc attention la valeur renvoyée est une tension correspondant au voltage .

Etape 4 : Programme d’évitement d’obstacle

Voir l’étape 4 dans la seconde partie de l’article.

Etape 1 : Mise en place de l’environnement

Sur Windaub rien de plus simple, il suffit de télécharger l’IDE Arduino ici

Concernant la configuration la encore c’est très simple, il suffit de :

  • Choisir le modèle de sa carte dans la liste disponible du menu Tools > board
  • Définir le port de communication utilisé dans Tools >Serial Port

De plus il existe un système de débug via le port série via le menu Tools >Serial Monitor, celui ci permet de debugguer son programme assez facilement a l’aide de la fonction Serial.write (XXX). Nous pouvons même simuler l’envoi de commande via une entrée standard toute prête.

Etape 2 : Premier programme : Test des moteurs

Voici un petit code permettant de tester vos branchements moteurs

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M1 Direction Control

int speed = 200;

void run_motor()
{
analogWrite (E2, speed);
digitalWrite(M2,LOW);
analogWrite (E1, speed);
digitalWrite(M1,HIGH);
}
void setup(void)
{
int i;
for(i=6;i<=9;i++)
pinMode(i, OUTPUT);

Serial.begin(19200); //Set Baud Rate
}
void loop(void)
{
run_motor();
}

Un programme arduino se compose de deux fonctions principales. Une fonction setup correspondant a l’initialisation et une fonction loop correspondant au programme qui sera exécuté comme son nom l’indique en continue.

Dans la fonction setup, nous définissons que les pin correspondant aux commandes moteurs sont en mode output. En effet nous avons besoin d’envoyer des valeurs a nos moteurs, donc en toute logique nous choisissons le mode output. Ici les pins correspondant aux moteurs vont de 4 a 7, attention selon la version de votre board, ces pins peuvent être différents, ceci est a déterminer a l’aide des indications sur les datasheets ou plus simplement directement sur la carte. Enfin le serial.begin permet de définir la vitesse de transmission du port série. Celle ci doit être la même dans le mode sérial monitor si vous voulez communiquer de façon correcte avec votre carte.

Dans la fonction loop, nous appelons la fonction qui active les moteurs. AnalogWrite comme son nom l’indique permet d’écrire sur un pin analogique tandis que le DigitalWrite permet d’écrire sur un pin digitale. Ainsi sur le pin de direction on peut envoyer LOW ou HIGH selon que vous vouliez mettre vos moteurs en marche arrière ou avant, ensuite pour ce qui est des pins de vitesse, on y définit une vitesse celle ci étant en bytes la fourchette de valeur est 0 – 255.

Vous allez me dire qu’il y a un problème dans mon code ? Et bien oui mes deux moteurs ne semblent pas tourner dans le même sens. Et bien pas vraiment, au cours de mon montage j’ai donc branché deux moteurs en parallèles sur chaque contrôleur moteur ( Il y en a que deux sur la carte, 4 moteurs donc pas le choix). Cependant j’ai fait mes soudures au hasard, ainsi il s’est avéré que mes deux moteurs ne sont pas branchés dans le même sens de polarité. Ainsi si je veux aller en marche avant avec l’un je dois lui envoyer LOW, tandis que l’autre a besoin de HIGH. Ceci n’est pas très gênant étant donné qu’on programme notre petite fonction une fois et qu’après on n’y touche plus.

Pour tester le programme rien de plus simple, il y a un bouton upload. Attention sur certaine carte dont la Romeo, il est nécessaire de reset la carte entre chaque nouveau upload de code. Pour cela, il y a en général un bouton sur la carte. Ainsi il vous suffira d’appuyer sur le bouton de reset brièvement juste avant de lancer l’upload.

Finalement, on débranche son robot, on enclenche l’interrupteur et on espère que cela fonctionne, sinon a vous la chasse au faux contact, mauvaise soudure, etc..

Etape 3 : Intégration de capteur et arrêt de la plateforme a la rencontre d’un obstacle

capteur utilisé :  Module capteur de distance infrarouge Sharp GP2Y0A21  (datasheet)

Nous allons tout d’abord brancher notre capteur. Celui que nous utilisons est analogique, nous allons donc le brancher sur les pins analogique. Cependant votre bon sens vous dira que si celui ci est digital vous devrez utiliser les pins correspondant. Concernant notre cher capteur, pour le brancher rien de plus simple, un connecteur JST est deja plugguer sur le capteur, donc plus qu’a le brancher de façon très simple. Tout d’abord en lisant notre datasheet, nous repérons que le cable rouge est le plus (Vcc sur le schéma), Nous devons brancher ce Vcc sur le pin 5V de l’analogique, le Gnd sur le Gnd et enfin le Vo sur le S. Dans mon cas, j’ai branché mon capteur sur le pin 0.

extrait du datasheet du capteur sharp

Voici un petit programme très simple permettant de tester son bon fonctionnement :


//Standard PWM DC control

int E1 = 5; //M1 Speed Control
int E2 = 6; //M2 Speed Control
int M1 = 4; //M1 Direction Control
int M2 = 7; //M1 Direction Control

int front_sensor = 0; // pin analog 0
int speed = 200;

// mootor functions

void run_motor()
{
 analogWrite (E2, speed);
 digitalWrite(M2,LOW);
 analogWrite (E1, speed);
 digitalWrite(M1,HIGH);
}

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

// sensor functions

boolean detect_obstacle (int sensor)
{
 if (analogRead(sensor) > 200)
 return true;
 return false;
}

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

Serial.begin(19200); //Set Baud Rate
}
void loop(void)
{

if (detect_obstacle (front_sensor) == false)
 {
 run_motor();
 }
 else
 {
 stop_motor ();
 }
}

Dans ce code, nous avons donc une fonction permettant de détecter les obstacles. Dans le cas ou nous détectons un obstacle, nous stoppons le robot. Le capteur est analogique, nous utilisons donc la fonction AnalogRead, le paramètre qui lui est passé correspondant a la valeur du pin sur lequel est branché le capteur a savoir 0. Enfin on définit le fait de tomber sur un obstacle lorsqu’on est a une certaine distance de celui ci. Il faut savoir que plus la valeur renvoyée par le capteur et plus l’obstacle sera proche. Donc attention la valeur renvoyée est une tension correspondant au voltage .

Etape 4 : Programme d’évitement d’obstacle

Voir l’étape 4 dans la seconde partie de l’article.

Piloter sa machine à distance via son téléphone sous Android

Vous en avez marre de vous trimbaler votre clavier/souris dans votre canapé ou bien de lever les fesses de votre lit à la fin de votre film ?

Alors voici une application Android (compatible aussi Windows phone) bien sympa : Unified Remote

Cette application gratuite et simple d’utilisation vous permettra de contrôler votre machine à distance via une interface simple depuis votre téléphone. Vous avez aussi des fonctionnalités plus avancés tel que piloter Spotify, parcourir le système de fichier pour lancer un film, éteindre/allumer votre machine a distance, piloter Youtube, prendre le contrôle de votre souris et de votre clavier etc… Il existe un version payante du soft, mais la version gratuite est bien largement suffisante en service. Rien a dire, c’est fluide et intuitif à utiliser.

Installer la version Unified Remote Serveur sur la machine que vous souhaitez controller a distance : Unified Remote Server

Actuellement on ne peut piloter que des machines sous Windows XP/7/8, mais une version pour Linux et Mac est en cours de développement

Petite remarque : Pour utiliser la fonction de Wake On Lan (Permettant d’allumer le pc via son téléphone), vous aurez besoin de faire quelques manipulations.

Activer la fonction dans le BIOS dans la gestion de l’alimentation : Pour cela rendez vous dans le bios et recherche la gestion de l’alimentation, vous trouverez l’option sous différents nom selon le bios. Parfois Wake On Lan, parfois Power On via PCI/PCIE/PME.  A vous de vérifier si votre matériel est compatible mais l’option semble assez standard sur du matériel récent.

Entrer l’adresse Mac de votre carte réseau dans l’application : Exécuter -> cmd -> ipconfig /all

remote3
Activer la fonction de Wake On Lan sur votre carte mère au niveau de votre OS : Sur Windows 7 : Panneau de configuration -> Centre réseau et partage -> Modifier les paramètres de la carte -> Connexion au réseau Local -> Propriétés -> Clients pour les réseaux Microsoft -> Configurer

remote4Vérifiez que le Wake On Lan packet est activé, ainsi que les deux dernières checkbox d’autorisation. C’est l’envoi de ce paquet a votre carte réseau qui va permettre d’activer l’alimentation

Ouvrir les ports 9512 en TCP et UDP sur votre box/routeur. Certaine box offre une fonctionnalité en natif. Ainsi sur Freebox, il suffit d’activer la fonction Proxy WOL dans les fonction avancé du routeur Freebox.

Et voila, vous pourrez désormais vous lancer un film sans bouger de la couette. C’est bon d’être feignant.

GCOV : Taux de couverture d’une suite de test

Voici un outil bien pratique pour la phase de test d’un projet ou pour trouver du code mort : GCOV. En effet Gcov va nous permettre de voir le taux de couverture de nos jeux de tests en nous montrant le pourcentage de ligne de code et de branchements testés.

But : Détermine le taux de couverture de nos tests sur un projet afin de détecter éventuellement du code mort et surtout d’être certain de tester 100% du code produit.

Prérequis pour un programme en espace utilisateur:  lcov 1.9. Pour un module noyau, cela nécessite évidemment les sources du noyau et les flags associés à GCOV d’activés dans le configure du noyau dans le cas ou nous souhaitons profiler le noyau lui même.

Voici un programme simple pour calculer un factorielle :


#include
#include
int usage ()
{
 printf ("usage: ./facto N\n");
 printf ("\tN : decimal value (MAX : 20)\n\n");
 printf ("Compute the factorial value of an integer value.\n\n");

return 1;
}

unsigned long long facto(unsigned long long n)
{
 if (n == 0)
    return 1;
 return n * facto(n - 1);

}

int main (int argc, char *argv[])
{
 char* ptr;

if (argc != 2)
 return usage ();

long int n = strtol(argv[1], &ptr, 0);

if (ptr[0] || n < 0 || n > 20)
 return usage ();

printf ("%ld\n", facto(n));
 return 0;
}

Voici un script shell de test :

#!/bin/sh

n=0

red="\033[31m";
white="\033[37m";
green="\033[32m";
blue="\\033[1;34m";

test_facto ()
{
    # $1 is facto argument
    # $2 is return value by program
    # $3 is result
    echo "Test $i : Run facto with n = $1."
    ./facto $1 2>/dev/null 1>&2
    ret1=`echo $?`
    ./facto $1 2>/dev/null | grep $3 >/dev/null 2>&1
    ret2=`echo $?`
    if [ $2 -eq $ret1 ] && [ $ret2 -eq 0 ]; then
	   printf $green
	   echo OK
    else
	   printf $red
	   echo KO
    fi;
    printf $blue
    i=$(($i+1));
}

printf $blue

test_facto 0 0 1
test_facto 1 0 1
test_facto 2 0 2
test_facto 3 0 6
test_facto 4 0 24
test_facto 5 0 120
test_facto 6 0 720
test_facto 12 0 479001600
test_facto efsf 1 usage
test_facto efez54zfz 1 usage
test_facto ffzeef 1 usage
test_facto -4 1 usage
test_facto 1.1 1 usage

Dans ce script nous testons differentes valeurs dont les cas d’erreurs. Pour utiliser lcov nous devons compiler notre code avec ces flags :
+=-fprofile-arcs -ftest-coverage

Enfin pour utiliser lcov/gcov, nous commencons par executer notre script de test :

./check_complete.sh
gcov test_user_gcov
lcov -o user_test.info -c -f -d .
genhtml -o user_result user_test.info

Gcov va générer les résultats tandis que lcov est une surcouche permettant d’exploiter les résultats sous forme de fichier html très facile à exploiter

Dans cette image nous pouvons voir que l’ensemble du code n’est pas testé, le code de valeur max n’est pas testé ainsi que le cas ou le programme est appelé avec un nombre incorrecte d’argument. Gcov analyse deux données, le nombre de ligne de code testé, et aussi le nombre de branchement effectivement testé. Ainsi nous obtenons le nombre de fois qu’a été exécuté une ligne de code lors de nos tests ainsi que le détail sur chaque branchement possible de nos conditions. Ligne 33, nous pouvons voir que sur les 6 cas possible de la condition, 1 cas n’est pas testé par la présence d’un symbole “-” en rouge. Simple et efficace.

De plus Gcov peut aussi être utilisé dans le cas d’un module noyau. Vous trouverez dans cette tarball un exemple complet pour utiliser gcov avec un programme utilisateur et en espace noyau avec la présence d’un Makefile, le code (utilisateur et noyau), un configure pour vérifier les prérequis :gcov_example.tar.bz2

Déployer un projet Xcode sur Ipad/Iphone sans compte developpeur Apple

Introduction

Vous voulez déployer un projet Xcode sur votre Ipad ou votre Iphone pour un petit projet perso et n’avez pas besoin d’utiliser l’Apple Store et surtout de payer les 99$/ans pour un compte développeur chez Apple ? Il existe une solution ! Pour ca vous avez juste besoin de jailbreaker votre device et effectuer quelques manipulations diverses et variées. Il faut savoir pour les réticents que Jailbreaker son device est quelque chose de réversible ! Donc d’aucune façon dangereuse pour votre appareil. Pour plus d’information, je vous invite a lire ceci.

Etape 1 : Jailbreaker votre device

Cette étape est la plus simple, il vous suffit d’aller sur ce site très pratique : http://www.jailbreakinside.com Vous y trouverez une solution pour effectuer le jailbreak de votre device en téléchargeant un simple binaire.

Etape 2 : Installation de AppSync sur votre device

Après le Jailbreak de votre appareil, une application Cydia apparaitra, ouvrez la et ajouter dans les sources : http://cydia.hackulo.us. Ensuite vous n’avez plus qu’a y rechercher l’application AppSync. Voyez ce Cydia comme un espèce de dépôt d’application.

edit : Le projet Hackulo a fermé, il existe cependant des repos alternatifs pour acceder a AppSync : http://cydia.myrepospace.com/Perrotti/

Source : http://www.igeeksblog.com/hackulo-us-alternative-repo-to-get-appsync-for-ios/

Etape 3v1 : Manipulation sur votre machine de developpement pour Xcode 4.4.X

Pour cet étape, il existe deux variantes selon votre version de Xcode. Pour Xcode 4.4.x, je vous invite a lire ce tutoriel : ici.  Je l’ai suivi et cela fonctionne même s’il comporte quelques erreurs. Je n’ai cependant pas pu tester le résultat puisque je possède la version 4.3.2. Pour la version Xcode 4.3.2 ( et 4.3.X) je vous invite a vous referer directement a l‘étape 3v2

Vous retrouverez les erreurs en question dans les commentaires du tutoriel donné plus haut. Voici un récapitulatif des erreurs :

Etape 3 : Create self-signed certificate

Concernant le type de certificat celui ci doit être “Signature de code” et non “S/MIME” comme indiqué

Etape 5 : Patch Xcode

# cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
# cp ./iPhoneOS\ Build\ System\ Support ./iPhoneOS\ Build\ System\ Support.orig
# printf “\xc3\x26\x00\x00” » ./iPhoneOS\ Build\ System\ Support
# chmod a+x iPhoneOS\ Build\ System\ Support</pre>

Ici sur la 3ème ligne de commande bash, c’est bien evidemment une redirection et non une double quote de citation fermante :

# printf “\xc3\x26\x00\x00” >> ./iPhoneOS\ Build\ System\ Support

Etape 9 : Add a run script to your project build phase

Une fois le script copié et collé sur XCode, vous devez faire attention, apparemment l’encodage des caractères est erronés sur le site. Ainsi vous aurez peut être à effacer les doubles quotes et les réécrire même si d’aspect tout semble correcte. En général cette erreur vous provoquera des erreurs quand vous essayerez de déployer votre projet sur votre device du type : iPhone Developer: no identity found

Etape 3v2 : Manipulation sur votre machine de developpement pour Xcode 4.3.X

Pour la version 4.3.X, j’ai testé la manipulation avec les éléments suivants :

  • Appareil : Ipad 1
  • iOS : 5.1.1
  • Xcode 3.4.2
  • Max OS X 10.7
Le tutoriel à suivre se trouve ici. Evidemment la encore il comporte une petite erreur… sinon cela ne serai pas drole. En faites, le tutoriel indique de mettre ldid3.py et le binaire ldid dans /usr/local/bin mais je vous conseil de faire toute la manipulation avec /usr/bin en corrigeant les références du script python ldid3.py et du fichier iPhoneCodeSign.xcspec vers /usr/bin et non /usr/local/bin comme prévu dans le tutoriel.

Enfin pour la dernière étape de ce tutoriel concernant la création du fichier sur votre device, pour cela, vous devez juste installer OpenSSH via Cydia, puis vous connecter à votre device via votre ordinateur en SSH, la procédure ici.

Conclusion

Et voila maintenant si tout va bien l’icone de votre application apparait sur votre device et vous pouvez la lancer. Et voila j’ai enfin mon application Ipad pour piloter ma caméra motorisée à distance !!