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.
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:
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.
Encoder:
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ő:
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
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.
A platform teteje
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 .
Lemez ultrahangos érzékelőhöz
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.
Miután ez megtörtént, mindezt összeállítjuk.
Csatlakozási ábra
A 4, 5, 6, 7 csapokat a motor árnyékolása használja a két motor vezérléséhez
szoftver
A szoftver részre és a robot működésének bemutatására fogunk összpontosítani.
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:
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]
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.
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.