Archives du blog

Robocarton piloté par Nunchuk

Et non Robocarton n’est pas à la plage, meme s’il aimerait surement. Mais son dermatologue lui a déconseillé, il parrait que l’eau ne lui ferait pas du bien. Donc il est resté à la maison et j’ai pu le faire évoluer. Le but de la manœuvre a été de le faire piloter via un vieux Nunchuk dont le fil était coupé (je vous rassure il existe aussi des adaptateurs pour éviter de le massacrer).

Cela faisait un bout de temps que je tâtonnais mais je m’étais fait avoir par les code couleurs des fils qui ne correspondent à rien de censé (c’est un nunchuk « compatible », pas « officiel »).

Le nunchuk que je possede a ce cablage là :

  • Jaune : 3.3V
  • Rouge : Gnd
  • Bleu : A5 (clk)
  • Blanc : A4 (data)

D’autre part j’avais trouvé une Démo permettant de piloter un arduino à partir du nunchuk, mais la forme ne me plaisait pas (mettre du code dans un .h, j’entends encore certains professeurs hurler ^^).

Alors que j’étais parti pour en faire une librairie je suis tombé sur une implémentation par Gabriel Bianconi  dudit code.

Cette librairie est à déposer comme d’habitude dans le répertoire ~/sketchbook/libraries/.

Le code suivant une fois compilé  et envoyé il est  donc possible de :

  • faire lever/baisser les bras en bougeant le joystick vers le haut/bas
  • faire tourner la tête en bougeant le joystick vers la droite/gauche
  • allumer les leds en appuyant sur le bouton Z

(le code est aussi accessible sur google code)

#include <Servo.h> 
#include <Wire.h>
#include <ArduinoNunchuk.h>
Servo myServoTete;
Servo myServoBrasDroit;
Servo myServoBrasGauche;
#define BAUDRATE 19200
#define SERVO_BRAS_DROIT 7
#define SERVO_BRAS_GAUCHE 5
#define SERVO_TETE 6
#define LED_GAUCHE 9
#define LED_DROITE 8
#define LED_PECTORAL 10
ArduinoNunchuk nunchuk = ArduinoNunchuk();
#define MIN_JOY 0
#define MAX_JOY 255
#define MIN_SERVO 1
#define MAX_SERVO 181
int oldAngleTete = 0;
int oldAngleBrasDroit = 0;
int oldAngleBrasGauche = 0;
int oldStatusBoutonZ = 0;
void setup ()
{
 Serial.begin(BAUDRATE);
 nunchuk.init();
 myServoTete.attach( SERVO_TETE );
 myServoBrasDroit.attach( SERVO_BRAS_DROIT );
 myServoBrasGauche.attach( SERVO_BRAS_GAUCHE );

 pinMode( LED_GAUCHE, OUTPUT);
 pinMode( LED_DROITE, OUTPUT); 
 pinMode( LED_PECTORAL, OUTPUT); 
}
void loop ()
{
 nunchuk.update();
 int angleTete = (int) (( (float) nunchuk.analogX / ( MAX_JOY - MIN_JOY ) ) * ( MAX_SERVO - MIN_SERVO ) + MIN_SERVO);
if ( angleTete != oldAngleTete )
 {
 myServoTete.write( angleTete );
 oldAngleTete = angleTete;
 }

 int angleBrasGauche = (int) (( (float) nunchuk.analogY / ( MAX_JOY - MIN_JOY ) ) * ( MAX_SERVO - MIN_SERVO ) + MIN_SERVO);
 if ( angleBrasGauche != oldAngleBrasGauche )
 {
 myServoBrasGauche.write( angleBrasGauche );
 myServoBrasDroit.write( MAX_SERVO - angleBrasGauche );
 oldAngleBrasGauche = angleBrasGauche;
 }

 int statusBoutonZ = nunchuk.zButton;

 if ( oldStatusBoutonZ != statusBoutonZ )
 {
 digitalWrite( LED_GAUCHE, (statusBoutonZ == 1 ? HIGH : LOW ) );
 digitalWrite( LED_DROITE, (statusBoutonZ == 1 ? HIGH : LOW ) );
 digitalWrite( LED_PECTORAL, (statusBoutonZ == 1 ? HIGH : LOW ) ); 
 oldStatusBoutonZ = statusBoutonZ;
 }
}

Je laisse mon fils vous faire une démo (c’est dire si la robotique c’est un jeu d’enfant 😉 ) :


Robocarton piloté par un nunchuk

Publicités

Laissez moi vous présenter : Robocarton

Une petite création avec laquelle je compte jouer :

Image

2 leds pour les yeux, 1 sur le thorax (pour faire comme son idole), 2 servos pour bouger les bras et un pour bouger la tête. C’est un bon début pour faire des choses rigolottes.

Pour le moment il dit bonjour :

Image

et c’est déjà pas mal ^^

Son code source est disponible ici