ከአርዱዲኖ ጋር በቤት ውስጥ የተሰራ ሮቦት እንዴት እንደሚሰራ

በዚህ ጽሑፍ ውስጥ ሀን እንዴት ማከናወን እንደሚቻል እንማራለን በአርዱኖ ቦርድ ቁጥጥር የሚደረግበት አነስተኛ የቤት ውስጥ ሮቦት. የሮቦቱ ዓላማ በአልትራሳውንድ ዳሳሽ አማካኝነት መሰናክሎችን ለማስወገድ ይሆናል ፣ መሰናክል ሲደርስ በሁለቱም መንገዶች ይመለከታል እናም ጉዞውን ለመቀጠል በጣም ጥሩውን አማራጭ ይወስናል።

ሃርድዌር

በዚህ የመጀመሪያ ክፍል የሮቦት መድረክን በመገንባት ፣ ክፍሎቹን በመሰብሰብ እና በማገናኘት ላይ እናተኩራለን ፡፡

ሮቦት_አርዱinoኖ

አስፈላጊ ቁሳቁስ

  • አንድ Arduino ቦርድ
  • ለሁለት ሞተሮች ኤች-ድልድይ (በእኔ ሁኔታ የአርዲኖ ሞተር ጋሻ ከድሮቦት እጠቀማለሁ)
  • ሁለት የግፊት አዝራሮች
  • ሁለት የዲሲ ሞተሮች (FIT0016 DFROBOT)
  • ሁለት 10k Ohm resistors
  • ሁለት ኢንኮደር (SEN0038 DFROBOT)
  • ሁለት ጎማዎች (FIT0003 DFROBOT)
  • የኳስ ማጠራቀሚያ (ተሸካሚ)
  • አንድ servomotor
  • አንድ ለአልትራሳውንድ ቅርበት ዳሳሽ
  • አንድ 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 ለ Ikkaro የተፃፈ ነው [/ የደመቀ]

2 አስተያየቶች "ከአርዱዲኖ ጋር በቤት ውስጥ የተሰራ ሮቦት እንዴት እንደሚሰራ"

  1. ደህና ምሽት ፣ በአርዱinoኖ ሮቦት ሶፍትዌር ከቅርብ ዳሳሽ ጋር ፣ ተለዋዋጭው መዞሪያ = 1 ፣ ፕሮግራሙ በቀኝ በኩል እንደ ተረዳው ወይም ይህን ለመረዳት ከቤተ-መጻህፍት ጋር የተገናኘ ነው ፡፡
    ተመሳሳይ ለመታጠፍ = 2 (ሮቦቱን ወደ ግራ ያዙ) እና ማዞር = 3 (ወደኋላ ይመለሱ እና ሮቦቱን ያብሩ) ፣
    እባክዎን ይህንን ጥርጣሬ ይግለጹ ፣ አመሰግናለሁ እላለሁ ፡፡

    ሌላኛው ነጥብ ሮቦት ለመቀልበስ ባዶ ነገር የለውም እና በቼኪንግ ባንዶች ህትመት ውስጥ መመለሻ እና መመለሻ መጠቀሱ የተጠቀሰ ነው = 3 ፣ ግን የተመለሰ ምንም ባዶ ነገር እንደሌለ ይገመታል ፡፡

    ሰላምታ እና ድጋፍዎን እጠብቃለሁ ፡፡

    መልስ
  2. ደህና ምሽት ፣ በአርዱinoኖ ሮቦት ሶፍትዌር ከቅርብ ዳሳሽ ጋር ፣ ተለዋዋጭው መዞሪያ = 1 ፣ ፕሮግራሙ በቀኝ በኩል እንደ ተረዳው ወይም ይህን ለመረዳት ከቤተ-መጻህፍት ጋር የተገናኘ ነው ፡፡
    ተመሳሳይ ለመታጠፍ = 2 (ሮቦቱን ወደ ግራ ያዙ) እና ማዞር = 3 (ወደኋላ ይመለሱ እና ሮቦቱን ያብሩ) ፣
    እባክዎን ይህንን ጥርጣሬ ይግለጹ ፣ አመሰግናለሁ እላለሁ ፡፡

    ሌላኛው ነጥብ ሮቦት ለመቀልበስ ባዶ ነገር የለውም እና በቼኪንግ ባንዶች ህትመት ውስጥ መመለሻ እና መመለሻ መጠቀሱ የተጠቀሰ ነው = 3 ፣ ግን የተመለሰ ምንም ባዶ ነገር እንደሌለ ይገመታል ፡፡

    ሰላምታ እና ድጋፍዎን እጠብቃለሁ ፡፡

    መልስ

አስተያየት ተው