Cette partie comporte 3 moteurs munis de roues omnidirectionnelles. Une bonne partie du matériel était déjà disponible au lab et dans mes stocks personnels. J'ai acheté les roues et les servo-moteurs chez hackspark. Attention, ce ne sont pas n'importe quels servo-moteurs, ce sont des servos à 360, c'est à dire dont on règle la vitesse plutôt que la position.
Les roues omnidirectionnelles ne s'adaptaient pas aux servo-moteurs, j'ai donc réimprimé la partie centrale et gardé uniquement les petites roulettes. Vous pouvez regarder et télécharger le modèle ici :
Les roulettes se clipsent directement sur la partie centrale. La partie centrale se visse sur n'importe lequel des adaptateurs fournis avec les servos.
Et voici les 3 roues assemblées et montées sur leur moteur :
J'ai conçu une pièce pour assembler les moteurs entre eux :
Modèle 3D du support de moteurs x2
L'assemblage s'est fait avec des serre-cables car je n'avait plus de vis, je remplacerais cette attache plus tard.
J'ai rapidement assemblé un PCB pour faciliter les branchements. Les 3 moteurs se contrôlent avec 1 fils (blanc), les 2 autres fils étant vcc (rouge) et gnd (noire). Les pins de contrôle choisies sur le rfduino sont gpio 2, gpio 3 et gpio 4.
J'ai laissé des trous sous le robot pour pouvoir ajuster les potentiomètres des servos. Ces potentiomètres servent à déterminer le zéro, c'est à dire le point à partir duquel le moteur s'immobilise puis change de sens.
Et voici le code rfduino qui anime cette petite plateforme robotique :
/** * BB8 * By Arthur Hennequin (Karang) * @PMClab **/ #include <Servo.h> #include <RFduinoBLE.h> Servo s1; Servo s2; Servo s3; #define cos60 0.5 #define sin60 0.866 int X = 0; int Y = 0; void setup() { s1.attach(2); s2.attach(3); s3.attach(4); RFduinoBLE.deviceName = "BB8"; RFduinoBLE.advertisementInterval = 675; RFduinoBLE.advertisementData = "Ball Robot"; RFduinoBLE.begin(); } int clamp(int v, int a, int b) { return max(a, min(v, b)); } void loop() { float m1 = -X; float m2 = X*cos60 - Y*sin60; float m3 = X*cos60 + Y*sin60; s1.write(clamp((m1+128)*180/255, 0, 180)); s2.write(clamp((m2+128)*180/255, 0, 180)); s3.write(clamp((m3+128)*180/255, 0, 180)); delay(100); } void RFduinoBLE_onReceive(char *data, int len){ X = data[2]-128; Y = data[3]-128; }
Ce code utilise l'appli SBBLEController. En jouant un peu avec le robot, on remarque qu'il a tendance à tourner un peu sur lui même à cause des petites différences de réglage entre les moteurs. Pour corriger cela, la prochaine étape est d'ajouter une centrale inertielle.
On utilise la centrale inertielle (IMU) EY88 vendue chez electrodragon. Elle inclus un baromètre, accéléromètre, gyroscope et un magnétomètre.
Je réutilise les bibliothèques MathHelper, IMU et PID développées lors d’un de mes précédents projets (Drone bluetooth). Le code source complet est disponible au téléchargement.
Vous pouvez télécharger le code complet après l'ajout de la centrale inertielle : https://dl.dropboxusercontent.com/u/99253345/BB8-MovingCore.zip