ዝርዝር ሁኔታ:

IOT123 - የፀሐይ መከታተያ - ተቆጣጣሪ: 8 ደረጃዎች
IOT123 - የፀሐይ መከታተያ - ተቆጣጣሪ: 8 ደረጃዎች

ቪዲዮ: IOT123 - የፀሐይ መከታተያ - ተቆጣጣሪ: 8 ደረጃዎች

ቪዲዮ: IOT123 - የፀሐይ መከታተያ - ተቆጣጣሪ: 8 ደረጃዎች
ቪዲዮ: The Overcoming Life | Dwight L Moody | Free Christian Audiobook 2024, ሀምሌ
Anonim
Image
Image
IOT123 - የፀሐይ መከታተያ - ተቆጣጣሪ
IOT123 - የፀሐይ መከታተያ - ተቆጣጣሪ
IOT123 - የፀሐይ መከታተያ - ተቆጣጣሪ
IOT123 - የፀሐይ መከታተያ - ተቆጣጣሪ

ይህ የአስተማሪው ቅጥያ ነው

IOT123 - የፀሐይ መከታተያ - መጥረጊያ/ፓን ፣ የፓነል ፍሬም ፣ LDR ተራሮች ሪግ። እዚህ እኛ በ servos መቆጣጠሪያ እና በፀሐይ አቀማመጥ ዳሳሾች ላይ እናተኩራለን። ይህ ንድፍ 2 MCUs ተቀጥረው እንደሚሠሩ መገመት አስፈላጊ ነው -አንድ (3.3V 8mHz Arduino Pro Mini) ለፀሐይ መከታተያ ፣ እና አንድ ገለልተኛ MCU ለእርስዎ ዳሳሾች/ተዋናዮች።

ይህ ስሪት 0.3 ነው።

ሙሉ እርካታ ካገኘሁ በኋላ ሁሉንም ፕሮጀክቶች ከማተም ይልቅ ፣ እኔ እንደፈለግኩ ያደረኩትን በማስተካከል ቀጣይነት ያለው ውህደትን እሠራለሁ እና አንድን ነገር ብዙ ጊዜ አቀርባለሁ። ለባትሪ መሙያ ሌላ አስተማሪ እጽፋለሁ ፣ _የቁጥጥር ሶፍትዌር/ሃርድዌር ማመቻቸት ሲጠናቀቅ። ይህንን ስናልፍ ማመቻቸት የት እንደሚያስፈልግ እጠቁማለሁ።

የዚህ አቀራረብ ምክንያት አካል የደንበኛ ግብረመልስ ነው። እርስዎ ፍላጎትን ካዩ ወይም የተሻለ አቀራረብ ካሎት እባክዎን አስተያየት ይስጡ ፣ ግን ያስታውሱ እኔ ሁሉንም ነገር ማድረስ አልቻልኩም እና ምናልባትም ለእርስዎ ተስማሚ ወደሆነ የጊዜ ማእቀፍ አልችልም። እነዚህ ማብራሪያዎች ብዙም አግባብነት የሌላቸው ስለሚመስሉ ከዚህ ጽሑፍ ይሰረዛሉ።

ይህ ምን ያካትታል:

  1. የፀሐይን ግምታዊ ቦታ ለመገንዘብ ከመጀመሪያው አስተማሪው LDR ን ይጠቀሙ።
  2. ሰርዶቹን ከፀሐይ ጋር ፊት ለፊት ያንቀሳቅሱ።
  3. ለእንቅስቃሴዎች ስሜታዊነት አማራጮች።
  4. ወደ ፀሐይ በሚንቀሳቀስበት ጊዜ ለደረጃው መጠን አማራጮች።
  5. በ servos ላይ ጥቅም ላይ ለሚውሉ የማዕዘን ገደቦች አማራጮች።
  6. ለእንቅስቃሴዎች መዘግየት አማራጮች።
  7. በ MCU ዎች መካከል እሴቶችን ለማቀናበር/ለማግኘት የ I2C በይነገጽ።

  8. በእንቅስቃሴዎች መካከል ጥልቅ እንቅልፍ።

ይህ የማያካትተው (እና እንደ ጊዜ የሚፈታ ይሆናል)

  1. በቀን ብርሃን ሰዓታት ኃይልን ብቻ መጠቀም።
  2. የማለዳውን ቦታ በማስታወስ እና በመሸ ጊዜ መዘጋት ወደዚያ መሄድ።
  3. ተቆጣጣሪውን ከ MCU በማስወገድ ላይ።
  4. በ MCU ላይ ያለውን LED (ዎች) ማሰናከል።
  5. ከ RAW ይልቅ በቪሲሲ በኩል ኃይልን ማዛወር።
  6. ከዩኤስቢ ወደ Serial TTL መቀየሪያ ያለ ቁጥጥር ኃይል ያለ ብልጭ ድርግም የሚሉ ሁኔታዎችን መስጠት።
  7. የባትሪ ቮልቴጅ መቆጣጠሪያ።

ታሪክ

ታህሳስ 20 ቀን 2017 V0.1 ኮድ

የመጀመሪያው ስሪት የብርሃን ምንጭን ይከታተላል ፣ ሁል ጊዜ በርቷል ፣ ኃይል መሙያ የለም

ጃን 7 ፣ 2018 V0.2 ኮድ

  • የሃርድዌር ለውጦች

    • I2C ፒኖችን ያክሉ
    • ወደ servo GNDs መቀየሪያ ያክሉ
    • በመቆጣጠሪያ ሣጥን fascia ላይ የታተመ መለያ
  • የሶፍትዌር ለውጦች

    • ከ EEPROM ውቅረትን ያንብቡ
    • I2C የአውቶቡስ ድጋፍ ለሌላ MCU (3.3V) ባሪያ ሆኖ
    • በ I2C በኩል ውቅረትን ያዘጋጁ
    • ቅንብር በ I2C በኩል ነቅቷል
    • በ I2C በኩል ውቅረትን ያግኙ
    • በ I2C በኩል የአሂድ ጊዜ ንብረቶችን ያግኙ (በአሁኑ ጊዜ ነቅቷል ፣ እና የአሁኑ የብርሃን ጥንካሬ)
    • ተከታታይ ምዝግብ ማስታወሻን ያስወግዱ (I2C እሴቶችን ነክቷል)

ጃን 19 ፣ 2018 V0.3 ኮድ

  • ሃርድዌር

    መለያ ተዘምኗል። መቀየሪያ አሁን CONFIG ወይም TRACK ሁነታን ለመምረጥ ጥቅም ላይ ውሏል

  • SOFTWARE

    • I2C ለማዋቀር ብቻ ጥቅም ላይ ውሏል
    • ተቆጣጣሪ መከታተልን ከመጀመሩ በፊት 5 ሰከንዶች ይጠብቃል ፣ እጆች ለመንቀሳቀስ ያስችላል
    • የ I2C ውቅረትን ለመጠቀም ፣ SPDT እንደ ዩኒት ቦት ጫማዎች በ CONFIG ላይ መሆን አለበት
    • በክትትል እንቅስቃሴ መካከል ፣ አሃድ ለዋቅር እሴት የእንቅልፍ ደቂቃዎች (ነባሪ 20 ደቂቃዎች) በጥልቅ የእንቅልፍ ሁኔታ ውስጥ ነው።

ደረጃ 1: ቁሳቁሶች እና መሳሪያዎች

ቁሳቁሶች እና መሳሪያዎች
ቁሳቁሶች እና መሳሪያዎች
ቁሳቁሶች እና መሳሪያዎች
ቁሳቁሶች እና መሳሪያዎች
ቁሳቁሶች እና መሳሪያዎች
ቁሳቁሶች እና መሳሪያዎች

አሁን ሙሉ የቁሳቁሶች እና ምንጮች ዝርዝር አለ።

  1. 3 ዲ የታተሙ ክፍሎች።
  2. አርዱዲኖ ፕሮ ሚኒ 3.3 ቪ 8 ሜኸ
  3. ከ 4x6 ሴሜ ባለ ሁለት ጎን ፕሮቶታይፕ ፒሲቢ ሁለንተናዊ የታተመ የወረዳ ቦርድ (በግማሽ ለመቁረጥ)
  4. 1 ጠፍቷል 40 ፒ ወንድ ራስጌ (ወደ መጠኑ ሊቆረጥ)።
  5. 1 ጠፍቷል 40 ፒ ሴት ራስጌ (ወደ መጠኑ ለመቁረጥ)።
  6. 4 ጠፍቷል 10K 1/4W ማገገሚያዎች።
  7. የሚጣበቅ ገመድ።
  8. ብረት እና ብረት።
  9. 20 ጠፍቷል 4 ጂ x 6 ሚሜ የማይዝግ ፓን ራስ የራስ መታ መታ ብሎኖች።
  10. 4 ጠፍቷል 4G x 6 ሚሜ የማይዝግ ቆጣሪ የራስ -ታፕ ዊንሽኖች።
  11. 1 ጠፍቷል 3.7V LiPo ባትሪ እና መያዣ (በ 2 ፒ ዱፖንት ማያያዣዎች ውስጥ ያበቃል)።

  12. 1 ጠፍቷል 2 ፒ ወንድ የቀኝ ማዕዘን ራስጌ
  13. 1 ጠፍቷል SPDT ማብሪያ 3 ፒን 2.54 ሚሜ ቅጥነት
  14. ጠንካራ የሲኖአክላይት ሙጫ
  15. የዱፖንት አያያ femaleች ሴት 1 ፒ ራስጌ (1 ሰማያዊ ፣ 1 ከአረንጓዴ)።

ደረጃ 2 - ወረዳውን መሰብሰብ

ወረዳውን መሰብሰብ
ወረዳውን መሰብሰብ
ወረዳውን መሰብሰብ
ወረዳውን መሰብሰብ
ወረዳውን መሰብሰብ
ወረዳውን መሰብሰብ

ወረዳው በአሁኑ ጊዜ የቮልቴጅ መከፋፈያ ወረዳ (ቮልት ሜትር) የለውም።

  1. የ 4x6cm ድርብ የጎን ፕሮቶታይፕ ፒሲቢ ሁለንተናዊ የታተመ የወረዳ ቦርድ በረጅሙ ዘንግ ላይ በግማሽ ይቁረጡ።
  2. የ 40 ፒ ወንድ ራስጌን ወደ ቁርጥራጮች ይቁረጡ

    1. 2 ከ 12 ፒ
    2. 3 ጠፍቷል 3 ፒ
    3. 6 ፒ 2 ፒ.
  3. የ 40 ፒ ሴት ራስጌን ወደ ቁርጥራጮች ይቁረጡ

    1. 2 ከ 12 ፒ
    2. 1 ከ 6 ፒ
  4. Solder 2 off 12Pmale header እንደሚታየው።
  5. ከ 3 ፒ ወንድ (ተጨማሪ) ራስጌ የተወገደውን ስፔስስተር በ SPDT ማብሪያ / ማጥፊያ ስር በሳይኖአክራይሌት ሙጫ
  6. በሌላኛው ቦታ ላይ ከዚያ 6 በ 2 ፒ ፣ 2 ጠፍቷል 3Pmale ራስጌ እና እንደሚታየው የ SPDT ማብሪያ / ማጥፊያ።
  7. የ 4K ከ 10 ኪ ተቃዋሚዎች (ኤ ፣ ቢ ፣ ሲ ፣ ዲ ጥቁር) ወደ GND ፒን ራስጌ (#2 ጥቁር) እና ወደ A0 - A3 የራስጌ ፒኖች (#5 ፣ #6 ፣ #7 ፣ #8) ከዚያም ቀዳዳ በኩል (ቢጫ) እንደሚታየው (3 ፎቶዎች + 1 ሥዕላዊ መግለጫ)።
  8. 3.3V ን ከ LDR ፒንኤች መሸጫ ፒን #4 ፣ #6 ፣ #8 ፣ #10 እና ቀዳዳ ቢኖረውም ወደ ራስጌ ቪሲሲ ፒን (አረንጓዴ) ቀዳዳ ቢሆንም።
  9. በፒን ቁጥር #1 ፣ #12 ፣ #15 ላይ እንደተለጠፈ (ቀይ) በሴት ራስጌ ጎን 3.3V ን ይከታተሉ።
  10. 3.3V በጎን በኩል በተሸጠው ቀዳዳ (ቀይ) RAW ራስጌ ፒን #1።
  11. እንደሚታየው ከፒን #11 በኩል ከጉድጓድ እስከ ብየዳ ድረስ የብርቱካን ማያያዣ ይከታተሉ።
  12. ከ #20 እስከ #30 እና ከ #31 እስከ #13 እና #16 ድረስ ሰማያዊ የመገናኛ ሽቦን ይከታተሉ እና ይሸጡ።
  13. የሽያጭ ሴት ራስጌ ፒን #11 ወደ ወንድ ራስጌ ፒን #11 ቀዳዳ በኩል።
  14. ከሴት 1 ፒ ራስጌ (1 ከሰማያዊ ፣ 1 ከአረንጓዴ) ጋር የ 2 ዱፖን ማያያዣ 30 ሚሜ ርዝመት ያዘጋጁ። ጭረት እና ቆርቆሮ ሌላ ጫፍ።
  15. የመሸጫ ሰማያዊ ዱፖን ሽቦ ወደ #28; የተሸጠ አረንጓዴ የዱፖን ሽቦ ወደ #29።
  16. በአርዱዲኖ አናት ላይ የ 6 ፒ ሴት ራስጌውን ከዚያም ሻጩን ያስተካክሉ።
  17. በአርዱዲኖ አናት ላይ 2 ፒ የቀኝ አንግል የሴት ራስጌ int #29 እና #30 ከዚያም በሻጩ ላይ ያስተካክሉት።

  18. በአርዱዲኖው ታችኛው ክፍል ላይ የ 12 ፒ እና 1 ጠፍቷል 3 ፒ የወንድ ፒን ከዚያ ያርቁ።
  19. አርዱዲኖ ወንድ 12 ፒ ፒኖችን በ PCB 12P ሴት ራስጌዎች ውስጥ ያስገቡ።

ደረጃ 3 MCU ን ማብራት

MCU ን በማብራት ላይ
MCU ን በማብራት ላይ
MCU ን በማብራት ላይ
MCU ን በማብራት ላይ
MCU ን በማብራት ላይ
MCU ን በማብራት ላይ

አርዱዲኖ ፕሮ ሚኒ 6 ፒ የሴት ራስጌን በመጠቀም FTDI232 ዩኤስቢ ወደ TTL መቀየሪያ በመጠቀም በሚመች ሁኔታ ብልጭ ድርግም ይላል። ለ 2 ቦርዶች አሰላለፍ ከላይ ያለውን ፎቶ ይመልከቱ።

የ 3.3V ቅንብር በእርስዎ FTDI232 ላይ መመረጡን ያረጋግጡ። ከዚህ በታች ያለውን ኮድ በመጠቀም መመሪያዎቹን ይከተሉ (ወደ GIST አገናኝ ይጠቀሙ)።

ዝቅተኛ ኃይል ያለው ቤተ-መጽሐፍት (ተያይዞ እና https://github.com/rocketscream/Low-Power) መጫን ያስፈልጋል።

አንዴ አርዱዲኖ ፕሮ ሚኒ + ፒሲቢ በካቢኑ ውስጥ ከተጫነ የራስጌ ፒኖች ሲጋለጡ አሁንም ሊበራ ይችላል። ራስጌውን ከማጋለጥ የመቆጣጠሪያውን ክፍል ከፓነል ፍሬም ያላቅቁት።

በእንቅስቃሴዎች መካከል I2C/EEPROM ውቅረት እና የእንቅልፍ ዑደት ያለው የፓን የፀሐይ መከታተያ ያጋድል። የጊዜ ቆይታ ሲጨምር የእንቅልፍ ዑደት ቆይታ ትክክለኛነት ይቀንሳል ፣ ግን ለዚህ ዓላማ በቂ ነው።

/*
* ከኮድ ተስተካክሏል
* በማቲያስ ሌሮይ
*
* V0.2 ማሻሻያዎች
** I2C SET GET
** EEPROM SET GET
** ተከታታይ ውፅዓት ያስወግዱ - የተጎዳ I2C
** መከታተል/ማሰናከል መቻል
** አገልግሎቶችን ወደ ገደቦች በ I2C በኩል ያንቀሳቅሱ
** የአሁኑን AVG INTENSITY በ I2C በኩል ያንብቡ
* V0.3 ማሻሻያዎች
** ለ 2 ሁነታዎች ይቀያይሩ - ትራክ (አይ I2C የለም) እና ውቅር (I2C ን ይጠቀማል)
** በትራክ ሁናቴ ውስጥ ይተኛሉ (በ 8 ሁለተኛ ቼኮች ምክንያት በጣም ዝቅተኛ ውሳኔ)
** በእንቅልፍ/በንቃት ላይ አስተናጋጅ/ዓባሪ አገልግሎቶችን (አስተላላፊው በአጠቃላይ ተጠቅሟል)
** ሊስተካከል የሚችል የመጀመሪያ ቦታን ያስወግዱ (ተመላሽ)
** ሊስተካከል የሚችል የንቃት ሰከንዶችን ያስወግዱ (ተመላሽ)
** ሊበጅ የሚችል/አካል ጉዳተኛን ያስወግዱ (ቀሪ)
** ሊነቃቃ የሚችል አሽከርካሪ አስወግድ (የሃርድዌር መቀየሪያን ይጠቀሙ)
** የቮልታ ጌተርን ያስወግዱ - የተለየ I2C ን ይጠቀማል
** I2C ን በማይጠቀሙበት ጊዜ ተከታታይ ምዝግብን ያክሉ
*/
#ያካትቱ
#ያካትቱ
#ያካትቱ
#ያካትቱ
#ያካትቱ
#ይግለጹ EEPROM_VERSION1
#ፍቺ I2C_MSG_IN_SIZE3
#መለየት ፒን_LDR_TL A0
#መለየት ፒን_LDR_TR A1
#መለየት ፒን_LDR_BR A3
#መለየት ፒን_LDR_BL A2
#PIN_SERVO_V11 ን ይግለጹ
#PIN_SERVO_H5 ን ይግለጹ
#IDX_I2C_ADDR0 ን ይግለጹ
#IDX_V_ANGLE_MIN1 ን ይግለጹ
#IDX_V_ANGLE_MAX2 ን ይግለጹ
#IDX_V_SENSITIVITY3 ን ይግለጹ
#IDX_V_STEP4 ን ይግለጹ
#IDX_H_ANGLE_MIN5 ን ይግለጹ
#IDX_H_ANGLE_MAX6 ን ይግለጹ
#IDX_H_SENSITIVITY7 ን ይግለጹ
#IDX_H_STEP8 ን ይግለጹ
#IDX_SLEEP_MINUTES9 ን ይግለጹ
#IDX_V_DAWN_ANGLE10 ን ይግለጹ
#IDX_H_DAWN_ANGLE11 ን ይግለጹ
#ሁሉንም የ LDRS አማካይ/ IDX_DAWN_INTENSITY12/ አማካኝ ይግለጹ
#ሁሉንም የ LDRS አማካይ/ IDX_DUSK_INTENSITY13/ አማካኝ ይግለጹ
#IDX_END_EEPROM_SET14 ን ይግለጹ
#defineIDX_CURRENT_INTENSITY15 // የሁሉም LDRS አማካይ - IDX_DAWN_INTENSITY ድባብ ቀጥተኛ ያልሆነ ብርሃንን ለማስላት የሚያገለግል
#IDX_END_VALUES_GET16 ን ይግለጹ
#IDX_SIGN_117 ን ይግለጹ
#IDX_SIGN_218 ን ይግለጹ
#IDX_SIGN_319 ን ይግለጹ
Servo _servoH;
Servo _servoV;
ባይት _i2cVals [20] = {10 ፣ 10 ፣ 170 ፣ 20 ፣ 5 ፣ 10 ፣ 170 ፣ 20 ፣ 5 ፣ 20 ፣ 40 ፣ 10 ፣ 30 ፣ 40 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0 ፣ 0};
int _servoLoopDelay = 10;
int _slowingDelay = 0;
int _angleH = 90;
int _angleV = 90;
int _averageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _averageLeft = 0;
ባይት _i2cResponse = 0;
bool _inConfigMode = ሐሰት;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
ከሆነ (inConfigMode ()) {
Serial.println ("Config Mode");
Serial.print ("I2C አድራሻ:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (receiveEvent);
Wire.onRequest (requestEvent);
} ሌላ {
Serial.println ("የመከታተያ ሁነታ");
መዘግየት (5000); // ባትሪውን ካገናኙ ወዘተ እጆችን ለማውጣት ጊዜ።
}
}
ባዶ ()
{
getLightValues ();
ከሆነ (! _inConfigMode) {
// ToDo: የአስተርጓሚ መለወጫውን ያብሩ
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
ለ (int i = 0; i <20; i ++) {
ከሆነ (i! = 0) {
getLightValues ();
}
moveServos ();
}
መዘግየት (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: አስተላላፊ መቀያየርን ያጥፉ
መዘግየት (500);
sleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- የአሁኑ ሁነታ
boolinConfigMode () {
pinMode (PIN_SERVO_H ፣ ማስገቢያ);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
ተመለስ _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
ከሆነ (
EEPROM.read (IDX_SIGN_1)! = 'S' ||
EEPROM.read (IDX_SIGN_2)! = 'T' ||
EEPROM.read (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration ();
EEPROM_read_configuration ();
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration");
ለ (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
EEPROM.update (i ፣ _i2cVals );
}
EEPROM.update (IDX_SIGN_1 ፣ 'S') ፤
EEPROM.update (IDX_SIGN_2 ፣ 'T') ፤
EEPROM.update (IDX_SIGN_3 ፣ EEPROM_VERSION);
}
voidEEPROM_read_configuration () {
Serial.println ("EEPROM_read_configuration");
ለ (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.read (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
ከሆነ (ቆጠራ == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
ባይት ኢንዴክስ = Wire.read ();
ባይት እሴት = Wire.read ();
መቀየሪያ (cmd) {
ጉዳይ 'ጂ'
ከሆነ (መረጃ ጠቋሚ <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [መረጃ ጠቋሚ];
}
ሰበር;
ጉዳይ '':
ከሆነ (መረጃ ጠቋሚ <IDX_END_EEPROM_SET) {
_i2cVals [መረጃ ጠቋሚ] = እሴት;
EEPROM.update (መረጃ ጠቋሚ ፣ _i2cVals [መረጃ ጠቋሚ]);
}
ሰበር;
ነባሪ ፦
መመለስ;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDRs
voidgetLightValues () {
int valueTopLeft = analogRead (PIN_LDR_TL);
int valueTopRight = analogRead (PIN_LDR_TR);
int valueBottomRight = analogRead (PIN_LDR_BR);
int valueBottomLeft = analogRead (PIN_LDR_BL);
_averageTop = (valueTopLeft + valueTopRight) / 2;
_averageRight = (valueTopRight + valueBottomRight) / 2;
_averageBottom = (valueBottomRight + valueBottomLeft) / 2;
_averageLeft = (valueBottomLeft + valueTopLeft) / 2;
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4;
_i2cVals [IDX_CURRENT_INTENSITY] = ካርታ (avgIntensity ፣ 0 ፣ 1024 ፣ 0 ፣ 255);
}
// --------------------------------- ሰርቪስ
voidmoveServos () {
Serial.println ("moveServos");
ከሆነ ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {)
// ወደ ግራ መሄድ
Serial.println ("moveServos ወደ ግራ ይሄዳል");
መዘግየት (_slowingDelay);
ለ (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH. ጻፍ (_angleH--);
መዘግየት (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {)
// ወደ ቀኝ መሄድ
Serial.println ("moveServos ወደ ግራ ይሄዳል");
መዘግየት (_slowingDelay);
ለ (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
መዘግየት (_servoLoopDelay);
}
}
ሌላ {
// ምንም ሳያደርግ
Serial.println ("ምንም እንቅስቃሴ ሳያደርግ ተንቀሳቅሷል");
መዘግየት (_slowingDelay);
}
ከሆነ ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// ይወጡ
Serial.println ("moveServos ወደ ላይ መውጣት");
መዘግየት (_slowingDelay);
ለ (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
መዘግየት (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {)
// ወረደ
Serial.println ("moveServos ወደታች እየሄደ");
መዘግየት (_slowingDelay);
ለ (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
መዘግየት (_servoLoopDelay);
}
}
ሌላ {
Serial.println ("ምንም እንቅስቃሴ ሳያደርግ ማንቀሳቀስ");
መዘግየት (_slowingDelay);
}
}
// --------------------------------- ተኛ
voidasleepFor (ያልተፈረመ ስምንት ሰከንድ ክፍሎች) {
Serial.println ("sleepFor");
ለ (ያልተፈረመ የእንቅልፍ ኮተር = ስምንት ሰከንድ ክፍሎች ፣ የእንቅልፍ ቆጣሪ> 0 ፣ የእንቅልፍ ቆጣሪ--)
{
LowPower.powerDown (SLEEP_8S ፣ ADC_OFF ፣ BOD_OFF) ፤
}
}

በ GitHub በ hosted የተስተናገደ rawtilt_pan_tracker_0.3.ino ይመልከቱ

ደረጃ 4 የወረዳ መያዣን መሰብሰብ

የወረዳ መያዣን መሰብሰብ
የወረዳ መያዣን መሰብሰብ
የወረዳ መያዣን መሰብሰብ
የወረዳ መያዣን መሰብሰብ
የወረዳ መያዣን መሰብሰብ
የወረዳ መያዣን መሰብሰብ
  1. Ardiuno Pro Mini በ PCB ላይ ወደ ራስጌዎቹ መግባቱን ያረጋግጡ።
  2. በ SOLAR TRACKER መቆጣጠሪያ ሳጥን ግድግዳዎች ውስጥ የ SOLAR TRACKER መቆጣጠሪያ ሣጥን መሠረቱን ያስገቡ እና በ 2 x 4G x 6 ሚሜ ከማይዝግ ቆጣሪ የራስ -ታፕ ዊንሽኖች ጋር ያያይዙ።
  3. በ SOLAR TRACKER መቆጣጠሪያ ሣጥን መሠረት ውስጥ ባዶ ሆኖ ወደ 6P ራስጌ በመግባት Ardiuno Pro Mini + PCB ን ያስገቡ።
  4. በ 4 ጂ 4 x 6 ሚሜ የማይዝግ ቆጣሪ የራስ -ታፕ ዊንጮችን በመጠቀም የ SOLAR TRACKER መቆጣጠሪያ ሣጥን ክዳን በ SOLAR TRACKER መቆጣጠሪያ ሳጥን ግድግዳዎች ውስጥ ያስገቡ እና ያያይዙ።
  5. ከ 4 ጂ 4 x 6 ሚሜ የማይዝግ ቆጣሪ የራስ -ታፕ ዊነሮች ጋር ከላይ ወደ የፓነል ፍሬም መሠረት ከላይ ያያይዙ።

ደረጃ 5 - የሪግ መሪዎችን ወደ ተቆጣጣሪው ማገናኘት

የሪግ መሪዎችን ወደ ተቆጣጣሪው ማገናኘት
የሪግ መሪዎችን ወደ ተቆጣጣሪው ማገናኘት
የሪግ መሪዎችን ወደ ተቆጣጣሪው ማገናኘት
የሪግ መሪዎችን ወደ ተቆጣጣሪው ማገናኘት
የሪግ መሪዎችን ወደ ተቆጣጣሪው ማገናኘት
የሪግ መሪዎችን ወደ ተቆጣጣሪው ማገናኘት

ከቀዳሚው Instructable ዝግጁ የሆኑት አግባብነት ያላቸው ግንኙነቶች ፣ ከ 4 ፒ 2 ፒ LDR ግንኙነቶች እና 2 ከ 3 ፒ ግንኙነቶች ከ servos። የኃይል መሙያው ዝግጁ እስከሚሆን ድረስ ጊዜያዊ የሆነው ባትሪው ነው። ለአሁን በ 2 ፒ ዱፖንት ግንኙነት ውስጥ የሚያበቃውን 3.7V LiPo ይጠቀሙ።

  1. የ LDR ግንኙነቶችን (polarity የለም) ከላይ ያስገቡ ፦

    1. ከላይ በስተቀኝ
    2. የላይኛው ግራ
    3. ከታች በስተቀኝ
    4. ከታች ግራ
  2. የ Servo ግንኙነቶችን (ከምልክት ሽቦ ወደ ግራ) ከላይ ያስገቡ

    1. አግድም
    2. አቀባዊ
  3. ለሙከራ ዝግጁ እስኪሆኑ ድረስ ይጠብቁ ከዚያ -3.7V DC Power led +ve ን ወደ ላይ ያስገቡ ፣ -ወደ ታች።

ደረጃ 6 ተቆጣጣሪውን መሞከር

Image
Image

ቀደም ሲል እንደተገለፀው ሶፍትዌሩ ለፀሃይ ኃይል መሙያ የሥራ ፍሰት አልተመቻቸም። ምንም እንኳን ተፈጥሯዊ (ፀሐይን) እና ከተፈጥሮ ውጭ የሆኑ የብርሃን ምንጮችን በመጠቀም ሊሞከር እና ሊቀየር ይችላል።

ክትትል በሚደረግበት አካባቢ ውስጥ መከታተያውን ለመፈተሽ የእንቅልፍ ደቂቃዎችን ወደ ዝቅተኛ እሴት (ቀጣዩን ደረጃ ይመልከቱ) ለማቀናበር ምቹ ሊሆን ይችላል።

ደረጃ 7 የኮንሶል ግቤትን በመጠቀም በ I2C በኩል ማዋቀር

ይህ ተቆጣጣሪውን በሁለተኛው MCU በኩል ማዋቀሩን ፣ ቅንብሮችን ወደ ኮንሶል መስኮት በመግባት ያብራራል።

  1. የሚከተለውን ስክሪፕት በ D1M WIFI BLOCK (ወይም Wemos D1 Mini) ላይ ይስቀሉ።
  2. ዩኤስቢን ከፒሲ ያላቅቁ
  3. የፒን ግንኙነቶች: -ve (ተቆጣጣሪ) => GND (D1M)+ve (ተቆጣጣሪ) => 3V3 (D1M) SCL (ተቆጣጣሪ) => D1 (D1M)

    ኤስዲኤ (ተቆጣጣሪ) => D2 (D1M)

  4. የ SPDT መቀየሪያውን ወደ CONFIG ያዙሩት
  5. ዩኤስቢን ከፒሲ ጋር ያገናኙ
  6. ከአርዱዲኖ አይዲኢ በትክክለኛው የ COM ወደብ የኮንሶል መስኮት ይጀምሩ
  7. “አዲስ መስመር” እና “9600 ባውድ” መመረጣቸውን ያረጋግጡ
  8. ትዕዛዞቹ ወደ የጽሑፍ ሳጥን ይላኩ እና ከዚያ አስገባ ቁልፍን ይከተላሉ
  9. ትዕዛዞቹ በባህሪያት ባይት ቅርጸት ውስጥ ናቸው
  10. ሁለተኛው ባይት (ሦስተኛው ክፍል) 0 (ዜሮ) ካልተካተተ በስክሪፕቱ ይላካል
  11. ተከታታይ ግቤትን በመጠቀም ይጠንቀቁ; “አስገባ” ቁልፍን ከመምታትዎ በፊት ያስገቡትን ይገምግሙ። እርስዎ ተቆልፈው ከሆነ (ለምሳሌ የ I2C አድራሻውን ወደ ረሱት እሴት መለወጥ) የመቆጣጠሪያውን firmware እንደገና ማብራት ያስፈልግዎታል።

በትእዛዙ የመጀመሪያ ቁምፊ ውስጥ የሚደገፉ ልዩነቶች የሚከተሉት ናቸው

  • ኢ (በማዋቀር ጊዜ እንቅስቃሴን ለማቆም ጠቃሚ) (የ servo መከታተልን ያንቁ)። ይህ ግቤት ነው: E 0
  • D (የ servo መከታተልን አሰናክል) መሣሪያውን ዳግም ካልጀመረ አውቶማቲክ ክትትል ለመጀመር ጠቃሚ ነው። D: 0 ን በመጠቀም ይህ ግቤት ነው
  • G (የውቅረት ዋጋን ያግኙ) ከ EEPROM እና IN -MEMORY እሴቶችን ያነባል - ይህ ግቤት ነው - G ን (መረጃ ጠቋሚ ትክክለኛ የባይት እሴቶች 0 - 13 እና 15 ነው)
  • ኤስ (የ EEPROM እሴት ያዘጋጁ) እንደገና ከተነሳ በኋላ የሚገኙትን ወደ EEPROM እሴቶችን ያዘጋጃል። ይህ ግቤት ነው - ኤስ (መረጃ ጠቋሚ ትክክለኛ የባይት እሴቶች 0 - 13 ነው ፣ እሴቱ የሚሰራ የባይት እሴቶች እና በአንድ ንብረት ይለያያል)

ኮዱ ለመረጃ ጠቋሚዎች የእውነት ነጥብ ነው ፣ ግን የሚከተለው ለትክክለኛ እሴቶች/አስተያየቶች መመሪያ ጥቅም ላይ ይውላል።

  • I2C አድራሻ 0 - ተቆጣጣሪ የባሪያ አድራሻ ፣ ጌታው ከተቆጣጣሪው ጋር ለመገናኘት ይህንን ይፈልጋል (ነባሪ 10)
  • አነስተኛ የቁጥር አንግል 1 - የማዕዘን አቀባዊ servo ዝቅተኛ ወሰን (ነባሪ 10 ፣ ክልል 0 - 180)
  • ከፍተኛ VERTICAL ANGLE 2 - የማዕዘን አቀባዊ servo የላይኛው ገደብ (ነባሪ 170 ፣ ክልል 0 - 180)
  • ስሜታዊነት VERTICAL LDR 3 - አቀባዊ LDR ንባብ ህዳግ (ነባሪ 20 ፣ ክልል 0 - 1024)
  • የአቀባዊ አንግል ደረጃ 4 - በእያንዳንዱ ማስተካከያ ላይ የማዕዘን አቀባዊ servo ደረጃዎች (ነባሪ 5 ፣ ክልል 1 - 20)
  • አነስተኛ አግድም አንግል 5 - የማዕዘን አግድም ሰርቪስ ዝቅተኛ ወሰን (ነባሪ 10 ፣ ክልል 0 - 180)
  • ከፍተኛው አግድም አንግል 6 - አንግል አግድም servo የላይኛው ገደብ (ነባሪ 170 ፣ ክልል 0 - 180)
  • ስሜታዊነት አግድም LDR 7 - አግድም LDR ንባብ ህዳግ (ነባሪ 20 ፣ ክልል 0 - 1024)
  • HORIZONTAL ANGLE STEP 8 - በእያንዳንዱ ማስተካከያ ላይ የአግድም አግድም ሰርቪስ ደረጃዎች (ነባሪ 5 ፣ ክልል 1 - 20)
  • የእንቅልፍ ደቂቃዎች 9 - በመከታተያ መካከል ያለው ግምታዊ የእንቅልፍ ጊዜ (ነባሪ 20 ፣ ክልል 1 - 255)
  • የቋሚ ቀኑ አንግል 10 - የወደፊት አጠቃቀም - ፀሐይ ስትጠልቅ ለመመለስ ወደ ቀጥታ ማዕዘን
  • HORIZONTAL DAWN ANGLE 11 - የወደፊት አጠቃቀም - ፀሐይ ስትጠልቅ ለመመለስ ወደ አግድም ማዕዘን
  • DAWN INTENSITY 12 - የወደፊት አጠቃቀም - ዕለታዊ የፀሐይ ክትትል መጀመሩን ከሚያነቃቁ የሁሉም ኤል.ዲ.ኤስ.
  • የአሸዋ መጠን 13 - የወደፊት አጠቃቀም - የዕለታዊ የፀሐይ መከታተልን መጨረሻ የሚያነቃቁ የሁሉም ኤል.ዲ.ኤስ.
  • የ EEPROM እሴቶች ምልክት ማድረጊያ 14 መጨረሻ - እሴት አልተጠቀመም
  • አሁን ያለው ጥንካሬ 15 - የብርሃን ጥንካሬ የአሁኑ አማካይ መቶኛ
  • የውስጠ -ትውስታ እሴቶች መጨረሻ 16 - እሴት አልተጠቀመም።

ተከታታይ ግቤትን (በቁልፍ ሰሌዳው መስኮት ውስጥ የቁልፍ ሰሌዳ ግቤትን) ይይዛል እና ወደ ቅርጸት ቻር ፣ ባይት ፣ ባይት ወደ አንድ I2C ባሪያ ያስተላልፋል።

#ያካትቱ
#I2C_MSG_IN_SIZE2 ን ይግለጹ
#ፍቺ I2C_MSG_OUT_SIZE3
#ይግለጹ I2C_SLAVE_ADDRESS10
ቡሊያን _newData = ሐሰት;
const byte _numChars = 32;
char _receivedChars [_numChars]; // የተቀበለውን ውሂብ ለማከማቸት ድርድር
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
መዘግየት (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
የማይንቀሳቀስ ባይት ndx = 0;
char endMarker = '\ n';
char rc;
ሳለ (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
ከሆነ (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
ከሆነ (ndx> = _numChars) {
ndx = _numChars - 1;
}
} ሌላ {
_receivedChars [ndx] = '\ 0'; // ሕብረቁምፊውን ያቋርጡ
ndx = 0;
_newData = እውነት;
}
}
}
voidparseSendCommands () {
ከሆነ (_newData == እውነት) {
constchar delim [2] = "";
ቻር *ማስመሰያ;
ማስመሰያ = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
ባይት መረጃ ጠቋሚ = 0;
ባይት እሴት = 0;
int i = 0;
እያለ (ማስመሰያ! = NULL) {
//Serial.println (የተወሰደ);
i ++;
ቀይር (i) {
ጉዳይ 1:
ማስመሰያ = strtok (NULL ፣ delim);
መረጃ ጠቋሚ = atoi (ማስመሰያ);
ሰበር;
ጉዳይ 2:
ማስመሰያ = strtok (NULL ፣ delim);
ከሆነ (ማስመሰያ! = NULL) {
እሴት = atoi (ማስመሰያ);
}
ሰበር;
ነባሪ ፦
ማስመሰያ = NULL;
}
}
sendCmd (cmd ፣ መረጃ ጠቋሚ ፣ እሴት);
_newData = ሐሰት;
}
}
voidsendCmd (ቻር ሴሜ ፣ ባይት መረጃ ጠቋሚ ፣ ባይት እሴት) {
Serial.println ("-----");
Serial.println ("ትዕዛዝ መላክ":);
Serial.println ("\ t" + String (cmd) + "" + String (index) + "" + String (value));
Serial.println ("-----");
Wire.begin ማስተላለፊያ (I2C_SLAVE_ADDRESS); // ወደ መሣሪያ ያስተላልፉ
Wire.write (cmd); // ቻር ይልካል
Wire.write (መረጃ ጠቋሚ); // አንድ ባይት ይልካል
Wire.write (እሴት); // አንድ ባይት ይልካል
Wire.endTransmission ();
ባይት ምላሽ = 0;
bool hadResponse = ሐሰት;
ከሆነ (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS ፣ 1);
(Wire.available ()) // ባሪያ ከተጠየቀው ያነሰ ሊልክ ይችላል
{
hadResponse = እውነት;
ምላሽ = Wire.read ();
}
ከሆነ (hadResponse == እውነት) {
Serial.println (“ምላሽ ማግኘት”);
Serial.println (ምላሽ);
} ሌላ {
Serial.println (“ምላሽ የለም ፣ አድራሻውን/ግንኙነቱን ያረጋግጡ”);
}
}
}

GitHub በ hosted የተስተናገደ rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino

ደረጃ 8: ቀጣይ እርምጃዎች

በሶፍትዌር/ሃርድዌር ውስጥ ለውጦችን ለመፈተሽ በየጊዜው ተመልሰው ይመልከቱ።

የእርስዎን መስፈርቶች/ሶፍትዌሮችን/ሃርድዌርዎን ይለውጡ።

በማንኛውም ጥያቄዎች/ማትባቶች ላይ አስተያየት ይስጡ።

የሚመከር: