フォト
2025年3月
            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          
無料ブログはココログ

« 2013年12月 | トップページ | 2014年2月 »

2014年1月の10件の記事

2014年1月31日 (金)

Windows 8.1環境でWinAVR+Eclipse+AVRプラグインでビルド時にエラーがでる

メインで利用しているパソコン Windows 8.1 Pro (64ビット)にAVRのクロスコンパイル環境を
構築したのですが、ビルド時にエラーがでます。

01

先行者さん達のインストール手順に従って構築したのですがうまくいきません。
ここ数日悩んでいたのですが、やっと解決出来ました。
Windows 8.1固有の問題らしいです。

海外のAVR系の掲示板で同類の現象が報告されており、その解決方法が投稿されていました。

http://smallshire.org.uk/sufficientlysmall/2013/10/31/arduino-avr-gcc-eclipse-and-windows-8-1/
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=1118778

WinAVRのutils\binのmsys-1.0.dll に問題があるようで、次のリンクからダウンロードした
ものに差し替えたらビルドが問題なく実行できました。
http://www.madwizard.org/download/electronics/msys-1.0-vista64.zip

とりあえず、環境は整備できました。

2014年1月29日 (水)

Arduino IDEでUSBaspを使ってATtiny13へプログラムの書き込み

Aliexpressで購入したAVR USBasp AVR Programmerが到着したので早速試してみました。
$4.94で購入しました。

Dscn2384

中身はこんな感じの製品です。

Dscn2375

とりあえず、作業さしやすいように専用基板を作ってみました。
基板に乗っているICがATtiny13Aです。

Dscn2386

USBaspを使うにはドライバーのインストールが必要なのですが、
署名無しのドライバーの場合、Windows 8.1環境だとちょっと面倒なインストールと
なりました。ただしWindows 8よりは手順が楽になりました。
署名無しドライバーのインストール方法は情報が多くあるのでここでは省略します。

Arduino IDEで書込み装置としてUSBaspを指定してプログラムの書き込みを行うと、
ワーニングが表示されました。

1

とりあえず、Lチカが動作しているのでプログラムの書き込みはできているようです。

Dscn2391

エラーがちょっと気になるのでインターネットで調べるとUSBaspのファームウェアが古いようです。
arduino IDEのavrdudeコマンドでUSBaspの情報を調べてみるます。
   D:\Arduino\arduino-1.0.5\hardware\tools\avr\bin>avrdude -c USBasp -pm8 -v

2

USBaspの詳細情報が表示されます。ファームウェアをアップデートしろみたいな
メッセージがでています。

やり方を調べてファームウェアの更新をやってみました。
avrdudeコマンドを使って、書き込みを行うのですがarduino UNOを使ってやりました。

Dscn2378

しかし、エラーメッセージが消えませんでした。
うーん、なぜ?
とりわず、今日はここまで。


2014年1月26日 (日)

Arduino IDEでATtiny13でのLED点滅アプリの作成

-------------------------------------------------------------------------
(追記)
  この記事は古い内容です。
  「Arduino 1.8.5環境でATtiny13Aを利用する」にてArduino 1.8.5+MicroCoreパッケージ
  を使ったLED点滅について記載していますので、そちらを参照下さい。
-------------------------------------------------------------------------


Arduino UNO+Arduino IDEでATtiny13Aのアプリの作成と書き込みができるということで
試して見たいと思い、秋月電子 八潮店で買ってきました。50円で売ってました。

6

