Arduinoで自作ライブラリを作ってみる

友人経由でArduino UNO Rev3を安く入手したので、またArduinoで遊びます。
んで、こないだPICでいじってたYMZ294用のArduinoライブラリを作ろうとしたけどうまく動かなくて挫折(早えよ)
そんなわけで、シンプルにLEDをチカチカさせるライブラリを書きました。ライブラリに使う言語はC++です。

ナイトライダー好きでした。KITT早く出来ないかなあって思ったけど、iPhoneのSiriでナビさせれば近い感じではあるよな。
あ、ブレッドボード上に他のICとか色の違う抵抗器とかありますが、今回の回路とは関係無いです。使ってるのはDIGITALポート0~7→LED8個→抵抗経由でGNDの部分だけ。

マイドキュメントのArduinoフォルダにlibrariesってフォルダがあるのを確認

librariesの下にled8フォルダを作る

その中にled8.h, led8.cppファイルを作成

中身はこんなです。
led8.h

#ifndef LED8_H
#define LED8_H

#include "Arduino.h"

class led8 {
public:
		led8();
	byte advance();
private:
	byte state;
	bool lr;
};

#endif

led8.cpp

#include "led8.h"

led8::led8()
 : state(0b00000001), lr(true)
{}

byte led8::advance()
{
	state = (lr? state << 1: state >> 1);
	if (state == 0b10000000 || state == 0b00000001)
		lr = !lr;
		
	return state;
}

C++で作ったライブラリ用のファイルは、Arduinoのスケッチで読み込んだ際に一緒にコンパイルされます。
で、そのライブラリを読み込むArduino側のプログラムはこんな

led8lib_test.ino

#include <led8.h>

led8 led;
void setup() {
  DDRD = 0b11111111;
}

void loop() {
  PORTD = led.advance();
  delay(100);
}

digitalWrite()関数でチマチマいじるのが面倒なので、DDRDとPORTDを直に書き込みすることにしました。
スケッチをArduinoに書き込みに行く時にポート0,1を使ってるとエラーが出るので、ケーブルは引っこ抜いておきましょう。

ライブラリ使わずにArduino側のプログラムだけで書くとこんな感じになります。参考までに。

void setup() {
  DDRD = 0b11111111;
}

void loop() {
  static byte led_state = 0b00000001;
  static bool lr = true;
  led_state = (lr? led_state << 1: led_state >> 1);
  if (led_state == 0b10000000 || led_state == 0b00000001)
    lr = !lr;
  PORTD = led_state;
  delay(100);
}

使い回しが効く部分はライブラリ側に書いて、Arduinoのスケッチはシンプルな方が良いと思うので、今後はこの方向で行く予定。


コメントを残す