В тази статия ще научим как да изпълняваме малък домашен робот, контролиран от дъската Arduino. Целта на робота ще бъде да избягва препятствия с помощта на ултразвуков сензор, когато стигне до препятствие, той ще погледне от двете страни и ще определи най-добрия вариант да продължи своя поход.
железария
В тази първа част ще се съсредоточим върху изграждането на роботната платформа, сглобяването на частите и свързването.
Необходим материал
- Дъска Arduino
- H-мост за два двигателя (В моя случай ще използвам Arduino моторния щит от dfrobot)
- Два бутона
- Два постояннотокови мотора (FIT0016 DFROBOT)
- Два резистора 10k Ohm
- Два енкодера (SEN0038 DFROBOT)
- Две колела (FIT0003 DFROBOT)
- Колело на топка (лагер)
- Сервомотор
- Ултразвуков сензор за близост
- Една 7,2v батерия
- Дърво или алуминий за изграждане на платформата
H мост:
H-мостът е електронна схема, която позволява на електродвигателя с постоянен ток да се върти в двете посоки.
Състои се от 4 превключвателя (използващи транзистори) и комбинацията от тях го кара да върви по един или друг начин, както е показано на следващото изображение.
Енкодер:
Енкодерът е датчик, който е инсталиран в двигателя, за да знае положението на двигателя, това ни позволява да контролираме неговото въртене.
Ултразвуков сензор за близост:
Този сензор изпраща импулси на ултразвук, които отскачат и се връщат към сензора. Разстоянието може да се изчисли от продължителността на пътя на ултразвуковия импулс и скоростта на звука във въздуха. Обхватът му на измерване обикновено е от 3 см до 4 метра.
строителство:
След това ще обясня сглобяването на платформата и свързването на различните части.
Това може да бъде изградено с алуминий или дърво, алуминият придава по-добра цялост на конструкцията, но е по-труден за обработка. В моя случай съм го направил от алуминий.
Всички измервания са ориентировъчни
Дъното на платформата
В тази част двигателите и лагерът ще бъдат поместени, първо ще изрежем материала с измерванията по-горе, ако е направен от дърво, 5 части ще трябва да бъдат изрязани и съединени с пирони, от друга страна, с алуминий цялото парче може да се изреже и след това да се сгъне.
След като имаме конструкцията в горната част, ще пробием 4 отвора приблизително 3 метрични, за да можем по-късно да съединим долната част с горната част с винтове и гайки.
За да поставим лагера, правим отвор с метрична корона 30 и два отвора отстрани за анкерните болтове.
Двигателите ще вървят по страничните стени в самия край.
Горна част на платформата
В тази част серво моторът ще бъде разположен и той ще бъде свързан с долната част с винтове. Първо ще изрежем кръг с диаметър 170 мм, след това ще направим четирите отвора за винтовете и в предната част правоъгълник за вмъкване на серво мотора, не поставям тези измервания, защото те ще зависят от вида на серво мотора, който използвате .
Плоча за ултразвуков сензор
Плочата ще свърже сервомотора с ултразвуковия сензор, ако е направен с дърво ще трябва да направим две части и да ги съединим, с алуминий само една част и да я сгънем, първо изрязваме плочата и веднъж сгъната в късата част правим отвор с приблизително метрични 3 за опората на сервомотора (Когато купувате сервомотор е обичайно да измисляте различни опори за закотвяне, в моя случай ще използвам кръстосан), тогава правим дупките в големия част за задържане на ултразвуковия сензор с винтове и гайки.
След като това е направено, ние сме всички заедно.
Схема на свързване
Щифтове 4, 5, 6, 7 се използват от щита на двигателя за управление на двата двигателя
Софтуер
Ще се съсредоточим върху софтуерната част и демонстрацията на работата на робота.
За да направим една програма малко по-дълга, препоръчително е да предложим алгоритъма на работа, това ще ни помогне много при програмирането. Алгоритъмът е набор от инструкции, който ви позволява да извършвате дейност.
алгоритъм:
Програмата е разделена на основната програма и след това няколко подпрограми, в основната е мястото, където са разположени бутоните за стартиране и спиране и извикванията към подпрограмите за измерване на разстояние, аванс и различните завои в зависимост от страничните разстояния.
програма:
//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 [/ подчертана]
Лека нощ, в софтуера за робот arduino със сензор за близост, променливата turn = 1, програмата го разбира като завъртане надясно или това е свързано с библиотеките, за да разбере това.
същото за завой = 2 (завъртете робота наляво) и завой = 3 (върнете се назад и завъртете roboT),
МОЛЯ, ОБЯСНЕТЕ ТОВА СЪМНЕНИЕ, ЩЕ БЪДЯ БЛАГОДАРЯ.
ДРУГА ТОЧКА РОБОТЪТ НЯМА ГРАНИЦА ЗА ОБРАТНО И ПРИ ПЕЧАТ НА ПРОВЕРКА НА ЛЕНТИТЕ СЕ СПОМЕНА, ЧЕ ВРЪЩАНЕТО СЕ ПРИЛАГА ВРЪЩАНЕ И ВРЪЩАНЕ = 3, НО СЕ ПРЕДЛАГА, ЧЕ НЯМА НИЩОГО, КОЕТО СЕ НАРИЧА ВРЪЩАНЕ.
ПОЗДРАВИ И НАДЯВАМ ВАШАТА ПОДКРЕПА.
Лека нощ, в софтуера за робот arduino със сензор за близост, променливата turn = 1, програмата го разбира като завъртане надясно или това е свързано с библиотеките, за да разбере това.
същото за завой = 2 (завъртете робота наляво) и завой = 3 (върнете се назад и завъртете roboT),
МОЛЯ, ОБЯСНЕТЕ ТОВА СЪМНЕНИЕ, ЩЕ БЪДЯ БЛАГОДАРЯ.
ДРУГА ТОЧКА РОБОТЪТ НЯМА ГРАНИЦА ЗА ОБРАТНО И ПРИ ПЕЧАТ НА ПРОВЕРКА НА ЛЕНТИТЕ СЕ СПОМЕНА, ЧЕ ВРЪЩАНЕТО СЕ ПРИЛАГА ВРЪЩАНЕ И ВРЪЩАНЕ = 3, НО СЕ ПРЕДЛАГА, ЧЕ НЯМА НИЩОГО, КОЕТО СЕ НАРИЧА ВРЪЩАНЕ.
ПОЗДРАВИ И НАДЯВАМ ВАШАТА ПОДКРЕПА.