フォト
2017年8月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

ATtiny13A

2016年8月30日 (火)

Arduino IDEを使ったATtiny13用スケッチの開発について

ATtiny13用のプログラム(スケッチ)作成にはArduino IDEを使っています。

赤外線リモコン受信モジュール作成でATTiny13Aを利用したのですが、
環境によって動かない(どの環境を利用したか忘れた.. OTZ ..)

そこで、利用している開発環境を再認識するためまとめてみました(自分のためですが..)。
(現状、用途に合わせて複数使っています)

1)kosakalabさんが公開しているモジュール
    Arduino IDEでATtiny他の開発(Arduino-ISP編) / (AVRISP編)

    ATtiny13A以外の ATtinyシリーズにも対応しています。
    現状、いちばんちゃんと動くモジュールだと思います。

    ただしArduino IDE 1.0.6までの対応となります。
    またデフォルトでは低速クロックでの利用には未対応です。
    (例えばATtiny13A を128kHzで動かすなど)

2)smeezekittyさんが公開しているCore13 モジュール
    Core13 prealpha - Arduino core for Attiny13
        このモジュールはArduinoのフォーラムにて問題点や改善点が議論されています。
        core13: An Arduino core for the Attiny13 *testers wanted*

   Arduino IDE 1.0.X系(未確認)、1.6.x系(1.6.9にて確認済)で動作します。
   ATtiny13A の低速クロックにも対応しています。

   時間系の関数(特にmicros、mills)に若干問題があります。
   赤外線リモコン受信のデコード処理においてmicros()を使っているのですが、
   ちゃんと動作しませんでした( Arduino Unoと異なる仕様の挙動をする、正確でない)。 

   現在、ちょうどこの部分の問題が議論されているようです。
   (対策として、モジュール内のソースwiring.cを 1)のkosakalab のモジュールの
     wiring.c に差し換えると解消されます)

3)hansibullさんが公開しているMicroCore モジュール
    MicroCore(https://github.com/MCUdude/MicroCore)

    このモージュールは 2)のCore13をベースに使い勝手を良くしています。
    Core13ではピン指定が分かりにくかったのですが、きちんとドキュメント化しています。
    また、オプションを色々と指定出来て使いやすい環境です。   

    01

   Clock、GCCコンパイルオプション、書き込み装置(低速対応もあり)の指定が
   追加されています。
   2)では低速クロック128kHzで利用する際には、書き込み装置の低速対応を
   自分で行う(定義を追加する)必要がありました。

   このモジュールも2)のCore13と同様、時間系の関数に問題があります。
   (対策として、モジュール内のソースwiring.cを 1)のkosakalab のモジュールの
     wiring.c に差し換えると解消されます)

   時間系の関数(micros、mills、delay)取りあえず、精度が悪くても動けば良いので
   あれば、このモジュールの利用が一番おすすめです。

   一時、ボードマネージャーにてインストール出来る機構を公開していたのですが、
   現在は利用出来ないようです。

番外
   Spence Konde (aka Dr. Azzy)さん公開の
   SpenceKonde/ATTinyCore(https://github.com/MCUdude/MicroCore)   
    ATtiny13Aは未対応ですがそれ以外のATtinyシリーズに対応しているモジュールです。
    まだ利用していませんが、ATtiny85当たりを使う機会があれば利用しようと思います。

他にも色々とあるのですが、
上記2),3)の開発環境は今後もうちょっと改善される雰囲気ですので、この当たりの
利用が無難でしょう。3)はインストールと設定が簡単なので特に注目しています。

2016年8月29日 (月)

ATTiny13Aを使ってIchigoJamで赤外線リモコン受信を行う(1)

ここしばらく安価なLPC810を赤外線リモコンの受信処理に使っていたのですが、
LPC810が高騰して秋月電子では320円に..

ということで、「安価なATTiny13Aでやってみるか」と思い、実際にやってみると、
LPC810よりも簡単に出来てしまいました。

(以前作成したダイソー プチ電車の赤外線リモコン制御のスケッチを流用)

Dscn5651

回路図

Photo_2
これだと、パーツ的には100円位で実装出来ますね。

IchioJamには3線(3.3V->VCC、GND-> GND 、TxD-> RxD)を接続ます。
シリアルポートの通信速度は、ATiny13Aの都合で 38400bpsとなります。

受信した赤外線リモコンのボタンコード(1バイト)は、IchioJamのINKEY()コマンドで
取得出来ます。事前にボタンコードを調べる必要がありますが、普通のキーボード入力
と同じように処理出来ます。

20160829225214

実行すると赤外線リモコンのボタンに応じて操作出来ます。

20160829225252

プログラムを実行していない状態で、赤外線リモコンのボタンを押すと、
ボタンコードに対応する文字が画面に表示されます。

20160829225107

ATTiny13A用のプログラム作成はArduino IDE 1.06(+kosakalabさん公開モジュール)を使っています。
(ちょっと環境構築が面倒なので、後ほど別途記事にまとめます)

スケッチサイズは752バイトでした。
  ダウンロード IRremote_Ichigo.zip (1.8K)
  (シリアル通信用ライブラリBasicSerial3が別途必要です)

//
// 赤外線リモコン信号読み取り(IcigoJam連携バージョン)
// 2016/08/29 たま吉さん

//
//       ATMEL ATTINY13 / ARDUINO
//
//                 +-\/-+
// ADC0 (D 5) PB5 1|    |8 Vcc
// ADC3 (D 3) PB3 2|    |7 PB2 (D 2) ADC1
// ADC2 (D 4) PB4 3|    |6 PB1 (D 1) PWM1
//            GND 4|    |5 PB0 (D 0) PWM0
//                 +----+

#define BAUD_RATE 38400
#include <BasicSerial3.h>

// for I/O Port
#define IR    4
#define Rx    1
#define Tx    0

#define IR_DDR    DDRB
#define IR_PORT   PORTB
#define IR_PININ  PINB

#define IRbitRead()    (IR_PININ&_BV(IR))
#define RC_RDH_TS      9000    // リーダコードOFF間隔  9ms判定用
#define RC_RDL_TS      3800    // リーダコードON間隔   4.5ms判定用
#define RC_BITLOW_TS   1000    // ビットデータON間隔   1.69ms判定用  
#define RC_TMOVER      8000    // タイムオバー

//
// 赤外線リモコンコード取得
// 4バイトのデータを返す
// CCCCDDdd
//    CCCC カスタムコード
//    DD   データコード
//    dd   データコードのビット反転(データチェック用)
// ただし、
//    リピートコードの場合  0
//    エラーの場合          0xFFFFFFFF
//  を返す.
//
uint32_t Read_IR() {
  uint8_t  repeat = 0;  // リピートコード検出フラグ
  uint32_t  dt    = 0;  // 赤外線リモコン読み取りデータ
  unsigned long t ;     // 信号長計測用

  // リード部の取得
  // 受信データはH/L反転で読まれる
  while(1) {
    while(IRbitRead());  // OFF検出受信待ち   
    t = micros();        // OFF検出時刻取得
    while(!IRbitRead()); // ON受信検出待ち 
    t = micros() -t;     // OFF->ONの時間間隔取得
    if (t > RC_RDH_TS) { // 9ms以上ならリーダコードとみなす
        t = micros();      // ON検出時刻取得
        while(IRbitRead());// OFF検出待ち
        t = micros() -t;   // ON->OFF時間間隔取得
        break;
    }
  }
  
  // データ部取得
  if (t < RC_RDL_TS) {
    // 0N->OFF がリピートコードの場合、データ取得はスキップ
    repeat = 1;          
  } else {
    // 0N->OFF がリダーコードの場合、データを取得
     for (uint8_t i = 0; i <32; i++) {  //32ビット分取得ループ
        // ビット開始待ち
        while(!IRbitRead());  // ON待ち
        t = micros();
        while(IRbitRead());  // OFF待ち
        t = micros() -t;
        if (t>RC_TMOVER)
          return 0xFFFFFFFF;  // エラー
        dt<<=1;
        dt |= (t>RC_BITLOW_TS) ? 1:0;     
    }
  }
  // ストップビットの待ち
  while(IRbitRead());  // OFF待ち  
  if (repeat)
    return 0;
  return dt;
}

// 文字列出力
void serOut(const char* str) {
   while (*str) TxByte (*str++);
}

// 整数を16進数で出力
void serOutHex(uint16_t h) {
  uint8_t c;
  for (int8_t i=12; i>=0; i-=4) {
    c = h>>i & 0xf; 
    c = c >9 ? c+'A'-10: c+'0';
    TxByte ((uint8_t)c);
  }
}

void setup() {
  IR_DDR &= ~_BV(IR);  // IRピンのみ入力設定する
}
uint8_t prv =0;
void loop() {
  uint32_t rc =  Read_IR();  // IR受信
  if (rc) {
    if (rc != 0xFFFFFFFF) {
     TxByte((rc>>8)&0xff);
     prv=(uint8_t)((rc>>8)&0xff);
    }
  } else {
     TxByte(prv);
  }
}
 

LPC810と比べると、ATTiny13Aのプログラムの書き込みがちょっとハードルが高いのが難点です。

ブログ内関連記事
  Arduino IDEを使ったATtiny13用スケッチの開発について (2016/08/30)
 
  LPC810を使ってIchigoJamで赤外線リモコン受信を行う(4) (2016/08/17)
  LPC810を使ってIchigoJamで赤外線リモコン受信を行う(3) (2016/08/15)
  LPC810を使ってIchigoJamで赤外線リモコン受信を行う(2) (2015/06/06)
  LPC810を使ってIchigoJamで赤外線リモコン受信を行う(1) (2015/05/31)

  IchigoJamとArduinoでI2Cバス通信を試してみる (2) (2015/05/03)
  IchigoJamとArduinoでI2Cバス通信を試してみる (2015/05/01)

  ATtiny13Aで赤外線リモコン受信センサーを使う (2014/11/15)
  ATtiny13Aでシリアル通信(UART)を行う (2014/11/12)
  Arduino IDEでUSBaspを使ってATtiny13へプログラムの書き込み (2014/01/29)
  Arduino IDEでATtiny13でのLED点滅アプリの作成 (2014/01/26)

2016年1月31日 (日)

aitendoのATTiny ISPシールドきっと [K-TINY-SLD]を購入

ATtiny13A用のプログラマ用にaitendoのATTiny ISPシールドきっと [K-TINY-SLD]
購入して動作確認をしました。

01

295円とリーズナブルです。

Dscn4816

内容はこんな感じです。

Dscn4817

早速組み立てて動作確認しました。

先日動作確認したUSBtinyISPに繋げて確認してみました。
上面にICSPピンヘッダがあるので接続出来ました。
問題なく書きこめました。

Dscn4818

本来はArduino UNOの上にのせてシールドとして利用します。
ArduinoISPを利用して書込みを行うことが出来ます。

Dscn4819

次にICSPピンヘッダにUSBaspをつなげてみます。

Dscn4820

手持ちのコネクタは若干、8ピンICソケットに干渉してしまい奥まではめ込めませんでした。
一応、書き込みは出来ます。

汎用的に使えて非常に便利な製品です。


2016年1月30日 (土)

ATtiny13A - USBtinyISPによるプログラムの書き込み

AliexpressにてAVRプログラマ USBtinyISPを購入して試してみました。価格は$4.5です。
自作した書き込みボードに接続してみました。

Dscn4815

ATtiny13Aに書込みを行って動作確認を行ってみると問題なく書きこめました。
Arduino IDEにも対応しています。USBaspやArduinoISPに比べると早いです。

また、ATtiny13Aのシステムクロックを16KHzにした場合でも avrdudeの-Bオプションで
書込み速度を指定することで書き込み出来ました。

USBtinyISPボード上にはATtiny2313が乗っています。ファームウェアの更新も簡単に
出来そうです。

2016年1月20日 (水)

ATtiny13Aの省電力化を試みる

前回の「ATtiny13Aをシステムクロック16kHzで利用する」でシステムクロックを落とすことで
省電力化を図りました。

更に省電力化する方法はないかと調べると次の対策があることが分かりました。

1)アナログコンパレータを停止する
    これにより消費電流が100μAほど抑えられるようです。

2)必要に応じてsleepさせる
    次の関数を使って、delayによる内部ループ待ちはせずに、CPUを必要にお応じて
    停止させる。
    set_sleep_mode(SLEEP_MODE_IDLE)
    sleep_mode()

   SLEEP_MODE_IDLEを指定したときはタイマーは可動しておりタイマー割り込みの
   利用が可能です。このタイマー割り込みを使って定期的にCPUを起こして処理し
   また寝るようにします。

実際に前回のソースを修正して試して見ました。
// アナログジョイスティック デジタル出力変換 for Lame Station
//
//       ATMEL ATTINY13 / ARDUINO
//
//                 +-\/-+
// ADC0 (D 5) PB5 1|    |8 Vcc
// ADC3 (D 3) PB3 2|    |7 PB2 (D 2) ADC1
// ADC2 (D 4) PB4 3|    |6 PB1 (D 1) PWM1
//            GND 4|    |5 PB0 (D 0) PWM0
//                 +----+

#include <avr/sleep.h>

// ピンの割り付け
#define J_UP    PB1  // UP 出力
#define J_DOWN  PB0  // DOWN 出力
#define J_RIGHT PB5  // RIGHT 出力
#define J_LEFT  PB2  // LEFT 出力

// アナログ入力ピンの割り付け(要ピン番号で指定)
#define IN1     2  // ジョイスティック UP/DOWN 
#define IN2     3  // ジョイスティック LEFT/RIGHT

void setup() {
  ACSR |= _BV(ACD);  
  pinMode(J_UP,OUTPUT);
  pinMode(J_DOWN,OUTPUT);
  pinMode(J_RIGHT,OUTPUT);
  pinMode(J_LEFT,OUTPUT); 
  
  set_sleep_mode(SLEEP_MODE_IDLE); // アイドルモードに設定
}

void readjoystic() {
  int v1,v2;
  int s1 = analogRead(IN1);
  int s2 = analogRead(IN2);
  
  if (s1 < 50) {
     digitalWrite(J_DOWN, LOW);
     digitalWrite(J_UP, HIGH);
     
  } else if (s1 > 973) {
     digitalWrite(J_UP, LOW);
     digitalWrite(J_DOWN, HIGH);
     
  } else {
     digitalWrite(J_UP, LOW);
     digitalWrite(J_DOWN, LOW);
  } 
  
  if (s2 < 50) {
    digitalWrite(J_RIGHT, LOW);
     digitalWrite(J_LEFT, HIGH);
  } else if (s2 > 973) {
     digitalWrite(J_LEFT, LOW);
     digitalWrite(J_RIGHT, HIGH);
  } else {
    digitalWrite(J_RIGHT, LOW);
    digitalWrite(J_LEFT, LOW);
  }
}

void loop() {
  readjoystic();
  sleep_mode();
}

アナログコンパレータの利用停止はsetup()内のACSR |= _BV(ACD) で設定しています。

次にスリープですが、私が利用しているsmeezekittyさん公開の「Arduino core for Attiny13
は内部的にdelay用にタイマー割り込みを使っており、256サイクルに1回割り込みが
発生するようになっています。

システムクロックが16kHzなので割り込みは62.5Hz(1秒にだいたい60回)です。
この間隔でのジョイスティックの読み込みでも実用的だと思い、ソースには単純に
setup()でset_sleep_mode(SLEEP_MODE_IDLE)、loop()でsleep_mode()を入れるだけ
としました。
(だだし、 readjoystic()の処理が1/62.5秒以上かかる場合は意味なしですが)

実際に動かして電流を測定してみると、前回の1.27mAから0.13mAほど減りました。
アナログジョイスティックが0.70mAほど流れるのでATtiny13A単体では0.44mAです。

ただし、スリープと稼働の繰り返しで電流変動が変動するため、私の安いテスター
では正確には測れていないと思います。

Dscn4702

まあ、効果はあるようなのでこの修正でいってみます。

2016年1月17日 (日)

Arduino IDE 1.06にATtiny13A開発を構築

smeezekittyさんが公開している「Arduino core for Attiny13(core13_022_arduino_1_6.zip)」を
Arduino IDE 1.06環境に導入するための作業メモです。

はじめに
このモジュールを導入することで、Arduino IDE上にてAttiny13Aをターゲットとした開発が行えます。
ただし、別途書き込み機器(USBaspやArduinoISP等)が必要です。

蛇足:aitendoのATTiny ISPシールドきっと [K-TINY-SLD] なんかお手軽で良さそうです。
    説明が無いですがarduino経由でArduinoISPにて書込む形式のようです。

             05


smeezekittyさん公開モジュールはシステムクロックの128kHz、600kHz、1.2MHz、4.8MHz、9.8MHzのに対応しており、
ブートローダの書き込みによってヒューズビットの書き込みが行われます。

「Arduino core for Attiny13」は定期的に更新されており、現在のバージョンはV0.22です。
いくつかの関数がAttiny13用にメモリ消費を抑えるよう最適化されています。

必要とするモジュールおよび入手先
Core13 prealpha - Arduino core for Attiny13

関連情報
Arduino Forum >  Using Arduino >  Microcontrollers >  core13: An Arduino core for the Attiny13 *testers wanted*

導入手順
1)モジュールのダウンロードと解凍
  ・入手先のリンクのサイトからcore13_022_arduino_1_6.zipをダウンロードして解凍します。

2)モジュールのインストール
  ・Arduino IDE 1.0.6をインストールしたディレクトリの
      E:\Arduino\IDE\arduino-1.0.6\hardware\
   に、解凍したcore13モジュールの\attiny13にある \avrフォルダをコピーします。

  ・コピーしたavrフォルダの名前をattiny13に変更します。

  ・attiny13フォルダにあるboads.txtの内容を次の内容に変更します。   

attiny13a.name=Attiny 13A standalone 128khz
attiny13a.upload.maximum_size=1024
attiny13a.maximum_data_size=64
attiny13a.upload.speed=19200
attiny13a.bootloader.low_fuses=0x7b
attiny13a.bootloader.high_fuses=0xFF
attiny13a.build.mcu=attiny13
attiny13a.build.f_cpu=128000L
attiny13a.build.core=core13
#######################

attiny13b.name=Attiny 13A standalone 600khz
attiny13b.upload.maximum_size=1024
attiny13b.maximum_data_size=64
attiny13b.upload.speed=19200
attiny13b.bootloader.low_fuses=0x69
attiny13b.bootloader.high_fuses=0xFF
attiny13b.build.mcu=attiny13
attiny13b.build.f_cpu=600000L
attiny13b.build.core=core13
#######################

attiny13c.name=Attiny 13A standalone 1.2mhz
attiny13c.upload.maximum_size=1024
attiny13c.maximum_data_size=64
attiny13c.upload.speed=19200
attiny13c.bootloader.low_fuses=0x6a
attiny13c.bootloader.high_fuses=0xFF
attiny13c.build.mcu=attiny13
attiny13c.build.f_cpu=1200000L
attiny13c.build.core=core13

#######################
attiny13d.name=Attiny 13A standalone 4.8Mhz
attiny13d.upload.maximum_size=1024
attiny13d.maximum_data_size=64
attiny13d.upload.speed=19200
attiny13d.bootloader.low_fuses=0x79
attiny13d.bootloader.high_fuses=0xFF
attiny13d.build.mcu=attiny13
attiny13d.build.f_cpu=4800000L
attiny13d.build.core=core13
#######################
attiny13e.name=Attiny 13A standalone 9.6Mhz
attiny13e.upload.maximum_size=1024
attiny13e.upload.speed=19200
attiny13e.maximum_data_size=64
attiny13e.bootloader.low_fuses=0x7A
attiny13e.bootloader.high_fuses=0xFF
attiny13e.build.mcu=attiny13
attiny13e.build.f_cpu=9600000L
attiny13e.build.core=core13

これで完了です。
Arduino IDEのメニュー ツール - マイコンボードに
ATtiny13Aの 128kHz、600kHz、1.2MHz、4.8MHz、9.8MHzが追加されます。

ただし、利用する書き込み機器によっては低速クロックを指定した場合、
低速に対応していないために書き込みに失敗する場合があります。

私の手持ちのUSBaspでは600kHzまでしか書き込み出来ませんでした。
本家のUSBaspにはジャンパスイッチによるLow speed設定が出来るようですが、
私のものにはありません。自動調整機能があるようですが128kHzには対応していないようです。

また、デフォルトのArduinoISP(arduino IDEのスケッチを利用)の利用では1.2MHzでもエラーになりました。

低速クロックを利用する方法としては、私は「ArduinoISP slow SCK」を利用しています。
Arduino IDEにあるArduinoISPの代わりに使います。

入手先
ArduinoISP slow SCK - https://github.com/lmpipaon/ArduinoISP_slow_SCK

さらにこれをArduino IDEから利用するために
\hardware\arduinoフォルダにある programmers.txt の最後に次の内容を追加します。

arduinoisp_low.name=Arduino as ISP(low speed)
arduinoisp_low.communication=serial
arduinoisp_low.protocol=stk500v1
arduinoisp_low.speed=2400

これで書込装置のメニューに追加されます。

Ide01

書込み機器が低速に対応していないで、ブートローダを書きこんでエラーが発生すると
以後ATtiny13Aへの書き込みが出来なくなる場合があります。

この状態から復活するには高圧12Vでのヒューズビットのリセット(書き込み)をする必要があります。これについては「ATtiny13Aのヒューズビットのリセット」を参照して下さい。


ATtiny13Aをシステムクロック16kHzで利用する

まずは、ATtiny13Aをシステムクロック16kHzで利用する目的のお話しです。

プロペラをつかったホータブルゲーム機LameStationのジョイスティック部が次のような感じで
コンパレータLM339を使ってアナログ2入力をUP、DOWN、LEFT、RIGHTのON/OFF出力に変換
する形式となっています。

01

部品的には抵抗10本、IC(LM339)1個の利用とその配線となります。
この部分をADコンバーター機能を持つ「手持ちのATtiny13Aで置き換えれば簡略化出来るのでは?」
と思いつきやってみました。

動作確認と実装


まずは次ような感じの動作チェック回路を実装し確認しました。
ジョイスティックからのアナログ値を取得しその方向をON/OFFで出力します。
2入力4出力のため6ピン必要となり、リセットピンも利用しました。

02

プログラムソースは下記のようになります。
Arduino IDE 1.06環境にてsmeezekittyさんが公開している
「Arduino core for Attiny13(core13_022_arduino_1_6.zip)」を導入して利用しています。

03

// アナログジョイスティック デジタル出力変換 for Lame Station
//
//       ATMEL ATTINY13 / ARDUINO
//
//                 +-\/-+
// ADC0 (D 5) PB5 1|    |8 Vcc
// ADC3 (D 3) PB3 2|    |7 PB2 (D 2) ADC1
// ADC2 (D 4) PB4 3|    |6 PB1 (D 1) PWM1
//            GND 4|    |5 PB0 (D 0) PWM0
//                 +----+

// ピンの割り付け
#define J_UP    PB1  // UP 出力
#define J_DOWN  PB0  // DOWN 出力
#define J_RIGHT PB5  // RIGHT 出力
#define J_LEFT  PB2  // LEFT 出力

// アナログ入力ピンの割り付け(要ピン番号で指定)
#define IN1     2  // ジョイスティック UP/DOWN 
#define IN2     3  // ジョイスティック LEFT/RIGHT
 
void setup() {
  pinMode(J_UP,OUTPUT);
  pinMode(J_DOWN,OUTPUT);
  pinMode(J_RIGHT,OUTPUT);
  pinMode(J_LEFT,OUTPUT); 
}

void loop() {
  int v1,v2;
  int s1 = analogRead(IN1);
  int s2 = analogRead(IN2);
  
  if (s1 < 50) {
     digitalWrite(J_DOWN, LOW);
     digitalWrite(J_UP, HIGH);
     
  } else if (s1 > 973) {
     digitalWrite(J_UP, LOW);
     digitalWrite(J_DOWN, HIGH);
     
  } else {
     digitalWrite(J_UP, LOW);
     digitalWrite(J_DOWN, LOW);
  } 
  
  if (s2 < 50) {
    digitalWrite(J_RIGHT, LOW);
     digitalWrite(J_LEFT, HIGH);
  } else if (s2 > 973) {
     digitalWrite(J_LEFT, LOW);
     digitalWrite(J_RIGHT, HIGH);
  } else {
    digitalWrite(J_RIGHT, LOW);
    digitalWrite(J_LEFT, LOW);
  }
}

Arduino IDE環境ではシステムクロック 128kHzまでしか対応していないので、
プログラム書き込み後、リセットピンを出力に使うためのリセット禁止とシステムクロックを
16kHzに設定するためにヒューズビットを設定を行います。

作業はコマンドプロンプトにてavrdueコマンドを使って行います。

04

実行コマンド
avrdude -carduino -Pcom6 -pt13 -U lfuse:w:0x6b:m -U hfuse:w:0xfe:m -v -F -b2400
(書き込み機器はarduinoを利用した"Arduino as ISP"です)

ヒューズビットの設定値を簡単に調べるには次のサイトが便利です。
Engbedded Atmel AVR® Fuse Calculator

注意:RESET禁止またはシステムクロックを低速にすると、プログラム書き込みとヒューズビットの
設定が通常環境では出来なくなります。高電圧書き込みにてヒューズビットのリセット
が必要となります。


書き込み後、実装して動作確認をいたします。

Dscn4688

問題無く動作しているようですが、RSETピンの出力が弱いです。

Dscn4689

微妙にしか点灯しません。
この現象がなぜなのか、悩んだのですがSNS上のアドバイスにより理由が判明しました。

Reset
上記の"The reset pin can also be used as a (weak) I/O pin."のweak(弱い)がこの現象の理由のようです。
信号には使えるが、LEDの駆動には使えないくらい弱いようです。
信号として利用するには問題無いでしょう。

LEDが点灯していない状態で電池からブレットボードに流れる電流を測定すると、
1.27mAでした。予想よりも消費電力が大きいと思ったのですが、
アナログジョイスティックに流れる電流を測定したところ、0.70mAほどでしたので、
ATtiny13A単体では0.57mA程度と思われます。

ATtiny13A を 9.6MHzで動かすと、2.66mAなのでクロックを落とすことで消費電力化
が図れるのは確かなようです。

Dscn4692

実際、プロペラ lumestationに組み込んで利用してみるとリセットピンからの
ON/OFFの信号も問題なく読み取れました。

Dscn4690

これでジョイスティック入力が出来ました。SDKに付属のゲームで遊べました。

Dscn4691

結論と感想
ATtiny13Aをシステム16kHzで利用しても問題なく利用出来ました。
むしろ、こういう使い方こそ50円マイコンにふさわしいと言えますね。

2016年1月16日 (土)

ATtiny13Aのヒューズビットのリセット

ATtiny13Aをシステムクロック128kHzで稼働させる模索中にミスにより4個が
文鎮状態(brick状態)になってしまいました。

原因としては、ヒューズビットの設定をミスしてリセット不能・低速過ぎて書き込み機器で
の通信が行えないことが考えられます。ヒューズビットをリセットすれば復活出来るかも
しれません。

復活方法を調べてると、高電圧12Vによる書き込み方法があると知り早速試してみました。

次の記事を参考にして試してみました(情報公開に感謝します)
tadfmacさんのHP 「Arduino UNOでATTiny開発してるときに書き込めない!AVR壊れた!?その前に」
Wayne's Tinkering Page さんのHP 「ATTiny Fuse Reset」

回路図およびスケッチ(プログラム)は「ATTiny Fuse Reset」をほぼそのまま利用させて頂きました。
ただしトランジスタは、2N3904ではなく手持ちの2SC1815GRを利用しました。

Dscn4684

12Vの電圧はACアダプタから供給し、ボード上のVinピン(写真の黄色線)から取得しました。
操作等のツールの使い方はtadfmacさんの記事を参考にしました。

無事に復活出来ました。
これで、色々とムチャな実験をしても復活できる手段を取得出来ました。

2016/01/17 追記

便利な機能なのでシールド化しました。
リセッター機能だけではもったいないので、プログラマ機能としてArduinoISPで
利用出来るようにしました。

Dscn4686

2015年3月29日 (日)

ATtiny13AでUART-I2Cブリッジを試作したが微妙

前回の続きです。
取りあえず、ATtiny13AにUART-I2Cブリッジを実装しました。

I2C接続LCDキャラクタ表示器にTeraTermでI2CコマンドをATtiny13Aに送ると

01

一応、ちゃんとコマンドを認識して文字が表示出来ました。

Dscn3699

ただし、非常に微妙です。

問題点等
・シリアル送信時に1バイト毎に2msecウェイトをかけないと
  受信データを取りこぼしてしまいます。
  メモリが足らないのでバッファリングやエラー処理が実装できません。
  2つの通信を同時に扱うのにSRAM 64バイトはちょっと辛かったです。

・I2Cがちょっと遅い。シリアルで115200出ない。
  なんか異常に遅いです。

まあ、今回は命令文を構想が練れたので良いとしましょう。
コマンドの形式前回からちょっと変更しました。

シリアル通信からI2C制御コマンドは次の通りです。
@a[C]    I2Cアドレス送信(スタートビットも送信,スレーブからack読み取りも行う)
@w[C]   1バイト送信(スレーブからack読み取りも行う)
@r[A]    1バイト受信(スレーブにack送信も行う)
@e        通信終了(ストップビット送信)

多分、これでI2C接続デバイスのの多くが制御ができると思います。
マクロ命令(上記の命令を組み合わせている)
@c[addr][cmd]   コマンド送信
@d[addr][data]   1バイトデータ送信 

さて、どうしましょうかね。
ATtiny13Aでこれ以上頑張っても、ちょっと無理そうです。
次はLPC810で実装しようと思います。

関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21)
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13)
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17)
Wiiヌンチャクの動作確認しました (15/05/17)
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15)
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29) [この記事です]
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)

公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール

2015年3月26日 (木)

ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3

前回の続きです。早速、arduno Uno上でプログラムを実装してみました。

Dscn3698

取りあえず、シリアル通信経由でI2Cのコマンドを投げて表示することが出来ました。
写真の"Hello World"を表示するのに次のコマンドを送信しています。

@s@wA0@i0@w80@i0@w48@i0@e
@s@wA0@i0@w80@i0@w65@i0@e
@s@wA0@i0@w80@i0@w6C@i0@e
@s@wA0@i0@w80@i0@w6C@i0@e
@s@wA0@i0@w80@i0@w6F@i0@e
@s@wA0@i0@w80@i0@w20@i0@e
@s@wA0@i0@w80@i0@w57@i0@e
@s@wA0@i0@w80@i0@w6F@i0@e
@s@wA0@i0@w80@i0@w72@i0@e
@s@wA0@i0@w80@i0@w6C@i0@e
@s@wA0@i0@w80@i0@w64@i0@e

一応、表示は出来たのですが、ATtiny13A用に作ったシリアル通信ライブリが
バッファリングしない仕様のため、TeraTermでデータを流した場合、
1文字毎に1msecのディレイを入れないとデータ抜けが発生しました。
IchigoJamで使うにはちょっと厳しいですね。

I2Cのプロトコルをここまで低レベルに分解する必要も無さそうなので
コマンド送信、データ送信、データ受信の基本パターンを用意して、
コマンド長を短くしてバッファリングするようにしてみます。
ただ、ATtiny13AのRAMが64バイトしかないんですよねぇ

関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21)
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13)
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17)
Wiiヌンチャクの動作確認しました (15/05/17)
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15)
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26) [この記事です]
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)

公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール