Sommaire
P.I.L.T - Le Gant Arduino pour Dompter vos Robots
Présentation
Le Gant mécanique Arduino est un gant révolutionnaire équipé d’un module accéléromètre gyroscope MPU6050 pour capturer les mouvements de la main et de cinq potentiomètres pour traduire les gestes des doigts. Le tout repose sur une carte Arduino UNO, rendant le dispositif aussi robuste que flexible. Son port USB facilite sa programmation via l’IDE Arduino, permettant aux utilisateurs de personnaliser ses fonctions en toute simplicité.
Ce gant high-tech est également doté d’une batterie rechargeable et d’un interrupteur ON/OFF, le rendant à la fois puissant et facile à utiliser. Que vous soyez un passionné de robotique ou un professionnel cherchant à optimiser le contrôle de vos robots, le P.I.L.T est l’outil parfait pour vous.
Fonctionnalités Clés
- Communication Intuitive : Le Gant mécanique Arduino communique sans faille avec divers robots, que ce soit des châssis mobiles, des bras robotisés, des quadrupèdes ou des hexapodes.
- Synchronisation Simplifiée : Livré avec un module HC-08 supplémentaire, la synchronisation est automatique dès la mise sous tension, facilitant ainsi son association avec d’autres modules HC-08.
- Gestion Optimisée : Un bouton DEL permet de désenregistrer l’adresse du HC-08 secondaire, assurant une désynchronisation aisée pour une nouvelle association.
Avec ces fonctionnalités, le Gant mécanique Arduino offre une solution pratique et efficace pour le contrôle de vos robots, alliant simplicité d’utilisation et performance.
Programmation du Gant mécanique Arduino
/*Projet: PILT - PLAY IT LIKE THANOS
* Auteur: Christian Joseph
* Date:15.08.2019
* www.eagle-robotics.com
*/
#include "Wire.h"
#include "Servo.h"
#include "SoftwareSerial.h"
#define BTH_RX 11
#define BTH_TX 12
const int MPU_addr=0x68;
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
double x; double y; double z;
int minVal=265; int maxVal=402;
char a;
SoftwareSerial Bth(BTH_RX, BTH_TX);
void setup(){
// INIT POTENTIOMETRES DOIGTS
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A6, INPUT);
//INIT MPU6050
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
//INIT MODULE HC08 EN MODE MAITRE
Bth.begin(9600);
Bth.print("AT+ROLE=M"); //
delay(100);
Bth.print("AT+RESET"); //
delay(250);
}
void loop(){
//VARIABLE DE LECTURE ETAT POTENTIOMETRES
int val = analogRead(A0);
int val1 = analogRead(A1);
int val2 = analogRead(A2);
int val3 = analogRead(A3);
int val4 = analogRead(A6);
//LECTURE POTENTIOMETRES ; les paramètres 2500 et 500 sont à modifier selon le gant
//de sorte à avoir les données val à val4 autour de 2000
//Si valeur < 2000 = doigt plié et si valeur > 2000 = doigt tendu
val = map(analogRead(A0), 0, 150, 2500, 500);
val1 = map(analogRead(A1), 0, 150, 2500, 500);
val2 = map(analogRead(A2), 0, 150, 2500, 500);
val3 = map(analogRead(A3), 0, 150, 2500, 500);
val4 = map(analogRead(A6), 0, 100, 2500, 500);
Serial.println(val);
Serial.println(val1);
Serial.println(val2);
Serial.println(val3);
Serial.println(val4);
Serial.println(" ");
if (val1 < 2000 && val2 < 2000 && val3 < 2000 && val4 < 2000){ //Tous les doigts repliés, poing fermé
Serial.println("mode g/d active"); // activation mode tourner à gauche ou à droite
if (y > 260 && y < 320){
Serial.println("gauche"); // Main penchée à gauche - Le robot tourne à gauche
Bth.write('d');
while(y > 260 && y < 320){
delay(1);
pos();
}
Serial.println("exit de gauche");
Bth.write('s');
}
else if (y > 40 && y < 130){
Serial.println("droite"); // Main penchée à droite - Le robot tourne à droite
Bth.write('c');
while(y > 40 && y < 130){
delay(1);
pos();
}
Serial.println("exit de droite");
Bth.write('s');
}
}
else if (val1 > 2000 && val2 > 2000 && val3 < 2000 && val4 < 2000){ //index et majeur tendus, autres doigts pliés
Serial.println("mode m/a active"); // activation mode marche avant et arrière
if (x > 0 && x < 80){
Serial.println("avant"); // Main penchée en avant - Le robot avance
Bth.write('f');
while(x > 0 && x < 80){
delay(1);
pos();
}
Serial.println("exit de avant");
Bth.write('s');
}
else if (x > 270 && x < 315){
Serial.println("arriere"); // Main penchée en arrière - Le robot fait marche arrière
Bth.write('b');
while(x > 270 && x < 315){
delay(1);
pos();
}
Serial.println("exit de arriere");
Bth.write('s');
}
}
else if (val1 > 2000 && val2 > 2000 && val3 > 2000 && val4 > 2000){
Serial.println("mode stop active");
Bth.write('x');
}
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true);
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
int xAng = map(AcX,minVal,maxVal,-90,90); int yAng = map(AcY,minVal,maxVal,-90,90); int zAng = map(AcZ,minVal,maxVal,-90,90);
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI); z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
Serial.print("AngleX= "); Serial.println(x);
Serial.print("AngleY= "); Serial.println(y);
Serial.print("AngleZ= "); Serial.println(z); Serial.println("-----------------------------------------");
}
void pos(){
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
/*Serial.print("AcX = "); Serial.print(AcX); //Accéléromètre X
Serial.print(" | AcY = "); Serial.print(AcY); //Accéléromètre Y
Serial.print(" | AcZ = "); Serial.print(AcZ); //Accéléromètre Z
Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //Température
Serial.print(" | GyX = "); Serial.print(GyX); // Gyroscope X
Serial.print(" | GyY = "); Serial.print(GyY); // Gyroscope Y
Serial.print(" | GyZ = "); Serial.println(GyZ); // Gyroscope Z
*/
int xAng = map(AcX,minVal,maxVal,-90,90); int yAng = map(AcY,minVal,maxVal,-90,90); int zAng = map(AcZ,minVal,maxVal,-90,90);
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI); z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
} //Fin du programme
#Côté Récepteur
#include "SoftwareSerial.h"
SoftwareSerial BT (2,3);
char a;
void setup()
{ Serial.begin(9600);
BT.begin(9600);
}
void loop()
{
if (BT.available())
{
a=(BT.read());
if (a=='f')
{
while(a != 's'){
a = (BT.read());
Serial.println("Robot en avant");
}
}
else if (a=='b')
{
while(a != 's'){
a = (Serial.read());
Serial.println("Robot en arrière");
}
}
else if (a=='c')
{
while(a != 's'){
a = (Serial.read());
Serial.println("Robot à droite");
}
}
else if (a=='d')
{
while(a != 's'){
a = (Serial.read());
Serial.println("Robot à gauche");
}
}
Conclusion
Le Gant mécanique Arduino pour Dompter vos Robots est bien plus qu’un simple accessoire. Il représente une avancée significative dans le domaine de la robotique, offrant un contrôle intuitif et puissant sur une variété de robots. Que vous soyez un passionné de robotique ou un professionnel cherchant à optimiser vos projets, le Gant mécanique Arduino est l’outil parfait pour vous.
Ne manquez pas l’opportunité de transformer votre expérience de robotique. Adoptez le Gant mécanique Arduino dès aujourd’hui et prenez le contrôle total de vos robots. Commandez maintenant et commencez à explorer les possibilités infinies que ce gant révolutionnaire a à offrir !