Uyenza njani irobhothi eyenziweyo kunye neArduino

Kule nqaku siza kufunda ngendlela yokwenza ifayile ye irobhothi encinci eyenziwe ekhaya elawulwa yibhodi yeArduino. Injongo yeerobhothi iya kuba kukuthintela imiqobo ngokusebenzisa inzwa ye-ultrasound, xa ifika kumqobo iya kujonga zombini iindlela kwaye ichonge eyona ndlela yokuqhubeka nokuhamba kwayo.

isibulali

Kule nxalenye yokuqala siza kugxila ekwakheni iqonga leerobhothi, ukudibanisa iinxalenye kunye nokuzidibanisa.

lungelo_co

Izinto eziyimfuneko

  • Ibhodi yeArduino
  • I-H-ibhulorho yee-Motors ezimbini (Kwimeko yam ndiya kusebenzisa iArduino motor shield from dfrobot)
  • Amaqhosha amabini okutyhala
  • Iimoto ezimbini zeDC (FIT0016 DFROBOT)
  • Ezimbini 10k Ohm resistors
  • Iikhowudi ezimbini (SEN0038 DFROBOT)
  • Iivili ezimbini (FIT0003 DFROBOT)
  • Ibhola ekhatywayo (ethwele)
  • Umncedisi
  • Isivamvo sokusondela kwi-ultrasonic
  • Ibhetri enye ye-7,2v
  • Umthi okanye ialuminium ukwakha iqonga

H ibhulorho:

H ibhulorho

I-H-ibhulorho yisekethe ye-elektroniki evumela i-DC yombane ukuba ijikeleze macala omabini.
Yenziwe ngokutshintsha oku-4 (kusetyenziswa ii-transistors) kunye nokudityaniswa kwezi zinto kwenza ukuba ihambe ngendlela enye okanye enye njengoko kubonisiwe kumfanekiso olandelayo.

H ukusebenza kwebhulorho

Isifaki khowudi:

encoder

I-encoder sisivamvo esifakwe kwimoto ukuze sazi indawo emi kuyo, oku kusenza sikwazi ukulawula ukujikeleza kwayo.

Inzwa yokusondela ye-Ultrasonic:

isivamvo cuke

Le nzwa ithumela ii-pulses ze-ultrasound, ezi zibuyisela umva kwaye zibuyele kwisenzi. Umgama ungabalwa ukusuka kubude bendlela yokubetha kwendlela ye-ultrasound kunye nesantya sesandi emoyeni. Uluhlu lwayo lokulinganisa luhlala luyi-3cm ukuya kwi-4 yeemitha.

Ukwakhiwa:

Emva koko ndiza kuchaza indibano yeqonga kunye nokunxibelelana kwamacandelo ahlukeneyo.
Oku kungakhiwa ngealuminiyam okanye ngomthi, ialuminiyam inika ukuthembeka okungcono kulwakhiwo kodwa kunzima ngakumbi ukuqhubekeka. Kwimeko yam ndiyenzile nge-aluminium.

Yonke imilinganiselo iyabonisa

Ezantsi kweqonga

iqonga irobhothi amanyathelo

Kule nxalenye iimoto kunye nokuthwala kuya kugcinwa, okokuqala siza kusika izinto kunye nemilinganiselo engentla, ukuba yenziwe ngomthi, iinxalenye ezi-5 kuya kufuneka zisikwe kwaye zidityaniswe nezipikili, kwelinye icala, ngealuminiyam, sonke eso siqwenga singanqunyulwa uze usonge.

Nje ukuba sibe nesakhiwo kwindawo ephezulu, siya kubhola imingxunya emi-4 malunga neetriki ezi-3 ukuze kamva sikwazi ukujoyina icandelo elisezantsi kunye nenxalenye ephezulu ngezikrufu namandongomane.

Ukubeka indawo yokuthwala senza umngxunya ngesithsaba seetriki ezingama-30 kunye nemingxunya emibini emacaleni kwiibholiti ze-ankile.

Iinjini ziya kuhamba ezindongeni ezisecaleni.

iqonga elingaphantsi


Phezulu kweqonga

iqonga irobhothi amanyathelo

Kule nxalenye imoto ye-servo iya kugcinwa kwaye iya kudityaniswa nenxalenye esezantsi ngezikrufu. Kuqala siza kusika isangqa se-170mm sangqa, emva koko siyakwenza imingxunya emine yezikrufu kwaye ngaphambili uxande ukufaka i-servo motor, andiyibeki le milinganiselo kuba iya kuxhomekeka kuhlobo lwe-servo motor oyisebenzisayo.

