web-dev-qa-db-fra.com

Utiliser des classes avec l'Arduino

J'essaie d'utiliser des objets de classe avec l'Arduino, mais je continue à rencontrer des problèmes. Tout ce que je veux faire, c'est déclarer une classe et créer un objet de cette classe. Quel serait un exemple?

32
user29772

Sur Arduino 1.0, cela compile très bien:

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

Il y a n excellent tutoriel sur la façon de créer une bibliothèque pour la plate-forme Arduino . Une bibliothèque est essentiellement une classe, elle devrait donc vous montrer comment tout est fait.

Sur Arduino, vous pouvez utiliser des classes, mais il y a quelques restrictions:

  • Pas de mots-clés nouveaux et supprimés
  • Aucune exception
  • Pas de libstdc ++, donc pas de fonctions, modèles ou classes standard

Vous devez également créer de nouveaux fichiers pour vos classes, vous ne pouvez pas simplement les déclarer dans votre croquis principal. Vous devrez également fermer l'Arduino IDE lors de la recompilation d'une bibliothèque. C'est pourquoi j'utilise Eclipse comme mon IDE Arduino.

13
Johan

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

Par défaut, l'Arduino IDE et les bibliothèques n'utilisent pas l'opérateur new et l'opérateur delete. Il prend en charge malloc () et free (). La solution consiste donc à implémenter vous-même de nouveaux opérateurs et à supprimer des opérateurs. , pour utiliser ces fonctions.

Code:

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

Cela vous permet de créer des objets, par exemple.

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

Cordialement, tamberg

6
tamberg

J'ai créé ce simple il y a quelque temps. Le principal défi que j'avais était de créer un bon environnement de construction - un makefile qui compilerait et lierait/déploierait tout sans avoir à utiliser l'interface graphique. Pour le code, voici l'en-tête:

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();
};

Et voici la principale source

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();
    }
}

Il est plus joliment formaté ici: http://amkimian.blogspot.com/2009/07/trivial-led-class.html

Pour l'utiliser, je fais simplement quelque chose comme ça dans le fichier .pde:

#include "AM_Led.h"

#define TIME_LED    12   // The port for the LED

AMLed test(TIME_LED);
3
Alan Moore

Pouvez-vous donner un exemple de ce qui n'a pas fonctionné? Comme vous le savez probablement, le langage de câblage est basé sur C/C++, cependant, tout le C++ n'est pas pris en charge .

Que vous soyez autorisé à créer des classes dans l'IDE de câblage, je ne suis pas sûr (mon premier Arduino est dans le courrier en ce moment). Je sais que si vous avez écrit une classe C++, compilez-la en utilisant AVR-GCC , puis chargez-la sur votre Arduino en utilisant AVRDUDE , cela fonctionnerait.

1
John Paulett

Ma bibliothèque Webduino est basée sur une classe C++ qui implémente un serveur Web au-dessus du bouclier Ethernet Arduino. J'ai défini toute la classe dans un fichier .h que tout code Arduino peut #inclure. N'hésitez pas à regarder le code pour voir comment je le fais ... J'ai fini par tout définir en ligne car il n'y a aucune vraie raison de compiler séparément des objets avec l'IDE Arduino.

1
Ben Combee

Sur cette page , l'esquisse Arduino définit un couple de Structs (plus un couple de méthodes) qui sont ensuite appelés dans la boucle de configuration et la boucle principale. Assez simple à interpréter, même pour un programmeur à peine alphabétisé comme moi.

0
ropable