Სარჩევი:

სტანდარტული ფირმის მიღმა - გადახედე: 5 ნაბიჯი
სტანდარტული ფირმის მიღმა - გადახედე: 5 ნაბიჯი

ვიდეო: სტანდარტული ფირმის მიღმა - გადახედე: 5 ნაბიჯი

ვიდეო: სტანდარტული ფირმის მიღმა - გადახედე: 5 ნაბიჯი
ვიდეო: 🧨 Подробнейший обзор "пятёрки" BMW F10. Есть ли в ней плюсы? Или одни минусы? 2024, ივლისი
Anonim
სცილდება სტანდარტულ ფირმას - გადახედე
სცილდება სტანდარტულ ფირმას - გადახედე

ცოტა ხნის წინ, მე დამიკავშირდა დოქტორი მარტინ უილერი, pymata4 მომხმარებელი, ხელმძღვანელობისთვის pymata4 ბიბლიოთეკაში DHT22 ტენიანობის/ტემპერატურის სენსორის მხარდაჭერის დამატებაში. Pymata4 ბიბლიოთეკა, Arduino– ს კოლეგასთან, FirmataExpress– თან ერთად, მომხმარებლებს საშუალებას აძლევს, გააკონტროლონ და გააკონტროლონ თავიანთი Arduino მოწყობილობები დისტანციურად. ელ.ფოსტის გაცვლის რამდენიმე რაუნდში დოქტორ ვილერმა წარმატებით შეასრულა pymata4 და FirmataExpress ცვლილებები. შედეგად, DHT22 და DHT11 სენსორების მხარდაჭერა არის pymata4 და FirmataExpress– ის სტანდარტული ნაწილი.

2014 წლის მაისში დავწერე სტატია Firmata– სთვის დამატებითი მოწყობილობების მხარდაჭერის დამატების შესახებ. იმ სტატიის გააზრებისას მივხვდი, რამდენად შეიცვალა მას შემდეგ, რაც ამ სტატიისათვის კალამი ქაღალდზე ავიღე. ამ სტატიის გარდა, დოქტორ ვილერმა დააფიქსირა მისი ძალისხმევა და თქვენც გნებავთ ამის შემოწმება.

FirmataExpress დაფუძნებულია StandardFirmata– ზე და StandardFirmata დირექტორიის სტრუქტურა განვითარდა. გარდა ამისა, pymata4 API ასევე საკმაოდ განსხვავდება 2014 წლის პირველადი PyMata API– სგან. ვფიქრობდი, რომ ეს იქნება სრულყოფილი დრო ამ სტატიის გადახედვისა და განახლებისთვის. დოქტორ ვილერის მუშაობის საფუძველზე, მოდით განვიხილოთ, თუ როგორ გავაფართოვოთ pymata4/FirmataExpress ფუნქციონირება.

სანამ დავიწყებთ - რამდენიმე წინაპირობური ინფორმაცია არდუინოს/ფირმას შესახებ

რა არის ფირმატა? Firmata– ს ვებ – გვერდიდან ციტატა: „Firmata არის ზოგადი პროტოკოლი მასპინძელ კომპიუტერზე პროგრამული უზრუნველყოფის მიკროკონტროლერებთან კომუნიკაციისთვის“.

Arduino Firmata იყენებს სერიულ ინტერფეისს, რათა გადაიტანოს როგორც ბრძანება, ისე ინფორმაცია Arduino მიკროკონტროლერსა და კომპიუტერს შორის, როგორც წესი, სერიული/USB ბმულის გამოყენებით, რომელიც დადგენილია 57600 წმ/წმ. ამ ბმულზე გადაცემული მონაცემები ორობითია და პროტოკოლი ხორციელდება კლიენტის/სერვერის მოდელში.

სერვერის გვერდი აიტვირთება არდუინოს მიკროკონტროლერში არდუინოს ესკიზის სახით. StandardFirmata ესკიზი, Arduino IDE– სთან ერთად, აკონტროლებს Arduino I/O ქინძისთავებს, კლიენტის ბრძანებით. ის ასევე აცნობებს კლიენტის შეყვანის პინ ცვლილებებს და სხვა ანგარიშის ინფორმაციას. FirmataExpress არის StandardFirmata- ს გაფართოებული ვერსია. ის მუშაობს სერიული ბმულის სიჩქარით 115200 bps.

