Archives

フォトリフレクタで指動作認識できなかった

前回arduinoにつないでprocessingで値を読み取るまでをやったフォトリフレクタですが、これで指の動作認識ができないかと考えました。

指を伸ばした時と曲げた時とでは皮の厚みが異なるので、透過率の違いとして認識できませんかねということです。

1 ページ

 

そんでまあ、結果としてはできませんでした。何故かというと、指の皮は思ったより厚くて、伸ばした状態でもフォトリフレクタの値はかなり低いままだったからです。

Camera 360

 

しくみは単純で、指サックにフォトリフレクタを取り付けただけ。

Camera 360

 

それでも悔しいのでなんかできないかと探してたらこんなのがありました。

この方法ではフォトリフレクタを皮膚を離しておいて、リングを指に押し付けたときに指との距離の変化の度合いを見て指の柔らかさを認識する、ということが行われているようです。

今度はJST ERATOの五十嵐健夫先生のプロジェクトであった伸縮性認識でも試しにやってみよう…
MetaSkin: 薄くて伸縮性のある皮膚のようなインタフェース

arduinoでフォトリフレクタTPR-105を使って得た値をprocessingで読み取る

フォトリフレクタは回路が2つついてて、1つはLED、もう1つはフォトトランジスタ(照度で抵抗値が変化する素子)になっている。電気を流すことで反射光の照度を抵抗値として取得することができる装置である。安くてっちゃいのを秋月電子で探してみるとTPR-105があった。

フォトリフレクタ(反射タイプ) TPR-105: 半導体 秋月電子通商 電子部品 ネット通販

TPR-105_dim

角が欠けてる方がLED。LEDは1から2に電流を流す。フォトトランジスタは3から4に電流を流して電流値を見る。データシートによるとLEDの方は20mAなので5Vから引っ張って抵抗は250Ωがないので220Ωで。フォトトランジスタの方は同じく5Vでやると1MΩで割といい感じになった。

TPR-105F_ブレッドボード

 

これをシリアル通信で送ってprocessingで表示したい。

arduinoの方のコードは超シンプル。

void setup () {
  Serial.begin(9600);
}

void loop () {
  Serial.write(analogRead(A1));
}

processing側。

import processing.serial.*;
Serial port;
PFont ricty;
int[] y;
int   x;
int   val;
int   size;
int   time;

void setup() {
  size(1000, 600);
  port = new Serial(this, "SERIAL_PORT_PATH", 9600);
  size = width/2;
  x = 0;
  y = new int[size];
  val = 0;
  time = 0;
  ricty = loadFont("Ricty-Regular-24.vlw"); // ここはお好みで
  textFont(ricty, 24);
  smooth();
}

