Arduino için Kütüphane Yazma

Bu belgede Arduino için nasıl kütüphane oluşturulacağı açıklanmaktadır. Mors kodunun yanıp sönmesi için bir taslakla başlar ve işlevlerinin bir kütüphaneye nasıl dönüştürüleceğini açıklar. Bu, diğer kişilerin yazdığınız kodu kolayca kullanmasına ve kitaplığı geliştirdikçe kolayca güncellemesine olanak tanır.

Daha fazla bilgi için, kitaplığınız için iyi bir Arduino tarzı API oluşturma hakkında bilgi için API Stil Kılavuzu'na bakın.

Basit Mors kodu yapan bir taslakla başlıyoruz:

int pin = 13;

void setup()
{
  pinMode(pin, OUTPUT);
}

void loop()
{
  dot(); dot(); dot();
  dash(); dash(); dash();
  dot(); dot(); dot();
  delay(3000);
}

void dot()
{
  digitalWrite(pin, HIGH);
  delay(250);
  digitalWrite(pin, LOW);
  delay(250);
}

void dash()
{
  digitalWrite(pin, HIGH);
  delay(1000);
  digitalWrite(pin, LOW);
  delay(250);
}

Bu çizimi çalıştırırsanız, pin 13'te SOS (bir tehlike çağrısı) kodunu yanıp söner.

Eskiz, kütüphanemize getirmemiz gereken birkaç farklı bölümden oluşuyor. İlk olarak, elbette, gerçek yanıp sönmeyi yapan dot () ve dash () fonksiyonlarımız var. İkincisi, hangi pimin kullanılacağını belirlemek için işlevlerin kullandığı ledPin değişkeni vardır. Son olarak, raptiyeyi çıktı olarak başlatan pinMode () çağrısı vardır.

Eskizi bir kütüphaneye dönüştürmeye başlayalım!

Bir kütüphane için en az iki dosyaya ihtiyacınız vardır: bir başlık dosyası (.h uzantılı) ve kaynak dosya (.cpp uzantılı). Başlık dosyası kütüphane için tanımlara sahiptir: temel olarak içerideki her şeyin bir listesi; kaynak dosya gerçek koda sahip. Kütüphanemize "Morse" adını vereceğimiz için başlık dosyamız Morse.h olacaktır. İçinde neler olduğuna bir bakalım. İlk başta biraz garip gelebilir, ancak onunla birlikte gelen kaynak dosyayı gördüğünüzde daha anlamlı olacaktır.

Üstbilgi dosyasının çekirdeği, kütüphanedeki her işlev için ihtiyacınız olan değişkenlerle birlikte bir sınıfa sarılmış bir satırdan oluşur:

class Morse
{
  public:
    Morse(int pin);
    void dot();
    void dash();
  private:
    int _pin;
};

Bir sınıf, hepsi tek bir yerde bir arada tutulan işlevler ve değişkenler topluluğudur. Bu işlevler ve değişkenler herkese açık olabilir, yani kütüphanenizi kullanan kişiler tarafından erişilebilir veya özeldir , yani yalnızca sınıfın içinden erişilebilirler. Her sınıf, yapıcı olarak bilinen ve sınıfın bir örneğini oluşturmak için kullanılan özel bir işleve sahiptir. Yapıcı sınıfla aynı ada sahiptir ve dönüş türü yoktur.

Başlık dosyasında birkaç başka şeye ihtiyacınız var. Biri, Arduino dilinin standart türlerine ve sabitlerine erişmenizi sağlayan #include ifadesidir (bu, otomatik olarak normal çizimlere eklenir, ancak kitaplıklara eklenmez). Şöyle görünür (ve daha önce verilen sınıf tanımının üzerine çıkar):

#include "Arduino.h"

Son olarak, başlık dosyasının tamamını garip görünümlü bir yapıda sarmak yaygındır:

#ifndef Morse_h
#define Morse_h

// the #include statment and code go here...

#endif

Temel olarak, yanlışlıkla içerilen # kitaplığınız iki kez kitap içeriyorsa bu sorunları önler.

Son olarak, genellikle kütüphanenin üst kısmına adı, ne yaptığını, kimin yazdığını, tarihini ve lisansını içeren kısa bir açıklama eklersiniz.

