友人経由で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のスケッチはシンプルな方が良いと思うので、今後はこの方向で行く予定。