ዝርዝር ሁኔታ:

ከ StandardFirmata ባሻገር መሄድ - እንደገና ተመልሷል - 5 ደረጃዎች
ከ StandardFirmata ባሻገር መሄድ - እንደገና ተመልሷል - 5 ደረጃዎች

ቪዲዮ: ከ StandardFirmata ባሻገር መሄድ - እንደገና ተመልሷል - 5 ደረጃዎች

ቪዲዮ: ከ StandardFirmata ባሻገር መሄድ - እንደገና ተመልሷል - 5 ደረጃዎች
ቪዲዮ: ኤፕሪል 25 የነጻነት ቀን 2023 ጥያቄዎች እና መልሶች በዩቲዩብ ላይ አብረን እናድጋለን። 2024, ታህሳስ
Anonim
ከ StandardFirmata ባሻገር መሄድ - እንደገና ተመልሷል
ከ StandardFirmata ባሻገር መሄድ - እንደገና ተመልሷል

ከጥቂት ጊዜ በፊት ለፒኤምታ 4 ቤተ -መጽሐፍት ለ DHT22 እርጥበት/የሙቀት ዳሳሽ ድጋፍን ለመጨመር መመሪያ ለማግኘት በፒማታ 4 ተጠቃሚ በዶክተር ማርቲን ዊለር ተገናኝቼ ነበር። የፒማታ 4 ቤተመጽሐፍት ከአርዲኖ አቻው FirmataExpress ጋር በመተባበር ተጠቃሚዎች አርዱዲኖ መሣሪያዎቻቸውን በርቀት እንዲቆጣጠሩ እና እንዲቆጣጠሩ ያስችላቸዋል። በጥቂት ዙር የኢሜል ልውውጦች ውስጥ ፣ ዶ / ር ዊለር ሁለቱንም pymata4 እና FirmataExpress ን በማሻሻል ተሳክቶላቸዋል። በዚህ ምክንያት ለ DHT22 እና DHT11 ዳሳሾች ድጋፍ አሁን የ pymata4 እና FirmataExpress መደበኛ አካል ነው።

በግንቦት 2014 ለተጨማሪ መሣሪያዎች ለ Firmata ድጋፍን ስለመጨመር አንድ ጽሑፍ ጽፌ ነበር። በዚያ ጽሑፍ ላይ በማሰላሰል ፣ ለዚያ ጽሑፍ ብዕር ወደ ወረቀት ከወሰድኩ በኋላ ምን ያህል እንደተለወጠ ተገነዘብኩ። ከዚህ ጽሑፍ በተጨማሪ ፣ ዶ / ር ዊለር ጥረቶቹን ዘግበዋል ፣ እና እርስዎም ያንን ለመመርመር ይፈልጉ ይሆናል።

FirmataExpress በ StandardFirmata ላይ የተመሠረተ ነው ፣ እና የ StandardFirmata ማውጫ መዋቅር ተሻሽሏል። በተጨማሪም ፣ pymata4 ኤፒአይ እንዲሁ ከ ‹44› ‹›››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››› ሲል ደግሞ ደግሞ እንደመጀመሪያዉ ከ ‹4Mata› ኤፒአይ ከ 2014 በጣም ትንሽ የተለየ። የዶ/ር ዊለር ሥራን እንደ መሠረት በመጠቀም ፣ የ pymata4/FirmataExpress ተግባርን እንዴት ማራዘም እንደሚቻል እንመርምር።

ከመጀመራችን በፊት - ስለ አርዱዲኖ/ፊርማታ አንዳንድ የጀርባ መረጃ

ስለዚህ ፊርማታ ምንድነው? ከ Firmata ድረ -ገጽ በመጥቀስ ፣ “ፊርማታ በአስተናጋጅ ኮምፒተር ላይ ካሉ ሶፍትዌሮች ከማይክሮ መቆጣጠሪያዎች ጋር ለመገናኘት አጠቃላይ ፕሮቶኮል ነው።”

አርዱዲኖ ፊርማታ በአርዱዲኖ ማይክሮ መቆጣጠሪያ እና በፒሲ መካከል ሁለቱንም ትዕዛዞችን እና መረጃን ለማጓጓዝ ተከታታይ በይነገጽን ይጠቀማል ፣ በተለይም ወደ 57600 bps የተቀናበረ ተከታታይ/ዩኤስቢ አገናኝ ይጠቀማል። በዚህ አገናኝ ላይ የተላለፈው ውሂብ ሁለትዮሽ ነው ፣ እና ፕሮቶኮሉ በደንበኛ/አገልጋይ ሞዴል ውስጥ ይተገበራል።

