Post

Öz Arduino kitabxanam? Necə yəni? 1ci hissə

Yəqin ki, bir müddət Arduino-da işlədikdən sonra və ya daha professional proyektlər yaratmaq lazım olduğunda, bəzi sensor/modulların kitabaxanasının mövcüd olmadığını və ya sizə uyğun olmadığını görmüsünüz. Əgər yaxşı və səliqəli proqramçısınızsa, (ki, buna əminəm) bütün funksiyların və dəyişənlərin hamısının əsas faylda (.ino faylda) olmasının düz olmadığını bilirsiz. Bəs onda, necə edək ki, həm funksiyalarımız işləsin həm də kodumuz səliqəli olsun? Əgər kodumu düzəltsəm, onu açıq şəkildə (open-source) paylaşa bilərəmmi?

 

CAVAB SADƏDİR: BƏLİ! SADƏCƏ BU TUTORİALI SONA QƏDƏR İZLƏYİN)

İzaha tam keçməzdən əvvəl, mündəricat vermək istərdim. Əgər hansısa hissələri bildiyinizə əminsizsə, oranı ötüb keçə bilərsiniz.

 


MÜNDƏRİCAT

  • Giriş
  • Kitabxana fayllarının lokal yaradılması. Funksiyaların həmin fayllarda "düzülməsi"
  • Hazır kitabxanalarının fayl sisteminin analizi və özümüzə uyğunlaşdırma
  • Kitabxananı open-source etmək

Giriş

Mən ilk öncə sadaladığım problemlə 2018-ci ildə, Sumaks-da Avtomaks proyektini işləyərkən yaşamışdım. Mən və həmkarım, SİM800 və GPS modullarını işlətməli idik, halbuki, internetdə olan kitabxanalar işimizə yaramırdı. Məqsədimiz, mümkün qədər sürətli şəkildə GPS-dən aldığımız coğrafi en və uzunluğu göndərmək idi. SİM üçün olan kitabxana bizə verilmiş şərtlərə uyğun deyildi, GPS kitabxanası isə data oxuyub "parse" (bölmək) etməsi nisbətən çox vaxt alırdı. Nəticədə, həmkarımla hər şeyi özümüz sıfırdan yazmağı qərara aldıq. O proyektdən sonra, həmin kitabxananı dəfələrlə təkminləşdirmişəm və digər proyektlərdə onu rahatlıqla istifadə etmişəm (kitabxana yaratmağın üstünlülərindən biri: onu rahatlıqda yenidən başqa proyektlərdə istifadə edə bilərsiniz/bilərlər). Bu tutorialda, misal kimi, SİM800 üçün kitabxana bərabər yazacayıq. Nəzərdə tutulur ki, sizin heç olmazsa orta səviyyıdı kodlaşdırma bilikləriniz vardır. Gəlin uzatmadan, birbaşa keçək tutoriala.

 


Lokal kitabxananın yaradılması

Boş Arduino faylı yaratdıqdan sonra, .ino faylın olduğu qovluğa keçib, iki fayl yaradaq: sim800.cppsim800.h (mən SİM800 modulu üçün yaratdığımdan faylın adını belə qoydum; siz başqa modul/sensor üçün kitabxana yaradırsınızsa, adları ona uyğun qoymağınız məsləhət görülür). Nəzərə alın ki, hər iki faylın adı eyni olmalıdır ("extension"-lar fərqli olmaqla). Çünki, source fayl, eyniadlı header-i "include" edəcək və bu iki fayl arasında "bağlılıq" yaranacaq. Faylları yaratdıqdan sora, Arduino proqramına yenidən girsək, yuxarı tablarda .ino başqa öz fayllarımızı da görərik (Arduino faylının adı ixtiyari ola bilər)

Fayllar yaradıldıqdan sonra Arduino İDE interfeysi

 

İndi biz rahatlıqla Arduino İDE-dən kitabxanamızı düzəldə bilərik. Header faylda (.h faylında) lazım olan kitabaxanaları daxil etmək, struct/enum/macro-ları (ehtiyac varsa) yaratmaq lazımdır. Həmçinin, bizim işlədəcəyimiz funksiyaların prototipləri də header faylda verilməlidir. Funksiyalar isə source (.c və ya .cpp faylda) yazılmalıdır. Məsələn, mənim SIM800 class-ımın bəyanını (declaration) və onun həmin class-ın funksiya və dəyişənlərini header faylda tanidib, source faylda istifadə etmişəm. Məsələn, init funksiyası üçün:

 

Source faylında (sim800.cpp)

 

Header faylında (sim800.h)

 

Şəkillərdən görə bilərsiniz ki, header faylında bəyanetmə, source faylında isə təyinetmə baş verir (və ya, sadə dildə desək, header fayl adını çəkir, source fayl izah edir). Bütün funksiyaları yerləşdirdikdən sonra, kitabxana funksiyalarımızın düz işləyib işləmədiyini bilmək üçün, əsas faylda test Arduino kodu yazib yoxlaya bilərik:

 

 

Kitabxanamızın tamamilə işlədiyinə əminiksə, növbəti mərhələyə keçə bilərik.

 


Qlobal kitabxanaların strukturunun analizi

Bura qədər biz, sadəcə funksiyalar yığını olan fayllar yaratdıq. İndi isə sizdə belə bir şübhə yarana bilər: "Xalxın uşağı bundan daha gözəl variantda kitabxana hazırlayır, hətta Arduino İDE-dən .zip kimi kitabxananı add eləmək olur". Sizə yaxşı xəbərim var, bu mərhələdən sora "xalxın uşağı" olmaq çox da çətin deyil və siz də biri ola bilərsiniz! İşin ən çətini, funksiyaların siz istədiyiniz tərzdə yazılması və işləməsi idi. Siz artıq buranı oxuyursunuzsa, təbrik edirəm, işin ən çətin yerinin öhdəsindən gəlmisiniz! İndi isə gəlin görək biz də necə "xalxın uşağı" ola bilərik.

 

Gəlin, Arduinonun məşhur kitabxanalarından biri olan DHT_sensor_library kitabxanasının qovluğunu nəzərdən keçirək:

Fikir versəniz, 2 cüt source/header cütlüyü vardır (bəzən, bir sensor/modul üçün source/header cütlüyü sayı birdən çox ola bilər; o kitabxananın necə yazılıb nəyə uyğunlaşdırılacağından asılıdır). Bizdə bu hissə artıq hazırdır. "Examples" qovluğunda, nümunə Arduino sketch(lər)i olur. Bu nümunə sketch-lər, başqa kitabxana istifadəçisinin "bu kitabxana ilə necə başlaya bilərəm" sualına cavab olaraq yaradılır. Hal-hazırda bu kitabxanada 2 Arduino nümunə kodu vardır:

Bizim SİM800 kitabxanası üçün, mən 3 nümumə kodu yaradardım: HTTP, TCP və MQTT protokollarını hərəsi üçün bir sketch, mənim kitabxanamı istifadə edəcək birinin necə başlaması üçün yaxşı seçimli istiqamət olar. Bu nümunə sketch-lərdən başqa iki fayl vardı: library.properties və keywords.txt (faylların ikisi də text faylıdır və istədiyiniz text editor ilə acıb editləyə bilərsiniz). Gəlin ilk öncə 2-ciyə nəzər salaq:

 

Yuxarıdan da, 2-ci sətrdə yazıldığı kimi, bu "Syntax coloring", yəni, "kodu rəngləmək" üçündür. Əgər fikir vermisinizsə, Arduinoda kitabxanaların class obyektləri tünd narıncı rəngə boyanır. Funksiya adları isə nazik açıq narıncı, bəzi sabitlər (konstantlar) isə yaşıl rəngə dönür. Əgər bunu istəyirsinizsə (ki, məncə bu kodun oxunaqlığını artırır), sizin də öz kitabxananız üçün bu faylınız olmalıdır. Bu faylda kommentlər '#' simvolu ilə başlayır (python-dakı kimi). Qalan əsas sözlər isə:

  • KEYWORD1 - qalın narıncı rəng (class-ların adı üçün nəzərdə tutulub)
  • KEYWORD2 - qəhvəyi rəng (class-ın funksiyaları və metodları üçün nəzərdə tutulub)
  • KEYWORD3 - yaşıl rəng (struct və enum-lar üçün nəzərdə tutulub)
  • LITERAL1 - göy rəng (sabitlər və makrolar üçün nəzərdə tutulub)

Bu fayl-da istədiyiniz açar sozü (keyword-ü) istədiyiniz formata/rəngə salmaq üçün, hər sətrdə bu formatı saxlamaq lazımdır:

SizinClass    KEYWORD1
SizinFunksiya    KEYWORD2
SizinStruct    KEYWORD3
SizinConstant    LITERAL1
Nəzərə almalısız ki, ortada (sizin funksiya adı ilə KEYWORD2 sözü arasında) boşluq deyil, TAB-dır. Faylı istədiyiniz kimi kommentləyə bilərsiniz, orada heç bir limit yoxdur. Arduino-nun özünün "syntax coloring"-i haqqında daha ətraflı məlumatı buradan ala bilərsiniz.

Biz bu faylı özümüzə uyğunlaşdırmaq üçün qlobal funksiyalarımızı KEYWORD2, sabit və makrolarımızı LITERAL1 və nəhayət bütün bunları birləşdirən class-ımızı KEYWORD1 ilə uyğunlaşdıracayıq.


Indi isə gəlin o biri faylı (library.properties) nəzərdən keçirək:

Buradakı sətrləri analiz etsək:

  1. name - Sizin kitabxananın adı. Unikal olmalıdır, artıq mövcüd ola heç bir kitabaxanın bu sətri ilə eyni olmamalıdır.
  2. version - Kitabxananızın versiyası. Hər dəfə yeni versiyanı işlədikdən sonra yüklədikdə, bu sətri dəyişməlisiniz.Versiyanız semantik versiyalandırma standartına uyğun olmalıdır. Daha ətraflı burada.
  3. author - Kitabxana müəllifinin adı və ya ləqəbi (nickname). Əlavə olaraq, vergüllə ayrılmış e-mail də qeyd oluna bilər.
  4. maintainer - Kitabxananın "qeydinə" qalan (üzərində işləyən) şəxsin adı və e-maili. Çox hallarda müəəlif ilə eyni olur.
  5. sentence - Kitabxananın işini izah edən qısa bir cümlə.
  6. paragraph - Kitabxananın işini ətraflı izahı. İlk sətr avtomatik olaraq sentence-dəki sətriniz olur, odur ki, ikinci cümlədən yazmağa başlayın. Boş saxlaya bilərsiniz, o zaman, əvvəlki sətrlə eyni olacaqdır.
  7. category - Kitabxananızın daxil olduğu kateqoriya. Boş buraxıldıqda "Uncategorized" olur. Belə isə, mövcud bu kateqoriyalardan birini seçə bilərsiniz: Display, Communication, Signal Input/Output, Sensors, Device Control, Timing, Data Storage, Data Processing, Other. Məsələn, bizim kitabxana xəbərləşmə üçün olduğu üçün, bu sətrə "Communication" yazacayıq.
  8. url - İstənilən istifadəçinin baş çəkə bilməyi üçün kitabxananızın linki. Kitabxanamızı Github platformasında paylaşacağımızdan, onun linkini paylaşacayıq.
  9. architectures  - Sizin kitabxananln dəstəkləndiyi arxitekturalar. Əgər spesifik bir arxitektura üçün yazmamısınızsa, "*" qoyun. Bu daha çox, uyğun olmayan arxitekturalı mikrokontrollerde kod "compile" olunarkən, warning mesajı vermək üçündür,
  10. depends - Kitabxananızın asılı olduğu başqa kitabxanaların (Ardunionun öz hazır kitabxanaları xaric olmaqla) vergüllə ayrılmış listi. Bizim halda belə bir asılılıq yoxdur və bu sətrin qabağını boş qoyacayıq

Bundan əlavə məcburi olmayan bir neçə sətr də əlavə edə bilərik. Çox da vacib olmadıqları üçün, onları ötüb keçəcəm. Əgər maraqlısınızsa, bu keçiddən ətraflı məlumat ala bilərsiniz.

Əgər kitabaxananızın bütün Arduino IDE versiyaları üçün keçərli olmağını istəyirsinizsə, öz kitabxana fayllarınızı src/ qovluğuna qoyun. Əgər yazdığınız sensor/modulla bağlı əlavə fayllar və dokumentasiyalar varsa, bunları extra/ qovluğunda yerləşdirə bilərsiniz.

 

Birinci hissənin sonu. Ardı bu keçiddə.