目次

クリスマスツリー

 クリスマスツリーは、次のように木にLEDをつけると
 実現できます。




 木につけられたLEDをランダムに点灯すれば
 クリスマスツリーは実現できるでしょう。

 IchigoLatteでは、乱数をrndで発生させられます。

 6段を用意し、その格段にLEDを2つずつ接続して
 おくとすれば、実現できそうです。

 乱数で、どこの段のLEDを点灯するかを決めます。

 図で示すと以下。



 出力のOUT_1からOUT_6に、LEDを抵抗を介して
 接続しておきます。



 OUT_1からOUT_6に割り当てられたピンを出力に設定し
 論理値を印加できるように、関数を定義。

function gpout_set()
{
  var ddra = 0x50018000;
  // set lower 6 bits as OUTPUT
  mem(ddra,mem(ddra) | 0x3f);
}

function gpout(x,v)
{
  var xadr = 0x50010000;
  var xdat ;
  // generate logical value
  xdat = 0xfff ;
  if ( v == 0 ) { xdat = xdat & v ; }
  // calculate address
  bl = (1 << (x-1)) << 2;
  if ( x == 5 ) {  bl = (1 << 11); }
  if ( x == 6 ) {  bl = (1 << 10); }
  xadr = xadr + bl ;
  // set logical value
  mem(xadr,xdat);
}

 すべてのLEDを消灯できるようにしておきます。

function clr_led()
{
  var xadr = 0x50010000 ;
  // OUT_1 - OUT_4
  xadr = xadr + (15 << 2);
  // OUT_5 , OUT_6
  xadr = xadr + (3 << 10);
  // store
  mem(xadr,0);
}

 OUT_1からOUT_4は、ビット0から3で対応し
 OUT_5、OUT_6はビット8、9になっている
 ため、ピン配置との相関で対象となるGPIOの
 アドレスを確定させています。

 OUTにアサインされているビットは、下図で
 確認できます。



 呼び出して利用する関数を定義したので
 乱数で点灯するLEDを決めて点滅させます。

var r ;
//
gpout_set();
while (1) {
  // turn off all LEDs
  clr_led();
  // select LED number
  r = rnd(6) + 1;
  // turn on target LED
  gpout(r,1);
  // delay
  sleep(1000);
}

 まとめると、以下。

function gpout_set()
{
  var ddra = 0x50018000;
  // set lower 6 bits as OUTPUT
  mem(ddra,mem(ddra) | 0x3f);
}

function gpout(x,v)
{
  var xadr = 0x50010000;
  var xdat ;
  // generate logical value
  xdat = 0xfff ;
  if ( v == 0 ) { xdat = xdat & v ; }
  // calculate address
  bl = (1 << (x-1)) << 2;
  if ( x == 5 ) {  bl = (1 << 11); }
  if ( x == 6 ) {  bl = (1 << 10); }
  xadr = xadr + bl ;
  // set logical value
  mem(xadr,xdat);
}

function clr_led()
{
  var xadr = 0x50010000 ;
  // OUT_1 - OUT_4
  xadr = xadr + (15 << 2);
  // OUT_5 , OUT_6
  xadr = xadr + (3 << 10);
  // store
  mem(xadr,0);
}

var r ;
//
gpout_set();
while (1) {
  // turn off all LEDs
  clr_led();
  // select LED number
  r = rnd(6) + 1;
  // turn on target LED
  gpout(r,1);
  // delay
  sleep(1000);
}


目次

inserted by FC2 system