የአገልጋዩ ጎን በአርዱዲኖ ረቂቅ መልክ ወደ አርዱዲኖ ማይክሮ መቆጣጠሪያ ይሰቀላል። ከ Arduino IDE ጋር የተካተተው የ StandardFirmata ንድፍ ፣ በደንበኛው እንዳዘዘው የአርዲኖ I/O ፒኖችን ይቆጣጠራል። እንዲሁም የግብዓት ፒን ለውጦችን እና ሌላ የሪፖርት መረጃን ለደንበኛው ይመልሳል። FirmataExpress የተራዘመ የ StandardFirmata ስሪት ነው። እሱ በ 115200 bps በተከታታይ አገናኝ ፍጥነት ይሠራል።

ለዚህ ጽሑፍ ያገለገለው የአርዱዲኖ ደንበኛ pymata4 ነው። እሱ በፒሲ ላይ የተገደለ የ Python መተግበሪያ ነው። ሁለቱም ትዕዛዞችን ይልካል እና ከአርዲኖ አገልጋይ ሪፖርቶችን ይቀበላል። Pymata4 በ Python ውስጥ ስለሚተገበር በዊንዶውስ ፣ ሊኑክስ (Raspberry Pi ን ጨምሮ) እና በማክሮስ ኮምፒውተሮች ላይ ይሠራል።

Firmata ን ለምን ይጠቀሙ?

የአርዱዲኖ ማይክሮ መቆጣጠሪያዎች ግሩም ትናንሽ መሣሪያዎች ናቸው ፣ ግን የአቀነባባሪዎች እና የማስታወስ ሀብቶች በተወሰነ ደረጃ ውስን ናቸው። ለመተግበር አንጎለ ኮምፒውተር ወይም ማህደረ ትውስታ ላላቸው መተግበሪያዎች ፣ ትግበራው ስኬታማ እንዲሆን የሀብት ፍላጎትን በፒሲ ላይ ከማውረድ በስተቀር ብዙ ምርጫ የለም።

ግን StandardFirmata ን ለመጠቀም ብቸኛው ምክንያት ይህ አይደለም። ቀላል ክብደት Arduino መተግበሪያዎችን በሚገነቡበት ጊዜ ፒሲ በአርዱዲኖ ማይክሮ መቆጣጠሪያ ላይ በቀጥታ የማይገኙ መሳሪያዎችን እና የማረም ችሎታዎችን ሊያቀርብ ይችላል። “ቋሚ” ደንበኛን እና አገልጋይን መጠቀም የመተግበሪያውን ውስብስብነት ይበልጥ በቀላሉ በሚተዳደር ፒሲ ላይ ለማቆየት ይረዳል። አንዴ ማመልከቻው ከተጠናቀቀ በኋላ ወደ ብጁ ፣ ራሱን የቻለ አርዱinoኖ ንድፍ ሊተረጎም ይችላል።

ለምን pymata4 ን ይጠቀሙ?

በእርግጥ የእሱ ደራሲ በመሆኔ አድልዎ ነኝ። ይህ በእንዲህ እንዳለ ባለፉት ጥቂት ዓመታት ውስጥ ያለማቋረጥ ተጠብቆ የቆየው ብቸኛው በ Python ላይ የተመሠረተ የ Firmata ደንበኛ ነው። እሱ ሊታወቅ የሚችል እና ለመጠቀም ቀላል የሆነ ኤፒአይ ይሰጣል። StandardFirmata ላይ ከተመሠረቱ ንድፎች በተጨማሪ ፣ StandardFirmataWifI ንድፍ ሲጠቀሙ እንደ ESP-8266 ላሉ መሣሪያዎች Firmata ን በ WiFi ላይ ይደግፋል።

እንዲሁም pymata4 በአሁኑ ጊዜ በ StandardFirmata የማይደገፉ ተጨማሪ ዳሳሾችን እና አንቀሳቃሾችን ለመደገፍ በተጠቃሚ በቀላሉ እንዲራዘም ታስቦ ነበር።

ደረጃ 1 የ Firmata Protocol ን መረዳት

የ Firmata ፕሮቶኮል መረዳት
የ Firmata ፕሮቶኮል መረዳት

የአርዱዲኖ ፊርማታ የግንኙነት ፕሮቶኮል የተገኘው መረጃን ለመወከል አንድ ወይም ከዚያ በላይ 7 ቢት ባይት ከሚጠቀምበት ከ MIDI ፕሮቶኮል ነው።