ATTINY13A-PUのスペック
・プログラムメモリ:1KByte 
・EEPROM:64Byte 
・SRAM:64Byte
・動作電圧:1.8V(4MHz)~5.5V(20MHz)
・外部クロック時:最高20MHz動作
・内蔵オシレータ:9.6MHz/4.8MHz/128KHzを選択可能
・8bitタイマ:1 
・PWM:2 
・A/Dコンバータ:10bit4ch
・アナログコンパレータ
・8ピンDIPパッケージ
作業は、
kosakalabさんのホームページ(http://make.kosakalab.com/)
「Arduino IDEでATtiny他の開発(Arduino-ISP編)」の記事を参考にさせていただきました。
丁寧で分かりやすい内容です。私でも簡単に実施できました。
記事を参考にして、環境を構築しサンプルソースのArduino IDEの
「スケッチの例->01.Basics->Blick」のコンパイルと書き込みを行ってみました。
修正はLEDのビン番号を13から3に変更しただけです。

5

コンパイル時にワーニングがでましたが、問題なくLチカが動作しました。
0

もっと凝ったことをやりたいのですが、
こんな簡単なプログラムでもフラッシュメモリ1024バイトのうち840バイトも消費しています。
I2Cを実装している方もいるようなので、ちょっと調べてみる予定です。
AVRのアーキテクチャをもっと勉強しないと、ならないですね。
スペックは貧弱ですが、動作に必要な全ての機能が入っていて、電源与えるだけで
稼働するするのですから、昔Z80をいじっていた自分としては驚きです。

Arduino IDEの環境でプロトタイプを作って、最終的にCPU1個に置き換えて
実装基板を小さくすることもできそうす。

2014年1月24日 (金)

Arduinoで美咲フォントを使った8x8ドットマトリクスLED(2)

前回の続きです。連続表示していると途中で表示が消える問題の原因が分かりました。
利用しているメジャーなSpriteライブラリが原因でした。

void Sprite::init(uint8_t width, uint8_t height)関数でcallocで動的メモリの獲得を行って
いるのですが、オブジェクトのインスタンス破棄後も解放されない状態です。
私は1文字表示するたびにSpriteクラスのインスタンスの生成と破棄を行っていたので
ヒープ領域の枯渇が発生したようです。

ライブラリを修正して対応できました。デストラクタを定義してfrre()しても何故か正常動作
しないため、_bufferを静的に8バイト固定で取得するようにしました。

修正:
  ・Sprite.cppのvoid Sprite::init(uint8_t width, uint8_t height) の
  _buffer = (uint8_t *) calloc(_height, 1);
   をコメントアウト
 ・代わりに、Sprite.cppの
      uint8_t *_buffer; をuint8_t _buffer[8]; に変更

これで、取りあえず連続動作出来るようになりました。
 
RTCモジュール(温度センサー付き)を取り付けて、現在の日時、時刻、気温も
表示出来るようになりました。

RTCモジュールはDS1307が搭載されていて、バッテリーバックアップがある製品を
使ったのですが、確かに電源切るとその時の時刻は記憶してくれるのですが、
その間、時を刻まないので意味無しです。電源入れる都度時刻設定が必要です。
これは使えんなぁ。


2014年1月20日 (月)

Arduinoで美咲フォントを使った8x8ドットマトリクスLED

前回の続きで、とりあえず8x8ドットマトリクスLEDにて美咲フォントによる日本語表示が
できるようになりました。複雑な漢字は8x8ドットだと可読が苦しいですがしょうがないですね。

特に処理的に遅い等の問題はなく、十分使えそうです。
ただしなぜか、繰り返し表示をすると途中で表示されなくなります。

表示されない間もシリアルのログ出力はされていて、フォントデータの取得はできています。
プログラムとしては、正常に動いている感じです。表示部に問題がありそうです。
表示にはMatrix+Spriteライブラリを使っていますが、自作に置き換えつつ問題解決を
する予定です。

表示用バッファの一部(ビュー)を見せる感じで、上下左右スクロール表示ができる
ような感じにしたいです。

2014年1月19日 (日)

EEPROM AT24C1024Bへの美咲フォントデータの格納

Arduinoで8x8ドットマトリクスLEDで
美咲フォントを使った日本語を表示を行うために現在いろいろとやってます。
意外と面倒です。

何気に苦労してやっとEEPROM AT24C1024Bにフォントデータを格納して、
指定したフォントデータの取り出しまで出きるようになりました。

テストプログラム(メインのみ)

void setup() {
  
  int code;
  wchar_t u16str[50];
  char str[] = "こんにちは、埼玉県♪";
  byte fontdata[8];
  char buf[32];
  unsigned long addr;
  int i;
  i2c_init();
  Serial.begin(9600);	// 9600bpsでポートを開く
  
  // UTF-8からUTF16に変換
  int len = Utf8ToUtf16(u16str, 50 ,str,strlen(str));
  Serial.print("len=");Serial.println(len,DEC);
 
  // フォントデータの取得
  int rc; 
  for (int j=0; j < len; j++) { 
    code = findcode(u16str[j]);
    addr = (unsigned long)code * 8;
    rc = (int)Sequential_read(addr, fontdata, (byte)8);
   
    // データ表示 
    sprintf(buf," u+%04x:c+%04d: ",u16str[j],code);
    Serial.print(buf);
    for (int i=0; i< 8; i++) {
      sprintf(buf,"%02x ",fontdata[i]);
      Serial.print(buf);
    }
    Serial.println("");
    print_font(fontdata);
  }
}

実行結果
実行結果

フォントデータの格納形式
  1)美咲フォントデータ本体(7120文字 x 8バイト: 56kバイト)
      生データはJISコード順ですが、arduinoでは文字コードとしてUTF-8を
      使っているため、UTF-16順にデータを並び替えて格納しました。
      
      収録フォント(括弧内は美咲フォントの収録フォント数)
        U+0020-007F 半角 ASCII文字 (95文字)
        U+0080-00FF 全角 ラテン補助 (11文字)
        U+0390-03FF 全角 ギリシア文字及びコプト文字(48文字)
        U+0400-04FF 全角 キリール文字(キリル文字)(66文字)
        U+2000-206F 全角 一般句読点 (15文字)
        U+2100-214F 全角 文字様記号 (3文字)
        U+2150-218F 全角 数字に準じるもの (10文字)
        U+2190-21FF 全角 矢印 (6文字)
        U+2200-22FF 全角 数学記号 (45文字)
        U+2300-23FF 全角 その他の技術用記号 (1文字)
        U+2460-24FF 全角 囲み英数字 (20文字)
        U+2500-257F 全角 罫線素片 (32文字)
        U+25A0-25FF 全角 幾何学模様 (12文字)
        U+2600-26FF 全角 その他の記号 (7文字)
        U+3000-303F 全角 CJKの記号及び句読点  (24文字)
        U+3040-309F 全角 平仮名 (174文字)
        U+30A0-30FF 全角 片仮名 (90文字)
        U+3200-32FF 全角 囲みCJK文字・月 (8文字)
        U+3300-33FF 全角 CJK互換用文字 (28文字)
        U+4E00-9FFF 全角 CJK統合漢字 (6356文字)
        U+FF00-FFEF 全角 半角・全角形 (91文字)

      UTF-16の広いコード空間に大して美咲フォントはスカスカなので、
      存在するフォントデータのみを詰めて格納しています。
      このデータは容量的に Arduino UNOの内部メモリに格納は無理なので
      EEPROM AT24C1024Bに格納します。

