Projet Aimie

Parlez nous de vos projets et de vos idées, imaginez des applications

Projet Aimie

Message non lude Soak » Jeu 22 Déc 2011 23:28

Bonjour,

Actuellement en formation électronique niv II a l'Afpa balma. je me suis porté acquéreur il y a maintenant près de 3 semaine d'une carte Ardurino Mega afin de m'atteler a un projet de robot baptisée Aimie (pour Apparence d'Intelligence par Manipulations Informatiques et Électroniques).

Le projet consiste en un robot hexapode en utilisant le principe de ce châssis: http://www.lynxmotion.com/images/product/large/ch3rca-blk.jpg.

le corps rond permettant un déplacement dans toutes les directions, je compte lui implanté 6 capteur d'obstacle ultra-son (1 entre chaque pattes.) ainsi que plus tard une tourelle en son centre qui pourrait se positionnée dans le sens de la marche du robot afin d'accueillir une batterie de senseur plus sophistiquée (tels qu'une caméra pour la reconnaissance de forme, un capteur de signal directionnel pour lui permettre de située une balise de destination etc. ...).

Le robot serait aussi équipée d'un système de reconnaissance vocale ainsi qu'une possibilité de réponse audio. (au début par le choix d'un fichier son pré-calculer puis par la suite tenter d'intégrer un plugin Vsti de text-to-speech GNU (les Vst/Vsti son encodé en C++), ceci afin d'alléger la taille de la base de donnée des possibilité de réponses (qui ne serait plus des Wav non compresser, très gourmand en mémoire, mais de simples chaines de caractères.)

Je précise que mon projet et un projet a long terme, en créant un système simple au démarrage puis qui se complexifierait au fur et a mesure du temps.


n'ayant pas a l'heure actuelle le matériel nécessaire a la réalisation du châssis (raison financières, un hexapode nécessitant 18 servomoteur son nécessaire, vu le prix d'un seul de ses engins il va me falloir quelque mois pour pouvoir tous les avoir et pouvoir se faire mouvoir la bête). Je m'attelle donc pour le moment a comprendre le fonctionnement du langage C et Arduino sur des principes de bases (recevoir les donnée d'un capteur et les interprété etc...)

Je me suis également attelé au principe simple de recevoir une chaine de caractère puis l'analysée afin de choisir parmi plusieurs réponses possible afin de l'envoyer au port série de l'IDE Arduino. voila ou j'en suis:

Code: Tout sélectionner
             // reception, analyse d'une chaine de caractère, puis envoi d'une réponse apropriée


int reception;               // Déclaration de la variable de reception des caractere 

String ordre="";            // Déclaration de la String de stockage l'ordre reçu

String hello ="hello";      // Déclacation des ordres possible
String test="test";
String presentation="presente toi";
String ledA="led on";
String ledB="led off";
String senseur="affiche senseur";
String bonjour="bonjour";


void setup()   {

  Serial.begin(115200);    // Ouverture du port série
  pinMode(13, OUTPUT);     // Préparation de la led sur le port 13

}

void loop()  {

  while (Serial.available()>0) {    // Vérification de donée en attente dans le buffer d'entrée pour le lancement de la boucle de lecture
    reception=Serial.read();       // Lectrure du premier caractère reçus dans le buffer
    if (reception==10) {          // Si le caractere reçu est le caratere de nouvelle ligne on sort de la boucle
      break;
    }
    else {
      ordre=ordre+char(reception);  // Stockage des caracteres reçus dans la chaine de stockage de l'ordre reçus
    }
  }
 
  // comparaison avec les different ordre reçus, et affichage de la réponse attendue.
 
  if (ordre==hello || ordre==bonjour) Serial.println("Bonjour utilisateur");
  if (ordre==test) Serial.println("tout marche comme sur des roulettes");
  if (ordre==presentation) Serial.println("Je suis Aimee, Apparence d'Intelligence par Manipulation Infromatiques et Electroniques");
  if (ordre==ledA) digitalWrite(13, HIGH);
  if (ordre==ledB) digitalWrite(13, LOW);
  if (ordre==senseur) Serial.println(analogRead(A0));
 
  ordre=""; // On supprime l'ordre reçu afin de se préparer a en acceuillir un nouveau.

}


Et la se constate très vite un problème. pour le moment tout va bien, il n'y a que 6 ordre connus la liste n'est pas très longue, mais des que l'on va commencer a travailler avec du sérieux, la quantité d'ordre a déclaré deviendra très vite imposante, ainsi que la quantité de ligne de if etc... alourdissant de manière conséquente le code le rendant difficile a appréhender, lire et corriger.

Je me demandait donc s'il n'était pas possible de Déclarer les Strings des ordre reçus dans un fichier annexe (un base de donnée). de même pour les réponses, afin de n'avoir d'une boucle de comparaison qui vérifiait, par exemple, avec les entrée d'un tableau a 2 dimensions, ou figurerait les diverses chaines d'ordre connus associer a la (ou les, sélectionnée avec un randomize pour le coté plus convainquant) réponses adéquates.

j'ai bien essayer de déclarer mes Strings dans un fichier Db.h inclus avec la fonction #include au démarrage mais il m'affiche alors le message d'erreur suivant :
R_ponse.cpp: In function ‘void loop()’:
R_ponse.cpp:35: erreur: ‘hello’ was not declared in this scope
R_ponse.cpp:35: erreur: ‘bonjour’ was not declared in this scope
R_ponse.cpp:36: erreur: ‘test’ was not declared in this scope
R_ponse.cpp:37: erreur: ‘presentation’ was not declared in this scope
R_ponse.cpp:38: erreur: ‘ledA’ was not declared in this scope
R_ponse.cpp:39: erreur: ‘ledB’ was not declared in this scope
R_ponse.cpp:40: erreur: ‘senseur’ was not declared in this scope

Les variable de type int arrive parfaitement a être déclaré dans un fichier annexe.

quand l'erreur reçue n'est pas celle-ci j'ai une erreur me disant que String n'est pas un type d'objet!!!

si quelqu'un a une idée pour résoudre se problème....

merci d'avance.

Ianis MARTIN
L'imagination c'est la vie, la vie est imaginations.
Osez, vous pourrez!
Soak
 
Messages: 2
Inscription: Jeu 22 Déc 2011 20:43
Localisation: Toulouse

Re: Projet Aimie

Message non lude Soak » Jeu 22 Déc 2011 23:40

petite précision, je me suis aperçu que quand je déclare les Strings dans le fichier prog principal sans enlever le #include, il m'affiche un message d'erreur me précisant que les Strings sont déjà déclarée ( erreur redéfinition). donc c'est qu'il comprend bien les définition des Strings dans le fichier DB.h, alors pourquoi me dit-il qu'elle ne sont pas déclarée si je les mets uniquement dans le fichier DB.h??
L'imagination c'est la vie, la vie est imaginations.
Osez, vous pourrez!
Soak
 
Messages: 2
Inscription: Jeu 22 Déc 2011 20:43
Localisation: Toulouse

Re: Projet Aimie

Message non lude Zigazou » Ven 30 Déc 2011 00:32

Bonjour,

Je ne suis pas certain que l’utilisation de chaînes de caractères pour la gestion des ordres soit la solution la plus adaptée à un micro-contrôleur, surtout si, comme vous l’indiquez, le nombre d’ordres possibles doit exploser.

Lire et analyser une chaîne de caractères est une opération consommatrice de cycles d’horloge et d’espace mémoire.

En plus, sur l’Arduino, chaque chaîne de caractères utilise une partie de la RAM, même si vous définissez ces chaînes constantes, et la RAM de l’Arduino est de… 2 Ko ! Il est possible de placer ces chaînes dans la mémoire Flash (http://www.arduino.cc/en/Reference/PROGMEM) mais leur utilisation nécessite l’emploi d’une zone de copie en RAM et alourdit/ralentit leur utilisation.

Ne pouvez-vous pas simplement utiliser des #define ?

Code: Tout sélectionner
#define ORDRE_HELLO 0
#define ORDRE_TEST 1
#define ORDRE_PRESENTATION 2
#define ORDRE_LED_ON 3
#define ORDRE_LED_OFF 4
#define ORDRE_AFFICHE_SENSEUR 5

Ceux-ci résoudront votre problème d’inclusion via un fichier .h, allègeront vos traitements (utilisation de switch… case…, traitement d’un entier plutôt que d’une chaîne) et allègeront vos communications.

Pour simplifier l’organisation du code (mais pas forcément le code lui-même :twisted: ), vous pouvez utiliser les pointeurs de fonctions :

Code: Tout sélectionner
void ordre_hello() {
  // Hello
}

void ordre_test() {
  // Test
}

void (*ordres[])()={
  ordre_hello,
  ordre_test
};

void loop() {
  int ordre;

  // Récupérer l'ordre depuis le port série ou autre
  // …

  // Teste la validité de l’ordre donné
  if(ordre<0 || ordre>=(sizeof(ordres)/sizeof(void *)) {
    // Erreur ordre inconnu
  } else {
    // Appel de la fonction gérant l’ordre donné
    ordres[ordre]();
  }
}

Cette méthode présente l’avantage de ne nécessiter aucun if supplémentaire par nouvel ordre.
Avatar de l’utilisateur
Zigazou
 
Messages: 16
Inscription: Lun 26 Déc 2011 10:34


Retourner vers Vos projets, vos idées

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités

cron