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.
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:
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.
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:
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
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.
Tuktok ng platform
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 .
Plato para sa ultrasonic sensor
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.
Kapag tapos na ito ay pinagsama namin ang lahat.
Diagram ng koneksyon
Ang mga pin 4, 5, 6, 7 ay ginagamit ng Motor Shield upang makontrol ang dalawang motor
software
Magtutuon kami sa bahagi ng software at ang pagpapakita ng pagpapatakbo ng robot.
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:
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]
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.
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.