ኮድ ይፈልጉ

ትምህርት 28/31፡ መኪና-6 SunFounder ራሱን የሚያሽከረክር Arduino መኪና በመጠቀም | Robojax

ትምህርት 28/31፡ መኪና-6 SunFounder ራሱን የሚያሽከረክር Arduino መኪና በመጠቀም | Robojax

በዚህ ፕሮጀክት ውስጥ፣ Arduino፣ አንድ የአልትራሳውንድ ዳሳሽ እና ሁለት የኢንፍራሬድ ዳሳሾችን በመጠቀም መሰረታዊ ራሱን የሚያሽከረክር መኪና እንገነባለን። ይህ ስለ ራስ ገዝ አሰሳ፣ የዳሳሽ ውህደት እና የውሳኔ አሰጣጥ አመክንዮ ለመማር በጣም ጥሩ የመግቢያ ፕሮጀክት ነው። መኪናው እንቅፋቶችን ለማስወገድ ወደፊት፣ ወደ ኋላ መንቀሳቀስ እና መዞር ይችላል፣ ይህም በራሱ ግልጽ የሆነ መንገድ ያገኛል። ይህ ፕሮጀክት በ SunFounder 3-in-1 Arduino ኪት ላይ የተመሰረተ እና የ Robojax የ Arduino ኮርስ አካል ነው።

ይህ ፕሮጀክት መጫወቻ መገንባት ብቻ አይደለም፤ ከራስ ገዝ ሮቦቲክስ በስተጀርባ ላሉ ዋና ዋና ፅንሰ-ሀሳቦች ተግባራዊ መግቢያ ነው። ተመሳሳይ አመክንዮ እና ዳሳሾች እንደ ሮቦቲክ ቫክዩም ክሊነሮች፣ በመጋዘኖች ውስጥ አውቶማቲክ የሚመሩ ተሽከርካሪዎች፣ እና የበለጠ ውስብስብ የሆኑ ሮቦቶች የአሰሳ ስርዓቶች ባሉ በእውነተኛ አለም አፕሊኬሽኖች ውስጥ ጥቅም ላይ ይውላሉ። የርቀት ዳሳሽን ከቀላል የአሰሳ ህጎች ጋር እንዴት ማጣመር እንደሚቻል በመረዳት፣ እንደ የሚከተሉት ያሉ የተለያዩ ፕሮጀክቶችን መፍጠር ይችላሉ፦

  • ክፍልን መዞር እና የቤት እቃዎችን ማስወገድ የሚችል ትንሽ ሮቦት መገንባት።
  • ቀላል መንገድ መከተል ወይም አካባቢን መቆጣጠር የሚችል አውቶማቲክ ተሽከርካሪ መፍጠር።
  • ለትላልቅ የሮቦቲክስ ፕሮጀክቶች መሰረታዊ የእንቅፋት መከላከያ ስልተ ቀመሮችን እንዴት መተግበር እንደሚቻል መማር።

የሃርድዌር ክፍሎች

ይህ ፕሮጀክት ከ SunFounder 3-in-1 ኪት የተገኙ ክፍሎችን ይጠቀማል። አስፈላጊዎቹ ክፍሎች የሚከተሉት ናቸው፦

  • Arduino Uno ቦርድ
  • SunFounder 2WD ወይም 3-in-1 የመኪና ቻሲስ ከሞተሮች ጋር
  • የሞተር ሾፌር ሞጁል (ለምሳሌ L298N ወይም ተመሳሳይ)
  • HC-SR04 የአልትራሳውንድ የርቀት ዳሳሽ
  • ሁለት IR የእንቅፋት ዳሳሾች
  • መዝለያ ሽቦዎች እና ለሞተሮቹ የኃይል ምንጭ

የሽቦ አገናኝ መመሪያ

