ロジック系モジュールをArduinoモジュールでも表現する

せいごです。littleBitsアドベントカレンダー1日目です。はじまりました！！

littleBitsのラインナップにはEXPANSION PACKSという、あるテーマに沿って揃えられた拡張パックなるものがありまして、KITのように色々遊べる用途とはちょっと方向性の違ったものがあります。

その中で、回路の理論を学べる<a href="http://jp.littlebits.com/expansion-packs/logic/" target="_blank">LOGIC EXPANSION PACKS</a>というものがありまして、実は買ってみたもののうまく扱えていなかったので、ロジック系モジュールをArduinoモジュールでも表現して学んでみることにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/9ecb84d6-a9ed-dbf7-2f44-5a30a0a2f75d.png)

この試みはArduinoモジュールで同様の動きを再現することに注力しております。

## Arduinoモジュールまわりの用意

まず、準備。

* ボタンモジュール x 2
* BAR GRAPHモジュール
* Arduinoモジュール
* USB POWERモジュール

Arduinoモジュールにボタンを2つ装着します。上部のd0/rxとなっているところは、 `digitalRead(0);` で、下部のa1となっているところは `digitalRead(A1)` で値を取得します。今回はON/OFFをとるだけなのでdigitalReadでやります。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/b3497e17-e741-963f-c3f6-1b4496e50e61.png)

実際にこれでなにかが起こるわけではないですが取得のコードとしては以下となります。

```c:littleBits_LOGIC_basic.ino
void setup() {
  pinMode(0,INPUT);
  pinMode(A1,INPUT);
  pinMode(5,OUTPUT);
}

void loop() {
  // 入力を取得
  int inputA = digitalRead(0);
  int inputB = digitalRead(A1);
}
```

BAR GRAPHモジュールはd5と書かれているポートにつなぎます。

詳しいArduinoモジュールの動作が気になる方は、私の記事 <a href="https://cdn.liginc.co.jp/wp-content/uploads/2016/02/littlebits-arduino-vol1_7.png" target="_blank">littleBitsのArduinoモジュールで簡単にプログラミングをはじめてみよう </a> をご参考下さい。

## double AND

入力が両方ONだと出力が動作するONでモジュール。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/55e85c6e-db70-29bf-78c2-591f78cd91e0.png)

<a href="http://e-words.jp/w/%E8%AB%96%E7%90%86%E7%A9%8D.html" target="_blank">論理積とは｜AND － 意味 / 定義 / 解説 / 説明 ： IT用語辞典</a>

| 入力A | 入力B | 出力 |
|:----:|:----:|:----:|
|-|-|-|
|ON|-|-|
|-|ON|-|
|ON|ON|ON|

Arduinoモジュールのコードは以下のようにすることで同様の動作をさせることができました。

```c:littleBits_LOGIC_doubleAND.ino
void setup() {
  pinMode(0,INPUT);
  pinMode(A1,INPUT);
  pinMode(5,OUTPUT);
}

void loop() {
  // 入力を取得
  int inputA = digitalRead(0);
  int inputB = digitalRead(A1);
  // LOGIC
  if(inputA && inputB){
    digitalWrite(5,HIGH);
  } else {
    digitalWrite(5,LOW);
  }
}
```

## double OR

入力がどちらか片方ONであれば出力がONで動作するモジュール。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/e092cc0b-ea22-58a2-4130-2fad2d58f2aa.png)

<a href="http://e-words.jp/w/%E8%AB%96%E7%90%86%E5%92%8C.html" target="_blank">論理和とは｜OR － 意味 / 定義 / 解説 / 説明 ： IT用語辞典</a>

| 入力A | 入力B | 出力 |
|:----:|:----:|:----:|
|-|-|-|
|ON|-|ON|
|-|ON|ON|
|ON|ON|ON|

Arduinoモジュールのコードは以下のようにすることで同様の動作をさせることができました。