Tam başlık dosyasına bakalım:

/*
  Morse.h - Library for flashing Morse code.
  Created by David A. Mellis, November 2, 2007.
  Released into the public domain.
*/

#ifndef Morse_h
#define Morse_h

#include "Arduino.h"

class Morse
{
  public:
    Morse(int pin);
    void dot();
    void dash();
  private:
    int _pin;
};

#endif

Şimdi kaynak dosya Morse.cpp'in çeşitli bölümlerini inceleyelim.

Önce birkaç #include deyimi gelir. Bunlar, kodun geri kalanına standart Arduino işlevlerine ve başlık dosyanızdaki tanımlara erişim sağlar:

#include "Arduino.h"
#include "Morse.h"

Sonra kurucu geliyor. Yine, bu, birisi sınıfınızın bir örneğini oluşturduğunda ne olması gerektiğini açıklar. Bu durumda, kullanıcı hangi pimi kullanmak istediğini belirtir. Pimi, diğer işlevlerde kullanmak için özel bir değişkene kaydedecek bir çıkış olarak yapılandırırız:

Morse::Morse(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

Bu kodda birkaç tuhaf şey var. Birincisi, işlev adından önce Morse :: . Bu, işlevin Morse sınıfının bir parçası olduğunu söylüyor. Bunu sınıftaki diğer işlevlerde tekrar göreceksiniz. İkinci olağandışı şey, özel değişkenimiz olan _pin'in alt çizgisidir . Bu değişken aslında başlık dosyasındaki tanımla eşleştiği sürece istediğiniz herhangi bir ada sahip olabilir. Adın başlangıcına bir alt çizgi eklemek, hangi değişkenlerin özel olduğunu açıklığa kavuşturmak ve adı bağımsız değişkenin işlevden ayırmak için yaygın bir kuraldır (bu durumda pin ).

Daha sonra, bir kitaplığa dönüştürdüğünüz taslaktan asıl kod (nihayet!) Geliyor. Bu fonksiyonların isimlerin önünde :: Morse ile haricinde hemen hemen aynı görünüyor ve bunun yerine iğnenin _pin:

void Morse::dot()
{
  digitalWrite(_pin, HIGH);
  delay(250);
  digitalWrite(_pin, LOW);
  delay(250);  
}

void Morse::dash()
{
  digitalWrite(_pin, HIGH);
  delay(1000);
  digitalWrite(_pin, LOW);
  delay(250);
}

Son olarak, yorum başlığını kaynak dosyanın en üstüne eklemek tipiktir. Her şeyi görelim:

/*
  Morse.cpp - Library for flashing Morse code.
  Created by David A. Mellis, November 2, 2007.
  Released into the public domain.
*/


#include "Arduino.h"
#include "Morse.h"

Morse::Morse(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

void Morse::dot()
{
  digitalWrite(_pin, HIGH);
  delay(250);
  digitalWrite(_pin, LOW);
  delay(250);  
}

void Morse::dash()
{
  digitalWrite(_pin, HIGH);
  delay(1000);
  digitalWrite(_pin, LOW);
  delay(250);
}

Ve tüm ihtiyacınız olan bu (isteğe bağlı başka güzel şeyler var, ama daha sonra konuşacağız). Kütüphaneyi nasıl kullandığınızı görelim.

İlk olarak, eskiz defteri dizininizin kütüphaneler alt dizininde bir Mors dizini oluşturun. Morse.h ve Morse.cpp dosyalarını kopyalayın veya bu dizine taşıyın. Şimdi Arduino ortamını başlatın. Çizim> Kütüphaneyi İçe Aktar menüsünü açarsanız, içinde Mors görmelisiniz. Kütüphane, onu kullanan eskizlerle derlenecektir. Kütüphane oluşturulmuş gibi görünmüyorsa, dosyaların gerçekten .cpp ve .h ile sonlandığından emin olun (örneğin, ekstra .pde veya .txt uzantısı olmadan).

Yeni kütüphaneyi kullanarak eski SOS çizimimizi nasıl kopyalayabileceğimizi görelim:

#include <Morse.h>

Morse morse(13);

void setup()
{
}

void loop()
{
  morse.dot(); morse.dot(); morse.dot();
  morse.dash(); morse.dash(); morse.dash();
  morse.dot(); morse.dot(); morse.dot();
  delay(3000);
}

Eski taslaktan birkaç fark vardır (kodun bir kısmının bir kütüphaneye taşınması dışında).

İlk olarak, çizimin üstüne #include ifadesi ekledik. Bu, Morse kütüphanesini taslak için kullanılabilir hale getirir ve panoya gönderilen koda ekler. Bu, çizimde artık bir kitaplığa ihtiyacınız yoksa, yerden tasarruf etmek için #include deyimini silmeniz gerektiği anlamına gelir.

İkincisi, şimdi Morse sınıfının morse adında bir örneği oluşturuyoruz:

Bu satır yürütüldüğünde (aslında setup () işlevinden önce bile gerçekleşir), Morse sınıfının yapıcısı çağrılır ve burada verdiğiniz argümanı iletir (bu durumda, sadece 13 ).

Kurulumumuzun () artık boş olduğuna dikkat edin; çünkü pinMode () çağrısı kitaplığın içinde gerçekleşir (örnek oluşturulduğunda).

Son olarak, dot () ve dash () işlevlerini çağırmak için, bunları mors ile önek eklememiz gerekir. - kullanmak istediğimiz örneğin adı. Morse sınıfının her biri kendi piminde o örneğin _pin özel değişkeninde saklanan birden fazla örneğimiz olabilir. Belirli bir örnekte bir işlevi çağırarak, bir işleve yapılan çağrı sırasında hangi örneğin değişkenlerinin kullanılması gerektiğini belirtiriz. Yani, ikimiz de olsaydı:

Morse morse(13);
Morse morse2(12);

sonra morse2.dot () çağrısının içinde _pin 12 olur.

Yeni çizimi denediyseniz, kitaplığımızdan hiçbir şeyin çevre tarafından tanınmadığını ve renkli olarak vurgulandığını fark ettiniz. Ne yazık ki, Arduino yazılımı kütüphanenizde ne tanımladığınızı otomatik olarak anlayamaz (buna sahip olmak güzel bir özellik olsa da), bu yüzden biraz yardım etmelisiniz. Bunu yapmak için, Morse dizininde keywords.txt adlı bir dosya oluşturun. Şöyle görünmelidir:

Morse   KEYWORD1
dash    KEYWORD2
dot     KEYWORD2

Her satır, anahtar kelimenin adını, ardından bir sekme (boşluk değil) ve ardından anahtar kelime türünü içerir. Sınıflar KEYWORD1 olmalı ve turuncu renkte olmalıdır; fonksiyonlar KEYWORD2 olmalı ve kahverengi olacaktır. Yeni anahtar kelimeleri tanıması için Arduino ortamını yeniden başlatmanız gerekir.

İnsanlara kitaplığınızı kullanan örnek bir çizim sunmak da güzel. Bunu yapmak için, Mors dizininde bir örnek dizin oluşturun. Daha sonra, yukarıda yazdığımız çizimi içeren dizini taşıyalım veya kopyalayalım (buna SOS diyelim) örnekler dizinine kopyalayın. ( Çizim> Çizim Klasörünü Göster komutunu kullanarak bulabilirsiniz.) Arduino ortamını yeniden başlatırsanız (bu son kez söz veriyorum) - Dosya> Sketchbook> Örnekler menüsünde Kütüphane-Morse öğesi göreceksiniz örneğini içerir. Kitaplığınızı nasıl kullanacağınızı daha iyi açıklayan bazı yorumlar eklemek isteyebilirsiniz.

Kütüphanenin tamamını (anahtar kelimeler ve örnekle birlikte) kontrol etmek isterseniz, indirebilirsiniz: Morse.zip .

Şimdilik bu kadar ama muhtemelen yakında gelişmiş bir kütüphane eğitimi yazacağım. Bu arada, herhangi bir sorun veya öneriniz varsa, lütfen bunları Yazılım Geliştirme forumuna gönderin.

Daha fazla bilgi için, kitaplığınız için iyi bir Arduino tarzı API oluşturma hakkında bilgi için API Stil Kılavuzu'na bakın.