ノクターンでLチカ

投稿日:

 いやもう、「オッサンとバイエル、ピアノ等」って銘打ってて、長らくなかったこのネタ。ええ、ピアノですよ、ピアノ。

「Arduinoをピアノにつなぎたいッ!」

……すなわちコレである。Arduinoをピアノにつなぎ、LEDをピアノ演奏に合わせて明滅させようというものだ。

 いまや遅しとやってみた。

ノクターンでLチカ

 一つ覚えみたいにノクターンで申し訳ないですが(笑)、すんませんレパートリーがあんまりないもんで。

IMG_3276

 アナログピンからピアノの音声出力を読み、それに合わせてTLC5940NTに接続されたLEDを適宜明滅させるわけである。いかにもピアノ風味に明滅させるにあたっては、乱数によるLED選択と、先日会得した「PWMを十分に使い、余韻をもって各LEDを徐々に消す」という技を遺憾なく使用した。

 これをやるには、アナログピンに上手に音声を入れる必要がある。

 こういう時、電圧レベルを知るのにオシロスコープなどが使えればいいのだが、残念ながら持っていない。そこで、あらかじめテスターのACでテレビ、ラジオ、自分のピアノなどの音声出力端子からだいたいのレベルを推定し、次に十分な抵抗を入れて、Arduinoのアナログピンに入力して読み取った。その結果、だいたい200mVの振幅程度であることがわかった。これならばArduinoに直接入れてもどうということはなさそうだ。ただし、レベルが小さいから、ソフトウェアのほうでうまくやる必要がある。

 次に、音声はアナログ信号だから、プラス・マイナスに振れる。一方、Arduinoのアナログ入力は0~5Vの間を1024分割で読むのだから、ここをうまく工夫しなければならない。

 まず、2.5Vを中心に電圧が振れるよう、2.5Vを生成して合成する。ちょうどTLC5940NTを動かすために5Vの3端子レギュレータを使っているので、ここから抵抗分圧で2.5Vを作り、それを合成する。合成するとき、出力側の音声端子に電流が流れ込んではまずいから、コンデンサを0.1μFばかりつける。周波数は見当がつくが、電圧の見当がつきにくいので、とりあえず0.1μFにして、出来が悪いようなら取り換えることにする。

 まず、大して疑問もない簡素な付加回路。たしか、パルス技術ではこういうの、「クランパ」って言ったっけな……。

音声入力のためのクランパ
「voice2tlc」の回路図

 それで、TLCなどと一緒にLEDを植え込む。

IMG_3273

 ミニジャックを接続するために、秋月電子の「ステレオミニジャックDIP化キット」を取り付けた。

ミニジャックの部分
IMG_3274

 で、スケッチはこうなった。

//
//  voice2tlc.ino
//    アナログピンに音声を入れ、TLC5940NTを使ってLEDを光らせる。
//    27.08.13(木)1000~
//    佐藤俊夫
//
#include "Tlc5940.h"
#include <stdio.h>
//
const int
  AUDIO = 0, //  アナログ0ピン
  THRESH = 8;  //  8単位以上のレベルならLEDを点灯
//
void setup() {
  Tlc.init();
  Tlc.clear();
  Tlc.update();
}

void loop() {
  int v = 0, l = 0;
  static long int prevtime = 0.0;
  static int prevv = 0;
  v = abs(analogRead(AUDIO) - 512);
  l = constrain(fmap(v, 0, 15, 0, 4095), 0, 4095);
  if(millis() >= prevtime + 10){
    prevtime = millis();
    for(int i = 0; i <= 15; i++){
      Tlc.set(i, Tlc.get(i) * 0.9);
    }
  }
  for(int i = 0; i <= 15; i++){
    if(random(0, 16) == 1 && prevv != v && v >= THRESH){
      Tlc.set(i, l);
    }
  }
  Tlc.update();
  prevv = v;
}
//
float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
  //  もともとの「map()」がlong int型でこの用途に合わないので、float型を定義
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

お稽古2