ამ სტატიისთვის გამოყენებული Arduino კლიენტი არის pymata4. ეს არის პითონის პროგრამა, რომელიც შესრულებულია კომპიუტერზე. ის აგზავნის ბრძანებებს და იღებს ანგარიშებს არდუინოს სერვერიდან. იმის გამო, რომ pymata4 ხორციელდება პითონში, ის მუშაობს Windows, Linux (მათ შორის Raspberry Pi) და macOS კომპიუტერებზე.

რატომ გამოვიყენოთ ფირმატა?

Arduino მიკროკონტროლერები მშვენიერი პატარა მოწყობილობებია, მაგრამ პროცესორისა და მეხსიერების რესურსი გარკვეულწილად შეზღუდულია. იმ პროგრამებისთვის, რომლებიც ინტენსიურად მუშაობენ პროცესორზე ან მეხსიერებაზე, ხშირად მცირე არჩევანია, ვიდრე რესურსის მოთხოვნის გადმოტვირთვა კომპიუტერზე, რომ პროგრამა წარმატებული იყოს.

მაგრამ ეს არ არის StandardFirmata– ს გამოყენების ერთადერთი მიზეზი. უფრო მსუბუქი წონის Arduino პროგრამების შემუშავებისას, კომპიუტერს შეუძლია უზრუნველყოს ინსტრუმენტები და გამართვის შესაძლებლობები, რომლებიც უშუალოდ არ არის ხელმისაწვდომი Arduino მიკროკონტროლერზე. "ფიქსირებული" კლიენტისა და სერვერის გამოყენება ხელს უწყობს პროგრამის სირთულის შეზღუდვას კომპიუტერზე, რომლის მართვაც უფრო ადვილია. მას შემდეგ რაც აპლიკაცია სრულყოფილდება, ის შეიძლება ითარგმნოს ჩვეულებრივ, დამოუკიდებელ არდუინოს ესკიზში.

რატომ გამოვიყენო pymata4?

მისი ავტორი, რა თქმა უნდა, მიკერძოებული ვარ. როგორც ითქვა, ეს არის ერთადერთი პითონზე დაფუძნებული ფირმატა კლიენტი, რომელიც მუდმივად შენარჩუნებულია ბოლო რამდენიმე წლის განმავლობაში. ის უზრუნველყოფს ინტუიციურ და მარტივად გამოსაყენებელ API- ს. StandardFirmata– ს დაფუძნებული ესკიზების გარდა, იგი მხარს უჭერს Firmata– ს WiFi– ზე ისეთი მოწყობილობებისთვის, როგორიცაა ESP-8266, როდესაც იყენებთ StandardFirmataWifI ესკიზს.

ასევე, pymata4 შეიქმნა მომხმარებლის მიერ ადვილად გაფართოების მიზნით დამატებითი სენსორების და აქტივატორების მხარდასაჭერად, რომლებიც ამჟამად არ არის მხარდაჭერილი StandardFirmata– ს მიერ.

ნაბიჯი 1: Firmata Protocol– ის გაგება

ფირმას პროტოკოლის გაგება
ფირმას პროტოკოლის გაგება

Arduino Firmata კომუნიკაციის პროტოკოლი გამომდინარეობს MIDI პროტოკოლიდან, რომელიც იყენებს ერთ ან მეტ 7 ბიტიან ბაიტს მონაცემთა წარმოსადგენად.

Firmata შეიქმნა მომხმარებლისთვის გაფართოების მიზნით. მექანიზმი, რომელიც უზრუნველყოფს ამ გაფართოებას, არის System Exclusive (SysEx) შეტყობინებების პროტოკოლი.

SysEx შეტყობინების ფორმატი, როგორც განსაზღვრულია ფირმის პროტოკოლით, ნაჩვენებია ზემოთ მოცემულ ილუსტრაციაში. ის იწყება START_SYSEX ბაიტით, თექვსმეტობითი 0xF0 ფიქსირებული მნიშვნელობით და მას მოჰყვება უნიკალური SysEx ბრძანების ბაიტი. ბრძანების ბაიტის მნიშვნელობა უნდა იყოს თექვსმეტობით 0x00-0x7F დიაპაზონში. შემდეგ ბრძანების ბაიტს მოყვება 7 ბიტიანი ბაიტის დაუზუსტებელი რაოდენობა. დაბოლოს, შეტყობინება სრულდება END_SYSEX ბაიტით, თექვსმეტობითი 0xF7 ფიქსირებული მნიშვნელობით.

