web-dev-qa-db-ja.com

Arduinoでクラスを使用する

Arduinoでクラスオブジェクトを使用しようとしていますが、引き続き問題が発生します。私がやりたいのは、クラスを宣言し、そのクラスのオブジェクトを作成することです。例は何でしょうか?

32
user29772

Arduino 1.0では、これは問題なくコンパイルされます。

class A
{
  public:
   int x;
   virtual void f() { x=1; }
};

class B : public A
{
  public:
    int y;
    virtual void f() { x=2; }
};


A *a;
B *b;
const int TEST_PIN = 10;

void setup()
{
   a=new A(); 
   b=new B();
   pinMode(TEST_PIN,OUTPUT);
}

void loop()
{
   a->f();
   b->f();
   digitalWrite(TEST_PIN,(a->x == b->x) ? HIGH : LOW);
}
18
Warren MacEvoy

Arduinoプラットフォーム用のライブラリを作成する方法に関する優れたチュートリアル があります。ライブラリは基本的にクラスであるため、そのすべてがどのように行われたかを示す必要があります。

Arduinoではクラスを使用できますが、いくつかの制限があります。

  • 新規および削除キーワードなし
  • 例外なし
  • Libstdc ++がないため、標準の関数、テンプレート、クラスはありません

また、クラス用に新しいファイルを作成する必要があります。メインスケッチでそれらを宣言することはできません。また、ライブラリを再コンパイルするときにArduino IDEを閉じる必要があります。そのため、EclipseをArduino IDEとして使用します。

13
Johan

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955 状態:

デフォルトでは、Arduino IDEおよびライブラリは演算子newおよびoperator deleteを使用しません。malloc()およびfree()をサポートします。したがって、解決策は自分でnewおよびdelete演算子を実装することです、これらの機能を使用します。

コード:

#include <stdlib.h> // for malloc and free
void* operator new(size_t size) { return malloc(size); } 
void operator delete(void* ptr) { free(ptr); }

これにより、オブジェクトを作成できます。

C* c; // declare variable
c = new C(); // create instance of class C
c->M(); // call method M
delete(c); // free memory

よろしく、タンバーグ

6
tamberg

しばらく前にこのシンプルなものを作成しました。私が抱えていた主な課題は、優れたビルド環境を作成することでした。GUIを使用せずにすべてをコンパイルおよびリンク/デプロイするメイクファイルです。コードの場合、ヘッダーは次のとおりです。

class AMLed
{
    private:
          uint8_t _ledPin;
          long _turnOffTime;

    public:
          AMLed(uint8_t pin);
          void setOn();
          void setOff();
          // Turn the led on for a given amount of time (relies
          // on a call to check() in the main loop()).
          void setOnForTime(int millis);
          void check();
};

そして、ここが主な情報源です

AMLed::AMLed(uint8_t ledPin) : _ledPin(ledPin), _turnOffTime(0)
{
    pinMode(_ledPin, OUTPUT);
}

void AMLed::setOn()
{
    digitalWrite(_ledPin, HIGH);
}

void AMLed::setOff()
{
    digitalWrite(_ledPin, LOW);
}

void AMLed::setOnForTime(int p_millis)
{
    _turnOffTime = millis() + p_millis;
    setOn();
}

void AMLed::check()
{
    if (_turnOffTime != 0 && (millis() > _turnOffTime))
    {
        _turnOffTime = 0;
        setOff();
    }
}

ここでよりきれいにフォーマットされています: http://amkimian.blogspot.com/2009/07/trivial-led-class.html

使用するには、.pdeファイルで次のような操作を行うだけです。

#include "AM_Led.h"

#define TIME_LED    12   // The port for the LED

AMLed test(TIME_LED);
3
Alan Moore

何が機能しなかったのか例を示していただけますか?ご存知のように、 Wiring language はC/C++に基づいていますが、 C++のすべてがサポートされているわけではありません です。

Wiring IDEでクラスを作成することが許可されているかどうかはわかりません(私の最初のArduinoは今メールにあります)。 C++クラスを記述し、 AVR-GCC を使用してコンパイルし、 [〜#〜] avrdude [〜#〜] を使用してArduinoにロードした場合、それは動作します。

1
John Paulett

My Webduino library はすべて、Arduino Ethernetシールドの上にWebサーバーを実装するC++クラスに基づいています。 Arduinoコードが#includeできる.hファイルでクラス全体を定義しました。自由にコードを見て、その方法を確認してください... Arduino IDEでオブジェクトを個別にコンパイルする本当の理由がないため、すべてインラインで定義することになりました。

1
Ben Combee

このページ では、Arduinoスケッチは、セットアップループとメインループで呼び出されるいくつかの構造(およびいくつかのメソッド)を定義します。私のようなほとんど読み書きのできないプログラマーでさえ、解釈するのに十分簡単です。

0
ropable