iqonga eliphezulu

Ipleyiti yesenzisi se-ultrasonic

iqonga irobhothi amanyathelo

Isitya siza kudibanisa i-servo motor kunye ne-sensor ye-ultrasound, ukuba yenziwe ngomthi kuya kufuneka senze iinxalenye ezimbini kwaye sizidibanise, kunye ne-aluminium enye kuphela kwaye siyisonge, kuqala siyisika ipleyiti kwaye siyisonge kwinxalenye emfutshane Senza umngxuma malunga ne-metric 3 yenkxaso ye-servomotor (Xa uthenga iseromotor kuqhelekile ukuba uze neenkxaso ezahlukileyo kwi-anchor kwimeko yam ndiza kusebenzisa umnqamlezo), emva koko senza imingxunya enkulu Inxalenye yokubamba inzwa ye-ultrasound ngezikrufu kunye namandongomane.

ibhodi yesenzi

Nje ukuba kwenziwe oku sidibanisa konke.

iqonga onyusiweyo

iqonga onyusiweyo

iqonga onyusiweyo

Umzobo woxhumano

Inkqubo yonxibelelwano

Izikhonkwane 4, 5, 6, 7 zisetyenziswa likhaka Motor ukulawula iinjini ezimbini

Izikhonkwane zonxibelelwano

software

Siza kugxila kwinxalenye yesoftware kunye nomboniso wokusebenza kweerobhothi.

Irobhothi yeArduino

Ukwenza inkqubo inde, kuyacetyiswa ukuba uphakamise ukusebenza kwealgorithm, oku kuya kusinceda kakhulu xa kusenziwa inkqubo. Ialgorithm siseti yemiyalelo ekuvumela ukuba wenze umsebenzi.

Ialgorithm:

Ialgorithm algorithm

Inkqubo yahlulwe yinkqubo ephambili emva koko zaneenkqubo ezininzi, kwindawo ephambili kulapho amaqhosha okuqala nawokumisa abekwe khona kunye neefowuni kwiinkqubo ezilinganiselweyo zomgama, ukuqhubela phambili kunye nokujika okwahlukileyo ngokuxhomekeke kumgama osecaleni.

Inkqubo:

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

Umboniso:

[ibonisiwe] Eli nqaku lalibhalwe kuqala yi Wk3 ye Ikkaro [/ ibalaselisiwe]

Izimvo ezi-2 ku "Uyenza njani irobhothi eyenziwe ekhaya kunye neArduino"

  1. Ubusuku obuhle, kwisoftware ye-arduino yesoftware enesivamvo sokusondela, ukujika okuguqukayo = 1, inkqubo iyayiqonda njengokujika ekunene okanye oku kunxulunyaniswa neelayibrari ukukuqonda oku.
    efanayo ukujika = 2 (jika irobhothi ngasekhohlo) kwaye ujike = 3 (buyela emva kwaye ujike i-roboT),
    NDICELA NICACISE LE NTANDABUZO, NDIZOBULELA.

    OLUNYE ULWIMI IROBOTI ALINAVO LOKUHLAWULWA KWAKHO KWIPHRINTA LOKUJONGA AMABHINQA, KUCHELWA UKUBA UKUBUYELA NOKUBUYELA KUFANELE KWENZIWE EKUBUYENI = 3, KODWA KUCELWA UKUBA AKUKHO LILILO ELIBIZWA NGOKUBUYELA.

    MIBULELO NAM Ndiyathemba INKXASO YENU.

    impendulo
  2. Ubusuku obuhle, kwisoftware ye-arduino yesoftware enesivamvo sokusondela, ukujika okuguqukayo = 1, inkqubo iyayiqonda njengokujika ekunene okanye oku kunxulunyaniswa neelayibrari ukukuqonda oku.
    efanayo ukujika = 2 (jika irobhothi ngasekhohlo) kwaye ujike = 3 (buyela emva kwaye ujike i-roboT),
    NDICELA NICACISE LE NTANDABUZO, NDIZOBULELA.

    OLUNYE ULWIMI IROBOTI ALINAVO LOKUHLAWULWA KWAKHO KWIPHRINTA LOKUJONGA AMABHINQA, KUCHELWA UKUBA UKUBUYELA NOKUBUYELA KUFANELE KWENZIWE EKUBUYENI = 3, KODWA KUCELWA UKUBA AKUKHO LILILO ELIBIZWA NGOKUBUYELA.

    MIBULELO NAM Ndiyathemba INKXASO YENU.

    impendulo

Shiya amazwana