সুচিপত্র:

স্ট্যান্ডার্ডফার্মাটা ছাড়িয়ে যাওয়া - পুনর্বিবেচনা: 5 টি ধাপ
স্ট্যান্ডার্ডফার্মাটা ছাড়িয়ে যাওয়া - পুনর্বিবেচনা: 5 টি ধাপ

ভিডিও: স্ট্যান্ডার্ডফার্মাটা ছাড়িয়ে যাওয়া - পুনর্বিবেচনা: 5 টি ধাপ

ভিডিও: স্ট্যান্ডার্ডফার্মাটা ছাড়িয়ে যাওয়া - পুনর্বিবেচনা: 5 টি ধাপ
ভিডিও: "ইমপ্যাক্ট ফ্যাক্টর তামিম ইকবাল!" শেষ পর্ব || Tamim Iqbal || The Sports Bee || TSB || তামিম ইকবাল 2024, জুলাই
Anonim
Going Beyond StandardFirmata - পুনর্বিবেচনা
Going Beyond StandardFirmata - পুনর্বিবেচনা

কিছুক্ষণ আগে, পাইমাটা 4 লাইব্রেরিতে ডিএইচটি 22 আর্দ্রতা/তাপমাত্রা সেন্সরের জন্য সমর্থন যোগ করার নির্দেশনার জন্য আমি পাইমাতা 4 ব্যবহারকারী ড Dr. মার্টিন হুইলারের সাথে যোগাযোগ করেছি। Pymata4 লাইব্রেরি, তার Arduino সমকক্ষ, FirmataExpress এর সাথে, ব্যবহারকারীদের তাদের Arduino ডিভাইসগুলি দূর থেকে নিয়ন্ত্রণ এবং পর্যবেক্ষণ করতে দেয়। ইমেইল এক্সচেঞ্জের কয়েক রাউন্ডের মধ্যে, ড Whe হুইলার pymata4 এবং FirmataExpress উভয়ই পরিবর্তন করতে সফল হন। ফলস্বরূপ, DHT22 এবং DHT11 সেন্সরের জন্য সমর্থন এখন pymata4 এবং FirmataExpress এর একটি আদর্শ অংশ।

২০১ 2014 সালের মে মাসে, আমি অতিরিক্ত ডিভাইসের জন্য ফার্মাতাকে সমর্থন যোগ করার বিষয়ে একটি নিবন্ধ লিখেছিলাম। আমি যে নিবন্ধটি প্রতিফলিত করেছি, আমি বুঝতে পেরেছি যে আমি সেই নিবন্ধের জন্য কাগজে কলম নেওয়ার পর থেকে কতটা পরিবর্তন হয়েছে। এই প্রবন্ধ ছাড়াও, ড Dr. হুইলার তার প্রচেষ্টাকে নথিভুক্ত করেছেন এবং আপনি এটিও পরীক্ষা করে দেখতে পারেন।

FirmataExpress StandardFirmata এর উপর ভিত্তি করে, এবং StandardFirmata ডিরেক্টরি কাঠামো বিকশিত হয়েছে। উপরন্তু, pymata4 API 2014 এর মূল PyMata API থেকেও কিছুটা ভিন্ন। ড Dr. হুইলারের কাজকে একটি ভিত্তি হিসেবে ব্যবহার করে, আসুন কিভাবে pymata4/FirmataExpress কার্যকারিতা বাড়ানো যায় তা জেনে নিই।

আমরা শুরু করার আগে - Arduino/Firmata সম্পর্কে কিছু পটভূমি তথ্য

তাহলে ফার্মটা কি? ফিরমাতা ওয়েব পেজ থেকে উদ্ধৃত করে, "ফিরমাতা একটি হোস্ট কম্পিউটারে সফ্টওয়্যার থেকে মাইক্রোকন্ট্রোলারদের সাথে যোগাযোগের জন্য একটি সাধারণ প্রোটোকল।"

