nüno ver.2 TINYキットを使ってみよう


キットの確認

※この記事では@nanbuwksさんのArduino互換機、
「AKBONE2020」を使用して作例を作っています。
「AKBONE2020」を使用されない方は各自お持ちのマイコンで読み替えて使用してください。

AKBONE2020の使用方法については AKBONE2020 (Ver.20210114) ではんだづけをはじめよう を参考にしてください。

キット同梱物一覧


- フレキシブル基板
- リジット基板
- GROVEケーブル
- ブリッジ
- 導電布
- スナップボタン(8組)

6種類の部品が揃っているか確認します
※リジット基板のGROVE端子の写真は縦型ですが、横型になっている場合があります

フレキシブル基板と導電布を接続する

導電布には予め基準となる穴が8つ開けられています

この穴にスナップボタンを嵌めていきます

スナップボタンは、凸側、凹側の2つのパーツで1組になっています。

凸側と凹側を分けて、導電布にあらかめ空いている穴に凸側の突起部分をさしこみます。
はめ込んだ状態のオモテ面

はめこんだ状態のウラ面

この状態で、上側からフレキシブル基板の穴にも、スナップボタンの凸側突起部分をさしこみます。

このときのフレキシブル基板の向きは、白い面が上面となり、フレキシブル基板の7つある切れ込みが、導電布の端に近くなるようにしてください

差し込んだ後、スナップボタンの凹側を上からはめ込めればこの端子は接続できました。

同じように残りの7箇所も接続します

フレキシブル基板とリジット基板を接続

フレキシブル基板の端子部分を、リジット基板のコネクタに接続します。
リジット基板のコネクタの黒いパーツの両端をつかんでゆっくり引き出します。
強く引っ張りすぎると、黒いパーツが抜けてしまうので注意してください。

黒いパーツを引き出した状態

黒いパーツを引き出した状態で、リジット基板を裏返しにして、コネクタが下側になるようにします

リジット基板の引き出した黒いパーツと白いパーツの間にフレキシブル基板を差し込みます。

差し込んだ状態で、引き出した黒いパーツを押し込んで元に戻します。

押し込む際にフレキシブル基板がずれないように注意してください。
これでフレキシブル基板とリジット基板の接続ができました。

GROVEケーブルを接続

GROVEケーブルをAKBONE(Arduino)に接続します。

Arduinoのサンプルプログラム1

PCとAKBONEを接続してArdinoを立ち上げます。
このプロジェクト用のディレクトリに新規ファイルを作成します。

ここで、nünoをArduinoで使用するためにMTCH6102用のライブラリをインクルードします。
MTCH6102のライブラリは下記のファイルから持ってきます。

上記からダウンロードしたファイルの中にある
Arduino/mtch6102_proof_of_concept/ ディレクトリから
- MTCH6102.cpp
- MTCH6102.h
の2ファイルを先程作成したディレクトリに入れます。
ディレクトリに入れたら、一度このプロジェクトのArduinoのウィンドウを閉じてください。
再度開いた時に、MTCH6102.cpp、MTCH6102.hの2ファイルがタブで開かれていたらOKです。

この状態でサンプルプログラムを実行します。
1つめのサンプルプログラムは下記になります。

#include "MTCH6102.h"
#define ADDR 0x25

MTCH6102 mtch = MTCH6102();

const int len = 8;//感知ポイント数
void setup() {
  Serial.begin(115200);

  mtch.begin(ADDR);
  delay(100);
  mtch.writeRegister(MTCH6102_NUMBEROFXCHANNELS, 0x07);
  mtch.writeRegister(MTCH6102_NUMBEROFYCHANNELS, 0x03);//最低3点必要なため
  mtch.writeRegister(MTCH6102_MODE, MTCH6102_MODE_FULL);
  delay(500);
}


