ATTiny13でNew Lチカ | Tamesuke-Goto Maker的Blog

Tamesuke-Goto Maker的Blog

地域ISP管理者だけれど、ここ3年ほどMakerなJobが増えたのでまとめてみたいと思います 旧ハンドル Ringoro

ハロウィン🎃も終わったので、次はクリスマス🎄の準備にかかります
 
3年くらい前に秋月電子のLEDストリングとNE555を使った電飾を作ったのですが、今年はATTiny13を使ってグレードアップしたものを作りたい。
秋月LEDとハロウィンで使った基板から何か作っていきましょう。
 
 
{812D6A64-0154-4118-BFFB-D3EB3496296A}
 
 
秋月電子のLEDストリング/ジェリーライトは LED20個、スイッチ付電池ボックス、抵抗内蔵、と使いやすい電飾キットです。これだけでは単にLEDが点灯するだけなので面白みがありません。
 
先ずは分解します。LEDの半田付けを取り外して抵抗もバラバラにしておきます。
 
 
 
{616E8C3F-8494-4C0E-AC3E-0FDF06C50BF4}
 
電池ボックスも使うのでSWとケーブルは別途半田付け
 
 
 
 
 
{56D9AFB5-D761-4F6F-BFD0-49CFAC973B6F}
 
 
LEDストリングはLED20個、定格では120mA程度を流しています。ATTiny一個ではドライブできないので
PNPトランジスタ一個を介してドライブさせます。
 
 
{028894E6-D2A0-42FA-AEDA-4D41F86C5B9F}
 
スケッチはハロウィンLチカを元にしました。単に点滅させるだけでは面白みがないので、ここでは4種類の点滅パターンを10secおきに切替える様に書いてみました。
 
複数の点滅パターンのために、複数のLED構造体に数値を入れて初期しておいてパターンを選ばせるように考えたのですが、ATTiny13はRAMが64バイトしかありません。パターンの数だけ構造体変数を増やすとメモリ不足になってしまいます。今回はプログラム中でタイミングを直接代入する様にしました。
 
スケッチ:
=======
/*
  illumination ATTiny13 No.2

   Multi Blink Pattern

     ATTiny13
 
   PCINT5/A0/D5/RST |1---O---8| VCC
       PCINT3/A3/D3 |2       7| D2/A1/INT0/PCINT2
       PCINT4/A2/D4 |3       6| D1/PWM/PCINT1
                GND |4-------5| D0/PWM/A0/PCINT0

   RST = ADC0/PCINT5
 
 */


#define LED1 3
#define LED2 4
#define LED3 1
#define LED4 2

struct led {
  char pin;   //  PIN No.
  bool on;   // ON/OFF status
  int cont;  // time count
  int ontime; // ON time (msec)
  int intval; // interval time (msec)
};

struct led led1;
//struct led led2;

//struct led led1={LED1,0,900, 600,2000};
//struct led led2={LED4,0,900, 250,500};

/*
 * LED Blink func.
 *
 */

void blinkled(struct led *myled)
{
  int pin=myled->pin;
  if(myled->cont++ == myled->ontime){
    digitalWrite(pin,false);
    myled->on=false;
    } else if(myled->cont >= myled->intval){
      digitalWrite(pin,true);
      myled->cont=0;
      myled->on=true;
    }
//  return myled->on;
}


void setup() {
  pinMode(LED1, OUTPUT);
//  pinMode(LED4, OUTPUT);
  led1.pin=LED1;
  led1.on=0;
  led1.cont=0;
  led1.ontime=400;
  led1.intval=1000;
//  led2.pin=LED4;
//  led2.on=0;
//  led2.cont=0;
//  led2.ontime=500;
//  led2.intval=1500;
}
unsigned int t;
unsigned char m;

void loop() {
   delay(1);
   blinkled(&led1);
//   blinkled(&led2);

  if(t++ < 10000){
    return;
  }
  t = 0;
  m= (m+1 & 0x03);
  switch(m){
    case 0:led1.ontime=600;
           led1.intval=1000;
           break;
    case 1:led1.ontime=300;
           led1.intval=600;
           break;
    case 2:led1.ontime=1000;
           led1.intval=1500;
           break;    
    case 3:led1.ontime=50;
           led1.intval=300;
           break;  
  }
}

=======
 
 
{8A948534-14E4-41CD-A791-FF780AD08026}
 
半田付けしてみて思った。。。これだけならスクラッチで基板半田付けした方がコンパクトになりますね。
 
試しにもう一枚ユニバーサル基板へ半田付け。まだ余裕がありますね。LEDはもう一本つなげられそう。
 
{7AF0F236-9F57-4D07-9009-350ED59FECD3}
 
 

コンパイル結果は以下。プログラム容量ではまだ余裕があります。もう少し複雑な事はできそう。

最大1024バイトのフラッシュメモリのうち、スケッチが526バイト(51%)を使っています。
最大64バイトのRAMのうち、グローバル変数が15バイト(23%)を使っていて、ローカル変数で49バイト使うことができます。
C:\Users\goto\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino9/bin/avrdude -CC:\Users .....
 
 


 
 
LEDを2系列にしてバラバラに点滅させるようにしてもよいかもしれません。