フォト
2018年5月
    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

2018年4月16日 (月)

ATtiny13AでI2C接続キャラクタLCDを利用する(4)

以前、挑戦ていた「ATtiny13AでI2C接続キャラクタLCDを利用する」を
Arduino 1.8.5 + MicroCore環境にてやってみました。

Dscn7826

キャラクタLCDは、秋月電子で購入したACM1602NI-FLW-FBW-M01を利用しています。
  ・I2C接続キャラクタLCD 16x2行白色バックライト付(ACM1602NI-FLW-FBW-M01)

以前コメントで頂いた、問題点の対応とRaulさんオリジナル版の
   Coding Laboratory - I2C on an AVR using bit banging

で指摘されている点の対応修正を行いました。
それと、可能な限り高速化をおこないました。

動いている様子

スケッチサイズは、MicroCoreのcore_settings.hにて利用しない機能を無効化することで
660バイトに抑えることが出来ました。

Ide

I2Cが使えると、電子工作の幅が広がりますね。

このスケッチは下記からダウンロードできます。
ダウンロード ATtiny13_I2CLCD.zip (4.7K)

2018年4月15日 (日)

ATtiny13Aで赤外線リモコン受信センサーを使う(2)

以前、「ATtiny13Aで赤外線リモコン受信センサーを使う」で行ったことを、
Arduino IDEATtiny13AMicroCoreパッケージの環境で動作確認しました。

以前のバージョンでは、micros() の精度が悪くて動作しなかったので、別パッケージを
利用していましたが、最新版では問題なく動作しました。

02

実行結果

01

ただしデフォルトでは、micros()は利用出来ないので、
core_settings.hの中のENABLE_MICROS の定義を有効にする修正が必要です。

スケッチ

//
// ATtiny13Aで赤外線リモコン受信
//
// ATMEL ATTINY13 / ARDUINO
// 利用パッケージ:https://github.com/MCUdude/MicroCore
// 注意: core_settings.h の#ENABLE_MICROS を有効にする必要あり
//
//                 +-V-+
// Reset      PB5 1|    |8 Vcc
// Tx         PB3 2|    |7 PB2 IR(IN)
// Rx         PB4 3|    |6 PB1
//            GND 4|    |5 PB0
//                 +----+
//

// シリアル通信定義
#define BAUD_RATE 38400
#include "BasicSerial3.h"
#define Tx      PB3 // (変更する場合、BasicSerial3.S修正が必要)
#define Rx      PB4 // (変更する場合、BasicSerial3.S修正が必要)

//IR受信定義
#define IR            PB2
#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ピンのみ入力設定する
}

void loop() {
  uint32_t rc =  Read_IR();  // IR受信
  if (rc) {
    if (rc != 0xFFFFFFFF) {
      serOut("custom="); serOutHex(rc>>16);serOut(" ");
      serOut("data=");serOutHex(rc>>8&0xff);serOut("\n\r");
    }
  } else {
    //serOut("Repeat\n\r");
  }
}

2018年4月14日 (土)

ATtiny13AでHC-SR04を使った距離計測

Arduino IDE 1.8.5の環境で、ATtiny13Aの開発が出来るようになったので、
試しに、HC-SR04を使った距離計測を実装してみました。

スケッチは、アルゴリズム雑記さんの下記の記事を参考にさせていただきました。
・【Arduino】超音波距離センサ(HC-SR04)の測定精度を向上(気温考慮)
  https://algorithm.joho.info/arduino/ultrasonic-distance-sensor-hcsr04-temp/

実装

09

実行結果

08

測定結果は、シリアルコンソールに出力します。
とりあえず、それらしく動いています。

スケッチサイズは、ジャスト1024バイト、ぎりぎり書き込めました。

09_2

スケッチ

(修正) 2018/04/14 ライブラリBasicSerial3をlibraliesに配置するように修正しました。

//
// 超音波距離センサHC-SR04を使った距離計測  
//
// ATMEL ATTINY13 / ARDUINO
// 利用パッケージ:https://github.com/MCUdude/MicroCore
//
//                 +-V-+
// Reset      PB5 1|    |8 Vcc
// Tx         PB3 2|    |7 PB2 
// Rx         PB4 3|    |6 PB1 ECHO
//            GND 4|    |5 PB0 TRIG
//                 +----+
//

// シリアル通信ライブラリ
//   AVR half-duplex software UART supporting single pin operation
//   http://nerdralph.blogspot.jp/2014/01/avr-half-duplex-software-uart.html
//
#define BAUD_RATE 38400
#include "BasicSerial3.h"

#define Tx    PB3 // (変更する場合、BasicSerial3.S修正が必要)
#define Rx    PB4 // (変更する場合、BasicSerial3.S修正が必要)

// HC-SR04
#define TRIG  PB0 // 出力ピン
#define ECHO  PB1 // 入力ピン
#define TEMP  180 // 温度補正 気温(℃)*10

// 整数を10進数で出力
void OutDEC(uint16_t d) {
int8_t n =-1;
  uint16_t v = 10000;
  for (uint8_t i=0; i<5; i++) {
    if (d >= v) {
      TxByte(d/v + '0');
      d %= v;
      n=i;
    } else {
      if (n!=-1||i==4) TxByte ('0');
    }
    v/=10;
  }
}
void setup() {
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

void loop() {
  // 超音波の出力終了
  digitalWrite(TRIG,LOW);
  delayMicroseconds(1);

  // 超音波を出力
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(11);
 
  // 超音波を出力終了
  digitalWrite(TRIG, LOW);

  // 出力した超音波が返って来る時間を計測
  uint16_t d = (uint16_t)pulseIn(ECHO, HIGH, 200000);

  // 計測した時間と音速(気温を考慮)から反射物までの距離を計算
  uint16_t k=(3315+TEMP*6)/20; // 係数
  uint16_t v=d/100*k;
  uint16_t h=v/100;
  uint16_t l=v%100;

  // 計算結果をシリアル通信で出力
  OutDEC(h); TxByte('.'); OutDEC(l);
  TxByte('\n');
  delay(250);
}

シリアル出力はNerd Ralphさんが公開しているライブラリ、BasicSerial3 を利用しています。
  ・Nerd Ralph - AVR half-duplex software UART supporting single pin operation
   http://nerdralph.blogspot.jp/2014/01/avr-half-duplex-software-uart.html

   ライブラリをダウンロードし、BasicSerial3を\librariesに配置する必要があります。
   さらに、BasicSerial3.Sのピン指定を修正しています。
     #define UART_Tx 3
     #define UART_Rx 4   

スケッチの全ソースは、下記のサイトに置いています。
https://github.com/Tamakichi/Arduino_ATtiny13_HC_SR04

50円マイコン、容量の制約が厳しいですが、それなりに実装でき、十分楽しめますね。

Arduino 1.8.5環境でATtiny13Aを利用する

Arduino IDEのATtiny13A用MicroCoreパッケージを久しぶりにチェックしたところ、
いい感じになっているので、最新版1.03を利用してみました。

パッケージ公開サイト

  MicroCore - An optimized Arduino hardware package for ATtiny13

以前はmicros()等の精度が悪く、タイミングをとるプロトコル実装に使えず難儀したのですが、
更新履歴をみると改善されたみたいです。

早速Arduino 1.8.5にインストールしてみました。
インストールは公開サイトの「How to install」に従ってインストールしました。
ボードマネージャのURL追加の方法で行いました。
下記の1行を環境設定追加のボードマネージャのURLに登録し、

  https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json

URL

ボーマネージャにて、最新版をインストールします。

01


インストール後の書込み確認

とりあえず、Lチカですね。
ATtiny13Aへのスケッチの書込みには、書き込み装置が必要です。
安価な書込み装置としては、次のものが利用されることが多いようです。
  ・USBasp
  ・USBtinyISP
  ・Arduino as ISP(Arduino Unoを使う方法)

今回はUSBtinyISPを利用しました。
USBaspも安くて良いのですが、Windows 10対応の署名付きのドライバーがないようで、
開発とサポートが止まっている感があります。

一方、USBtinyISPはAdafruit製もあり、ドライバー等もそこから入手出来ます。
  Adafruit - USBtinyISP :AVR programmer & SPI interface
  https://learn.adafruit.com/usbtinyisp/


書込みのための結線はUSBtinyISPMicroCoreのHPのMinimal setupを参考にしてしました。
Lチカ用の出力ピンは書込みに利用していないPB3を利用しました。

Dscn7818

スケッチ

void setup() {
  pinMode(PB3, OUTPUT);
}

void loop() {
  digitalWrite(PB3, HIGH);
  delay(500);
  digitalWrite(PB3, LOW);
  delay(500);
}
 

ピン指定は、ピン名称のPB0PB5がそのまま利用出来るようです。

04_2

ボード指定と書き込み装置を設定し、スケッチをコンパイル&書き込み実施。
とりあえず、上記の設定では問題なくLチカ出来ました。
ヒューズビットの設定も同時に行われているようです。


128kHzでのLチカで問題発生

次にクロックを落としての利用。
低速書込みでは過去の経験から色々と問題が発生するのですが、やはり問題発生。

スケッチの書込みは出来るのですが、ヒューズビットの設定が出来ていないようです。
本来ならスケッチの書込みと同時に、ヒューズビットの設定もおこなわれるはずです。

公式サイトを見ると、書込み装置として「USBtinyISP(slow)」を設定しないといけないようです。

試して見ると、書込み時に下記のエラーが発生しました。
  avrdude: Can't find programmer id "{upload.protocol}"

05

これのエラーは、"upload.protocol"が未定義ということです。

MicroCore
の設定ファイル
  C:\Users\ユーザー\AppData\Local\Arduino15\packages\MicroCore\hardware\avr\1.0.3\

を調べてみるとプロトコルの設定をprogrammers.txtでは"protocol"のidを使っているのに
platform.txtの定義では"upload.protocol"のidを参照しています。
idがミスマッチのようです。

このエラーの対応として、
  platform.txt内の"upload.protocol"を"protocol"に変換
idのエラーは解決できました。


しかし、新たなエラーが発生

06

このエラーはSCKのクロックタイミングがマズイようです。
USBtinyISPのSCKのクロックパルス速度ではATtiny13が応答出来ないようです。

対応としてprogrammers.txt-B32をところを-B64 -Fに修正

usbtinyisp.name=USBtinyISP (slow)
usbtinyisp.protocol=usbtiny
usbtinyisp.program.tool=avrdude
#usbtinyisp.program.extra_params=-B32
usbtinyisp.program.extra_params=-B64 -F

ついでに、platform.txt-B32設定の箇所を-B64に修正
下記はヒューズビットの書込みに関連する設定です。

tools.avrdude.erase.params.verbose=-v
tools.avrdude.erase.params.quiet=-q -q
tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" -v -p{build.mcu} -c{protocol} -B64 {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m

tools.avrdude.bootloader.params.verbose=-v
tools.avrdude.bootloader.params.quiet=-q -q
tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} -B64 -Ulock:w:{bootloader.lock_bits}:m

    (備考)
     programmers.txt、platform.txtはサクラエディタで開くとUTF-7と誤判断され、
    上書き保存すると、Arduino IDEで正しく読めなくなりました。
    明示的にUTF-8指定して保存する必要があります。

修正後、Arduino IDEを再起動して動作確認すると、問題無く書き込めるようになりました。

07



まとめ

・Arduino 1.8.5でMicroCoreパッケージを使うと、ATtiny13Aのアプリ開発が出来る
・書き込み装置は、USBtinyISPがおススメ
・9.6MHzのクロックを利用する場合は、デフォルトのままで利用しても問題ない
・クロックを変更して利用する場合、現段階では定義ファイルの修正が必要っぽい

問題はあるようですが、Arduino 1.8.5で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のヒューズビットのリセット」を参照して下さい。