2)UTF-16コードテーブル (2バイト x 7120文字分 15kバイト)
     美咲フォントが対応している文字のUTF-8コード(2バイト)を格納順に
     並べたテーブルです。このテーブルを2分検索してフォントデータの
     格納位置を調べます。
     このテーブルは検索速度を考慮してArduino UNOのフラッシュメモリ上
     に配置しています。

当初、美咲フォントをJIS形式で格納してテーブルを用いてデータ参照を
考えていたのですが、これをやると、
     UTF-16コード  => 格納アドレス
のデーブルが必要で (2バイト+2バイト) x 7120文字 = 29kバイト必要で
Arduino UNOのフラッシュメモリ上に乗らないので止めました。

UTF-8からUTF16に変換は自力では無理そうなので、
やんちのプログラミングメモ(http://yanchde.gozaru.jp/) さんが公開している
関数を利用させていただきました。
    Utf8ToUtf16 http://yanchde.gozaru.jp/utf8_to_utf16/utf8_to_utf16_2.html

これでやっと、8x8ドットマトリクスLEDの表示の準備ができました。
フォントデータの格納のために、変換用ツール、PCからの書き込みツールなど
いろいろと作る必要がありました。

2014年1月12日 (日)

ArduinoでI2C接続EEPROM AT24C1024Bを利用するテスト

Arduinoで8x8ドットマトリクスLEDをつかって日本語を表示したいと思い、
美咲フォントを使おうと考えています。

この場合、次に列挙するハードウェア的、ソフトウェア的制約を解決する必要があります。
1)Arduino IDEでは文字のコード系にUTF-8を採用している。一方、美咲フォントは
   JISコードで管理されている。

