ኮድ ይፈልጉ

ትምህርት 25/31፡ ካር-3 ስማርት መኪና የኢንፍራሬድ ዳሳሾችን በመጠቀም እንቅፋትን ያስወግዳል | SunFounder Robojax

ትምህርት 25/31፡ ካር-3 ስማርት መኪና የኢንፍራሬድ ዳሳሾችን በመጠቀም እንቅፋትን ያስወግዳል | SunFounder Robojax

ይህ ፕሮጀክት የእርስዎን SunFounder 3-in-1 Arduino ስማርት መኪና ወደ ራሱ በራሱ እንቅፋት የሚያስወግድ ተሽከርካሪ ይለውጠዋል። ሁለት የኢንፍራሬድ (IR) ዳሳሾችን—አንዱ በግራ እና አንዱ በቀኝ—በመጫን፣ መኪናው በመንገዱ ላይ ያሉ ነገሮችን ለይቶ ማወቅ እና እነሱን ለማለፍ በቅጽበት ውሳኔዎችን ማድረግ ይችላል። ይህ በሮቦቲክስ ውስጥ መሠረታዊ እርምጃ ነው፣ የሴንሰር ግብዓትን ከሞተር መቆጣጠሪያ አመክንዮ ጋር በማጣመር ምላሽ ሰጪ እና ራሱን የሚያሽከረክር ማሽን መፍጠርን ያስተምርዎታል። እዚህ የሚማሩት መርሆዎች ለብዙ የገሃዱ ዓለም አፕሊኬሽኖች ይሠራሉ፣ ከእነዚህም ውስጥ፡-

  • የሮቦቲክ ቫክዩም ማጽጃ መገንባት ክፍሉን የሚያሰራጭ እና ከቤት እቃዎች ጋር የማይጋጭ።
  • መስመር ተከታይ ወይም እንቆቅልሽ ፈቺ ሮቦት መፍጠር ለውድድሮች ወይም ለትምህርታዊ ፕሮጀክቶች።
  • አውቶማቲክ የደህንነት ጥበቃ ፓትሮል ቦት ማዘጋጀት ዙሪያውን መዞር እና ግድግዳዎችን ማስወገድ የሚችል።
  • ብልህ የአሻንጉሊት መኪና መንደፍ ሳይታገት በተናጥል መጫወት የሚችል።

ይህ መመሪያ የመኪናውን ሞተሮች መቆጣጠር እና የIR ዳሳሾች እንዴት እንደሚሠሩ በተማሩበት ቀዳሚ ትምህርቶች ላይ በቀጥታ ይገነባል። እዚህ፣ እነዚያን ክህሎቶች በማጣመር ቀላል ግን ውጤታማ የእንቅፋት መከላከያ አልጎሪዝም እንተገብራለን።

የእንቅፋት መከላከያ አመክንዮ እንዴት እንደሚሠራ

ዋናው ሀሳብ ቀላል ነው፡ መኪናው በግራ እና በቀኝ በኩል ያሉ እንቅፋቶችን ለመፈተሽ ሁለት የIR ዳሳሾችን ይጠቀማል። እያንዳንዱ ዳሳሽ ዲጂታል ምልክት ያወጣል፡ LOW (0) በክልሉ ውስጥ (ወደ 20 ሴ.ሜ) አንድ ነገር ሲያገኝ እና HIGH (1) መንገዱ ግልጽ ሲሆን። አመክንዮው በዳሳሽ ሁኔታዎች ላይ በመመስረት የመኪናውን እርምጃ ይወስናል (በቪዲዮ 02:35 ላይ)፡-

  • በግራ እንቅፋት፣ ቀኝ ግልጽ፡- መኪናው እንቅፋቱን ለማስወገድ ወደ ቀኝ ይዞራል።
  • በቀኝ እንቅፋት፣ ግራ ግልጽ፡- መኪናው ወደ ግራ ይዞራል።
  • በሁለቱም በኩል እንቅፋቶች፡- መኪናው ሊጨርስ የሚችለውን መጨረሻ ለማምለጥ ወደ ኋላ ይንቀሳቀሳል።
  • ምንም እንቅፋት የለም፡- መኪናው ወደ ፊት ይነዳል።

ይህ ምላሽ ሰጪ አቀራረብ የመኪናው ባህሪ ለአሁኑ የዳሳሽ ግብዓቶቹ ቀጥተኛ ምላሽ የሆነበት የፊኒት-ስቴት ማሽን ክላሲክ ምሳሌ ነው።

Sunfounder-Smartcar-Obstacle-avoideance-1

የሃርድዌር ክፍሎች

