Hogyan készítsünk házi robotot Arduino-val

Ebben a cikkben megtanuljuk, hogyan kell a kis házi robot, amelyet Arduino tábla irányít. A robot célja az akadályok elkerülése ultrahang-érzékelő segítségével, amikor egy akadályhoz eljut, mindkét oldalra néz, és meghatározza a legjobb lehetőséget a menetelés folytatására.

hardver

Ebben az első részben a robotplatform felépítésére, az alkatrészek összeállítására és összekapcsolására összpontosítunk.

robot_arduino

Szükséges anyag

  • Arduino tábla
  • H-híd két motorhoz (az én esetemben a dfrobot Arduino motorvédőjét fogom használni)
  • Két nyomógomb
  • Két egyenáramú motor (FIT0016 DFROBOT)
  • Két 10k Ohm-os ellenállás
  • Két kódoló (SEN0038 DFROBOT)
  • Két kerék (FIT0003 DFROBOT)
  • Golyós görgő (csapágy)
  • Szervomotor
  • Ultrahangos közelségérzékelő
  • Egy 7,2 V-os akkumulátor
  • Fa vagy alumínium a platform megépítéséhez

H-híd:

H híd

A H-híd olyan elektronikus áramkör, amely lehetővé teszi az egyenáramú elektromos motor mindkét irányban történő forgását.
4 kapcsolóból áll (tranzisztorokat használva), és ezek kombinációjával így vagy úgy megy, ahogy a következő kép mutatja.

H híd működése

Encoder:

jeladó

A kódoló egy olyan érzékelő, amelyet a motorba telepítenek, hogy megismerjék a motor helyzetét, ez lehetővé teszi számunkra a forgás szabályozását.

Ultrahangos közelségérzékelő:

ultrahangos érzékelő

Ez az érzékelő impulzusokat küld az ultrahangról, ezek visszapattannak és visszatérnek az érzékelőhöz. A távolság kiszámítható az ultrahang impulzus útjának időtartama és a levegőben lévő hang sebessége alapján. Mérési tartománya általában 3–4 méter.

Épület:

Ezután elmagyarázom a platform összeállítását és a különböző részek összekapcsolását.
Ezt alumíniumból vagy fából lehet megépíteni, az alumínium nagyobb integritást kölcsönöz a szerkezetnek, de nehezebb feldolgozni. Az én esetemben alumíniumból készítettem.

Minden mérés tájékoztató jellegű

A peron alja

robotplatform mérések

Ebben a részben a motorok és a csapágy lesz elhelyezve, először a fenti mérésekkel vágjuk ki az anyagot, ha fából készült, akkor 5 részt le kell vágni és össze kell szegezni, másrészt alumíniummal a egész darabot lehet vágni, majd összehajtani.

Amint megvan a szerkezet a felső részen, 4 lyukat fúrunk, kb. 3 metrikusan, hogy később az alsó részt csavarokkal és anyákkal össze lehessen kötni.

A csapágy elhelyezéséhez furatot készítünk egy metrikus 30 koronával és két lyukkal az oldalán a horgonycsavarok számára.

A motorok az oldalfalakon mennek a legvégén.

alsó peron


A platform teteje

robotplatform mérések

Ebben a részben a szervomotor kap helyet, és csavarokkal csatlakozik az alsó részhez. Először levágunk egy 170 mm átmérőjű kört, majd megcsináljuk a négy furatot a csavarokhoz és az elülső részben egy téglalapot a szervomotor behelyezéséhez. Ezeket a méréseket nem teszem fel, mert attól függ, hogy milyen típusú szervomotort használ .

felső platform

Lemez ultrahangos érzékelőhöz

robotplatform mérések

A lemez összeköti a szervomotort az ultrahang érzékelővel, ha fából készül, két részt kell készítenünk és össze kell illesztenünk, csak egy részt alumíniummal kell összehajtani, először levágjuk a lemezt, és miután a rövid részben összehajtjuk hozzávetőlegesen 3 metrikus lyukat készítünk a szervomotor támasztékához (szervomotor vásárlásakor gyakran előfordul, hogy különböző támasztékokat állítunk elő a horgonyzáshoz, esetemben keresztet fogok használni), majd a lyukakat a nagy része az ultrahang-érzékelő rögzítéséhez csavarokkal és anyákkal.

érzékelő tábla

Miután ez megtörtént, mindezt összeállítjuk.

szerelt platform

szerelt platform

szerelt platform

Csatlakozási ábra

csatlakozási séma

A 4, 5, 6, 7 csapokat a motor árnyékolása használja a két motor vezérléséhez

csatlakozócsapok

szoftver

A szoftver részre és a robot működésének bemutatására fogunk összpontosítani.

Arduino robot

Ahhoz, hogy egy program egy kicsit hosszú legyen, célszerű javaslatot tenni a működési algoritmusra, ez sokat segít nekünk a programozás során. Az algoritmus egy utasításkészlet, amely lehetővé teszi egy tevékenység végrehajtását.