ሽቦ ማገናኘት ራሱን የሚያሽከረክር መኪናዎን ህይወት ለማምጣት ወሳኝ የመጀመሪያ እርምጃ ነው። ግንኙነቶቹ ቀላል ናቸው፣ ነገር ግን ክፍሎችዎን ከመጉዳት ለመቆጠብ እያንዳንዱን መፈተሽ አስፈላጊ ነው። የሽቦ አገናኝ አመክንዮው የ Arduino ቁጥጥር ፒኖችን ከሞተር ሾፌር እና ዳሳሾች ጋር ማገናኘት ነው፣ ይህም Arduino መረጃ እንዲያነብ እና ትዕዛዞችን እንዲልክ ያስችለዋል።

  • የሞተር ሾፌር ፒኖች (A-1B፣ A-1A፣ B-1B፣ B-1A)፦ እነዚህ ፒኖች የሁለቱን ሞተሮች ፍጥነት እና አቅጣጫ ይቆጣጠራሉ። እነሱ ከ Arduino ፒኖች 5፣ 6፣ 9 እና 10 ጋር ተገናኝተዋል፣ እነዚህም PWM አቅም ያላቸው ናቸው፣ ይህም ተለዋዋጭ የፍጥነት ቁጥጥር ያስችላል።
  • የአልትራሳውንድ ዳሳሽ (Trig እና Echo)፦ የ Trig ፒን የአልትራሳውንድ ምት ይልካል፣ እና የ Echo ፒን የተንጸባረቀውን ምልክት ይቀበላል። የ Trig ፒን ከ Arduino ፒን 3 ጋር ተገናኝቷል፣ እና የ Echo ፒን ከ Arduino ፒን 4 ጋር ተገናኝቷል።
  • IR ዳሳሾች (ግራ እና ቀኝ)፦ እነዚህ ዳሳሾች እንቅፋት በቀጥታ ፊታቸው መኖሩን ይለያሉ። የግራ IR ዳሳሽ ከ Arduino ፒን 8 ጋር ተገናኝቷል፣ እና የቀኝ IR ዳሳሽ ከፒን 7 ጋር ተገናኝቷል። እነሱ በመኪናው ጎኖች ላይ ያለውን ቦታ ለመፈተሽ ያገለግላሉ።

ለዝርዝር የእይታ መመሪያ፣ እባክዎ ከታች ያለውን የሽቦ አገናኝ ዲያግራም ይመልከቱ፣ እሱም እያንዳንዱን ግንኙነት በግልፅ ያሳያል።

የኮድ ማብራሪያ

ኮዱ የተፃፈው በ Arduino ፕሮግራሚንግ ቋንቋ (C++) ነው። ሙሉው ፕሮግራም በቪዲዮ መግለጫው ውስጥ ከተገናኘው የመርጃ ገፅ ማውረድ ይችላሉ። የዚህን ስኬች ቁልፍ፣ በተጠቃሚ ሊዋቀሩ የሚችሉ ክፍሎችን እንመርምር።

የፒን ትርጓሜዎች

በኮዱ አናት ላይ፣ Arduino ን ከተለያዩ ክፍሎች ጋር የሚያገናኙትን ፒኖች ይገልፃሉ። በቦርድዎ ላይ የተለያዩ ፒኖች እየተጠቀሙ ከሆነ እነዚህን መቀየር ይችላሉ።

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

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

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

A_1BA_1AB_1B እና B_1A ፒኖች የ H-bridge ሞተር ሾፌሩን ይቆጣጠራሉ። እነዚህን ፒኖች በተለያዩ ጥምረቶች HIGH ወይም LOW በማድረግ፣ የእ প্রতিটি ሞተርን አቅጣጫ መቆጣጠር ይችላሉ። echoPin እና trigPin ለአልትራሳውንድ ዳሳሽ ናቸው፣ እና rightIR እና leftIR ለኢንፍራሬድ ዳሳሾች ናቸው።

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

የራስ ገዝ የመንዳት ባህሪ ዋና አመክንዮ በ loop() ተግባር ውስጥ ነው። መኪናው ከ IR ዳሳሾች እና ከአልትራሳውንድ ዳሳሽ በተገኙ ንባቦች ላይ በመመስረት ውሳኔዎችን ያደርጋል። ኮዱ የተወሰኑ የተለያዩ ተግባራትን የሚቀሰቅሱ ርቀቶችን ይገልፃል። ለምሳሌ፣ የ distance ተለዋዋጭ በሴንቲሜትር ይለካል። አመክንዮው እንደሚከተለው ነው፦

  • ርቀቱ ከ 50 ሴ.ሜ በላይ ከሆነ፦ ወደፊት ያለው መንገድ ግልፅ ነው፣ ስለዚህ መኪናው በ 200 ፍጥነት ወደፊት ይንቀሳቀሳል።
  • ርቀቱ በ 2 ሴ.ሜ እና 10 ሴ.ሜ መካከል ከሆነ፦ መኪናው ለእንቅፋት በጣም ቅርብ ነው። ለአንድ ሰከንድ ወደ ኋላ ይመለሳል፣ ከዚያም አዲስ መንገድ ለማግኘት ለግማሽ ሰከንድ ወደ ኋላ-ግራ ይዞራል።
  • ርቀቱ በ 10 ሴ.ሜ እና 50 ሴ.ሜ መካከል ከሆነ፦ መኪናው በ"ጥንቃቄ ዞን" ውስጥ ነው። ወደፊት ይንቀሳቀሳል፣ ግን በዝቅተኛ ፍጥነት 150።

እነዚህ የመቆጣጠሪያ እሴቶች (50 ሴ.ሜ፣ 10 ሴ.ሜ እና 2 ሴ.ሜ) እና ፍጥነቶቹ (200 እና 150) የመኪናዎን ባህሪ ለመቀየር ሊያስተካክሏቸው የሚችሏቸው ዋና ተለዋዋጮች ናቸው። ለምሳሌ፣ መኪናዎ በፍጥነት የሚንቀሳቀስ ከሆነ "አስተማማኝ" ርቀቱን ወደ 60 ሴ.ሜ ከፍ ማድረግ ይችላሉ።

ብጁ ተግባራት

ኮዱ የመኪናውን እንቅስቃሴ ለመቆጣጠር ብዙ ብጁ ተግባራትን ያካትታል። እነዚህ በዋናው loop ውስጥ በሙሉ ኮዱን የበለጠ ንፁህ እና ለመረዳት ቀላል ለማድረግ ያገለግላሉ።

  • moveForward(int speed)፦ ይህ ተግባር መኪናውን ወደ ፊት ለማስኬድ የሞተር ፒኖቹን ያዘጋጃል። የspeed መለኪያ (0-255) ሞተሮቹ በምን ያህል ፍጥነት እንደሚሽከረከሩ ይቆጣጠራል።
  • moveBackward(int speed)፦ ከmoveForward ጋር ተመሳሳይ ነው፣ ነገር ግን መኪናውን ወደ ኋላ ለማንቀሳቀስ የሞተሩን አቅጣጫ ይቀልብሳል።
  • backLeft(int speed) እና backRight(int speed)፦ እነዚህ ተግባራት አንዱን ሞተር ወደ ኋላ በማስኬድ ሌላውን ደግሞ በማቆም መኪናውን ያዞራሉ። ይህ መኪናው አቅጣጫውን በብቃት እንዲቀይር የሚረዳ የመዞሪያ ዘዴ ነው።
  • stopMove()፦ ይህ ተግባር ሁሉንም የመቆጣጠሪያ ፒኖች ወደ LOW በማዘጋጀት ሁሉንም ሞተሮች ያቆማል።
  • readSensorData()፦ ይህ ተግባር ከአልትራሶኒክ ዳሳሽ የልብ ምት (pulse) ይልካል እና ኢኮው ለመመለስ የወሰደውን ጊዜ ይለካል። ከዚያም ርቀቱን በሴንቲሜትር ያሰላና እሴቱን ይመልሳል።

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

(በቪዲዮ 07:09 ላይ) በማሳያው ውስጥ፣ መኪናው እንደ ሳጥኖች እና ግድግዳዎች ያሉ የተለያዩ እንቅፋቶች ባሉበት አካባቢ ውስጥ ይቀመጣል። መኪናው ሲጓዝ አመክንዮው ይታያል። የአልትራሶኒክ ዳሳሹ ከ50 ሴ.ሜ በላይ ርቀት ላይ ግድግዳ ወይም እንቅፋት ሲያገኝ፣ በልበ ሙሉነት ወደ ፊት ይነዳል። ወደ እንቅፋቱ ሲቃረብ፣ በጎኖቹ ላይ ያሉት IR ዳሳሾች ክፍት ቦታ መኖሩን ይፈትሻሉ።

በግራ በኩል እንቅፋት ከተገኘ፣ መኪናው እሱን ለማስቀረት ወደ ቀኝ ወደ ኋላ መዞር ያከናውናል እና በተቃራኒውም ይህንን ያደርጋል። መኪናው እንደ ጠረጴዛ ስር (በቪዲዮ 07:49 ላይ) ባሉ ጠባብ ቦታዎች ላይ ሲገኝ፣ እራሱን ለማውጣት እና ግልጽ መንገድ ለማግኘት የመቀልበስ እና የመዞር ተግባሮቹን ይጠቀማል። መኪናው አካባቢውን ያለማቋረጥ ያነባል እና ውሳኔዎችን ያደርጋል፣ ይህም አስቀድሞ በታቀደ መንገድ ላይ ያልተመሰረተ ምላሽ ሰጪ የቁጥጥር ስርዓትን ያሳያል።

የቪዲዮ ምዕራፎች

  • [00:00] የራስ-ገዝ መኪና ፕሮጀክት መግቢያ
  • [00:28] ስለ SunFounder 3-in-1 ኪት
  • [01:32] ኮዱን መክፈት እና አጠቃላይ እይታ
  • [02:02] የኮድ አወቃቀር እና አዳዲስ ተግባራት ማብራሪያ
  • [03:11] በSetup ተግባር ውስጥ ፒኖችን ማዘጋጀት
  • [03:28] በLoop ውስጥ ዋናው የውሳኔ አሰጣጥ አመክንዮ
  • [05:41] የቀጥታ ማሳያ፡ መኪናው በስራ ላይ
  • [07:09] ከእንቅፋቶች እና ከግድግዳ ክትትል ጋር ማሳያ
  • [09:58] መደምደሚያ እና የመጨረሻ ሀሳቦች

ምስሎች

28 SunFounder Car 6 self-driving path
28 SunFounder Car 6 self-driving path
Car 7 8 28 self driving
Car 7 8 28 self driving
897-Lesson 28/31: Car-6 SunFounder self Driving Arduino car
ቋንቋ: C++
/*
Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Get this code and watch video Download and resource page https://robojax.com/RJT611
https://www.youtube.com/watch?v=IyninXUcsn0
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

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

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

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

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

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);

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

void loop() {

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

  if (!left && right) {
    backLeft(150);
  } else if (left && !right) {
    backRight(150);
  } else if (!left && !right) {
    moveBackward(150);
  } else {
    float distance = readSensorData();
    Serial.println(distance);
    if (distance > 50) { // Safe
      moveForward(200);
    } else if (distance < 10 && distance > 2) { // Attention
      moveBackward(200);
      delay(1000);
      backLeft(150);
      delay(500);
    } else {
      moveForward(150);
    }
  }
}

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

ምንጮች እና ምንጮች

ፋይሎች📁

Arduino ቤተ መዝገቦች (zip)