8 👨‍🏫 Apprendre de nouvelles compétences à Nybble

« Donnez du poisson à un chat, il mangera pendant une journée, apprenez-lui à pêcher et il mangera pour le restant de ses jours. » 🎣

8.1. Comprendre les compétences dans Instinct.h.

Un ensemble d'angles d'articulation définit une posture statique, tandis qu'une série d’ensembles définit un mouvement régulier, habituellement une démarche.

L’EEPROM est limitée à 1 000 000 cycles d’écriture. Je décide donc de minimiser les opérations d’écriture.

Il existe deux sortes de compétences : Instincts et Newbility. Les chemins sont tous deux écrits sur l’EEPROM embarquée (1 KB) dans la table de références, mais les données réelles sont stockées à différents emplacements de la mémoire :

  • La mémoire I²C EEPROM (8 KB) stocke les Instincts.

Les Instincts sont des compétences déjà programmées et perfectionnées. On peut les comparer à une « mémoire musculaire ». La plupart des Instincts sont écrits de manière linéaire une seule fois sur la mémoire I²C EEPROM avec WriteInstinct.ino. Leurs chemins sont générés et enregistrés dans la table de références sur l’EEPROM embarquée lors de l’exécution de WriteInstinct.ino.

  • PROGMEM, (qui partage la mémoire vive 32 KB avec le programme) stocke la Newbility.

Une Newbility est une nouvelle compétence expérimentale qui nécessite de nombreux tests. Elle n’est ni écrite sur l’I²C, ni sur l’EEPROM embarquée, mais elle est conservée sur la mémoire vive sous un format PROGMEM. Il doit être téléchargé comme le serait un composant d’un programme Arduino. Son chemin est également défini pendant l'exécution du code, bien que la valeur change rarement si le nombre total de compétences (y compris tous les Instincts et Newbilities) reste inchangé.

8.2. Exemple de code Instinct.h

//a short version of Instinct.h as example

#define WalkingDOF 8
#define NUM_SKILLS 6
#define I2C_EEPROM
const char cr[] PROGMEM = { 
26, 0, -5,
 35, 37,-46,-53,-23,-32, -3, 12,
 40, 28,-42,-59,-24,-28, -4, 12,
 ...
 33, 39,-47,-51,-22,-32, -3, 11,
};
const char stair[] PROGMEM = { 
54, 0, 30,
 44, 90,-39,-38, 10,-32,-10, 32,
 45, 90,-32,-46, 16,-38,-16, 38,

 43, 90,-44,-32,  6,-26, -6, 26,
};
const char pu1[] PROGMEM = { 
1, 0, 0,
  0,-30,  0,  0,  0,  0,  0,  0, 20, 20, 60, 60, 60, 60,-55,-55,};
const char pu2[] PROGMEM = { 
1, 0, 0,
  0, 10,  0,  0,  0,  0,  0,  0, 60, 60, 40, 40,-45,-45,-55,-55,};
const char rest[] PROGMEM = { 
1, 0, 0,
-30,-80,-45,  0, -3, -3,  3,  3, 60, 60,-60,-60,-45,-45, 45, 45,};
const char zero[] PROGMEM = { 
1, 0, 0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,};
#if !defined(MAIN_SKETCH) || !defined(I2C_EEPROM)
const char* skillNameWithType[] =
{"crI", "stairN", "pu1I", "pu2I", "restI", "zeroN",};
const char* progmemPointer[] = 
{cr, stair, pu1, pu2, rest, zero, };
#else
const char* progmemPointer[] = {stair, zero};
#endif

8.2.1. Constantes définies

define WalkingDOF 8

Indique que le nombre de DDL pour marcher est de 8 sur Nybble.

define NUM_SKILLS 6

Le nombre devrait être le même que dans la liste const char* skillNameWithType[].

define I2C_EEPROM

Indique que NyBoard contient une mémoire I²C EEPROM pour enregistrer les Instincts.

Si vous construisez votre propre circuit imprimé qui n’en contient pas, il n’est pas nécessaire de le préciser sur cette ligne. Les deux sortes de compétences sont maintenant enregistrées sur la mémoire vive sous le format PROGMEM. De toute évidence, cela réduira l'espace flash disponible pour les codes fonctionnels. S'il y avait trop de compétences, cela pourrait même dépasser la taille limite pour le chargement du programme.

8.2.2. Structure des données relatives à l’ensemble des compétences

Regardez bien les deux compétences suivantes :

const char rest[] PROGMEM = { 
1, 0, 0,
-30,-80,-45,  0, -3, -3,  3,  3, 60, 60,-60,-60,-45,-45, 45, 45,};
const char cr[] PROGMEM = { 
26, 0, -5,
 35, 37,-46,-53,-23,-32, -3, 12,
 40, 28,-42,-59,-24,-28, -4, 12,
 ...
 33, 39,-47,-51,-22,-32, -3, 11,
};

Elles sont formatées ainsi :

Une posture ne correspond qu’à un seul mouvement, tandis qu’une allure correspond à plusieurs mouvements.

8.2.3. Suffixes indiquant un Instinct ou une Newbility

Vous devez charger WriteConst.ino pour écrire les compétences dans l’EEPROM pour la première fois.. Voici les informations qui seront utilisées :

const char* skillNameWithType[] =
{"crI", "stairN", "pu1I", "pu2I", "restI", "zeroN",};
const char* progmemPointer[] = 
{cr, stair, pu1, pu2, rest, zero, };

Vous remarquerez l’emploi des suffixes I ou N sur les chaînes d’appellation de la compétence. Ils indiquent au programme où stocker les données relatives aux compétences et quand définir leurs chemins.

Plus tard, si tous ces facteurs sont réunis, le programme n’aura besoin que de ce repère pour se référer à la listeconst char* progmemPointer[] = {stair, zero};afin d’exploiter au mieux les compétences prédéfinies.

8.3. Définir de nouveaux comportements et compétences

8.3.1 Modifier le modèle de compétences existant

Il existe déjà une compétence appelée « zeroN » sur Instinct.h. Il s'agit d'une posture non définie qui n’attend plus qu’on la configure.

Vous pouvez tout d’abord utiliser la commande mIndex Offset pour bouger les articulations dans la position de votre choix, puis remplacer les angles d’articulation (en gras) en une seule fois :

const char zero[] PROGMEM = { 
1, 0, 0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,};

Vous pouvez simplement charger Nybble.ino chaque fois que vous changez le tableau (sans avoir à charger WriteInstinct.ino) puisqu’il est considéré comme une Newbility et n’a pas besoin d’être écrit sur la mémoire morte I²C EEPROM. Pour déclencher la nouvelle posture, appuyez sur le bouton 7 de la télécommande infrarouge ou saisissezkzero dans le moniteur série.

Vous pouvez renommer cette compétence mais n’oubliez pas de mettre à jour le schéma des touches de la télécommande infrarouge.

8.3.2. Découvrir plus de compétences cachées dans Instinct.h

Davantage de compétences sont cachées dans Instinct.h et peuvent être utilisées via le moniteur série avec la commande liée au jeton « k ». Par exemple, kcd1 permettra à Nybble de passer dans la posture « cd1 », qui signifie « se pencher en avant ».

Vous pouvez également écrire des programmes courts pour que Nybble effectue plusieurs compétences à la suite, de la même manière que les « pompes » dans Nybble.ino. Par exemple, en connectant les postures « cd1 » et « cd2 » comme séquence en boucle, vous pouvez faire en sorte que Nybble se penche en avant, regarde de gauche à droite, puis de droite à gauche.

8.3.3 Automatisation

Jusqu'à présent, Nybble est contrôlé par la télécommande infrarouge, vous permettant de prendre les décisions concernant son comportement.

Vous pouvez connecter Nybble avec votre ordinateur ou votre smartphone et les laisser envoyer des instructions automatiquement.

En ajoutant des capteurs (notamment sensoriels) ou des modules de communication (à l’image d’un module de contrôle vocal), vous pouvez apporter une nouvelle perception à Nybble, et lui apprendre de nouvelles capacités. Vous pouvez donc intégrer de nombreux comportements automatiques et potentiellement rendre Nybble autonome !

Dernière mise à jour