Firmata ለተጠቃሚዎች ተደራሽ እንዲሆን ታስቦ ነበር። ይህንን ሰፊነት የሚሰጥ ዘዴ የስርዓት ልዩ (SysEx) የመልዕክት ፕሮቶኮል ነው።

በ Firmata Protocol እንደተገለጸው የ SysEx መልእክት ቅርጸት ፣ ከላይ ባለው ሥዕል ላይ ይታያል። በሄክሳዴሲማል 0xF0 ቋሚ እሴት በ START_SYSEX ባይት ይጀምራል ፣ እና ልዩ የ SysEx ትዕዛዝ ባይት ይከተላል። የትእዛዙ ባይት ዋጋ በሄክሳዴሲማል 0x00-0x7F ክልል ውስጥ መሆን አለበት። ከዚያ የትእዛዝ ባይት ያልተገለጸ የ 7 ቢት የውሂብ ባይት ቁጥር ይከተላል። በመጨረሻም ፣ መልእክቱ በ END_SYSEX ባይት ፣ በሄክሳዴሲማል 0xF7 ቋሚ እሴት ይቋረጣል።

የ Firmata ውሂብ ኢንኮዲንግ/ዲኮዲንግ

የ SysEx መልእክት የተጠቃሚ ውሂብ ክፍል በተከታታይ 7 ቢት ባይት ያካተተ ስለሆነ አንድ ሰው ከ 128 (0x7f) የሚበልጥ እሴት እንዴት ይወክላል ብለው ያስቡ ይሆናል? መረጃው በመረጃ አገናኝ ላይ ከመዋሃዱ በፊት እነዚያን እሴቶች ወደ ብዙ 7-ቢት ባይት ቁርጥራጮች በመበተን እነዚያን እሴቶች ይፈርዳል። የውሂብ ንጥል ትንሹ ጉልህ ባይት (ኤል.ኤስ.ቢ.) በመጀመሪያ ይላካል ፣ በመቀጠል ጉልህ የሆኑ የውሂብ ንጥል ክፍሎች በስብሰባው ይከተላሉ። የውሂብ ንጥሉ በጣም ጉልህ ባይት (MSB) የተላከው የመጨረሻው የውሂብ ንጥል ነው።

ይህ እንዴት ይሠራል?

በ SysEx መልእክት የውሂብ ክፍል ውስጥ 525 እሴት ለማካተት እንፈልጋለን እንበል። የ 525 ዋጋ ከ 128 እሴት በግልጽ ስለሚበልጥ ፣ በ 7 ቢት ባይት “ቁርጥራጮች” መከፋፈል ወይም መበተን አለብን።

ያ እንዴት እንደሚደረግ እነሆ።

በአስርዮሽ ውስጥ ያለው የ 525 እሴት 0x20D ፣ ባለ 2 ባይት እሴት ካለው ሄክሳዴሲማል እሴት ጋር እኩል ነው። ኤል.ኤስ.ቢ.ን ለማግኘት በ 0x7F በ AND'ing እሴቱን እንሸፍነዋለን። ሁለቱም “ሲ” እና የፓይዘን ትግበራዎች ከዚህ በታች ይታያሉ

// “ሐ” ትግበራ ኤል.ኤስ.ቢ

int max_distance_LSB = max_distance & 0x7f; // LSB max_distance_LSB = max_distance & 0x7F # የታችኛውን ባይት ለመሸፈን የታችኛውን ባይት # የፓይዘን ትግበራ ይሸፍኑ

ጭምብል ካደረጉ በኋላ ፣ max_distance_LSB 0x0d ይይዛል። 0x20D & 0x7F = 0x0D።

በመቀጠል ፣ MSB ን ለዚህ ባለ 2 ባይት እሴት መለየት አለብን። ይህንን ለማድረግ የ 0x20D ን እሴት ወደ ቀኝ ፣ 7 ቦታዎች እናዞራለን።

// “ሐ” ትግበራ MSB ን የ 2 ባይት እሴት ለመለየት

int max_distance_MSB = max_distance >> 7; // የላይ ባይት ለማግኘት MSB ን በ 2 ባይት እሴት max_distance_MSB = max_distance >> 7 # ለማዛወር ከፍተኛውን ትዕዛዝ ባይት # የፓይዘን ትግበራ ቀይር ከተለወጠ በኋላ ፣ ከፍተኛው_distance_MSB 0x04 እሴት ይይዛል።

