Бул макалада биз кантип аткарууну үйрөнөбүз Arduino тактасынын көзөмөлүндөгү кичинекей үй роботу. Роботтун максаты - УЗИ сенсорунун жардамы менен тоскоолдуктарды болтурбоо, ал тоскоолдукка жеткенде эки тарапты карап, маршты улантуунун мыкты вариантын аныктайт.
Hardware
Бул биринчи бөлүктө робот платформасын курууга, бөлүктөрүн чогултууга жана туташтырууга көңүл бурабыз.
Керектүү материал
- Arduino тактасы
- Эки кыймылдаткычка арналган H көпүрөсү (эгерде мен Arduino мотор калканын dfrobot колдоном)
- Эки баскыч
- Эки DC кыймылдаткычы (FIT0016 DFROBOT)
- Эки 10k Ом резистор
- Эки коддогуч (SEN0038 DFROBOT)
- Эки дөңгөлөк (FIT0003 DFROBOT)
- Топ тоголок (подшипник)
- Сервомотор
- УЗИ жакындык сенсору
- Бир 7,2v батарейка
- Платформаны куруу үчүн жыгач же алюминий
Н-көпүрө:
Н көпүрө - туруктуу электр кыймылдаткычынын эки багытта тең айлануусуна мүмкүнчүлүк берген электрондук чынжыр.
Ал 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 тарабынан Иккаро үчүн жазылган [/ бөлүп көрсөтүлгөн]
Кайырлуу түн, жакындык сенсору бар ардуино робот программасында, өзгөрүлмө кезек = 1, программа аны оңго бурулган деп түшүнөт же муну түшүнүү үчүн китепканалар менен байланыштырылат.
ошол эле бурулуш = 2 (роботту солго буруңуз) жана = 3 буруңуз (артка жана роботту буруңуз),
БУЛ КҮМӨНДҮ ТҮШҮНДҮРҮҢҮЗ, САГА ЫРААЗЫ БОЛОМ.
РОБОТТУН ДАГЫ БИР НУКТАСЫ КАЙРА БЕРҮҮГӨ ЖАНА БАНДДАРДЫ ТЕКШЕРҮҮГӨ БОЛБОЙТ, КАЙТКАНДА = 3 КАЙТЫП КЕЛГЕНДИГИ ЖӨНҮНДӨ АЙТЫЛАТ, БИРОК КАЙРЫЛЫШ ДЕП БУТУРГАН ЖОК ДЕП ОЙЛОГОН.
КУТТУКТОО ЖАНА СИЗДИН КОЛДООҢУЗДАРГА ҮМҮТ БЕРЕМ.
Кайырлуу түн, жакындык сенсору бар ардуино робот программасында, өзгөрүлмө кезек = 1, программа аны оңго бурулган деп түшүнөт же муну түшүнүү үчүн китепканалар менен байланыштырылат.
ошол эле бурулуш = 2 (роботту солго буруңуз) жана = 3 буруңуз (артка жана роботту буруңуз),
БУЛ КҮМӨНДҮ ТҮШҮНДҮРҮҢҮЗ, САГА ЫРААЗЫ БОЛОМ.
РОБОТТУН ДАГЫ БИР НУКТАСЫ КАЙРА БЕРҮҮГӨ ЖАНА БАНДДАРДЫ ТЕКШЕРҮҮГӨ БОЛБОЙТ, КАЙТКАНДА = 3 КАЙТЫП КЕЛГЕНДИГИ ЖӨНҮНДӨ АЙТЫЛАТ, БИРОК КАЙРЫЛЫШ ДЕП БУТУРГАН ЖОК ДЕП ОЙЛОГОН.
КУТТУКТОО ЖАНА СИЗДИН КОЛДООҢУЗДАРГА ҮМҮТ БЕРЕМ.