Ceci est une ancienne révision du document !
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.