“ጨነቀ” የተባበረ መረጃ ሲደርሰው እንደገና ወደ አንድ ነጠላ እሴት እንደገና መሰብሰብ አለበት። በሁለቱም በ “ሐ” እና በ Python ውስጥ ውሂቡ እንዴት እንደሚሰበሰብ እነሆ

// “ሐ” ትግበራ 2 ባይት እንደገና ለመሰብሰብ ፣

// 7 ቢት እሴቶች ወደ አንድ እሴት int max_distance = argv [0] + (argv [1] << 7); 2 ባይት ፣ # 7 ቢት እሴቶችን ወደ አንድ እሴት max_distance = ውሂብ [0] + (ውሂብ [1] << 7) እንደገና ለመሰብሰብ # የፓይዘን ትግበራ

እንደገና ከተሰበሰበ በኋላ እሴቱ እንደገና 525 አስርዮሽ ወይም 0x20 ዲ ሄክሳዴሲማል ነው።

ይህ የመበታተን/የመገጣጠም ሂደት በደንበኛው ወይም በአገልጋዩ ሊከናወን ይችላል።

ደረጃ 2 እንጀምር

አዲስ መሣሪያን መደገፍ ለሁለቱም የአርዱዲኖ ነዋሪ አገልጋይ እና ለፒሲ ነዋሪ የፓይዘን ደንበኛ ለውጦችን ይፈልጋል። የዶክተር ዌለር ሥራ አስፈላጊዎቹን ማሻሻያዎች ለማሳየት ያገለግላል።

ምናልባት በጣም አስፈላጊው እርምጃ አሁን ያለውን የድጋፍ መሣሪያ ቤተ -መጽሐፍት ወደ ቀመር ወደ አርዱinoኖ ጎን ለማዋሃድ ወይም የራስዎን ለመፃፍ መወሰን ነው። አንድ ነባር ቤተ -መጽሐፍት ማግኘት ከቻሉ የራስዎን ከባዶ ከመጻፍ ይልቅ እሱን ለመጠቀም በጣም ቀላል እንደሆነ ይመከራል።

ለ DHT መሣሪያ ድጋፍ ፣ ዶ / ር ዊለር የኤክስቴንሽን ኮዱን በ DHTNew ቤተ -መጽሐፍት ላይ መሠረት አደረገ። በጣም ብልህ ፣ ዶ / ር ዊለር በአርዱዲኖ በኩል አነስተኛ እገዳን ለማቅረብ የ DHTNew ቤተ -መጽሐፍትን በአርዱዲኖ እና በ pymata4 ጎኖች ላይ ተከፋፍሏል።

DHTNew ን ከተመለከትን የሚከተሉትን ሁሉ ያከናውናል

  • የተመረጠውን ፒን ዲጂታል ውፅዓት ሁነታን ያዘጋጃል።
  • የቅርብ ጊዜውን የእርጥበት እና የሙቀት እሴቶችን ለማግኘት የተቀየረ ምልክት ያወጣል።
  • ማንኛውንም ስህተቶች ይፈትሻል እና ሪፖርት ያደርጋል።
  • ከተገኘው ጥሬ መረጃ በሰው ሊነበብ የሚችል የሙቀት መጠን እና የእርጥበት እሴቶችን ያሰላል።

ነገሮችን በ FirmataExpress ጎን በተቻለ መጠን ቀልጣፋ ለማድረግ ፣ ዶ / ር ዊለር የውሂብ መለወጫ ልምዶችን ከአርዱኖ ወደ pymata4 አውርደዋል።

ደረጃ 3: ለ DHT ድጋፍ FirmataExpress ን ማሻሻል

የ FirmataExpress ማውጫ ዛፍ

ከዚህ በታች የ FirmataExpress ማከማቻን ያካተቱ ሁሉም ፋይሎች ናቸው። አንዳንድ ዛፎች የማከማቻውን ስም የሚያንፀባርቁ በመሆናቸው ይህ ዛፍ ከመደበኛ ፋርማታ ጋር ተመሳሳይ ነው።

ማሻሻያ የሚያስፈልጋቸው ፋይሎች በአጠገባቸው የኮከብ ምልክት (*) ያላቸው ናቸው።

FirmataExpress

Bo * Boards.h

ምሳሌዎች

Irm irm FirmataExpress

ቦርድክስ

├── * FirmataExpress.ino

├── IC LICENSE.txt

ፋይል ያድርጉ

F * FirmataConstants.h

* FirmataDefines.h

Irm FirmataExpress.cpp

Irm FirmataExpress.h

Irm FirmataMarshaller.cpp

Irm FirmataMarshaller.h

Irm FirmataParser.cpp

