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

« 2015年1月 | トップページ | 2015年3月 »

2015年2月の8件の記事

2015年2月22日 (日)

arduinoで安価にテレビに映像を出力するその2

ビデオ出力ネタです。

以前arduinoで、arduino-tvoutという映像出力を試してみたのですが、
今回はNigel Battenさんがホームページ「Batsocks」にて公開している、
TellyMateを試してみました。

(注意: TellyMakeの商標は作成者Nigel Battenさんにあります。回路図やソースは
  公開されており、自由に利用できますが、TellyMakeを名乗るのは控えましょう)

01
(紹介ページ: http://www.batsocks.co.uk/products/Other/TellyMate.htm )

TellyMateを簡単に説明すると、Atmega8/88/168/328p を使った
ビデオ出力モジュール(ターミナル出力モジュール)です。
arduinoとシリアル通信でデータをやり取りして、キャラクタ表示をテレビに出力
できます。

02
   TellyMate TTL Kit購入ページ   http://www.batsocks.co.uk/products/Other/TellyMate%20TTL%20Kit.htm

Atmega8/88/168/328p系列のAVRマイコンに少々の部品で作成できます。
回路図およびソース、サンプルプログラムが公開されています。
更にキットの販売も行っています(上記の写真のリンクで購入できます)。



んで、早速ブレッドボード上に作成してみました。
水晶発振子、三端子レギュレータ等、部品揃えるのよりは
arduino pro mini(中華製) 1個使った方が速そうなので、arduinoのブートローダ部は
潰してUSBbaspでプログラムを書込みました。

追加パーツは、
  秋月電子RCAジャックDIP化キット 100円
  ダイオード 1N4148  2個 4円
で合計300円くらいで実装出来ます(ブレッドボード、ワイヤー類は除く)。 

書込みのためのバッチファイル、イメージファイルが用意されていて
回路ができれば、コマンドを一回実行すれば焼き上がります。

実際に組みあがった雰囲気はこんな感じです。
ビデオコンポーネント出力を小型液晶モニタに接続して映しています。

arduinoとモジュールをシリアル接続して、arduinoから制御して画面を表示します。
ダム端末ってやつですよね、これって。

Dscn3629

フォントが自由に定義出来るっぽいので、試しに美咲フォントを流用して
半角カタカタを流し込んでみました。ちゃんと表示できましたね。
(フォントデータの書込みはarduino側からできます)。
表示には倍角表示機能があり、大きく表示することもできます。

Dscn3630

シリアル接続なので、arduinoではなく、パソコンに繋げてTera Termで通信すれば
打った文字がそのまま表示するこもできます。
通常のコンソール画面的な制御(制御文字、エスケープ文字)で文字の表示制御
ができます。

表示はNTSCとPALに対応しています。接続してるモニタはNTSCよりもPALの方が
綺麗に映りました。テレビにつなげるとPALでは映らず、NTSCでのみ映りました。
スケッチはこんな感じです。ただ単に、シリアル接続して出力しているだけです。

/* Example Sketch for a TellyMate Shield */
/* Hello World */
#define CHAR_ESC '\x1B'
#define CHAR_DLE '\x10'
void setup()
{
    Serial.begin( 57600 ) ;
    Serial.write( CHAR_ESC ) ;
    Serial.write( 'E' ) ; // clear screen    
    
    for ( byte row = 0 ; row < 25 ; row++ ){
        tm_cursor_move( row , 0 ) ; // move the cursor the required row (any column would do)
        Serial.write( CHAR_ESC ) ;
        Serial.write( '_' ) ;
        Serial.write( ':') ; // use the specified fontbank
    }
    tm_cursor_move( 0 , 0 );

    Serial.println( "Hello World!" ) ; 
    Serial.println("\n");    
    Serial.write( CHAR_ESC ) ;
    Serial.write( '_' ) ;
    Serial.write( '4') ; // use the specified fontbank
    Serial.println("\xc8\xba\x20\xc6\x20\xba\xa5\xdd\xa5\xca\xde\xa5\xdd\xa5\xdc");   
    Serial.write( CHAR_ESC ) ;
    Serial.write( '_' ) ;
    Serial.write( '5') ; // use the specified fontbank
    Serial.println("\xc8\xba\x20\xc6\x20\xba\xa5\xdd\xa5\xca\xde\xa5\xdd\xa5\xdc");   
    Serial.write( CHAR_ESC ) ;
    Serial.write( '_' ) ;
    Serial.write( '0') ; // use the specified fontbank
    for (uint8_t i=32; i < 255;i++) {
      Serial.write( i ) ; 
    }
    Serial.println("\n");    
    Serial.println( "\xca\xdd\xb6\xb8\xb6\xc0\xb6\xc5") ; 
    Serial.println("\n");    

    //Serial.write( CHAR_ESC ) ;
    //Serial.write( 'Q' ) ;
}


void tm_cursor_move( uint8_t row , uint8_t col )
{ // <ESC>Yrc
  Serial.write( CHAR_ESC ) ;
  Serial.write( 'Y' ) ;
  Serial.write( 32 + row ) ;
  Serial.write( 32 + col ) ;
}
void loop()
{
    // do nothing!
}

意外といい感じに使えます。キャラクタ表示のみですが、
キャラクタを使って擬似的な76x75のグラフィック表示が可能です。

2015年2月17日 (火)

Aliexpressで購入した商品が不良品のため「紛争」を起こすことに..

Aliexpressでビデオキャプチャーを購入したのですが、粗悪品で全然ダメダメ状態でした。

01

Dscn3609

IchigoJamやプレイステーションの画像をパソコンに取り込んで表示したかったのですが、
この有様です。

IchigoJamの画面は乱れ(これは、IchigoJamに原因があるかも)、

Img_2

PlayStationのゲームは激しくスクロールします。

2

これは酷過ぎる。
この症状を画像を添付して販売者に連絡すると、意外と紳士的な対応でした。

次の返信が帰って来ました。

Dear friend,
Thanks for your message .
Please open dispute and apply for full refunding,then inform us here ,
we'll reponse you asap .
Regards.

連絡ありがとう。
紛争を起こして、全額支払い要求をしてね。迅速に対応するから、よろしく!


みたいな返信をもらいました。
早速「紛争(Open Dispute)」を起こして、全額返金要求をしました。
素直に相手が認めれば返金になります。

購入商品のリンクを開くと商品が別のにすり替わってます。

03

粗悪品なので切り替えた感がありますね。

まあ、エスクローという保証システムのおかげて返金できそうです。

2015/02/26 追記

04

売り手が全額返金(商品返品なし)の要求を受け入れてくれました。
「紛争」で返金の場合は、売り手の評価には影響が無いみたいなので、
一方的に「☆1つ」の最低評価と批判コメントをつけて売り手の信用を下げるよりは、
交渉した方が良さそうです。

2015年2月15日 (日)

IchigoJamとArduinoとの連携(1)

IchigoJamATtiny13A(赤外線リモコン受信機能搭載)をつなげて、
「ゲームなんか作ると面白そう!」と思い、今回はその準備と実験結果のメモです。

IchigoJamにはシリアル通信機能があるのでそれでつなげれば一番簡単なのですが、
コンソールと共用のため画面にもデータが表示されてしまい画面が乱れます。

そこで、IchigoJamのI/O端子を利用してデータ通信を行うことにしました。
IchigoJam BASICからは、IN命令、OUT命令でビット単位での入出力が出来ます。
(ICのラベルにピン割り付けが表示されています)

IchigoJamの入出力ピン
    出力ピン:OUT1〜 OUT6(EX3がOUT5, EX4がOUT6)の6ピン
     入力ピン:IN1 〜 IN4の4ピン


まずは、この入出力ピンを使ってarduinoからバイトデータを取得する機能を
実装してみます。
赤外線リモコンのデータ受信を想定し、IchigoJamからはポーリング形式で
データを取得します。データが無い場合でも即時復帰します。
取得するデータは1バイトとし、入力ピン2つを使って一度に2ビット受信し、
4回受信して1バイトを作成します。

通信機能概要
・IchigoJamから、arduinoにデータ取得要求を行う。
・IchigoJamで同期用クロックを生成し、arduinoから2ビットずつ受信する。
・4回受信を行い8ビットデータを受信し、通信を終了する。
・通信中はIchigoJamから、一方的に中断を行う場合もあるので、
   arduinoの同期待ちにはタイムアウト機能が必要となる。
・arduinoでは、赤外線受信において待ち状態になるので、
  IchigoJamからのデータ取得要求は割り込み処理により実装する。

なんか、意外と面倒な処理臭いのでDFD(データフロー・ダイアグラム)を書いてみました。
(クリックすると拡大表示します)

02


ちょっと分かりやすくなった気がします。
IchigoJamのポーリングと、赤外線リモコンのボタン押しのタイミングが
同期していない点が要注意ですね。

ボタンの状態はキューは使わず、最新の状態のみを保持することにします。
ただし、ボタンが押されていない場合、IchigoJamが古い同じデータを取得すると
まずそうなので、配布状態を管理することにします。

次にIchigojamとarduinoの接続です。

01

こんな感じで、データ用は4線接続です。
データ送信を2ピンにしたのは、Ichigojamの演算処理が遅いためです。
1ビットを2ビットにするだけで、演算回数が減り2倍の速度になりました。
(4ビットにするとさらに早くなりますが、接続ピン数節約とします)

ここで問題となるのが、Ichigojamが3.3V駆動であることですが、
3.3Vで動く手持ちのArduino Uno互換機を使いました。
最終的にATtiny13A(3.3V)を想定しているのでこれで良しとします。

Dscn3608

実装ソース
Ichigojam側
5 OUT6,0:OUT6,1
20 D=0
30 OUT5,0:OUT5,1:D=((IN()&3)<<6)
40 OUT5,0:OUT5,1:D=D+((IN()&3)<<4)
50 OUT5,0:OUT5,1:D=D+((IN()&3)<<2)
60 OUT5,0:OUT5,1:D=D+((IN()&3))
70 PRINT D
80 GOTO 5

単純に受信したデータを表示するだけです。
5行のOUT命令でarduinoにデータ受信の割り込みをかけています。
30〜60はOUT命令でLOW→HIGHのクロックを生成して2ビットデータをIN命令で
取得しています。

arduino側

//
// IchigoJamにデータを送信
//

#define ICHIGO_CLK   7
#define ICHIGO_OUT6  0
#define ICHIGO_IN1  8
#define ICHIGO_IN2  9

uint8_t buttoncode = 0; 
uint8_t flgsent = 0;

void setup() {
  reset();
  pinMode(ICHIGO_CLK,INPUT);
  pinMode(13,OUTPUT);
  pinMode(ICHIGO_IN1,OUTPUT);
  pinMode(ICHIGO_IN2,OUTPUT);
  attachInterrupt(ICHIGO_OUT6,reqest, RISING);
  Serial.begin(115200);
  randomSeed(analogRead(0));
}

void reset() {
  flgsent = 0;
  buttoncode = 0;
}

// 同期クロック待ち(タイムアウト付き)
// 戻り値:0 同期
//        1 リセット抜け
void clk() {
  uint16_t cnt = 0;
  uint8_t flgtout = 0;
  // CLK _| ̄ (L->H)を検出待ち 
  while(digitalRead(ICHIGO_CLK) == LOW && flgtout== 0) {
    delay(1);
    cnt++;
    if (cnt > 50) flgtout=1; 
  } 
  cnt=0;
  while(digitalRead(ICHIGO_CLK) == HIGH && flgtout== 0) {
    delay(1);
    cnt++;
    if (cnt > 50) flgtout=1;
  }
  return;
}

// データ取得要求割り込み
void reqest() {
  if (flgsent) {
    send_data(0);            // 送信済みの場合
  } else {
    send_data(buttoncode);   // 未送信の場合  
    flgsent = 1;
  }
}

void setButtonData(uint8_t b) {
  buttoncode = b;
  flgsent = 0;
}

// データ送信
uint8_t send_data(uint8_t d) {
  for (uint8_t i=0; i <4; i++) {
    // CLK _| ̄ (L->H)を検出待ち
    clk();
    //上位2ビット取得
    digitalWrite(ICHIGO_IN2,bitRead(d,7));
    digitalWrite(ICHIGO_IN1,bitRead(d,6));
    d<<=2;
  }
  return 0;
}

void loop() {
 uint8_t r;
 r = (uint8_t)random(256);
 setButtonData(r);
 Serial.print(buttoncode);
 Serial.print(" [");
 Serial.print(flgsent); 
 Serial.println("]");
 delay(100);
}

arduino側では、IchgoJamのOUT命令で割り込みを発生させて、
データ送信を行っています。clk()関数で2ビット送信の同期をとっていいます。

物理ボタン(赤外線リモコンのボタン)は実装していないので、
今回は乱数を発生して、ボタンの代わりとしてます。

一応、これで問題なく動いています。次は赤外線受信部を実装してみます。

単純な処理ですが、今回の通信の作成で割り込み処理や、同期の取り方等の
勉強になりました。

2015年2月 7日 (土)

IchigoJamでのBASICプログラミング その1

IchigoJamでのBASICプログラミングは、コードを記述するメモリー領域が
1Kバイトしかないため、ちょっとしたプログラムを書くとすぐにメモリーオーバーとなります。
色々と工夫が必要です。



まず、実用的なプログラムとして1/60秒カウンタ TICK()関数を使って
時計を作成してみました。

Dscn3588

10 CLS
20 H=18:M=48:S=0
30 ?"H=";:INPUT H
40 ?"M=";:INPUT M
50 ?"S=";:INPUT S
60 CLS:CLT:GOTO 100
80 T=TICK():IF T%60=0:GOTO 100
90 GOTO 80
100 S=S+1:IF S=60 S=0:M=M+1:IF M=60 THEN M=0:H=H+1:IF H=24 H=0
110 LC 0,0:? "        "
120 IF H<10 ?"0";
130 ?H;:?":";
140 IF M<10 ?"0";
150 ?M;:?":";
160 IF S<10 ?"0";
170 ?S
180 GOTO 80

IchigoJamは時計機能は無いのですが、TICK()関数でも
実測で24時間で5分程度のズレ(0.34%のずれ)の時計が出来ました。
この程度のズレなら、ラーメンタイマーやプレゼンテーションタイマーに使えます。
(効果音は当然チャルメラ♪)

CPU NXP LPC1114のデーターシートを見ると内部クロック(CR発振回路)のずれは1%
と明記しています。水晶振動子で外部から正確なクロックを与えたらもっと精度が
上がるかもしれません。

「取りあえず使えそうだ、実用には時刻を大きく表示したい!」ということで、
キャラクタ文字で数字を作成しようと試みると、

Dscn3577

0〜5までの文字で"Out of memory"が発生しました。
これは想像以上に厳しい。

そこで、1文字3x5のパターンをビットデータに置き換えて配列に格納することにしました。
1文字3x5=15ビット(2バイト)なので1文字は配列の1変数に格納できます。

取りあえず、文字の表示の確認。実行結果は下記の通り。見た目はいい感じです。

Dscn3602

10 CLS
30 [0]=31599:[1]=4681:[2]=29671:[3]=29647:[4]=23497
40 [5]=31183:[6]=31215:[7]=29257:[8]=31727:[9]=31695
50 [10]=1040:[11]=0:[20]=32:[21]=1
100 N=0:P=0:Q=0
210 X=P:Y=Q:GOSUB 500
220 N=N+1:IF N=10 N=0
230 P=P+4:IF P>35 P=0:Q=Q+6:IF Q >20 ?:END
240 GOTO 210
500 B=12
510 D=[N]>>B&7:GOSUB 600:IF B>=0 GOTO 510
520 RETURN
600 LC X,Y:?CHR$([20+(D&4>0)]);CHR$([20+(D&2>0)]);CHR$([20+(D&1>0)]);
610 Y=Y+1:B=B-3
620 RETURN

プログラムは、こんなにも短く出来きました。
(ソース見ても何やってるか分からない状態でが..)

しかし、処理時間がかかり過ぎて実用的でないです。
実際の動作の様子の通りです。


これでは、秒刻みの時計はちょっと無理そうです。
う〜ん、遅い。昔の8ビットパソコンに比べても2桁遅い気がします。
まあ、1チップでNTSCのビデオ信号生成までやってるので、これは仕方がないですね。

分刻みの時計ならいけるかも。

制約が大きい分、かなりの工夫が必要となります。
テクニックとアイデアを駆使せねばなりません。

つぎは、「ブレゼンハムのアルゴリズム」を使って整数演算だけで円を書いてみます。

2015年2月 5日 (木)

ReadyNAS上に電子書籍閲覧サーバーを試しに作ってみました

ReadyNAS上に保存している電子書籍をPCやタブレットで気軽に閲覧したいと思い
試しに構築(PHP+MySQLで作成)してみました。

書籍は自炊したものやもらったり以前ダウンロードしたしたものなどです。
(現時点では、ダウンロードは違法ですので注意)

形式はzip・rar形式でjpg,pngファイルをアーカイブ圧縮したファイルです。
意外と使えそうです。

フォルダーに突っ込んだファイルをスキャンしてデーターベース上に
書籍情報を構築しています。

01

検索してプレビューで確認後、閲覧できます。

02

PDF対応もしたいけど、PDFから任意のページだけ切り出す
方法が分からないです。ちょっと調べて本格的に作成しようと思います。

ReadyNAS、ほとんどサーバーマシンとして稼働してます。

2015年2月 4日 (水)

IchigoJam用の支援ツールLinux版を作成しました

この前作成したIchigoJam用の支援ツールのLinux版を作成しました。

ダウンロード ファイル: ichigotools.tar     (2016/03/16版)

機能はこの前のWindows版とほぼ同じです。
CentOS 6.6(x86)での動作を確認しています。

2016/03/16 追記

    Raspberry Pi (Raspbian Jessie)に対応しました。


シリアル接続が必要となります。

ツールはシェルプログラム(bash)で記述しています。
支援ツールと名乗ってますが、大したことはやってません。
短いプログラムです。自由に流用して下さい。


解凍方法

tar xvf ichigotools.tar
./ichigotools/
./ichigotools/rcmd
./ichigotools/rsave
./ichigotools/rload

解凍したプログラムは、パスの通っているディレクトリに入れる等して使って下さい。

シリアルデバイスについて
デフォルトではシリアルデバイスは/dev/ttyUSB0としています。
tty=/dev/ttyUSB0

使う場合には、上記箇所を各自環境に合うようソース修正が必要となります。
rloadコマンドの例
下記のソースのttyの定義を修正します。

2016/03/16 追記 ソースの内容を修正しました

#!/bin/bash
PRE_IFS=$IFS
IFS=$'\n'

tty=/dev/ttyUSB0  
l_delay=0.4     # delay for line
c_delay=0.04    # delay for character

stty -F ${tty} 115200 \
-iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr \
-onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig \
-icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase \
-tostop -echoprt -echoctl -echoke 
filename=$1

echo > ${tty}
echo "NEW" | while read -rN 1 c
do
	echo -n "$c" > ${tty}
	sleep ${c_delay}
done
echo > ${tty}


sleep 0.1
echo -n "loading now."
cat ${filename} | while read -r line
do
	echo "${line}" | while read -rN 1 c
	do 
		echo -n "$c" > ${tty}
		sleep ${c_delay}
	done
	echo > ${tty}
	sleep ${l_delay}
	echo -n "."
done
echo -e "\ndone."
IFS=$PRE_IFS
また、シリアルデバイス(/dev/ttyUSB0)の利用権限が必要となります。
利用権限の設定を行って下さい
(例: 一時的 #sudo chmod o+rw /dev/ttyUSB0
       永久的 #sudo gpasswd -a USER dialout  ・・・ USERは利用者のアカウントを指定
)

ツールの使い方

エラー処理は一切実装していません。万が一の場合もあるので、
一般ユーザ権限で利用して下さい。

1)ichigojamのプログラムをファイルに保存する
   rsave ファイル名
  実際の例

  02 

2)ファイルをichigojamにロードする
   rload ファイル名

   Linux上にある指定したプログラムをichigojamに送信してロードさせます。
   1行、および文字単位でウィエイトを入れているため、プログラム量が多い場合
   時間がかかります。
   
   実際の例

  03

3)リモートコマンド実行
    rcmd コマンド

    例: ./rcmd "? 2*3*4"

           6
           OK 

    空白文字を含む場合は、コマンドはダブルクオーテーション(")で囲って下さい。
    ゲーム等のすぐに処理が終了しないプログラムを実行した場合でも2秒間で
    タイムアウトして復帰します。

    実際の例

    01


補足
rloadコマンドでは、ichigojamへのテキスト送信で
行、文字単位で遅延を行っています。
状況によっては、遅延時間の調整が必要になるかもしれません。
ソースを修正して調整して見てください。

プログラムではsttyコマンドでシリアル通信の設定しているのですが、
環境によってはパラメタの修正が必要になるかもしれません。

2015年2月 3日 (火)

arduinoで利用可能な漢字フォントROMの製作(2)

「arduinoで利用可能な漢字フォントROMの製作」の続きです。

SPI接続のフラッシュメモリ W25Q64BV に漢字を含む14種類のフォントデータを載せて
arduinoで汎用的に利用できる 漢字フォントROMを作成しました。
その作成手順とテストをまとめました。

まずは14種類のフォントファイルから、漢字フォントROM用データの作成です。
ツールを作成しました。需要は無いと思われますが公開します。

1.ツールによる漢字フォントROM用データの作成
    作成するデータは、14種類のフォント(全角、半角)を格納したバイナリファイルです。
    arduinoが採用している文字コード系 UTF-8に親和性のあるUTF-16のインデックスを
    付加したデータとなります。

    作成はすべてWinddows 8.1上で行いますが、perl(ActivePerl)が必要です。

    手順
    1)ツールをここ(fonts.zip)からダウンロードして下さい。
       解凍すると、\fontsフォルダ下に次のファイルが入っています。

      01

   2)この中にフォントデータは含まれていません。次のサイトから入手して、
     上記フォルダbdf内にファイルを配置して下さい。
     フォルダbdfには全部で14個のファイルを配置します。
    (1)8×8 ドット日本語フォント「美咲フォント」 X11 BDF 形式
      ファイル: misaki_bdf_2012-06-03.tar.gz

      解凍したファイルから、次のファイルを .\bdf フォルダに配置して下さい。
         misaki_4x8_iso8859.bdf
         misaki_gothic.bdf

    (2)/efont/ 日本語 ビットマップフォント集
       ファイル: japanese-bitmap-fonts-0.4.5.tar.bz2

       解凍したファイルから、次のファイルを .\bdf フォルダに配置して下さい。
         .\kappa20\10x20a.bdf
         .\kappa20\k20.bdf
         .\naga10\5x10a.bdf
         .\naga10\knj10.bdf
         .\shinonome12\shnm6x12a.bdf
         .\shinonome12\shnmk12.bdf
         .\shinonome14\shnm7x14a.bdf
         .\shinonome14\shnmk14.bdf
         .\shinonome16\shnm8x16a.bdf
         .\shinonome16\shnmk16.bdf
         .\x11\12x24a.bdf
         .\x11\jiskan24.bdf

  3)
