そろそろlittleBits Arduinoモジュール使用時のルールを決めて使いやすくしておくメモ

3つの入力・3つの出力があってPCやデバイスとやりとりできるlittleBits Arduinoモジュールも適材適所で魅力的だなと考えています。

というわけで、そろそろlittleBits Arduinoモジュール使用時のルールを決めて使いやすくしておこうというメモです。

目指す実装

今回は冒頭の写真の通り、Arduinoを中心に3つの入力はそれぞれボタン、3つの出力はLEDが反応になっています。

littlebits-arduino-module-my-rule002

このあたりlittleBitsは簡単に組めて楽しいです!

以下のような実装を目指します。

  • littleBits入力
    • littleBitsと接続できる3つの入力・3つの出力を利用しやすくする
    • 入力の値は数字1文字でシンプルにやりとりされる
    • ポートの番号に寄らず見た目の順番に合わせた数字でやりとりされる
    • 入力はスイッチのON/OFFの判定で受け入れる
  • デバイスとの連携と出力
    • デバイスから文字列1~3がくると値に応じたポートの出力に反映される
    • 出力は3秒間100%になった後、0%に戻るようにする
    • 出力もポートの番号に寄らず見た目の順番に合わせた数字でやりとりされる

色々情報を集める

SketchにおけるArduinoのピン番号おさらい

以前、littleBitsのArduinoモジュールのBlinkサンプルで変なハマり方をしたものの解決した話でポートの番号がどれかハマったのでおさらいしておきます。

以下のちょうどよい文献がありました。ありがたや。

Arduino At Heart littlebits Quick Start

こちらにあるように、

littlebits-arduino-module-my-rule003

  • INPUT
    • D0 → SketchにD0定数はないので0を指定
    • A0 → Sketchの定数A0を使う
    • A1 → Sketchの定数A1を使う
  • OUTPUT
    • D1 → ピン1を使う
    • D5 → ピン5を使う
    • D6 → ピン9を使う

となっています。

littleBits入力のスイッチ判定

littleBitsのArduinoモジュールのBlinkサンプルで変なハマり方をしたものの解決した話 | 1ft-seabass.jp.MEMO

で出力の経験はあるのですが、今回はスイッチの実装をしたいのでこちらの記事を参考に

Sketch 3 Advent Calendar 2014 7日目 〜ショートカットを楽に使いこなすために電子工作をしよう〜 – よりぶろ

以前の値を随時記録しつつ比較して、ON/OFFを判定します。