2)記憶領域の制約
  Arduino UNO で使える内部記憶領域は、
   フラッシュメモリ 32kバイト、SRAM 2kバイト、EEPROM 1kバイト であり
   美咲フォント(半角・全角 7120文字) 56kバイトが格納できない。

コード系は何とかなるとして、フォントデータ格納領域は確保しなければなりません。
そこで、I2Cバスで接続するEEPROMに格納することにしました。
EEPROM は AT24C1024B (容量 128kバイト 5V動作)を選択しました。

AT24C1024Bを使った回路図

回路図はデータシートおよび、先人さんのブログを参考にしました。
SLC、SDAのプルアップ抵抗に2.2kΩの抵抗を入れています。
パスコンとして、10μFの電解コンデンサを1つ入れています。

ACT24C1024Bは1つのみの利用で、デバイスアドレスは0x50で利用するため
A1とA2をGNDに接続して0、0とします。

当初、何故かデータが正常に読み書きできずハマりました。
プログラムでは、AT24C1024BからNAKが帰ってきて読み書きに失敗する現象が
発生し、一週間近く悩みました。

最終的に「とりあえず、パスコンを入れてみるか」と、VCCとGNDの間に
0.1μFのセラミックコンデンサを入れると読込ではACKが帰るようになり、
10μFの電解コンデンサに変えたら正常に動作するようになりました。

実際の回路

Dscn2364

テストプログラム

1)I2Cバスデバイスアドレスについて
  データシートでは、デバイスアドレスは次のようになっています。

03
  arduinoのI2Cライブラリ(Wire)では、デバイスアドレスとして7ビットを指定します。
  その7ビットが1010[A2][A1][P0] に対応します。
  このうち[A2][A1]はICのA2、A1ピンで指定します。回路ではGNDに接続しているので
  0、0となります。

  つぎに[P0]はページ指定となります。ACT24C1024Bの容量は128kバイトあります。
  このメモリ領域をアクセスするには17ビット必要ですが、この17ビットの最上位が
  このP0となります。
  (ようするに、内部的には64kバイトのメモリが2つあって使いたい方の領域を、P0で
   指定することになります)。

 さらに[A2][A1]に異なる設定をすることで、ACT24C1024Bを最大4個つかうことが
  できます。

2)メモリ領域のアドレス指定
   [A2][A1][P0] 00000000 の19ビットで最大4つのACT24C1024Bを使った512kバイトの
   連続空間を指定することができます。
   19ビットの上位3ビットはデバイスアドレスで指定し、下位16ビットはI2Cライブラリの
   アドレス指定で利用します。

3)書込み・読込み
   データシートでは、1バイト単位の読み書きモードと、ページ単位の読み書きモード
   があるようですが、今回は1バイト単位でのみテストします。

4)実際のテストプログラム
 

//
// AT24C1024B 書込/読込テスト
//

#include <Wire.h>
#define DEVICE_ADDRESS 0x50  // AT24C1024B I2Cデバイスアドレス 