バイナリフォントデータの作成
     コマンドプロンプトを開き、\fonts のディレクトリに移動します。
     makeall.bat を実行します。
     これにより、バイナリフォントデータを作成します。
     ほかに、幾つかのファイルを生成しますが、利用するファイルは次の2つです。
       .\utf_fontbin\u_font.bin  … 全種半角全角結合フォント
       .\u_table.h                   … Arduinoライブラリ exfont用フォントテーブル構造体ソース

     その他の生成されたファイルについては、添付のREADME.txtに説明を記述しています。

     これで、フォントデータの作成は終了です。
     一部のフォントでUTF16コード変換でエラーが発生しますが、無視して結構です。

  < 2016/04/18 追記、2016/04/19 修正

   バイナリファイル版を用意しました。

     下記からダウンロードして解凍してご利用下さい。
     ココログの制約から2つに分割しています。
       ダウンロード exfontbin.z01 (800.0K)
       ダウンロード exfontbin.zip (510.4K)

     解凍はwinrarを使い、上記2つのファイルを同じフォルダに入れて exfontbin.zipの方を
     解凍ツールで解凍すれば、解凍出来ます。   

        ライブラリではフォルダ内のu_font.bin、u_table.h を利用します。
     本ファイルを利用するのであれば ステップ1はスキップして下さい。
     ライセンスに関しては、添付のREADME.txtを参照して下さい。
     フォントに関してはフォント製作者に著作権があります。各フォントのライセンスに関する
     記載内容を確認の上、個人・非商用利用に限り配布可能と判断いたしました。
     本配布について問題があるようでしたらご指摘下さい。
   
