ኮድ ይፈልጉ

ትምህርት 26/31፡ ስማርት መኪና ክፍል 4፡ አልትራሶኒክ ዳሳሽ በመጠቀም እንቅፋትን ማስወገድ | SunFounder Robojax

ትምህርት 26/31፡ ስማርት መኪና ክፍል 4፡ አልትራሶኒክ ዳሳሽ በመጠቀም እንቅፋትን ማስወገድ | SunFounder Robojax

በዚህ ትምህርት ውስጥ፣ ስማርት መኪናዎን የአልትራሶኒክ ዳሳሽ በመጠቀም አካባቢውን የማየት እና ምላሽ የመስጠት ችሎታ እናስታጥቀዋለን። በፊቱ ያሉትን ነገሮች ርቀት በመለካት፣ መኪናው ብልህ ውሳኔዎችን ማድረግ ይችላል፡ መንገዱ ግልጽ ሲሆን ወደ ፊት ይንቀሳቀሳል፣ አንድ ነገር በጥንቃቄ ቀጠና ውስጥ ሲሆን ይቆማል፣ እንቅፋት በጣም ሲቀርብ ደግሞ ወደ ኋላ ይመለሳል። ይህ ፕሮጀክት ቀደም ሲል የተማራችሁትን የሞተር ቁጥጥር እና የዳሳሽ መሰረታዊ ነገሮችን ይጠቀማል፣ በዚህም ሙሉ በሙሉ ራሱን የቻለ ተሽከርካሪ ያስገኛል።

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009

ይህ መጫወቻ ብቻ አይደለም፤ ይበልጥ የተወሳሰቡ የሮቦቲክስ ፕሮጀክቶችን ለመገንባት መሰረታዊ እርምጃ ነው። እዚህ የምትተገብሩት አመክንዮ—ዳሰስ፣ አስብ፣ እርምጃ ውሰድ—ከሮቦቲክ ቫክዩም ክሊነሮች እስከ ኢንዱስትሪያል አውቶሜሽን ድረስ በሁሉም ነገር ውስጥ ጥቅም ላይ የሚውል ነው። የራስዎን ግንባታ ለማነሳሳት ጥቂት ሀሳቦች እነሆ፡

  • ራሱን የቻለ ሮቨር፡ ግድግዳ ወይም የቤት እቃ ሳይመታ ክፍል ወይም ኮሪደር መቃኘት የሚችል ሮቦት ይፍጠሩ።
  • የቅርበት ማንቂያ ስርዓት፡ የአልትራሶኒክ ዳሳሹን በሰርቮ ላይ በመጫን አካባቢን ይቃኙ እና ሰራተኛ ወደ ተወሰነ ቀጠና ሲገባ ማንቂያ ወይም መብራት ያስነሱ።
  • ብልህ የመኪና ማቆሚያ ረዳት፡ ተሽከርካሪን ወደ ጠባብ ቦታ ለመምራት የርቀት መለኪያዎችን የሚጠቀም፣ ምስላዊ ወይም የድምጽ ግብረመልስ የሚሰጥ ስርዓት ይገንቡ።

ይህ መመሪያ በ SunFounder 3-in-1 Arduino ኪት እና በ"Play with Ultrasonic Module" ፕሮጀክቱ ላይ የተመሰረተ ነው። ስለ ሽቦ አገናኝ እንራመዳለን፣ የውሳኔ አሰጣጥ ኮዱን እናብራራለን፣ እና መኪናው በተግባር ላይ እናሳያለን።

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146

እንቅፋትን የማስወገድ አመክንዮ እንዴት እንደሚሰራ

የዚህ ፕሮጀክት ዋና ነገር ቀላል፣ ግን ኃይለኛ የውሳኔ ዛፍ ነው። የአልትራሶኒክ ዳሳሽ በቀጥታ ፊቱ ያለውን ነገር ርቀት ያለማቋረጥ ይለካል። ይህ የርቀት እሴት ከዚህ በታች ባለው ስእል እንደሚታየው የመኪናውን ሞተሮች ለመቆጣጠር ይጠቅማል።

  • ርቀቱ ከ 25 ሳ.ሜ በላይ ከሆነ፡ መንገዱ ግልጽ ነው፣ ስለዚህ መኪናው ወደ ፊት ይንቀሳቀሳል።
  • ርቀቱ ከ 10 ሳ.ሜ በላይ እና ከ 25 ሳ.ሜ ወይም እኩል ከሆነ፡ አንድ ነገር በ"ጥንቃቄ ቀጠና" ውስጥ ተገኝቷል፣ ስለዚህ መኪናው ግጭትን ለማስወገድ ይቆማል።
  • ርቀቱ ከ 2 ሳ.ሜ በላይ እና ከ 10 ሳ.ሜ ወይም እኩል ከሆነ፡ አንድ ነገር በአደገኛ ሁኔታ ቅርብ ነው። መኪናው ተጨማሪ ቦታ ለመፍጠር ወደ ኋላ ይመለሳል።
  • ርቀቱ ከ 2 ሳ.ሜ ወይም እኩል ከሆነ፡ መለኪያው ስህተት ሊሆን ይችላል (በትክክል ለመለካት በጣም ቅርብ ነው)፣ ስለዚህ መኪናው እንደ ደህንነት እርምጃ ይቆማል።

የሃርድዌር ክፍሎች

ይህን ፕሮጀክት ለመገንባት የሚከተሉትን ክፍሎች ያስፈልግዎታል፣ ሁሉም በ SunFounder 3-in-1 ኪት ውስጥ ይካተታሉ።

  • 1x Arduino Uno (ወይም ተኳሃኝ ቦርድ)
  • 1x ሁለት ጊርድ ሞተሮች ያሉት ስማርት መኪና ቻሲስ
  • 1x L298N ሞተር ሾፌር ሞጁል
  • 1x HC-SR04 አልትራሶኒክ የርቀት ዳሳሽ
  • 1x ብሬድቦርድ
  • ጅመር ሽቦዎች
  • ለመኪናው የኃይል አቅርቦት (ለምሳሌ የባትሪ ማህደር)
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000

የሽቦ አገናኝ መመሪያ

ሽቦው የሞተር ሾፌሩን፣ የአልትራሶኒክ ዳሳሹን እና አርዱኢኖን ያገናኛል። የሞተር ሾፌሩ የመኪናውን መንኮራኩሮች ይቆጣጠራል፣ የአልትራሶኒክ ዳሳሹ ደግሞ እንደ "ዓይኖቹ" ይሰራል።

ከ SunFounder ሰነድ የተወሰደው የግንኙነት ስእል እነሆ፡

ግንኙነቶቹን እንከፋፍላቸው። በመጀመሪያ፣ የብሬድቦርዱን አዎንታዊ እና አሉታዊ ሀዲዶች ከአርዱኢኖው 5V እና GND ፒኖች ያብሩ። የአልትራሶኒክ ዳሳሹ ከዚያ በኋላ እንደሚከተለው ይገናኛል፡

  • VCC (ኃይል)፡ በብሬድቦርዱ ላይ ካለው አዎንታዊ ሀዲድ ጋር ይገናኛል።
  • GND (መሬት)፡ በብሬድቦርዱ ላይ ካለው አሉታዊ ሀዲድ ጋር ይገናኛል።
  • Trig (ቀስቅሴ)፡ በአርዱኢኖው ላይ ካለው ዲጂታል ፒን 3 ጋር ይገናኛል። ይህ ፒን የአልትራሶኒክ ምት ይልካል።
  • Echo (መቀበያ)፡ በአርዱኢኖው ላይ ካለው ዲጂታል ፒን 4 ጋር ይገናኛል። ይህ ፒን የተንጸባረቀውን ምት ይቀበላል።

የሞተር ሾፌሩ ግንኙነቶች ከቀዳሚ ትምህርቶች ጋር ተመሳሳይ ናቸው። አራቱ የቁጥጥር ፒኖች (IN1፣ IN2፣ IN3፣ IN4) ከአርዱኢኖው ዲጂታል ፒኖች 5፣ 6፣ 9 እና 10 ጋር ይገናኛሉ። እነዚህ ፒኖች የሁለቱን ሞተሮች ፍጥነት እና አቅጣጫ ይቆጣጠራሉ። የሞተር ሾፌሩ ኃይል እና መሬት ከባትሪ ማህደሩ እና ከአርዱኢኖው መሬት ጋር በትክክል መገናኘታቸውን ያረጋግጡ። (በቪዲዮው ላይ በ02:24)

የኮድ ማብራሪያ

የዚህ ፕሮጀክት ኮድ ከአልትራሶኒክ ዳሳሹ በተገኘው የርቀት መለኪያ ላይ በመመስረት የመኪናውን ባህሪ ይቆጣጠራል። አመክንዮው ቀላል እና ለማበጀት ቀላል ነው። ቁልፍ የሆኑትን፣ በተጠቃሚ ሊዋቀሩ የሚችሉ ክፍሎችን እንመልከት።