Irm FirmataParser.h

እያንዳንዱን ፋይሎች እና የተደረጉ ለውጦችን እንመልከት።

Boards.h

ይህ ፋይል ለእያንዳንዱ የሚደገፉ የቦርድ ዓይነቶች የፒን ዓይነት ማክሮ ትርጓሜዎችን ይ containsል። ከአንድ በላይ መሣሪያ መደገፍ ሲፈልግ የሚደገፉትን ከፍተኛውን የመሣሪያዎች ብዛት ይገልጻል።

ለ DHT መሣሪያ በአንድ ጊዜ እስከ 6 መሣሪያዎች ሊገናኙ ይችላሉ እና ይህ እሴት እንደሚከተለው ይገለጻል

#ifndef MAX_DHTS

#MAX_DHTS 6 #endifine ን ይግለጹ

እንዲሁም የፒን ዓይነት ማክሮዎች ለአዲሱ መሣሪያ ፣ ለሁሉም የቦርድ ዓይነቶች ወይም ለእርስዎ ፍላጎት ላላቸው ብቻ በአማራጭ ሊገለጹ ይችላሉ። እነዚህ ማክሮዎች በአብዛኛው ለሪፖርት ዓላማዎች ያገለግላሉ እና መሣሪያዎቹን ለመቆጣጠር አያገለግሉም። እነዚህ ማክሮዎች መሣሪያውን የሚደግፉትን ሁለቱንም ፒኖች ይገልፃሉ-

#ጥራት IS_PIN_DHT (ገጽ) (IS_PIN_DIGITAL (ገጽ) && (ገጽ) - 2 <MAX_DHTS)

እንዲሁም የፒን-ቁጥር ልወጣን ለመግለጽ ማክሮ።

#PIN_TO_DHT (ገጽ) PIN_TO_DIGITAL (ገጽ)

FirmataConstants.h

ይህ ፋይል የትኛውን ስሪት በእርስዎ አርዱinoኖ ላይ እንደጫኑ ለመከታተል ሊቀይሩት የሚችሉት የጽኑዌር ስሪት ቁጥርን ይ containsል። እንዲሁም የ Firmata SysEx መልዕክቶችን ጨምሮ የ Firmata መልእክት እሴቶችን ይ containsል።

በዚህ ፋይል ውስጥ ለመሣሪያዎ አዲስ መልእክት ወይም የመልእክቶች ስብስብ መመደብ ያስፈልግዎታል። ለ DHT ፣ ሁለት መልእክቶች ታክለዋል። አንደኛው ፒን እንደ “DHT” ፒን ያዋቅራል ፣ ሁለተኛው ደግሞ እንደ ዘጋቢ መልእክት ፣ የቅርብ ጊዜውን የ DHT መረጃ ለደንበኛው ሲመልስ።

የማይንቀሳቀስ const int DHT_CONFIG = 0x64;

የማይንቀሳቀስ const int DHT_DATA = 0x65;

በዚህ ፋይል ውስጥ የፒን ሁነታዎች እንዲሁ ተለይተዋል። ለ DHT አዲስ የፒን ሞድ ተፈጥሯል

የማይንቀሳቀስ const int PIN_MODE_DHT = 0x0F; // ፒን ለ DHT ተዋቅሯል

አዲስ የፒን ሁነታን ሲያክሉ ፣ TOTAL_PIN_MODES መስተካከል አለባቸው ፦

የማይንቀሳቀስ const int TOTAL_PIN_MODES = 17;

FirmataDefines.h

ወደ FirmataConstants.h የታከሉትን አዲስ መልዕክቶች ለማንፀባረቅ ይህ ፋይል መዘመን አለበት ፦

#ifdef DHT_CONFIG #undef DHT_CONFIG #endif #define DHT_CONFIG firmata:: DHT_CONFIG // DHT ጥያቄ #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: DHT_DATA // DHT reply #ifdef PINDMDE_DHT_DHT_DHT_DHT:: PIN_MODE_DHT

FirmataExpress.ino

በዚህ ውይይት በዚህ የአርዱዲኖ ንድፍ ላይ የተደረጉትን ለውጦች “ከፍተኛ ነጥቦችን” እንሸፍናለን።

FirmataExpress በአንድ ጊዜ እስከ ስድስት የ DHT መሳሪያዎችን በአንድ ጊዜ እንዲደግፍ ፣ እያንዳንዱ የመሣሪያው ተጓዳኝ የፒን ቁጥር ፣ የ WakeUpDelay እሴቱ እና የመሣሪያው ዓይነት ፣ ማለትም DHT22 ወይም DHT11 ን ለመከታተል 3 ድርድሮች ተፈጥረዋል።

