Bu yazıda bir. Necə yerinə yetiriləcəyini öyrənəcəyik Arduino lövhəsi tərəfindən idarə olunan kiçik ev robotu. Robotun məqsədi ultrasəs sensoru ilə maneələrin qarşısını almaq olacaq, maneəyə çatdıqda hər iki tərəfə baxacaq və yürüşünə davam etmək üçün ən yaxşı variantı müəyyənləşdirəcək.
Hardware
Bu ilk hissədə robot platformasının qurulmasına, hissələrin yığılmasına və bağlanmasına diqqət edəcəyik.
Lazımi material
- Arduino lövhəsi
- İki mühərrik üçün H körpüsü (Mənim vəziyyətimdə dfrobot-dan Arduino motor qalxanından istifadə edəcəyəm)
- İki düymə
- İki DC mühərrik (FIT0016 DFROBOT)
- İki 10k Ohm rezistor
- İki kodlayıcı (SEN0038 DFROBOT)
- İki təkər (FIT0003 DFROBOT)
- Bir top tökücü (rulman)
- Servomotor
- Ultrasonik yaxınlıq sensoru
- Bir 7,2v batareya
- Platformanı qurmaq üçün taxta və ya alüminium
H körpüsü:
H köprüsü, bir DC elektrik mühərrikinin hər iki istiqamətdə də fırlanmasına imkan verən elektron bir dövrədir.
4 keçiddən (tranzistorlardan istifadə edərək) ibarətdir və bunların birləşməsi onu aşağıdakı şəkildə göstərildiyi kimi bu və ya digər tərəfə aparır.
Kodlayıcı:
Enkoder mühərrikin vəziyyətini bilmək üçün mühərrikə quraşdırılmış bir sensordur, bu da onun fırlanmasını idarə etməyə imkan verir.
Ultrasonik yaxınlıq sensoru:
Bu sensor ultrasəs zərbələrini göndərir, bunlar geri sıçrayıb sensora qayıdır. Məsafə ultrasəs nəbz yolunun müddətindən və havadakı səs sürətindən hesablana bilər. Ölçü aralığı ümumiyyətlə 3 sm-dən 4 metrə qədərdir.
Tikinti:
Sonra platformanın montajını və fərqli hissələrin əlaqəsini izah edəcəyəm.
Alüminium və ya ağac ilə tikilə bilər, alüminium quruluşa daha yaxşı bir bütövlük verir, lakin işlənməsi daha çətindir. Mənim vəziyyətimdə onu alüminiumdan hazırladım.
Bütün ölçmələr göstəricidir
Platformanın dibi
Bu hissədə mühərriklər və rulman yerləşdiriləcək, əvvəlcə materialı yuxarıdakı ölçmələrlə kəsəcəyik, taxtadan düzəldildiyi təqdirdə 5 hissəni kəsib dırnaqlarla, digər tərəfdən alüminiumla birləşdirmək lazımdır. bütün parça kəsilib sonra qatlana bilər.
Üst hissədə bir quruluşa sahib olduqdan sonra, alt hissəni yuxarı hissə ilə vintlər və qoz-fındıqlarla birləşdirə bilmək üçün təxminən 4 metriklik 3 delik açacağıq.
Rulmanı yerləşdirmək üçün bir metrik 30 tac ilə bir çuxur və yanlarında lövbər cıvataları üçün iki delik açırıq.
Mühərriklər ən sonunda yan divarlarda gedəcəklər.
Platformanın yuxarı hissəsi
Bu hissədə servo mühərrik yerləşdiriləcək və alt hissə ilə vintlərlə birləşdiriləcəkdir. Əvvəlcə 170 mm diametrli bir dairəni kəsəcəyik, sonra vintlər üçün dörd çuxur və ön hissədə servo motoru yerləşdirmək üçün düzbucaqlı edəcəyik, bu ölçmələri etmirəm, çünki istifadə etdiyiniz servo motorun növündən asılı olacaq. .
Ultrasonik sensor üçün plitə
Plitə servo motoru ultrasəs sensoru ilə birləşdirəcəkdir, əgər ağac ilə hazırlanırsa, iki hissə düzəldib birləşdirməliyik, yalnız bir hissəsini alüminiumla büküb qatlayırıq, əvvəlcə plitəni kəsdik və bir dəfə qısa hissəyə qatladıq servomotor dəstəyi üçün təxminən metrik 3-lük bir deşik açırıq (bir servomotor satın aldığınız zaman, mənim vəziyyətimdə çapa qoymaq üçün fərqli dayaqlara sahib olmağınız yaygındır), sonra böyük hissədəki delikləri düzəldirik ultrasəs sensorunu vintlər və qoz-fındıqlarla tutmaq.
Bu bitdikdən sonra hamısını bir yerə yığırıq.
Bağlantı diaqramı
Pins 4, 5, 6, 7, iki mühərriki idarə etmək üçün Motor qalxanı tərəfindən istifadə olunur
Proqram təminatı
Proqram hissəsinə və robot əməliyyatının nümayişinə diqqət edəcəyik.
Bir proqramı bir az uzun etmək üçün əməliyyat alqoritmini təklif etmək məsləhətdir, bu proqramlaşdırma zamanı bizə çox kömək edəcəkdir. Alqoritm bir fəaliyyət göstərməyə imkan verən təlimat toplusudur.
Alqoritm:
Proqram əsas proqrama və daha sonra bir neçə alt proqrama bölünür, əsasda başlanğıc və dayandırma düymələrinin yerləşdiyi yer və yan məsafələrə görə məsafəni, irəliləməni və fərqli növbələri ölçmək üçün alt proqramlara çağırışlardır.
Proqram:
//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; }
Nümayiş:
[vurğuladı] Bu məqalə ilk olaraq Wk3 tərəfindən Ikkaro üçün yazılmışdır [/ vurğulanmış]
Axşamınız xeyir, yaxınlıq sensoru olan arduino robot proqramında dönüş = 1 dəyişən, proqram bunu sağa çevirmə kimi başa düşür və ya bunu anlamaq üçün kitabxanalara bağlıdır.
dönüş = 2 üçün də eyni (robotu sola çevirin) və = 3 dönün (geri dönün və robotu çevirin),
Xahiş edirəm bu şübhəni izah edin, sizə təşəkkür edirəm.
Başqa bir nöqtədə, ROBOT-un geri dönmək üçün bir boşluğu yoxdur və BANDS YOXLANMASININ İZMƏSİNDƏ, QAYDA VƏ QAYTARIŞIN QAYDADA TƏTBİQ EDİLƏN = 3, YAXŞI YOXDUĞUNUN VAXTI YOXDUR.
SALAMLAMA VƏ DƏSTƏKİNİZİ Ümid edirəm.
Axşamınız xeyir, yaxınlıq sensoru olan arduino robot proqramında dönüş = 1 dəyişən, proqram bunu sağa çevirmə kimi başa düşür və ya bunu anlamaq üçün kitabxanalara bağlıdır.
dönüş = 2 üçün də eyni (robotu sola çevirin) və = 3 dönün (geri dönün və robotu çevirin),
Xahiş edirəm bu şübhəni izah edin, sizə təşəkkür edirəm.
Başqa bir nöqtədə, ROBOT-un geri dönmək üçün bir boşluğu yoxdur və BANDS YOXLANMASININ İZMƏSİNDƏ, QAYDA VƏ QAYTARIŞIN QAYDADA TƏTBİQ EDİLƏN = 3, YAXŞI YOXDUĞUNUN VAXTI YOXDUR.
SALAMLAMA VƏ DƏSTƏKİNİZİ Ümid edirəm.