void loop() {
  // 入力の状態を取得
  int stateInputCurrent1 = digitalRead(portInputD0);
  int stateInputCurrent2 = digitalRead(portInputA0);
  int stateInputCurrent3 = digitalRead(portInputA1);
  // 入力の値の判定
  if ( (stateInputCurrent1 != stateInput1) && (stateInputCurrent1 == HIGH) ) {
    Serial.println(1);
    delay(100);
  }

出力は3秒間100%になった後、0%に戻るようにする

littleBitsのArduinoモジュールで入出力値を連携してLED点滅間隔を調整してみた | 1ft-seabass.jp.MEMO

で「出力は3秒間100%になった後、0%に戻るようにする」のイメージはつきます。

Serial.println("inputUSBByte 1");
digitalWrite(portOutputD1,HIGH);
delay(3000);
digitalWrite(portOutputD1,LOW);

デバイスから文字列1~3がくると値に応じたポートの出力に反映される

これはUSBで繋がっているデバイスから文字列を待ち、ポートの出力に連絡します。

以下の記事を参考にデバイスから来る値を受け取るようにします。

楽しいことをしたい: Socket.IOとNode.js、Node-serialport、それにArduinoを加えてスマホから家電のスイッチを制御する(3)

実際にはこのように書きました。

// USBから入ってくる値を監視(1文字)
if(Serial.available() > 0){
    inputUSBByte = Serial.read();
    if(inputUSBByte == '1'){
      Serial.println("inputUSBByte 1");
      digitalWrite(portOutputD1,HIGH);
      delay(3000);
      digitalWrite(portOutputD1,LOW);
    }

実際のソース

いろいろ調べたものを組み合わせてlittleBits用に値を整えて以下のようなコードに仕上げました。


// 入力ポート
int portInputD0 = 0;
int portInputA0 = A0;
int portInputA1 = A1;
// 出力ポート
int portOutputD1 = 1;
int portOutputD5 = 5;
int portOutputD9 = 9;
// 入力の状態記録
int stateInput1 = LOW;
int stateInput2 = LOW;
int stateInput3 = LOW;
// USBから入ってくる値
int inputUSBByte = 0;

void setup() {
  // 出力のピン
  pinMode(portOutputD1, OUTPUT);
  pinMode(portOutputD5, OUTPUT);
  pinMode(portOutputD9, OUTPUT);
  // 入力のピン
  pinMode(portInputD0, INPUT);
  pinMode(portInputA0, INPUT);
  pinMode(portInputA1, INPUT);
  
  Serial.begin(9600);
}

void loop() {
  // 入力の状態を取得
  int stateInputCurrent1 = digitalRead(portInputD0);
  int stateInputCurrent2 = digitalRead(portInputA0);
  int stateInputCurrent3 = digitalRead(portInputA1);
  // 入力の値の判定
  if ( (stateInputCurrent1 != stateInput1) && (stateInputCurrent1 == HIGH) ) {
    Serial.println(1);
    delay(100);
  }
  
  if ( (stateInputCurrent2 != stateInput2) && (stateInputCurrent2 == HIGH) ) {
    Serial.println(2);
    delay(100);
  }
  
  if ( (stateInputCurrent3 != stateInput3) && (stateInputCurrent3 == HIGH) ) {
    Serial.println(3);
    delay(100);
  }
  // 入力の状態を次のループまで記憶
  stateInput1 = stateInputCurrent1;
  stateInput2 = stateInputCurrent2;
  stateInput3 = stateInputCurrent3;
  // USBから入ってくる値を監視(1文字)
  if(Serial.available() > 0){
      inputUSBByte = Serial.read();
      if(inputUSBByte == '1'){
        Serial.println("inputUSBByte 1");
        digitalWrite(portOutputD1,HIGH);
        delay(3000);
        digitalWrite(portOutputD1,LOW);
      }
      if(inputUSBByte == '2'){
        Serial.println("inputUSBByte 2");
        digitalWrite(portOutputD5,HIGH);
        delay(3000);
        digitalWrite(portOutputD5,LOW);
      }
      if(inputUSBByte == '3'){
        Serial.println("inputUSBByte 3");
        digitalWrite(portOutputD9,HIGH);
        delay(3000);
        digitalWrite(portOutputD9,LOW);
      }
  }
  // 基礎ループ
  delay(10);
}

動作チェック

今回はPCにつないでSketchのシリアルモニタを利用してテストしました。

このように上からボタンを押すと

入力

littlebits-arduino-module-my-rule004

上から順に1、2、3と出力されます。

littlebits-arduino-module-my-rule005

このような仕組みですね。

littlebits-arduino-module-my-rule010

デバイスから文字列を受け取り出力

シリアルモニタ上から1と文字列を送ると

littlebits-arduino-module-my-rule006

1に対応した一番上に出力されます。

littlebits-arduino-module-my-rule007

そして、出力直後、デバッグとしてArduinoから inputUSBByte 1 が返ってきます。

littlebits-arduino-module-my-rule008

2、3と値を変えると上から順に対応したところに出力されます。このような仕組みですね。

littlebits-arduino-module-my-rule009

うまくいきました。

おわりに

これを元にこれから試していきます。

littleBits Arduinoモジュール面白いですね。cloudBitと並んでlittleBitsの幅を広げるキーモジュールだと感じます。ArduinoはSketchサンプルも多く出来ることがいっぱいすぎて目移りしまくりなのですが、一旦、他と連携しやすいように汎用化出来たので、設計がシンプルに考えられそうです。

それでは、よきArduino & littleBits Lifeを!