2014年12月25日木曜日

Espruino 抵抗なしでなんかするやりかた

この記事はJavaScriptでファームウェアを記述するプロトタイピング基板"Espruino"のAdvent Calenderのために作成しました。Espruino Advent Calender 24日目です。
ちなみにEspruinoは、SeeedStudioから購入しました。$50を超えないと送料がかかってしまうので知り合いの分と2個購入してわけわけしました。

さて本題。プロトタイピング歴が長いためかワイヤケーブルや抵抗などを極力減らす癖がついています。
Espruinoですと普通A15ピン(LED3と同じ)などにLEDをつないで点灯させたい場合、以下のように接続します。


 抵抗はLEDの制限電流に応じた値にしないといけません。一応、1kΩを入れておけば大丈夫と言われてます(Arduinoなどの5Vベースの場合ですが。3.3VのEspruinoはもうちょっと低い値の抵抗でも大丈夫)。
こうつけたくなりません?
ここまでくると、更にこうつけたくなりません?


そうすれば、ブレッドボードもいらなくなって、それなりに楽です。



ソースでA14側をGNDにすれば可能です。カソードコモンのLED(足の短いカソードがGNDで0V)の場合、digitalWriteで0(LOW)を書きます。


var on = false;
var id = setInterval(function() {
  on = !on;
  A15.write(on);
},500);

function onInit() {
  pinMode(A15, "output");
  
  //A14番ピンを出力モードにする
  pinMode(A14, "output");
  //A14番ピンにLOW(0V)を出力してGNDにする
  digitalWrite(A14,LOW);

}
onInit();

抵抗なしの実装例

オン/オフでは面白くないので、明暗がでるようにanalogWite()を使った実装例を示します。
赤、緑、青のLEDとRGB LEDを直 に刺しています。光ファイバーは、三菱レイヨンのエスカを購入。東急ハンズやAmazonで購入できます。
 配線実体図は以下の通りです。B6/B7ピンに赤色LED(B7側をGND=短い足)、B8/B9ピンに緑色LED(B9側をGND)、A0/A1ピンに青色LED(A1側をGND)を接続しています。
 向かって右側には、RGB LEDをC9/C8/C7/C6ピンに接続しています(C7をGND=一番長い足)。
4つのLEDのGNDピンは、onInit()関数で初期化しLOWまたはHIGHを書き込みます。
function onInit() {
  pinMode(A0, "output");//A0番ピンを出力モードにする
  pinMode(A1, "output");//A1番ピンを出力モードにする
  //A1番ピンにLOW(0V)を出力してGNDにする
  digitalWrite(A1,LOW);
  
  pinMode(B6, "output");//B6番ピンを出力モードにする
  pinMode(B7, "output");//B7番ピンを出力モードにする
  //B7番ピンにLOW(0V)を出力してGNDにする
  digitalWrite(B7,LOW);

  pinMode(B8, "output");//B8番ピンを出力モードにする
  pinMode(B9, "output");//B9番ピンを出力モードにする
  //B9番ピンにLOW(0V)を出力してGNDにする
  digitalWrite(B9,LOW);

  pinMode(C9, "output");//緑 C9番ピンを出力モードにする
  pinMode(C8, "output");//青 C8番ピンを出力モードにする
  pinMode(C7, "output");//GND C7番ピンを出力モードにする
  pinMode(C6, "output");//赤 C6番ピンを出力モードにする
  //アノードコモン C7番ピンにHIGH(3.3V)を出力してGNDにする
  digitalWrite(C7,HIGH);
}
onInit();
C7ピンにはHIGHを指定します。手持ちのRGB LEDはアノードコモンの指定があり、普通のカソードコモンのLEDと違い、極性が逆になります。アノードコモンのGNDにはHIGHをかけておきます。
明暗はPWM(パルス幅変調)で3.3Vを0%〜100%まで細かくアナログ出力できるanalogWrite()を使い、変化量はゆるやかな変化を持たせるためにsinカーブにしました。
var deg = 0;
var id = setInterval(function(){
  //カウンタ変数degを度としてラジアンを計算
  radian = deg * Math.PI / 180.0;

  // Update output along with sin function
  // initial angle: red = 0, green = 2/3*PI, blue = 4/3*PI
  red     = Math.sin(radian) * 0.4 + 0.6; 
  green = Math.sin(radian+2/3*Math.PI) * 0.4 + 0.6; 
  blue   =  Math.sin(radian+4/3*Math.PI) * 0.4 + 0.6;
  
  analogWrite(C9, green);  //RGB 緑
  analogWrite(C8, blue);    //RGB 青
  analogWrite(C6, read);   //RGB 赤

  analogWrite(B8, 1.0-red);//赤
  analogWrite(B6, 1.0-green);//緑
  analogWrite(A0, 1.0-blue);//青
  
  deg++;

},10);
10ミリ秒おきに明るさを変えています。sinカーブは赤・緑・青に0度、120度、240度と位相をずらしています。
PWMのアナログ値は0〜1.0を指定するところsinカーブの計算で0.2〜1.0が出るようにしています。RGB LEDはアノードコモンのため1.0で消灯、0で最大輝度になります。
赤・緑・青のLEDはカソードコモンのため0で消灯、1.0で最大輝度になります。そのため各変数はアノードコモン用のため1から引いた差を出力させています。

自分でもわからなくなるのでw MacのGrapherで計算してみました。図示すると以下のようになります。
 実行してみると、ゆっくりと明暗を繰り返しています。が、RGB LEDだと3色が重なる時間が長いためか明るめで色の変化がイマイチ楽しめないようです^^;
どなたかソースを改良して素敵な照明インテリアに仕上げてください。
(のちほどソースをアップします)

0 件のコメント:

コメントを投稿