投稿日:

 7セグLEDの稽古をする。

 先日の稽古では、TLC5940NTで7セグLEDに数字を表示させる方法はわかったが、いまいちブレッドボードが乱雑で汚かった。

乱雑で汚いブレッドボード
IMG_3240

 そこで、なんとかこれを美しくする配置があるはずだ、と脳漿を絞った。

 いろいろとやったが、結局、「LEDの一番若いピンをTLC5940NTの一番若いピンに、残りのピンも同様に順番に」というような「論理的に美しい配置」だと、「物理的に汚く」なることがわかった。

 そこで、論理上のピン配置は多少前後しても、とにかく作動し、逆に物理的にはシンプルで美しく、誤りも見つけやすいという配置を追及したところ、このような配置・配線になった。

できる限り美しくした
IMG_3264

 なかなかシンメトリックで綺麗な配置になったと思う。誤りも見つけやすい。そのかわり、LEDの1・2・3・4番はそれぞれTLCの1・0・7・6番、……と言った具合に、ピンとピンとの対照関係は複雑になった。これはソフトウェアで吸収することになる。配列などでマッピングすると良いのだろう。

とにかく目一杯

投稿日:

 実用的なモノというとネット便器ぐらいしか作らず、Lチカばかりやっている今日この頃であるが、Lチカは楽しいので仕方がない。というか、「ネット便器のどこが実用的なのか?」というツッコミに極めて脆弱な文章をついつい書いてしまっているところもなかなか痛いが、さておき、昼間の「亀の子ブレボー」に、いつぞや大量生産したビーズ付きLEDを目一杯大量に植え込み、TLC5940NTでゴンゴンドライブしてみた。

 前回TLC5940NTを使ったときは、単純に右から左へ光るだけだったが、今度と言う今度は、もう、今思いつくだけあらん限りいろんな光らせ方をさせてみた。

 亀の子ブレッドボードは、なかなか省スペースで、うまく組み付けられる。

TLC5940NTを亀の子ブレボー(笑)に設置した状況
IMG_3259

 LEDをタップリ植え込むとこうなる。

IMG_3261

 動かすとこんな感じだ。

 スケッチはこうなった。はじめはタクトスイッチで手動切り替えをしていたが、面倒臭くなり、乱数で切り替えるようにした。

//
//  tlcVariation.ino
//    TLC5940NTにつないだLED、ランダムにいろんな光らせ方をしてみる。
//    27.08.11(火) 1515~
//    佐藤俊夫
//
#include "Tlc5940.h"
//
const int switchInterval = 5000;
//
void setup() {
  Tlc.init();
  Tlc.clear();
  Tlc.update();
}
//
void loop() {
  static int mode = 0;
  static long int prevtime = 0;
  if(millis() > prevtime + switchInterval){
    mode = random(0, 8);
    prevtime = millis();
    //  今のエフェクトを徐々に消す。
    int maxlum = 0;
    do{
      maxlum = 0;
      for(int i = 0; i <= 15; i++){
        Tlc.set(i, Tlc.get(i) * 0.9);
        maxlum = Tlc.get(i) > maxlum ? Tlc.get(i) : maxlum;
      }
      Tlc.update();
      delay(20);
    }while(maxlum > 0);
  }
  switch(mode){
    case 0:
      sinCurve_diff();
      break;
    case 1:
      inOrder_left();
      break;
    case 2:
      toCenter();
      break;
    case 3:
      inOrder_tail();
      break;
    case 4:
      left_right();
      break;
    case 5:
      left_right_tail();
      break;
    case 6:
      allAtOnce_tail();
      break;
    case 7:
      inOrder_right();
      break;
    default:
      sinCurve_diff();
      break;
  }
}
//
void inOrder_right(){
  //  0.1秒おきに右から切り替えていく。
  static long int prevtime = 0.0;
  static int led = 15;
  Tlc.clear();
  if(millis() >= prevtime + 100){
    Tlc.clear();
    Tlc.set(led--, 4095);
    led = led < 0 ? 15 : led;
    Tlc.update();
    prevtime = millis();
  }
}
//
void allAtOnce_tail(){
  //  一斉に点灯して徐々に消える。
  static long int prevtime = 0;
  if(millis() > prevtime + 100){
    prevtime = millis();
    if(Tlc.get(0) <= 0){
      for(int i = 0; i <= 15; i++){
        Tlc.set(i, 4095);
      }
    }else{
      for(int i = 0; i <= 15; i++){
        Tlc.set(i, Tlc.get(i) * 0.8);
      }
    }
    Tlc.update();
  }
}
    
//
void left_right_tail(){
  //  尾を引きながら右へ行ったり左へ行ったり。
  static long int prevtime = 0.0;
  static int led = 0, order = 1;
  if(millis() >= prevtime + 100){
    for(int i = 0; i <= 15; i++){
      Tlc.set(i, (int)((float)Tlc.get(i) * 0.5));
    }
    led = led + order;
    Tlc.set(led, 4095);
    order = (led >= 15) || (led <= 0) ? order * -1 : order;
    Tlc.update();
    prevtime = millis();
  }
}
//
void left_right(){
  //  右へ行ったり左へ行ったり
  static long int prevtime = 0.0;
  static int led = 0, order = 1;
  if(millis() >= prevtime + 100){
    Tlc.clear();
    led = led + order;
    Tlc.set(led, 4095);
    order = (led >= 15) || (led <= 0) ? order * -1 : order;
    Tlc.update();
    prevtime = millis();
  }
}
//
void inOrder_tail(){
  //  尾を引きながら0.1秒おきに左から切り替えていく。
  static long int prevtime = 0.0;
  static int led = 0;
  if(millis() >= prevtime + 100){
    for(int i = 0; i <= 15; i++){
      Tlc.set(i, (int)((float)Tlc.get(i) * 0.5));
    }
    Tlc.set(led++, 4095);
    led = led > 15 ? 0 : led;
    Tlc.update();
    prevtime = millis();
  }
}
//
void toCenter(){
  //  中央付近のLEDから外へ光らせる。
  static long int prevtime = 0.0;
  static int ledleft = 7, ledright = 8;
  if(millis() >= prevtime + 100){
    for(int i = 0; i <= 15; i++){
      Tlc.set(i, (int)((float)Tlc.get(i) * 0.5));
    }
    Tlc.set(ledright++, 4095);
    Tlc.set(ledleft--,  4095);
    ledright = ledright > 15 ? 8 : ledright;
    ledleft = ledleft < 0 ? 7 : ledleft;
    Tlc.update();
    prevtime = millis();
  }
  
}
//
void inOrder_left(){
  //  0.1秒おきに切り替えていく。
  static long int prevtime = 0.0;
  static int led = 0;
  Tlc.clear();
  if(millis() >= prevtime + 100){
    Tlc.clear();
    Tlc.set(led++, 4095);
    led = led > 15 ? 0 : led;
    Tlc.update();
    prevtime = millis();
  }
}
//
void sinCurve_diff(){
  //  呼ぶたびにサインカーブをちょっとづつずらしながら光らせる。
  static float x[16] = {
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
  };
  for(int i = 0; i <= 15; i++){
    x[i] = x[i] >= (2.0 * PI) ? 0.0 : x[i] + ((2.0 * PI) / 1000.0) * (1.0 + (float)i / 10.0);
    Tlc.set(i, (int)(((sin(x[i]) + 1.0) / 2.0) * 4095));
  }
  Tlc.update();
}

ブレボー亀の子

投稿日:

 ブレッドボードに小さいプロトタイプを作るとき、この「プロトタイピングシールド」も捨てがたい。だが、しばらく使ってみての感想なのだが、小さくて不便だ。また、電源ラインもどうも使いづらい。シールド上の赤ソケットには実は5Vは到達していないので、自分で配線しなければならないのだ。

便利だが、小さいところが難
IMG_3031

 と言って、大きい方だと、Arduinoに重ねるわけにもいかず、昨日のようになってしまう。

たかが7セグLED2個のためにゴチャつくブレッドボード(笑)
IMG_3240

 何かいいことないかな、と思ってネットを漁っていたら、ある方がブレッドボードの脇に直接Arduino用のピンヘッダを接着剤で取り付けて、目的を達成しておられるのを見つけた。ほほー、なるほどなるほど……。

 つまり、大抵のブレッドボードは、同じメーカーの物なら、こういうふうに脇を取り外したり組み合わせたりできるのだが、電源ラインを一つ外すと、Arduinoの上下のピン幅とピッタリなのである。

IMG_3252
IMG_3253

 チナミに、このようにバラしたり組み合わせたりするには、ブレッドボード裏の両面テープの、つけ外しする部分をカッターナイフでスーッと切ると良い。

 しかし、接着剤でピンソケットを付けてしまう、てのも、なあ……。他のことにブレッドボードが使えなくなってしまうし……。

 で、考えてみたら、私は次の写真のようなArduino用のプラスチックケースを使っているが……

IMG_3254

……この上に電源ラインを一本外したブレッドボードを亀の子にし、輪ゴムか何かで縛っておけば、目的は達成できるではないか。

IMG_3255

 どうして今までこうしなかったかと言うと、そのままだとプラスチックケースの上下に細く開けてあるピンソケットにアクセスするためのスリットがふさがり、Arduinoから信号線が出せないからである。しかし、電源ラインを外すと、上下ともちょうどピッタリ、スリットが隠れずにすむのだ。

 ほうほう、なるほど、というわけで、この前作ったビーズのLEDなど植えてみる。Arduinoの「Arduino AT HEART♥」みたいな感じで、ハートですな、男のくせにw。

IMG_3256

 動かすとこんな感じ。

 このLチカはシンプルで、スケッチはこう。

