ዝርዝር ሁኔታ:

ራስን ማመጣጠን ሮቦት ከአስማትቢት 6 ደረጃዎች
ራስን ማመጣጠን ሮቦት ከአስማትቢት 6 ደረጃዎች

ቪዲዮ: ራስን ማመጣጠን ሮቦት ከአስማትቢት 6 ደረጃዎች

ቪዲዮ: ራስን ማመጣጠን ሮቦት ከአስማትቢት 6 ደረጃዎች
ቪዲዮ: ከስሜት በላይ መሆን | ለመለወጥ መጨከን አለብህ! 2024, ህዳር
Anonim

ይህ አጋዥ ስልጠና Magicbit dev ሰሌዳ በመጠቀም እራሱን ሚዛናዊ ሮቦት እንዴት እንደሚሠራ ያሳያል። በ ESP32 ላይ የተመሠረተ በዚህ ፕሮጀክት ውስጥ አስማትቢትን እንደ ልማት ቦርድ እንጠቀማለን። ስለዚህ ማንኛውም የ ESP32 ልማት ቦርድ በዚህ ፕሮጀክት ውስጥ ሊያገለግል ይችላል።

አቅርቦቶች

  • magicbit
  • ባለሁለት ሸ ድልድይ L298 የሞተር ሾፌር
  • መስመራዊ ተቆጣጣሪ (7805)
  • Lipo 7.4V 700mah ባትሪ
  • የማይለካ የመለኪያ ክፍል (አይኤምዩ) (6 ዲግሪ የነፃነት)
  • የማርሽ ሞተሮች 3V-6V ዲሲ

ደረጃ 1 - ታሪክ

ታሪክ
ታሪክ
ታሪክ
ታሪክ

ሠላም ሰዎች ፣ ዛሬ በዚህ ትምህርት ውስጥ ስለ ትንሽ ውስብስብ ነገር እንማራለን። ያ ማለት Magicbit ን ከ Arduino IDE ጋር በመጠቀም ራስን ስለማስተካከል ሮቦት ነው። ስለዚህ እንጀምር።

በመጀመሪያ ፣ ራስን ሚዛናዊ ሮቦት ምን እንደ ሆነ እንመልከት። ራስን ሚዛናዊ ሮቦት ሁለት ጎማ ያለው ሮቦት ነው። ልዩ ባህሪው ሮቦት ማንኛውንም የውጭ ድጋፍ ሳይጠቀም ራሱን ማመጣጠን ይችላል። ኃይሉ በሮቦት ላይ በሚሆንበት ጊዜ ይነሳል እና ከዚያ የማወዛወዝ እንቅስቃሴዎችን በመጠቀም ያለማቋረጥ ሚዛናዊ ይሆናል። ስለዚህ አሁን ስለ ራስ -ሚዛን ሮቦት አንዳንድ ሻካራ ሀሳብ አለዎት።

ደረጃ 2 - ጽንሰ -ሀሳብ እና ዘዴ

ጽንሰ -ሀሳብ እና ዘዴ
ጽንሰ -ሀሳብ እና ዘዴ

