Arduino နဲ့အိမ်လုပ်စက်ရုပ်လုပ်နည်း

ဤဆောင်းပါး၌ကျွန်ုပ်တို့သည်မည်သို့လုပ်ဆောင်ရမည်ကိုလေ့လာသွားပါမည် Arduino ဘုတ်အဖွဲ့မှထိန်းချုပ်ထားသောအိမ်လုပ်စက်ရုပ်လေး။ စက်ရုပ်၏ရည်မှန်းချက်မှာ ultrasound sensor တစ်ခုဖြင့်အတားအဆီးများကိုရှောင်ရှားရန်ဖြစ်သည်။ ၎င်းသည်အတားအဆီးတစ်ခုသို့ရောက်သောအခါနှစ်ဖက်စလုံးမှကြည့်ရှုပြီး၎င်းကိုဆက်လက်ချီတက်ရန်အကောင်းဆုံးရွေးချယ်မှုကိုဆုံးဖြတ်လိမ့်မည်။

hardware

ဤအပိုင်းတွင်စက်ရုပ်ပလက်ဖောင်းတည်ဆောက်ခြင်း၊ အစိတ်အပိုင်းများတပ်ဆင်ခြင်းနှင့်ဆက်သွယ်ခြင်းတို့ကိုကျွန်ုပ်တို့အာရုံစိုက်မည်။

စက်ရုပ်_arduino

လိုအပ်သောပစ္စည်း

  • Arduino ဘုတ်အဖွဲ့
  • မော်တာနှစ်လုံးအတွက် H-bridge (ကျွန်ုပ်ကိစ္စတွင်ကျွန်ုပ်သည် Arduino motor shield ကို dfrobot မှအသုံးပြုလိမ့်မည်)
  • နှစ်ခုခလုတ်
  • DC မော်တာနှစ်ခု (FIT0016 DFROBOT)
  • နှစျခု 10k Ohm resistors
  • encoder နှစ်ခု (SEN0038 DFROBOT)
  • ဘီးနှစ်ဘီး (FIT0003 DFROBOT)
  • ဘောလုံး caster (bearing)
  • တစ် ဦး က servomotor
  • ultrasonic နီးကပ်အာရုံခံကိရိယာ
  • တစ်ခုမှာ 7,2v ဘက်ထရီတစ်ခု
  • ပလက်ဖောင်းတည်ဆောက်ရန်သစ်သားသို့မဟုတ်လူမီနီယံ

H တံတား:

H တံတား

H-bridge သည်အီလက်ထရွန်နစ် circuit တစ်ခုဖြစ်ပြီး DC electric motor ကိုလမ်းကြောင်းနှစ်ခုလုံးတွင်လည်ပတ်စေသည်။
၎င်းကို 4 transcors (transistors ကိုသုံးပြီး) နဲ့ဖွဲ့စည်းထားတာဖြစ်ပြီးဒီပုံရိပ်တွေမှာပြထားတဲ့အတိုင်းတစ်လမ်းသွားတစ်လမ်းထွက်သွားသည်။

H တံတားစစ်ဆင်ရေး

ကုဒ်နံပါတ်:

အန်ကုဒ်

encoder ဆိုသည်မှာ motor ၏တည်နေရာကိုသိရှိရန် motor တွင်တပ်ဆင်ထားသော sensor တစ်ခုဖြစ်သည်။ ၎င်းသည်၎င်းအား၎င်း၏လည်ပတ်မှုကိုထိန်းချုပ်စေသည်။

ultrasonic နီးကပ်အာရုံခံ:

ultrasonic အာရုံခံကိရိယာ

ဒီအာရုံခံကိရိယာဟာ ultrasound ပို့လွှတ်မှုများကိုပို့သည်။ အကွာအဝေးကို ultrasound pulse လမ်းကြောင်း၏ကြာချိန်နှင့်လေထဲရှိအသံအမြန်နှုန်းတို့မှတွက်ချက်နိုင်သည်။ ၎င်း၏တိုင်းတာခြင်းအကွာအဝေးများသောအားဖြင့် 3cm မှ 4 မီတာဖြစ်ပါတယ်။

ဆောက်လုပ်ရေး:

နောက်ပြီးပလက်ဖောင်း၏တပ်ဆင်ပုံနှင့်မတူညီသောအစိတ်အပိုင်းများ၏ဆက်သွယ်မှုကိုကျွန်ုပ်ရှင်းပြပါမည်။
၎င်းကိုအလူမီနီယမ်ဖြင့်ဖြစ်စေ၊ သစ်သားဖြင့်ဖြစ်စေတည်ဆောက်နိုင်သည်။ အလူမီနီယမ်သည်ဖွဲ့စည်းတည်ဆောက်ပုံကိုပိုမိုကောင်းမွန်အောင်ပြုလုပ်သော်လည်းလုပ်ငန်းလုပ်ရန်ခက်ခဲသည်။ ငါ့အမှု၌ငါကလူမီနီယံ၏လုပ်ကြပြီ

အားလုံးတိုင်းတာညွှန်ပြကြသည်

ပလက်ဖောင်း၏အောက်ဆုံး

စက်ရုပ်ပလက်ဖောင်းအစီအမံ

ဤအပိုင်းတွင်မော်တာများနှင့် bearing များကိုထားရှိမည်ဖြစ်သည်။ ပထမအနေဖြင့်သစ်သားဖြင့်ပြုလုပ်ထားပါက၊ အပိုင်း ၅ ပိုင်းကိုဖြတ်ပြီးလက်သည်းများနှင့်တွဲဖက်ရမည်။ တပြင်လုံးကိုအပိုင်းအစဖြတ်ပြီးတော့ခေါက်နိုင်ပါတယ်။

ကျွန်ုပ်တို့အထက်ပိုင်းရှိဖွဲ့စည်းပုံကိုရရှိသည်နှင့်တပြိုင်နက်ကျွန်ုပ်တို့သည်ခန့်မှန်းခြေအားဖြင့်မက်ထရစ် (၃) ခုကိုတွင်း (၄) တွင်းတူးရမည်။ နောက်ပိုင်းအပိုင်းကိုအနိမ့်အမြင့်များ၊

၀ ိုင်ကိုနေရာချရန်အတွက်ကျွန်ုပ်တို့သည်မက်ထရစ်တန် ၃၀ ဖြင့်အပေါက်တစ်ပေါက်နှင့်နှစ်ဖက်စလုံးတွင်ကျောက်ဆူးသော့ခလောက်များအတွက်အပေါက်တစ်ခုပြုလုပ်သည်။

အင်ဂျင်သည်အဆုံးတွင်ဘေးဘက်နံရံများပေါ်သို့တက်သွားမည်။

အောက်ခြေပလက်ဖောင်း


ပလက်ဖောင်းထိပ်

စက်ရုပ်ပလက်ဖောင်းအစီအမံ

ဤအပိုင်း၌ servo motor ကိုထားရှိမည်ဖြစ်ပြီးအောက်ပိုင်းနှင့် screw နှစ်ခုပါ ၀ င်လိမ့်မည်။ ပထမဆုံး ၁၇၀ မီလီမီတာအ ၀ န်းကိုဖြတ်မယ်၊ ပြီးတော့ screw နှစ်ခုအတွက်အပေါက်လေးခုကိုလုပ်ပြီးရှေ့အပိုင်းမှာတော့ servo motor ကိုထည့်ဖို့စတုဂံကိုလုပ်ပါလိမ့်မယ်။ ဒီတိုင်းတာမှုတွေကိုငါမသုံးဘူး၊ ဘာကြောင့်လဲဆိုတော့သူတို့အသုံးပြုတဲ့ servo motor ပေါ်မူတည်လိမ့်မယ်။ ။

ထိပ်တန်းပလက်ဖောင်း

ultrasonic အာရုံခံကိရိယာအဘို့အပြား

စက်ရုပ်ပလက်ဖောင်းအစီအမံ

သံမဏိပြားသည် servo motor ကို ultrasound sensor နှင့်ချိတ်ဆက်သည်။ အကယ်၍ ၎င်းကိုသစ်သားဖြင့်ပြုလုပ်မည်ဆိုပါကကျွန်ုပ်တို့သည်အပိုင်းနှစ်ပိုင်းနှင့်ပေါင်းစည်းရမည်။ အလူမီနီယမ်တစ်ခုတည်းဖြင့်သာအစိတ်အပိုင်းတစ်ခုခေါက်။ လှည့်ပါ။ ကျနော်တို့ servomotor ထောက်ခံမှုများအတွက်ခန့်မှန်းခြေအားဖြင့်မက်ထရစ် 3 အပေါက်တစ်ခုလုပ် (သင်တစ် ဦး servomotor ကိုဝယ်တဲ့အခါမှာငါ့အမှု၌ကျောက်ဆူးမှကွဲပြားခြားနားသောအထောက်အပံ့များနှင့်အတူတက်လာရန်အဘို့အဘုံဖြစ်သကဲ့သို့ငါလက်ဝါးကပ်တိုင်တ ဦး တည်းကိုသုံးပါလိမ့်မယ်), ပြီးတော့ကျနော်တို့အပေါက်ထဲမှာပေါက် အပိုင်းအစများနှင့်အခွံမာသီးနှင့်အတူ ultrasound အာရုံခံကိရိယာကိုကိုင်ထားရန်တစ်စိတ်တစ်ပိုင်း။

အာရုံခံဘုတ်

ဒီပြီးတာနဲ့ငါတို့ကအားလုံးကိုအတူတကွထားတော်မူ၏။

တပ်ဆင်ထားပလက်ဖောင်း

တပ်ဆင်ထားပလက်ဖောင်း

တပ်ဆင်ထားပလက်ဖောင်း

ဆက်သွယ်မှုပုံ

ဆက်သွယ်မှုအစီအစဉ်

တံသင် 4, 5, 6, 7 မော်တာနှစ်ခုကိုထိန်းချုပ်ရန် Motor shield ကအသုံးပြုသည်

