Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Hoe maak je thuis een robot met gebarenbesturing

Componenten en benodigdheden

Arduino UNO
× 1
Arduino Nano R3
× 1
HC-05 Bluetooth-module
× 2
SparkFun Triple Axis Accelerometer en Gyro Breakout - MPU-6050
× 1
DC-motor, 12 V
× 2
rubberen wielen
× 1
Texas Instruments Dual H-Bridge motordrivers L293D
× 1
9V-batterij (algemeen)
× 2

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
Soldeerdraad, loodvrij
Tape, schuim
Multitool, schroevendraaier

Apps en online services

Arduino IDE

Over dit project


Dit gaat over hoe je zelf een gebarengestuurde auto kunt maken. In principe is dit een eenvoudige toepassing van de MPU-6050 3-assige gyroscoop, versnellingsmeter. Je kunt nog veel meer dingen doen. door te begrijpen hoe het te gebruiken, hoe het te communiceren met Arduino en hoe de gegevens over de Bluetooth-modules kunnen worden overgedragen. in dit artikel zal ik me concentreren op Bluetooth naar Bluetooth-communicatie, tussen twee HC-05 Bluetooth-modules.

Volg de video om een ​​robotlichaam en verbindingen voor dit project te bouwen.

aansluitschema voor robot en zendereenheid worden hieronder gegeven, u kunt ze raadplegen.

Direct bestellen van PCB's die in dit project worden gebruikt bij PCBway:https://www.pcbway.com/project/shareproject/How_to_Make_Arduino_Based_Edge_Avoiding_Robot.html

Laten we het nu hebben over de configuratie van de Bluetooth-module. in principe wordt de HC-05 Bluetooth-module geleverd met een fabrieksinstelling voor de slave-module. dat betekent dat we data naar module jus kunnen sturen door hem in te pluggen. Het is niet nodig om een ​​andere instelling te doen om data van mobiele apparaten naar de HC-05 module te sturen. voer gewoon het standaardwachtwoord (1234/0000) in om verbinding mee te maken. maar wat als we gegevens willen verzenden met deze module naar een andere zelfde module of naar een mobiel apparaat.

in dit project doen we hetzelfde door gegevens via de Bluetooth-module te verzenden. verzameld door de mpu-6050 gyrosensor naar de andere Bluetooth-module.

dus om dit te doen Eerst moeten we deze twee Bluetooth-modules configureren. zodat ze automatisch met elkaar kunnen binden na het inschakelen. Hier fungeert de eerste module als een slave-apparaat, dat signalen van de externe eenheid ontvangt en op de auto wordt gemonteerd. En configureer de tweede als een master-apparaat dat zal fungeren als zendereenheden en gegevens naar het slave-apparaat zal sturen,

Configureer dus eerst de eerste bluetooth module als slave device. om dit te doen verbind het met Arduino volgens dit bedradingsschema.

En upload de code op naam configure.

#include 
SoftwareSerial BTSerial(10, 11); // RX | TX
void setup()
{
Serial.begin(9600);
Serial.println("Voer AT-commando's in:");
BTSerial.begin(38400 ); // HC-05 standaardsnelheid in AT-commando meer
}
void loop()
{
// Blijf lezen van HC-05 en stuur naar Arduino Serial Monitor
if (BTSerial.available())
Serial.write(BTSerial.read());
// Blijf lezen vanaf Arduino Serial Monitor en stuur naar HC-05
if (Serial. available())
BTSerial.write(Serial.read());
}

Koppel de module los. Houd de ky op de module ingedrukt en sluit deze weer aan. U zult zien dat de led aan module langzamer gaat knipperen. Eens per 2 seconden. Dit betekent dat de HC-05 in de AT-commandomodus staat. Open nu de seriële monitor, verander de baudrate naar 9600 en voer het type uit als zowel NL als CR. Typ nu AT in het verzendvak en verzend het. als het antwoordt met ok, betekent dit dat alles goed is. Maar als dit niet het geval is, en antwoordt met een fout, stuur AT dan opnieuw. Totdat het antwoordt met ok of chek-verbindingen en AT opnieuw verzendt ...

nadat u een OK-antwoord van de module hebt gekregen, voert u de volgende opdrachten één voor één in,

AT+ORGL en verstuur het. dit commando zet de module in de fabrieksinstelling.

AT+RMAAD dit commando zal de module vrijgeven van elke eerdere koppeling

AT+UART? controleer de huidige baudrate van de module

AT+UART=38400, 0, 0 stel de baudrate in op 38400

BIJ+ROL? controleer de rol of het slaaf of meester is. het antwoordt met 0 of 1. als de module slave is, antwoordt het 0 en als het masterapparaat is, zal het antwoorden met 1

rol instellen als een slave-apparaat. voer AT+ROLE=0 in

AT+ADDR? controleer het module-adres.