//
//  differSin.ino
//    サインカーブをちょっとづつずらしてLチカ
//    佐藤俊夫
//    27.08.11(火) 1100~
//    
void setup() {
  pinMode( 9, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {
  static float x1 = 0.0, x2 = 0.0;
  x1 = x1 > (2.0 * PI) ? 0.0 : x1 + (2.0 * PI / 1000.0);
  x2 = x2 > (2.0 * PI) ? 0.0 : x2 + (2.0 * PI / 1100.0);
  analogWrite( 9, (int)((sin(x1) + 1) * 128));
  analogWrite(10, (int)((sin(x2) + 1) * 128));
  delay(2);
}

 そう言えば、以前、「なんとっ!Arduinoって3項演算子ないのかッ!?」「ううっ、あったらなあ」などと書いたことがあったが、これは早とちりで、私の間違い。ちゃんとありました。上記スケッチでご覧のとおり(苦笑)

2桁順番

投稿日:

 次に、TLC5940NTを使って、数字をちゃんと表示させる。

 前と同じ回路で、スケッチは次のようにする。

//
//  tlc594027segmentLED.ino
//    7セグメントLEDをTLC5940NTで制御
//    27.08.10(月)1800~
//    佐藤俊夫
//
#include "Tlc5940.h"
//
void setup()
{
  Tlc.init();
}

void loop()
{
  Tlc.clear();
  static int n = 0;
  disp7LED(n++);
  if(n >= 100) n = 0;
  delay(1000);
}
//
void disp7LED(int n){
  const int on = 4095, off = 0;
  const int pat[10][8] = {
    // 0    1    2    3    4    5    6    7pin   num
    { on,  on,  on, off,  on,  on,  on, off},  //  0
    {off, off,  on, off,  on, off, off, off},  //  1
    { on,  on, off, off,  on,  on, off,  on},  //  2
    {off,  on,  on, off,  on,  on, off,  on},  //  3
    {off, off,  on, off,  on, off,  on,  on},  //  4
    {off,  on,  on, off, off,  on,  on,  on},  //  5
    { on,  on,  on, off, off,  on,  on,  on},  //  6
    {off, off,  on, off,  on,  on,  on, off},  //  7
    { on,  on,  on, off,  on,  on,  on,  on},  //  8
    {off,  on,  on, off,  on,  on,  on,  on}   //  9
  };
  //  一旦消す
  Tlc.clear();
  //  10の位
  int n10 = n / 10, i = 0;
  for(i = 0; i <= 7; i++){
    Tlc.set(i, pat[n10][i]);
  }
  // 1の位
  int n1 = n % 10;
  for(i = 0; i <= 7; i++){
    Tlc.set(i + 8, pat[n1][i]);
  }
  Tlc.update();    
}

 次のようにカウントアップしていく。

 そういえば昔の刑事ドラマなんかで、時限爆弾のカウントって、こんな感じで、電線がゴチャゴチャしてたっけなあ。ふふっ、爆発しそうだな、これじゃ(笑)。

次に2桁を

投稿日:

 7セグメントLEDの1桁の制御の基礎がわかったので、今度は2桁だ。

 当然、ArduinoのI/Oはこれでは足りない。

 したがって、ドライバICを使う。この前買ったテキサス・インスツルメントの定番IC、「TLC5940NT」を使うのである。秋葉原千石電商で390円だ。

IMG_3240

 16本のカソードを全部ICに入れてあるので、配線はだいぶゴチャつく。ブレッドボードも2連結だ。

 この配線は、ArduinoのTLC5940用ライブラリをインストールすると使えるようになるサンプルスケッチ「BasicUse」のコメントの冒頭にアスキーアートで詳しく図示されている。

 とりあえず、この「BasicUse.ino」を動かしてみた。次のようになって面白い。

 

お稽古

投稿日:

 7セグメントLEDのお稽古をする。意味のあるなしはどうだってよろしい。レッツゴー。

 私は古株ぶっているが、実は若い頃に7セグLEDを扱ったことがない。子供の頃の電子工作はもっぱらラジオなどのトランジスタ回路、長じてからは仕事関係で5極真空管やマイクロ波の発振管などを扱っていた。

 数値表示のためには、その頃の仕事関係では「ニキシー管」という数値表示のための真空管を扱っていた。これは放電管で、数字の形をした陰極が赤く光るものだ。

 そういうわけで、7セグLEDを知らないのである。いや、無論、当時から7セグメントLEDは世の中にあったが、私の職場が特殊だったのである。

 で、これが昨日秋月電子八潮店で買ってきた、1個60円の7セグLEDである。

IMG_3234
IMG_3236
OSL10561-IRA

 さて、まずは点灯からだ。データシートから、抵抗と電流っ。

 各素子I_F = 20mA, V_F = 2.1V……とあるから、V_0 = 5Vとして、

I_R = \frac{V_0 - V_F}{I_F} = \frac{5 - 2.1}{20mA} = 181.25\Omega

……まず、200Ωばかりつけておいてやればよいのだろう。この前買った集合抵抗の手持ち、8素子9ピンで330Ωのがあるから、それを付ければ多少暗いが10mA前後で光るだろう。

 さっそく、全点灯で光らせてみよう。単に電源をくれてやって、抵抗に結線するだけだ。

7セグLED全点灯
回路図

 光らせてみると、計算上の抵抗の倍近い抵抗値なのに、なかなかどうして、結構明るく光る。

IMG_3237
単純全点灯で光らせてみたところ

 次に、Arduinoをつないで、数字を表示させる。全点灯で電流を測ってみると67mAほど流れているので、電源はこのまま別建てのほうがいいだろう。

 アノードコモンのLEDであるから、カソード側で制御しなければならない。集合抵抗では一本づつ制御できないので、330Ωの電流制御抵抗をバラで8本とりつける。それぞれの足をArduinoのデジタル2ピンから9ピンまで取り付ける。

 スケッチをこう書く。点灯のパターンは配列に書くのが手早いだろう。

//
//  7segmentLED_1.ino
//    7セグメントLEDを1個動かす。
//    27.08.10(月) 1300~
//    佐藤俊夫
//
//    LED「OSL10561-IRA」
//    LED 1 -> Digital 2
//    LED 2 -> Digital 3
//    LED 4 -> Digital 4
//    LED 5 -> Digital 5
//    LED 6 -> Digital 9
//    LED 7 -> Digital 8
//    LED 9 -> Digital 7
//    LED10 -> Digital 6
//
void setup() {
  for(int i = 2; i <= 9; i++){
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for(int i = 0; i <= 9; i++){
    lighting(i);
    delay(1000);
  }
}

void lighting(int n){
  const int pat[10][8] = {
    { LOW,  LOW,  LOW, HIGH, HIGH,  LOW,  LOW,  LOW},  //  0
    {HIGH, HIGH,  LOW, HIGH, HIGH, HIGH, HIGH,  LOW},  //  1
    { LOW,  LOW, HIGH, HIGH,  LOW, HIGH,  LOW,  LOW},  //  2
    {HIGH,  LOW,  LOW, HIGH,  LOW, HIGH,  LOW,  LOW},  //  3
    {HIGH, HIGH,  LOW, HIGH,  LOW,  LOW, HIGH,  LOW},  //  4
    {HIGH,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW, HIGH},  //  5
    { LOW,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW, HIGH},  //  6
    {HIGH, HIGH,  LOW, HIGH, HIGH,  LOW,  LOW,  LOW},  //  7
    { LOW,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW,  LOW},  //  8
    {HIGH,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW,  LOW}   //  9
  };
  int i = 0;
  for(i = 0; i <= 7; i++){
    digitalWrite(i + 2, HIGH);
  }
  for(int i = 0; i <= 7; i++){
    digitalWrite(i + 2, pat[n][i]);
  }
}

 アノードコモンなので、論理は負論理だ。

 Arduinoとブレッドボードをこういうふうにする。

IMG_3238

 動かすと、ゆっくりカウントアップする。

暑熱をばひとつ

投稿日:

 黙々と呟き続ける我が作品、「ネット便器」である。いや、便器そのものを作ったのはINAX社であるから、私の作品と言うこともあるまいが、まあ、こんな下品かつ無意味なものを作ることができるのもDIY、というかMAKERS精神なればこそ、である。

ツイートする私の作品「ネット便器」(笑)

 ちなみに、こういう手作りは、数年前からDIYとは言わず、Makersムーブメントと言うようになったのだそうな。DIYとの違いは、ざっくり言えばネットのあるなしである。

 それにしても、暑い。暑熱である。秋とは暦ばかり、なんて暑いんだ。

 私の家には温度計がないのだが、今日のような折ふし、たまさかには室温が知りたくもなる。知ったところで「うわっ32度だってよ余計に暑くなったゾなんてこったいッ!」などとうわ言のようにうそぶきつつ興奮する以外にないのだが、それでもやっぱり知りたいのである。

 エアコンのリモコンに設定温度とは別に温度計がついており、一応それで用は足りているのだが、1℃単位のザックリした温度計なので、不満である。

 こんなこともあろうかと、私こと佐藤は常々周到怠りない。我が作品「ネット便器」は、気温をツイートできるのだ!!トイレに行き、便器のフタを開け閉めしてから部屋に戻り、ツイッターを見ると、自宅の気温がだいたいわかるわけである。おお、なんとスンバラシイ。Arduino万歳。とっとと内紛やめて楽しくやろうぜベイベー!!

 ……。

 めんどくさい。

 だいたい、気温ぐらいその場でわかるようにすべきではなかったのか。便器のフタを開け閉めしてツイッター見なきゃ気温が分からん家なんて、どうなっとるんだ一体ッ!?。ネット便器の本体に気温を表示すべきだ!!っていうか、なんで便所で気温を測らねばならんのだ!!

 というわけで、発作的に自宅を飛び出し、向かったのは八潮の秋月電子である。

 「どうして近所の100円ショップで温度計を買わんのだ?」という愚問は禁止の方向でお願いしたい。

 秋葉原に行けばよいのだが、自宅からは八潮の秋月電子のほうが近いのである。それに、秋葉原の秋月電子は、人でごった返して足の踏み場がなく、店頭で品定めをする余裕が全くない。八潮の秋月電子は空いているので、店内でのんべんだらりとデータブックを読みながら部品を選ぶことも可能である。

 目当ては、日立「HD44780」という液晶ドライバの、互換ICを搭載した液晶ディスプレイである。大概の液晶ディスプレイは、この30年も前に開発された名作IC互換になっているのである。

 他に、7セグメントLEDで気温を表示させることも考えたが、実は思いのほか、Arduinoでの表示に限っては液晶ディスプレイのほうがラクなのだ。7セグメントLEDは簡素なだけに意外に奥が深く、多くの桁を表示させるためのダイナミック点灯やその明るさ補償、足りない電流を他の電源から持って来るなど、やることが多い。

 さて、秋月電子八潮店である。

 店内にはズラリと液晶ディスプレイが並んでいる。手ごろなところで、バックライト付きの液晶ディスプレイ、「SD1602 HUOB-XA」という型番のものを購入した。900円。

 他に、後で遊ぶためにアノードコモンの7セグメントLEDを買う。これは例の「TLC5940NT」に接続して遊ぶのである。ひとつ60円。

 それから、切らしてしまったQIコネクタのピン端子も買う。シースが見当たらないので、店員さんに「これのシースありませんか」と聞くと、ハウジングのことですか?この端子にはハウジングみたいなものはありませんよ、と答えるではないか。うーん。秋葉原の千石電商なら、左奥の抽斗にザクザク入っているのだが、どうも、八潮の秋月電子にはないらしい。というか、実は八潮の秋月の店員さん、QIコネクタにはシースがあるってことを知らんのではなかろうか。

 それはそれとして……。

今日買ったもの
IMG_3220

 帰宅して早速とりかかる。

 製品はこういうものがビニール袋に封入されているので、付属のピンヘッダを半田付けする必要がある。ちょいちょいちょい、と素早い仕事だ。

ピンヘッダをつける
IMG_3224
IMG_3225

ちょいちょいっとな、……っと。
IMG_3230

 ネットで情報を漁る。

 あるサイトによると、基盤ウラの「J3」というプリントをショートし、「R9」というプリントに100Ωの抵抗を付けると、基盤の電源でバックライトが光らせられる、とあるので、早速真似をする。

 ところが、他の回路とともに作動させてみると、どうも不安定である。バックライトの電流は、データシートによると40mAとある。電流を実回路で測定してみたところ、データシートに記載の値よりは少ないものの、37~38mAくらい流れていることが分かった。Arduinoで安心して流せるのは20mAまでなので、これはどうも過大かもしれない。Arduinoは50mAくらいまで流すことができるが、余裕は十分にあったほうがよいだろう、ということで、R9に取り付けた100Ωのジャンプ抵抗は取り外した。

 液晶ディスプレイのみ単体ならば余裕はあるものの、他の回路を接続するのであれば外部電源で点灯した方が良いように思われる。

 で、データシートと、Arduino IDEの「サンプルスケッチ」の中にある「LiquidCrystal」のコメントを参考にブレッドボードを結線する。ブレッドボードには「Seeedstudio SIDEKICK BASIC KIT」に入っていたサーミスタを、1kΩの抵抗とともに取り付けてアナログ1番ピンに入れる。

ブレッドボードの様子
IMG_3233

回路図
「暑熱をばひとつ」の回路図

 スケッチはこんなふうにゴリゴリと書いて、動けとばかりArduinoに注入し、荒い息を吐く。

//
//  thermistor2LCD.ino
//    サーミスタで気温を測り、LCDに表示する。
//    佐藤俊夫
//    27.08.09(日) 1900~
//
#include <stdio.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int THERMISTOR = 1;

void setup() {
  lcd.begin(16, 2);
  pinMode(THERMISTOR, INPUT);
}

void loop() {
  char tempStr[16], dispStr[32];
  lcd.setCursor(0, 0);
  dtostrf(tempMesure(), 5, 2, tempStr);
  sprintf(dispStr, "Temp. %s C", tempStr);
  lcd.print(dispStr);
  delay(500);
}
//
float tempMesure(){
  const float B = 4350.0, Ta = 25.0, Rt0 = 50000.0;  //  MF11-503Kスペックシート記載
  const float K = 273.15;  //  熱力学温度の定数
  const float v0 = 5.0, r0 = 1000.0;  //  Arduino +5Vと電流調整抵抗1kΩ
  const int resolution = 1024;  //  アナログ入力の分解能
  int srcVal = 0;
  float vt = 0.0, rt = 0.0;
  
  srcVal = analogRead(THERMISTOR);
  vt = srcVal * (v0 / (resolution - 1));
  rt = (v0 * r0 - vt * r0) / vt;
  return(1.0 / (log(rt / Rt0) / B + 1.0 / (Ta + K)) - K);
}

 こうして、液晶ディスプレイに気温が表示できるようになった。

……ていうか、暑ッ!(笑)
IMG_3232



引き続きLチカ

投稿日:

 引き続きLEDで遊ぶ。

 100円ショップのプラスチック・ビーズにLEDを埋め込むという武蔵野電波のマネはなかなか楽しく、それをたくさん作ったのだが、この前のやり方だといまいち個数が少なく、寂しい感じが否めない。

IMG_3193
この前のLED生け花

 それはなぜかというと、小さいブレッドボード上に電流制御抵抗をLEDごとに付けようとすると、どうしてもLEDか抵抗のどちらかを「ラインまたぎ」に横向けにしなければならず、最低2ラインが消費されてしまうからだ。このブレッドボードだと、電源回路を入れると、どうしても5個しかLEDが配置できない。

どうしてもこうなる
IMG_3195

 ブレッドボードの中身は、タテのラインが下のように一列づつ内部で接続されており、真ん中の横一文字の仕切りで分けられている。抵抗かLEDのどちらかしか真ん中をまたげないから、どちらかは横向きになるのである。

ブレッドボードの中身の結線状況
ミニブレッドボード

 そこで、便利なものがある。「集合抵抗」だ。

集合抵抗
IMG_3203

 これは、抵抗を集めてワン・パッケージにしたものだ。この写真のものは、「8素子9ピン」というもので、内部はこうなっている。

集合抵抗の回路
集合抵抗の内部

 秋葉原千石電商なら、本店地下の、レジから一番遠い、奥の抽斗で売られている。ひとつ20円だ。

 表面にはカラーコードではなく、「103」等と数字が刻まれている。これはセラコンの読み方と似ていて、「103」であれば 10\times 10^3=10k\Omega である。今回は「331」、すなわち33\times 10^1=330\Omega のものを買ってきた。

 足のピッチはちょうど2.54mmなので、ブレッドボードにピッタリ挿すことができる。これを使うと、ブレッドボード上、LEDと抵抗の組み合わせで2ピッチ消費していたところを1ピッチですませることができる。

集合抵抗を使うと1ピッチですむ
IMG_3202

 こうすると、LEDは真ん中の仕切りをまたぐだけでよいから、LEDビーズの花を8個植えることができる。

IMG_3207

 紙コップに活けると、前回より多少華やかになった。

IMG_3200

 さて、LEDビーズが増えたので、これを16個ほど量産し、「TLC5940NT」とArduinoの回路に取り付けてみよう。スケッチやブレッドボードは前に試したのと同じでいい。

IMG_3212

 動かすとこんな感じだ。

 パルス幅変調がうまくかかって、1個1個のLEDの消え具合になかなか余韻があってよい。また、よく見ていただくと、赤いビーズが必ずしも赤く光るわけではなく、緑や青に変化して光るのも、面白いところだ。




ついでにこれもマネして

投稿日:

 ついでに、これも武蔵野電波のマネをしてみた。

IMG_3193

 これは、100円ショップのビーズを買ってきてLEDを埋め込み、紙コップに「LED生け花」をしてみたものだ。

 この中身には、小さいブレッドボードにLEDの電流制御抵抗と、3端子レギュレータで電源回路が仕込んである。

IMG_3195