Arduino Firmata একটি সিরিয়াল ইন্টারফেস ব্যবহার করে একটি Arduino মাইক্রোকন্ট্রোলার এবং একটি পিসির মধ্যে কমান্ড এবং রিপোর্ট উভয় তথ্য পরিবহনের জন্য, সাধারণত একটি সিরিয়াল/USB লিঙ্ক ব্যবহার করে 57600 bps সেট করে। এই লিঙ্ক জুড়ে স্থানান্তরিত তথ্য বাইনারি, এবং প্রোটোকল একটি ক্লায়েন্ট/সার্ভার মডেলে প্রয়োগ করা হয়।

সার্ভারের দিকটি একটি Arduino মাইক্রোকন্ট্রোলারে একটি Arduino স্কেচ আকারে আপলোড করা হয়। Arduino IDE এর সাথে অন্তর্ভুক্ত স্ট্যান্ডার্ডফার্মাটা স্কেচ, ক্লায়েন্টের নির্দেশ অনুযায়ী Arduino I/O পিনগুলি নিয়ন্ত্রণ করে। এটি ইনপুট পিন পরিবর্তন এবং অন্যান্য রিপোর্ট তথ্য ক্লায়েন্টকে ফেরত দেয়। FirmataExpress হল StandardFirmata এর একটি বর্ধিত সংস্করণ। এটি 115200 bps এর একটি সিরিয়াল লিঙ্ক গতিতে চলে।

এই নিবন্ধের জন্য ব্যবহৃত Arduino ক্লায়েন্ট হল pymata4। এটি একটি পাইথন অ্যাপ্লিকেশন যা একটি পিসিতে কার্যকর করা হয়। এটি উভয়ই Arduino সার্ভার থেকে প্রতিবেদন পাঠায় এবং গ্রহণ করে। যেহেতু পাইমটা 4 পাইথনে প্রয়োগ করা হয়েছে, এটি উইন্ডোজ, লিনাক্স (রাস্পবেরি পাই সহ) এবং ম্যাকওএস কম্পিউটারে চলে।

ফার্মটা কেন ব্যবহার করবেন?

Arduino মাইক্রোকন্ট্রোলার বিস্ময়কর ছোট ডিভাইস, কিন্তু প্রসেসর এবং মেমরি সম্পদ কিছুটা সীমিত। প্রসেসর বা মেমরি নিবিড় অ্যাপ্লিকেশনগুলির জন্য, অ্যাপ্লিকেশন সফল হওয়ার জন্য পিসিতে রিসোর্স ডিমান্ড অফলোড করার জন্য প্রায়শই সামান্য বিকল্প থাকে।

তবে এটি স্ট্যান্ডার্ডফার্মাটা ব্যবহারের একমাত্র কারণ নয়। হালকা ওজনের আরডুইনো অ্যাপ্লিকেশনগুলি বিকাশের সময়, একটি পিসি সরঞ্জাম এবং ডিবাগিং ক্ষমতা সরবরাহ করতে পারে যা সরাসরি আরডুইনো মাইক্রোকন্ট্রোলারে উপলব্ধ নয়। একটি "নির্দিষ্ট" ক্লায়েন্ট এবং সার্ভার ব্যবহার করে অ্যাপ্লিকেশন জটিলতাকে একটি পিসিতে সীমাবদ্ধ রাখতে সাহায্য করে, যা আরও সহজেই পরিচালিত হয়। একবার অ্যাপ্লিকেশনটি নিখুঁত হয়ে গেলে, এটি একটি কাস্টম, স্বতন্ত্র Arduino স্কেচে অনুবাদ করা যেতে পারে।

কেন pymata4 ব্যবহার করবেন?

এর লেখক হওয়ায় অবশ্যই আমি পক্ষপাতদুষ্ট। বলা হচ্ছে, এটি একমাত্র পাইথন ভিত্তিক ফার্মাটা ক্লায়েন্ট যা গত কয়েক বছর ধরে ধারাবাহিকভাবে রক্ষণাবেক্ষণ করা হচ্ছে। এটি একটি স্বজ্ঞাত এবং ব্যবহার করা সহজ API প্রদান করে। StandardFirmataWifI স্কেচ ব্যবহার করার সময় ESP-8266 এর মত ডিভাইসের জন্য এটি ওয়াইফাই এর উপর ফিরমাতা সমর্থন করে।

এছাড়াও, pymata4 একটি ব্যবহারকারী দ্বারা সহজেই বাড়ানোর জন্য ডিজাইন করা হয়েছে যাতে অতিরিক্ত সেন্সর এবং অ্যাকচুয়েটরগুলি বর্তমানে স্ট্যান্ডার্ডফার্মাটা দ্বারা সমর্থিত নয়।

ধাপ 1: ফার্মাটা প্রটোকল বোঝা

ফিরমাতা প্রটোকল বোঝা
ফিরমাতা প্রটোকল বোঝা

Arduino Firmata কমিউনিকেশন প্রোটোকল MIDI প্রোটোকল থেকে উদ্ভূত, যা ডেটা উপস্থাপনের জন্য এক বা একাধিক 7-বিট বাইট ব্যবহার করে।

ফার্মটা ব্যবহারকারী-এক্সটেনসিবল হওয়ার জন্য ডিজাইন করা হয়েছিল। এই এক্সটেনসিবিলিটি প্রদানকারী প্রক্রিয়া হল সিস্টেম এক্সক্লুসিভ (SysEx) মেসেজিং প্রোটোকল।

Firmata প্রোটোকল দ্বারা সংজ্ঞায়িত একটি SysEx বার্তার বিন্যাস, উপরের দৃষ্টান্তে দেখানো হয়েছে। এটি হেক্সাডেসিমাল 0xF0 এর একটি নির্দিষ্ট মান সহ একটি START_SYSEX বাইট দিয়ে শুরু হয় এবং এর পরে একটি অনন্য SysEx কমান্ড বাইট হয়। কমান্ড বাইটের মান অবশ্যই হেক্সাডেসিমাল 0x00-0x7F এর মধ্যে থাকতে হবে। কমান্ড বাইট তারপর 7-বিট ডেটা বাইট একটি অনির্দিষ্ট সংখ্যা দ্বারা অনুসরণ করা হয়। অবশেষে, হেক্সাডেসিমাল 0xF7 এর একটি নির্দিষ্ট মান সহ, একটি END_SYSEX বাইট দিয়ে বার্তাটি বন্ধ করা হয়েছে।

ফার্মাটা ডেটা এনকোডিং/ডিকোডিং

যেহেতু একটি SysEx বার্তার ব্যবহারকারীর ডেটা অংশ 7-বিট বাইটের একটি সিরিজ নিয়ে গঠিত, তাই আপনি ভাবতে পারেন কিভাবে একজন 128 (0x7f) এর চেয়ে বড় একটি মান উপস্থাপন করে? ডেটা লিংক জুড়ে ডেটা মার্শাল করার আগে ফার্মটা সেই মানগুলিকে একাধিক 7-বিট বাইট অংশে বিভক্ত করে এনকোড করে। একটি ডেটা আইটেমের সর্বনিম্ন উল্লেখযোগ্য বাইট (এলএসবি) প্রথমে পাঠানো হয়, এরপর কনভেনশন দ্বারা ডেটা আইটেমের ক্রমবর্ধমান উল্লেখযোগ্য উপাদানগুলি পাঠানো হয়। ডেটা আইটেমের সবচেয়ে উল্লেখযোগ্য বাইট (এমএসবি) হল শেষ ডেটা আইটেম পাঠানো।

কিভাবে কাজ করে?

ধরা যাক আমরা একটি SysEx বার্তার ডেটা অংশে একটি মান 525 অন্তর্ভুক্ত করতে চাই। যেহেতু 525 এর মান 128 এর একটি মানের চেয়ে স্পষ্টভাবে বেশি, তাই আমাদের এটিকে 7-বিট বাইট "অংশে" বিভক্ত বা বিচ্ছিন্ন করতে হবে।

এটি কীভাবে করা হয় তা এখানে।

দশমিক 525 এর মান 0x20D এর হেক্সাডেসিমাল মানের সমান, একটি 2-বাইট মানের। LSB পেতে, আমরা 0x7F দিয়ে AND'ing করে মানটি মুখোশ করি। উভয় "সি" এবং পাইথন বাস্তবায়ন নীচে দেখানো হয়েছে:

// "C" বাস্তবায়ন LSB বিচ্ছিন্ন করার জন্য

int max_distance_LSB = max_distance & 0x7f; // LSB max_distance_LSB = max_distance এবং 0x7F # বিচ্ছিন্ন করতে নিম্ন বাইট # পাইথন বাস্তবায়ন মুখোশ করুন নিম্ন বাইট মাস্ক করুন

মাস্ক করার পর, max_distance_LSB- এ 0x0d থাকবে। 0x20D এবং 0x7F = 0x0D।

পরবর্তী, আমাদের এই 2-বাইট মানের জন্য MSB কে আলাদা করতে হবে। এটি করার জন্য, আমরা 0x20D এর মান ডানদিকে 7 টি স্থানে স্থানান্তর করব।

// "C" বাস্তবায়ন 2 বাইট মানের MSB বিচ্ছিন্ন করার জন্য

int max_distance_MSB = max_distance >> 7; // হাই অর্ডার বাইট শিফট করুন # পাইথন বাস্তবায়ন 2 বাইট মান max_distance_MSB = max_distance >> 7 # শিফট MSB থেকে আলাদা করে উপরের বাইট স্থানান্তর করার পর, max_distance_MSB এর মান 0x04 থাকবে।

যখন "খণ্ডিত" মার্শাল ডেটা প্রাপ্ত হয়, এটি একটি একক মান পুনরায় একত্রিত করা প্রয়োজন। "সি" এবং পাইথন উভয় ক্ষেত্রেই ডেটা পুনরায় একত্রিত করা হয়

// "C" বাস্তবায়ন 2 বাইট reassemble, // 7 বিট মান একটি একক মান int max_distance = argv [0] + (argv [1] << 7); # পাইথন বাস্তবায়ন 2 বাইট, # 7 বিট মানগুলিকে একটি একক মান max_distance = data [0] + (data [1] << 7)

পুনরায় সাজানোর পরে, মান আবার 525 দশমিক বা 0x20D হেক্সাডেসিমালের সমান।

এই disassembly/reassembly প্রক্রিয়া ক্লায়েন্ট বা সার্ভার উভয় দ্বারা সঞ্চালিত হতে পারে।

পদক্ষেপ 2: আসুন শুরু করা যাক

একটি নতুন ডিভাইস সমর্থন করার জন্য Arduino আবাসিক সার্ভার এবং পিসি আবাসিক পাইথন ক্লায়েন্ট উভয়ের পরিবর্তন প্রয়োজন। ড Whe হুইলারের কাজটি প্রয়োজনীয় পরিবর্তনগুলি ব্যাখ্যা করতে ব্যবহৃত হবে।

সম্ভবত সবচেয়ে গুরুত্বপূর্ণ ধাপ হল সিদ্ধান্ত নেওয়া যে আপনি একটি বিদ্যমান সাপোর্টিং ডিভাইস লাইব্রেরিকে সমীকরণের আরডুইনো পাশে সংহত করতে চান বা আপনার নিজের লিখতে চান। এটা সুপারিশ করা হয় যে যদি আপনি একটি বিদ্যমান লাইব্রেরি খুঁজে পেতে পারেন, তাহলে এটি ব্যবহার করা অনেক সহজ আপনার স্ক্র্যাচ থেকে নিজের লেখার চেয়ে।

ডিএইচটি ডিভাইস সাপোর্টের জন্য, ড Whe হুইলার তার এক্সটেনশন কোডটি ডিএইচটি নিউ লাইব্রেরিতে তৈরি করেছেন। খুব চতুরতার সাথে, ডা Dr. হুইলার আরডুইনো পার্শ্বে ন্যূনতম অবরোধ প্রদানের জন্য সমীকরণের Arduino এবং pymata4 পাশ জুড়ে DHTNew লাইব্রেরির কার্যকারিতা বিভক্ত করেছেন।

যদি আমরা DHTNew এর দিকে তাকাই, তাহলে এটি নিচের সবগুলি সম্পাদন করে:

  • নির্বাচিত পিন ডিজিটাল আউটপুট মোড সেট করে।
  • সর্বশেষ আর্দ্রতা এবং তাপমাত্রার মানগুলি পুনরুদ্ধার করতে একটি এনকোডেড সিগন্যাল বের করে।
  • কোন ত্রুটি পরীক্ষা করে এবং রিপোর্ট করে।
  • উদ্ধারকৃত কাঁচা তথ্য থেকে মানুষের পাঠযোগ্য তাপমাত্রা এবং আর্দ্রতার মান গণনা করে।

FirmataExpress সাইডে যতটা সম্ভব দক্ষ রাখার জন্য, ডা Whe হুইলার Arduino থেকে pymata4 এ ডেটা কনভার্সন রুটিন অফলোড করেছেন।

ধাপ 3: DHT সাপোর্টের জন্য FirmataExpress পরিবর্তন করা

The FirmataExpress ডিরেক্টরি গাছ

FirmataExpress সংগ্রহস্থলের অন্তর্ভুক্ত সমস্ত ফাইল নীচে রয়েছে। এই গাছটি স্ট্যান্ডার্ডফিরামাতার অনুরূপ, কিছু ফাইলের নাম রিপোজিটরির নাম প্রতিফলিত করে।

যে ফাইলগুলিকে পরিবর্তন করার প্রয়োজন হয় সেগুলিই তাদের পাশে একটি তারকা (*) থাকে।

ফার্মটা এক্সপ্রেস

├── * বোর্ড.এইচ

├── উদাহরণ

Ir └── FirmataExpress

বোর্ডক্স

F ├── * FirmataExpress.ino

IC IC LICENSE.txt

মেকফিল

├── * FirmataConstants.h

F * FirmataDefines.h

├── FirmataExpress.cpp

Ir FirmataExpress.h

Ir FirmataMarshaller.cpp

Ir FirmataMarshaller.h

Ir FirmataParser.cpp

Ir FirmataParser.h

আসুন প্রতিটি ফাইল এবং যে পরিবর্তনগুলি করা হয়েছিল সেগুলি দেখি।

বোর্ড

এই ফাইলটিতে প্রতিটি সমর্থিত বোর্ড প্রকারের জন্য পিন-টাইপ ম্যাক্রো সংজ্ঞা রয়েছে। একাধিক ডিভাইসের সমর্থনের প্রয়োজন হলে এটি সমর্থিত সর্বাধিক সংখ্যক ডিভাইসের সংজ্ঞা দেয়।

ডিএইচটি ডিভাইসের জন্য, এক সময়ে 6 টি ডিভাইস সংযুক্ত হতে পারে এবং এই মানটি সংজ্ঞায়িত করা হয়েছে:

#ifndef MAX_DHTS

#MAX_DHTS 6 #endif সংজ্ঞায়িত করুন

এছাড়াও, পিন-টাইপ ম্যাক্রোগুলি নতুন ডিভাইসের জন্য definedচ্ছিকভাবে সংজ্ঞায়িত করা যেতে পারে, সমস্ত বোর্ডের ধরনগুলির জন্য বা কেবল আপনার আগ্রহের জন্য। এই ম্যাক্রোগুলি বেশিরভাগই রিপোর্টিংয়ের উদ্দেশ্যে ব্যবহৃত হয় এবং ডিভাইসগুলি নিয়ন্ত্রণের জন্য ব্যবহৃত হয় না। এই ম্যাক্রোগুলি উভয় পিন সংজ্ঞায়িত করে যা ডিভাইসটিকে সমর্থন করে:

#সংজ্ঞায়িত IS_PIN_DHT (p) (IS_PIN_DIGITAL (p) && (p) - 2 <MAX_DHTS)

একটি পিন-নম্বর রূপান্তর সংজ্ঞায়িত করার জন্য একটি ম্যাক্রো হিসাবে।

#PIN_TO_DHT (p) PIN_TO_DIGITAL (p) নির্ধারণ করুন

FirmataConstants.h

এই ফাইলটিতে ফার্মওয়্যার সংস্করণ নম্বর রয়েছে, যা আপনি আপনার Arduino তে কোন সংস্করণটি লোড করেছেন তা ট্র্যাক রাখতে আপনি সংশোধন করতে পারেন। এতে ফিরমাতা সিসেক্স বার্তা সহ ফিরমাতা বার্তার মানও রয়েছে।

এই ফাইলে আপনার ডিভাইসের জন্য আপনাকে একটি নতুন বার্তা বা বার্তার সেট বরাদ্দ করতে হবে। ডিএইচটির জন্য, দুটি বার্তা যুক্ত করা হয়েছিল। ক্লায়েন্টের কাছে সর্বশেষ DHT ডেটা ফেরত পাঠানোর সময় একটি পিনকে "DHT" পিন এবং অন্যটি রিপোর্টার বার্তা হিসাবে কনফিগার করে।

স্ট্যাটিক কনস্ট int DHT_CONFIG = 0x64;

স্ট্যাটিক কনস্ট int DHT_DATA = 0x65;

পিন মোডগুলিও এই ফাইলে নির্দিষ্ট করা আছে। DHT এর জন্য, একটি নতুন পিন মোড তৈরি করা হয়েছে:

স্ট্যাটিক কনস্ট int PIN_MODE_DHT = 0x0F; // DHT- এর জন্য কনফিগার করা পিন

একটি নতুন পিন মোড যুক্ত করার সময়, TOTAL_PIN_MODES অবশ্যই সমন্বয় করতে হবে:

স্ট্যাটিক কনস্ট int TOTAL_PIN_MODES = 17;

FirmataDefines.h

FirmataConstants.h- এ যোগ করা নতুন বার্তাগুলি প্রতিফলিত করতে এই ফাইলটি আপডেট করতে হবে:

#ifdef DHT_CONFIG #undef DHT_CONFIG #endif #define DHT_CONFIG firmata:: DHT_CONFIG // DHT request #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: DHT_DOD_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIF_DIN_DIF_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIN_DIF_DIT:: PIN_MODE_DHT

FirmataExpress.ino

এই আলোচনায়, আমরা এই Arduino স্কেচে করা পরিবর্তনগুলির "উচ্চ-পয়েন্ট" কভার করব।

FirmataExpress একযোগে ছয়টি DHT ডিভাইস সমর্থন করার জন্য, ডিভাইসের প্রতিটি সংযুক্ত পিন নম্বর, তার WakeUpDelay মান এবং ডিভাইসের ধরন, যা DHT22 বা DHT11- এর ট্র্যাক রাখার জন্য 3 টি অ্যারে তৈরি করা হয়েছে:

// ডিএইচটি সেন্সর

int numActiveDHTs = 0; // সংযোজিত DHT গুলির সংখ্যা uint8_t DHT_PinNumbers [MAX_DHTS]; uint8_t DHT_WakeUpDelay [MAX_DHTS]; uint8_t DHT_TYPE [MAX_DHTS];

যেহেতু উভয় ডিভাইসের প্রকারের মধ্যে পড়ার মধ্যে প্রায় 2 সেকেন্ডের প্রয়োজন হয়, তাই আমাদের নিশ্চিত করতে হবে যে আমরা প্রতিটি ডিএইচটি 2-সেকেন্ড সময়সীমার মধ্যে একবারই পড়েছি। কিছু ডিভাইস, যেমন DHT ডিভাইস এবং HC-SR04 দূরত্ব সেন্সর, শুধুমাত্র পর্যায়ক্রমে অ্যাক্সেস করা হয়। এটি তাদের পরিবেশের সাথে যোগাযোগের সময় দেয়।

uint8_t nextDHT = 0; // পরবর্তী ডিভাইস পড়ার জন্য dht তে সূচী

uint8_t currentDHT = 0; // কোন সেন্সর সক্রিয় আছে তার হিসাব রাখে। int dhtNumLoops = 0; // লুপ b4 এর মাধ্যমে টার্গেট সংখ্যা একটি DHT int dhtLoopCounter = 0 অ্যাক্সেস করে; // লুপ কাউন্টার

ডিএইচটি ডিভাইস কনফিগার এবং পড়া

যখন FirmataExpress DHT অপারেশনের জন্য একটি পিন কনফিগার করার জন্য একটি SysEx কমান্ড পায়, এটি যাচাই করে যে DHT ডিভাইসের সর্বাধিক সংখ্যা অতিক্রম করা হয়নি। যদি নতুন 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 এ ফেরত পাঠায়। _Bits ভেরিয়েবল DHT ডিভাইস দ্বারা ফিরে আসা ডেটা ধারণ করে যদি 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 গুলির সংখ্যা বৃদ্ধি পায়। একটি ভেরিয়েবল যা ডেটার জন্য পরবর্তী DHT চেক করার আগে কতগুলি লুপ পুনরাবৃত্তি সম্পূর্ণ করতে হবে তা ট্র্যাক করে রাখে। এই পরিবর্তনশীল আশ্বাস দেয় যে সিস্টেমে যতই ডিএইচটি যোগ করা হোক না কেন, সেগুলি 2 সেকেন্ডের সময়ের মধ্যে পড়বে।

int rv = readDhtSensor (numActiveDHTs);

যদি (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // সব ঠিক আছে }

যদি স্কেচের লুপ ফাংশনে এক বা একাধিক DHT ডিভাইস কনফিগার করা থাকে, তাহলে পরবর্তী DHT ডিভাইসটি পড়া হয়। হয় বৈধ ডেটা অথবা এর ত্রুটির স্থিতি একটি SysEx বার্তার আকারে pymata4 এ ফেরত দেওয়া হয়:

if (dhtLoopCounter ++> dhtNumLoops) {if (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) {// TEST CHECKSUM uint8_t sum = _bits [0] + _bits [1] + _bits [2] + _bits [3]; যদি (_bit [4]! = sum) {rv = -1; }} // একটি ত্রুটি স্থিতি Firmata.write (START_SYSEX) সহ বার্তাটি ফেরত পাঠান; Firmata.write (DHT_DATA); Firmata.write (current_pin); Firmata.write (current_type); জন্য (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 index) {

// INIT BUFFERVAR তথ্য পাওয়ার জন্য uint8_t মাস্ক = 128; uint8_t idx = 0; // এমপিটি বাফার // মেমসেট (_bit, 0, sizeof (_bits)); (uint8_t i = 0; i 5 BYTES for (uint8_t i = 40; i! = 0; i--) {loopCnt = DHTLIB_TIMEOUT;) ফেরত 40) {_bit [idx] | = mask;} mask >> = 1; if (mask == 0) // next byte? {Mask = 128; idx ++;}} DHTLIB_OK;}

ধাপ 4: DHT সাপোর্টের জন্য Pymata4 পরিবর্তন করা

private_constants.h

DHT সমর্থন করার জন্য, আমাদের এই ফাইলে নতুন পিন-টাইপ এবং SysEx বার্তা উভয়ই যোগ করতে হবে:

# পিন মোড ইনপুট = 0x00 # পিন ইনপুট হিসাবে সেট আউটপুট = 0x01 # পিন আউটপুট হিসাবে সেট করুন অ্যানালগ = 0x02 # এনালগ পিন ইনপুট মোড PWM = 0x03 # PWM আউটপুট মোডে ডিজিটাল পিন SERVO = 0x04 # সার্ভো আউটপুট মোডে I2C = 0x04 ডিজিটাল পিন 0x06 # পিন I2C সেটআপে অন্তর্ভুক্ত STEPPER = 0x08 # স্টেপার মোডে যেকোনো পিন সিরিয়াল = 0x0a পুলপ = 0x0b # পুলআপ মোডে যেকোনো পিন SONAR = 0x0c # সোনার মোডে যেকোনো পিন 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

Pymata4 একটি পাইথন ডিকশনারি ব্যবহার করে দ্রুত একটি মেসেজ হ্যান্ডলারের সাথে একটি ইনকামিং ফিরমাতা মেসেজ সংযুক্ত করতে। এই অভিধানের নাম Report_dispatch।

একটি অভিধান প্রবেশের বিন্যাস হল:

{MessageID: [message_handler, প্রক্রিয়া করা ডেটা বাইটের সংখ্যা]}

আগত DHT বার্তাগুলি পরিচালনা করতে অভিধানে একটি এন্ট্রি যুক্ত করা হয়েছিল:

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

বার্তার 7 বাইট ডেটা হল Arduino ডিজিটাল পিন নম্বর, DHT ডিভাইসের ধরন (22 বা 11), এবং 5 বাইট কাঁচা ডেটা।

_Dht_read_response পদ্ধতি কোন রিপোর্ট করা ত্রুটির জন্য পরীক্ষা করে। যদি কোন রিপোর্ট করা ত্রুটি না থাকে, আর্দুইনো ডিএইচটি নতুন লাইব্রেরি থেকে পোর্ট করা অ্যালগরিদম ব্যবহার করে আর্দ্রতা এবং তাপমাত্রা গণনা করা হয়।

গণনা করা মান ব্যবহারকারীর সরবরাহকৃত কলব্যাক পদ্ধতির মাধ্যমে রিপোর্ট করা হয়। এগুলি অভ্যন্তরীণ pin_data ডেটা স্ট্রাকচারেও সংরক্ষণ করা হয়। রিপোর্ট করা শেষ মান dht_read পদ্ধতি ব্যবহার করে pin_data ভোটের মাধ্যমে প্রত্যাহার করা যেতে পারে।

একটি নতুন DHT ডিভাইস কনফিগার করা হচ্ছে

একটি নতুন DHT ডিভাইস যোগ করার সময়, set_pin_mode_dht পদ্ধতি বলা হয়। এই পদ্ধতিটি ডিজিটাল পিনের জন্য pin_data আপডেট করে। এটি FirmataExpress এ একটি DHT_CONFIG SysEx বার্তা তৈরি করে এবং পাঠায়।

ধাপ 5: মোড়ানো

আমরা যেমন দেখেছি, একটি নতুন ডিভাইসের জন্য ফিরমাতা সমর্থন যোগ করার জন্য আপনাকে Arduino FirmataExpress সার্ভার কোড এবং পাইথন-ভিত্তিক pymata4 ক্লায়েন্ট কোড পরিবর্তন করতে হবে। FirmataExpress কোড ডিবাগ করা চ্যালেঞ্জিং হতে পারে। ডিবাগিংয়ে সহায়তা করার জন্য FirmataExpress এ printData নামে একটি পদ্ধতি যোগ করা হয়েছিল। এই পদ্ধতিটি আপনাকে FirmataExpress থেকে ডেটা মান পাঠাতে দেয় এবং সেগুলি pymata4 কনসোলে মুদ্রণ করবে।

এই ফাংশনের জন্য একটি অক্ষর স্ট্রিং এবং আপনি যে মানটি দেখতে চান তার একটি পয়েন্টার প্রয়োজন। যদি ডেটা মান argc নামক একটি ভেরিয়েবলে থাকে, তাহলে আপনি নিম্নলিখিত পরামিতিগুলির সাথে printData কে কল করতে পারেন।

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

যদি আপনার কোন প্রশ্ন থাকে, শুধু একটি মন্তব্য করুন, এবং আমি উত্তর দিতে খুশি হব।

শুভ কোডিং!

প্রস্তাবিত: