ジェスチャーセンサAPDS-9960を使った話

 2年ちょっと前に買って、使えていなかったジェスチャーセンサーを使ってみました。

 ※この記事はこちらの記事を参考にしています。また、今回は秋月で売っているこちらのモジュールを使うことを前提にしています。


・配線
 このモジュールの動作電圧は3.0~3.6Vなので、絶対にArduinoの5V端子などから電源を供給せずに、3.3Vの電源を供給しましょう。

以下の端子同士をつなぎます。
LED -3.3V
VDD -3.3V
GND -GND
INT   -D2pin
SDA -A4pin
SCL -A5pin


・プログラム
"スケッチ"→"ライブラリをインクルード"→"ライブラリを管理"と進み、APDSと検索し下のライブラリをインクルードします。

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
uint8_t proximity_data = 0;

void setup() {

  // Set interrupt pin as input
  pinMode(2, INPUT_PULLUP);

  // Initialize Serial port
  Serial.begin(19200);

  // Initialize interrupt service routine
  attachInterrupt(0, interruptRoutine, FALLING);

  // Initialize APDS-9960 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

  // Start running the APDS-9960 gesture sensor engine
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
}

void loop() {
  if ( isr_flag == 1 ) {
    detachInterrupt(digitalPinToInterrupt(2));
    handleGesture();
    isr_flag = 0;
    attachInterrupt(digitalPinToInterrupt(2), interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
  if ( apds.isGestureAvailable() ) {
    Serial.print(apds.readGesture());
  }
}

・拡張
 参考元では、これをパソコンの画面上で表示するプログラムも公開されています。
 これはProcessingを使うもので、これはこのサイトからダウンロードし、zipファイルを解凍すると使えます。一応プログラムは以下の通りで動きます。
import processing.serial.*;

Serial port;
int val;
int x, y, dx, dy, c;

void setup() {
  size(800, 600);
  String arduinoPort = Serial.list()[1];
  port = new Serial(this, arduinoPort, 19200);
  background(0);
}

void draw() {
  val = 0;
  if ( port.available() > 0) {
    val = port.read();
    print(char(val));
    if (char(val) == '2') {
      x = -800; 
      y = 0;
      dx = 50; 
      dy = 0;
      c = 16;
      fill(255, 255, 0);
    } else if (char(val) == '1') {
      x = 800; 
      y = 0;
      dx = -50; 
      dy = 0;
      c = 16;
      fill(0, 0, 255);
    } else if (char(val) == '4') {
      x = 0; 
      y = -600;
      dx = 0; 
      dy = 40;
      c = 15;
      fill(255, 0, 0);
    } else if (char(val) == '3') {
      x = 0; 
      y = 600;
      dx = 0; 
      dy = -40;
      c = 15;
      fill(0, 255, 0);
    }
  }
  if (c-- > 0) {
    x = x + dx; 
    y = y + dy;
    rect(x, y, 800, 600);
  }
}


今回はこれまでです。それではまた今度。

シンセサイザーを作った話

  作っていたシンセサイザーもどきが完成したのでその報告を。

 今まで11回にわたって使う技術の紹介をしてきたのですが、それをひとまとめにしたものができました。
electronium_回路図

 左上から、発信回路、積分回路、分周回路、パスコン、ディレイ、左下に行って、オーバードライブ、動作確認LED、反転回路、加算回路、となっています。
 これを配線図にすると
electronium_プリント基板
 こうなりました。基板サイズはケースのサイズに合わせてあるので右側に余裕ができました。そのため拡張性が高くなっています。
 はんだ付け始めてからミスに気付いた部分が多々あるので、セラコンが一つ裏についていたりしますが気にしてはいけません。

 はんだ付けをすべて終わらせてケースに取り付けるとこのような感じになります。
前面

DSC01146
後面

DSC01147

 前面についているボリューム類はエフェクターのものです。また、背面から左側面に半田メッキ船がついており、これを触りながらセンサーに触れることで音を鳴らすことができます。

 基板にはピンソケットがついており、これをジャンパワイヤでつなぐことで音を変化させます。


 私はほとんど楽器を弾くことができないので演奏の動画は上げないでおきます。気が向いたら何か演奏してみようと思います。 
 
 今回はここまで、次はずっと作ると言っていて結局作っていないVVVFをそろそろちゃんと作りたいと思います。それではまた今度。

電子楽器を作りたい話⑪ 発信部

 今までだいぶ迷走していた発信回路ですが決まったのでの記事を書きました。

 まず、分周器を使っているので出力は矩形波なのが望ましいです。また、自分の中のこだわりとしてセンサーは押すのではなく触れるだけで反応してくれるものが好ましいです。
 以上のことから以下のようなシステムを採用することにしました。

humanR_回路図
 もはや回路図を乗せる必要があるのかわかりませんが、それぞれの抵抗のマイコン側に触れることでその端子の入力電圧を下げ反応させています。また、マイコンは前回作ったモノを使用することにします。
 また、プログラムはA0~A4で音階や変化記号を押し、D2~D9でド~ドまでの一オクターブを弾けるようにします。


 このシステムは分周器の記事を書く前にはできていたのですが、記事を書くのがなぜか遅くなってしまいました。例によって、新せさいあー本体はもうほぼ完成してるのですぐに記事を書きたいと思います。それではまた今度。

最小構成のArduinoの話

 以前にもArduinoの記事を書いたのですがわかりにくかったので、もう一回作る機会があったのでついでに記事にしました。

 ATMEGA 328PにArduinoを書き込む必要があるのですが、これは公式フォーラムにやり方が乗っている他、秋月では書き込んであるものがほとんど同じ値段で売っているため省略します。


・回路図

Arduino_回路図


 1ピンをスイッチでGNDに短絡させるとリセットされます。
 またこのままではプログラムの書き込みができないので、Arduinoの基板につけるか書き込み用の回路をつける必要があります。

 今回はここまでです。回路図を一から作り変えているので、これを見るだけでArduinoをわざわざ買わなくても使えるようになりました。それではまた今度。

電子楽器を作りたい話⑩ 加算回路

 今まで度々使っていて、前回にも話に出ていた加算回路を今回は扱いたいと思います。

 加算回路はその名の通り、入力を足し合わせその和を出力するものなのですが、回路は反転増幅回路にすごく似ています。
キャプチャ

 上の回路の通り、反転増幅回路を複数個束ねたもので、入力の数は2以上であればどのような個数でも使うことができます。
 出力は
 Vo=-{(R4/R1)V1+(R4/R2)V2+(R4/R3)}
となっており、入力を足し合わせる際の比率や出力の強さを簡単に変えることができます。

 今回はここまでです。いまだに全体の構成を考えていないので、加算回路マシマシの設計になるかもしれません。それではまた今度。

電子楽器を作りたい話⑨ 分周器

お久しぶりです。テストがあったり、春休みに入ったらやる気がなくなったりしたので更新が遅れました。
 今回は分周器を作りました。入力機器の方式については今迷走しているので前回でやった通りにはいかないと思いますが、今回も発振した後の処理の話です。

 どのような発信方法をとったにせよ、出力波は理想に近い正弦波や方形波です。そのような波はオシロスコープなどで波形を見るととてもきれいなのですが、音として聞くと味気ない感じがします(語彙力がないので自分で聞いてみてください)。そんな感覚的なものでなくとも、正弦波にしろ矩形波にしろエフェクターにかけたときに波形が変化しにくいのであまり好ましいものではありません。それなので、出力波を実際の音に近い波に変換してあげて、それをエフェクターに通すなりしたいと思いました。

 実際の音は、物凄く簡単に雑に言うと、sin波の合成で作ることができます。sin波は矩形波を積分すると作れるので、世の中のすべての音は理論上は矩形波だけで作ることができるはずです。まあもちろん簡単にできるわけないので、今回はそこまで大層なものは作らずに、n倍振動の波を合成することにします。

 周波数をn倍にする方法はよくわからないのですが、1/nにするのはそこそこ簡単です。カウンタというものがあり、これは大雑把に言うとn回入力すると1回出力をするというものでこれを使うと周波数を1/nにすることができ、これを分周器といいます。

キャプチャ
 これが今回実際に作った回路の波形で、緑色の入力波に対して青色の出力波の周波数が1/2になっていることがわかります。これを何回か繰り返してできた全部の波形を加算回路に通して出力させるといい感じの波形になります。

キャプチャ
 オリジナルの矩形波を1/2,1/4した合成波です。実際には素子のdelayなどによって変わりますが、ただの矩形波よりは複雑な波になります。

D1-2
 回路図はこの通りになります。LTspiceではPREとCLRがGNDに落ちてますが、今回使ったTC74HC74APをブレッドボード上で動かしたときは5Vに入れると動作しました。
 CLKに信号を入れると周波数が半分になりQから出てきます。

 これにオーバードライブをかけた波を撮影しようかと思いましたがうまく撮れませんでした。


 今回はこれまでです。だんだん全貌が見え始めてきたので頑張っていきたいです。それではまた今度。

電子楽器を作りたい話⑧ 自作のキーボード的な何か

 前にウィーンブリッジを使って正弦波を発信しましがいまいち使いづらいのと汎用性に欠ける気がしたので、今回はtone関数を使ってキーボードのようなものを作れるようにしました。

・構想
 鍵盤をたたくのもいいのですが、手を触れるだけで音程を決めたいと和えから思っていました。その結果、二連ボリュームの場所で音程を決められるウィーンブリッジを使っていたのですが、オンオフ制御が難しかったり、きれいな音程の音を出すのが難しかったり、様々な問題がありました。
 そこで、抵抗をVccからたくさん並べ、Vccにつながっている抵抗での電圧降下を測ればどこの抵抗がGNDに短絡しているのかがわかり、うまい具合にセンサーとして働くということはほとんどのアナログセンサーで使われています。
 それなので、自分の体をGNDにしてセンサーを作って見たところうまくいき、音を鳴らすことができました。

 ・回路
humanR_回路図
 ArduinoのGNDを自分の体に接触させ、sensor1~5を指で押さえるとA0の値が変わります。
キャプチャ1
 実際に測るとこのような感じで読み取ることができます。

・出力
 適当に閾値で分けてtoneで出力しました。そうすると、ド~ソまできちんと出力されました。


 今回は簡単にセンサー部分を作りました。この出力をいい感じにエフェクターなどに流すことができたらこの方式で作っていきたいと思います。
 また、もう一つ同じようなものを通ってそこでコードを決められるようにしたら面白いと思うので、それもやってみたいと思います。それではまた今度。

電子楽器を作りたい話⑦ ディレイ

 今回は、より音を自然にさせるためにエコーをかけるようなエフェクターを作りました。期末テストが差し迫っていますが気にしてはいけません。

・ディレイとは
 「エコー」と「ディレイ」という似たようなエフェクターがあり、どちらも音を反響したようにさせるものらしいく、使うICも同じなのですが、「ディレイ」のほうが反響するまでの時間が短いらしいのでそちらを作りました。

・回路図
 調べた回路図でも作ってみたのですが一回しか響かなかったので、データシートに載っている回路をチョコっとアレンジして作りました。
delay_回路図
 データシートに載っている回路ではギターを弾いた瞬間の音が聞こえず反響も少なく感じたので、inputとoutputを1μFのキャパシタでつなぎました。これによって、ギターの音が直接聞こえるようになり、またフィードバックが返ってくるようになったので何回も反響するようになりました。

 
 少しノイズがある気がしますが、ハウリングして大きくなったりはしないのであまり関係ないところで発生してるものだと思います。あと、toneがないのですが、あまり自分が感じ取れないのと他のところにはついているのでいいかなと思い省いています。
 今回はここまでです。次回は引く際のスイッチ周りの回路のことを書こうと思います。それではまた今度。

電子楽器を作りたい話⑥ スピーカー

 スピーカーを作りたくなったので作りました。

・用意
 回路とスピーカーを入れる容器を用意します。
PVQJ3543

 スピーカー本体にも音をよくする効果がありますが、今回はそんなことを考えずに作るので、家にあった箱にしました。

 スピーカーは千石で安く売っているものにしました。
HGDB4467

 音は可もなく不可もなく。高音と低音が出にくい気がしますが、小さくて安いものなのでこんなもんでしょう。


・回路

speeker_回路図
 回路はこのようになっており、の回路をつなげた形になっています。


・完成品

INPD6420

 完成品はこのようなものになりました。もとになった箱から、ボリュームと電源と入力が出ています。ポイントはUSB入出力だという点ですが、画像や回路図からは一切伝わりません。また、パソコンのUSBとミニプラグを使っての動作はできません(仮想GNDを使っているため)。


 今回はここまでです。次回はロシアンブルーディレイを作るか、楽器本体の制作に入っていきたいと思います。それではまた今度。

電子楽器を作りたい話⑤ 仮想GND2 レールスプリッタ

 あけましておめでとうございます。今年も去年と同じくまったりいろいろなことをやっていきます。

 さて今回は、仮想GNDを作る方法の一つである「レールスプリッタ」を使う方法を紹介したいと思います。
 以前の記事で紹介した方法でもできるのですが、今回の方法のほうが安定します。


rail~

 このような感じで使うことができます。
 キャパシタの値は大きいと、大きな電流を取り出すことができます。

 レールスプリッタは、手軽に使えるので便利だと思います。

 今回はここまでです。スピーカーを今作っているので、次回はスピーカーの記事を書きたいです。それではまた今度。
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

読者登録
LINE読者登録QRコード