connection pins

Software များ

ဆော့ (ဖ်) ဝဲအပိုင်းနှင့်စက်ရုပ်လည်ပတ်မှုကိုသရုပ်ပြပါ။

Arduino စက်ရုပ်

ပရိုဂရမ်တစ်ခုကိုနည်းနည်းကြာအောင်လုပ်ရန်စစ်ဆင်ရေး algorithm ကိုတင်ပြရန်အကြံပြုသည်၊ ၎င်းသည်ပရိုဂရမ်ရေးသားရာတွင်ကျွန်ုပ်တို့အားများစွာကူညီလိမ့်မည်။ algorithm တစ်ခုဆိုသည်မှာလုပ်ဆောင်မှုတစ်ခုကိုလုပ်ဆောင်ရန်ခွင့်ပြုသည့်ညွှန်ကြားချက်များဖြစ်သည်။

Algorithm:

စက်ရုပ် algorithm

အဓိကပရိုဂရမ်ကိုအဓိကပရိုဂရမ်အဖြစ်ခွဲပြီး၊ နောက်ပရိုဂရမ်အတော်များများကိုခွဲခြားသည်။ အဓိကတစ်ခုမှာ start နှင့် stop ခလုတ်များတည်ရှိပြီးအကွာအဝေးကိုတိုင်းတာရန်၊ ကြိုတင်၍ ကွဲပြားသောအလှည့်များကိုတိုင်းတာရန်အတွက် subprograms သို့ခေါ်ဆိုမှုများသည်နှစ် ဦး နှစ်ဖက်အကွာအဝေးပေါ်မူတည်သည်။

ပရိုဂရမျ:

//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 အတွက်ရေးသားခဲ့သည် [/ highlighted]

2 မှတ်ချက်များ "Arduino နှင့်အိမ်လုပ်စက်ရုပ်ပြုလုပ်နည်း"

  1. ကောင်းသောည, proximity sensor နှင့်အတူ arduino စက်ရုပ်ဆော့ဖ်ဝဲတွင်, variable ကို turn = 1, အစီအစဉ်ကိုညာဘက်အလှည့်အဖြစ်နားလည်သို့မဟုတ်ဒီနားလည်ရန်စာကြည့်တိုက်များနှင့်ဆက်စပ်နေသည်
    အလှည့် = 2 (စက်ဝိုင်းကိုဘယ်ဘက်သို့လှည့်) နှင့် = 3 (ပြန်သွားပါနှင့် roboT လှည့်) အတွက်အတူတူပင်,
    ဒီသံသယကိုရှင်းပြပါ၊ သင့်ကိုကျေးဇူးတင်ပါတယ်။

    အခြားအချက်တစ်ခုမှာ ROBOT သည်နောက်ပြန်ပြောင်းရန် VOID မရှိပါ၊ စစ်ဆေးရန် BANDS ၏ပုံနှိပ်ခြင်းတွင်ပြန်လည်ပြန်လာခြင်းနှင့်ပြန်လည်ခေါ်ယူခြင်းမရှိဟုဖော်ပြထားသည်။ သို့သော်၎င်းကိုပြန်လည်ခေါ်ဆိုခြင်းမရှိဟုသတ်မှတ်ထားသည်။

    နှုတ်ခွန်းဆက်စကားများနှင့်သင့်ထောက်ခံမှုအတွက်ကျွန်ုပ်မျှော်လင့်ပါသည်။

    အဖွေ
  2. ကောင်းသောည, proximity sensor နှင့်အတူ arduino စက်ရုပ်ဆော့ဖ်ဝဲတွင်, variable ကို turn = 1, အစီအစဉ်ကိုညာဘက်အလှည့်အဖြစ်နားလည်သို့မဟုတ်ဒီနားလည်ရန်စာကြည့်တိုက်များနှင့်ဆက်စပ်နေသည်
    အလှည့် = 2 (စက်ဝိုင်းကိုဘယ်ဘက်သို့လှည့်) နှင့် = 3 (ပြန်သွားပါနှင့် roboT လှည့်) အတွက်အတူတူပင်,
    ဒီသံသယကိုရှင်းပြပါ၊ သင့်ကိုကျေးဇူးတင်ပါတယ်။

    အခြားအချက်တစ်ခုမှာ ROBOT သည်နောက်ပြန်ပြောင်းရန် VOID မရှိပါ၊ စစ်ဆေးရန် BANDS ၏ပုံနှိပ်ခြင်းတွင်ပြန်လည်ပြန်လာခြင်းနှင့်ပြန်လည်ခေါ်ယူခြင်းမရှိဟုဖော်ပြထားသည်။ သို့သော်၎င်းကိုပြန်လည်ခေါ်ဆိုခြင်းမရှိဟုသတ်မှတ်ထားသည်။

    နှုတ်ခွန်းဆက်စကားများနှင့်သင့်ထောက်ခံမှုအတွက်ကျွန်ုပ်မျှော်လင့်ပါသည်။

    အဖွေ

မှတ်ချက် Leave