Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Comment faire un robot de contrôle gestuel à la maison

Composants et fournitures

Arduino UNO
× 1
Arduino Nano R3
× 1
Module Bluetooth HC-05
× 2
Accéléromètre à trois axes et gyroscope SparkFun - MPU-6050
× 1
Moteur CC, 12 V
× 2
roues en caoutchouc
× 1
Texas Instruments Dual H-Bridge Motor Drivers L293D
× 1
Batterie 9V (générique)
× 2

Outils et machines nécessaires

Fer à souder (générique)
Fil à souder, sans plomb
Ruban, mousse
Multitool, Tournevis

Applications et services en ligne

Arduino IDE

À propos de ce projet


Il s'agit de savoir comment fabriquer vous-même une voiture à commande gestuelle. Fondamentalement, il s'agit d'une application simple du gyroscope à 3 axes MPU-6050, de l'accéléromètre. Vous pouvez faire beaucoup plus de choses. en comprenant comment l'utiliser, comment l'interfacer avec Arduino et comment transférer ses données sur les modules Bluetooth. dans cet article, je me concentrerai sur la communication Bluetooth à Bluetooth, entre deux modules Bluetooth HC-05.

Suivez la vidéo pour construire un corps de robot et des connexions pour ce projet.

schéma de connexion pour le robot et l'unité émettrice sont donnés ci-dessous, vous pouvez vous y référer.

PCB de commande directe utilisé dans ce projet depuis PCBway :https://www.pcbway.com/project/shareproject/How_to_Make_Arduino_Based_Edge_Avoiding_Robot.html

Parlons maintenant de la configuration du module Bluetooth. fondamentalement, le module Bluetooth HC-05 est livré avec un réglage d'usine du module esclave. cela signifie que nous pouvons envoyer des données au module simplement en le branchant. aucun autre réglage n'est nécessaire pour envoyer des données depuis des appareils mobiles vers le module HC-05. entrez simplement son mot de passe par défaut (1234/0000) pour le connecter. mais que se passe-t-il si nous voulons envoyer des données en utilisant ce module à un autre module ou à un appareil mobile.

dans ce projet, nous faisons la même chose en envoyant des données via le module Bluetooth. collecté par le capteur gyroscopique mpu-6050 vers un autre module Bluetooth.

donc pour ce faire, nous devons d'abord configurer ces deux modules Bluetooth. afin qu'ils puissent se lier automatiquement les uns aux autres après la mise sous tension. Ici, le premier module agit comme un appareil esclave, qui recevra les signaux de l'unité distante et sera monté sur la voiture. Et configurez le second en tant qu'appareil maître qui agira en tant qu'unités émettrices et enverra des données à l'appareil esclave,

Configurez donc d'abord le premier module Bluetooth en tant que périphérique esclave. pour ce faire, connectez-le à Arduino selon ce schéma de câblage.

Et téléchargez le code par nom configurez.

#include 
SoftwareSerial BTSerial (10, 11); // Réception | TX
configuration void()
{
Serial.begin(9600);
Serial.println("Entrez les commandes AT :");
BTSerial.begin(38400 ); // Vitesse par défaut de HC-05 dans la commande AT more
}
boucle vide()
{
// Continuez à lire à partir de HC-05 et envoyez à Arduino Serial Monitor
if (BTSerial.available())
Serial.write(BTSerial.read());
// Continuez à lire depuis Arduino Serial Monitor et envoyez à HC-05
if (Serial. available())
BTSerial.write(Serial.read());
}

Déconnectez le module. Appuyez et maintenez enfoncé le ky sur le module et reconnectez-le. Vous verrez que la LED sur le module clignote plus lentement. Une fois toutes les 2 secondes. Cela signifie que HC-05 est en mode de commande AT. Maintenant, ouvrez le moniteur série, modifiez le débit en bauds à 9600 et le type de sortie en tant que NL et CR. Tapez maintenant AT dans la boîte d'envoi et envoyez-le. s'il répond par ok, cela signifie que tout va bien. Mais si ce n'est pas le cas et répond avec une erreur, envoyez à nouveau AT. Jusqu'à ce qu'il réponde avec ok ou vérifie les connexions et envoie à nouveau AT …

après avoir obtenu la réponse OK du module, entrez les commandes suivantes une par une,

AT+ORGL et envoyez-le. cette commande mettra le module dans le réglage d'usine.

AT+RMAAD cette commande libérera le module de tout appariement précédent

AT+UART ? vérifier le débit en bauds actuel du module

AT+UART=38400, 0, 0 définit le débit en bauds à 38400

AT+RLE ? vérifiez le rôle s'il est esclave ou maître. il répond par 0 ou 1. si le module est esclave, il répond 0 et s'il s'agit d'un appareil maître alors il répondra par 1

définir le rôle en tant que périphérique esclave. entrez AT+ROLE=0

AT+ADDR ? vérifiez l'adresse du module.

Notez cette adresse. répondu par module. après avoir obtenu cette adresse, la configuration du module esclave est effectuée.

Il est maintenant temps de configurer le deuxième module Bluetooth en tant que périphérique maître. Connectez ce module à la carte Arduino et entrez-le en mode AT. comme nous l'avons fait avec le précédent.

Entrez ces commandes AT dans une séquence donnée.

AT+ORGL

AT+RMAAD

AT+UART ?

AT+UART=38400, 0, 0

AT+RLE ?

définir le rôle de ce module en tant qu'appareil maître. AT+ROLE=1

AT+CMODE=0 pour que le module ne connecte qu'un seul appareil. le paramètre par défaut est 0

associez maintenant ce module à l'appareil esclave pour ce faire, entrez,

AT+BIND=" l'adresse du module esclave" et le tour est joué

installez maintenant des bibliothèques pour le capteur MPU-6050 et une communication I2C. Depuis que le capteur gyroscopique MPU-6050 a une interface I2C. téléchargez les bibliothèques et le code source à partir d'ici :http://www.mediafire.com/file/l8mru5emulb8x93/gesture_control_robot.rar/file

si vous avez préinstallé ces bibliothèques, ignorez ceci.

Connectez maintenant l'unité de voiture au PC à l'aide d'un câble USB. sélectionnez le port com et le type de carte corrects. Et téléchargez le programme par le nom "Gesture_controled_Robot__car_unit_". Assurez-vous que la batterie et le module Bluetooth ne sont pas connectés à la voiture lors du téléchargement du programme.

//programme de Shubham Shinganapure le 3-10-2019
//
//pour la voiture robotique à commande gestuelle
int lm1=8 ; //sortie moteur gauche 1
int lm2=9; //sortie moteur gauche 2
int rm1=10; //sortie moteur droit 1
int rm2=11; //sortie du moteur droit 2
char d=0;
void setup()
{
pinMode(lm1,OUTPUT);
pinMode(lm2,OUTPUT);
pinMode(rm1,OUTPUT);
pinMode(rm2,OUTPUT);
Serial.begin(38400);
sTOP();
}
boucle vide()
{
if(Serial.available()>0)
{
d=Serial.read();
if(d==' F')
{
ForWard();
}
if(d=='B')
{
BackWard();
}
if(d=='L')
{
Gauche();
}
if(d=='R')
{
Droite();
}
if(d=='S')
{
sTOP();
}
}
}
void ForWard()
{
digitalWrite(lm1,HIGH);
digitalWrite(lm2,LOW);
digitalWrite(rm1,HIGH);
digitalWrite(rm2,LOW);
}
void BackWard()
{
digitalWrite(lm1,LOW);
digitalWrite(lm2,HIGH );
digitalWrite(rm1,LOW);
digitalWrite(rm2,HIGH);
}
void Left()
{
digitalWrite(lm1, LOW);
digitalWrite(lm2,HIGH);
digitalWrite(rm1,HIGH);
digitalWrite(rm2,LOW);
}
void Right()
{
digitalWrite(lm1,HIGH);
digitalWrite(lm2,LOW);
digitalWrite(rm1,LOW);
digitalWrite(rm2,HIGH);
}
void sTOP()
{
digitalWrite(lm1,LOW);
digitalWrite(lm2,LOW);
digitalWrite(rm1,LOW);
digitalWrite( rm2,LOW);
}

Faites de même avec la télécommande. ouvrir le programme par son nom à distance. et téléchargez-le sur l'unité distante.