ሮቦቱን ለማመጣጠን ፣ መጀመሪያ የሮቦቱን አንግል ወደ ቀጥታ አውሮፕላን ለመለካት ከአንዳንድ ዳሳሽ መረጃ እናገኛለን። ለዚያ ዓላማ እኛ MPU6050 ን ተጠቀምን። መረጃውን ከአነፍናፊው ካገኘን በኋላ ዝንባሌውን ወደ አቀባዊ አውሮፕላን እናሰላለን። ሮቦቱ ቀጥተኛ እና ሚዛናዊ በሆነ ቦታ ላይ ከሆነ ፣ ከዚያ የመጠምዘዝ አንግል ዜሮ ነው። ካልሆነ ፣ ያጋደሉ አንግል አዎንታዊ ወይም አሉታዊ እሴት ነው። ሮቦቱ ወደ ፊት ጎን ከሆነ ፣ ከዚያ ሮቦት ወደ ፊት አቅጣጫ መሄድ አለበት። እንዲሁም ሮቦቱ ወደ ጎን ለመጠምዘዝ ከሆነ ሮቦቱ ወደ ተቃራኒው አቅጣጫ መሄድ አለበት። ይህ የመጠምዘዝ አንግል ከፍ ያለ ከሆነ የምላሽ ፍጥነት ከፍ ያለ መሆን አለበት። በተቃራኒው የመጠምዘዣው አንግል ዝቅተኛ ከሆነ የምላሽ ፍጥነት ዝቅተኛ መሆን አለበት። ይህንን ሂደት ለመቆጣጠር እኛ PID ተብሎ የሚጠራውን ልዩ ንድፈ ሃሳብ ተጠቅመንበታል። PID ብዙ ሂደቶችን ለመቆጣጠር የሚያገለግል የቁጥጥር ስርዓት ነው። PID ለ 3 ሂደቶች ይቆማል።

  • P- ተመጣጣኝ
  • እኔ- አጠቃላይ
  • D- የመነጨ

እያንዳንዱ ስርዓት ግብዓት እና ውፅዓት አለው። በተመሳሳይ ሁኔታ ይህ የቁጥጥር ስርዓት እንዲሁ አንዳንድ ግብዓት አለው። በዚህ የቁጥጥር ስርዓት ውስጥ ከተረጋጋ ሁኔታ መዛባት ነው። ያንን እንደ ስህተት ጠራነው። በእኛ ሮቦት ውስጥ ስህተት ከአቀባዊ አውሮፕላን የመጠምዘዝ አንግል ነው። ሮቦቱ ሚዛናዊ ከሆነ ፣ የመጠምዘዝ አንግል ዜሮ ነው። ስለዚህ የስህተት ዋጋው ዜሮ ይሆናል። ስለዚህ የ PID ስርዓት ውፅዓት ዜሮ ነው። ይህ ሥርዓት ሦስት የተለያዩ የሂሳብ ሂደቶችን ያካትታል።

የመጀመሪያው ከቁጥር ትርፍ ስህተትን ማባዛት ነው። ይህ ትርፍ ብዙውን ጊዜ እንደ Kp ይባላል።

P = ስህተት*ኪ.ፒ

ሁለተኛው አንዱ በጊዜ ጎራ ውስጥ የስህተቱን ዋና አካል ማመንጨት እና ከአንዳንድ ትርፍ ማባዛት ነው። ይህ ትርፍ እንደ ኪ ተብሎ ይጠራል

እኔ = ውህደት (ስህተት)*ኪ

ሦስተኛው በስህተት ጎራ ውስጥ ያለውን የስህተት መነሻ እና በተወሰነ ትርፍ ማባዛት ነው። ይህ ትርፍ እንደ Kd ተብሎ ይጠራል

D = (መ (ስህተት)/dt)*kd

ከላይ ያሉትን ክዋኔዎች ከጨመርን በኋላ የመጨረሻ ውጤታችንን እናገኛለን

ውፅዓት = P+I+D

በፒ ክፍል ሮቦት ምክንያት ከተዛባው ጋር ተመጣጣኝ የሆነ የተረጋጋ አቀማመጥ ማግኘት ይችላል። እኔ በከፊል የስህተት እና የጊዜ ግራፍ አካባቢን ያሰላል። ስለዚህ ሮቦቱን ሁል ጊዜ በትክክል ወደ ተረጋጋ አቀማመጥ ለማምጣት ይሞክራል። ዲ ክፍል ቁልቁለቱን በጊዜ እና በስህተት ግራፍ ይለካል። ስህተቱ እየጨመረ ከሆነ ይህ እሴት አዎንታዊ ነው። ስህተቱ እየቀነሰ ከሆነ ይህ እሴት አሉታዊ ነው። በዚህ ምክንያት ሮቦቱ ወደ የተረጋጋ ቦታ ሲንቀሳቀስ የምላሹ ፍጥነት ይቀንሳል እና ይህ አላስፈላጊ ከመጠን በላይ ነጥቦችን ለማስወገድ ይረዳል። ከዚህ በታች ከሚታየው ከዚህ አገናኝ ስለ PID ጽንሰ -ሀሳብ የበለጠ ማወቅ ይችላሉ።

www.arrow.com/en/ የምርምር-እና-ክስተቶች/አንቀጾች/ፒድ-ተቆጣጣሪ-መሰረታዊ-እና-ቱቱሪያል-ፒድ-ትግበራ-በ arduino

የ PID ተግባር ውፅዓት ከ0-255 ክልል (8 ቢት PWM ጥራት) የተገደበ ነው እና ያ ለሞተር እንደ PWM ምልክት ይመግባል።

ደረጃ 3 የሃርድዌር ማዋቀር

የሃርድዌር ማዋቀር
የሃርድዌር ማዋቀር

አሁን ይህ የሃርድዌር ማዋቀሪያ ክፍል ነው። የሮቦት ንድፍ በእርስዎ ላይ የተመሠረተ ነው። የሮቦትን አካል ሲሠሩ በሞተር ዘንግ ውስጥ ስለሚገኘው ቀጥ ያለ ዘንግ (ሲምሜትሪክ) ግምት ውስጥ ማስገባት አለብዎት። ከዚህ በታች ያለው የባትሪ ጥቅል። ስለዚህ ሮቦቱ ሚዛናዊ ለማድረግ ቀላል ነው። በእኛ ዲዛይን ውስጥ Magicbit ሰሌዳ በአካል በአቀባዊ እናስተካክለዋለን። ሁለት 12V የማርሽ ሞተሮችን እንጠቀም ነበር። ግን ማንኛውንም ዓይነት የማርሽ ሞተሮችን መጠቀም ይችላሉ። ያ በሮቦት ልኬቶችዎ ላይ የተመሠረተ ነው።

ስለ ወረዳ ስንወያይ በ 7.4 ቪ ሊፖ ባትሪ የተጎላበተ ነው። Magicbit 5V ን ለኃይል ኃይል ተጠቅሟል። ለዚህም የባትሪ ቮልቴጅን ወደ 5 ቮ ለመቆጣጠር 7805 ተቆጣጣሪ ተጠቅመናል። በኋለኛው የ Magicbit ስሪቶች ውስጥ ተቆጣጣሪው አያስፈልገውም። ምክንያቱም እስከ 12 ቮ ድረስ ኃይል አለው። እኛ በቀጥታ ለሞተር ሾፌር 7.4V እንሰጣለን።

ከዚህ በታች ባለው ሥዕላዊ መግለጫ መሠረት ሁሉንም አካላት ያገናኙ።

ደረጃ 4 የሶፍትዌር ማዋቀር

በኮዱ ውስጥ የ PID ን ውፅዓት ለማስላት የ PID ቤተ -መጽሐፍትን ተጠቀምን።

እሱን ለማውረድ ወደሚከተለው አገናኝ ይሂዱ።

www.arduinolibraries.info/libraries/pid

የቅርብ ጊዜውን ስሪት ያውርዱ።

የተሻሉ የዳሳሽ ንባቦችን ለማግኘት እኛ የዲኤምኤፍ ቤተ -መጽሐፍትን ተጠቀምን። ዲኤምፒ ለዲጂታል እንቅስቃሴ ሂደት ይቆማል። ይህ የ MPU6050 አብሮገነብ ባህሪ ነው። ይህ ቺፕ የተቀናጀ የእንቅስቃሴ ሂደት አሃድ አለው። ስለዚህ ማንበብ እና መተንተን ይጠይቃል። ወደ ማይክሮ መቆጣጠሪያ (ምንም እንኳን በዚህ ሁኔታ Magicbit (ESP32)) ጫጫታ የሌለበት ትክክለኛ ውፅዓት ካመነጨ በኋላ። ግን ያንን ንባቦች ለመውሰድ እና ማእዘኑን ለማስላት በማይክሮ መቆጣጠሪያ ክፍል ውስጥ ብዙ ሥራዎች አሉ። ስለዚህ እኛ MPU6050 DMP ቤተ -መጽሐፍትን ተጠቅመናል። ወደሚከተለው አገናኝ በ goint ያውርዱት።

github.com/ElectronicCats/mpu6050

ቤተ-ፍርግሞችን ለመጫን ፣ በአርዱዲኖ ምናሌ ውስጥ ወደ መሳሪያዎች ይሂዱ-> ቤተ-መጽሐፍት-> add.zip ቤተ-መጽሐፍትን ያካትቱ እና ያወረዱትን የቤተ-መጽሐፍት ፋይል ይምረጡ።

በኮዱ ውስጥ የተቀመጠውን ነጥብ በትክክል መለወጥ አለብዎት። የ PID ቋሚ እሴቶች ከሮቦት ወደ ሮቦት ይለያያሉ። ስለዚህ ያንን በማስተካከል በመጀመሪያ የኪ እና ኬድ ዜሮ እሴቶችን ያዘጋጁ እና ከዚያ የተሻለ የምላሽ ፍጥነት እስኪያገኙ ድረስ Kp ይጨምሩ። ተጨማሪ የ Kp ምክንያቶች ለተጨማሪ ከመጠን በላይ ምርጫዎች። ከዚያ የ Kd እሴት ይጨምሩ። በጣም በትንሽ መጠን ሁል ጊዜ ይጨምሩ። ይህ ዋጋ በአጠቃላይ ከሌሎች እሴቶች ያነሰ ነው። አሁን በጣም ጥሩ መረጋጋት እስኪያገኙ ድረስ ኪውን ይጨምሩ።

ትክክለኛውን የ COM ወደብ ይምረጡ እና የቦርዱ ዓይነት ይተይቡ። ኮዱን ይስቀሉ። አሁን ከእርስዎ DIY ሮቦት ጋር መጫወት ይችላሉ።

ደረጃ 5: መርሃግብሮች

መርሃግብሮች
መርሃግብሮች

ደረጃ 6 ኮድ

#ያካትቱ

#"I2Cdev.h" #ያካትቱ "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #"Wire.h" #endif MPU6050 mpu; bool dmpReady = ሐሰት; / ዲኤምፒ init ስኬታማ ከሆነ uint8_t mpuIntStatus/ ከሆነ እውነት ያዘጋጁ። // ከ MPU uint8_t devStatus ትክክለኛ የማቋረጥ ሁኔታ ባይት ይይዛል ፤ // ከእያንዳንዱ የመሣሪያ አሠራር (0 = ስኬት ፣ 0 = ስህተት) uint16_t packetSize በኋላ የመመለስ ሁኔታ; // የሚጠበቀው የ DMP ፓኬት መጠን (ነባሪ 42 ባይት ነው) uint16_t fifoCount; // በአሁኑ ጊዜ በ FIFO ውስጥ የሁሉም ባይቶች ብዛት መቁጠር uint8_t fifoBuffer [64]; // የ FIFO ማከማቻ ቋት Quaternion q; // [w, x, y, z] quaternion መያዣ VectorFloat ስበት; // [x, y, z] የስበት ቬክተር ተንሳፋፊ ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll መያዣ እና የስበት ቬክተር ድርብ ኦሪጅናል ነጥብ = 172.5; ድርብ setpoint = originalSetpoint; ድርብ ተንቀሳቃሽAngleOffset = 0.1; ድርብ ግብዓት ፣ ውጤት; int moveState = 0; ድርብ Kp = 23; // አዘጋጅ P የመጀመሪያ ድርብ Kd = 0.8; // ይህ እሴት በአጠቃላይ አነስተኛ ድርብ ኪ = 300; // ይህ እሴት ለተሻለ መረጋጋት PID pid (& ግብዓት ፣ & ውፅዓት ፣ እና ነጥብ ፣ Kp ፣ Ki ፣ Kd) ከፍተኛ መሆን አለበት ፣ ቀጥታ) ፤ // pid int motL1 = 26; // 4 ፒኖች ለሞተር ድራይቭ int motL2 = 2; int motR1 = 27; int motR2 = 4; ተለዋዋጭ bool mpuInterrupt = ሐሰት; // የሚያመለክተው የ MPU ማቋረጫ ፒን ከፍ ያለ ባዶ መሆኑን dmpDataReady () {mpuInterrupt = true; } ባዶነት ማዋቀር () {ledcSetup (0, 20000, 8) ፤ // pwm setup ledcSetup (1, 20000, 8); ledcSetup (2, 20000, 8); ledcSetup (3, 20000, 8); ledcAttachPin (motL1, 0); // pinmode ሞተሮች ledcAttachPin (motL2, 1); ledcAttachPin (motR1, 2); ledcAttachPin (motR2, 3); // I2C አውቶቡስን ይቀላቀሉ (I2Cdev ቤተ -መጽሐፍት ይህንን በራስ -ሰር አያደርግም) #ከሆነ I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // 400kHz I2C ሰዓት። የማጠናቀር ችግሮች ካጋጠሙዎት ይህንን መስመር አስተያየት ይስጡ #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: ማዋቀር (400 ፣ እውነት) ፤ #endif Serial.println (ኤፍ (“I2C መሣሪያዎችን ማስጀመር…”)); pinMode (14 ፣ ግቤት); // ተከታታይ ግንኙነትን ያስጀምሩ/ // (115200 የተመረጠው ለ Teapot Demo ውፅዓት ስለሚያስፈልገው ነው ፣ ግን በፕሮጀክትዎ ላይ በመመስረት/ በእውነቱ የእርስዎ ነው) Serial.begin (9600); ሳለ (! ተከታታይ); // የሊዮናርዶን ቆጠራ ይጠብቁ ፣ ሌሎች ወዲያውኑ ይቀጥላሉ // መሣሪያን ያስጀምሩ Serial.println (F (“I2C መሣሪያዎችን ማስጀመር…”)); mpu.initialize (); // ግንኙነቱን ያረጋግጡ Serial.println (ኤፍ (“የመሣሪያ ግንኙነቶችን መሞከር…”)); Serial.println (mpu.testConnection ()? F ("MPU6050 ግንኙነት ተሳካ"): F ("MPU6050 ግንኙነት አልተሳካም")); // የ DMP Serial.println ን (F (“DMP ን ማስጀመር…”)) ይጫኑ እና ያዋቅሩ ፤ devStatus = mpu.dmpInitialize (); // የእራስዎን የጂሮ ማካካሻዎች እዚህ ያቅርቡ ፣ ለደቂቃ ትብነት mpu.setXGyroOffset (220)። mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); // 1688 ለሙከራዬ ቺፕ የፋብሪካ ነባሪ // መስራቱን ያረጋግጡ (እንደዚያ ከሆነ 0 ይመልሳል) (devStatus == 0) {// ዲኤምፒውን ያብሩ ፣ አሁን ዝግጁ ከሆነ Serial.println (F (“DMP ን ማንቃት… ")); mpu.setDMPEnabled (እውነት); // የአርዲኖ ማቋረጫ ማወቂያን ያንቁ Serial.println (ኤፍ (“የማቋረጥ ማወቂያን ማንቃት (የአርዱዲኖ የውጭ መቋረጥ 0)…”)); አባሪ መቋረጥ (14 ፣ dmpDataReady ፣ RISING); mpuIntStatus = mpu.getIntStatus (); // ዋናው የ loop () ተግባሩ እሱን መጠቀም ምንም ችግር እንደሌለው ያውቃል ስለዚህ የዲኤምፒኤፍ ዝግጁ ባንዲራችንን ያዋቅሩ Serial.println (ኤፍ (“ዲኤምፒ ዝግጁ ነው! የመጀመሪያውን ማቋረጥ በመጠበቅ ላይ…”)); dmpReady = እውነት; // በኋላ ላይ ለማነጻጸር packetSize = mpu.dmpGetFIFOPacketSize () የሚጠበቀውን የ DMP ጥቅል መጠን ያግኙ። // ማዋቀር PID pid. SetMode (AUTOMATIC); pid. SetSampleTime (10); pid. SetOutputLimits (-255 ፣ 255); } ሌላ {// ስህተት! // 1 = የመነሻ ማህደረ ትውስታ ጭነት አልተሳካም // 2 = የዲኤምኤፍ ውቅረት ዝመናዎች አልተሳኩም // (የሚሰብር ከሆነ ብዙውን ጊዜ ኮዱ 1 ይሆናል) Serial.print (F (“DMP Initialization failed (ኮድ”))) ፤ ተከታታይ። ህትመት (devStatus); Serial.println (F (")")); }} ባዶነት loop () {// ፕሮግራሙ ካልተሳካ ((dmpReady) ከተመለሰ ምንም ለማድረግ አይሞክሩ ፤ // (! mpuInterrupt && fifoCount <packetSize) {pid. Compute () ፤ // ይህ የጊዜ ክፍለ ጊዜ ውሂብን ለመጫን ይጠቀምበታል ፣ ስለዚህ ይህንን ለሌላ ስሌቶች ሞተር ስፒድ () መጠቀም እንዲችሉ ይጠብቁ። ውፅዓት); } // የተቋረጠውን ባንዲራ ዳግም ያስጀምሩ እና INT_STATUS ባይት mpuInterrupt = ሐሰት ያግኙ። mpuIntStatus = mpu.getIntStatus (); // የአሁኑን FIFO ቆጠራ fifoCount = mpu.getFIFOCount (); / ከመጠን በላይ መብዛትን ይፈትሹ (የእኛ ኮድ በጣም ውጤታማ ካልሆነ በስተቀር ይህ በፍፁም መሆን የለበትም) ((mpuIntStatus & 0x10) || fifoCount == 1024) {// ዳግም አስጀምር ስለዚህ እኛ mpu.resetFIFO () ንፅህናን መቀጠል እንድንችል; Serial.println (F ("FIFO overflow!")); // አለበለዚያ ፣ ለዲኤምፒኤም መረጃ ዝግጁ መቋረጥን ይፈትሹ (ይህ በተደጋጋሚ መከሰት አለበት)} ሌላ (mpuIntStatus & 0x02) {// ትክክለኛውን የሚገኝ የውሂብ ርዝመት ይጠብቁ ፣ በጣም አጭር ጊዜ (foCount 1 ጥቅል ይገኛል // (ይህ መቋረጥን ሳንጠብቅ ወዲያውኑ የበለጠ እንድናነብ ያስችለናል) fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); #T LOG_IN. ህትመት ("ypr / t"); Serial.print (ypr [0] * 180/M_PI); // euler angles Serial.print ("\ t"); Serial.print (ypr [1] * 180/M_PI); Serial.print ("\ t"); Serial.println (ypr [2] * 180/M_PI); #endif input = ypr [1] * 180/M_PI + 180;}} ባዶ ባዶ ሞተር ፍጥነት (int PWM) {ተንሳፋፊ L1 ፣ L2 ፣ R1 ፣ R2 ፤ ከሆነ (PWM> = 0) {// ወደፊት አቅጣጫ L2 = 0 ፤ L1 = abs (PWM) ፤ R2 = 0 ፤ R1 = abs (PWM) ፤ ከሆነ (L1> = 255) { L1 = R1 = 255;}} ሌላ {// ወደ ኋላ አቅጣጫ L1 = 0; L2 = abs (PWM); R1 = 0; R2 = abs (PWM); ከሆነ (L2> = 255) {L2 = R2 = 255; }} // የሞተር ድራይቭ ledcWrite (0 ፣ L1) ፤ ledcWrite (1 ፣ L2) ፤ ledcWrite (2 ፣ R1*0.97) ፤ // 0.97 የፍጥነት እውነታ ነው ወይም ፣ የቀኝ ሞተር ከግራ ሞተር ከፍ ያለ ፍጥነት ስላለው ፣ የሞተር ፍጥነቶች እኩል ledcWrite (3 ፣ R2*0.97) እስኪሆኑ ድረስ እንቀንስለታለን።

}

የሚመከር: