Arduino ilə evdə hazırlanmış bir robot necə hazırlanır

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.

robot_arduino

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örpü

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.

H körpü əməliyyatı

Kodlayıcı:

encoder

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:

ultrasəs 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

robot platforması tədbirləri

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.

alt platforma


Platformanın yuxarı hissəsi

robot platforması tədbirləri

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. .

üst platforma

Ultrasonik sensor üçün plitə

robot platforması tədbirləri

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.

sensor lövhə

Bu bitdikdən sonra hamısını bir yerə yığırıq.

quraşdırılmış platforma

quraşdırılmış platforma

quraşdırılmış platforma

Bağlantı diaqramı

əlaqə sxemi

Pins 4, 5, 6, 7, iki mühərriki idarə etmək üçün Motor qalxanı tərəfindən istifadə olunur

əlaqə sancaqları

Proqram təminatı

Proqram hissəsinə və robot əməliyyatının nümayişinə diqqət edəcəyik.

Arduino robotu

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:

Robot alqoritmi

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ış]

Əgər siz də bizim kimi narahat bir insansınızsa və layihənin saxlanılması və təkmilləşdirilməsində əməkdaşlıq etmək istəyirsinizsə, ianə edə bilərsiniz. Bütün pul təcrübə və dərsliklər etmək üçün kitablar və materiallar almağa gedəcək

"Arduino ilə evdə hazırlanan robot necə hazırlanır" haqqında 2 şərh

  1. 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.

    cavab
  2. 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.

    cavab

Şərh yaz