Archives

NeoPixel系のRGB LEDがたくさんあるので調べてみた

NeoPixelってなんですか

Adafruitが販売している、シリアル通信でRGB値が制御できるLEDのこと。ここではトップ画像にあるような、マイコンを内蔵したRGB LEDチップについて述べる。厳密にはNeoPixelとはこれらマイコン付RGB LEDを総称したadafruitの商品シリーズ名である。

NeoPixelの歴史

小型のマイコン内蔵RGB LEDが出てきてからの歴史は以下の感じ。

  1. WS2812時代: 元祖NeoPixel? 6つのピンのうち5つを使用し、LED用のpowerとcircuit用のpowerが分かれていた。
  2. WS2812B時代: powerが1つに統合されて4ピンに。
  3. SKの登場: WS2812BのクローンであるSK6812が登場。製造元が違うと思われるがどちらもNeoPixelとして公式に販売されており同じ明るさ、色、プロトコルで動作する。
  4. DotStarの登場: 新たな商品ラインナップとして高リフレッシュレートのDotStarシリーズが登場。チップ型番が”APA”からはじまる。

販売店や製造元

選び方

POV[Persistent Of Vision] に使うのならばDotStar、それ以外ならNeoPixelで一番手に入りやすいWS2812B、SK6812が良い。adafruitの公式ショップで買うとめちゃくちゃに高いが、Aliexpress等で半額以下で手に入る。秋月とかLEDピカリ館でも売っている。

参考: NeoPixel vs DotStar

https://learn.adafruit.com/adafruit-dotstar-leds/overview#dotstars-vs-neopixels

NeoPixelsの方が安いし扱いやすくform-factorも多様なので、POV(persistence-of-vision)のように高リフレッシュが必要とか、割り込みが必要な処理の中で使ってるとかでない限りNeoPixelで良いっぽい。

参考: 各製品の特徴

1. WS2812(元祖NeoPixel?)

6つのピンのうち5つを使用し、LED用のpowerとcircuit用のpowerが分かれていた。
コレ以前の世代(WS2802)は5mm×5mmより大きいledしかなかったもよう。

2. WS281X, SK681X系(WS2812BやSK6812等、最もよく知られたNeoPixel)

WS2812からpowerが1つに統合されて4ピンになった。
XT1511というクローンもあるようだがその詳細はよくわからん。
WS281X系はマイナーアップデート版( http://www.instructables.com/id/Compare-SK6822-WS2813-APA102-SK9822/step2/WS2813-and-SK6822-LED/ )らしいがあまり手にはいらないので、大量に使いたい場合はWS2812BかSK6812に限る。

重さ

http://www.akiba-led.jp/product/1499
この防水stripを5LED分切り出してみると、1.07g。防水ビニルを剥がすと0.43g。

SK6812MINI

通常のNeoPixelは5mm×5mmだが、こちらは3.5mm×3.5mm。サイズがシビアな場合に。

https://cdn-shop.adafruit.com/product-files/2686/SK6812MINI_REV.01-1-2.pdf

ちなみに香港国際空港には全面LEDサイネージとなっている柱がある。液晶と比べてフチがないのですごく目を惹くが、このディスプレイに使われてるLEDは2mm-3mm角だった。どこで手に入るのだろう。

3. WS2822, SK6822 (進化版だが流通量が少ない)

各LEDにIDを振ることで1つのLEDが壊れてもstripの後ろが消えることがなくなった。しかしIDを送ったりするためピンは6本に戻った。WS2822は特にあまり出回っていない。

シリアルLED(WS2822S)をつかってみました。

100円でarduinoが買えた(送料別。互換機だけど)

arduino取り回しは良いけど安くはなくて、ちょっとしたプロトタイピングごとにずっと使うってことができない。

家にあるarduinoの数が限られてるので、以前のプロジェクトで作ったものを泣く泣く次のプロジェクトに転用したりすることになる。

で、amazon探してたらなんか桁数のおかしいものが見つかった

Vershipってストアから買うとなんと1個100円。思わず5個買ってしまった。

送料は全商品にかかってしまうらしく、総額2200円。それでも1個440円。牛丼かよ

IMG_1313のコピー

1個1個真空パックに入ったうえで箱に入っており、良い感じ。ピンは割りとななめだけど。さすがに中華製格安arduino互換機といったところ。

あとmicroではなくmini usbで、usbシリアルドライバもなんかCH340Gというのを使っているらしくドライバインストールが必要。(macの場合は下記URLからダウンロードしてインストール)

http://www.wch.cn/download/CH341SER_MAC_ZIP.html

それでも許せてしまう値段はすばらしい。

IoTの正体

新しい喧騒を発明した者ではなく、新しい価値を発明した者のまわりを、世界はめぐる。世界はめぐる、音もなく、しずかに。

いさぎよく認めるがいい。お前の喧騒と煙がおさまれば、ほとんど何も起こっていないではないか。ひとつの都市が廃墟となり、ひとつの柱像が泥のなかに転がったからといって、それが何だ。

—- 『ツァラトゥストラかく語りき 』より

IoTだM2Mだと言われてるが良くわからん。バズワードなのは良いとして、その背後で起きている価値の変化はなんだろうか。例えばDeep Learningの背後では、特徴抽出の自動化というパラダイムシフトがあった。IoTの背後にあるものはなにか。

ちょっと冷静に考えるとわかるが、インターネットに繋がる意味のあるモノと、無いものがある。冷蔵庫は繋がる価値がありそうだが、髭剃りはあんまり価値が無さそうだ。これらの違いは、保有する情報の量(冷蔵庫 > 髭剃り)のみならず、そのモノが実現している機能にも関係がある。冷蔵庫は分散化することでコンビニに限りなく近づいていくし、買い足すことで拡張可能だ。

分散化や、拡張。このように、PCやスマホのインターネット端末としての特徴を抽象化したものこそ、モノがインターネットに繋がった時に得られる価値を支えているはずだ。それらは以下の3つのabilityであると僕は考える:

  1. Adressable:
    • Internetを通じて各機器にアクセス可能であること
  2. Programmable:
    • 挙動をユーザーのプログラムによって制御可能であること
    • 公開APIまたは、ファイルフォーマットをオープンにしておくこと
  3. Scalable:
    • そのHardwareの提供する最も大事なValueが、クラスターとなることで強化されること

TCP/IPによって端末に一意にアクセスでき、挙動をプログラム可能となったことで情報・計算の共有・分散が可能になったことが、インターネット端末の起こした革命の背後にある機能だ。

非線形な情報の結合によるハイパーメディアのように、モノが非線形な結合によって個の総和を超えた価値を持つこと。それが今までにない価値となる可能性がある。安易だが、上記の3機能を持つモノを、Hyper Hardwareと呼びたい。PCやスマホはHyper Hardwareである。(スマホがProgrammableかというと少し怪しいが。)ルンバはAdressableではないし、scalabilityをあまり考慮されていない(Programmableであることでこれらを解決する可能性はある)。

そうすると、Hyper Hardwareはまだ生まれていないことがわかる。IoTが良くわからないというのも、価値を持った製品(Hyper Hardware)が登場していないからなのかもしれない。

 

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

前回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を制御するのをやってみたいと思います。いつになるやら。

 

トライアック万能調光器キットを組み立てる

毎年妙に気温が高い時期があると思ったら夏というものらしい。

(ここ数日は涼しいからちょっとアレだけど)それにしても暑い。暑いから扇風機をつけて寝る。風邪をひく。なんだこれは。いい加減にしてほしい。

そもそもうちの扇風機には「リズム」というものが無い。程よい涼しげなビートを刻むことができるのは富裕層に限られるのだ。

というわけでリズム機能を作っていきましょう。最終的な目標は、androidからなんかステキなムニャムニャを使って燃え尽きるほどヒートな夏に冷静と情熱のあいだを刻みつけてやれ爽快!です。

まずはコンセントからの電流を制御するものが必要です。以前『電子工作の素』という本に載っている万能調光器を作って、出来たはいいが調光できず投げ出した結果、調光しようとしていたのは蛍光灯だった、というなんとも恥ずかしい事件がありましたが、やはりコンセントからのAC100Vを扱う以上、ちゃんとしたものを使ったほうがいいということで、秋月の「トライアック万能調光器キット」に頼ることにしました。

トライアック万能調光器キット(20Aタイプ)

実はこのキットだけですべてオッケーというわけではなく、これに加えてコンセント、プラグ、コード、スイッチなどが必要です。たぶんほんとはヒューズもいるんだけどまあ知らん。あと画像には写ってないけどトライアック用の放熱器。

Camera 360

 

回路部分をはんだづけし終わるとこんな感じになります。

無題画像_062413_031428_AM

 

カッコの中は回路図中の記号です。小さい順にはんだづけすると捗ります。この中ではダイオードだけが極性があるので、銀の帯のある方向と基盤に描いてある矢印の向かう先を合わせることに注意です。

もういっこ余ったバリスタはコンセントに並列に接続します。

Camera 360

 

あとの注意点とかはこのブログ記事を見るといいんじゃないかと思います。

あとはプラグとコンセント、ボリュームを回路につなげば完成です。Camera 360

僕はボリュームにつないだ導線が太すぎて回路の穴を通らなかったので裏側からつなぎました。

無題画像_062413_033143_AM

 

これで手動での電流制御はできるようになりました。このままでは危険なので、なんかいいケースを探して入れて下さい。

次はarduinoでの制御の予定です。

 

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というのを発見した。

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

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

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

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