1. የፒን ትርጓሜዎች

በስኬቹ አናት ላይ፣ ለሞተሮቹ እና ለአልትራሶኒክ ዳሳሹ ፒኖች ተብራርተዋል። ክፍሎችዎን ከተለያዩ የአርዱኢኖ ፒኖች ጋር ካገናኙ እነዚህን መቀየር ይችላሉ።

const int A_1B = 5;
  const int A_1A = 6;
  const int B_1B = 9;
  const int B_1A = 10;
  
  const int trigPin = 3;
  const int echoPin = 4;

እዚህ፣ A_1AA_1BB_1A እና B_1B በ L298N ሾፌር በኩል የግራ እና የቀኝ ሞተሮችን ይቆጣጠራሉ። trigPin እና echoPin ለአልትራሶኒክ ዳሳሹ ናቸው።

2. የባህሪ ተለዋዋጮች እና አመክንዮ

ዋናው ባህሪ በloop() ተግባር ውስጥ ቁጥጥር ይደረግበታል። የመኪናውን "ስብዕና" ማስተካከል የሚችሉት እዚህ ነው።

```cpp void loop() { float distance = readSensorData(); if (distance > 25) { moveForward(200); } else if (distance < 10 && distance > 2) { moveBackward(200); } else { stopMove(); } } ``` እንዴት ማበጀት እንደሚቻል እነሆ፡- - **የርቀት ገደቦች፡-** ቁጥሮቹ `25` እና `10` “አስተማማኝ” እና “አደገኛ” ዞኖችን በሴንቲሜትር ይገልጻሉ። `25` ን ይጨምሩ መኪናው ቀደም ብሎ እንዲቆም፣ ወይም ይቀንሱት ወደ እንቅፋቶች እንዲቀርብ ለማድረግ። `2` በጣም ቅርብ ከሆኑ ነገሮች የተሳሳቱ ንባቦችን ችላ ለማለት የደህንነት ህዳግ ነው። - **የሞተር ፍጥነት፡-** `200` ለ `moveForward()` እና `moveBackward()` የተላለፈው የመኪናውን ፍጥነት ያዘጋጃል። ይህ ዋጋ ከ0 እስከ 255 ሊደርስ ይችላል። ዝቅተኛ ዋጋ፣ እንደ 150፣ መኪናው በዝግታ እና በጥንቃቄ እንዲንቀሳቀስ ያደርጋል። የቀረው ኮድ የአልትራሶኒክ ዳሳሹን ጊዜ በመያዝ ርቀትን የሚያሰላውን `readSensorData()` ተግባር እና የሞተር ሾፌሩን ተፈላጊውን ተግባር እንዲፈጽሙ የሚቆጣጠሩትን `moveForward()`፣ `moveBackward()` እና `stopMove()` ተግባራትን ያካትታል። ## የተለመደ ስህተትን መፍታት እንደ `'moveForward' was not declared in this scope` ያለ ስህተት ሊያጋጥምዎት ይችላል። ይህ የሚከሰተው የአርዱኢኖ IDE ኮዱን ከላይ ወደ ታች ስለሚያነብ ነው። ወደ `loop()` ተግባር ሲደርስ፣ ከሱ በታች የተገለጹትን ተግባራት እስካሁን አያውቅም። ይህንን ለማስተካከል፣ ከ`setup()` ተግባር በፊት “የተግባር ፕሮቶታይፖችን” መጨመር አለብዎት። እነዚህ በሴሚኮሎን የሚያልቁ የተግባሩ ስም እና የመመለሻ አይነት መግለጫዎች ብቻ ናቸው። ```cpp void moveForward(int speed); void moveBackward(int speed); void stopMove(); float readSensorData(); ``` እነዚህን መስመሮች መጨመር ለኮምፕዩተሩ “እነዚህ ተግባራት አሉ እና በኋላ ይገለጻሉ” ይለዋል፣ ይህም ስህተቱን ይፈታል። (በቪዲዮ 09:21 ላይ) ## የዳሳሽ መረጋጋትን ማሻሻል በሙከራ ጊዜ፣ መንገዱ ግልጽ ቢሆንም መኪናው ሲቆም ወይም ሲንከራተት ሊታወቅ ይችላል። ይህ ብዙውን ጊዜ loop በጣም በፍጥነት ስለሚሰራ እና የአልትራሶኒክ ዳሳሹ የኢኮ ምልክቱን ለመቀበል በቂ ጊዜ ስለሌለው፣ በዚህም ምክንያት 0 ሴ.ሜ ንባብ ስለሚያስገኝ ነው። ይህንን ለማስተካከል፣ ዳሳሹ እንዲሰራ ጊዜ ለመስጠት በ`loop()` ተግባር መጨረሻ ላይ ትንሽ መዘግየት ይጨምሩ። ```cpp void loop() { float distance = readSensorData(); if (distance > 25) { moveForward(200); } else if (distance < 10 && distance > 2) { moveBackward(200); } else { stopMove(); } delay(100); // ለተረጋጋ ንባቦች የ100ms መዘግየት ይጨምሩ } ``` የ100 ሚሊሰከንድ መዘግየት ብዙውን ጊዜ የተረጋጋ እና ወጥ የሆነ የርቀት ንባቦችን ለማግኘት በቂ ነው። (በቪዲዮ 10:56 ላይ) ## የቀጥታ ፕሮጀክት ማሳያ ኮዱ ከተጫነ በኋላ፣ Serial Monitor ን ይክፈቱ። “Forward”፣ “Reverse” ወይም “Stop” ያሉ የመኪናውን ሁኔታ የሚያመለክቱ ጽሑፎችን ያያሉ። በማሳያው ላይ፣ መኪናው እንቅፋት ፊት ለፊት ተቀምጧል። እንቅፋቱ ከ25 ሴ.ሜ በላይ ሲሆን፣ መኪናው ወደ ፊት ይንቀሳቀሳል። እጅዎን ወደ ቅርብ ሲያንቀሳቅሱ፣ ርቀቱ ከ25 ሴ.ሜ በታች ሲወርድ መኪናው ይቆማል። እጅዎን በጣም ቅርብ፣ በ10 ሴ.ሜ ውስጥ ካመጡ፣ መኪናው ወደ ኋላ ይመለሳል። ይህ ባህሪ በቪዲዮው ውስጥ በግልጽ ይታያል እና የእንቅፋት መራቅ አመክንዮ በትክክል እየሰራ መሆኑን ያረጋግጣል። (በቪዲዮ 11:53 ላይ) ## ማጠቃለያ እንኳን ደስ አለዎት! አካባቢውን መንቀሳቀስ እና እንቅፋቶችን መራቅ የሚችል ብልህ መኪና በተሳካ ሁኔታ ገንብተዋል። ይህ ፕሮጀክት የዳሳሽ ግብዓትን፣ የውሳኔ አሰጣጥ አመክንዮን እና የሞተር ቁጥጥርን ወደ አንድ ተግባራዊ ስርዓት ያጣምራል። የአልትራሶኒክ ዳሳሽ እንዴት እንደሚጠቀሙ ብቻ ሳይሆን ለብዙ ውስብስብ ራስ-ገዝ ሮቦቶች መሰረት የሆነውን ቀላል የቁጥጥር ስልተ-ቀመር እንዴት እንደሚተገብሩም ተምረዋል። ## ምዕራፎች - [00:00] የእንቅፋት መራቅ መግቢያ - [01:16] የፕሮጀክት አጠቃላይ እይታ እና ቅድመ ሁኔታዎች - [02:24] የአልትራሶኒክ ዳሳሽ እና የሞተር ሾፌር ሽቦ ማገናኘት - [04:56] የፕሮጀክት ኮድ መክፈት - [05:12] የኮድ ማብራሪያ፡- አመክንዮ እና ተግባራት - [08:34] ኮዱን መጫን እና የመጀመሪያ ሙከራ - [09:21] መላ ፍለጋ፡- የተግባር ፕሮቶታይፖች - [10:56] መላ ፍለጋ፡- ለመረጋጋት መዘግየት መጨመር - [11:53] የእንቅፋት መራቅ የቀጥታ ማሳያ

ምስሎች

27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
899-Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
ቋንቋ: C++
/*
Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor 
Get this code and watch video Download and resource page https://robojax.com/RJT609
YouTube video https://www.youtube.com/watch?v=uLBmRvaemxA

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

const int trigPin = 3;
const int echoPin = 4;

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

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

  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}

void loop() {
  float distance = readSensorData();
  if (distance > 25) {
    moveForward(200);
  }
  else if (distance < 10 && distance > 2) {
    moveBackward(200);
  } else {
    stopMove();
  }
}

float readSensorData() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
  return distance;
}


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 stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

እንደሚያስፈልግዎት ይችላል

ምንጮች እና ምንጮች

ፋይሎች📁

Arduino ቤተ መዝገቦች (zip)