ይህን ፕሮጀክት ለማጠናቀቅ የሚከተሉትን ክፍሎች ያስፈልግዎታል፣ ሁሉም በSunFounder 3-in-1 Arduino ኪት ውስጥ ይካተታሉ፡-

  • 1x SunFounder 3-in-1 Arduino ስማርት መኪና ኪት (ወይም ተመጣጣኝ ክፍሎች)
  • 2x የኢንፍራሬድ እንቅፋት መከላከያ ዳሳሾች
  • 1x Arduino Uno (ወይም ተኳሃኝ ቦርድ)
  • 1x የሞተር ሾፌር ሺልድ/ቦርድ
  • ጅመር ሽቦዎች

የሽቦ አገናኝ መመሪያ

ለዚህ ፕሮጀክት ትክክለኛ የዳሳሽ አሰላለፍ ወሳኝ ነው። የIR ዳሳሾች ወደ ፊት እና በመጠኑ ወደ ውጭ ተደርገው መሰለፍ አለባቸው፣ ምክንያቱም በመኪናው ጎኖች ላይ ያሉ እንቅፋቶችን ይለያሉ (በቪዲዮ 02:07 ላይ)። የሚከተለው የሽቦ አገናኝ ዲያግራም ዳሳሾችን ከአርዱኖ ጋር እንዴት ማገናኘት እንደሚቻል ያሳያል። አስተማሪው በመኪናው የዳቦ ቦርድ ላይ የተወሰነ የኃይል ማከፋፈያ ነጥብ እንደተጠቀመ ልብ ይበሉ፣ ነገር ግን ከአርዱኖ ጋር ያሉ ግንኙነቶች አስፈላጊ ናቸው።

Sunfounder-Smartcar-Obstacle-avoideance-wiring

የሽቦ ግንኙነቶች እንደሚከተለው ናቸው (በቪዲዮ 03:47 ላይ)፡-

  • ኃይል (VCC)፡- የሁለቱም የIR ዳሳሾች VCC ፒን ከአርዱኖ ላይ ካለው 5V ውጤት ወይም ከመኪናው የኃይል መስመር ጋር ያገናኙ።
  • መሬት (GND)፡- የሁለቱም የIR ዳሳሾች GND ፒን በአርዱኖ ላይ ካለው የጋራ መሬት ወይም ከመኪናው የመሬት መስመር ጋር ያገናኙ።
  • የቀኝ ዳሳሽ ውጤት (OUT)፡- የቀኝ የIR ዳሳሽ ዲጂታል ውጤት ፒን በአርዱኖ ላይ ካለው ዲጂታል ፒን 7 ጋር ያገናኙ።
  • የግራ ዳሳሽ ውጤት (OUT)፡- የግራ የIR ዳሳሽ ዲጂታል ውጤት ፒን በአርዱኖ ላይ ካለው ዲጂታል ፒን 8 ጋር ያገናኙ።

ለግራ እና ቀኝ ሞተሮች የሞተር ሾፌር ግንኙነቶች በቀዳሚው የሞተር መቆጣጠሪያ ትምህርት ከተመሰረቱት ጋር ተመሳሳይ ናቸው።

የኮድ ማብራሪያ

ለዚህ ፕሮጀክት ኮዱ ቀጥተኛ ነው። ዋናው ፕሮግራም ከጽሑፉ በታች ለማውረድ ይገኛል። እዚህ፣ ለራስዎ መኪና ሊያስተካክሏቸው በሚችሏቸው በተጠቃሚ ሊዋቀሩ በሚችሉ ክፍሎች ላይ እናተኩራለን።

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR = 7;
const int leftIR = 8;

እነዚህ መስመሮች ለሞተር ሾፌር እና ለIR ዳሳሾች ጥቅም ላይ የሚውሉትን ፒኖች ይገልጻሉ። የሞተር ፒኖች (A_1BA_1AB_1BB_1A) የሁለቱን ሞተሮች ፍጥነት እና አቅጣጫ ይቆጣጠራሉ። rightIR እና leftIR ፒኖች ከዳሳሾችዎ የምልክት ሽቦዎችን የሚያገናኙባቸው ናቸው። የተለያዩ ፒኖች ከተጠቀሙ፣ እነዚህን እሴቶች እዚህ ይቀይራሉ።

int speed = 150;

ይህ ተለዋዋጭ ለመኪናው መሠረታዊ ፍጥነት ያዘጋጃል። እሴቱ ከ0 እስከ 255 ሊደርስ ይችላል፣ 255 ከፍተኛው ፍጥነት ነው። የ150 እሴት ለመማር ጥሩ መነሻ ነው፣ ምክንያቱም በቂ ፈጣን ስለሆነ አስደሳች ነው ነገር ግን ምላሽ ለመስጠት ጊዜ ለመፍቀድ በቂ ቀርፋፋ ነው (በቪዲዮ 07:10 ላይ)። መኪናዎን ፈጣን ወይም ቀርፋፋ ለማድረግ ይህን ማስተካከል ይችላሉ።