2. フラッシュメモリへの書込み
   手持ちの CH341A Programmer を使って書込みます。
   前回は「Serprog/Arduino flasher」で行いましたが、これを使うと非常に楽ちんです。

   国内だとaitendoさんで購入出来ます: フラッシュ/SPIプログラマ [PRG341A]
   
     04

  Aliexpressebayなんかだと、400円くらいから購入出来きます。
   
    03

   操作は、利用するフラッシュメモリの種類を設定して、書き込むデータとして
   作成した u_font.bin を指定して読み込みます。 
   あとは、[auto]ボタンを押して、 書込みを開始します。

  Photo

  数分で書込みが完了します。
  CH341A programmer については、「CH341A programmerを試してみました」にも
  使い方等を書いています。
 
3. arduinoでの漢字ROMの利用
   作成した漢字ROMを使うには、次の物が必要です。
    ・arduinoで 漢字ROM (W25Q64BV) を利用する回路を作成する。
    ・漢字ROM を利用するスケッチ (プログラム)を作成する。

1)arduinoで 漢字ROM (W25Q64BV) を利用する回路の作成
  対象は、arduino Unoで利用する場合とします。
  W25Q64BVは、3.3V駆動のため、CD4050でレベル調整しています。
  回路図
01_2
  実際の結線接続イメージ