// 1バイト書込
// address: アドレス(19ビット 0x00000 - 0x7FFFF)
//      [A2][A1][P0] + 16ビットメモリ空間
// data   : 書込データ
//
void write(unsigned long address, byte data)  {
  uint8_t   devaddr = (uint8_t)DEVICE_ADDRESS | (uint8_t)(address>>16);
  uint16_t  addr    = address & 0xFFFF;
  int rc;

  Wire.beginTransmission(devaddr);
  Wire.write((byte)(addr >> 8));   // アドレス上位
  Wire.write((byte)(addr & 0xFF)); // アドレス下位
  Wire.write(data);
  rc = Wire.endTransmission();
#ifdef MyDEBUG
  Serial.print("write Transmission rc="); Serial.println(rc,DEC);       
#endif
  delay(6);
}


// 1バイト読込
// address: アドレス(19ビット 0x00000 - 0x7FFFF)
//      [A2][A1][P0] + 16ビットメモリ空間
//
byte read(unsigned long address)  {
  uint8_t   devaddr = (uint8_t)DEVICE_ADDRESS | (uint8_t)(address>>16);
  uint16_t  addr    = address & 0xFFFF;
  byte data = 0xFF;
  int rc;

  Wire.beginTransmission(devaddr);
  Wire.write((byte)(addr >> 8));   // アドレス上位
  Wire.write((byte)(addr & 0xFF)); // アドレス下位
  rc = Wire.endTransmission();
#ifdef MyDEBUG
  Serial.print("read Transmission rc="); Serial.println(rc,DEC);       
#endif
  rc = Wire.requestFrom(devaddr,(uint8_t)1);
  data = Wire.read();
#ifdef MyDEBUG
  Serial.print("read request rc="); Serial.println(rc,DEC);       
#endif
  return data;
}

// 書込みテスト
// 取りあえず10バイトだけ書込み後、読んで値をチェックする
//
void write_test() {
  unsigned long addr =0;
  byte data;
  
  Serial.println("Start Writeing test.");
  for (int i=0; i< 10; i++) {
     write(addr, (byte)i);   
     data = read(addr) ;
       Serial.print("data="); Serial.println(data,DEC);       
     if (data != (byte)i) {
       Serial.println("Error!");
     }
     addr++;     
  }
  Serial.println("Done.");
}

void setup()
{
  Serial.begin(19200);
  Wire.begin();
  write_test();
}

void loop() {

}

実行結果

04

読み書きは出来たので、次の課題は56kバイトの美咲フォントデータを このEEPROMに書き込むことです。これについてはTeraTermのファイル送信機能を利用を 考えています。

2014年1月10日 (金)

OCN モバイル ONE SIM発行手数料無料キャンペーンを利用してみた

OCN モバイル ONE SIM発行手数料無料キャンペーンにてSMS対応SIMカードを申込み、
昨日カードが届きました。キャンペーン中はSIMカードの発行手数料が無料です。

01

年末に申し込んだため、10日程度かかってしましました。
SIMカードは2枚となりました。

旧SIMカードと併用して容量シェアで利用してもいいし、旧SIMカードを解約してもよいの
ですが、容量シェア(SIM カード2枚)の場合、 472.5円(SIM追加)がかかります。
まあ、1か月くらいは容量シェアを試して、いずれ返却するつもりです。

さっそく、ARROWS Me F-11DをSMS対応SIMに交換しました。
追加分のSIMカードはただ交換するだけで利用できました。旧SIMも同時利用できます。

SMS対応の場合、月額126円追加となりますが、
F-11Dもセルスタンバイ問題が発生する機種だそうで、これにて問題解消で
バッテリーの消費がもっと抑えられることを期待します。
数日つかってみて、確認するつもりです。

2014年1月 5日 (日)

arduinoでMAX7219を使った8x8ドットマトリクスLEDを表示する

到着したので、製品チェックのために回路を組んでみました。

01

MAX7219は少ない部品でLEDを制御することができます。
10個で$4.75円で購入しました。1個あたり50円くらいです。到着まで2週間くらいかかりました。
今検索すると私が購入した価格より安い10個 $4.38があります。

到着したMAX7219 10個
Dscn2340

このIC、国内では取り扱っているショップがあまり多くないようです。
メジャーな通販ショップではマルツパーツ館が販売していますが、1個999円します。
工作室売店さんでは1個180円で販売しています。

まあ、安く手に入りましたがその分、品質や納期が不確定です。
早速、動作確認のため回路を組んで動かしてみました。
arduinoでMAX7219を使った8x8ドットマトリクスLEDを制御するライブラリが公開されており
そのライブラリを利用しました。

また、次のホームページの情報を参考にさせていただきました。
・1)建築発明工作ゼミ2008 「Arduino マトリックスLED2/MAX7219」
・2)PJRC  「Matrix & Sprite Libraries」
・3)マキシム MAX7219, MAX7221 シリアルインタフェース、8桁、LEDディスプレイドライバ

ほとんど1)のプログラム及び回路を利用させていただきました。
とりあえず、最終的には問題なく動作しました。

MAX7219の他に次の部品を使っています。
赤色ドットマトリクスLED(アノードコモン) 8x8ドット OSL641501-BRA
・抵抗 68KΩ x1 MAX7219のISETに接続する抵抗でセグメントあたりに流す電流を決定
・セラミックコンデンサ 0.1μF (MAX721用のパスコン)

部品点数が少なくて楽です。arduinoとの配線数は5本となります。

Dscn2347

MAX7219では、セグメント当たりに流す電流はISETに接続する抵抗で設定することができます。
データシートにもその選定方法が記載されています(表はデータシートより抜粋)。

02

今回利用したドットマトリックスLEDはVLED=2.1V、1つのLEDにつき10mA弱流せば
良いのでRSETは表の63.7kΩに近い68KΩにしました。
これでも結構明るいです。100kΩでも良いかもしれません。

また、データシートにはV+とGND間に10μFの電解コンデンサと0.1μFのセラミックコンデンサを
接続せよと説明があり、とりあえず0.1μFのセラミックコンデンサを繋げました。
データシートのサンプル回路図には0.1μFのコンデンサしか入ってないので大丈夫でしょう。
ちなみに0.1μFのセラミックコンデンサも抜いたら表示内容(多くLEDを付ける)により
動作しなくなりました。

ほとんどパクリの回路とプログラムですが動作はこんな感じです。

問題なく動作したので、8x8ドットマトリックスLEDを2枚使って表示器を作り、
色々と表示するプログラムを作成したいと思います。
8×8 ドット日本語フォント「美咲フォント」 も試してみたい。

2014年1月 1日 (水)

明けましておめでとうございます

明けましておめでとうございます。今年もよろしくです。

まあ、あまり年始めの感覚がありませんが、
天気も良くまーたりとよい元旦を過ごせそうです。

我が家の猫達は、日の当たる所でお昼寝です。

Dscn2291

Dscn2322

この2匹、寝るときはいつも別々の部屋です。
喧嘩はしませんが、一緒に寝たり毛づくろいし合ったり等は一切しません。

白黒のルミちゃんは一緒に遊びたいようで、茶トラのたまちゃんにちょっかいを出す
のですが、たまちゃんは一人が好きなようです。すぐ逃げます。

飼い主としては、もっとベタベタとじゃれ合う姿を見たいのですが。

とりあえず、今年も平穏な日常を過ごせますように。

元旦

追記

寝ているルミちゃんをもふってみる。

Dscn2314

オレ 「もふもふ、でへへへっ、ルミつぁ~ん」
ルミ 「!?」

Dscn2313

ルミ 「ガブリ」
オレ 「うぎゃー」

« 2013年12月 | トップページ | 2014年2月 »