Paano gumawa ng isang lutong bahay na robot kasama ang Arduino

Sa artikulong ito matututunan natin kung paano magsagawa ng a maliit na lutong bahay na robot na kinokontrol ng Arduino board. Ang layunin ng robot ay upang maiwasan ang mga hadlang sa pamamagitan ng isang ultrasound sensor, kapag naabot nito ang isang balakid tumingin ito sa magkabilang panig at matukoy ang pinakamahusay na pagpipilian upang ipagpatuloy ang martsa nito.

hardware

Sa unang bahaging ito ay magtutuon kami sa pagbuo ng platform ng robot, pag-iipon ng mga bahagi at pagkonekta sa kanila.

robot_arduino

Kinakailangan na materyal

  • Isang board ng Arduino
  • Isang H-bridge para sa dalawang motor (Sa aking kaso gagamitin ko ang Arduino motor Shield mula sa dfrobot)
  • Dalawang push button
  • Dalawang DC motor (FIT0016 DFROBOT)
  • Dalawang 10k Ohm resistors
  • Dalawang encoder (SEN0038 DFROBOT)
  • Dalawang gulong (FIT0003 DFROBOT)
  • Isang ball caster (tindig)
  • Isang servomotor
  • Isang sensor ng kalapitan ng ultrasonik
  • Isang baterya na 7,2v
  • Kahoy o aluminyo upang maitayo ang platform

H tulay:

H tulay

Ang H-bridge ay isang electronic circuit na nagpapahintulot sa isang DC electric motor na paikutin sa magkabilang direksyon.
Ito ay binubuo ng 4 na switch (gumagamit ng transistors) at ang kombinasyon ng mga ito ay nagpapatuloy sa isang paraan o sa iba pa tulad ng ipinakita sa sumusunod na imahe.

H operasyon ng tulay

encoder:

encoder

Ang isang encoder ay isang sensor na naka-install sa motor upang malaman ang posisyon ng motor, pinapayagan kaming kontrolin ang pag-ikot nito.

Sensor ng kalapitan ng ultrasonic:

ultrasonic sensor

Ang sensor na ito ay nagpapadala ng mga pulso ng ultrasound, ang mga ito ay bounce back at bumalik sa sensor. Ang kalayuan ay maaaring kalkulahin mula sa tagal ng landas ng ultrasound pulse at ang bilis ng tunog sa hangin. Ang saklaw ng pagsukat nito ay karaniwang 3cm hanggang 4 na metro.

Konstruksiyon:

Susunod ay ipapaliwanag ko ang pagpupulong ng platform at ang koneksyon ng iba't ibang mga bahagi.
Maaari itong maitayo sa aluminyo o kahoy, ang aluminyo ay nagbibigay ng mas mahusay na integridad sa istraktura ngunit mas mahirap iproseso. Sa aking kaso ginawa ko ito sa aluminyo.

Ang lahat ng mga sukat ay nagpapahiwatig

Ibaba ng platform

hakbang sa platform ng robot

Sa bahaging ito ang mga motor at ang tindig ay makikita, una ay puputulin namin ang materyal na may mga sukat sa itaas, kung gawa sa kahoy, 5 bahagi ang kailangang putulin at isama sa mga kuko, sa kabilang banda, na may aluminyo ang ang buong piraso ay maaaring i-cut at pagkatapos ay tiklupin ito.

Sa sandaling mayroon kaming istraktura sa itaas na bahagi, mag-drill kami ng 4 na butas na humigit-kumulang na 3 sukatan upang makaya sumali sa ibabang bahagi sa itaas na bahagi na may mga tornilyo at mani.

Upang mailagay ang tindig gumawa kami ng isang butas na may isang sukatan na 30 korona at dalawang butas sa mga gilid para sa mga bolts ng angkla.

Ang mga makina ay pupunta sa mga dingding sa gilid sa pinakadulo.

ilalim na platform


Tuktok ng platform

hakbang sa platform ng robot

Sa bahaging ito ang servo motor ay makikita at ito ay isali sa ilalim ng mga turnilyo. Gagupitin muna namin ang isang bilog na 170mm diameter, pagkatapos ay gagawin namin ang apat na butas para sa mga turnilyo at sa harap na bahagi ng isang rektanggulo upang ipasok ang servo motor, hindi ko inilalagay ang mga sukat na ito sapagkat depende sila sa uri ng servo motor na iyong ginagamit .

nangungunang platform

Plato para sa ultrasonic sensor

hakbang sa platform ng robot

Ang plate ay maiugnay ang servo motor gamit ang ultrasound sensor, kung ito ay gawa sa kahoy kailangan naming gumawa ng dalawang bahagi at sumali sa kanila, na may isang bahagi lamang na aluminyo at tiklupin ito, pinutol muna namin ang plato at minsan ay nakatiklop sa maikling bahagi gumawa kami ng isang butas ng humigit-kumulang na sukatan 3 para sa suporta ng servomotor (Kapag bumili ka ng isang servomotor karaniwan para sa iyo na magkaroon ng iba't ibang mga suporta upang maiangkla sa aking kaso gagamit ako ng isang krus), pagkatapos ay ginagawa namin ang mga butas sa malaking bahagi sa hawakan ang sensor ng ultrasound na may mga turnilyo at mani.

board ng sensor

Kapag tapos na ito ay pinagsama namin ang lahat.

naka-mount na platform

naka-mount na platform

naka-mount na platform

Diagram ng koneksyon

scheme ng koneksyon

Ang mga pin 4, 5, 6, 7 ay ginagamit ng Motor Shield upang makontrol ang dalawang motor

mga pin ng koneksyon

software

Magtutuon kami sa bahagi ng software at ang pagpapakita ng pagpapatakbo ng robot.

Robot ng Arduino

Upang makagawa ng isang programa ng medyo mahaba, ipinapayong imungkahi ang algorithm ng operasyon, makakatulong ito sa amin nang malaki sa pag-program. Ang isang algorithm ay isang hanay ng mga tagubilin na nagbibigay-daan sa iyo upang magsagawa ng isang aktibidad.

Algorithm:

Robot algorithm

Ang programa ay nahahati sa pangunahing programa at pagkatapos ay maraming mga subprogram, sa pangunahing isa ay kung saan matatagpuan ang mga pindutan ng pagsisimula at paghinto at ang mga tawag sa mga subprogram para sa pagsukat ng distansya, pagsulong at iba't ibang mga liko depende sa mga dulong gulong.

Programa:

//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;
}

Demonstrasyon:

[naka-highlight] Ang artikulong ito ay orihinal na isinulat ng Wk3 para sa Ikkaro [/ naka-highlight]

Kung ikaw ay isang taong hindi mapakali tulad namin at gustong makipagtulungan sa pagpapanatili at pagpapabuti ng proyekto, maaari kang magbigay ng donasyon. Mapupunta ang lahat ng pera para makabili ng mga libro at materyales para mag-eksperimento at gumawa ng mga tutorial

2 mga puna sa "Paano gumawa ng isang lutong bahay na robot kasama ang Arduino"

  1. Magandang gabi, sa arduino robot software na may proximity sensor, ang variable turn = 1, naiintindihan ito ng programa habang lumiliko sa kanan o naka-link ito sa mga aklatan upang maunawaan ito.
    pareho para sa pagliko = 2 (buksan ang robot pakaliwa) at lumiko = 3 (bumalik at i-on ang roboT),
    MANGYARING MANGYARIHIN ITO, AY SALAMAT PO AKO.

    IBA PANG PUNTO ANG ROBOT AY WALANG SINGLING KWENTO SA PAGBABALIK AT SA PRINT NG PAGSUSI NG MGA BANS, SINABI NA ANG ISANG PAGBABALIK AT ISANG PAGBABALIK NA INILAPIT SA PAGBABALIK = 3, NGUNIT ITO AY NAGPAPATUNGKOL NA WALANG SALIG NA TINAWANG PAGBABALIK.

    MGA pagbati at Inaasahan ko ang iyong suporta.

    Tumugon
  2. Magandang gabi, sa arduino robot software na may proximity sensor, ang variable turn = 1, naiintindihan ito ng programa habang lumiliko sa kanan o naka-link ito sa mga aklatan upang maunawaan ito.
    pareho para sa pagliko = 2 (buksan ang robot pakaliwa) at lumiko = 3 (bumalik at i-on ang roboT),
    MANGYARING MANGYARIHIN ITO, AY SALAMAT PO AKO.

    IBA PANG PUNTO ANG ROBOT AY WALANG SINGLING KWENTO SA PAGBABALIK AT SA PRINT NG PAGSUSI NG MGA BANS, SINABI NA ANG ISANG PAGBABALIK AT ISANG PAGBABALIK NA INILAPIT SA PAGBABALIK = 3, NGUNIT ITO AY NAGPAPATUNGKOL NA WALANG SALIG NA TINAWANG PAGBABALIK.

    MGA pagbati at Inaasahan ko ang iyong suporta.

    Tumugon

Mag-iwan ng komento