Alpha Rex 2.1

Programmation en NXC (extraits) :

// Jambe droite : Moteur B + Capteur de contact 1
#define RIGHT_MOTOR         OUT_B
#define RIGHT_TOUCH         S1
#define RIGHT_TOUCH_VAL     SENSOR_1  // Valeur de S1

// Jambe gauche : Moteur C + Capteur de contact 2
#define LEFT_MOTOR          OUT_C
#define LEFT_TOUCH          S2
#define LEFT_TOUCH_VAL      SENSOR_2  // Valeur de S2

// Les 2 jambes à la fois
#define MOTORS              OUT_BC

// Marche avant / arrière
#define FORWARDS 1
#define BACKWARDS 2

// Les autres capteurs utilisés ///////////////////////////////

// Capteur ultrasonique
#define ULTRASONIC          S4
#define ACTIVE_DISTANCE 30

// IMU (Inertial Motion Unit)
// https://www.dexterindustries.com/manual/imu-sensor/
#define IMU                 S3
#define IMU_ACC_ADDR 0x3A
#define IMU_GYR_ADDR 0xD2

// Les autres capteurs potentiels /////////////////////////////

// Capteur de couleurs
#define COLOR               S3
#define COLOR_VAL           SENSOR_3  // Valeur de S3

// Capteur de sons
#define SOUND               S4
#define SOUND_VAL           SENSOR_4  // Valeur de S4
void walkAngle (int direction, long angle) {
  
  ResetTachoCount(MOTORS);
  switch (direction) {
    case FORWARDS:
      // Les moteurs avancent synchronisés à la vitesse de 50 %
      OnFwdReg(MOTORS, 50, OUT_REGMODE_SYNC);
      while (MotorTachoCount(RIGHT_MOTOR) != angle);
      break;
    case BACKWARDS:
      // Les moteurs reculent synchronisés à la vitesse de 50 %
      OnRevReg(MOTORS, 50, OUT_REGMODE_SYNC);
      while (MotorTachoCount(RIGHT_MOTOR) != -angle);
      break;
  }
  Off(MOTORS);
}
void walkDuration (int direction, unsigned long duration) {

  unsigned long t0 = CurrentTick();  // Renvoie le temps en ms
  switch (direction) {
    case FORWARDS:
      // Les moteurs avancent synchronisés à la vitesse de 50 %
      OnFwdReg(MOTORS, 50, OUT_REGMODE_SYNC);
      while (CurrentTick () - t0 < duration);
      break;
    case BACKWARDS:
      // Les moteurs reculent synchronisés à la vitesse de 50 %
      OnRevReg(MOTORS, 50, OUT_REGMODE_SYNC);
      while (CurrentTick () - t0 < duration);
      break;
  }
  Off(MOTORS);
}

NXC et Geany sous Debian 11

NXC est un langage de programmation spécifique au robot Lego Mindstorms NXT. Il est basé sur le NBC, un langage assembleur.

Dans la console :
sudo apt-get install nbc

On va paramétrer Geany pour pouvoir compiler aussi bien des fichiers nxc que nbc. De plus on se basera sur la coloration syntaxique du langage C.

Dans ~/.config/geany, modifier le fichier filetype_extensions.conf :

#~ # Filetype extension configuration file for Geany
#~ # Insert as many items as you want, separate them with a ";".
#~ # See Geany's main documentation for details.
[Extensions]
NXC=*.nxc;*.nbc;

Dans ~/.config/geany/filedefs, créer un fichier filetypes.NXC.conf :

# For complete documentation of this file, please see Geany's main documentation

[styling=C]

[keywords=C]

[lexer_properties=C]

[settings]
lexer_filetype=C

# default extension used when saving files
extension=nxc

# single comments, like # in this file
comment_single=//
# multiline comments
comment_open=/*
comment_close=*/

[indentation]
width=2
# 0 is spaces, 1 is tabs, 2 is tab & spaces
type=0

[build-menu]
# %f will be replaced by the complete filename
# %e will be replaced by the filename without extension
# (use only one of it at one time)
FT_00_LB=Vérifier / Compiler
FT_00_CM=nbc %e.n*c
FT_00_WD=
FT_01_LB=Téléverser
FT_01_CM=nbc -S=usb -d %e.n*c
FT_01_WD=
FT_02_LB=
FT_02_CM=
FT_02_WD=
EX_00_LB=
EX_00_CM=
EX_00_WD=

Dans ~/.config/geany/templates/files, créer un fichier program.nxc :

// Lego Mindstorms NXT

Enregistrer les fichiers sources au format nxc, puis compiler (touche F8). Le téléversement sur la brique NXT se fait avec la touche F9 (ne pas oublier de vérifier que la brique NXT est allumée, sinon Geany indique « Compilation échouée »).

Remarque : Depuis que j’ai mis à jour Debian, le tiret bas (du 8) ne s’affiche plus dans Geany. La solution est de modifier la police de caractères dans Éditer > Préférences > Interface > Polices Éditeur (par exemple Liberation Mono Regular à la place de Monospace Regular).