void draw() {
  for (int i=0; i<size-1; ++i) y[i] = y[i+1];
  y[size-1] = int(map(val, 0, 255, -height, height));

  // frame
  background(40);
  stroke(#999999);
  strokeWeight(1);
  line(0, height/2, width, height/2);
  line(0, height/4, width, height/4);
  line(0, 3*height/4, width, 3*height/4);
  line(width-time%(width/2), 0, width-time%(width/2), height);
  line(width/2-time%(width/2), 0, width/2-time%(width/2), height);
  if (time % (width/2) == 0) time = 0;
  fill(40, 100);
  rect(0, 0, width, height);

  fill(220);
  text(val, 10, 35);

  stroke(#eebbcc);
  strokeWeight(2);
  for (int i=0; i<size; ++i) {
    point(i, -y[i]/3+height/2);
  }

  ++time;
}

void serialEvent(Serial p) {
  val = port.read();
}

シリアル通信で得た値をオシロスコープ風に点のプロットで 表示する。配列yにsizeまでの数の過去の値を保存しておいて、それを更新していくという感じ。フォトリフレクタに手を近づけたり離したりすると以下のようになる。

スクリーンショット_2014-01-06_3_06_18-4

フォトリフレクタ自体はライントレースとかに使えるようなのでこれからいろいろやってみる。

arduinoで植物と話したい

我が家には友人からもらった大事な幸福の木[Massangeana]があります。5年も一つ屋根の下で暮らしてきたのだからそろそろ会話とかできてもいいんじゃないかな。

田中浩也さんの研究室でそういう研究があることを以前から知っていました。

植物をインターフェースとしたデジタルメディア開発

植物の生体電位を計測することで、植物が環境に対してどのように反応するのかを明らかにする研究です。

生体電位とは、 「生体の生命維持活動に関わる情報伝達によって生じる電気信号」ですって。なにそれこわい。

『植物生体電位とコミュニケーション』という本によれば、日光やらに対して反応する細胞膜中の受容たんぱく質がというのがあって、それが反応すると例えばH+やらのイオンを細胞膜外に運び出す程度の能力「H+ポンプ」が発動し、細胞膜内の電位が変化する。そして、細胞同士はシンプラスト構造というやつで電気的につながっているので、冒険野郎膜外バーは連鎖していくようです。

これは「環境応答」というやつで、他にも植物の代謝にともなう電位の変化とかもあります。

つまり、植物生体電位を計測出来れば、「澄ました顔してても電位は正直だなァ(ゲス顔)」みたいな感じで、植物と少しだけ仲良くなれるかもしれません。ちなみに植物生体電位の研究は以前からあるんですが、前述の田中浩也研究室の研究は「良い電位の計測場所」に関して特許を取得してて、OH…さすがKEIO…という気持ちになったことは秘密です。

さて、ではどうやって生体電位を測るのかですが、もっとも良い方法はガラス微小電極にようにものすごく細かい電極を使って細胞膜の内外にダイレクトアタックすることです。しかしもちろんそんな技術はありません。もうひとつの方法は、とにかく植物に電極をブッ挿したり、葉の両側を皿型電極で挟むことです(葉面電位と呼ばれます)。精度は格段に落ちますが、非破壊で生育しながらの計測が容易であることから、こうした計測も行われているようです。

偶然家にアルミ板があったのでそれを導線にビニールテープでくっつけて、電位をarduinoのアナログ入力で測りましょう。そして、できるだけ高い精度で計測をしたいので、オペアンプを使って入力を増幅しています。あと同時に生育環境についてのデータもほしいので、温度・湿度・明るさを計測しています。

オペアンプは京都のマルツパーツ館で、湿度・温度センサーは千石電商のWEBショップ(http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-04YE)で、Cdsセルは「Arduinoをはじめようキット」についてきたものを使っています。つなぎ方は、DHT22は

DHT22 / RHT03 | hirooka.pro
デジタル 温度&湿度センサー SHT11・DHT22 を制御する
Cdsセルは

Arduinoから光センサを使って明るさの検出 | 初心者だけど、一歩ずつ Arduino 超小型マイコン電子工作
を参考にしました。オペアンプは、『電子工作の素』を読んでつなぎました。「非反転増幅回路」というやつです。ググればきっと出てきますが、オペアンプでの出力が、入力の1+R2/R1倍になります。オペアンプ無しで数日間計測した結果、5Vを1023として、大体最高でも350ぐらいの電位しか計測されなかったので、電位を3倍にするためにR1:R2 = 1:2にしています。10nFのコンデンサはパスコンといって、ノイズに対するクッションのようなものです。

葉面にはこんなふうにしてアルミ板をくっつけてます。

裏側。

5秒ごとにデータを計測、arduinoからシリアル通信で出力して、パソコン側で受けます。パソコン側ではPythonで、pyserialというライブラリを使ってデータを受け取って、CSVで保存しています。Pythonは便利で、1日たったら新しいファイルに書き込み始めるということができます。コードはgithubで。

しかしこれで何が出来るかというと結構微妙です。オペアンプ追加前のログでは雷の日に異常値を計測したりして(たぶん落雷があった)、おおすげぇとはなったのですが。部屋の温度・湿度・明るさのログの方が将来的に役立ちそうな気がします。

Arduinoで扇風機のリズム機能を作る

 

さて、この前の記事で秋月の調光キットを組み立てたのですが、今回はそれをarduinoで制御して扇風機のリズム機能を作ります。

さて、ではボリュームを繋がないでおいた調光キットがこちらにあります。

Camera 360

ちなみに前回つくったやつは百均で買った容器に入れてはんだゴテ用になりました。

http://instagram.com/p/bI8JpAjZQ7/

ではどうやって抵抗値を制御するのかというと、アナログフォトカプラというやつをつかいます。以下の記事を参考にしました。

Arduinoで扇風機を制御 – チラシ裏日記上等!!

アナログフォトカプラは、普通はフォトダイオードとLEDを組み合わせたもので、光の強さに応じてフォトダイオードに電流が流れるというものですが、今回は抵抗を制御したいので、上記の記事と同様にCdS+LEDのフォトカプラを使います。これによって入力電流に応じた抵抗値を得ることができます。

CdS+LED アナログ・フォトカプラ MI0202CL

これをArduinoのアナログピンからの出力で制御するというわけです。

簡単ですけど繋ぎ方とコードは以下。

fan_control_ブレッドボード-2

/*** analogue sin out ***/

const int OUT_PIN = 3;
const int CYCLE   = 15;

float mapf(float x, float a, float b, float c, float d) {
    return (d - c) * (x - a) / (b - a) + c;
}

void setup() {
}

void loop() {
  // calcurate current phase in interval CYCLE
  float rasian = (2 * PI * millis() / 1000.0) / CYCLE;

  if(sin(rasian) < 0) rasian = 1.5 * PI;

  // write as 0-255
  analogWrite( OUT_PIN, mapf(sin(rasian), -1, 1, 0, 255) );
}

最初はサイン関数でいけるかなーと思ったんですが、それだと電気が弱い時間が短すぎてそれっぽくなかったので、サイン関数がマイナスの間は抵抗マックスにしています。周期は15秒ぐらいがそれっぽいです。

これで風邪の心配はなくなったわけですが、まだなんかイケてる感じではないので、次はandroidからarduinoを制御するのをやってみたいと思います。いつになるやら。

 

右を向けば3Dモデルも右を向く「右ならえコントローラ」をArduino+XBee+openFrameworksでつくってみた

Camera 360

 

autodesk-123d-352

ただし魔法は尻から出る(つまり完成度は高くない)。

ありがちな発想をArduinoで形にしてみようと思います。イメージとしてはAutodesk社の3Dモデラーの右上に鎮座する四角いナタデココ野郎でありまして、こいつを前に向けるとPC内の3Dモデルも前を向き、右を向けと言えば右を向く、そういう「右ならえコントローラ」を作りたいと思います(分かりにくい)。右の画像はAutodesk 123Dです。

 

できました。

あんまりうまくないですね!

いちおうコントローラの向きに従ってます・・・。XBeeの通信にインターバルがあるのが最大のネックなのですが、なんでなんだろうか(上手くいくときもある)。

詳細はもうちょいどうにかしてから書きたいと思います。

「ワクワクワークショップ~五徳バー LED シールドを作って Arduino でお得に遊ぼう!」@はんだづけカフェに行ってきました

Camera 360

14日の日曜日にはんだづけカフェにて「ワクワクワークショップ~五徳バー LED シールドを作って Arduino でお得に遊ぼう!」に参加して来ました。

初はんだづけカフェ、というか初3331でもあってので、ちょっとワクワクでした。

Camera 360内容は、最初の画像にあるような、加速度センサー・温度センサー・可変抵抗・LEDバー・スピーカー・タクトスイッチをセットにしたArduino用シールドを作る、というもので、午前中ははんだ付け(3時間ぐらい)、午後は各センサの使い方の講習とサンプルスケッチを試す、というものでした。


やっぱりハードウェアは実際に作っている人の声を聞いて自分でやってみるのが学習方法として最も手っ取り早いな、と感じました。講義資料も頂いて、個人的にはかなり満足でした。

ちなみに一番すげーと思ったのは、加速度センサーを使った、振ると文字が出るスケッチでした。最初に考えた人すげーと思いました。

2013-04-15 23.28.13

 

arduino unoでビデオ出力:TVout Library

ずっと前にヤフオクで2つ3000円ぐらいで購入していたカーナビ用TFT液晶があったので、arduinoから映像を出力してみた。

まず液晶自体に仕様書がないので困ったが、それっぽいのを見つけた。

http://blog.drive-world.com/content/?226.html

不思議な日本語を操る業者である。

12Vで良さそうなのでACアダプタと黄色いビデオ端子(RCAプラグ)を買って切ってそれぞれ繋ぐ。試しにwiiの画面を出力してみた。

ぉぉおおなんかスゲーなオイ!て感じです。ただ画面が変わっただけなんだけど。

で、こういうときはarduino pongというゲームをやるのが定石らしいので、

とかを参考にしてやってみる。

できなかった。なんか信号が上手いこと送れてないみたい。

タイミングがちょっとでもずれると認識してくれないらしい。

もうちょっと調べてみると、Arduino TVout Libraryというのを発見した。

こういうのがちゃんと作られてるってのがいいですねー。

これを参考にしてやってみると、今度は映った! 

画面の中の智代ちゃんも喜んでます。

エミュレータがあればゲームボーイとかつくれそうですね!

arduino unoを電池で動かす

ほとんどこの記事と同じなんですけどね

秋月の昇圧型DC-DCコンバータを使って単三電池2つでarduinoを動かします。

単三電池1.5V × 2 = 3.0Vを5.0Vに引き上げてます。

リンク先はarduino fioっぽいんですけど、素人の僕はarduino unoです。

なのでDCプラグを買ってarduinoのDCジャックに接続しました。

あらかじめExample SketchのBlinkWithoutDelayをアップロードしています。

内蔵のLEDが点いてるのがおわかりいただけただろうか・・・

これで一応動くんですが、よく調べてみるとarduino unoの外部電源の推奨電圧は7~12Vのようです

建築発明工作ゼミ2008: Arduino基盤の概要

動作が不安定になるかもしれないということですがまあそんときはそんときで