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

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

![](/files/-M1QV7Q1mCrmy_oIrSdE)

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**.&#x20;

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**.&#x20;

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**

```cpp
//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.&#x20;

`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.

{% hint style="warning" %}
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. &#x20;
{% endhint %}

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

Regardez bien les deux compétences suivantes :

```cpp
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 :

![](/files/-M1VnJFU2gOhgxDeDoPx)

{% hint style="info" %}
Une posture ne correspond qu’à un seul mouvement, tandis qu’une allure correspond à plusieurs mouvements.&#x20;
{% endhint %}

### 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 :

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

{% hint style="info" %}
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.
{% endhint %}

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 liste`const char* progmemPointer[] = {stair, zero};`afin d’exploiter au mieux les compétences prédéfinies.&#x20;

## 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 :

```cpp
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 saisissez`kzero` dans le moniteur série.&#x20;

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

### 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 ».

![](/files/-M1ZzcYM_jyoHQ1fXdK-)

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.&#x20;

### 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.&#x20;

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 !&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nybble.petoi.com/francais/chapter8.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