የቀረው የኮዱ ክፍል በloop() ተግባር ውስጥ ያለውን አመክንዮ ይገልጻል። የግራ እና የቀኝ ዳሳሾችን ሁኔታ ያነባል እና ከዚያ ተገቢውን የእንቅስቃሴ ተግባር (moveForward()moveBackward()backLeft()backRight()) ይጠራል። እነዚህ ተግባራት አስቀድመው የተገለጹ ናቸው እና የሞተር ሾፌሩን በመቆጣጠር የሚፈለገውን እንቅስቃሴ ያስገኛሉ። አስተማሪው በኋላ ላይ ባደረገው ማሻሻያ የstop() ተግባርንም ጨምሯል፣ ይህም መኪናው ከማስወገድ እንቅስቃሴ በኋላ ለአጭር ጊዜ እንዲቆም ያደርጋል፣ ይህም እንቅስቃሴዎቹን የበለጠ ሆን ተብሎ የተደረገ ያደርገዋል (በቪዲዮው 10:29 ላይ)።

የቀጥታ ፕሮጀክት ማሳያ

በቪዲዮው ውስጥ፣ አስተማሪው በመጀመሪያ አመክንዮውን የሴሪያል መቆጣጠሪያን በመጠቀም ያሳያል። አንድ ሳጥን በዳሳሾቹ አጠገብ በማስቀመጥ፣ እንደ "Go Left"፣ "Go Right" ወይም "Go Backward" ያሉ ተጓዳኝ መልዕክቶች በስክሪኑ ላይ ሲታዩ ማየት ይችላሉ፣ ይህም የዳሳሽ ንባቦች እና አመክንዮው ትክክል መሆናቸውን ያረጋግጣል (በቪዲዮው 09:11 ላይ)።

አመክንዮውን ካረጋገጠ በኋላ፣ አስተማሪው ወሳኝ ማሻሻያ ይጨምራል፡ የstop() ተግባር። ይህ ተግባር መኪናው መዞር ወይም ወደ ኋላ መሄድ ከፈጸመ በኋላ ለተወሰነ ጊዜ (ለምሳሌ 1 ሰከንድ) ሙሉ በሙሉ እንዲቆም ያደርጋል፣ ይህም ድንገተኛ እንቅስቃሴዎችን ይከላከላል እና መኪናው አካባቢውን እንደገና እንዲገመግም ያስችለዋል (በቪዲዮው 10:29 ላይ)።

በመጨረሻም፣ መኪናው በተከታታይ እንቅፋቶች በመሬት ላይ ይሞከራል። ቪዲዮው መኪናው በሳጥኖች ዙሪያ በተሳካ ሁኔታ ሲዘዋወር፣ ወደ ግራ እና ቀኝ ሲዞር እና ግልጽ መንገድ ለማግኘት እንደአስፈላጊነቱ ወደ ኋላ ሲመለስ ያሳያል፣ ይህም የዚህን እንቅፋት-የማስወገድ ስልተ-ቀመር ተግባራዊ አተገባበር ያሳያል (በቪዲዮው 12:13 ላይ)።

ምዕራፎች

  • [00:00] የIR ዳሳሾች እንቅፋት-የማስወገድ መግቢያ
  • [01:24] ቅድመ-ሁኔታዎች እና የፕሮጀክት አጠቃላይ እይታ
  • [02:35] የእንቅፋት-የማስወገድ አመክንዮ እንዴት እንደሚሰራ
  • [03:47] የIR ዳሳሾችን እና ሞተሮችን ማገናኘት
  • [05:40] ኮዱን መክፈት እና ማብራራት
  • [09:11] አመክንዮውን በሴሪያል መቆጣጠሪያ መሞከር
  • [10:29] ለስላሳ አሰሳ የማቆሚያ ተግባር መጨመር
  • [11:42] የማቆሚያ ተግባሩን መሞከር
  • [12:13] በመሬት ላይ የመጨረሻ ተግባራዊ ሙከራ

ምስሎች

Sunfounder smartcar obstacle avoidance 1
Sunfounder smartcar obstacle avoidance 1
Sunfounder smartcar obstacle avoidance wiring
Sunfounder smartcar obstacle avoidance wiring
894-Lesson 25: SunFounder's 3-in-1 Arduino kit Car-3 Smart Car Avoids Obstacle Using Infrared Sensors
ቋንቋ: C++
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR = 7;
const int leftIR = 8;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //IR obstacle
  pinMode(leftIR, INPUT);
  pinMode(rightIR, INPUT);

}

void loop() {

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);
  int speed = 150;

  if (!left && right) {
    backLeft(speed);
  } else if (left && !right) {
    backRight(speed);
  } else if (!left && !right) {
    moveBackward(speed);
  } else {
    moveForward(speed);
  }
}

void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

ምንጮች እና ምንጮች

ፋይሎች📁

Arduino ቤተ መዝገቦች (zip)