// DHT ዳሳሾች

int numActiveDHTs = 0; // የ DHT ዎች ቁጥር ተያይ attachedል uint8_t DHT_PinNumbers [MAX_DHTS]; uint8_t DHT_WakeUpDelay [MAX_DHTS]; uint8_t DHT_TYPE [MAX_DHTS];

ሁለቱም የመሣሪያ አይነቶች በንባብ መካከል በግምት 2 ሰከንዶች ስለሚፈልጉ ፣ እያንዳንዱን DHT በ 2-ሰከንድ የጊዜ ማእቀፍ ውስጥ አንድ ጊዜ ብቻ እንደምናነብ ማረጋገጥ አለብን። እንደ DHT መሣሪያዎች እና HC-SR04 የርቀት ዳሳሾች ያሉ አንዳንድ መሣሪያዎች በየጊዜው የሚደርሱባቸው ብቻ ናቸው። ይህ ከአካባቢያቸው ጋር መስተጋብር ለመፍጠር ጊዜ ይሰጣቸዋል።

uint8_t nextDHT = 0; // ጠቋሚ ወደ dht የሚቀጥለው መሣሪያ እንዲነበብ

uint8_t currentDHT = 0; // የትኛው ዳሳሽ ገባሪ እንደሆነ ይከታተላል። int dhtNumLoops = 0; // በ loop b4 በኩል የ DHT int dhtLoopCounter = 0 ን ለመድረስ የዒላማዎች ቁጥር። // ሉፕ ቆጣሪ

የ DHT መሣሪያን ማዋቀር እና ማንበብ

FirmataExpress ፒን ለዲኤችቲ አሠራር ለማዋቀር የ SysEx ትዕዛዝ ሲቀበል ፣ ከፍተኛው የዲኤችቲ መሣሪያዎች ብዛት ያልበለጠ መሆኑን ያረጋግጣል። አዲሱ DHT ሊደገፍ የሚችል ከሆነ ፣ የ DHT ድርድሮች ተዘምነዋል። የ DHT ዓይነት የማይታወቅ ከሆነ ፣ የ SysEx ሕብረቁምፊ መልእክት ተፈጥሯል እና ወደ pymata4 ተመልሷል

ጉዳይ DHT_CONFIG: int DHT_Pin = argv [0]; int DHT_type = argv [1]; ከሆነ (numActiveDHTs <MAX_DHTS) {ከሆነ (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1; } ሌላ ከሆነ (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18; } ሌላ {Firmata.sendString ("ስህተት ፦ ያልታወቀ የአነፍናፊ ዓይነት ፣ ልክ ያልሆኑ ዳሳሾች 11 ፣ 22 ናቸው") ፤ ሰበር; } // ዳሳሹን DHT_PinNumbers [numActiveDHTs] = DHT_Pin ን ይፈትሹ; DHT_TYPE [numActiveDHTs] = DHT_type; setPinModeCallback (DHT_Pin ፣ PIN_MODE_DHT) ፤

ከዚያ FirmataExpress ከ DHT መሣሪያ ጋር ለመገናኘት ይሞክራል። ማንኛውም ስህተቶች ካሉ ፣ ከስህተት ውሂቡ ጋር የ SysEx መልእክት ይመሰርታል እና የ SysEx መልዕክቱን ወደ pymat4 መልሷል። የ _ ቢት ተለዋዋጭ ከተፈለገ በ pymata4 ተጨማሪ ሂደት በዲኤችቲ መሣሪያ የተመለሰውን መረጃ ይይዛል።

Firmata.write (START_SYSEX);

Firmata.write (DHT_DATA); Firmata.write (DHT_Pin); Firmata.write (DHT_type); ለ (uint8_t i = 0; i> 7 & 0x7f); } Firmata.write (abs (rv)); Firmata.write (1); Firmata.write (END_SYSEX);

ትክክለኛ ውሂብ ከተመለሰ ፣ ንቁ የሆኑት የዲኤችቲዎች ቁጥር ይጨምራል። ቀጣዩን DHT ለመረጃ ከመፈተሽ በፊት ምን ያህል የሉፕ ድግግሞሽ እንደሚጠናቀቅ የሚከታተል ተለዋዋጭ እንዲሁ ተስተካክሏል። ይህ ተለዋዋጭ ምንም ያህል የዲኤችቲዎች በስርዓቱ ውስጥ ቢጨመሩ ፣ ሁሉም በ 2 ሰከንድ ጊዜ ውስጥ እንደሚነበቡ ያረጋግጣል።

int rv = readDhtSensor (numActiveDHTs);

ከሆነ (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // ሁሉም ደህና ነው}

አንድ ወይም ከዚያ በላይ የ DHT መሣሪያዎች በስዕሉ ላይ ባለው የሉፕ ተግባር ውስጥ ከተዋቀሩ ቀጣዩ የ DHT መሣሪያ ይነበባል። ወይም ትክክለኛው ውሂብ ወይም የስህተት ሁኔታው በ SysEx መልእክት መልክ ወደ pymata4 ይመለሳል።

ከሆነ (dhtLoopCounter ++> dhtNumLoops) {ከሆነ (numActiveDHTs) {int rv = readDhtSensor (nextDHT) ፤ uint8_t current_pin = DHT_PinNumbers [nextDHT]; uint8_t current_type = DHT_TYPE [nextDHT]; dhtLoopCounter = 0; currentDHT = nextDHT; ከሆነ (nextDHT ++> = numActiveDHTs - 1) {nextDHT = 0; } ከሆነ (rv == DHTLIB_OK) {// የሙከራ ፍተሻ uint8_t sum = _bits [0] + _bits [1] + _bits [2] + _bits [3]; ከሆነ (_ ቢት [4]! = ድምር) {rv = -1; }} // መልዕክቱን በስህተት ሁኔታ ይላኩ Firmata.write (START_SYSEX) ፤ Firmata.write (DHT_DATA); Firmata.write (current_pin); Firmata.write (የአሁኑ_አይነት); ለ (uint8_t i = 0; i <sizeof (_bits) - 1; ++ i) {Firmata.write (_bits ); // Firmata.write (_bits ;} Firmata.write (abs (rv))) ፤ Firmata.write (0) ፤ Firmata.write (END_SYSEX) ፤}}

ከ DHT መሣሪያ ጋር ለመገናኘት ጥቅም ላይ የዋለው ኮድ በቀጥታ ከ DHT አዲስ ቤተ -መጽሐፍት የተገኘ ነው-

int readDhtSensor (int ኢንዴክስ) {

// የውሂብ uint8_t ጭንብል = 128 ለመቀበል INIT BUFFERVAR; uint8_t idx = 0; // ባዶ ባዶ/ memset (_bits ፣ 0 ፣ sizeof (_bits)); ለ (uint8_t i = 0; i 5 BYTES ለ (uint8_t i = 40; i! = 0; i--) {loopCnt = DHTLIB_TIMEOUT ፤ ሳለ (digitalRead (pin) == LOW) {ከሆነ (--loopCnt == 0) DHTLIB_ERROR_TIMEOUT ን መመለስ ፤} uint32_t t = micros () ፤ loopCnt = DHTLIB_TIMEOUT ፤ ሳለ (digitalRead (pin) == HIGH) {ከሆነ (--loopCnt == 0) DHTLIB_ERROR_TIMEOUT ፤} ከሆነ ((ማይክሮስ ()-t) 40) {_bits [idx] | = ጭንብል ፤} ጭንብል >> = 1 ፤ (ጭምብል == 0) // የሚቀጥለው ባይት? {Mask = 128; idx ++;}} DHTLIB_OK ን ይመለሱ ፤}

ደረጃ 4 ለዲኤችቲ ድጋፍ Pymata4 ን መለወጥ

private_constants.h

DHT ን ለመደገፍ አዲሱን የፒን ዓይነት እና የ SysEx መልዕክቶችን ወደዚህ ፋይል ማከል አለብን

# የፒን ሁነታዎች ግብዓት = 0x00 # ፒን እንደ ግብዓት ተዘጋጅቷል OUTPUT = 0x01 # ፒን እንደ ውፅዓት ተቀናብሯል ANALOG = 0x02 # የአናሎግ ፒን በአናሎግ የግብዓት ሁኔታ PWM = 0x03 # ዲጂን ፒን በ PWM ውፅዓት ሁኔታ SERVO = 0x04 # በ Servo ውፅዓት ሁነታ I2C = 0x06 # ፒን በ I2C ማዋቀሪያ ውስጥ ተካትቷል STEPPER = 0x08 # ማንኛውም በእንጥልጥል ሁነታ SERIAL = 0x0a PULLUP = 0x0b # በ pullup mode ውስጥ ማንኛውም ፒን SONAR = 0x0c # በ SONAR ሞድ ውስጥ ያለ ማንኛውም ፒን TONE = 0x0d # ማንኛውም በድምጽ ሁነታ PIXY = 0x0e # ለፒክሲ ካሜራ ሁነታ DHT = 0x0f # DHT ዳሳሽ IGNORE = 0x7f # DHT SysEx ትዕዛዝ መልዕክቶች DHT_CONFIG = 0x64 # dht ውቅር ትዕዛዝ DHT_DATA = 0x65 # dht ዳሳሽ ምላሽ

የተጨመረው የፒን ዓይነት እና የ SysEx ትዕዛዞች በ FirmataConstants.h ውስጥ ወደ FirmataExpress ከተጨመሩ እሴቶች ጋር መዛመድ አለባቸው።

pymata4.py

ፒማታ 4 መጪውን የ Firmata መልእክት ከመልእክት ተቆጣጣሪ ጋር በፍጥነት ለማዛመድ የ Python መዝገበ -ቃላትን ይጠቀማል። የዚህ መዝገበ -ቃላት ስም report_dispatch ነው።

ለመዝገበ -ቃላት መግቢያ ቅርጸት የሚከተለው ነው-

{MessageID ፦ [message_handler ፣ የሚሰሩ የውሂብ ባይት ብዛት]}

መጪውን የ DHT መልዕክቶችን ለማስተናገድ ወደ መዝገበ -ቃላቱ ታክሏል-

{PrivateConstants. DHT_DATA ፦ [self._dht_read_response, 7]}

በመልዕክቱ ውስጥ ያሉት 7 ባይት መረጃዎች የአርዱዲኖ ዲጂታል ፒን ቁጥር ፣ የ DHT መሣሪያ ዓይነት (22 ወይም 11) እና 5 ባይት ጥሬ ውሂብ ናቸው።

የ _dht_read_response ዘዴ ማንኛውም ሪፖርት የተደረጉ ስህተቶችን ይፈትሻል። ሪፖርት የተደረጉ ስህተቶች ከሌሉ ፣ እርጥበት እና የሙቀት መጠኑ የሚሰላው ከአርዱዲኖ DHTNew ቤተ -መጽሐፍት የተላለፈውን ስልተ ቀመር በመጠቀም ነው።

የተሰሉት እሴቶች በተጠቃሚ በሚቀርብ የመልሶ መደወያ ዘዴ በኩል ሪፖርት ይደረጋሉ። እንዲሁም በውስጣዊ የ pin_data የውሂብ መዋቅር ውስጥ ተከማችተዋል። የዘገበው የመጨረሻ እሴት dht_read ዘዴን በመጠቀም በ pin_data ድምጽ በመስጠት ሊታወስ ይችላል።

አዲስ የ DHT መሣሪያን በማዋቀር ላይ

አዲስ የዲኤችቲ መሣሪያ ሲጨምሩ የ set_pin_mode_dht ዘዴ ይባላል። ይህ ዘዴ pin_data ን ለዲጂታል ፒን ያዘምናል። እንዲሁም ለ FirmataExpress የ DHT_CONFIG SysEx መልእክት ይፈጥራል እና ይልካል።

ደረጃ 5: መጠቅለል

እንዳየነው ፣ ለአዲስ መሣሪያ የ Firmata ድጋፍን ማከል የአርዱዲኖ ፊርማታክስፕረስ የአገልጋይ ኮድ እና በ Python ላይ የተመሠረተ pymata4 ደንበኛ ኮድ እንዲያስተካክሉ ይጠይቃል። የ FirmataExpress ኮድ ለማረም ፈታኝ ሊሆን ይችላል። ለማረም ለመርዳት printData የሚባል ዘዴ ወደ FirmataExpress ታክሏል። ይህ ዘዴ የውሂብ እሴቶችን ከ FirmataExpress ለመላክ ያስችልዎታል እና በ pymata4 ኮንሶል ላይ ያትሟቸዋል።

ይህ ተግባር ሁለቱንም ጠቋሚ ወደ ቁምፊ ሕብረቁምፊ እና ሊያዩት የሚፈልጉትን እሴት ይፈልጋል። የውሂብ እሴቱ አርጋክ በሚባል ተለዋዋጭ ውስጥ የሚገኝ ከሆነ ፣ በሚከተሉት መለኪያዎች ወደ printData ሊደውሉ ይችላሉ።

printData ((char*) "argc =", argc);

ማንኛቸውም ጥያቄዎች ካሉዎት አስተያየት ብቻ ይተዉ እና መልስ ለመስጠት ደስተኛ ነኝ።

መልካም ኮድ!

የሚመከር: