Arduinoに関するその他の情報

Arduino

本編では扱いきれなかった機能や情報を取り上げていきます。

レベルメータ

可変抵抗器(つまみ)の物理量を液晶に表示します。ここでは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はハードウェアとソフトウェアの知識両方が必要になるので、学ぶことが多いと思います。

実際にコードを書いて動かすのが一番の近道なので、ぜひたくさんコードを書きましょう!