Как да си направим домашен робот с Arduino

В тази статия ще научим как да изпълняваме малък домашен робот, контролиран от дъската Arduino. Целта на робота ще бъде да избягва препятствия с помощта на ултразвуков сензор, когато стигне до препятствие, той ще погледне от двете страни и ще определи най-добрия вариант да продължи своя поход.

железария

В тази първа част ще се съсредоточим върху изграждането на роботната платформа, сглобяването на частите и свързването.

robot_arduino

Необходим материал

  • Дъска Arduino
  • H-мост за два двигателя (В моя случай ще използвам Arduino моторния щит от dfrobot)
  • Два бутона
  • Два постояннотокови мотора (FIT0016 DFROBOT)
  • Два резистора 10k Ohm
  • Два енкодера (SEN0038 DFROBOT)
  • Две колела (FIT0003 DFROBOT)
  • Колело на топка (лагер)
  • Сервомотор
  • Ултразвуков сензор за близост
  • Една 7,2v батерия
  • Дърво или алуминий за изграждане на платформата

H мост:

Н мост

H-мостът е електронна схема, която позволява на електродвигателя с постоянен ток да се върти в двете посоки.
Състои се от 4 превключвателя (използващи транзистори) и комбинацията от тях го кара да върви по един или друг начин, както е показано на следващото изображение.

H операция на мост

Енкодер:

енкодер

Енкодерът е датчик, който е инсталиран в двигателя, за да знае положението на двигателя, това ни позволява да контролираме неговото въртене.

Ултразвуков сензор за близост:

ултразвуков сензор

Този сензор изпраща импулси на ултразвук, които отскачат и се връщат към сензора. Разстоянието може да се изчисли от продължителността на пътя на ултразвуковия импулс и скоростта на звука във въздуха. Обхватът му на измерване обикновено е от 3 см до 4 метра.

строителство:

След това ще обясня сглобяването на платформата и свързването на различните части.
Това може да бъде изградено с алуминий или дърво, алуминият придава по-добра цялост на конструкцията, но е по-труден за обработка. В моя случай съм го направил от алуминий.

Всички измервания са ориентировъчни

Дъното на платформата

мерки на платформата на робота

В тази част двигателите и лагерът ще бъдат поместени, първо ще изрежем материала с измерванията по-горе, ако е направен от дърво, 5 части ще трябва да бъдат изрязани и съединени с пирони, от друга страна, с алуминий цялото парче може да се изреже и след това да се сгъне.

След като имаме конструкцията в горната част, ще пробием 4 отвора приблизително 3 метрични, за да можем по-късно да съединим долната част с горната част с винтове и гайки.

За да поставим лагера, правим отвор с метрична корона 30 и два отвора отстрани за анкерните болтове.

Двигателите ще вървят по страничните стени в самия край.

долна платформа


Горна част на платформата

мерки на платформата на робота

В тази част серво моторът ще бъде разположен и той ще бъде свързан с долната част с винтове. Първо ще изрежем кръг с диаметър 170 мм, след това ще направим четирите отвора за винтовете и в предната част правоъгълник за вмъкване на серво мотора, не поставям тези измервания, защото те ще зависят от вида на серво мотора, който използвате .

горна платформа

Плоча за ултразвуков сензор

мерки на платформата на робота

Плочата ще свърже сервомотора с ултразвуковия сензор, ако е направен с дърво ще трябва да направим две части и да ги съединим, с алуминий само една част и да я сгънем, първо изрязваме плочата и веднъж сгъната в късата част правим отвор с приблизително метрични 3 за опората на сервомотора (Когато купувате сервомотор е обичайно да измисляте различни опори за закотвяне, в моя случай ще използвам кръстосан), тогава правим дупките в големия част за задържане на ултразвуковия сензор с винтове и гайки.

сензорна платка

След като това е направено, ние сме всички заедно.

монтирана платформа

монтирана платформа

монтирана платформа

Схема на свързване

схема на свързване

Щифтове 4, 5, 6, 7 се използват от щита на двигателя за управление на двата двигателя

свързващи щифтове

Софтуер

Ще се съсредоточим върху софтуерната част и демонстрацията на работата на робота.

Робот Arduino

За да направим една програма малко по-дълга, препоръчително е да предложим алгоритъма на работа, това ще ни помогне много при програмирането. Алгоритъмът е набор от инструкции, който ви позволява да извършвате дейност.

алгоритъм:

Алгоритъм на робота

Програмата е разделена на основната програма и след това няколко подпрограми, в основната е мястото, където са разположени бутоните за стартиране и спиране и извикванията към подпрограмите за измерване на разстояние, аванс и различните завои в зависимост от страничните разстояния.

програма:

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

демонстрация:

[подчертано] Тази статия първоначално е написана от Wk3 за Ikkaro [/ подчертана]

Ако сте неспокоен човек като нас и искате да си сътрудничите в поддръжката и подобряването на проекта, можете да направите дарение. Всички пари ще отидат за закупуване на книги и материали, за да експериментирате и да правите уроци

2 коментара за "Как да си направим домашен робот с Arduino"

  1. Лека нощ, в софтуера за робот arduino със сензор за близост, променливата turn = 1, програмата го разбира като завъртане надясно или това е свързано с библиотеките, за да разбере това.
    същото за завой = 2 (завъртете робота наляво) и завой = 3 (върнете се назад и завъртете roboT),
    МОЛЯ, ОБЯСНЕТЕ ТОВА СЪМНЕНИЕ, ЩЕ БЪДЯ БЛАГОДАРЯ.

    ДРУГА ТОЧКА РОБОТЪТ НЯМА ГРАНИЦА ЗА ОБРАТНО И ПРИ ПЕЧАТ НА ПРОВЕРКА НА ЛЕНТИТЕ СЕ СПОМЕНА, ЧЕ ВРЪЩАНЕТО СЕ ПРИЛАГА ВРЪЩАНЕ И ВРЪЩАНЕ = 3, НО СЕ ПРЕДЛАГА, ЧЕ НЯМА НИЩОГО, КОЕТО СЕ НАРИЧА ВРЪЩАНЕ.

    ПОЗДРАВИ И НАДЯВАМ ВАШАТА ПОДКРЕПА.

    отговор
  2. Лека нощ, в софтуера за робот arduino със сензор за близост, променливата turn = 1, програмата го разбира като завъртане надясно или това е свързано с библиотеките, за да разбере това.
    същото за завой = 2 (завъртете робота наляво) и завой = 3 (върнете се назад и завъртете roboT),
    МОЛЯ, ОБЯСНЕТЕ ТОВА СЪМНЕНИЕ, ЩЕ БЪДЯ БЛАГОДАРЯ.

    ДРУГА ТОЧКА РОБОТЪТ НЯМА ГРАНИЦА ЗА ОБРАТНО И ПРИ ПЕЧАТ НА ПРОВЕРКА НА ЛЕНТИТЕ СЕ СПОМЕНА, ЧЕ ВРЪЩАНЕТО СЕ ПРИЛАГА ВРЪЩАНЕ И ВРЪЩАНЕ = 3, НО СЕ ПРЕДЛАГА, ЧЕ НЯМА НИЩОГО, КОЕТО СЕ НАРИЧА ВРЪЩАНЕ.

    ПОЗДРАВИ И НАДЯВАМ ВАШАТА ПОДКРЕПА.

    отговор

Оставете коментар