Arduino менен үй роботун кантип жасоого болот

Бул макалада биз кантип аткарууну үйрөнөбүз Arduino тактасынын көзөмөлүндөгү кичинекей үй роботу. Роботтун максаты - УЗИ сенсорунун жардамы менен тоскоолдуктарды болтурбоо, ал тоскоолдукка жеткенде эки тарапты карап, маршты улантуунун мыкты вариантын аныктайт.

Hardware

Бул биринчи бөлүктө робот платформасын курууга, бөлүктөрүн чогултууга жана туташтырууга көңүл бурабыз.

robot_arduino

Керектүү материал

  • Arduino тактасы
  • Эки кыймылдаткычка арналган H көпүрөсү (эгерде мен Arduino мотор калканын dfrobot колдоном)
  • Эки баскыч
  • Эки DC кыймылдаткычы (FIT0016 DFROBOT)
  • Эки 10k Ом резистор
  • Эки коддогуч (SEN0038 DFROBOT)
  • Эки дөңгөлөк (FIT0003 DFROBOT)
  • Топ тоголок (подшипник)
  • Сервомотор
  • УЗИ жакындык сенсору
  • Бир 7,2v батарейка
  • Платформаны куруу үчүн жыгач же алюминий

Н-көпүрө:

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 тарабынан Иккаро үчүн жазылган [/ бөлүп көрсөтүлгөн]

"Arduino менен үйдө жасалган роботту кантип жасоого болот" боюнча 2 комментарий

  1. Кайырлуу түн, жакындык сенсору бар ардуино робот программасында, өзгөрүлмө кезек = 1, программа аны оңго бурулган деп түшүнөт же муну түшүнүү үчүн китепканалар менен байланыштырылат.
    ошол эле бурулуш = 2 (роботту солго буруңуз) жана = 3 буруңуз (артка жана роботту буруңуз),
    БУЛ КҮМӨНДҮ ТҮШҮНДҮРҮҢҮЗ, САГА ЫРААЗЫ БОЛОМ.

    РОБОТТУН ДАГЫ БИР НУКТАСЫ КАЙРА БЕРҮҮГӨ ЖАНА БАНДДАРДЫ ТЕКШЕРҮҮГӨ БОЛБОЙТ, КАЙТКАНДА = 3 КАЙТЫП КЕЛГЕНДИГИ ЖӨНҮНДӨ АЙТЫЛАТ, БИРОК КАЙРЫЛЫШ ДЕП БУТУРГАН ЖОК ДЕП ОЙЛОГОН.

    КУТТУКТОО ЖАНА СИЗДИН КОЛДООҢУЗДАРГА ҮМҮТ БЕРЕМ.

    жооп
  2. Кайырлуу түн, жакындык сенсору бар ардуино робот программасында, өзгөрүлмө кезек = 1, программа аны оңго бурулган деп түшүнөт же муну түшүнүү үчүн китепканалар менен байланыштырылат.
    ошол эле бурулуш = 2 (роботту солго буруңуз) жана = 3 буруңуз (артка жана роботту буруңуз),
    БУЛ КҮМӨНДҮ ТҮШҮНДҮРҮҢҮЗ, САГА ЫРААЗЫ БОЛОМ.

    РОБОТТУН ДАГЫ БИР НУКТАСЫ КАЙРА БЕРҮҮГӨ ЖАНА БАНДДАРДЫ ТЕКШЕРҮҮГӨ БОЛБОЙТ, КАЙТКАНДА = 3 КАЙТЫП КЕЛГЕНДИГИ ЖӨНҮНДӨ АЙТЫЛАТ, БИРОК КАЙРЫЛЫШ ДЕП БУТУРГАН ЖОК ДЕП ОЙЛОГОН.

    КУТТУКТОО ЖАНА СИЗДИН КОЛДООҢУЗДАРГА ҮМҮТ БЕРЕМ.

    жооп

Комментарий калтыруу