Arduinoをもっと書きやすくするライブラリ紹介
📕

Arduinoをもっと書きやすくするライブラリ紹介

Tags
Arduino
雑記
Published
February 14, 2022

Introduction

私はArduinoは好きではなくmbedを好んで使っています。簡潔に書きたい。
mbedに求めるものをArduinoに移植してくれているライブラリを紹介します。

Arduinoの関数ってあんまり綺麗じゃないよね

例えばですがdigitalPinを使う時はこう書きます。
// Setup pinMode(outputPin,OUTPUT); //アウトプット pinMode(switchPin,INPUT); //インプット // Write digitalWrite(outputPin,HIGH); digitalWrite(outputPin,LOW); // Read bool state = digitalRead(switchPin);

これの問題点

  • Read/Writeの時に文頭からなんのピンを制御制御しているかわからない
  • 長すぎる
  • 沢山のピンを扱う時にアレイで扱えない

mbedだとこう書ける

めちゃくちゃ簡単にかけます。直感的で扱いやすいライティングができる。
// Setup DigitalIn switchPin(PinName); DigitalOut switchPin(PinName); // Write outputPin = 1; outputPin = 0; // Read bool state = switchPin;

ライブラリ紹介 IO-Kit

しろくまさんが作っているIO-Kitを使うと綺麗に書くことができます。ありがたや〜
#include "IO-Kit.h” // Setup Output LED = 13; // Write LED = HIGH; LED = LOW;
notion image
GitHub - shirokuma-89/IO-Kit: Arduinoのピン操作を快適に。煩わしい記述は必要ありません。
Arduinoのピン操作を快適に。煩わしい記述は必要ありません。 Arduinoでピンの入出力時に、このような悩みはありませんか? まとめてHIGHにしたいのにいちいちdigitalWriteするのは面倒! ピンを用途ごとにオブジェクト配列で管理したい! setup()がpinModeの嵐で読みにくい! そんな悩みを解決するのがIO-Kitです。 GitHubのリリースからどうぞ。最新バージョンは0.1です。 まずライブラリをリリースから最新版をダウンロードし、解凍します。 スケッチフォルダないのlibraries内に解凍したフォルダごと配置します。 このライブラリを使うためには必ず以下のようにヘッダーファイルを読み込む必要があります。全てはここから始まります。 Output 名前 = ピン番号; 出力に設定したい ピン番号とそのピンの今後の 呼び名 を記述してください。 上級編:オブジェクト配列を使ってこのように定義することもできます。 digitalWriteと同等のことを行うには、 呼び名 = 値; で設定することができます。 analogWriteと同等のことを行うには 呼び名 = 値(float) で行うことができます。値は0.0から1.0の間で割合を指定してください。 ただし0.0と1.0が指定された場合はPWM出力は行われません。また、PWMに対応していないピンは0.5を境としてHIGHまたはLOWのいずれかが出力されます。 Note:感のいい人はさっきのHIGHとLOWの切り替えと構文が全く同じであることに気づいたかもしれません。僕たちはPWMかそうじゃないかなんて気にする必要がないのです。そんなものは機械に任せて僕たち人間は創造的なコードを書くことに専念しましょう。 また、標準のanalogWriteと同じように0から255の整数で指定したい場合もあるでしょう。その場合は、 と記述することもできます。 上級編:もちろんこういう記述も可能です。 またこの場合の「<<-」は、 呼び名 = 呼び名 << 値ではないことに注意してください。これは<<=演算子がオーバーロードされているためです。 このLEDってHIGHにしたっけ?それともLOWのままだっけ?とプログラムを書いているときになるかもしれません。その場合は 呼び名 をただの変数みたいに扱ってあげてください。 これはデバッグの時にも大変有効です。例えばあなたがモータードライバの状況をパソコンで見たい時に Serial.println(呼び名); とすることで表示させることができます。 また、これによりHIGHとLOWという単語を一度も使わずにLチカのプログラムを組むこともできます。 さらに、そのピンがPWM出力をしていた場合も同様の文で確かめることができます。例えば50%で出力をしていた場合、0.5が返ってきます。 ただし、あなたがプログラムの途中に突然digitalWriteやanalogWriteに浮気してしまった場合、予想異なる値が返ってくることがあります。これは過去に LED = HIGH; などとした時のログを遡って単純に返すという実装になっているためです。三角関係の対岸で起きたことなど知るはずがありません。 上級者編:過去に設定した値と返ってくる値が必ずしも 一致するとは限りません。これははPWM出力は裏では0から255の 256段階で出力されている ためです。例えば、 としたとしてもなんの意味も無さないでしょう。 また、PWMに対応していないピンに過去に誤って 呼び名 <<= 値;や 呼び名 = 少数 としてしまった場合でも、返ってくるのはそこで設定した値(=HIGHまたはLOWとは限らない)であることに注意してください。 また、返ってくる値を0.0から1.0ではなく0から255で確認したい場合もあるかもしれません。その場合は としてください。またPWM出力中でなかった場合は0か255が返ってきます。 入力に設定したい ピン番号 とそのピンの今後の呼び名を記述してください。 内部プルアップを有効にしたいときは、 としてください。デフォルトではプルアップ抵抗は無効ですが、無効であること(=開放されていること)を明示したい場合は以下のように記述することもできます。(最初の例と動作は完全に同一です。) 単純に 呼び名 だけでただの変数みたいな感じで扱ってあげてください。例えばSWTCHの値を読み取ってaという変数に格納したい場合は、 とするだけで自動的に裏でdigitalReadが走ります。 呼び名.analog() ...
GitHub - shirokuma-89/IO-Kit: Arduinoのピン操作を快適に。煩わしい記述は必要ありません。
⚠️
ArduinoIDEで使う場合はファイルを編集する必要があります
srcの中にあったincludeファイルの中身を出してダウンロードしたIO-Kit-mainの直下に置いてあげる必要があります
notion image

時間計測にTime関数を使うと綺麗に描けない

全然直感的な時間計測ができないですよね。。。
時間計測関数にはmillis()というのが提供されています。

時間計測(ms)をするプログラム

millis()を使ってミリ秒の時間計測をしてみます(μsの場合はmicros())
void loop() { unsigned long timeStart = millis(); //計測開始 delay(1000); unsigned long time = millis() - timeStart; // 計測終了 Serial.print(time); }
時間計測前に変数に時間を代入するの毎回書くのなんか直感的じゃないですよね。
複数の時間計測をしたい時はあんまり便利じゃなさそう。
もっと簡単に、ストップウォッチの感覚で使いたい。

mbedではこう書ける

書く量がかなり減ります。
Timer timer; //宣言 timer.start(); //計測開始 // 時間取得 timer.read(); //秒 timer.read_ms(); //ミリ秒 timer.read_us(); //マイクロ秒 timer.reset(); //カウントを0にする timer.stop(); //カウントを止める

ライブラリ紹介 mbedlike-timerlib

このライブラリを使うとmbedのような直感的ライティングができます。
#include "timer.h" // Setup timer timer1; // リセット・スタート timer1.reset(); // 時間取得 timer1.read_ms(); timer1.read_us();

ライブラリを使った例

簡単な例ですがLチカをしてみました。
使っているマイコンはATTiny85です。
Video preview
#include "IO-Kit.h" #include "timer.h" Output LED1 = 0; //1秒に一回Blinkする予定のピン Output LED2 = 1; //PWMに対応したピン timer timer1; //1秒計測のためのタイマー float fadeAmout = 0.001; float brightness = 0.0; void setup() { } void Blink(){ if(timer1.read_ms() > 1000) { //1秒周期でLチカする LED1 = !LED1; timer1.reset(); //タイマーリセット } } void Fading(){ LED2 = brightness; brightness += fadeAmout; if (brightness <= 0.0 || brightness >= 1.0) { fadeAmout = -fadeAmout; } } void loop() { Blink(); //1秒周期でLチカする Fading(); //なめらかなLED制御 }

さいごに

他にもあれば教えてください。