本編では扱いきれなかった機能や情報を取り上げていきます。
レベルメータ
可変抵抗器(つまみ)の物理量を液晶に表示します。ここではanalogRead関数とmap関数を使います。
analogRead関数は読みたいピンの番号のデータを0から1023までの整数値を返します。
analogRead(pin);
analogRead(ピン番号);
map関数は値域を変換することができます。今回は1024段階の値域を8段階にします。
map(value, fromLow, fromHigh, toLow, toHigh);
map(参照する値, 参照する値の最小値, 参照する値の最高値, 変換後の最小値, 変換後の最大値);
サンプルコードの#を埋めてみましょう。
#include <Wire.h>
#include <FaBoLCDmini_AQM0802A.h>
FaBoLCDmini_AQM0802A lcd; // LCDライブラリを初期化
void setup() {
lcd.begin();
}
void loop() {
lcd.clear(); // LCD画面を消去
int bar = ############################# // VOLの値域を0~7に変換
for (#################) {
lcd.write(0xfc); // 「>>」の数でレベル表示
}
delay(100);
}
今回は液晶の画面を変化させるコードですが、LEDの明るさやブザーの音量でも使えます。
#include <Wire.h>
#include <FaBoLCDmini_AQM0802A.h>
FaBoLCDmini_AQM0802A lcd; // LCDライブラリを初期化
void setup()
{
lcd.begin();
}
void loop()
{
lcd.clear(); // LCD画面を消去
int bar = map(analogRead(A0);, 0, 1023, 0, 7); // VOLの値域を0~7に変換
for (int i = 0; i <= bar; i++)
{
lcd.write(0xfc); // 「>>」の数でレベル表示
}
delay(100);
}
仮想マウス
Arduinoでマウスカーソルを動かすことが可能です。サンプルコードでは押したボタンに応じてマウスカーソルが移動します。
#include "Mouse.h"
const int upButton = 5;
int range = 5;
int responseDelay = 10;
void setup() {
pinMode(upButton, INPUT_PULLUP);
Mouse.begin(); // Initialize mouse control
}
void loop() {
int upState = digitalRead(upButton);
int downState = HIGH;
int rightState = HIGH;
int leftState = HIGH;
int clickState = HIGH;
int val = analogRead(A2);
if (val < 300) {
downState = LOW;
} else if (val < 700) {
leftState = LOW;
} else if (val < 1000) {
rightState = LOW;
}
int xDistance = (leftState - rightState) * range;
int yDistance = (upState - downState) * range;
if ((xDistance != 0) || (yDistance != 0)) {
Mouse.move(xDistance, yDistance, 0); // Move the mouse cursor
}
delay(responseDelay);
}
さらに詳しい内容はこちらのリファレンスで確認できます。
Mouse - Arduino Reference
The Arduino programming language Reference, organized into Functions, Variable and Constant, and Structure keywords.
チャタリング
制御信号が急激にオン/オフを切り替えたり、急速に変化したりする現象です。この現象に由来する不具合や誤作動のことも指します。
シリアルモニタ
高度なプログラミングになると、変数の値がどうなっているかなど、知りたい情報が増えていきます。
C言語やPythonならprint、JavaScripならconsole.logなどを使うことで画面に値を表示するように、ArduinoもSerial.printlnで画面に値を表示できます。
void setup()
{
// SW1(5番ピン)を入力に設定する
pinMode(5, INPUT_PULLUP);
// シリアル通信を有効にする
Serial.begin(9600);
}
void loop()
{
char buf[32];
static unsigned long count = 0;
// SW1の状態を読み取る
int nRet = digitalRead(5);
sprintf(buf, "08lu,%s", count, nRet ? "HIGH" : "LOW");
// PCへデータを送信
Serial.println(buf);
count++;
}
まとめ
以上が本編から漏れた内容でした。Arduinoはハードウェアとソフトウェアの知識両方が必要になるので、学ぶことが多いと思います。
実際にコードを書いて動かすのが一番の近道なので、ぜひたくさんコードを書きましょう!