Noteer dit adres. per module beantwoord. na het verkrijgen van dit adres is de configuratie voor de slave-module voltooid.

Nu is het tijd om de tweede Bluetooth-module als masterapparaat te configureren. Verbind deze module met het Arduino-bord en voer deze in de AT-modus in. zoals we deden met de vorige.

Voer deze AT-commando's in de gegeven volgorde in.

AT+ORGL

AT+RMAAD

AT+UART?

AT+UART=38400, 0, 0

BIJ+ROL?

stel de rol van deze module in als het hoofdapparaat. AT+ROLE=1

AT+CMODE=0 zodat de module slechts één apparaat zal verbinden. standaardinstelling is 0

bind deze module nu met het slave-apparaat om dit te doen enter,

AT+BIND=" het adres van de slave-module" en klaar

installeer nu bibliotheken voor MPU-6050-sensor en I2C-communicatie. Aangezien de gyrosensor MPU-6050 een I2C-interface heeft. download bibliotheken en broncode van hier:http://www.mediafire.com/file/l8mru5emulb8x93/gesture_control_robot.rar/file

als je deze bibliotheken vooraf hebt geïnstalleerd, sla dit dan over.

Verbind nu de auto-unit met de pc met behulp van een USB-kabel. selecteer de juiste com-poort en bordtype. En upload het programma met de naam "Gesture_controled_Robot__car_unit_". Zorg ervoor dat de batterij en Bluetooth-module niet zijn verbonden met de auto tijdens het uploaden van het programma.

//program by Shubham Shinganapure op 3-10-2019
//
//voor gebarengestuurde robotauto
int lm1=8; //linker motoruitgang 1
int lm2=9; //linker motoruitgang 2
int rm1=10; //rechter motoruitgang 1
int rm2=11; //rechter motoruitgang 2
char d=0;
void setup()
{
pinMode(lm1,OUTPUT);
pinMode(lm2,OUTPUT);
pinMode(rm1,OUTPUT);
pinMode(rm2,OUTPUT);
Serial.begin(38400);
sTOP();
}
void loop()
{
if(Serial.available()>0)
{
d=Serial.read();
if(d==' F')
{
ForWard();
}
if(d=='B')
{
BackWard();
}
if(d=='L')
{
Links();
}
if(d=='R')
{
Rechts();
}
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, LAAG);
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);
}

Doe hetzelfde met de afstandsbediening. open programma op naam op afstand. en upload het naar de afstandsbediening.

//programma gewijzigd op 3/10/19 door // door Shubham Shinganapure.
//
//voor gebarengestuurde robotauto (afstandsbediening)
#include " I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // niet nodig bij gebruik van MotionApps include file
// Arduino Wire-bibliotheek is vereist als I2Cdev I2CDEV_ARDUINO_WIRE implementatie
// wordt gebruikt in I2Cdev.h
#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
// class standaard I2C adres is 0x68
// specifieke I2C-adressen kunnen hier als parameter worden doorgegeven
// AD0 laag =0x68 (standaard voor SparkFun breakout en InvenSense evaluatiebord)
// AD0 hoog =0x69
MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL
// MPU-besturing/status vars
bool dmpReady =false; // stel waar in als DMP init succesvol was
uint8_t mpuIntStatus; // bevat actuele interruptstatusbyte van MPU
uint8_t devStatus; // retourstatus na elke apparaatbewerking (0 =geslaagd, !0 =fout)
uint16_t packetSize; // verwachte DMP-pakketgrootte (standaard is 42 bytes)
uint16_t fifoCount; // telling van alle bytes momenteel in FIFO
uint8_t fifoBuffer[64]; // FIFO-opslagbuffer
VectorFloat-zwaartekracht;
Quaternion q;
float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container en zwaartekracht vector
uint8_t teapotPacket[14] ={ '$', 0x02, 0,0, 0,0, 0,0, 0,0 , 0x00, 0x00, '\r', '\n' };
vluchtige bool mpuInterrupt =false; // geeft aan of de MPU-interrupt-pin hoog is geworden
void dmpDataReady() {
mpuInterrupt =true;
}
#include
SoftwareSerial BTSerial( 10, 11); // RX | TX
int bt=8;
int x =1;
void setup() {
#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR =24; // 400kHz I2C-klok (200kHz als CPU 8MHz is)
#elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
// initialiseer serieel communicatie
// (115200 gekozen omdat het vereist is voor de uitvoer van theepotdemo's, maar het is helemaal aan jou, afhankelijk van je project)
Serial.begin(115200);
BTSerial.begin(38400);
// while (!Serial); // wacht op Leonardo-opsomming, anderen gaan onmiddellijk verder
Serial.println(F("Initializing I2C devices..."));
mpu.initialize();
// verifieer verbinding
Serial.println(F("Test apparaatverbindingen..."));
Serial.println(mpu.testConnection() ? F("MPU6050 verbinding succesvol") :F("MPU6050 verbinding mislukt" ));
// wacht tot klaar
// laad en configureer de DMP
Serial.println(F("Initializing DMP..."));
devStatus =mpu .dmpInitialize();
// geef hier uw eigen gyro-offsets op, geschaald voor minimale gevoeligheid
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu. setZGyroOffset(-85);
mpu.setZAccelOffset(1788);
// zorg ervoor dat het werkte (retourneert 0 als dat zo is)
if (devStatus ==0) {
/ / schakel de DMP in, nu deze gereed is
Serial.println(F("DMP inschakelen..."));
mpu.setDMPEnabled(true);
// Arduino-onderbreking inschakelen detectie
Serial.println(F("Interruptdetectie inschakelen (Arduino externe interrupt 0)..."));
a ttachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus =mpu.getIntStatus();
// stel onze DMP Ready-vlag zo in dat de hoofdlus()-functie weet dat het goed is om deze te gebruiken
Seriële .println(F("DMP klaar! Wachten op eerste interrupt..."));
dmpReady =true;
// haal de verwachte DMP-pakketgrootte op voor latere vergelijking
packetSize =mpu.dmpGetFIFOPacketSize();
} else {
// ERROR!
// 1 =initiële geheugenbelasting mislukt
// 2 =DMP-configuratie-updates mislukt
// (als het kapot gaat, meestal de code zal zijn 1)
Serial.print(F("DMP-initialisatie mislukt (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
// configureer LED voor uitgang
pinMode(bt,INPUT);
}
// ================================================================
// ===HOOFDPROGRAMMA LUS ===
// ================================================================
void loop() {
if(digitalRead(bt)==HIGH)
{
x++;
vertraging(150);
}
if((x%2)==0) {
// als het programmeren is mislukt, probeer dan niets te doen
als (!dmpReady) terugkeert;
// wacht op MPU-onderbreking of extra pakket(ten) beschikbaar
while (!mpuInterrupt &&fifoCount // andere dingen over programmagedrag hier
// .
// .
// .
// als je echt paranoïde bent, kun je regelmatig testen tussen andere
// dingen om te zien of mpuInterrupt waar is, en zo ja, "break;" uit de
// while()-lus om de MPU-gegevens onmiddellijk te verwerken
// .
// .
// .
}
// reset de interruptvlag en verkrijg INT_STATUS byte
mpuInterrupt =false;
mpuIntStatus =mpu.getIntStatus( );
// haal de huidige FIFO-telling op
fifoCount =mpu.getFIFOCount();
// controleer op overloop (dit mag nooit gebeuren tenzij onze code te inefficiënt is)
als ((mpuIntStatus &0x10) || fifoCount ==1024) {
// reset zodat we netjes kunnen doorgaan
mpu.resetFIFO();
Serial.println(F("FIFO overflow!"));
// controleer anders op DMP data ready interrupt (dit zou vaak moeten gebeuren)
} else if (mpuIntStatus &0x02) {
// wacht op de juiste beschikbare data lengte, zou een ZEER korte wachttijd moeten zijn
while (fifoCount // lees een pakket van FIFO
mpu.getFIFOBytes(fifoBuffer, packetSize);
// volg FIFO-telling hier in het geval dat er> 1 pakket beschikbaar is
// (hierdoor kunnen we onmiddellijk meer lezen zonder te wachten op een onderbreking)
fifoCount -=packetSize;
#ifdef OUTPUT_READABLE_YAWPITCHROLL
// display Euler-hoeken in graden
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);
Serie .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');
}
}

Plaats de slave Bluetooth-module op de auto-eenheid en beheers de Bluetooth-module op de afstandseenheid. En klaar.

Laten we hem aanzetten en hij is klaar om te spelen…….



Ik hoop dat je dit nuttig vindt. zo ja, vind het leuk, deel het, becommentarieer je twijfel. Volg mij voor meer van dit soort projecten! Steun mijn werk en abonneer je op Mijn kanaal op YouTube.

Bedankt!

Code

  • Door gebaren bestuurde robot (afstandsbediening)
Met gebaren bestuurde robot (afstandsbediening)Arduino
//programma gewijzigd op 3/10/19 door // door Shubham Shinganapure. ////voor gebarengestuurde robotauto (afstandsbediening) #include "I2Cdev.h"#include "MPU6050_6Axis_MotionApps20.h"//#include "MPU6050.h" // niet nodig als MotionApps wordt gebruikt, include file// Arduino Wire-bibliotheek is vereist als I2Cdev I2CDEV_ARDUINO_WIRE implementatie// wordt gebruikt in I2Cdev.h#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE #include "Wire.h"#endif// class standaard I2C-adres is 0x68// specifieke I2C-adressen kunnen hier als parameter worden doorgegeven// AD0 laag =0x68 (standaard voor SparkFun breakout en InvenSense evaluatiebord)// AD0 hoog =0x69MPU6050 mpu;#define OUTPUT_READABLE_YAWPITCHROLL// MPU-besturing/status varsbool dmpReady =false; // stel waar in als DMP init succesvol wasuint8_t mpuIntStatus; // bevat actuele interruptstatusbyte van MPUuint8_t devStatus; // retourstatus na elke apparaatbewerking (0 =geslaagd, !0 =fout) uint16_t packetSize; // verwachte DMP-pakketgrootte (standaard is 42 bytes) uint16_t fifoCount; // telling van alle bytes die momenteel in FIFOuint8_t fifoBuffer [64]; // FIFO-opslagbufferVectorFloat zwaartekracht; Quaternion q; vlotter ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vectoruint8_t teapotPacket[14] ={ '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };vluchtige bool mpuInterrupt =false; // geeft aan of de MPU-interrupt-pin highvoid is geworden dmpDataReady() { mpuInterrupt =true;}#include  SoftwareSerial BTSerial(10, 11); // RX | TXint bt=8;int x =1;void setup() { #if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR =24; // 400 kHz I2C-klok (200 kHz als CPU 8 MHz is) #elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // initialiseer seriële communicatie // (115200 gekozen omdat het vereist is voor uitvoer van theepotdemo's, maar het is echt aan jou, afhankelijk van je project) Serial.begin(115200); BTSerial.begin(38400); // while (!Serial); // wacht op Leonardo-opsomming, anderen gaan onmiddellijk verderSerial.println(F("Initialiseren van I2C-apparaten...")); mpu.initialiseren(); // verifieer verbinding Serial.println (F ("Testapparaatverbindingen...")); Serial.println(mpu.testConnection() ? F("MPU6050 verbinding succesvol") :F("MPU6050 verbinding mislukt")); // wacht op gereed // laad en configureer de DMP Serial.println(F("Initializing DMP...")); devStatus =mpu.dmpInitialize(); // geef hier uw eigen gyro-offsets op, geschaald voor minimale gevoeligheid mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset (1788); // zorg ervoor dat het werkte (retourneert 0 als dat zo is) if (devStatus ==0) { // zet de DMP aan, nu het klaar is Serial.println (F ("DMP inschakelen ...")); mpu.setDMPEnabled(true); // Arduino-interruptdetectie inschakelen Serial.println (F ("Interruptdetectie inschakelen (Arduino externe interrupt 0) ...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus =mpu.getIntStatus(); // stel onze DMP Ready-vlag zo in dat de hoofdlus()-functie weet dat het goed is om deze te gebruiken Serial.println(F("DMP ready! Waiting for first interrupt...")); dmpReady =waar; // haal de verwachte DMP-pakketgrootte op voor latere vergelijking packetSize =mpu.dmpGetFIFOPacketSize(); } anders { // FOUT! // 1 =initiële geheugenbelasting mislukt // 2 =DMP-configuratie-updates mislukt // (als het kapot gaat, is de code meestal 1) Serial.print(F ("DMP-initialisatie mislukt (code")); Serial. print(devStatus);Serial.println(F(")")); } // configureer LED voor output pinMode (bt, INPUT); }// ================================================================// ===HOOFDPROGRAMMA LUS ===// ================================================================ongeldige lus() {if (digitalRead(bt)==HOOG) { x++; vertraging (150); } if((x%2)==0){ // als het programmeren is mislukt, probeer dan niets te doen als (!dmpReady) terugkeert; // wacht op MPU-interrupt of extra pakket(ten) beschikbaar terwijl (!mpuInterrupt &&fifoCount  1 pakket beschikbaar is // (hierdoor kunnen we meteen meer lezen zonder te wachten op een onderbreking) fifoCount -=packetSize; #ifdef OUTPUT_READABLE_YAWPITCHROLL // toon Euler-hoeken in graden mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); Serial.print("ypr\t"); Serial.print(ypr[0] * 180/M_PI); Serieel.print("\t"); Serial.print(ypr[1] * 180/M_PI); Serieel.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'); }}

Schema's


Productieproces

  1. Hoe maak je een Arduino+Raspberry Pi-robotplatform
  2. Maak thuis een zelfgemaakte schrijfmachine voor huiswerk
  3. Obstakels vermijden robot met servomotor
  4. Lijnvolger Robot
  5. Een aanpasbare ponsbare toetsenbordknop maken
  6. Autonome Home Assistant-robot
  7. Muziek maken met een Arduino
  8. Hoe maak je op Arduino gebaseerde automatische deuropening
  9. Bedien de Arduino-robotarm met Android-app
  10. Hoe maak je een Arduino Bluetooth-gestuurde auto
  11. Robot voor supercoole indoornavigatie