02Dscn3574

3.3Vで駆動できるArduinoでは直接、接続して利用します。



2)スケッチ(プログラム)の作成
  ライブラリを作成しました。ダウンロードして各自のarduino IDEに
  ライブラリとして登録して下さい(スケッチ保存場所ディレクトリのlibrariesに
  exfontsと、W25Q64を入れる)。

  ダウンロード: libraries.zip
  解凍すると、2つのフォルダ
   ・exfonts : 漢字利用ライブラリ :
   ・W25Q64: SPI接続 フラッシュメモリ W25Q64 利用ライブラリ
  が得られます。

  一点、修正作業があります。 
  「1.3)バイナリフォントデータの作成」で作成したu_table.hを、
  exfontsのフォルダに入れて下さい。既に同名のファイルが入っていますが、
  オリジナルのフォントデータの修正等により、内容が異なる場合があります。

3)サンプルプログラムの実行
    arduino IEDを起動して、
       メニュー [ファイル] - [スケッチの例] - [exfonts] - [exfonts_sample]
    を選択します。

   04 
 

#include <SPI.h>
#include <W25Q64.h>
#include <exfonts.h>

exfonts ft;  // フォント管理オブジェクト

// ビットパターン表示
// d: 8ビットパターンデータ
//
void bitdisp(uint8_t d) {
  for (byte i=0; i<8;i++) {
    if (d & 0x80>>i) 
      Serial.print("#");
    else
      Serial.print(".");
  }
}

// フォントデータの表示
// c(in) : フォントコード(UTF16コード)
//
void fontdisp(uint16_t c) {
  byte buf[MAXFONTLEN]; 
  ft.getFontData(buf,c);        // フォントデータの取得
  byte bn= ft.getRowLength();   // 1行当たりのバイト数取得
  
  Serial.print(ft.getWidth(),DEC);
  Serial.print("x");      
  Serial.print(ft.getHeight(),DEC);      
  Serial.print(" ");      
  Serial.println((unsigned short)c, HEX);  // UTF16コード表示

  for (byte i = 0; i < ft.getLength(); i += bn ) {
      for (byte j = 0; j < bn; j++) {
        bitdisp(buf[i+j]);
      }
      Serial.println("");
  }
  Serial.println("");
} 

void test(char* pUTF8) {
  int n;
  uint16_t pUTF16[100];
  n = exfonts::Utf8ToUtf16(pUTF16, pUTF8);  // UTF8からUTF16に変換する

  // 7種類フォントサイズで表示
  for (byte i=0; i < MAXSIZETYPE; i++) {
    ft.setFontSize(i);      // フォントサイズの設定
    for (byte j=0; j < n; j++) {
      fontdisp(pUTF16[j]);  // フォントパターンの表示
    }
  }
}

void test02() {
  
}

void setup() {
  Serial.begin(115200);
  ft.init();  // フォント管理の初期化
  Serial.println("exfont liblary");
  char *pUTF8 = "AAアイウエオ12A\¢£§¨¬°±´¶×÷埼玉さいたま";
  //char *pUTF8 = "1aA!#/";
  //char *pUTF8 = "あ";
  test(pUTF8);
}

void loop() {
}

サンプルでは、test()関数にて利用するフォントサイズを
  ft.setFontSize(i)
で指定し、パラメタで指定されたpUTF8に格納されている文字列を
シリアルモニタに表示しています。

実際にフォントデータの取得と表示を行うのは fontdisp()関数です。
  ft.getFontData(buf,c)
にて、指定した文字(UTF16)に該当するデータを取得します。

サンプルを実行すると、7種類の異なるフォントでシリアルモニタ上に
フォントパターンを文字で表示します。

05


作成したフォントの問題点
・半角カタカタは使えません。半角カタカナを取得しようとすると全角カタカナを返します。
・①②などの一部の特殊文字は使えません。

フォントROMのデータ配置について
u_table.h がフォントROM内の構造を示しています。

static FontInfo _finfo[EXFONTNUM] = {
	{ 0x000000, 0x00017E,  191,  8,  4,  8 }, // 0:u_4x8a.hex
	{ 0x000776, 0x000976,  256, 10,  5, 10 }, // 1:u_5x10a.hex
	{ 0x001376, 0x001576,  256, 12,  6, 12 }, // 2:u_6x12a.hex
	{ 0x002176, 0x002330,  221, 14,  7, 14 }, // 3:u_7x14a.hex
	{ 0x002F46, 0x003100,  221, 16,  8, 16 }, // 4:u_8x16a.hex
	{ 0x003ED0, 0x00404C,  190, 40, 10, 20 }, // 5:u_10x20a.hex
	{ 0x005DFC, 0x005FB6,  221, 48, 12, 24 }, // 6:u_12x24a.hex
	{ 0x008926, 0x00BEE4, 6879,  8,  8,  8 }, // 7:u_8x8.hex
	{ 0x0195DC, 0x01CB96, 6877, 20, 10, 10 }, // 8:u_10x10.hex
	{ 0x03E4DA, 0x041A98, 6879, 24, 12, 12 }, // 9:u_12x12.hex
	{ 0x069F80, 0x06D53E, 6879, 28, 14, 14 }, // 10:u_14x14.hex
	{ 0x09C5A2, 0x09FB60, 6879, 32, 16, 16 }, // 11:u_16x16.hex
	{ 0x0D5740, 0x0D8CFE, 6879, 60, 20, 20 }, // 12:u_20x20.hex
	{ 0x13D942, 0x140EFC, 6877, 72, 24, 24 }, // 13:u_24x24.hex
};

この構造体の定義はexfonts.hで行っています。
// フォント管理テーブル
typedef struct FontInfo {
   uint32_t    idx_addr;  // インデックス格納先頭アドレス
   uint32_t    dat_addr;  // フォントデータ格納先頭アドレス
   uint16_t    f_num;     // フォント格納数
   uint8_t     b_num;     // フォントあたりのバイト数
   uint8_t     w;         // 文字幅
   uint8_t     h;         // 文字高さ
} FontInfo;

2015年2月 1日 (日)

野良猫物語(1)

「ブログのタイトルと記事が違う、詐欺だ!」とのご指摘が局所的にあるようなので、
今年は猫成分を増強いたします。

撮り貯めた、野良猫をちょこちょこと紹介します。
野良猫には何故か魅了させられてしまいます。なぜだろうと考えると、まずは
「過酷な環境で生きているのにもかかわらず、その辛さを表に出さない」
点ではないでしょうか。「武士は食わねど高楊枝」ってやつですね。
腐っても肉食系です。
人前では呑気に毛繕いしてますが、かなり過酷な状況で生きています。

んで、まずは、「びっくりちゃん(♀)」

風貌からして栄養状態はあまり良くないようですが、沢山の子を育てたメス猫です。
美人(美猫?)では無いですが、生物としての使命を果たしている立派な猫さんです。

警戒心は強いですが、穏やかな猫です。白黒ネコは性格の良い猫が多いですね。

頻繁に商店街に現れて餌をもらっているようです。



頭に”!”(びっくりマーク)があるのが特徴です。
この地区では、かなり長生きしている猫さんです。

Dscn0660

ある日突然、野良猫デビューした"クロちゃん"に慕われています。
親子ではないのですが、面倒を見ています。

Dscn0664

今日も呑気にお昼寝です。
しかし今日はどこか物悲しさが漂うびっくりちゃん。

Dscn0784

江戸時代の基準では美人猫なのかも、雰囲気作ってますね。
最近、舌(ベロ)をよく出しっぱなしにしています。

この撮影を境に数日後、姿を見せなくなりました。
野良猫は突然姿を見せなくなる子が多いです。

次回は、クロちゃん。


« 2015年1月 | トップページ | 2015年3月 »