Algoritmus:

Robot algoritmus

A program fel van osztva a főprogramra, majd több alprogramra, a fő részben ott találhatók a start és a stop gombok, valamint az alprogramokhoz történő hívások a távolság, az előre lépés és az oldalirányú távolságok függvényében a különböző fordulatok mérésére.

Program:

//Librerias
#include <Servo.h>

//Declaración E/S
int EM1 = 2; //Encoder motor 1 (Izquierda)
int EM2 = 3; //Encoder motor 2 (Derecha)
int M2D = 4; //Motor 2 control de dirección (Derecha)
int M1P = 6; //Motor 1 control PWM
int M2P = 5; //Motor 2 control PWM
int M1D = 7; //Motor 1 control de dirección (Izquierda)
int SU = 8; //Sensor de distancia por ultrasonidos
Servo servo1; //Servomotor
int BI = 10; //Boton de inicio
int BP = 11; //Boton de paro

//Declaración variables
int CRI = 0; //Contador rueda izquierda
int CRD = 0; //Contador rueda derecha
int EBI = 0; //Estado boton inicio
int velocidad = 200; //Velocidad de los motores
long dist = 0; //Distancia del robot (cm)
long duracion = 0; //Duración del recorrido del ping (microsegundos)
int VEA = 0; //variable encendido/apagado
int EBP = 0; //Estado boton de paro
long distizq = 0; // Distancia del robot (cm) a su izquierda
long distder = 0; // Distancia del robot (cm) a su derecha
byte giro = 0; //Variable para saber por donde girar
byte caso = 0; //Para seleccionar el caso de giro
int estadoAnterior = 0; //variables para cambio de estado del encoder izquierdo
int estadoActual;       //variables para cambio de estado del encoder izquierdo
int estadoAnterior1 = 0; //variables para cambio de estado del encoder derecho
int estadoActual1;      //variables para cambio de estado del encoder izquierdo

void setup() {
pinMode(M1D, OUTPUT);
pinMode(M2D, OUTPUT);
pinMode(EM1, INPUT);         //encoder 1 como entrada
digitalWrite(EM1, HIGH);    //resistencia pull-up para encoder
pinMode(EM2, INPUT);          //encoder 2 como entrada
digitalWrite(EM2, HIGH);    //resistencia pull-up para encoder
servo1.attach(9);  //inicializamos servo
servo1.write(100);   //lo colocamos en una posición media
pinMode(BI, INPUT);  //Boton de inicio como entrada
pinMode(BP, INPUT);  //Boton de paro como entrada
}

void loop() {
EBP=digitalRead(BP);    //lee los estados del boton
EBI=digitalRead(BI);    //lee los estados del boton
if (EBI == HIGH){        //si el estado del boton de inicio esta on
VEA = 1;              //variable encendido/apagado = 1

}
else if(EBP == HIGH) {    //si esta el de paro on
VEA = 0;               //variable encendido/apagado = 0
}
dist = sensorultrasonidos(); //Llama a la función para saber la distancia
if (VEA == 1 && dist > 15){  //Si la variable encendido/apagado tiene valor high y hay distancia suficiente
avanzar();  //Ir a la función avanzar
}
if (VEA == 1 && dist < 15){  //Si la variable encendido/apagado tiene valor high y no hay distancia suficiente
caso = comprobarbandas();  //Comprobamos bandas y depende el caso ira a una función determinada
switch(caso) {
case 1:
derecha();
break;
case 2:
izquierda();
break;
case 3:
giro180();
break;
}
}
}
void avanzar () {  //Función de avanzar hasta que haya una distancia de 15cm con el objeto en frente
digitalWrite(M1D,LOW);
digitalWrite(M2D, LOW);
analogWrite(M1P, velocidad);
analogWrite(M2P, velocidad);
while(dist >15){
dist = sensorultrasonidos(); //Llama a la función para saber la distancia
}
frenar();
}

int sensorultrasonidos() { //Función para medir la distancia con el sensor de ultrasonidos (cm)
pinMode(SU, OUTPUT);              //Configuramos el sensor de ultrasonidos como salida
digitalWrite(SU, LOW);            //Hacemos ping LOW-HIGH-LOW
delayMicroseconds(2);
digitalWrite(SU, HIGH);
delayMicroseconds(15);
digitalWrite(SU, LOW);
delayMicroseconds(20);
pinMode(SU, INPUT);               //Configuramos el sensor de ultrasonidos como entrada
duracion = pulseIn(SU, HIGH);     //Leemos la duración del pulso
delay(50);
return duracion / 29 / 2;     // Conversión de microsegundos a la distancia cm (velocidad del sonido 340m/s o 29 microsegundos por centimetro y son ida y vuelta /2)
}

void frenar (){    //funcion para frenar el robot
digitalWrite(M1D,HIGH);
digitalWrite(M2D, HIGH);
analogWrite(M1P, 0);
analogWrite(M2P, 0);
}

void derecha() {    //función para girar a la derecha teniendo en cuenta la rotacion de los encoders
digitalWrite(M1D,LOW);
digitalWrite(M2D, HIGH);
analogWrite(M1P, velocidad);
analogWrite(M2P, velocidad);
while (CRI <= 15 && CRD <=15 ){
contador_izq();
contador_der();
}
frenar();
}

void izquierda() {    //función para girar a la izquierda teniendo en cuenta la rotacion de los encoders
digitalWrite(M1D,HIGH);
digitalWrite(M2D, LOW);
analogWrite(M1P, velocidad);
analogWrite(M2P, velocidad);
while (CRI <= 15 && CRD <=15 ){
contador_izq();
contador_der();
}
frenar();
}

void giro180() {    //función para girar 180º teniendo en cuenta la rotacion de los encoders
digitalWrite(M1D,LOW);
digitalWrite(M2D, HIGH);
analogWrite(M1P, velocidad);
analogWrite(M2P, velocidad);
while (CRI <= 30 && CRD <=30 ){
contador_izq();
contador_der();
}
frenar();
}

void contador_izq(){    //Contaje de los estados del encoder izquierdo
estadoActual = digitalRead(EM1);
if (estadoAnterior != estadoActual)  // ha habido un cambio de estado
{
CRI++;                          // cuenta los cambios de estado
estadoAnterior = estadoActual;
}
}

void contador_der(){    //Contaje de los estados del encoder derecho
estadoActual1 = digitalRead(EM1);
if (estadoAnterior1 != estadoActual1)  // ha habido un cambio de estado
{
CRD++;                          // cuenta los cambios de estado
estadoAnterior1 = estadoActual1;
}
}

int comprobarbandas() {    //Función para comprovar bandas, mide la distancia de la izquierda y la derecha
CRI = 0;
CRD = 0;
servo1.write(5);
delay(500);
distizq = sensorultrasonidos();
servo1.write(175);
delay(500);
distder = sensorultrasonidos();
servo1.write(100);
delay(500);
if (distder >= distizq && distder > 15) {    //si la distancia derecha es mayor o igual a la distancia izquierda, girara a la derecha
giro = 1;
}
else if(distizq >= distder && distizq > 15) {  //si la distancia izquierda es mayor o igual a la distancia derecha, girara a la izquierda
giro = 2;
}
else if(distizq < 15 && distder < 15) {
giro = 3;
}
return giro;
}

demonstrációs

[kiemelve] Ezt a cikket eredetileg a Wk3 írta az Ikkaro számára [/ kiemelve]

2 megjegyzés: "Hogyan készítsünk házi robotot Arduino-val"

  1. Jó éjszakát, a közelségérzékelővel rendelkező arduino robot szoftverben, a turn = 1 változóban a program jobbra fordulóként érti, vagy ez a könyvtárakhoz van kapcsolva, hogy ezt megértse.
    ugyanez a = 2-es fordulatnál (a robot balra fordítása) és a = 3-as fordulásnál (menj vissza és fordítsd a roboT-t),
    KÉRJÜK, HOGY KÉSZÍTSE EZT A KÉTSÉGET, KÖSZÖNÖM.

    EGY MÁSIK PONT A ROBOTNAK NINCS ÉRTÉKE VISSZAfordulni, és a sávok ellenőrzésénél megemlítik, hogy a VISSZATÉRÉSBEN = 3 A VISSZATÉRÉS ÉS A VISSZATÉRÉS VÉGREHAJTIK, DE FELTÉTELEZIK, HOGY NEM VESZÉLY, AMIT VISSZAÁLLÍTÁSNAK hívnak.

    ÜDVÖZÖLÉSEK ÉS REMÉNYEM TÁMOGATÁSÁRA.

    válasz
  2. Jó éjszakát, a közelségérzékelővel rendelkező arduino robot szoftverben, a turn = 1 változóban a program jobbra fordulóként érti, vagy ez a könyvtárakhoz van kapcsolva, hogy ezt megértse.
    ugyanez a = 2-es fordulatnál (a robot balra fordítása) és a = 3-as fordulásnál (menj vissza és fordítsd a roboT-t),
    KÉRJÜK, HOGY KÉSZÍTSE EZT A KÉTSÉGET, KÖSZÖNÖM.

    EGY MÁSIK PONT A ROBOTNAK NINCS ÉRTÉKE VISSZAfordulni, és a sávok ellenőrzésénél megemlítik, hogy a VISSZATÉRÉSBEN = 3 A VISSZATÉRÉS ÉS A VISSZATÉRÉS VÉGREHAJTIK, DE FELTÉTELEZIK, HOGY NEM VESZÉLY, AMIT VISSZAÁLLÍTÁSNAK hívnak.

    ÜDVÖZÖLÉSEK ÉS REMÉNYEM TÁMOGATÁSÁRA.

    válasz

Szólj hozzá