void loop() {

  byte data;
  int sensVals[len];
  for (int i = 0; i < len; i++) {
    data = mtch.readRegister(MTCH6102_SENSORVALUE_RX0 + i);
    sensVals[i] = data;
    Serial.print(data);
    Serial.print(",");
  }
  Serial.println("");

  delay(1000);
}

このサンプルが実行できたらシリアルモニタ、シリアルプロッタを開いてみてください。
タッチするごとに値が変化しているのが確認できます。

Arduinoのサンプルプログラム2

2つめのサンプルプログラムです。
AKBONE2020のneopixelをタッチ位置に応じて光らせます。

#include "MTCH6102.h"
#define ADDR 0x25

//neopixel
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN        8 // On Trinket or Gemma, suggest changing this to 1
#define NUMPIXELS 8 // Popular NeoPixel ring size
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels

MTCH6102 mtch = MTCH6102();

const int len = 8;//感知ポイント数

void setup() {
  Serial.begin(115200);

  mtch.begin(ADDR);
  delay(100);
  mtch.writeRegister(MTCH6102_NUMBEROFXCHANNELS, 0x07);
  mtch.writeRegister(MTCH6102_NUMBEROFYCHANNELS, 0x03);//最低3点必要なため
  mtch.writeRegister(MTCH6102_MODE, MTCH6102_MODE_FULL);
  delay(500);

  //neopixel
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)

}


void loop() {

  pixels.clear(); // Set all pixel colors to 'off'

  byte data;
  int sensVals[len];
  for (int i = 0; i < len; i++) {
    data = mtch.readRegister(MTCH6102_SENSORVALUE_RX0 + i);
    sensVals[i] = data;
    Serial.print(data);
    Serial.print(",");

    if (data > 50) {
      pixels.setPixelColor(i, pixels.Color(0, 10, 0));
    }
  }
  Serial.println();

  pixels.show();   // Send the updated pixel colors to the hardware.

  delay(1000);
}

Arduinoのサンプルプログラム3

3つめのサンプルプログラムです。
2つめのLEDに加え、8点ある静電容量タッチポイントのうち、1つでもしきい値(50)
を超えたポイントがあれば圧電スピーカーから音がなります。

#include "MTCH6102.h"

#define ADDR 0x25

//neopixel
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN        8 // On Trinket or Gemma, suggest changing this to 1
#define NUMPIXELS 8 // Popular NeoPixel ring size
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels

//speaker
#define SPIN A1

MTCH6102 mtch = MTCH6102();

const int len = 8;//感知ポイント数
bool sound = false;

void setup() {
  Serial.begin(115200);

  mtch.begin(ADDR);
  delay(100);
  mtch.writeRegister(MTCH6102_NUMBEROFXCHANNELS, 0x07);
  mtch.writeRegister(MTCH6102_NUMBEROFYCHANNELS, 0x03);//最低3点必要なため
  mtch.writeRegister(MTCH6102_MODE, MTCH6102_MODE_FULL);
  delay(500);

  //neopixel
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)

  //speaker
  tone(SPIN, 440);
  delay(500);
  noTone(SPIN);
}


void loop() {

  pixels.clear(); // Set all pixel colors to 'off'

  sound = false;
  byte data;
  int sensVals[len];
  for (int i = 0; i < len; i++) {
    data = mtch.readRegister(MTCH6102_SENSORVALUE_RX0 + i);
    sensVals[i] = data;
    Serial.print(data);
    Serial.print(",");
    if (data > 150) {
      pixels.setPixelColor(i, pixels.Color(0, 10, 0));
      sound = true;
    }
    if(sound){
      tone(SPIN, 440);
    }else{
      noTone(SPIN);
    }
  }
  Serial.println();


  pixels.show();   // Send the updated pixel colors to the hardware.

  delay(1000);
}

以上です!

さらに自分でカスタマイズしてみましょう。

また
- 専用ケース
- ボタンホック(凹側)がついたフレキシブル基板の保護カバー
- ボタンホック(凸側)がついた導電布
がついたnüno ver.2モジュールをお求めの方はこちらの公式サイトからご連絡ください。