//programme modifié le 10/03/19 par // par Shubham Shinganapure.
//
//pour Voiture robotique à commande gestuelle (télécommande)
#include " I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // pas nécessaire si vous utilisez MotionApps include file
// La bibliothèque Arduino Wire est requise si I2Cdev Implémentation I2CDEV_ARDUINO_WIRE
// est utilisé dans I2Cdev.h
#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
// classe I2C par défaut l'adresse est 0x68
// des adresses I2C spécifiques peuvent être passées en paramètre ici
// AD0 low =0x68 (par défaut pour SparkFun breakout et la carte d'évaluation InvenSense)
// AD0 high =0x69
MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL
// vars de contrôle/statut MPU
bool dmpReady =false ; // défini sur true si l'initialisation DMP a réussi
uint8_t mpuIntStatus; // contient l'octet d'état d'interruption réel du MPU
uint8_t devStatus ; // renvoie l'état après chaque opération de périphérique (0 =succès, !0 =erreur)
uint16_t packetSize; // taille de paquet DMP attendue (la valeur par défaut est de 42 octets)
uint16_t fifoCount; // compte de tous les octets actuellement dans FIFO
uint8_t fifoBuffer[64]; // Tampon de stockage FIFO
VectorFloat Gravity;
Quaternion q;
float ypr[3]; // [lacet, tangage, roulis] conteneur lacet/tangage/rouleau et vecteur de gravité
uint8_t teapotPacket[14] ={ '$', 0x02, 0,0, 0,0, 0,0, 0,0 , 0x00, 0x00, '\r', '\n' };
volatile bool mpuInterrupt =false; // indique si la broche d'interruption MPU est devenue haute
void dmpDataReady() {
mpuInterrupt =true;
}
#include
SoftwareSerial BTSerial( 10, 11); // Réception | TX
int bt=8;
int x =1;
void setup() {
#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR =24 ; // Horloge I2C 400kHz (200kHz si CPU est à 8MHz)
#elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
// initialiser série communication
// (115200 choisi car requis pour la sortie Teapot Demo, mais c'est
// vraiment à vous en fonction de votre projet)
Serial.begin(115200);
BTSerial.begin(38400);
// while (!Serial); // attendre l'énumération Leonardo, les autres continuent immédiatement
Serial.println(F("Initializing I2C devices..."));
mpu.initialize();
// vérifier la connexion
Serial.println(F("Test des connexions de l'appareil..."));
Serial.println(mpu.testConnection() ? F("Connexion MPU6050 réussie") :F("Echec de la connexion MPU6050" ));
// attendre prêt
// charger et configurer le DMP
Serial.println(F("Initializing DMP..."));
devStatus =mpu .dmpInitialize();
// fournissez vos propres décalages de gyroscope ici, mis à l'échelle pour une sensibilité minimale
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu. setZGyroOffset(-85);
mpu.setZAccelOffset(1788) ;
// assurez-vous que cela a fonctionné (renvoie 0 si oui)
if (devStatus ==0) {
/ / activer le DMP, maintenant qu'il est prêt
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);
//activer l'interruption Arduino détection
Serial.println(F("Activation de la détection d'interruption (interruption externe Arduino 0)..."));
a ttachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus =mpu.getIntStatus();
// définir notre indicateur DMP Ready pour que la fonction principale loop() sache qu'il est possible de l'utiliser
Serial .println(F("DMP prêt ! En attente de la première interruption..."));
dmpReady =true;
// obtenir la taille de paquet DMP attendue pour une comparaison ultérieure
packetSize =mpu.dmpGetFIFOPacketSize();
} else {
// ERREUR !
// 1 =échec du chargement initial de la mémoire
// 2 =échec des mises à jour de la configuration DMP
// (en cas de panne, généralement le code sera 1)
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
// configurer la LED pour la sortie
pinMode(bt,INPUT);
}
// =================================================================
// ===BOUCLE DE PROGRAMME PRINCIPAL ===
// ================================================================
boucle vide() {
if(digitalRead(bt)==HIGH)
{
x++;
delay(150);
}
if((x%2)==0) {
// si la programmation a échoué, n'essayez pas de faire quoi que ce soit
si (!dmpReady) revient ;
// attendez l'interruption du MPU ou des paquets supplémentaires disponibles
while (!mpuInterrupt &&fifoCount // d'autres trucs sur le comportement du programme ici
// .
// .
// .
// si vous êtes vraiment paranoïaque, vous pouvez fréquemment tester entre d'autres
// trucs pour voir si mpuInterrupt est vrai, et si c'est le cas, "break;" de la boucle
// while() pour traiter immédiatement le MPU data
// .
// .
// .
}
// réinitialiser l'indicateur d'interruption et obtenir l'octet INT_STATUS
mpuInterrupt =false ;
mpuIntStatus =mpu.getIntStatus();
// obtenir le compte FIFO actuel
fifoCount =mpu.getFIFOCount();
// vérifier le débordement (cela ne devrait jamais arriver à moins que notre code ne soit trop inefficace)
if ((mpuIntStatus &0x10) || fifoCount ==1024) {
// réinitialiser afin que nous puissions continuer proprement
mpu.resetFIFO();
Serial.println(F("FIFO overflow !"));
// sinon, vérifiez l'interruption de la disponibilité des données DMP (cela devrait se produire fréquemment)
} else if (mpuIntStatus &0x02) {
// attendez la longueur correcte des données disponibles, devrait être une attente TRÈS courte
while (fifoCount // lire un paquet depuis FIFO
mpu.getFIFOBytes(fifoBuffer, packetSize);
// suivre le nombre FIFO ici au cas où il y aurait> 1 paquet disponible
// (cela nous permet d'en lire plus immédiatement sans attendre une interruption)
fifoCount -=packetSize;
#ifdef OUTPUT_READABLE_YAWPITCHROLL
// display Angles d'Euler en degrés
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
Série .print("ypr\t");
Serial.print(ypr[0] * 180/M_PI);
Serial.print("\t");
Serial.print( ypr[1] * 180/M_PI);
Série .print("\t");
Série.println(ypr[2] * 180/M_PI);
if((ypr[1] * 180/M_PI)<=-25)
{BTSerial.write('F');
}
else if((ypr[1] * 180/M_PI)>=25)
{BTSerial.write('B' );
}
else if((ypr[2] * 180/M_PI)<=-25)
{BTSerial.write('L');
}
else if((ypr[2] * 180/M_PI)>=20)
{BTSerial.write('R');
}
else{
BTSerial. write('S');
}
#endif
}
}
else{
BTSerial.write('S');
}
}

Insérez le module Bluetooth esclave sur l'unité de voiture et maîtrisez le module Bluetooth sur l'unité distante. Et tout est fait.

Allumons-le et il est prêt à jouer…….



Espérant que ceci puisse t'être utile. si oui, aimez-le, partagez-le, commentez votre doute. Pour plus de tels projets, suivez-moi! Soutenez mon travail et abonnez-vous à ma chaîne sur YouTube.

Merci !

Code

  • Robot à commande gestuelle (unité distante)
Robot à commande gestuelle (télécommande)Arduino
//programme modifié le 10/03/19 par // par Shubham Shinganapure. ////pour la voiture robotisée à commande gestuelle (télécommande)#include "I2Cdev.h"#include "MPU6050_6Axis_MotionApps20.h"//#include "MPU6050.h" // pas nécessaire si vous utilisez MotionApps include file// La bibliothèque Arduino Wire est requis si l'implémentation I2CDEV I2CDEV_ARDUINO_WIRE// est utilisé dans I2Cdev.h#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE #include "Wire.h"#endif// l'adresse I2C par défaut de la classe est 0x68// des adresses I2C spécifiques peuvent être passées en paramètre ici// AD0 bas =0x68 (par défaut pour SparkFun breakout et carte d'évaluation InvenSense)// AD0 haut =0x69MPU6050 mpu;#define OUTPUT_READABLE_YAWPITCHROLL// MPU control/status varsbool dmpReady =false; // défini sur true si l'initialisation DMP a réussiuint8_t mpuIntStatus ; // contient l'octet d'état d'interruption réel de MPUuint8_t devStatus ; // renvoie l'état après chaque opération de périphérique (0 =succès, !0 =erreur)uint16_t packetSize; // taille de paquet DMP attendue (la valeur par défaut est de 42 octets)uint16_t fifoCount ; // compte de tous les octets actuellement dans FIFOuint8_t fifoBuffer[64] ; // Tampon de stockage FIFOVectorFloat Gravity; quaternion q; flottant ypr[3] ; // [lacet, tangage, roulis] conteneur lacet/tangage/rouleau et gravité vectoruint8_t teapotPacket[14] ={ '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };volatile bool mpuInterrupt =false; // indique si la broche d'interruption MPU est devenue highvoid dmpDataReady() { mpuInterrupt =true;}#include SoftwareSerial BTSerial (10, 11); // Réception | TXint bt=8;int x =1;void setup() { #if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR =24 ; // Horloge I2C 400kHz (200kHz si CPU est à 8MHz) #elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // initialise la communication série // (115200 choisi car il est requis pour la sortie Teapot Demo, mais c'est // vraiment à vous de décider selon votre projet) Serial.begin(115200); BTSerial.begin(38400); // while (!Serial); // attend l'énumération Leonardo, les autres continuent immédiatementSerial.println(F("Initializing I2C devices...")); mpu.initialize(); // vérifier la connexion Serial.println(F("Testing device connections...")); Serial.println(mpu.testConnection() ? F("Connexion MPU6050 réussie") :F("Connexion MPU6050 échouée")); // attendre prêt // charger et configurer le DMP Serial.println(F("Initializing DMP...")); devStatus =mpu.dmpInitialize(); // fournissez vos propres décalages de gyroscope ici, mis à l'échelle pour une sensibilité minimale mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788) ; // assurez-vous que cela a fonctionné (renvoie 0 si oui) if (devStatus ==0) { // allume le DMP, maintenant qu'il est prêt Serial.println(F("Enabling DMP...")); mpu.setDMPEnabled(true); // active la détection d'interruption Arduino Serial.println(F("Activation de la détection d'interruption (interruption externe Arduino 0)...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus =mpu.getIntStatus(); // définit notre indicateur DMP Ready pour que la fonction principale loop() sache qu'elle peut être utilisée Serial.println(F("DMP ready ! En attente de la première interruption...")); dmpPrêt =vrai ; // obtenir la taille de paquet DMP attendue pour une comparaison ultérieure packetSize =mpu.dmpGetFIFOPacketSize(); } else { // ERREUR ! // 1 =échec du chargement initial de la mémoire // 2 =échec des mises à jour de la configuration DMP // (en cas de panne, le code sera généralement 1) Serial.print(F("DMP Initialization failed (code ")); Serial. print(devStatus);Série.println(F(")")); } // configurer la LED pour la sortie pinMode(bt,INPUT); }// ================================================================// ===BOUCLE DE PROGRAMME PRINCIPAL ===// ================================================================boucle vide() { si (digitalRead(bt)==HIGH) { x++; retard (150); } if((x%2)==0){ // si la programmation a échoué, n'essayez pas de faire quoi que ce soit si (!dmpReady) return ; // attend l'interruption du MPU ou des paquets supplémentaires disponibles pendant que (!mpuInterrupt &&fifoCount 1 paquet disponible // (cela nous permet d'en lire plus immédiatement sans attendre une interruption) fifoCount -=packetSize; #ifdef OUTPUT_READABLE_YAWPITCHROLL // affiche les angles d'Euler en degrés mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); Serial.print("ypr\t"); Serial.print(ypr[0] * 180/M_PI); Serial.print("\t"); Serial.print(ypr[1] * 180/M_PI); Serial.print("\t"); Serial.println(ypr[2] * 180/M_PI); if((ypr[1] * 180/M_PI)<=-25) {BTSerial.write('F'); } else if((ypr[1] * 180/M_PI)>=25) {BTSerial.write('B'); } else if((ypr[2] * 180/M_PI)<=-25) {BTSerial.write('L'); } else if((ypr[2] * 180/M_PI)>=20) {BTSerial.write('R'); } else{ BTSerial.write('S'); } #endif } } else{ BTSerial.write('S'); }}

Schémas


Processus de fabrication

  1. Comment créer une plate-forme robotique Arduino+Raspberry Pi
  2. Fabriquer une machine à écrire pour les devoirs à la maison
  3. Obstacles pour éviter le robot avec servomoteur
  4. Robot suiveur de ligne
  5. Comment créer un bouton de clavier personnalisable personnalisable
  6. Robot assistant domestique autonome
  7. Comment faire de la musique avec un Arduino
  8. Comment créer une ouverture de porte automatique basée sur Arduino
  9. Robot pour une navigation intérieure super cool