```c:littleBits_LOGIC_doubleOR.ino
void setup() {
  pinMode(0,INPUT);
  pinMode(A1,INPUT);
  pinMode(5,OUTPUT);
}

void loop() {
  // 入力を取得
  int inputA = digitalRead(0);
  int inputB = digitalRead(A1);
  // LOGIC
  if(inputA || inputB){
    digitalWrite(5,HIGH);
  } else {
    digitalWrite(5,LOW);
  }
}
```

## XOR

2つの入力のどちらか片方がONだと出力がONで動作するモジュール。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/befc1d99-ccc7-0fd8-0a89-348ef779fef8.png)

<a href="http://e-words.jp/w/XOR.html" target="_blank">XORとは｜排他的論理和｜EOR｜EX-OR｜eXclusive OR － 意味 / 定義 / 解説 / 説明 ： IT用語辞典</a>

| 入力A | 入力B | 出力 |
|:----:|:----:|:----:|
|-|-|-|
|ON|-|ON|
|-|ON|ON|
|ON|ON|-|

Arduinoモジュールのコードは以下のようにすることで同様の動作をさせることができました。

```c:littleBits_LOGIC_XOR.ino
void setup() {
  pinMode(0,INPUT);
  pinMode(A1,INPUT);
  pinMode(5,OUTPUT);
}

void loop() {
  // 入力を取得
  int inputA = digitalRead(0);
  int inputB = digitalRead(A1);
  // LOGIC
  if(inputA != inputB){
    digitalWrite(5,HIGH);
  } else {
    digitalWrite(5,LOW);
  }
}
```

## NAND

2つの入力にOFFが含まれていると出力がONで動作するモジュール。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/85e13129-6ae0-acbd-f85a-f56bdcfa49f1.png)

<a href="http://e-words.jp/w/NAND.html" target="_blank">NANDとは｜否定論理積｜Not AND － 意味 / 定義 / 解説 / 説明 ： IT用語辞典</a>

| 入力A | 入力B | 出力 |
|:----:|:----:|:----:|
|-|-|ON|
|ON|-|ON|
|-|ON|ON|
|ON|ON|-|

Arduinoモジュールのコードは以下のようにすることで同様の動作をさせることができました。

```c:NAND
void setup() {
  pinMode(0,INPUT);
  pinMode(A1,INPUT);
  pinMode(5,OUTPUT);
}

void loop() {
  // 入力を取得
  int inputA = digitalRead(0);
  int inputB = digitalRead(A1);
  // LOGIC
  if(inputA == 0 || inputB == 0 ){
    digitalWrite(5,HIGH);
  } else {
    digitalWrite(5,LOW);
  }
}
```

## NOR

2つの入力が両方OFFだと出力がONで動作するモジュール。

![image](https://qiita-image-store.s3.amazonaws.com/0/56170/b8b1eb84-1ee2-6abe-75f3-6791b17e2312.png)

<a href="http://e-words.jp/w/NOR.html" target="_blank">NORとは｜否定論理和｜Not OR － 意味 / 定義 / 解説 / 説明 ： IT用語辞典</a>

| 入力A | 入力B | 出力 |
|:----:|:----:|:----:|
|-|-|ON|
|ON|-|-|
|-|ON|-|
|ON|ON|-|

Arduinoモジュールのコードは以下のようにすることで同様の動作をさせることができました。

```c:littleBits_LOGIC_NOR.ino
void setup() {
  pinMode(0,INPUT);
  pinMode(A1,INPUT);
  pinMode(5,OUTPUT);
}

void loop() {
  // 入力を取得
  int inputA = digitalRead(0);
  int inputB = digitalRead(A1);
  // LOGIC
  if(inputA == 0 && inputB == 0 ){
    digitalWrite(5,HIGH);
  } else {
    digitalWrite(5,LOW);
  }
}
```

## やってみて

実際のハードの動作から、あえてプログラムで再度起こす感覚は思ったより楽しかった。単純な動きでも、同様にコピーできると達成感がありますね！

ビット演算子でもっとロジックに則して作る方法も考えたけど、今回は動作を似せる重視でやってみました。それはそれで今度やってみたい。

このような感じでいろいろな形でlittleBitsのことを掘り下げて話していきましょう！littleBitsアドベントカレンダースタートです！

みなさんよろしくお願いしますー！