ფირმის მონაცემების კოდირება/გაშიფვრა

ვინაიდან SysEx შეტყობინების მომხმარებლის მონაცემების ნაწილი შედგება 7 ბიტიანი ბაიტების სერიისგან, შეიძლება გაგიკვირდეთ, თუ როგორ წარმოადგენს ერთი 128-ზე მეტ მნიშვნელობას (0x7f)? Firmata ამ ღირებულებებს აკოდირებს მათ დაშლაში 7 ბიტიანი ბაიტის მრავალ ნაწილად, სანამ მონაცემები გადანაწილდება მონაცემთა ბმულზე. პირველი იგზავნება მონაცემთა ერთეულის ყველაზე ნაკლებად მნიშვნელოვანი ბაიტი (LSB), რასაც მოჰყვება მონაცემთა ერთეულის სულ უფრო მნიშვნელოვანი კომპონენტები. მონაცემთა ერთეულის ყველაზე მნიშვნელოვანი ბაიტი (MSB) არის ბოლო გაგზავნილი მონაცემთა ერთეული.

Როგორ მუშაობს?

ვთქვათ, ჩვენ გვსურს, რომ შევიტანოთ მნიშვნელობა 525 SysEx შეტყობინების მონაცემთა ნაწილში. ვინაიდან 525-ის მნიშვნელობა აშკარად აღემატება 128-ის მნიშვნელობას, ჩვენ უნდა გავყოთ ან დავშალოთ იგი 7-ბიტიანი „ნაწილებად“.

აი, როგორ კეთდება ეს.

ათწილადში 525-ის მნიშვნელობა ექვივალენტურია თექვსმეტობითი მნიშვნელობის 0x20D, 2-ბაიტიანი მნიშვნელობისა. LSB– ის მისაღებად, ჩვენ ვიღებთ მნიშვნელობას AND’ing– ით 0x7F– ით. ორივე "C" და პითონის განხორციელება ნაჩვენებია ქვემოთ:

// "C" დანერგვა LSB- ის გამოყოფის მიზნით

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 ადგილას.

// "C" დანერგვა MSB– ს 2 ბაიტი ღირებულების გამოსაყოფად

int max_distance_MSB = max_distance >> 7; // გადაიტანეთ მაღალი რიგის ბაიტი # პითონის დანერგვა 2 ბაიტიანი მნიშვნელობის MSB იზოლირებაზე max_distance_MSB = max_distance >> 7 # ცვლა ზედა ბაიტის მისაღებად გადატანის შემდეგ, max_distance_MSB შეიცავს 0x04 მნიშვნელობას.

როდესაც "დანაწევრებული" გადანაწილებული მონაცემები მიიღება, ის უნდა გაერთიანდეს ერთ მნიშვნელობად. აქ მოცემულია, თუ როგორ ხდება მონაცემების ხელახალი შეკრება როგორც "C", ასევე პითონში

// "C" განხორციელება 2 ბაიტის ხელახლა ასაწყობად, // 7 ბიტიანი ღირებულებები ერთ მნიშვნელობად int max_distance = argv [0] + (argv [1] << 7); # პითონის განხორციელება 2 ბაიტიანი, # 7 ბიტიანი ღირებულებების ერთ მნიშვნელობად გადასაყვანად max_distance = მონაცემები [0] + (მონაცემები [1] << 7)

შეკრების შემდეგ, ღირებულება კიდევ ერთხელ უტოლდება 525 ათობითი ან 0x20D თექვსმეტობითს.

ეს დემონტაჟის/ხელახალი შეკრების პროცესი შეიძლება შესრულდეს კლიენტის ან სერვერის მიერ.

ნაბიჯი 2: დავიწყოთ

ახალი მოწყობილობის მხარდაჭერა მოითხოვს ცვლილებებს როგორც Arduino რეზიდენტ სერვერზე, ასევე PC რეზიდენტ პითონის კლიენტში. დოქტორ ვილერის ნაშრომი გამოყენებული იქნება საჭირო ცვლილებების საილუსტრაციოდ.

ალბათ ყველაზე მნიშვნელოვანი ნაბიჯი არის იმის გადაწყვეტა, გსურთ ინტეგრირება მოახდინოთ არსებული დამხმარე მოწყობილობის ბიბლიოთეკაში განტოლების არდუინოს მხარეში თუ დაწეროთ საკუთარი. მიზანშეწონილია, რომ თუ იპოვით უკვე არსებულ ბიბლიოთეკას, მისი გამოყენება ბევრად უფრო ადვილია, ვიდრე საკუთარი ნულიდან დაწერა.

DHT მოწყობილობის მხარდაჭერისთვის, დოქტორ უილერმა თავისი გაფართოების კოდი დაარსა DHTNew ბიბლიოთეკაში. ძალიან ჭკვიანურად, დოქტორმა უილერმა გაყო DHTNew ბიბლიოთეკის ფუნქციონირება არდუინოს და განტოლების pymata4 მხარეს, რათა უზრუნველყოს მინიმალური ბლოკირება არდუინოს მხარეს.

თუ ჩვენ შევხედავთ DHTNew- ს, ის ასრულებს შემდეგს:

  • აყენებს არჩეულ პინის ციფრული გამომავალი რეჟიმს.
  • აფიქსირებს დაშიფრულ სიგნალს ტენიანობისა და ტემპერატურის უახლესი მნიშვნელობების მოსაპოვებლად.
  • ამოწმებს და აფიქსირებს შეცდომებს.
  • გამოითვლება ადამიანის მიერ წაკითხული ტემპერატურისა და ტენიანობის მნიშვნელობები ამოღებული ნედლეული მონაცემებიდან.

იმისათვის, რომ საქმეები მაქსიმალურად ეფექტური იყოს FirmataExpress– ის მხარეს, დოქტორ ვილერმა გადმოტვირთა მონაცემთა კონვერტაციის რუტინა Arduino– დან pymata4– ზე.

ნაბიჯი 3: შეცვალეთ FirmataExpress DHT მხარდაჭერისთვის

FirmataExpress დირექტორია ხე

ქვემოთ მოცემულია ყველა ფაილი, რომელიც შეიცავს FirmataExpress საცავს. ეს ხე იდენტურია StandardFiramata– ს, უბრალოდ ზოგიერთი ფაილის სახელი ასახავს საცავის სახელს.

ფაილები, რომლებსაც მოდიფიკაცია ესაჭიროება, არის ვარსკვლავები (*) მათ გვერდით.

ფირმატა ექსპრესი

├── * დაფები.ს

├── მაგალითები

Irm irm ფირმატა ექსპრესი

დაფა

├── * FirmataExpress.ino

IC ├── ლიცენზია. Txt

მაკიაჟი

├── * FirmataConstants.h

├── * ფირმა განსაზღვრავს.ჰ

Irm FirmataExpress.cpp

├── FirmataExpress.h

Irm FirmataMarshaller.cpp

Irm FirmataMarshaller.h

Irm FirmataParser.cpp

Irm FirmataParser.h

მოდით შევხედოთ თითოეულ ფაილს და ცვლილებებს, რომლებიც განხორციელდა.

დაფები.ჰ

ეს ფაილი შეიცავს პინ-ტიპის მაკრო განსაზღვრებებს დაფის მხარდაჭერილი თითოეული ტიპისთვის. ის განსაზღვრავს იმ მოწყობილობების მაქსიმალურ რაოდენობას, როდესაც საჭიროა ერთზე მეტი მოწყობილობის მხარდაჭერა.

DHT მოწყობილობისთვის, 6 -მდე მოწყობილობა შეიძლება იყოს დაკავშირებული ერთდროულად და ეს მნიშვნელობა განისაზღვრება შემდეგნაირად:

#ifndef MAX_DHTS

#განსაზღვრეთ MAX_DHTS 6 #endif

ასევე, pin ტიპის მაკროები შეიძლება სურვილისამებრ განისაზღვროს ახალი მოწყობილობისთვის, დაფის ყველა ტიპისთვის ან უბრალოდ თქვენთვის საინტერესო. ეს მაკროები ძირითადად გამოიყენება მოხსენების მიზნით და არ გამოიყენება მოწყობილობების გასაკონტროლებლად. ეს მაკროები განსაზღვრავს ორივე პინს, რომელიც მხარს უჭერს მოწყობილობას:

#განსაზღვრეთ IS_PIN_DHT (p) (IS_PIN_DIGITAL (p) && (p) - 2 <MAX_DHTS)

ასევე მაკრო პინ-ნომრის კონვერტაციის დასადგენად.

#განსაზღვრეთ PIN_TO_DHT (p) PIN_TO_DIGITAL (p)

FirmataConstants.h

ეს ფაილი შეიცავს firmware ვერსიის ნომერს, რომლის შეცვლაც გსურთ, რათა თვალყური ადევნოთ რომელი ვერსიის ჩატვირთვა გაქვთ თქვენს Arduino– ზე. იგი ასევე შეიცავს Firmata შეტყობინების მნიშვნელობებს, მათ შორის Firmata SysEx შეტყობინებებს.

ამ ფაილში თქვენ უნდა მიანიჭოთ ახალი შეტყობინება ან შეტყობინებების ნაკრები თქვენი მოწყობილობისთვის. DHT– სთვის ორი შეტყობინება დაემატა. ერთი კონფიგურაციას ახდენს პინზე, როგორც "DHT" პინზე, ხოლო მეორე, როგორც რეპორტიორის შეტყობინებაზე, კლიენტისთვის უახლესი DHT მონაცემების უკან გაგზავნისას.

სტატიკური კონსტანტი DHT_CONFIG = 0x64;

სტატიკური კონსტანტი DHT_DATA = 0x65;

პინის რეჟიმები ასევე მითითებულია ამ ფაილში. DHT– სთვის შეიქმნა ახალი pin რეჟიმი:

სტატიკური კონსტიტი PIN_MODE_DHT = 0x0F; // DHIN კონფიგურაცია

ახალი პინის რეჟიმის დამატებისას TOTAL_PIN_MODES უნდა იყოს მორგებული:

სტატიკური კონსტანტი TOTAL_PIN_MODES = 17;

ფირმა განსაზღვრავს.ჰ

ეს ფაილი უნდა განახლდეს, რათა ასახოს FirmataConstants.h- ში დამატებული ახალი შეტყობინებები:

#ifdef DHT_CONFIG #undef DHT_CONFIG #endif #განსაზღვრეთ DHT_CONFIG ფირმა:: DHT_CONFIG // DHT მოთხოვნა #ifdef DHT_DATA #undef DHT_DATA #endif #განსაზღვრეთ DHT_DATA ფირმა:: PIN_MODE_DHT

FirmataExpress.ino

ამ დისკუსიაში ჩვენ გავაშუქებთ არდუინოს ესკიზში განხორციელებული ცვლილებების "მაღალ წერტილებს".

იმისათვის, რომ FirmataExpress– მა ერთდროულად შეძლოს ექვსამდე DHT მოწყობილობის მხარდაჭერა, შეიქმნა 3 მასივი, რათა თვალყური ადევნოს მოწყობილობის თითოეულ დაკავშირებულ პინ ნომერს, მის WakeUpDelay მნიშვნელობას და მოწყობილობის ტიპს, ანუ DHT22 ან DHT11:

// DHT სენსორები

int numActiveDHTs = 0; // DHT- ების რაოდენობა დართული 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 შემდეგიDHT = 0; // ინდექსირება dht - ში შემდეგი მოწყობილობის წასაკითხად

uint8_t მიმდინარეDHT = 0; // თვალყურს ადევნებს რომელი სენსორია აქტიური. int dhtNumLoops = 0; // რამდენჯერმე მიზნობრივი მარყუჟის მეშვეობით b4 წვდომა DHT int dhtLoopCounter = 0; // მარყუჟის მრიცხველი

DHT მოწყობილობის კონფიგურაცია და კითხვა

როდესაც FirmataExpress იღებს SysEx ბრძანებას DHT ოპერაციისთვის pin- ის კონფიგურაციისთვის, ის ამოწმებს, რომ DHT მოწყობილობების მაქსიმალური რაოდენობა არ არის გადაჭარბებული. თუ ახალი DHT შეიძლება იყოს მხარდაჭერილი, DHT მასივები განახლდება. თუ DHT ტიპი უცნობია, SysEx სიმებიანი შეტყობინება იქმნება და გადადის უკან pymata4

საქმე DHT_CONFIG: int DHT_Pin = argv [0]; int DHT_type = argv [1]; if (numActiveDHTs <MAX_DHTS) {if (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1; } else if (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18; } else {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. _Bits ცვლადს აქვს DHT მოწყობილობის მიერ დაბრუნებული მონაცემები სურვილისამებრ pymata4– ის მიერ დამატებითი დამუშავებისთვის.

Firmata.write (START_SYSEX);

Firmata.write (DHT_DATA); Firmata.write (DHT_Pin); Firmata.write (DHT_type); for (uint8_t i = 0; i> 7 & 0x7f); } Firmata.write (abs (rv)); ფირმატა. დაწერე (1); ფირმა. დაწერე (END_SYSEX);

თუ სწორი მონაცემები დაბრუნდება, აქტიური DHT– ების რაოდენობა იზრდება. ასევე მორგებულია ცვლადი, რომელიც თვალყურს ადევნებს რამდენი მარყუჟის გამეორებას მონაცემების მომდევნო DHT შემოწმებამდე. ეს ცვლადი გვარწმუნებს, რომ რაც არ უნდა ბევრი DHT დაემატოს სისტემას, ისინი ყველა წაიკითხება 2 წამის განმავლობაში.

int rv = readDhtSensor (numActiveDHTs);

if (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // ყველაფერი კარგადაა}

თუ ერთი ან მეტი DHT მოწყობილობაა კონფიგურირებული ესკიზის მარყუჟის ფუნქციაში, მაშინ იკითხება შემდეგი DHT მოწყობილობა. ან სწორი მონაცემები ან მისი შეცდომის სტატუსი უბრუნდება pymata4– ს SysEx შეტყობინების სახით:

if (dhtLoopCounter ++> dhtNumLoops) {if (numActiveDHTs) {int rv = readDhtSensor (nextDHT); uint8_t current_pin = DHT_PinNumbers [nextDHT]; uint8_t მიმდინარე_ტიპი = DHT_TYPE [შემდეგიDHT]; dhtLoopCounter = 0; მიმდინარეDHT = შემდეგიDHT; if (შემდეგიDHT ++> = numActiveDHTs - 1) {შემდეგიDHT = 0; } if (rv == DHTLIB_OK) {// TEST CHECKSUM uint8_t sum = _bits [0] + _bits [1] + _bits [2] + _bits [3]; if (_bits [4]! = თანხა) {rv = -1; }} // გაგზავნეთ შეტყობინება შეცდომის სტატუსით Firmata.write (START_SYSEX); Firmata.write (DHT_DATA); Firmata.write (current_pin); ფირმა. დაწერე (მიმდინარე_ტიპი); for (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 მოწყობილობასთან კომუნიკაციისთვის გამოყენებული კოდი პირდაპირ გამომდინარეობს DHTNew ბიბლიოთეკიდან:

int readDhtSensor (int ინდექსი) {

// INF BUFFERVAR მონაცემების მისაღებად uint8_t ნიღაბი = 128; uint8_t idx = 0; // ცარიელი ბუფერი // მემსეტი (_ ბიტი, 0, ზომა (_ ბიტი)); for (uint8_t i = 0; i 5 BYTES for (uint8_t i = 40; i! = 0; i--) {loopCnt = DHTLIB_TIMEOUT; while (digitalRead (pin) == LOW) {if (--loopCnt == 0) DHTLIB_ERROR_TIMEOUT;} uint32_t t = micros (); loopCnt = DHTLIB_TIMEOUT; ხოლო (digitalRead (pin) == HIGH) {if (--loopCnt == 0) დაბრუნება DHTLIB_ERROR_TIMEOUT;} თუ ((micros ()-t) 40) {_bits [idx] | = ნიღაბი;} ნიღაბი >> = 1; თუ (ნიღაბი == 0) // შემდეგი ბაიტი? {Mask = 128; idx ++;}} დაბრუნება DHTLIB_OK;}

ნაბიჯი 4: შეცვალეთ Pymata4 DHT მხარდაჭერისთვის

private_constants.h

DHT– ის მხარდასაჭერად, ჩვენ უნდა დავამატოთ როგორც ახალი ტიპის, ასევე SysEx შეტყობინებები ამ ფაილს:

# pin რეჟიმები INPUT = 0x00 # pin მითითებულია, როგორც შეყვანა 0x06 # pin შედის I2C კონფიგურაციაში STEPPER = 0x08 # ნებისმიერი პინი სტეპერ რეჟიმში SERIAL = 0x0a PULLUP = 0x0b # ნებისმიერი პინი ამოყვანის რეჟიმში SONAR = 0x0c # ნებისმიერი პინი SONAR რეჟიმში TONE = 0x0d # ნებისმიერი პინი ტონის რეჟიმში PIXY = 0x0e # დაცულია pixy კამერის რეჟიმში DHT = 0x0f # DHT სენსორი IGNORE = 0x7f # DHT SysEx ბრძანების შეტყობინებები DHT_CONFIG = 0x64 # dht კონფიგურაციის ბრძანება DHT_DATA = 0x65 # dht სენსორის პასუხი

დამატებული პინის ტიპი და SysEx ბრძანებები უნდა ემთხვეოდეს FirmataConstants.h- ის მნიშვნელობებს, რომლებიც დაემატა FirmataExpress- ს.

pymata4.py

Pymata4 იყენებს პითონის ლექსიკონს, რათა სწრაფად დააკავშიროს შემომავალი Firmata შეტყობინება შეტყობინებების დამმუშავებელთან. ამ ლექსიკონის სახელია report_dispatch.

ლექსიკონის ჩანაწერის ფორმატი არის:

{MessageID: [message_handler, მონაცემთა ბაიტების რაოდენობა დამუშავებისათვის]}

ლექსიკონს დაემატა ჩანაწერი, რათა გაუმკლავდეს შემომავალ DHT შეტყობინებებს:

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

მონაცემთა 7 ბაიტი შეტყობინებაში არის Arduino ციფრული პინ ნომერი, DHT მოწყობილობის ტიპი (22 ან 11) და 5 ბაიტი ნედლეული მონაცემები.

_Dht_read_response მეთოდი ამოწმებს გამოვლენილ შეცდომებს. თუ არ არის დაფიქსირებული შეცდომები, ტენიანობა და ტემპერატურა გამოითვლება Arduino DHTNew ბიბლიოთეკიდან გადმოტანილი ალგორითმის გამოყენებით.

გამოთვლილი ღირებულებები მოხსენებულია მომხმარებლის მიერ მოწოდებული უკუკავშირის მეთოდის საშუალებით. ისინი ასევე ინახება შიდა pin_data მონაცემთა სტრუქტურაში. ბოლო მოხსენებული მნიშვნელობა შეიძლება გავიხსენოთ pin_data გამოკითხვის გზით dht_read მეთოდით.

ახალი DHT მოწყობილობის კონფიგურაცია

ახალი DHT მოწყობილობის დამატებისას მითითებულია set_pin_mode_dht მეთოდი. ეს მეთოდი განაახლებს pin_data ციფრული ქინძისთავებისთვის. ის ასევე ქმნის და აგზავნის DHT_CONFIG SysEx შეტყობინებას FirmataExpress– ზე.

ნაბიჯი 5: შეფუთვა

როგორც ვნახეთ, ახალი მოწყობილობის ფირმას მხარდაჭერის დამატება მოითხოვს თქვენ შეცვალოთ Arduino FirmataExpress სერვერის კოდი და პითონზე დაფუძნებული pymata4 კლიენტის კოდი. FirmataExpress კოდი შეიძლება იყოს რთული გამოსწორება. მეთოდი, სახელწოდებით printData, დაემატა FirmataExpress– ს გამართვის გასაუმჯობესებლად. ეს მეთოდი საშუალებას გაძლევთ გაგზავნოთ მონაცემთა მნიშვნელობები FirmataExpress– დან და დაბეჭდოთ ისინი pymata4 კონსოლზე.

ეს ფუნქცია მოითხოვს როგორც მაჩვენებელს სიმბოლოთა სტრიქონზე, ასევე მნიშვნელობას, რომლის ნახვა გსურთ. თუ მონაცემთა მნიშვნელობა შეიცავს ცვლადს, რომელსაც ეწოდება argc, შეგიძლიათ დარეკოთ printData შემდეგი პარამეტრებით.

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

თუ თქვენ გაქვთ რაიმე შეკითხვები, დატოვეთ კომენტარი და მე სიამოვნებით გიპასუხებთ.

ბედნიერი კოდირება!

გირჩევთ: