アクセスカウンタ

プロフィール

ブログ名
KazHatブログ
ブログ紹介
Palmwareを気の向くまま作っています。
このブログでは、最近購入したSheevaPlug+について書いていこうと思います。Linuxも初めての初心者に使えるかどうかわかりませんが、先人の知恵を借りながらチャレンジしていきます。
PICはじめました。最近は、ロビのことしか書いていませんね。
zoom RSS

PIC用ディスプレイユニットに漢字表示を!(フォントデータ作成)

2017/03/20 19:55

LCD用のフォントデータ作成のためのawkプログラムを載せておきます。使い方も最初の所に書いていますので、ご参考にして下さい。

 

この時、フォーマットも決めています。

ヘッダとして、64バイトあり、SJISの第1バイト毎に、4バイトのインデックステーブルを置いた後、実際のフォントデータを格納しています。

第1バイトは、0x80〜0x9f、0xe0〜0xffだけのインデックステーブルを持ち、

第2バイトは、0x40から開始するものとして、データは若干圧縮しています。

 

詳細は、プログラムをご覧ください。

# bdfファイルのフォントをPICディスプレイで使用できる形式に変換
#
# gawk -v BINMODE=w -f <このファイル> <フォント.bdf> <出力ファイル.dat>
# gawk -v BINMODE=w -v datafile="font2.data" -f bdf2data.awk jiskan24-kai.bdf
#   gawkであれば、バイナリ出力が可能

# 例:JISKAN24
# gawk -v BINMODE=w -v datafile="jiskan24.data" -f bdf2data.awk jiskan24-kai.bdf
# JISKAN16
# gawk -v BINMODE=w -v datafile="jiskan16.data" -f bdf2data.awk jiskan16-1990.bdf
# 例:美咲フォントの生成
# gawk -v BINMODE=w -v datafile="misaki.data" -f bdf2data.awk misaki_bdf_2012-06-03/misaki_gothic.bdf

# 出力データ形式:マルチバイトの変数は、リトルエンディアンで書き込む
# ヘッダ部:64バイト分
#  0x00: FD
#  0x02: ヘッダサイズ=0x0040 (2バイト)
#  0x08: フォント名 (8バイト) bdfのFONTの最初の- -に囲まれている部分を抽出
#  0x10: フォント幅
#  0x12: フォント高さ
#
# インデックス部:256バイト
# SJISの第1バイトの0x80〜0x9f、0xe0〜0xffに対して、各4バイトのアドレス
# 0x40:0x80
# 0x44:0x8140のデータが格納されているファイル先頭からのアドレス
# …
#
# 実際のフォントデータ(SJIS漢字コードの2バイト目=0x40〜)
#  各文字のフォントデータが並ぶ
# 16x16ドットフォントなら、全32バイトずつ
# 第2バイト0x40から、定義ない場合は0データを格納していく。終わりは任意。
#

# 16進数の1桁を数値に変更
function h2d(hex,   hexstr, num) {
    # hexstrとnumは局所変数
    hexstr = "0123456789ABCDEF";
    num = index(hexstr, toupper(hex))-1;
    return num;
}

# JIS文字をSJIS文字に変換する関数
function jis2sjis(jis,  jj, knj1, knj2) {
    # jisは、4文字の文字列でもらう
    # jj, knj1, knj2は局所変数
    for (jj=1; jj<=4; jj++) {
        jishex[jj] = h2d(substr(jis, jj, 1));
    }
    knj1 = jishex[1] * 16 + jishex[2];
    knj2 = jishex[3] * 16 + jishex[4];

    if (knj1 % 2) {    # knj1 & 0x01 の代用
        # 奇数の時
        knj1 = ((knj1+1)/2)+ 0x70;
        knj2 = knj2 + 0x1f;
    }
    else {
        knj1 = (knj1/2)+ 0x70;
        knj2 = knj2 + 0x7d
    }
    if (knj1 >= 0xa0) knj1 = knj1 + 0x40;
    if (knj2 >= 0x7f) knj2++;
   
    return (knj1*256 + knj2);
   
}

BEGIN {
    # 変数の初期化
    header = 1; #ヘッダ処理中は1。フォント部に処理が移ったら0
    startBitmap = 0; #フォントを処理中は1にする

    # インデックステーブル
    # 上位バイト0x80〜0xffに対して、4バイトのオフセットアドレスを格納
    # 下位は、0x40〜コード定義なくても、データを詰め込む。
    # 終わりは特に詰め込む必要なし。普通は、0xfcまでしかデータはないはず

    headSize = 64;
    indexSize = 256;

    fontfile = "fonttmp.tmp";    # フォント用テンポラリファイル

    printf("") > fontfile;
    fontAddOffset = headSize + indexSize;

    Char1 = 0x80;
    Char2 = 0x40;
    indexTable[0x80] = 0;
}

{
# フォントの基本情報をbdfファイルから取得
    if (header==1) {
        # フォントサイズ
        if ($1 ~ /FONTBOUNDINGBOX/) {
            fontX = $2;
            fontY = $3;
            printf("Font Size=%d x %d\n", fontX, fontY);
        }
        else if ($1 ~ /ENDPROPERTIES/) {
            header = 0;    #ヘッダ終了
        }
        else if ($1 == "FONT") {
            split($2, item, "-");
            FontName = item[2];
            printf("Font name = %s\n", FontName);
        }
    }
    else {
        # フォントコードを取得
        if ($1 ~ /ENCODING/) {
            # STARCHARだと、最初の空白が、JISKAN24は2121とhex、JISKAN16は、01-01と句点方式で統一できなかった
            jischar = sprintf("%4x", $2);    #10進
            sjis = jis2sjis(jischar);
            sjis1 = rshift(sjis, 8);    # 文字コード第1バイト
            sjis2 = sjis % 256;            # 文字コード第2バイト

            # 第1バイトが予定値と違ったら、インデックスを設定
            if (sjis1 != Char1) {
                indexTable[sjis1] = fontAddOffset;
                Char1 = sjis1;
                Char2 = 0x40;
            }
            # 第2バイトが予定値と違ったら、0パディングする
            if (sjis2 > Char2) {
                while (sjis2 > Char2) {
                    for (jj=0; jj<(fontX*fontY/8); jj++) {
                        printf("%c", 0) >> fontfile;
                        fontAddOffset++;
                    }
                    printf("+0 \n");
                    Char2++;
                }

            }
            printf("%X \n", sjis);

        }
        else if ($1 ~ /BITMAP/) {
            # 次からフォントデータ
            startBitmap = 1;
            lineCount = 0;
        }
        else if ($1 == "ENDCHAR") {
            # フォントデータ終了
            startBitmap = 0;
            if (lineCount != 0) {
                # 取り込んだデータが残っていた時の処理(8ドットの倍数でない時)
                # 今回は、8ドットの倍数のフォントを想定しているので、
                #ここの処理は省略
            }
            Char2++;    # 次の予定コードに設定
        }
        else if (startBitmap == 1) {
            # BITMAPの次の行からのフォントデータ
            bdfdata[lineCount] = $0;
            lineCount++;
            if (lineCount >= 8) {
                lineCount = 0;
                # 縦8ドット分のデータが取り込まれたら、データ生成処理を開始する
                for (xx=1; xx <= fontX/4; xx++) {
                    for (yy=7; yy>=0; yy--) {
                        # xx文字目=4ドット分、8行分のデータを数値化
                        dot[yy] = h2d(substr(bdfdata[yy], xx, 1));
                    }
                    for (jj=0; jj<4; jj++) {
                        # 縦8ドット分をfdataに作成を4ドット分繰り返す
                        loc = rshift(0x8, jj); # 0x8 >> jj;
                        fdata = 0;
                        for (yy=7; yy>=0; yy--) {
                            fdata = fdata *2;    # fdata << 1
                            if (and(dot[yy], loc)!=0) fdata++;
                        }
                        printf("%c", fdata) >> fontfile;
                        fontAddOffset++;
                    }
                }
#                printf("\n");
            }
        }


    }
}

END {
    #ヘッダ情報書き込み (64バイト)
    printf("%c", 0xfd) > datafile;
    printf("%c%c", headSize/0xff, headSize%0xff) >> datafile;
    for (jj=0; jj<5; jj++) printf("%c", 0) >> datafile;
    printf("%-8s", FontName) >> datafile;

    printf("%c", fontX) >> datafile;
    printf("%c", fontY) >> datafile;
    for (jj=0; jj<46; jj++) printf("%c", 0) >> datafile;

    #インデックステーブルの書き込み
    # indexTableの内容を表示
    # 4バイト=32ビット、リトルエンディアン
    for (ii=0x80; ii<=0x9f; ii++) {
#        printf("%2x: %08x\n", ii, indexTable[ii]);
        printf("%c%c%c%c", indexTable[ii] % 0x100, rshift(indexTable[ii], 8) % 0x100, rshift(indexTable[ii], 16) % 0x100, rshift(indexTable[ii], 24)) >> datafile;
    }
    for (ii=0xe0; ii<=0xff; ii++) {
#        printf("%2x: %08x\n", ii, indexTable[ii]);
        printf("%c%c%c%c", indexTable[ii] % 0x100, rshift(indexTable[ii], 8) % 0x100, rshift(indexTable[ii], 16) % 0x100, rshift(indexTable[ii], 24)) >> datafile;
    }
    # フォントデータを連結
    system("cat "fontfile" >> "datafile);
    system("rm "fontfile);
   
}

 

今回は、ここまで。

記事へブログ気持玉 / トラックバック / コメント


PIC用ディスプレイユニットに漢字表示を!

2017/03/20 19:53

先日ディスプレイユニットをとりあえずという感じで作成しました。

とりあえずと書いたように、使い勝手もあまりよく考えておりませんでした。

特にグラフィック液晶の方は、表示ができただけという状況で、本当は、8x2文字のLCDより表現能力があるはずなのに、有効に使えていないのが、ちょっと残念に感じていました。

 

そこで、今回、SDカードの読み出しができるようになったこともあり、グラフィック液晶に漢字も含めて表示できるようにして、ディスプレイ装置として、汎用的に使える環境を整備しようかなと思いました。メモリが貧弱なPICでも、SDカードがあれば、大きなサイズのフォントデータが必要な漢字も取り扱えるのではないかと考えたからです。

 

グラフィック液晶は、128x48ドットあります。例えば、16x16ドットで漢字表示すれば、8文字x3行のキャラクタ表示が可能です。英数字なら、例えば8x8ドットで十分ですから、16文字x6行と今までPIC用に使ったディスプレイの中で一番情報量が多いディスプレイとして活用できるはずです。

 

漢字のフォントサイズとして、8x8、12x12、16x16、24x24あたりのサイズを用意しておけば、色々と表示方法に選択の幅が広がるので、その辺まで対応できればいいなとは思っています。

 

漢字コードは、シフトJISを使用するつもりです。今時のコードではないとは思いますけど、PICにはちょうどよいと思います。プログラムの処理も簡単だろうと思っています。

漢字を表示させるためには、フォントのデータが必要になります。JIS第1水準、第2水準位の文字なら、フリーのフォントが見つかると思うので、何とかなりそうです。開発環境のMPLAB X IDEもSJIS設定にしているので相性も良いだろうと思っています。

 

さて、まず、コンセプトを考えておきたいと思います。

 

グラフィック液晶は、今、使用しているPIC16F1829で制御しようと思っています。特に意味はありません。

以前の経験からは、メモリ容量が大きなPICの方が、フリー環境でプログラムしている人には、優しいとは思います。

 

ハードウエアの方は、表示したいPICからは、単線でUSARTインタフェースで接続するというコンセプトは、今と変えないようにしようと思っています。

PICに必要なインタフェースとしては、大きく3つに分けられます。

  1. グラフィックLCD用に、SPI(SCK,SDI)+RS+CSの4本
  2. SDカード用にSPI(SCK,SDI,SDO)+CSの4本、
  3. 表示情報をこのディスプレイユニットに伝えるためのUSARTの1本

以上の計9本のI/Oが必要です。基本的にどんなPICでもよいのではないかと思います。できれば、MPLAB X上で、MCCが使えるPICを選択した方が、楽にプログラムできると思います。

 

さて、表示させる方法は、色々あります。

単にいわゆる通信ターミナル端末のように、文字情報を受け取って、どんどんスクロールアップさせるような表示方法。

もう1つは、画面は固定させて、自分で好きな場所に文字を書き込むようなもの。

 

1番目の方法は、文字列を受け取って、どんどん表示していき、行がいっぱいになったら次の行に行き、画面の下まで来たら、スクロールアップすると極めて単純なアルゴリズムでプログラムできます。

2番目の方法は、どこに何を書くのか、その都度、情報をもらって描画することになりますが、画面のデータを固定したまま、一部の情報だけを更新するような表示も可能となります。また、せっかくのグラフィックLCDですから、図形の描画もできるようにしたいと思っています。こちらの方式では、たぶんコマンド+データをもらって、表示するような形になるので、若干プログラムが複雑になると思います。

 

今回は、2番目の方法で行こうかなと思います。

コマンドセットを用意する必要がありますが、ぱっと思いつくところとして、

  1. 画面クリア
  2. カーソル位置、表示開始座標の指定
  3. 文字列表示
  4. 改行 (文字列表示の一部)
  5. スクロール (1番目の方法に近い使用法もできるように)
  6. フォントの指定

といったものが最低限必要になるでしょう。

文字の大きさを自由に変更したいところですが、それはたぶん、PICには荷が重いので、せめて、横2倍角、縦2倍角のようなサイズ変更ができるとよいかもしれません。

 

グラフィック表示として、線を引いたり、円を描いたりということも、したいところですね。

また、単にビットマップの絵を表示させるとかという使い方もいいかもしれません。

 

まあ、PICのメモリ容量の問題もありますから、どこまで入れられるかは、それと相談になると思います。

 

まずは、必要最小限の機能を実現させてから、機能の充実化を考えていきたいと思います。

 


使用予定のPIC16F1829の仕様をおさらいしておきたいと思います。

プログラムメモリ:8Kワード

SRAM:1Kバイト

ということなので、それほど大したプログラムは組めそうもないと、考えておく必要があります。コンパイラもフリー版なので、サイズが大きめになってしまうという問題もありますから。

ターゲットのグラフィック液晶は、AQM1248A-RNというもので、48x128ドットの表示ができます。

 

グラフィック描画をさせようとした場合、すでに描画されているデータはそのままで、線を加えるといったことをするためには、表示用グラフィックのデータをバッファと持っておく必要があります。

というのも、このグラフィックLCDは、書き込んだデータをリードすることができないからです。

書き込んだデータをPIC側にコピーとして持つには、128x48=6144ビット=768バイト必要となりますね。1KバイトのSRAMがあるから、それは何とかなるでしょうか?

 

このLCDについて説明しておくと、モノクロのグラフィック液晶で、表示用のRAMは、縦8ドットx横128ドットのPageと呼ばれる領域があり、それが縦に6枚並んでいる構成だそうです。実際には、縦に8枚分=64ドット分のRAMを持っていて、表示開始位置を変えることで表示されない領域を表示させたりできるとのこと。表示開始位置は、0〜63ドットのいずれでも設定できます。スムーススクロールとかができそうですね。

 

このLCDに漢字を表示させるには、その構成に合わせて、フォントデータを作っておく必要があります。

1バイト=8ビット=縦8ドット分が同じアドレスとなっており、これを単位に、横方向に並べるような構成のデータだと、変換するとかせずに、楽に表示できます。

横方向に並べるのは、アドレスが横方法に増える構成であり、かつ、LCDにデータを書き込むと、自動的にアドレスがインクリメントされるため、次のデータの書き込みではアドレスの指定を省略でき、便利だからです。

 

16x16ドットの文字とか、24x24ドットの文字なら、縦が8ドットの倍数なら、処理にちょうどよいですが、12ドットの文字を表示しようと思ったら、ちょっと処理が面倒そうです。 そういう、面倒そうなものは、最初は排除してプログラムしていこうと思います。

 

漢字フォントは、以前Palm用に漢音訓というプログラムを作ったときにお世話になったjiskan24という24x24ドットのフォントとか、jiskan16というフリーのフォントが利用できそうです。

 

大体構想がまとまってきました。

まずは、シンプルに、次のようにしたいと思います。

  1. 画面を8x8ドット単位に区切り、そこに文字を表示させるようにします。
  2. 文字を表示させる場所は、1のマスになりますが、そのマスごとに座標を割り振り、文字表示の場所は指定できるようにします。
  3. 文字列の中で、改行、スクロールはできるようにする。つまり、最終行に文字列を書いていて、次の行に掛かってしまう場合は、今まで描画した文字列をスクロールアップさせるということ。

さて、では、漢字データの作成から始めます。

 

16x16ドットフォントなら、単純にフォントの上半分の16x8ドット分、16バイトと、下半分の16バイトの計32バイトのデータを格納していけば良いのですが、その32バイトの塊を、アクセスしやすいように並べておく必要があります。 コードはSJISコードを使おうと思っていますが、文字コードは結構飛び飛びになっています。

文字コード順に並べても、SDカードの容量から考えると、特に問題はありません。

SJISですと、大まかに、第1バイトは64通り、第2バイトは、192通りあるので、掛け算すると、約12,000漢字があることになります。16x16ドットフォント1文字当たり、32バイト必要ですから、約380KBのサイズが必要となる計算です。PICのメモリサイズから見ると非常に大きいですが、1000円もしないSDHCカードで16GBといった容量ですから、全然問題になりません。

ということで、あまりフォーマットを気にする必要もないかもしれません。フォーマットについては、あとでどうしたか書きます。

 

フォントは、jiskan16、jiskan24、misakiの3つのフリーフォントを使わせていただくことにしました。

 

まずは、8x8ドットフォントのmisakiフォントを使えるようにしてみました。

どのフォントデータも大体同じなのですが、1バイトのデータは、横方向8ドットとなっているようです。

これを今回のLCDに合わせて縦方向8ドットに形式に変換するわけです。

 

例えば、亜という漢字の場合、以下のような絵になっています。

image

赤枠を付けた所が対象の文字の領域で、8x8ドットとなっています。

 

このフォントの場合、0xfe, 0x28, 0xfe, 0xaa, 0x0xfe, 0x28, 0xfe, 0x00というデータになっています。

それを今回のLCD用に、0x5d, 0x55, 0x7f, 0x55, 0x7f, 0x55, 0x5d, 0x00というデータに変換するわけです。

LCD用にするには、縦方向の8ドットを上側LSB、下側MSBとする必要があります。

 

今回は、bdfファイルから変換する方法をとりました。従来は、モノクロのbmpファイルのデータを読み取るという結構面倒な方法を使っていました。たまたま、bdfファイルがテキストファイルであることがわかり、文字コード情報も加わっていて、処理に便利と分かったので、bdfファイルからバイナリファイルを生成することにしました。

misaki_mincho.bdfファイルにおいて、亜に相当する部分のデータは以下のようになっています。

STARTCHAR 3021
ENCODING 12321
SWIDTH 960 0
DWIDTH 8 0
BBX 8 8 0 -2
BITMAP
fe
28
fe
aa
fe
28
fe
00
ENDCHAR

 

BITMAPとENDCHARの間が、先ほど書いた8バイトのデータとなります。3021が16進のJISコードで、これをSJISに変換すると、889fとなるわけです。

これを、awkで処理してLCD用データを作成しました。

 

以下にプログラム全部を載せておこうと思いましたが、1記事の上限サイズに引っかかってしまったので、次の記事に回します。

記事へブログ気持玉 / トラックバック / コメント


Palmを卒業してAndroid端末を導入しました

2017/02/19 17:10

Palm TXを2007年から使って来ましたが、液晶のバックライトの輝度も低くなり、充電池も持ちが悪くなってきて、また、何か新しいことをしようと思っても、マシンパワーがないことも気になってきていてました。

会社からiPhoneが支給され、使用頻度も減って来てしまっている状況でもありました。

 

そろそろPalmから卒業する潮時かと思い、次なる端末を物色していました。

とは言え、Palmの代わりになる同様のものはiPod touch位しか見当たりません。それ以外となると、やはりスマホを選択するよりないと思いました。

 

何年も前ですけど、Appleの端末の導入を検討をしたことがあったのですが、自作プログラムを作ろうとしたら、iMacがないと開発環境が揃えられないという状況でしたので、Windows PCしか持たない私としては、iPhoneも含めて却下せざるを得ないと判断していました。

 

そうすると、消去法に見えますけど、Android端末しかありません。Windowsモバイルもあるかもしれませんが、まだ市民権も取れていないような状況ですから、見合わせです。

 

Android端末を選択するとして、どこから購入するかも考えねばなりません。例えば、スマホをドコモなどのキャリアから調達した場合、今まで掛かっていなかった月々の費用が必要になってしまいます。大体4000円とか5000円とかだと思っていますが、年5万円とかになってしまいます。電話は、ほとんどしないので、ちょっと費用がかかりすぎるようにも思いました。 一方、端末代金は、ほとんど見えないような仕組みになっているようなので、ハイエンド機種が10万に迫る値段だと思えば、2年縛りをして、本体価格レベル+αというのも理解できます。この辺が総務省の言うわかりにくい料金体系というものだと思いました。

 

私の場合、たぶん2年以上は使うだろうと考えると、ランニングコストを抑える方が得策と考えていました。PalmTXも約10年使いました。どの位お金をかけたかと計算してみると、4万円そこそこ。つまり1年たったの4000円、月々300円ちょっとという超低コストでした。

それに見合うくらいのものは望むべきもないかもしれませんけど、できるだけ安く済ませたいと思っています。

 

そこで、CMも頻繁にされているMVNO、いわゆる格安スマホの方が選択肢として私には合っていると考えました。実際に月々の料金を考えると、安そうです。また、最近は、大手キャリアのように、本体も込み込みでの利用料金の設定もあるようです。

 

色々と情報を見ていると、どのような選択肢でも、何だかんだ言って、本体を一括で購入するのが、費用的にベストだと思われました。もちろん一括で支払うので、一時的にお金が必要になりますけど、それさえ用意できれば、全体での支払額が少なくなります。これはローンや、分割払いと同じで、月々少しずつ払うと利息とか手数料のため、合計の支払額が多くなるのは、必然ですね。

 

自分で端末を調達するため、どんな端末がよいのか検討してみました。

私は、以下を備えているものを必要条件として、探してみました。

  1. SIMフリー:MVNOを利用することを想定していますので。
  2. フルHD 1920x1080:いわゆるHD (1280x800)は不足と考えました。 詳細理由は後述
  3. 指紋認証:簡単に使いながら、セキュリティを考えると必須。会社支給のiPhone 5Sで実感しています。Palmでは何も設定していませんでしたけどね。
  4. GPS搭載:まあ、これは当たり前かもしれません。ナビを想定
  5. microSDカード対応:色々データを取り込むのに必要と考えました。
  6. 本体サイズあまり大きくなく5インチクラス程度:PalmTX並みが望ましい

あとは、価格が3万円以下レベルとしました。これは、Palm TXがその位の価格だったからですけどね。

中古で購入したのですけど、記録をみると、22,800円となっていました。

こういう条件で探すと、意外に多くはないことがわかります。選択肢が少ないので、決めるのはたやすくて助かります。

 

そして、最後に残ったのが、Huawei P9 liteという機種でした。

2016年発売の機種で、フルHD、指紋センサ、GPS/AGPS/Glonass、microSD対応、5.2インチ、サイズ約72.6×146.8×7.5mm、約147gというスペックです。

 

ちなみに、Android 6.0、CPU:Huawei Kirin650 オクタコア (4×2.0GHz+4x1.7GHz)、RAM:2GB / ROM:16GBという構成です。メモリが少ないですが、SDカードが使えるので良いと思いました。

カメラは、1300万画素と800万画素、センサーは、加速度、コンパス、環境光、近接が搭載されていました。ジャイロがないので、ポケモンGoのARは対応できないそうです。

で、定価は2万9800円。

ネットで探したら、Amazonで2万4000円(税込み)ほどで販売していました。ちょうどウインターセールとかをやっていて、さらに1割引きで購入できました。

奇しくも、大体PalmTXを購入した時と同じ価格となりました。


Palm TXのスペックは、Palm OS Garnet v.5.4.9、CPU312 MHz Intel XScale PXA 270、RAM:32MB / Flash 128MB、SDカード (ソフトによりSDHCも対応可)、78.2mm W x 120.9mm H x 15.5mm D、148.83g、画面サイズ:55.5x80.5ぐらいの320x480ドット、16bitカラー、Touchscreenというものでした。

 

ネットから2つの写真を拾ってきました。

Palm TX HandheldP9lite

2台を大体縮尺が同じになるようにして、並べてみました。P9 liteが縦長なのがわかります。

 

両方を比べると、重さが大体同じですが、高さが2cmほどP9 liteの方が長いが、約半分の薄さ、幅も5mmくらい狭いというところですね。胸ポケットには、薄いので、すっと入りますが、少しポケットから出っ張ってしまいます。

 

使ったことはありませんが、P9 liteには、お財布ケータイとか、ワンセグとかはありません。

防水機能もありません。でも、できれば防水機能があったらお風呂とかで、簡単に使えたのにと思いました。でも、100円ショップで購入した防水ケースに入れて、お風呂でも楽しんでいます。

 

Amazonで注文してから約1週間したら、本体が到着しました。初めてのAndroid端末です。

箱も素敵で、本体もなかなかいい感じと思いました。画面保護フィルムは貼り付け済み、ケースも付属と至れり尽くせりでした。

早速、電源を入れて初期化しました。どのように初期化したか記録をしませんでしたが、簡単だったと書いておくにとどめます。

この時点では、まだSIMカードの契約をしていないので、家の中で、WiFiで接続して、設定も行いました。

WiFiさえあれば、回線契約なくても、普通に使えますね。

 

まだ、環境の整備も終わったとは思えませんが、以下のように動作を少しずつ確認しながら移行中です。一部Playストアからインストールしたアプリもあります。

  1. 動画閲覧:VLC
    これにより、microSDカードに格納した映像を見ることができます。Palmの時は、フォーマットを変換して、Palm上で、TCPMPで表示できる形式にする必要がありましたけど、さすがに今のスマホはCPU能力も高いので、PCで見ているファイルのままで問題ないようです。ちゃんと表示できました。映像もきれいです。Palmにとっては動画は重い処理でしたが、P9 liteというミドルレンジの機種でも問題まったくありませんね。
  2. 音楽:これは、もともとインストールされていた「音楽」で十分対応可
  3. スケジュール:まだ、どうするか思案中
  4. メモ帳:検討中
    最近、簡単なメモは、Google Keepを使っています。そうすると、どこのPCからも見ることも、入力することもできるので便利だからです。P9 liteにもKeepというアプリをインストールしました。
    Palmのメモ帳と同等のものを、元Palmユーザの方が作ったいうLesser Padというのもインストールしましたが、まだ試せていません。
  5. 電卓:あまりにたくさんアプリがあり、どれがよいのかさっぱりわかりませんが、関数電卓 (無料版)というものをインストールしてみました。できれば、自作ソフトに入れ替えたいと思っていますけど。。。
  6. リモートアクセス:TeamViewer
    私の場合、家のWindows PCが母艦であり、そこにどこからでもアクセスできる環境を作っておきたいという希望があります。スマホだとキーボード、マウスがないので、使い勝手が悪いのですが、とりあえず。会社からTeamViewerのアクセスはブロックされてしまったので、何か良い方法がないかなと思っていたところで、スマホからのアクセスはできるようにしておこうかなと思いました。そのためもあり、フルHDの端末にこだわりました。WiFiでないと、データ量が多くなりすぎMVNOの回線でも費用がかさむ可能性もあるので、自由にどこでも使えるようにはならないかもしれませんがね。
    WiFi環境下なら、PC上でTVを表示して、Team Viewer上でその映像を視聴することは問題ないことを確認しました。これで、ワンセグとかフルセグとかなくても、大丈夫そうです。
    また、当初、上記動画ファイルのSDカードへのコピーは、PC上で行っていました。しかし、スマホはSDカードを頻繁に抜き差しすることを想定していない構造になっているので、面倒でした。TeamViewerには、リモートアクセスのほか、ファイルの転送を行う機能もあることに気づきました。WiFi環境下でPCとスマホ間でファイルを転送してみると、それなりに使うことができることがわかりました。正確には測定できていませんが、直接SDカードに書き込むより時間はかかるようにも思えますが、実用範囲内ということで、今は、microSDはスマホに入れたまま、ファイルをPCとやり取りしています。PCに取り込んだビデオファイルを転送すれば、スマホで視聴できる状態になるわけです。

 

上記のうち、うまく移行できそうもないスケジュールですけど、仕事では、Outlookベースで会議のスケジュール管理がされるようになり、以前のように自分の手帳で、スケジュール管理する必要がなくなっていて、Palmの出番がなくなっています。会社支給のiPhoneにもOutlookが入っており、自分の席のPCと同様にどこでもスケジュール管理ができるので、個人のスケジュールとして管理する必要性がそれほどない今、スマホのカレンダー、これはGoogleカレンダーですかね、に素直に移行してしまうのがよいのかもしれません。

 

メモ帳のデータにも記録として残しておきたいものがあるので、それをどうするかはこれから考えたいと思います。Palm Desktopで見てみると、638件もあるので、1件1件コピーするようなことはできそうもありませんから。

 

この機種、レビューも色々ネットに上がっていますが、総合的にみて、正解だと私個人的には思っています。

1つ遊び道具が増えてしまったけど、時間がないので、まだ、Androidプログラム開発環境もインストールできていません。

 

まずは、スマホデビューというか(回線契約してないので)、Palm使いの人が、Android端末を使い始めたということで、第1弾の投稿とさせていただきます。

記事へブログ気持玉 / トラックバック / コメント


Open Live Writerを使ってみた

2017/01/30 22:16

今まで、このブログは、Windows Live Writerというソフトを使って書いていました。

このソフトは、Version 2012と言われているもののようで、Microsoftのサポートは、今年1月10日で終了となったとのことです。

サポートが切れると、今の時代、色々と問題が生じたりしますから、別のソフトを探して乗り換えることを考えねばなりません。

調べると、後継のソフトとして、オープンソース化されたOpen Live Writerというものがあるということなので、使ってみようと思いました。

早速、サイトからダウンロードしてきて、インストールしました。

 

ダウンロードしたファイルをクリックすると、即インストールされるみたいで、デスクトップ上にショートカットが置かれました。

image_thumb

これをクリックすると、設定を行うためのConfigureが始まります。

質問に従って設定を進めます。

使っているサイトのURL、ユーザ名、パスワードを入力すると、通信を行って、設定が完了し、Windows Live Writerと同じに見えるウインドウが開きました。

 

ただし、全部英語表記ですね。

 

でも日本語を入力することはできますので、しばらく使ってみることにします。

 

ちょっと使った感じですと、Windows Live Writerの後継というだけあって、ファイルの履歴とか書きかけのドラフトファイルとかの引継ぎは自動的になされたので、すぐに乗り換えて作業を始められそうです。

 

この記事も途中まで、Windows Live Writerで書いていて、インストールが終わった後、Open Live Writerでそのあとを引き継いで書くということができました。

 

一つ残念な感じなのは、バージョン履歴を見ると、去年(2016年)の2/13に、今のVersion 0.6がリリースされてから更新はされていないことですかね。 今さら頻繁に更新するようなモチベーションもないのかもしれませんし、十分成熟しているとみるか。

 

でも、まあ何かあったときは、サポートのあるOpen Live Writerの方がよいと思って、このOpen Live Writerを中心にしばらく使ってみたいと思います。

 

今日は、ここまで。

記事へブログ気持玉 / トラックバック / コメント


PICでSDHCカードを制御してみる実験(2)

2017/01/26 22:16

ようやく、続きを報告することができます。かなり苦戦しましたので。

 

SDカードは、FATと呼ばれるファイルシステムで構成されています。その辺も勉強しないといけないと思って、調べ始めました。

ところが、FATを理解する前に、前回書いたように、SDカードにはSPIモードがあり、PICのようなマイコンでも手軽にアクセスできることを初めて知ったわけです。

 

一方、FATというファイルシステムにアクセスするのは、色々と手続きが面倒そうです。 その辺は、コツコツ勉強しながら、処理するプログラムを作るしかないかなと思っていました。

でも、メジャーなSDカードですから、調べてみると色々と有用な情報が見つかりました。

 

私がよいかなと思ったページは、Interfacing SD Card With PIC Microcontroller ? XC8というものです。英語ですが、かなり詳しく記述されています。

 

そこには、SDカードにアクセスする複雑な関数とか、手順とかを完全に理解するところまでやりたくない人は、SDカードライブラリを使うとよいと書かれており、1つの例として、Chanという人が作ったFatFsというモジュールが紹介されていました。 FatFsとは別に、さらに小さいサイズ(コードサイズで2〜4KB)のプチFatFsというのものもあると紹介されていました。しかもフリーです。

 

PICのメモリ容量の問題もありますから、これが何となく良さげに思えたので、これを導入することにしました。

 

まず、基本的に、このFatFsは、FATを扱うFatFs関数と、Disk I/Oレイヤーの2つに分かれているということを理解しました。

 

もう少し勉強していきましょう。Petit FAT File System Moduleに、オープンソースのプチFatFsと呼んでいるFatFsのサブセットの説明がありました。

 

定義されている関数は、以下の7つあります。

大体名称をみれば、どんなことをするか何となくわかりますね。 プログラムで使うときは、これらの関数を使って、アクセスしていくとよいような感じです。

 

ただし、上記の他に、実際のDisk I/Oインタフェースは、別に用意が必要とのことでした。これが別レイヤーということのようです。

 

そのインタフェースに必要なファンクションは3つあり、それらは、自分で作る(プログラムする)必要があるということでした。

 

以下がその3つです。

disk_initialize - Initialize storage device
disk_readp - Read a partial sector
disk_writep - Divided write to a sector

たったの3つだけですが、これをPICのSPI制御で、SDカードを初期化、読み書きできるように関数を作らないといけません。

 

できるかなと不安を覚えましたが、さらに説明を見ていくと、幸いなことに、これらのDisk I/Oに関しては、Interfacing SD Card With PIC Microcontroller ? XC8の中でSD_Card_FatFsのMPLABXプロジェクトコードがあり、そこにSPIを使ったdiskio.c/diskio.hというソースコードが提供されていました。 ありがたや、ありがたや。

 

これは、フルセット版用ですが、そこからプチFatFsに必要なものだけを取り出して、少し修正すれば何とかなるのではないかと思いました。

 

ここまでで、必要な材料がそろったので、少しずつ理解しながら、プログラムに取り込んでいきましょう。

 

まず最初に、プチFatFsのファイルpff3.zipを展開して、srcディレクトリ内にある、6つのファイル

diskio.h、diskio.c、pff.h、pff.c、pffconf.h、integer.hを実験中のMPLABXのプロジェクトのHeader FilesとSource Filesディレクトリにコピーしました。

その作業は、例えば、MPLABXのディレクトリ表示ウインドウのSource Filesのところで、マウス右クリックすると、下記の図のようにAdd Existing Item...という項目があるので、それをクリックして、上記でコピーしたファイルをプロジェクトに加えていけばよいと思います。複数ファイルを同時に選択もできますので、やりやすい方法を選びましょう

キャプチャ

これらのファイルの中で、diskio.cは、上述のように、具体的に動作させる部分のコードが空になっています。そこは、自分で作らないといけないわけですが、先ほど書いたSD_Card_FatFs.zipの中から、diskio.cを拝借させてもらおうという考えです。

繰り返しになりますけど、フルセット版のまま使わないのは、メモリ使用量が気になるからです。

 


ここで、ちょっと脇道にそれます。

 

今は、、PICとSDカードスロットをつなげただけの簡単なハードですが、ディスプレイユニットに表示させられるようにしておこうと思います。そのため、プロジェクトにMCCを使って、EUSARTを追加しました。

ディスプレイユニットは、グラフィックLCDを使ってみるで紹介したもので、シリアル信号一本で、情報をLCDに表示させるものです。ただし、今回は、キャラクタLCD側だけ使用しています。

 

RA4をTXに設定。当初RC5に設定しようとしましたが、このピンは、使えないとWarning (メッセージは、Function “DT” does not have output setting “RC5PPS” set to pin “RC5”)が出ました。無理やり、コンパイルしても動作しなかったので別のピンに割り当てました。RC4にしても、Warning出ていますが、CK機能は使っていないので、無視してOKのようです。

Pin Module上、Start=H、Analog=設定せず、Output=チェック、WPU=設定せずに変更。(デフォルトではNG)

EUSART上、Enable EUSARTにチェック(デフォルト通り)、Enable Transmitにチェック(デフォルトでチェックなし)、9600Baud、8bit TransmissionBits、8bit ReceptionBitsとかはデフォルト状態のままです。

 

最終的に以下のような設定となりました。

image

image

 

こうして、以前作成したディスプレイ用の関数をインクロードして、呼び出せるようにすれば、プログラムの状況をLCDに簡単に表示ができるので、デバッグには大変便利になります。

 

この部分の詳細の説明は省かせていただいて、話をSDカードのプロジェクトに戻します。


 

ということで、diskio.cを作っていく段階に入ったわけですけど、色々とネットで調べていて、より簡単な方法を見つけたので、ちょっと方針を変えようと思います。

diskio.cは、上記のSD_Card_FatFs.zipからではなく、 Petit FAT File System Moduleのページの最後に示されていたSample projects for various platformsのものを使うことにしました。プチFatFsを作った方がリリースされたもののようなので、親和性もよいのではないかと、心変わりしたからです。

 

ダウンロードしたpfsample.zipを展開すると、いくつかディレクトリが現れました。その中から、picというディレクトリにあったpic24_mmcp.cを使わせてもらおうと思います。ターゲットのPICが、現在使っているPIC16F1705とは違いますが、親和性はいいと信じて、進めたいと思います。

 

ここからは、ごちょごちょとプログラムをいじりながら、SDカードの勉強もしながら、デバッグしながら進めます。

しかし、一番最初の段階で、ちっともSDカードを認識してくれないという状況に陥りました。

 

初期化の所からおかしいようで、ある種ブラックボックス的なMCCを使ったのが悪かったかとも思いながら、あちこちの状態を調べるため、変数をLCDに表示させながらデバッグを続けました。

でも、全然解決につながりません。ハードの問題の可能性もありますし、どうしたものかと思案しました。

 

そこで、はたと気が付いたのは、SPIモードの設定が怪しいのではないかと。ここまで至るのに相当時間が経過してます。

 

前回SPIモードを0にしたと書きました。でも、参考にさせていただいている別の方のプログラムでは、モード3に設定しています。3でも動くような記述も見ましたけど、まだ、きちんと理解していない状態ですから、ここは、先人が設定している状態と同じところから始めてみようと思いました。

そこで、SPI Modeが3になるように、Clock PolarityとClock Edgeを下記のように変更してみました。

キャプチャ2

上記をご覧になればお分かりの通り、Clock周波数も250kHzに変更しています。それは、SDカードをSPIモードに変更するためのクロック速度は、100k〜400kHzに設定せよという記述を見かけたからです。

 

そうしてコンパイルして動作させたら、何ということでしょう。状況に変化が見えたのです。

初期化ができた時に通るルーチンに来たら表示されるメッセージがLCDに表示されたのです。

具体的には、pf_mount()関数で、SDカードを初期化する時に、最初に呼び出される低レベルレイヤーのdisk_initialize()関数の中で、コマンド送信して、その結果を受け取るわけですけど、最初のCMD0を送信して、リセットができなかったのが、できるようになったのです。

まだ、理由を理解できていませんが、SPI Mode=3にすることが必要だったということで、少し前に進めました。

 

一旦、少しでも、動き出せればこちらものです。

 

ひとくくりの処理ごとにデバッグを進め、pf_mount()が動くようになりました。

 

なお、diskio.cにコピーしたpic24_mmcp.cで使われているsend_cmd()関数では、ACMDと定義されている0x80以上のコマンド送出のため、再帰呼び出しを行っていましたが、PIC16F用に使っているXC8コンパイラでは、再帰呼び出しをサポートとしていないため、コンパイルエラーとなります。そこの書き換えは必要でした。デバッグ最初の頃は、そこはコメント化して、おきましたが、処理の後の方で、2回コマンドを送信する必要があるコマンドACMDが、再帰呼び出しの処理が必要になったとわかったので、再帰呼び出ししないようにプログラムを書き換えました。

 

ここで、SDカードの初期化の手順を記載しておきます。

  1. CS=Hにして、最低74回のクロックを入力
  2. CMD0をCS=0(Asserted)でソフトウエアリセット
    1が返ってきたら、正常終了。 ←上述のSPI Modeを3に変更して、ここがまず確認できたのです。
  3. SDHCに対応させるために、CMD8+0x1AAを送信してチェック
    1が返ってきたら、SDv2というSDHC/SDXCカードだということ、そうでなければ、SDカード(またはMMC)ということでした。
    さらに、SDHCカードの場合、32ビットの戻り値が返って来て、下位12ビットが0x1AAなら、2.7V〜3.6V対応らしい。
    手持ちのSDHCと、SDカードを入れ替えて確認すると、きちんとそのように判定されました。
  4. ここからは、SDHCカードの場合だけについて、書きます。
    カードの初期化のため、ACMD41+HCS=1を送信して、初期化が終わる返り値が0になるまで、繰り返します。1秒まで繰り返して、だめだったらタイムアウトとして、終了します。
  5. CMD58を送信して、返り値CCSを確認。0なら標準のSDHC、1だったら大容量ブロックアドレッシング対応SDHCということで、512バイト単位のアクセスが必要とのこと。

以上で、SDカードアクセスの初期設定が完了します。

 

pf_mount()が正しくどうさせることができたので、あとは、あまり中身を追ってみておかなくてもプログラムは動かせそうに思いました。ということで、ここからは、プチFatFsのAPIを使わせてもらって進めたいと思います。

 

上記で詳しく説明したのは、初期設定を行うpf_mount()の中で行われているdisk_initialize()の処理でした。

ここでは、手持ちのSDカード(2GB以下)とSDHCカードを使って実験しましたけど、両方ともきちんとマウントできました。

そこでマウントができたら、次は、pf_open("ファイル名")を使ってファイルをオープンしてみます。pf_open()のプログラムの中身はまだ見ていませんが、ちゃんとファイルをオープンできました。もちろん、ファイルが存在しなければ、エラーになることも確認済みです。

 

何となく、SDカードへのアクセスができそうな雰囲気になってきたので、試しに、テキストファイルとして、

ABCdef

とだけ書いたファイルを、test.txtというファイル名で、SDカードに保存しました。これは、PC上で行いました。

 

そのSDカードをPICの実験ソケットに入れ、PIC側で、上述のpf_mount()、pf_open(“test.txt”)としてから、pf_read(buff, 16, &br)とバッファ変数buffに16バイト分呼び出し、brに読み出したバイト数が入る処理を行って、buffに入った文字を表示してみました。ここでディスプレイユニットの力を発揮できました。

 

そうすると、ちゃんとABCdefと読み出せました。

 

ここまでできれば、PICを使って、データをSDカードから読み取ることができる基礎ができたかなと思います。

 

これで、大きなデータをSDカードに格納しておいて、必要な時にPICに取り込むといったことができるようになると考えています。

PICのメモリ容量は小さめで、以前にも少し大きなデータを取り扱おうとすると、限界に突き当たってしまっていました。

例えば、アラームのメロディーを複数格納しておきたいとか、グラフィックLCDに表示するデータを格納しておくとか、いろいろと用途は考えられますからね。

アラームのデータは、以前に作った温湿度計付き時計の時に、もっとデータ領域があればいいなと思ったこともありました。SDカードなら、まず容量で困ることはないと思っています。

 

とりあえず、ここまで実験が成功裏に終わりましたので、いったん、終わりとしたいと思います。

記事へブログ気持玉 / トラックバック / コメント


PICでSDHCカードを制御してみる実験(1)

2017/01/10 21:52

久々にPICで遊びました。

思うところがあって、SDカードを使えるようにしたいと思っています。

 

しばらく開発環境もさわっていなかったので、確認してみると、MPLABXは、v3.50にアップデートされ、XC8もv1.40になっていました。これらをまずインストール。

 

今回の実験のためのハードとして特殊なものは、SDカードですけど、ソケットが必要です。これは、昔購入しておいたSDカードソケットを使おうと思います。

これは、元々、最初にPICを使い始めた時に参考にした「PICを使ったデータ・ロガーの製作」に付属の基板に取り付けるつもりで購入したのです。当時の記事はここ

しかし、結局使わずにしまっていたものでした。

 

このソケットを使うにしても、そのままでは、実験するのに使い勝手が悪いので、ブレッドボードに挿せられるようにユニバーサル基板上に載せてみました。

それが、以下の写真です。

DSCN0327msohtmlclipclip_image001

 

ユニバーサル基板は、秋月電子の十字配線ユニバーサル基板 Cタイプをカットして使っています。

十字配線の一部をカットすることで配線なしに接続が可能なので、配線が不要で便利でしたが、ご覧のように、見た目は汚くなってしまいました。

SDカードとのインタフェース用に9ピン分のヘッダを取り付けていますが、実際には、写真の左から8ピン分しかつなげていません。SDカードの右端のPin8に相当するピンは、中途半端な位置にあるためと、PICと接続する場合、SPIモードで使うことから、不要なピンとなるので、接続することをやめたためです。

 

また、ソケット側には、カード挿入検出ピンもありますが、これも接続するのに面倒な状態なので、接続をあきらめました。

 

PICでの実験では、SDカードのPin1〜7だけあれば事足りるということなので、問題はないでしょう。後で必要なら、Pin8も接続できるようにヘッダピンは用意しているのは、その時の保険と考えてください。

 

さて、次には、回路を組む必要があります。

まずは、ターゲットのPICを決める必要があります。少ない手持ちのPICから選択するわけですけど、SDカードの読み書きには、512バイトのバッファが必要というような情報から、RAMは最低それ以上ないと困りそうです。そうすると、あまり小さいPICではだめそうです。

 

PIC18F14K50が使えそうですけど、MPLABX上でMCCを使うと楽ができることを学んでいるので、MCCを使いたいところですけど、最新のMCCでも18F14K50は、対象のPICには入っていませんでした。残念。そのため、対象から外します。

 

手持ちにPIC16F1705というものがありました。これは内部にオペアンプが入っているという変わり種で、面白そうなので、入手しておいたものでした。これはMCCのサポート対象となっているので、これを使ってみようと思います。今回はオペアンプは関係ありませんけどね。

 

普通なら、回路を先に作るのがよいのかもしれませんが、PICはピンの選択に色々とソフト上の制約があったりしますから、先にMCCで設定をしてしまおうと思います。

それに合わせて回路を構築しようという、普通とは逆の順序で進めようかと思います。

 

MPLABXを起動して、新規のプロジェクトを作成します。ここは従来と変わるところがありませんから、説明は省略します。

そして、MCCボタンを押して、System ModuleのEasy Setupの設定をします。

INTOSCで、16MHz_HFにして完了させます。

 

次に、SPIインタフェースのため、Device ResourcesからMSSPを選択してダブルクリックして追加します。

ModeをSPI Masterに変更します。通信速度をいくらにすべきかよくわかりませんが、とりあえずデフォルトのままFOSC/4、すなわち4MHzにしておきました。5MHz設定にしたという情報をネットで見かけましたので、問題ないと信じたいと思います。

 

SPIの動作モードは、モード0で良いらしいのですが、モード3に設定していても動作するとのこと。

この辺、混乱しています。モード0とは、CLKがLowでアイドル状態で、立ち上がりエッジでデータを取り込む仕様ということらしいですが、MCCでは、そういう設定にすると、表示上は、SPI Mode=1となってしまいます。モード0と表示して欲しいところですが、私が間違っているのかもしれません。

だめだったら、後で治すことにして、下記のように設定しました。

無題0

 

SDカードのCSピンは、SPIとは別に制御必要そうなので、1ピン追加します。

Pin Manager (最初表示されていなくて戸惑いましたが、ウインドウの一番下のステータスバーの所にあり、クリックしたらウインドウが表示されました)を使って、どのピンが適切かわかりませんが、今回は、RC3をGPIO Outputに定義しました。実際には空いているカギの絵をロックされたカギの絵に変更します。

無題1

 

そして、どのようにデバッグしたらよいか?できるだけ最小のハードで実験したいので、まずは、書き込み実験だけを行うことを考えました。

SWを1つ取り付け、SWを押したら、ファイルに適当な情報を書き込むと言った感じ。

その後、SDカードのデータをPCで読み出してみようという計画です。

 

そのため、SW用にRC4をGPIO Inputに定義しました。設定はデフォルトのまま、WPU (Weak Pull-up)の設定がされています。これをプッシュスイッチを介してGNDにつなげば、ボタンを押したときにLowが伝わります。

状態は、以下のように変更されました。

無題2

 

なお、RA0 (ICSPDAT)とRA1 (ICSPCLK)は、PICKit2と接続して、プログラムを書き込むために使用しますので、空けています。

ここで、SPIのデフォルト設定では、SDOが設定されていないことに気づきました。SDOの所で、RC2を割り当てました。

Pin Managerの上の方にあるMSSPの所で、以下のように変更しました。

無題3

 

動作確認用のLEDも追加しておいた方がよいと思いつき、RA5に割り当てました。設定はデフォルトのまま、WUPで、LEDの-側をRA5に接続し、2KΩの抵抗を介して、VDDに接続します。RA5を0にしたらLEDが光るという設定ですね。

 

以下が今回の最終形となります。

無題4

無題5

名称もプログラムで分かりやすいように変更しています。

 

以上で設定が完了したので、Generateボタンを押して、ソースプログラムを生成します。

 

接続が決まりましたので、上記の設定に従って、ブレッドボードを組みます。

DSCN0328

大体こんな感じです。回路図は書いていませんが、単純なので、お許しください。

 

プログラムの作成に入ります。

 

プログラムは、ボタンを押したら、カウントアップしていき、かつ、ファイルヘッダ名+カウンタというファイル名でファイルを生成して、中身にカウント値を書き込むという感じにしてみます。

 

初めて使うPICなので、まずは、LEDを点灯させることから始めてから、上述の動作を実現させる本格的プログラミングに移行したいと思います。

 

名称を変更しているので、LED_PORT=0;とだけプログラムして、コンパイルします。

問題なくコンパイルできました。

 

で、ここで、大問題が判明しました。PICkit2では、16F1705をサポートされていないことに。

 

せっかく購入したのに使えないものを買ってしまった。別のPICに変更しなくてはいけないかなどと考え始めました。でも、ちょっと思い返して、ネットで調べてみようと思いつきました。さすが、頼りになるのが、ネットの力。からくり工房「ききょうや」さんが、そのものずばりのPIC16F1705をPICkit2で使うという記事をアップしていました。

定義ファイルを頂き、PICkit2で16F1705を認識させることができました。ありがとうございました。

ありがたく使わせていただきたいと思います。

これで、心置きなく16F1705を使うことができます。めでたしめでたし。

 

おかげさまで、ちゃんとプログラムを書き込め、LEDを点灯させるという第一歩はクリアできました。

でも、点灯だけだと、ちょっと心配だったので、点滅するようにちょっとプログラムを書き換えてみたりして、ちゃんと使えることは確認しました。

 

さて、SDカードの読み書きですが、これをゼロから作るのは大変そうだし、そんな労力をかける必要はないと思い、先人たちのソースを活用させて頂くことにしたいと思います。

それでも、どうなっているか理解して使わせてもらおうかと思っていますけど。

 

ここからは、少しボリュームが必要かと思うので、ここで、いったん切りたいと思います。

続きは後日。連休中に終わらなかったので、次まで少し時間が空くかもしれません。

記事へブログ気持玉 / トラックバック / コメント


ISO Recorder 3.1でDVD-Rへ書き込み

2016/12/23 11:23

ISOファイルを生成した後、DVDに書き込むソフトとしてISO Recorderなるものを使ってみました。

 

インストール後、対象のファイル上で、マウスの右クリックを押すと、プログラムから開くの中に、ISO Recorderというそのままの名前が出てきますので、それを選択します。

すると、ISO Recorderが起動して、以下のウインドウが出てきます。

image

書き込む対象のファイルは、Sourceの欄のImage fileの所にあります。

記録装置側の設定は、Recorderの欄内にあり、私の環境では、FドライブがDVDドライブになっています。

また、16倍速対応のDVD-Rを使っているので、16xが選択されている状態になっています。

 

ここで、Nextボタンを押すと、書き込みがすぐ始まります。

 

完了すると、以下の画面が表示され、Finishを押すと、終了となります。

image

 

あまりいじるところもなく、非常にシンプルですが、必要十分な機能が無料で提供されていること感謝したいと思います。

 

今日はこれだけ。

記事へブログ気持玉 / トラックバック / コメント


DVDStylerを使ってDVDファイルを作成

2016/12/20 21:55

映像ファイルをDVD化するソフトとして、DVDStylerというのを見つけました。

結構使いやすかったので、紹介します。

これは、バージョン 2.6.1をベースにしています。確認してみたら、今は最新版として3.0.2となっていました。まだ試していませんが、この記事も参考になると願っています。

 

作成手順:

 

最初に起動した時、以下の画面が出ます。

映像形式、横縦比、音声形式の初期値を設定します。

image

設定を保存しておけば、下半分にある既存のプロジェクトから選択もできます。

 

新規を選んだ場合の手順

 

1.背景画像選択

以下のメニュー用のテンプレートを選択します。

image

これは、お好みで、選択します。

 

そうすると、以下のような感じになります。

image

右側の大きな画面が、選択したメニューのテンプレートになっています。

その中に、白い四角が3行ほど見えると思います。最初これが何かわからなかったのですが、日本語が文字化けしているものとわかりました。

ダブルクリックして、フォントを選択し直すときちんと表示されます。

 

まずは、タイトル部をダブルクリックすると、以下のウインドウが表示されます。

image

 

テキストを必要に応じて変更して、その右にあるフォント設定ボタンを押します。

そうすると、以下のウインドウが開きます。

image

タイトルなので、文字は大きめに48のサイズに設定をしました。

つまり、タイトルをダブルクリックして変更したのは、テキストの文字と、フォント設定だけということになります。

 

次に、タイトルの下の2行の文字化けを同様に変更します。

ただ、2行は、ボタンとなっており、ちょっとタイトルとは変更できる内容が異なります。

imageimage

フォントの設定だけを行いました。

 

設定が完了した後の画面は、以下のような感じになりました。

image

ウインドウの下に2つのメニュー、メニュー1とメニュー2という画面が表示されています。これは、DVD再生時に表示されるメインメニューと、メインメニューで、タイトル選択を押した時に表示されるサブメニューです。

「その横に動画ファイルをファイルブラウザーからここにドラッグします」と書かれている通り作業をします。

 

DVDに格納したい映像ファイルを、左のタブのファイルブラウザ、もしくは、エクスプローラなどから下のメニューの隣へ、ファイルをドラッグします。

ここのポイント! この時、Ctrlを押しながらやると、1つのタイトルとして読み込まれます。

よくわかっていませんが、複数のタイトルとしてDVD作るより、チャプターを複数にした方が、連続したビデオの作成には、再生時に便利ではないかと個人的には思ったので、こうしました。

 

4つのファイルを読み込むと、以下のような感じになります。

image

上記の絵のように、Ctrlを押して読み込むと、タイトル1からタイトル1-4のように表示され、全体が黒く囲まれて1つのタイトルになっているような表示になりました。Ctrlを押さずに読み込むと、各ファイルは独立したタイトル番号となり、1つ1つの間は白いままで独立しているという感じに見えます。

この例では、1つ30分、2話の映像を4つ分取り込んでいます。約2時間分ですね。

 

このまま、DVD書き込み(F9もしくは、メニューバーの赤い丸いディスクマークを押してもOK)もできます。

しかし、それだと頭出しが面倒なので、チャプター設定をしてみます。

 

そのためには、下に表示されている読み込んだ映像ファイルをダブルクリックして、プロパティ設定画面を出します。

image

ここで、チャプター位置という箇所(中央やや下)の右端の...ボタンを押します。

そうすると、以下のようなウインドウがでます。

image

+でチャプターの追加、−で削除、スパナのマークで設定変更ができます。

上記では、4つのチャプターが表示されていますが、7分おきという設定で自動的に設定されたものです。(初期値では10分置きらしい)

必要なチャプターを選択して、ダブルクリックか、スパナマークを押すと以下のウインドウが出ます。

image

ここで、スライダーを左右に動かすか、時間の右の上下ボタンで、チャプターの開始位置を設定します。 まだ、バグがあるのか、2組ある上下ボタンの右側の細かい時間設定ができる方のボタンは、進む側は動作するものの、戻る側が機能しませんでした。

 

30分番組で、2話入っているソースだったので、オープニング、1話開始、2話開始、エンディングの4か所にチャプターを設定しました。

同様に、ほかのデータにもチャプターを設定します。

 

次にメニュー2をダブルクリックします。

image

そうすると、メイン画面に4つの白枠が表示されていることがわかります。

まず左上の四角をダブルクリックします。

image

アクションのジャンプ先で、このボタン=四角を押した時、どの部分から再生するかを指定します。

また、外観という下半分の所で、映像の...のボタンを押すと、このボタンに表示させる画面を指定できます。

image

 

これで、準備は、完了したはずです。

 

メニュー部の赤いドーナッツ、もしくは、ファイル→DVD 書き込み、またはF9を押してDVDファイルを作ります。

以下のようなウインドウが出ました。

image

今回は、DVDに直接書き込まず、ISOイメージファイルを作ることにしました。

 

開始ボタンを押すと、生成が始まりました。下記ような感じで進んでいきます。

image

終了するまでにそれなりの時間はかかりました。PCの能力に依存すると思いますけどね。

 

出来上がったISOファイルをVLCメディアプレーヤーで開いて内容を確認したら、完了です。

必要なら、ここで、DVDに焼けばOK。

 

ということで、ビデオキャプチャした映像をインデックス付きで、DVD化できるようになりました。

 

今回は、ここまで。

記事へブログ気持玉 / トラックバック / コメント


ビデオのDVD化 HandBrake使用記

2016/12/19 22:44

DVD作成用にisoファイル化してしまったものから映像ファイルを取り出し、一部の映像を入れ替える作業が必要になりました。オリジナルのファイルを削除してしまったので。

 

探してみると、.isoファイルからデータの取り出しには、HandBrakeというソフトがあることがわかりました。これは、評判が良さそうだったので、使ってみました。

 

でも、このソフト、起動後の画面がちょっととっつきにくい感じでした。

しかし、この辺のページをみて、やってみたら、簡単に使えましたので、以下に書いておきます。

 

まず、使った感想を。

 

面倒な点:

ISOファイル内の映像データに複数のチャプタがあった時(今回はそれに当たります)、それをそれぞれ別ファイルとしようと思うと、Destinationのファイル名を1回ごと変更しなければなりませんでした。これが、結構手間がかかりました。連番で作成してくれれば、もっと簡単なのだけれども。

 

よかった点:

下半分のVideoタブでQualityの処で、Avg Bitrateを選択して、2-Pass Encodingにチェックを入れたら、キャプチャした時より、絵がきれいになりました。これは思わぬ朗報でした。

ビデオの映像のキャプチャは720x480ドットで行いましたが、結構ノイズもあり、ブロックノイズのような感じの映像に見えていましたが、2-Pass Encodingにより結構きれいにエンコードできました。

 

以下のキャプチャは、ISOファイルを読み込んで、設定したところです。

image

このISOファイルには、16チャプタあり、MP4で出力しました。上記キャプチャした画面は、最後の16番目のチャプタを取り出す設定を示しています。

面倒な点の所で書いた通り、いちいちファイル名を設定しなければなりませんが、最初は、Startボタンで始め、2回目以降は、その右のAdd To Queueをおせば、どんどんキューにためていけますので、1つのエンコードが終わるまで待つような必要はなく、特に待ち時間といったストレスがなかったことは助かりました。

 

でもDVDの圧縮はそんなにされていないことがわかりました。元のISOファイルサイズが、4.4GBもあったのに、MP4で出力した16個のファイルの合計サイズは、たったの808MBしかありませんでした。約5分の1の小ささです。

 

DVDにしなければ、MP4で保存しておく方が経済的ということがわかりました。

 

今回は、DVDのISOファイルから、映像ファイルを取り出すところまで。では、また。

記事へブログ気持玉 / トラックバック / コメント


VMware上のXPで、VHSファイルのキャプチャ

2016/12/18 17:01

古いもの整理中ですが、VHSテープも、取っておく必要あるのという感じですけど、一部とっておきたいものがあったので、キャプチャしておこうと思い立ちました。

 

何年か前にXSPEED-F1というビデオキャプチャ装置について、書いたことがありました。

その時は、Windows7を使っていた訳ですが、Windows XPでないとXSPEEDが使えないため、苦労した話を書きました。

 

今、Windows10を使っているので、当時と同様に、XP環境を整えないといけない訳ですが、先日来、古い時代のWindowsソフトを動作させるために、VMwareを使うことで、Windows 98を動作させることができることがわかりましたし、そこにたどり着く前に、XPも動かせるようにしていたことも書きました。

 

そこで、WindowsXP SP3のインストールができた環境を使って、PCへのキャプチャ環境を整えてみようと思いました。

 

その話をする前に、少し別の環境でのWindows XP環境も作りましたので、その経緯を。

VMwareを使わない場合、実際にWindows XPをインストールするしかないのですけど、現在の環境も保持しておく必要があります。もちろん、現在の環境がメインだからです。

 

現在のPCの構成は、以下のようになっています。

2TBのHDDにWindowsの環境ができています。こちらは、AHCIでの動作に問題ありません。また、IDEモードでも動作させることはできます。

もう1台、500GBのHDDに、Windows XPの環境を構築しました。

ただし、こちらは、残念ながら、IDEモードだけでの動作となっています。XPでもAHCI動作させることはできるようですが、トライしていません。

 

この2つをBIOS設定で切り替えて運用します。

PCを起動直後、DELキーを押して、BIOS設定画面を表示させ、HDDのどちらを優先させるかを指定して、起動させます。そうすると、選択したHDDにインストールされているWindowsが起動するという訳です。

(追記: 私が使っているマザーボードのメーカーであるASRockのBIOSでは、起動時にBootオプションというのがあり、F11を押すと、どのHDDから起動するかを選択できることがわかりました。その選択は一時的なので、次に起動する時は、元々設定しているHDDから起動するので、切り替えは簡単になりました。)

 

キャプチャしたい時は、XPを起動して、XSPEED-F1付属のUlead Video Studio SE DVDを使い、キャプチャします。キャプチャして、前後の不要部分をカットする作業を行って、ファイルを今のWindows環境に引き渡すことにしました。

 

DVDは、約2時間ほどの動画を格納できますから、複数のVHSのデータを一緒にすることもできます。そういう作業は、時間もかかるので、メインのWindows上でやれば、他のこともやりながらできますので、都合がよいのです。

 

DVDへの書き込みソフトは、どうしようかと考えていましたが、Source ForgeからDVDStylerという素晴らしいソフトが出ていることがわかりました。

 

これは、DVDメニューの設定などもでき、初心者でも比較的に使いこなせる感じなので、お勧めです。

 

これで、XP上でキャプチャして、OSを切り替えて普通の使い方を行うという環境はできました。

しかし、キャプチャは、実時間かかるので、2時間のVHSなら2時間、XPが動く状態を維持しなければならず、普段の作業が滞るということで非常にストレスがたまる環境でした。

 

そこで、VMware上で動作している、WindowsXP SP3上で、USBが認識できるのかとかも含め、動作確認を行ったところできたというわけです。これは、今の環境はそのままなので、作業も並行に行うことができるので、非常に効率的で、別ウインドウで動作しているキャプチャが何時間でも、まったく気にならない環境となりました。

 

以下は、その環境と実際に使うときのメモとなります。

  1. VMwareからXP SP3を起動します。
  2. XSPEEDに付属していたUlead VideoStudioは、XPでないといけないので、VMware上のXPにインストール。これは、普通にインストールできます。
  3. XP上でないと動作しないXSPEED-F1を用意します。まだ、USB接続しません。
  4. Ulead VideoStudioを起動。
  5. Uleadの使い方:
    初期画面で、VideoStudio Editor側を選択し、メインウインドウを出す。
    キャプチャは、タブのCaptureをを選択。右中央部にCapture Videoというのがあるので、クリックすると、準備がほぼ完了。
    ここで、XSPEEDをUSBに接続します。エミュレートされているXPでそのUSBが認識されるので、キャプチャできるようになりました。ここが一番心配していたところでしたが、ちゃんと動きました。
    2回目以降の起動で、すでに接続されていた場合、コネクタを抜き差ししないと、認識されないので注意。
    きちんと認識されると、下記ポップアップがXP上で出て来ました。
    image
    はいを選択して、先に進めます。
  6. 使用方法:
    Source: easycap video adapter
    Format: DVD
    という感じの設定にすれば、OKかと思われます。Formatは、DVDでよいかと思う。お好みで。
    この時、どんな設定でキャプチャされるかは、画面下部のInformationの所に出ています。
    DVDだと、720x480, DVD, Variable Bit R…、MPEG Audio ? Layer 2, 48000といった設定になりました。
    設定を変更したければ、Source/Formatと同じ枠内のOptionsを押して、Video and Audio Capture Property Settingsを選択すれば、ポップアップウインドウが出て、変更ができます。
    なお、このポップアップで、SourceのタブのAudioの所で、Preview audio with USB deviceの所のチェックボックスにチェックを入れておくと、PC側で音が聞こえます。
  7. これで、VHSビデオを再生して、キャプチャを始めたいと思う適当な時間に、Source/Formatと同じ枠内、下側にある、Capture Videoを押すと、録画(PCでのキャプチャ)が始まります。
  8. 終わるときは、同じところを押せば終了です。

という感じの手順でキャプチャはできました。

 

キャプチャしたファイルは、そのままメインのPCでMPEGファイルとして保存しても構いませんが、編集も可能です。私の場合は、TV録画のものだったりするので、CMをカットするなどしました。

 

編集は、キャプチャが終わってから、上部のメニューバーにあるEditタブを押します。

先ほどキャプチャしたファイルが、右側にサムネイル付きであるはずです。それをクリックすると、左側の映像表示ウインドウに表示されます。

 

編集は、次のようにカット作業を繰り返せばOKです。

[と]のボタンが映像ウインドウの真下に見えると思います。

これを使って、取り出したい部分を決めます。小さいウインドウで、少し作業がやりにくいかもしれません。その時は、はさみのボタンの右のボタンを押して、ウインドウを拡大すると作業がやりやすくなるかもしれません。

 

細かい位置決めをしたい時は、[、]のボタンの下に見える時間の所で、時分秒かその下の2桁の所をクリックします。そうすると、数字が点滅するので、その時間表示の右端にある上下三角の所をクリックして、時間を進めたり、戻したりして決めることができます。この時、上下のカーソルキーでも作業が可能でした。

適切な位置になったら、最初[か、最後]を示すボタンを押せばOKです。

範囲が決まったら、メニューのClip→Save Trimmed Videoを押して、指定された範囲の映像を別ファイルとして保存します。

 

この作業を必要なだけ行っていくと、出来上がったファイルは、右側のサムネイルの所にあるので、適切な順番で、画面下部のタイムラインの所に並べていきます。

 

並べ終わったら、上部メニューバーにあるShareタブを押します。(これはわかりにくい名称ですね)

そうすると、画面右中央部にコマンドメニューが表示されるので、その中から適当なものをクリックします。今回は、Create Video Fileを押して、出てくるプルダウンメニューから、Same as Project Settingsを選びました。そうすると、ファイル名を聞いてくるので、適当な名前を付けて保存します。

 

これで、編集されたファイルができあがるということになります。

あとは、そのファイルをメイン側のPCがアクセスできるところに持っていけば完了です。

 

ということで、今はたぶん、誰にも役に立たない覚え書きでした。

記事へブログ気持玉 / トラックバック / コメント


今頃FDDの整理中

2016/10/18 12:53

先日、古いPC関係のものを整理しているという話をしました。まだ、続けています。

 

3.5インチFD(フロッピーディスク)がたくさん出てきたのですが、そのまま捨てるのは忍びなく、できる限りデータを吸い出してしまいたいと思っています。重要な情報は、当時引き継いだはずですが、それほどでもないものは、そのままにしていたのではないかと、はっきりしない記憶状態なので、確認したいという気持ちなのです。

 

ところが、FDの中のデータを取り出すためのFDD (フロッピーディスクドライブ)が、私のまわりからなくなってしまったことに気づきました。

常にどこかのPCでFDDを使えるようにしておいて、必要なら取り出せるようにしておこうと思っていたはずだったのに。。。

メインの自作マシン用のFDDは残っているのですが、前回マザーボードを買い換えた時、FDDインタフェースがなくなっていたので、接続できない状態のまま、今に至っています。そのFDDが接続できるマザーボードは、あまり意識せずに、売却してしまっています。

たぶん、自作PCで使えなくても、実家のPCやら、会社のPCとかを使えば何とかなると思ったような記憶です。しかし、年月が経過して、今現在、FDDを持つPCがまったくなくなっていることに気づいたという次第です。

 

自宅に唯一PC-9821Cx、通称CanBeがあることはあるのですが、この頃のPCには、USBなんてありませんから、読み出せたとしても、今のDOS/VベースのWindowsへデータを持ってくる方法がなくなっているのです。 もし、CanBeを使って何とかしようとしたとしても、相当苦労しそうです。

それは、このCanBeは、HDDで運用していたのですが、そのHDDが故障していたことを何年か前に確認しているので、まず、IDEインタフェースのHDDがなければ、システムの再構築ができい状況だからです。別の案として、FDDベースで使わなければならないとすると、非常に面倒そうです。1台しかFDDはついていませんから、コピーもままならず、ネットも当時モデムを外付けで付けてダイヤルアップで使っていましたから何かを取り込むのも難しそうです。

USBメモリ代わりにインタフェースとして使えそうなのは、RS-232Cくらいしかありませんが、当時CanBeでRS-232Cを使って他のPCと通信をさせるようなことはしたことがないので、そういった環境を構築するのも難しそうです。

 

という訳で、長々書いてしまいましたが、今のPCにFDDをつなぐのが一番よさそうです。ネットで調べると、USB接続のFDDが使えそうです。中古なら1000円程度で買えることがわかりました。

 

FDは100枚くらいありましたから、1枚当たり10円程度の読み出し費用なら、まあ許容できるかと思いました。たぶん今やらないと、将来できないかもしれませんし、最後のチャンスと思って、USB-FDDを調達することにしました。

Logitec LFD-31UEというものです。

 

ネットの情報では、NECの標準フォーマットだった1.2MBタイプ、IBMフォーマットの1.44MB、1MBレベルになる前の720KBタイプの読み出しができる3モードFDDということです。フォーマットは、普通1.2MBはサポートされていないらしいですが、これはできるという情報でした。

 

USB接続して、FDを入れたら、Windows10上のエクスプローラでAドライブとして、普通に読み込むことはできました。

 

まあ、これからフロッピーを使うこともありませんが、フォーマットも試してみました。

NECフォーマットである、1.2MBが可能かどうか確かめてみたかったらです。次のコマンドを打ってみます。もちろんコマンドプロンプト上で。

format a: /f:1232

普通に進みましたが、最後に、ボリュームラベルを入力して下さいというメッセージが出て、特にラベルが不要だったので、そのままEnterを押して進ませました。しかし、最終的にフォーマットに失敗しましたというメッセージが出ました。

 

image

 

こうなると、このフロッピーに対して、もう何も操作できなくなりました。

もう一度フォーマットしようとしても、現在のディレクトリは無効です。というメッセージが出て終わってしまいます。もうこのFDは使えそうもありません。(元々捨てるつもりでしたけど)

なぜかな?

 

悩んでも仕方ありませんし、新たなフォーマットでFDを使う予定もないので、先に進めます。

 

次は、エクスプローラ上で、1.44MBにフォーマットしてみました。これは、問題なく完了しました。

そのFDに対して、今度は、コマンドプロンプト上から、format a: /f:1.23 として、1.2Mフォーマットを試してみます。だめでした。

 

ちなみに2種類のフォーマットの情報を書いておきます。

NECフォーマット:1.23MB、1024バイト/セクタ

DOSフォーマット:1.44MB、512バイト/セクタ

 

あと、このUSB-FDDの挙動不審な点というか使いにくいところがありましたので、書いておきます。

 

1枚目のFDをエクスプローラ上で開いて、コピーなりの作業後、2枚目のFDに入れ替えを行い、同様の作業を行おうとしています。

この時、Windowsがバッファしていた前のFD情報が表示され、新たなFDに入れ替えたことを認識していないような振る舞いをしていることがありました。

 

フロッピーディスクを入れ替えた時の挙動不審状況は以下のような感じです。

 

C:\Users\ohno>chkdsk a:
ファイル システムの種類は RAW です。
RAW ドライブに CHKDSK は使用できません。


C:\Users\ohno>chkdsk a:
ファイル システムの種類は FAT です。
ファイルとフォルダーを検査しています...
ファイルとフォルダーの検査を完了しました。

Windows でファイル システムのスキャンが終了しました。
問題は見つかりませんでした。
これ以上の操作は必要ありません。

    1,250,304 バイト : 全ディスク領域
        1,024 バイト : 1 個の隠しファイル
      560,128 バイト : 32 個のファイル
      689,152 バイト : 使用可能ディスク領域

        1,024 バイト : アロケーション ユニット サイズ
        1,221 個     : 全アロケーション ユニット
          673 個     : 利用可能アロケーション ユニット

 

上記2回のコマンド間には何もFDに対して操作していません。なぜか、2回目には、新たなFDを認識するような感じです。

 

こんな感じでFDの入れ替え時に問題がある場合がありましたが、手持ちの1.2MB、1.44MBのFDのデータをWindows上からコピーして吸い上げることができました。

一部FDでは読み出しができないものもありましたけど、劣化してしまったものと考え、あきらめました。

 

約1000円のUSB-FDDは中々役立ちました。たぶん、これでお役御免でしょうけど、しばらく保存しておこうとは思っています。FDのデータは吸い上げましたけど、システム系、ゲーム系のオリジナルのFDはもう少し保管しておこうかと思っているからです。

 

今回は、ここまで。

記事へブログ気持玉 / トラックバック / コメント


Windows95の頃のアドベンチャーソフトを動かす

2016/09/22 11:32

ジャーニーマンプロジェクト2・Buried in TimeをVMware上のWindows XPにインストールできた話を書きました。その後日談を少し。

 

プレイし始め、特に問題なく動かせたと思ったのですが、問題がありました。

それは、ゲーム中に表示されるアニメーション動画が適切に表示されないというものです。

 

最初のうちは、表示されていたのですが、だんだん表示されないようになってしまいました。せっかくの動画表示ですし、表示がまともでないと、プレイもままならない場面もあります。そのため、そのままにしておくこともできません。これの対策を考える必要が出てきました。

 

この症状が現れて、その昔、XPに変わったときに表示がおかしくなったソフトがあったことを思い出しました。

これは恐らく、OSの表示機構が変わったためのような気がしてきました。

ゲームのマニュアルを読むと、Windows3.1では、Video for Windows1.1が必要だけど、Windows95では直接再生機能を使っているような記述がありました。これがXPではさらに変わってしまったのでしょう。

 

さて、どうしたらよいのか、解決策がなかなか見つかりませんでした。動作条件であるWin95が必要なのかもしれません。

そうこうしているうちに、Windows98のインストールディスクが出てきました。PC-98からDOS/Vマシンに変わって初めてのDSP版Windowsです。前の記事では、32ビットのWindowsのインストールディスクで所持しているのがXPだけだと記載しましたが、Win98があったのでした。XPへ移行した時何も不便がなかったので、Win98が再度必要になることもなかったので、ディスクも含めすっかり忘却の彼方に行ってしまっていたのでした。

 

そのWin98ですが、WinXPよりWin95に近いので、もしかしたら、うまく動くかもしれないと思って、VMware上でインストールしてみました。インストール作業自体は、スムーズに進みました。Windows Updateのような仕組みも不明なので、オリジナルのまま動作させようと思っています。しかし、古いOSであるためか、VMwareのデフォルト状態では、音はならない、マウスの動きにクセがあるといった具合でした。

音がならないのは、今回のゲームプレイに支障を来たします。

調べてみると、Creative社のサウンドドライバがあれば音が出るらしいと分かりました。

Creative ENSONIQ AudioPCI on Windows 95/98というスタンドアローンなドライバなら、VMwareで使えるという情報を得ました。ES1371というカード用のものみたいです。

epw9xup.exeというファイルをダウンロードして、Win 98上でインストールしてみました。

Creative社には、今も提供していただいていること感謝したいと思います。

 

インストールが終わると、音が鳴るようになりました。これはうれしい。

なお、この対策が可能になったのは、VMWare Player 上の Windows 98 で音を鳴らすという記事のおかげです。

 

一方マウスの方は、これといった対処法が見つかりませんでした。多少ましになったと思った設定は、親のWin10上でのマウス設定で、余計な機能 (自動的に既定のボタン上へ移動とかポインタの速度の設定とか) を外すということだけだったと思います。

 

以上のように、Win98の環境が整ったところで、BIT (Buried in Time)をインストールしました。

動作させてみると、XPの時とは異なり、動画表示もばっちりです。

 

しかし、問題が1つありました。CDROMの仮想化環境です。Win98用の仮想化ソフトを見つける必要がありました。XPで使ったMicrosoft製のものはWin98では使えないので、別のものが必要です。しかし、古いOS用のものを見つけるのも面倒です。 少し悩んでいたら、VMwareでISOファイルをマウントする機能があることがわかりました。それを利用してみました。

仮想マシン設定で、ハードウエアのタブで、追加...を押して設定を開始します。ハードウエアの種類で、CD/DVDドライブを選択し、ドライブ接続の選択でISOイメージを使用するとして、ファイルを指定したらマウントが完了します。

 

今回の場合、BITの3つのISOイメージを別々のドライブに割り当てました。

そして、BITの3枚のCD-ROMがどのドライブレターに当たるかを、c:\Windows\Bitmpc.iniに記述することで、CDの入れ替えなしにゲームのプレイができるようになりました。

 

めでたしめでたしです。

 

さて、BITの方ですが、アドベンチャータイプなので、中々前に進ませることができません。全部自力でやることより、完了させたいというのが希望なのです。

 

古いソフトですが、ネットの力を借りられないか調べてみたところ、見つかりました。

日本語版の情報はありませんでしたが、本家がまだ生きていたようです。

Buried in Time

http://thejourneymanproject.com/presto/journeyman2/bithints.html

というページがあり、そこに、ゲームのヒントが英語の記載でしたがありました。

昔やったのは、全体の7割方といった感じで、ようやく、最後まで見ることができました。

 

ヒントが若干わかりにくい表現だったりしていましたし、アクションが必要な画面も出てきたので、ヒントを見たからと言って単純に終わらせられませんでしたから、十分楽しめました。

 

なお、Win XP/Vista/7対応のBITの新バージョン (内容は同じかもしれません)は、オンラインで購入できるようです。価格は、$5.99と昔の購入価格 (9800円でした)から見ると、非常に安いですね。BITは中々のやりごたえがありましたから、興味のある方はお試しあれ。でも英語版だけなので、ハードル高いでしょうけど。

 

皆さんももし、やりかけのソフトがあったら、仮想化してやり直してみるのもよいかもしれませんよ。

 

私は、あと1つ、RIVENという知る人ぞ知るMYSTの後継のアドベンチャーをこれまた、やりかけのままお蔵入りさせていたものがありましたので、こちらもトライしてみようと思っています。

こちらは、さらにCDの枚数が多く、5枚組という豪華なものなので、CD-ROMの仮想化の恩恵も十分得られると思っています。確かこれは、あまり進められず、途中であきらめてしまったのでした。でも、再挑戦しようと思います。これもWin95用なので、たぶんWin98の環境で動かせると思っています。

 

RIVENも上記のBITと同じく、gog.comでMYSTと共にダウンロード販売されているのが見えました。GAMES→ADVENTUREのカテゴリでトップに表示されてるので、いまだに素晴らしいソフトだということだと思います。私は、その前身のMYSTも持っていて、こちらは最後までやりましたけど、非常によいソフトだったと記憶しています。

 

では、また。

記事へブログ気持玉 / トラックバック / コメント


Windows95の頃のアドベンチャーソフトをXPで動かす

2016/09/18 15:10

古いWindowsゲームソフトを動かす

PC関係の古いがらくたを整理し始めました。

 

そうしたら、Win95の頃に購入したゲームソフトが出てきました。

ジャーニーマンプロジェクト2/Buried in Timeというアドベンチャータイプのソフトです。

このソフトは、途中までやったものの、最後まで終えることができないまま、環境の変化などで、そのままお蔵入りになっていたものですが、終わりまでいかなかったので、ちょっと気になっていたのです。

 

ずいぶん昔のものですが、Windows用なので、今のWin10で動くのかなと思い、試しにインストールしてみましたが、インストールすらできませんでした。

このソフトは、Windows3.1と95が動作環境となっていました。

ちなみに当時Buried in Timeを動かしていたマシンは、PC-98で、たぶんWindows95だったのではないかと思われます。

でもWin10 (64ビット版)にインストールもできないのは、なぜなの?と思い調べてみると、当時のOSは、おそらく16ビット版と思われますが、それに対応したソフトは、今の64ビットのWindowsでは動かせないということらしいです。16ビットから32ビットに移行していく時は、下位のOS用のソフトを動作させるサポートソフトがあったらしいですが、Win10でWin95 の対応ソフトを動かすようなサポートはないということだということらしいとわかりました。

 

でも、何とか動かせないのかと思って、調べているうちに、上述のように32ビットのWindowsなら、16ビットのソフトも動くようにするWindowsのソフトのサポートがあるらしいことがわかりました。ですが、64ビットになってしまった今、その恩恵には預かれないということらしいです。

じゃあ、昔のWindowsを引っ張り出すかしないと思いましたが、私の所有しているOSで32ビットのものは、XPしかありません。その次に購入したWin7は32ビットかと思いきや、64ビットだったのでした。ということでターゲットは必然的にXPとなります。

 

でも、XPを単にインストールして使うのは面倒ですし、既存のWin10とは別に運用しなければなりませんから、管理が面倒そうです。何か良い方法はないかなと思って調べてみると、仮想化の技術を使って、Win10上で、XPを動かせることが最適ではないかということがわかりました。

仮想化のソフトはいくつかあるようですが、私は、メジャーなVMware Workstation Playerを選んでみました。

 

VMware WorkstationにXPをインストール

VMwareの設定を行い、DSP版CD-ROMからWindowsXPをインストールしました。今のマシンは、当時と比べるまでもなく高速なので、それほど時間はかからずに完了しました。

 

しかし、そこから、少し問題が発生しました。XPはすでにMicrosoftのサポートが終了していたということです。XPがMicrosoftにサポートされていた間は、インストール後、Windows Updateによって、どんどんパッチが当たっていったわけですが、そういうことができなくなってしまっていたのです。XPのサポート終了時は、将来XPを使うことも予定していなかったので、アップデート用のサービスパックも保存していません。

私の持っているXPは、SP1です。それを何とかSP3までにはしたいと思ったわけです。でも自動的にそれが実現できないので、別の方法を考えねばなりません。

 

SP+メーカー

ここで、SP+メーカーというソフトがあることを思い出しました。これは、オリジナルのディスクに、アップデートソフトをパッチを当てて、所望のバージョンのインストールディスクを作るものです。

これなら、もしかしたら何とかできるかも、と思って起動しましたが、アップデートプログラムがその格納場所からなくなっていたりして、途中でエラーとなって完了できませんでした。

 

アップデートするソフトの一覧は、SP+メーカーが持っていたので、それを見て、何とかならないかと調べると、アーカイブとして保存しているサイトを利用するのが1つの対処法ということがわかりました。

それは、XPのService Packがダウンロードできなくなった対処方法2016年2月という記事に書かれているように、INTERNET ARCHIVEのサービスで、ダウンロードしたいURLを入力して見つかったら、それをダウンロードするという手法です。

結構面倒な作業でしたが、何とかSP+メーカーのlistフォルダに格納されていたdefault_wxp.lstに記載があった214個のファイルほぼ全部を手動でダウンロードしました。不要と考えたIE6/7関係のプログラムはスキップしました。

手動でダウンロードはしましたが、結局アーカイブサービスからダウンロードする必要があったのは、5件だけでした。

残りが全部、Microsoftのサイトの元の格納個所にあったわけでなく、20件だけは、Microsoftからダウンロードしたものの、Microsoft Updateカタログのページで検索してダウンロードする必要がありました。しかも、このページは、ieでアクセスする必要がありましたので、少し面倒でしたし、ファイル名も変わっているものがあったりして、推定して元のファイル名に変更して、SP+メーカーで認識できるようにしました。

 

必要なソフトを全部ダウンロードしたら、SP+メーカーでは、ダウロードしたフォルダを指定することで、ダウンロードさせないようにして、SP3のディスクを生成できました。これで、WinXP SP3を直接インストールすることができるようになったはずです。

 

そう書いたのは、上記を完了する前に、VMware上にインストールしたXP SP1上で、ダウンロードしたSP3を使って、アップデートできてしまったからです。そうしたら、Windows Updateがまだ機能しているようで、しばらく時間が経過すると、自動アップデートも動いてたぶんSP3のインストールだけでは不足だったアップデートのインストールをするように促す黄色のアイコンが現れたりしました。

 

ということは、SP1ではWindows Updateは動作しませんでしたが、SP3ならまだ、必要なセキュリティパッチが自動で当たるようにMicrosoftのサーバが稼働しているのだろうと思いました。

 

でも、それもいつまで動いているかわかりませんから、上述のSP+メーカーで最新版のSP3のインストールディスクを作っておくのもよいと思いました。結局今回は、これは使っていないので、動作確認して置く必要がありますね。時間があったらやりたいと思います。

 

これで、32ビットOSであるXPの環境が用意できました。

 

Buried in Timeのインストール

いよいよ、Buried in Timeをインストールしてみます。これは、豪華CD3枚組のソフトです。

そのため、ゲーム途中でCDを入れ替えるようにメッセージが出て動かすのですが、それが結構面倒だったことを思い出しました。でもCDチェンジャー(懐かしい名前ですね)対応となっており、ドライブが複数あれば、どのドライブにどのCDが入っているのかをあらかじめ設定しておけば、CDを入れ替えずにゲームが使える仕組みになっています。

今は、物理ドライブは1つしかありませんので、ここは、CDの仮想化を行って、CDを入れ替えなしで、プレイしたいと思いました。

 

まず、CDROMの内容をisoファイルにする必要があります。それは、簡単でした。Win10のエクスプローラで、CDを挿入したドライブをマウス右クリックすると、以下のようなポップアップがでます。

image

その中から、Create image from CD/DVDという項目を選択します。

そうすると、Record CD/DVDというタイトルのソフトが立ち上がるので、isoファイル作成先を指定してNextを押せばコピーされます。

image

これは、Windowsの標準機能だそうです。便利になったものです。

コピーが完了したら、Finishを押して終了させます。

 

CDのデータをISOファイルとして準備できたら、次は肝心のCD-ROM仮想化ソフトを用意しないといけません。探してみたら、Microsoft謹製のVirtual CDRom Control Panelというソフトが良さそうです。これは、XPから7まで使えるソフトなので、VMware上のXPにもインストールできます。

 

ダウンロードしたwinxpvirtualcdcontrolpanel_21.exeを実行すると、3つのファイルが生成されました。

readme.txt、VCdControlTool.exe、VCdRom.sysです。

readmeに手順が書いてあるので、それに従って作業を進めます。

VCdRom.sysは、%systemroot%\system32\driversフォルダに入れます。

そして、VCdControlTool.exeを実行します。

仮想ドライブの追加を行い、先ほど作成したisoファイルをその追加したドライブにマウントします。

 

これで、CD-ROMがなくても、仮想的にアクセスできるようになりました。

 

準備ができたところで、Buried in TimeをXP上でインストールしてみます。Win10の時とは異なり、ちゃんとインストールできました。

そして、実行してみると、ちゃんと動きました。すばらしい。

でも、設定を忘れていました。上述したように3枚のCDROMがどのドライブに入っているか指定しないといけません。c:\Windowsの下に、BITMPC.INIというファイルができているはずなので、DiskPath1=W:\、DiskPath2=X:\、DiskPath3=Y:\のような感じで、3枚のCDがどのドライブにあるかを記述しました。これで、CDを入れ替えずに、ゲームを進行させられます。

 

では、さっそく楽しみたいと思います。涼しくなってきたので、こういうアドベンチャータイプのものを楽しむのによい季節ですから。

 

なお、マウス、サウンド、ディスプレイ等は、VMwareの標準状態で対応できており、特別に何かする必要はありませんでした。

 

ではまた。

記事へブログ気持玉 / トラックバック / コメント


停電からSheeva関連で問題発生した時の経緯

2016/09/16 22:16

東京電力からスマートメータに取り換えると連絡があり、一時的に停電となりました。

その後、色々と問題が発生しました。

外部からSheevaPlug+のWebサーバにアクセスできなくなりました。

停電だけが問題ではなく、この前のOSのバージョンアップも絡んでいたようです。

 

SheevaPlug+上で動作させていたソフトの初期設定が必要みたいです。

サーバはずっと稼働させっぱなし状態みたいなものでしたから、すっかり何をしたか忘れてしまっています。

過去の記事やらを見ながら設定していきます。

 

まずは、サーバが外部からアクセスできるようにしないといけません。

無料ダイナミックDNSを使っていましたが、たぶん、WAN側のIPアドレスが変わってしまったように思えます。

 

私の場合、kazhat.dip.jpという名称で、家サーバさんのところで登録管理してもらっています。

 

そこからddns-update.plをダウンロードしてきて、そのプログラム内に、$ACCOUNT、$DOMAIN、$PASSWORDを設定します。

これを/usr/lcoal/ddnsディレクトリに格納しました。

Debianの新バージョンをインストールした後、これをすっかり忘れていて、何もしていなかったのでした。

ここの設定に関しては、ダイナミックDNSサービスを利用してみるに、書いていました。

 

以下のように実行していきました。

/usr/local/ddns$ sudo crontab -e
[sudo] password for ohno:

エディタが開くので、

5,35 * * * * /usr/local/ddns/ddns-update.pl

を書き込んで、^xを入力すると、/tmp/crontab.0nuDqH/crontabに書き込むみたいです。

 

crontab: installing new crontab

という表示が出て、終了しました。

 

でも、終わってみると、書き込んだはずのファイルは、そこには、ありません。

どうも、/var/spool/cron/の下のcrontabsの下に格納されたみたいです。

 

 

/usr/local/ddns$ sudo ./ddns-update.pl

と入力して、試しに起動したところ、うまく動いたみたいです。

 

current_ipとip_update.logというファイルが生成されました。

 

crontabも実行したので、たぶん、30分ごとに更新されるはずです。

 

この後、外部からアクセスできるようになりました。

 

大した話ではありませんでしたが、今回はこれで終わりです。

記事へブログ気持玉 / トラックバック / コメント


長年のナゾ@キーボードonWin10、ようやく解決

2016/08/16 18:03

私のPCのキーボードは、Unixマシンを使っていたことや、emacsを常用していたことから、キーボードのAの左隣のキーは、ずっとCtrlキーとして使用していました。

そのため、通常左CtrlキーとCaps Lockキーを入れ替えを何らかのソフトや設定で行っていたのでした。

 

しかし、昨年Windows10にアップグレードした時、使っているキーボードの挙動がおかしくなっていました。それは、左CtrlキーもCaps Lockキーも同じキーコード、つまり、同じ機能になってしまったのです。そのため、元のCaps LockキーにCtrlキーの機能を割り当てると、左下のCtrlキーもCtrlキーの動作のままとなり、Caps Lockを行うボタンがなくなってしまっていました。

 

Caps Lockを使うことはないので、それでも良いと思っていましたが、今日、ふと、デバイスマネージャーのキーボードのドライバの詳細をみたら、見慣れないCtrl2Cap.sysというファイルが設定されていることに気づきました。

これは、何だろうと調べてみると、Mark Russinovichという方が作成したCtrl2capというソフトということがわかりました。

そこには、アンインストールのやり方(ctrl2cap.exe /uninstallと実行)も書かれており、実行したら、Ctrl2capのドライバが削除されました。(管理者権限のコマンドプロンプト上で実行し、要再起動)

このドライバ、c:\Windows\System32\driversの下にあったのですが、日付が2012年と古く何か怪しいと感じたのですよね。それから、調べてみたら上記の情報にたどり着いたという次第。

 

まったく記憶がありませんが、何かの時に、これをインストールしてみたのでしょう。でもその存在を忘れ、確かWindows7の頃からレジストリに書き込む手法をとっていて、なぜかWindows10にアップグレードした時、そのドライバがSystem32に残っていたので、自動的に適用されてしまったのではないか推察しています。

 

このCtrl2capをアンインストールすると、当該フォルダのctrl2cap.sysは、簡単に削除できました。

すると、Caps Lockと左Ctrlキーは、それぞれ元の機能に戻りました。

 

そして、いつものようにregeditを起動して、

\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

の下に、Scancode Mapを作成します。これは、Keyboard Layoutの所で、マウス右クリック→新規→バイナリ値で新しい名前を作成して、名前をScancode Mapに変更します。

そして、それをダブルクリックして、編集画面を出し、次を設定すれば完了です。
00 00 00 00 00 00 00 00
05 00 00 00 1d 00 3a 00
3a 00 1d 00 01 00 29 00
29 00 01 00 00 00 00 00

上記は、データだけなので、ご注意を。

終端コードの0000まで、5組のデータがあることを示しており、1d00が左Ctrl、3a00がCaps、Esc=0100、半角/全角=2900で、それぞれ、コードを入れ替えていることを示しているとのこと。

 

ともかく、古いドライバを間違って使っていたことが分かって、めでたしめでたしということでした。

 

では、また。

記事へブログ気持玉 / トラックバック / コメント


ダイソン掃除機にPICが入っている

2016/08/12 22:52

少し、PICをいじる時間がなくなっている今日この頃です。

 

たまたま、興味深い記事を見かけました。

 

ダイソンの掃除機の分解解析記事です。日経テクノロジーに掲載の「分解スペシャリストが見た!スゴイ製品その中身」という連載で、「

人気も吸引力も衰え知らず、Dysonのサイクロン掃除機」という記事です。

Dyson DC62という機種を分解して、解析したというものです。

なお、リンクの記事は、8/26までだけ一般無料公開ということなので、お早めに。

 

興味を持ったのは、Dysonの掃除機のメイン基板にPIC16F1936のSOPタイプのものが使用されているという所です。普通(?)の家電で、PICが使用されているものがあることを初めて知りました。
マイコン制御という言葉はかなり昔から聞きましたけどね。最近は死語かも。

 

上記は、メイン基板ですが、バッテリ部のサブ基板というものもあり、そちらには、PIC16LF1827が使われているとのこと。

 

16F1936は、使ったことがありませんが、16F1827は、PIC時計に使いました。

16F1936は、28ピン、8KW、25I/O、最大動作周波数32MHzという感じのスペックで、特筆するような機能はなさそうです。

 

実は、我が家では、かなり前のDC12という機種のDyson掃除機を使っています。もしかしたら、これにもPICが入っているのかもしれません。

なんとなく、親近感がわきました。

記事へブログ気持玉 / トラックバック / コメント


SheevaPlug+からWindows10のファイルアクセス

2016/08/11 18:15

Windows10のアニバーサリー版がリリースされたというニュースがありました。

順次自動アップデートされるという話でしたが、私のPCには、1週間経過した8/9になっても、その気配がありません。待ちきれなくなり手動でアップデートしました。

 

Windowsメニューに出方など色々変わっている(改善されている)ところもあるようですが、それはネットの情報にお任せしたいと思います。

 

このアップデートが原因かどうかわかりませんが、SheevaPlug+からWindowsのファイルアクセスができなくなってしまいました。

その回復に少し苦労したので、その経緯を書いておきます。

 

以前記事にしたように、リモートアクセスのプログラムを動かすなど、ファイルの共有で対応しているので、ファイルアクセスができなくなると、所望の動作ができなくなるので困ります。

 

ファイルの共有は、sambaの機能を使って、SheevaPlug+側でPCのフォルダをマウントすることで実現しています。

 

例えば、以下のような感じでマウントします。

sudo mount -t cifs //192.168.1.12/sharedFile /media/sharedFile/ -o iocharset=utf8,file_mode=0777

 

192.168.1.12というのは、LAN内で割り振られているWindowsPCのURLです。

sharedFileというフォルダを、SheevaPlug+の/media/sharedFileというディレクトリに割り付けるわけです。そのほかのオプション、cifsは、Windowsのファイル共有サービスを使ってアクセスできるようにするものみたいです。文字コードをiocharsetで指定しています。utf8にしているのは、SheevaPlug+側がそれでないとうまく漢字を表示できないからです。file_modeは、unixのファイル属性でおなじみのもので、ここでは、読み書きOKの設定にしています。

 

一方、Windows側では、sharedFileというフォルダのプロパティで共有設定を行っておく必要があります。

image

共有タブの共有...を押して、出てきたウインドウで、Everyoneを選び、追加ボタンを押します。

image

アクセス許可レベルは、読み取り/書き込みとして、フルアクセス可能に設定しました。

最後に、右下にある共有ボタンをおして、次のウインドウで、終了ボタンを押して、設定完了です。

 

普通なら、ここで、SheevaPlug+側で先ほど示したように以下のようにマウントすればOKのはずです。

sudo mount -t cifs //192.168.1.12/sharedFile /media/sharedFile/ -o iocharset=utf8,file_mode=0777

しかし、Permission deniedというエラーが出て、マウントできません。

今までできていたはずなのに、結構な時間解決できず、調べる時間もなく放置状態でした。

 

ようやく時間ができて、よく見てみると、上記のsharedFileのプロパティ画面の一番下の下の資格の中、パスワード保護のところを見ると、共有フォルダにアクセスするには、ユーザーアカウントとパスワードが必要と書かれていることに気づきました。

設定を変更した方がよさそうなので、リンクをクリックしてみました。

 

ウインドウが出てきました。大きく3つの設定区分がありました。

ゲストまたはパブリックのところが、以下のように、ファイルとプリンタの共有を無効にするとなっていたので、有効する方を選択しました。

image

さらに、すべてのネットワークの所をクリックして広げると、2か所関係ありそうな箇所がありました。

パブリックフォルダーの共有の所と、パスワード保護共有の所です。

image

これを上記のキャプチャのように設定して、変更の保存ボタンを押したら、このウインドウが消えました。

 

そうして、再度SheevaPlug+側でマウントさせてみると、ようやく、マウントされ、ファイルにアクセスできました。

 

昔は、どうやったのか記憶にないのですが、たぶん、ちゃんと設定したのでしょうけど、やり方をすっかり忘れてしまったということだと思います。

 

これで、また元通りになりました。

 

今回は、これだけ。

記事へブログ気持玉 / トラックバック / コメント


焦電型赤外線センサ (D203B) を使ってみた

2016/07/21 20:36

焦電型赤外線センサ、いわゆる人感センサを使ってみようと思います。

 

すでにたくさん情報あるので、大した情報にはならないかもしれませんけど。

 

秋月電子さんから、焦電型赤外線センサD203Bを購入しました。100円でした。

それと、フレネルレンズ S9001も合わせて購入しました。このレンズは、Senbaの焦電センサがすっぽり入るとしか書かれていませんが、D203BがNanyang Senba社となっているので、これだと判断したわけです。

 

ネットでよく見かける記事では、センサはAKE-1 (RE-210)を使ったものがほとんどでした。

これを使ったら、情報も多く簡単そうです。

でも、レンズのことを考えると、ちょっと心配でした。

 

図面を見る限り、RE-210の外形が8.3mmΦ (カタログには、RE-200Bしか掲載されていなかったので)で、D203Bが8.2mmΦと違いがあります。 一方、フレネルレンズ側で、センサがはまるところの内径が8.2mmです。

 

秋月さんのページのコメントにあるようにD203Bなら、すっぽり入るでしょうけど、RE-210だときつかったりして入りにくかったり、使えないと困ります。

 

心配なので、D203Bを購入することに決めたわけです。

もう一つの心配の使用例がほとんど見つからないという所は、参考回路を参考にすることで対処することにします。

 

回路

回路は、D203B参考技術資料焦電型赤外線センサーとPIC12F675を使った人間検知LED照明制御回路の実験アナログ工作にはまる:焦電型赤外線センサーユニットの制作に記載の回路図を参考にさせていただきました。

 

部品の種類を削減するため、最終的に以下のような回路にして実験です。

PICは、12F1822をとりあえず使うことにしました。

 

image

 

焦電センサからの出力をアンプで増幅して、PICでAD変換して検出しますが、その時の値を確認するため、例のディスプレイとEUSARTと接続してデバッグします。

また、LEDも付けて、人を感知したらLEDを光らせる実験もできるようにしました。

 

回路は、焦電型赤外線センサーとPIC12F675を使った人間検知LED照明制御回路の実験のものとほとんど変わりません。

2段目のアンプのバイアス電圧は、手持ちの抵抗を使ったので、10Kになっていますが、VDD/2を作っているだけなので、同じですね。

 

第1段の非反転増幅で22.3倍、第2段の反転増幅で21.3倍と、合わせて約474倍の増幅をしています。D203Bのアプリケーション例では、1段目は同じですが、2段目が180倍増幅になっていたので、約10倍もの差があります。アプリケーション例では電圧が12Vとなっていたので、3.3V位を考えていた私の回路を考慮すると、まあまあのところでしょうかね。

 

もっと詳しい説明は、赤外線検出ユニット 回路説明をご覧になるのがよいと思います。

私が説明しなかった、コンデンサに関する説明もされています。

 

電源を入れて、2段目のオペアンプの出力電圧を手持ちのマルチメータで測定してみると、通常時1.7V前後、手をかざすと、2V程度になっていました。

電圧は、かなり揺らいでいました。1.7Vというのは1.6V〜1.8V位ですかね。

実際には、人がセンサの感知範囲に入ると、2Vぐらいになった後、1.7Vに戻り、さらに、感知範囲から人がいなくなると、今度は、1.3Vに下がるという反応を示していました。Webのどこかで見たような記憶があるのですが、センサは、赤外線が変化したことを出力しているようです。一種の微分波形のようなものと思えばよいですかね。

 

今回は、人がセンサの範囲外から範囲内に入ったことを検出するだけにしてみました。

つまり、定常電圧から、一定レベル以上の電圧になったら、人が範囲内に入ったと判断するわけです。

 

PICのプログラムとしては、増幅したセンサからの出力AD変換させ、適当なしきい値を超えたら人を感知したと判断させればよいので簡単そうです。

 

プログラムの作成:準備編

では、PICのプログラムを始めましょう。

 

すでに説明していますが、たまに書いておかないと古いものを検索するのも面倒になるので、詳細を書いていきます。

 

いつものように、MPLAB X IDEを立ち上げて、新規プロジェクトを作成します。

imageを押して開始します。

  1. Choose Project:Standalone Projectを選択して、Next >を押します。
  2. Select Device:今回使用するPIC12F1822を探して選択して、Next >を押します。
  3. Select Header:特に何もせず、Next >を押します。
  4. Select Tool:書き込み用ツールを選択します。私の場合PICkit2しか持っていませんが、今回は赤ランプが付いていて選択できません。次に進めるため、緑ランプのものを適当に選択して、Next >を押します。MPLAB Xの統合機能が使えないですが、大きな問題はないと思っています。
  5. Select Plugin Board:ここは、自動的にスキップされました。
  6. Select Compiler:XC8を使うので、その最新版のXC8 (v 1.37)を選んで、Next >を押します。
  7. Select Project Name and Folder:プログラムを格納するフォルダとプロジェクト名を設定します。Encodingは、Shift_JISがよいでしょう。 Set as main projectにチェックが入っていた方がコンパイルする時、面倒がないと思います。以下のような感じです。

image

最後にFinishを押すと完了です。

 

プロジェクトの準備ができたら、まずは、MCCを使って、基本のプログラムを生成してもらいます。

imageを押して開始します。

以下は、すでに設定が済んだ状態のキャプチャですが、説明しやすいと思って、最初に掲載しておきます。

image

最初は、左上のProject Resourcesの中、Systemの下の3項目だけが登録されているはずです。

 

最初に、System Moduleを選択 (初期時に選択されていると思います)します。Easy Setupで、500kHz動作にしてみました。そんなに高速動作はいらないと思ったからです。

そして、PLL EnabledとLow-voltage programming Enableの2つのチェックを外しました。

これで、System Moduleのところは、完了です。

 

次に、Pin Moduleと思いましたが、必要なリソースを追加します。

左中央のDevice Resourcesから今回必要なADCと、EUSARTを追加します。

ADCをクリックして展開し、ADCが現れるので、それをダブルクリックします。そうすると、左上のProject ResourcesのPeripheralsにADCが追加されるはずです。

同様に、EUSARTをクリックして、その下のEUSARTをダブルクリックします。

そうすると、Project ResourcesのPeripheralsにEUSARTも追加されるはずです。

 

また、画面下部にPin Managerの所が、初期状態から変わるはずです。

 

ここで、Project ResourcesのPin Moduleをクリックします。

そして、どのピンを有効にするか設定していきます。それは、下部のPin Managerのウインドウ内で行っていきます。

 

今回、PIC 12F1822の8ピンDIP品を使っているので、Packageの所でPDIP8を選択すると、実際のPin Noと表示が合います。12F1822では、どのPackageを選択しても、Pin Noは同じですね。

 

ADCは、アンプの出力をつないだRA2ピンの所をクリックします。すると、緑の背景で、カギがかかったアイコンに変わり、Pin Managerウインドウの上にあるPin Moduleというウインドウに1行追加されると思います。

そうしたら、いくつか設定しておくとよいかもしれません。設定するのは、Custom Nameの所、ここは、プログラムするときわかりやすい名前にすればよいと思います。今回は、PIRとしました。それと、初期時WPUにチェックがついていたので、ここのチェックを外しました。

 

そして、EUSARTの所は、ディスプレイとつなぐピンの設定として、TXの所で、RA4をクリックします。RXの方は設定しません。

上のPin Moduleウインドウで、RA4の所を設定します。Start HighとOutputにチェックを入れました。

 

最後のピン設定は、LED用にGPIOのoutputの所で、RA5をクリックします。

Pin Moduleの設定では、Custom Nameの所をLEDにしてみました。 Outputにはチェックが入っていると思いますが、WPUの方は、チェックを外します。

 

これで設定は完了です。右上のウインドウには、使用するピンの所が緑色に変わります。

ピン名で設定できるところには、自分で命名したPIRとかLEDという名称が表示されるので、配線する時も間違いにくくなっています。

Pin Moduleの完了した時の状態が以下となります。

image

RA0,RA1は、プログラムを書き込むときにPICkit2と接続するDATとCLKになるので、使用を避けています。デバッグ中は、PICkit2と接続したままにしているので。

 

もう少し設定が残っています。Project ResourcesのADCをクリックします。

ここでADCの設定を行います。基本的に初期状態のままでよいかと思いました。Result Alignmentの所は、rightにしました。これは、10ビットのAD変換した数値を16ビットに詰め込むときに上位ビットのMSBから詰めていくか、LSBから詰めていくか指定するものです。通常は、数値として計算しやすい、LSBが詰めるright (右詰め)が使いやすいと個人的には思っています。

他は、変更していませんが、キャプチャしておきます。

 

image

 

最後に、EUSARTの設定します。ここは、デフォルトのままですね。

非同期、9600ボー、8ビット、パリティなしという状態です。これは、受信側の設定と合わせる必要があります。

image

 

これで、プログラムを生成します。

左上のProject Resourcesの右のGenerateボタンを押します。この時、設定ミスとかで、上記キャプチャでも黄色のびっくりマークのタブが見えますが、そこでエラーがあると生成されません。Notifications:0でなく、1以上の数値の時は、中身をチェックする必要があります。中には、エラーでないものも含まれるので、0以外の数値になっていても生成できる場合もありますが、中身はチェックしておくとよいと思います。

 

ちゃんと生成できると、下部のPin ManagerのウインドウがOutputに切り替わり、Generation completeの文字が表示されていれば、OKです。

 

そうしたら、Project Resourcesのウインドウの上に見えるProjectsのタブを押して、ファイルが見えるようにしましょう。

 

私の場合は、以下のような感じになりました。

image

 

プログラム作成編

これから、main.cを書き換えていきます。その他のプログラムは、必要に応じて参照するとよいと思います。

 

main.cをダブルクリックすると、ファイルが開き、ウインドウ中央部に表示されます。

 

今回は、PIRピンの電圧をAD変換して、ある一定の値になったら、LEDをonさせるという形にしようと思います。

 

void main()内に必要なコードを加えていきます。

初期化は、SYSTEM_Initialize();により、行われるようにすでにプログラムが書かれていると思います。

今回は、割り込みも使わないので、コメントになっている割り込み関係の所には手を付けません。

 

そして、以下のような感じにしました。while (1) { }は、最初から記載があると思います。それを置き換える感じでプログラムを書きます。

 

adc_result_t data;

 

__delay_ms(1000);
EUSART_Write(0x0c); //画面クリア
SetCursor(0, 0);
DisplayChar("PIR");

 

while (1)
{
    // Add your application code

    // PIRからの入力レベルをAD変換
    data = ADC_GetConversion(PIR);
   
    // AD変換した値をEUSARTに出力
    SetCursor(0, 0);
    DisplayValHex(data >> 8);
    DisplayValHex(data & 0xff);
    __delay_ms(500);

 

    if (data > 0x240) LED_PORT = 1;
    else LED_PORT = 0;

}

たったこれだけという感じですが、これだけです。 (ディスプレイ関係の関数は除く)

 

whileの無限ループの前に、4行処理があります。これは、別途作成したデバッグ用のLCDディスプレイにメッセージを表示するもので、画面をクリアして、PIRという文字を試しに表示しているだけdす。 EUSART_Write()という関数は、自動的に定義されるものです。これで通信してくれます。SetCursorとDisplayCharは独自関数ですが、説明は省略します。ここも、中身は、EUSART_Writeを行うのですが、わかりやすく、カーソル位置を設定したり、文字列を表示できるようにしたものです。以前示したと思うので、それを探してください。

 

whileの中がメインのプログラムとなります。

PIRと名付けたピンの電圧をAD変換して、16ビットのデータとしてdataという変数に格納しています。

そのdataをディスプレイに16進数で表示させるための4行があります。

そして、最後のif文以下2行が、そのdata値に応じて、LEDを光らせるかどうかを決めています。

 

これをコンパイルして、エラーがなければ、バイナリが生成できるはずです。このプログラムで、256バイトというサイズでした。

 

ここの0x240というのは、ディスプレイに表示された数値を見て、適当に決めました。

前の方で書いたように、通常時、1.7Vくらい、人を感知すると2Vぐらいになりますので、そのレベルに応じた値を設定したことになると思います。揺らぎがあるので、少し余裕を持たせた方がよいかとは思います。

 

今回、VDD=3.3Vで動作させているので、10ビットのAD変換では、通常時1.7Vだと、1.7V/3.3V*1024=527=0x20fになり、2Vだと、2V/3.3V*1024=620=0x26cというレベルになると考えられます。

少し余裕をもった0x240というのは、ちょうどよい数値ではないでしょうか。

 

手をかざすと、LEDが光り、すぐ消えます。これは、センサが人を感知したという変化があったときだけ電圧が上がるからです。そのまま手をかざしておいて、今度は、手をセンサから外すと、電圧は1.4Vとかいうレベルに下がります。この時を検出するように今回はプログラムしていませんから、何も起こりませんけど、LCDディスプレイには、小さい数値が表示されました。

 

これをベースに、人を感知したら、タイマを起動して、一定時間点灯するというプログラムを作れば、前回作ったタッチセンサ付き5灯LEDスタンドのようにタッチせずとも、人を感知して点灯するものが作れますね。

 

意外と簡単に、焦電型赤外線センサが機能したので、ほっとしています。

これも、プログラムの作成で面倒な設定をMCCがやってくれるおかげです。これで、プログラムサイズを最適化して、小さくしてくれると最高なのですけどね。それは割に合わないので、できるだけメモリ容量の大きなものを購入するという方法で対応することにしたと以前に書きましたね。

 

注意事項が1つ。電源を入れてしばらくは、安定しないのか、12〜13秒ほど経過すると、LEDが付きっぱなしの状態になります。その後、1分ほどは手をかざそうが何をしようが反応しません。

最初、ハードがおかしいのではないかと色々いじってしまったりしまいましたが、放っておくのが一番だという結論です。 ネットでも、電源を入れて10秒後に突然出力が1になり、それから30秒は、そのままだったという情報がありました。通常の動きを検出するまで、40秒かかったということですね。私の場合より短いですが、RE210を使われた話なので、違いはあるのでしょう。

 

ちなみに今回の工作の費用は、センサ100円、フレネルレンズ40円、LM358 20円(5個100円)、抵抗計9個(4種類) 9円相当(100本入り100円x4)、コンデンサが電解3個 30円(1個10円)、セラ3個(0.01uF) 30円 (10個入り100円)、PIC 12F1822が100円、LED1個20円位という感じでしょうか。

合計で、350円位といった所でしょうかね。センサモジュールだと、400〜500円位ですから、珍しくお安くできました。なお、ブレッドボードとか、配線代は入れていません。

 

最後に、今の実物の状態の写真を提示します。

DSCN0322

一番左側のブレッドボードが今回製作したもの、その右側は、前回紹介したデバッグ用ディスプレイです。さらに右側に「ほぼPICkit2」が少し見えています。

ディスプレイのブレッドボードには、赤と黒のコードで電源が供給され、黄色のコードがEUSARTの信号線がつながっています。

本体のブレッドボードの中央が焦電型赤外線センサ、右上は、PICkit2からのICSP接続用のケーブルです。電源もここから供給してもらっています。右下にLEDを載せています。

 

では、また。

記事へなるほど(納得、参考になった、ヘー) ブログ気持玉 2 / トラックバック 0 / コメント 0


グラフィックLCDを使ってみる その4

2016/07/16 11:13

説明を続けます。

 

今回は、キャラクタコード0x20(スペース)から、0x7fまでを作ることを前提にプログラムしています。

それ以外の場合は、プログラム内の$codeの値を適切に設定して下さい。ここは、コメントを作るだけなので、間違っていても大勢に影響はありませんけどね。

 

入力するビットマップデータとして、今回は、以下のようなビットマップファイルを作りました。

フォントは、8x8ドットとなっています。区切りを示すドットが左と、下にあります。

image_thumb1_thumb

 

このフォントは、Palmプログラムで使ったもの (今回少し修正しましたけど)です。

ファイル形式は、モノクロでないと、変換できませんので、ご注意を。

 

プログラム内に記載している通り、

perl bmp2txt.pl ***.bmp [output.txt]

とperlが動くシェル上で実行してください。最後のoutput.txtは、省略可で、省略した場合、指定したビットマップファイル名に.txtがついたファイルが生成されます。

私の場合は、Windows10上で、cygwinを動かして、そこで、perlを実行しています。

 

なお、生成されたファイルは、テキストファイルですが、改行コードがUNIXスタイルなので、メモ帳ではきれいに表示されませんので、ご注意ください。私は、Meadow (emacs)でテキストは見ています。

それをMPLAB X IDE上のプログラムにコピーすれば完成となります。

 

一方、MPLAB Xで作成するメインプログラムは、以下のようなもので動作確認しました。

完全なものではありませんが、簡単なものなので、不足分は、すぐわかると思います。

 

LCDg_init();

LCDg_cls();

 

LCDg_pos(0, 0);
for (ii = 0; ii < 96; ii++) {
    LCDg_print(st);
    st[0]++;
}

 

__delay_ms(2000);
__delay_ms(2000);

 

LCDg_cls();


LCDg_setSize(2); //0:Normal, 2:縦2倍, 4:縦横2倍

LCDg_print("AQM1248A Graphic LCD\n");
__delay_ms(2000);
LCDg_print("3 font size !!\n");
__delay_ms(2000);

 

char message[10] = "\nTest000";
const char hexch[] = "0123456789ABCDEF";

 

LCDg_cls();
ii = 0;
LCDg_setSize(2); //0:Normal, 2:縦2倍, 4:縦横2倍
while (1) {
    message[7] = hexch[ii & 0x0f];
    message[6] = hexch[(ii >> 4) & 0x0f];
    message[5] = hexch[(ii >> 8) & 0x0f];
    LCDg_print(message);
    ii++;

    __delay_ms(500);
}

 

このプログラムでは、初期化後、画面をクリアし、定義したキャラクタコード0x20〜0x7fを表示します。16文字x6行表示できますので、全部の文字の状態が確認できるはずです。

その後、4秒ほどwaitした後、縦2倍のフォントで、AQM1248A Graphic LCD他を表示します。

 

そして、その後、Test000と表示します。0.5秒毎に、番号を+1しながら、表示をします。

この時、番号は、16進数になっています。

これは、スクロール機能を確認する意味で入れています。

この例では、縦2倍フォントなので、3行表示になっていますが、LCDg_setSize();の引数を0か4にすることで、フォントサイズを変更できますので、試してみて下さい。

 

表示状態は、以下のような感じです。なかなかいい感じだと自己満足しています。

DSCN0313_thumb[11]

DSCN0313_thumb[10]

DSCN0314_thumb[8]

最初の写真は、前回示した写真と同様の全体像ですが、8x8ドットで、定義した全96文字が、16文字x6行で表示されています。その拡大したものが2番目の写真となります。

最後の写真は、縦2倍表示を示したもので、16文字x3行で、メッセージが表示されています。

 

全体写真をご覧になってお分かりの通り、ブレッドボードの配線は、ジャンパタイプから変更したので、以前キャラクタLCDだけを接続していた時より、かなりすっきりしていると思います。

 

これでテストはできましたので、以前と同様に、EUSARTで他のPICからデバッグ情報を受信して、表示するということが、このグラフィックLCDでもできるようになります。

こちらは、外形がほぼキャラクタLCDと同じですが、最大16文字x6行と、多くの情報を表示できるので、重宝するのではないか考えています。

 

画面表示文字のバッファ変数を大きく取り、画面から消えた情報もある程度保持するようにして、スクロールボタンをつけたら、もっと多くの行数を表示できたりすると思います。

色々とアイデアが浮かびますが、それは、デバッグで使いながら、必要に応じて対応していくようにしたいと思います。

 

これで、今回のお話は、完結です。では、また。

記事へブログ気持玉 / トラックバック / コメント


グラフィックLCDを使ってみる その3

2016/07/16 11:11

フォントの作成に関して書いておきます。

 

フォントデータをプログラムに埋め込むのは、結構面倒だと思います。

すでに、このLCDを使って、プログラムソースを開示している方のデータから頂くのもよいのですが、自分で作るのが、好みのものを作れたり、その時々の条件にあったものを用意でき良いだろうと思っています。そして、最初の1〜2文字は、キャラクタLCDのデータシートに書いてあるフォントを見ながら、バイナリデータに頭で変換しながら、プログラムソースを作るということをやり、表示確認を行いました。

でも、数文字ならその方法でもよいかもしれませんが、今回予定している96文字も作るという作業はやってられません。

 

そこで、ふと思い出したのです。Palmプログラムで作ったフォントデータがあったのを。

MemoViewerというPalmwareでは、自作のフォントで等幅表示をさせました。

 

その時、ベースとなるフォントデータをビットマップで作っていました。

そのビットマップデータは、Windowsの標準ソフトであるペイントを使って作っていました。

この方法だと、少しフォントの形を変えたいという時も簡単です。

 

ペイントでなくても構いませんが、お絵かきソフトで、形状を見て、修正するのが一番良い方法だったからです。また、そのファイルフォーマットがわかるもので、かつ簡単な構造という要求も加わります。それは、以下で。

 

Palmwareでは、フォントデータをテキストの形で、リソースとして与えてコンパイルしていました。

テキストというのは、例えば、数字の5を以下のような形で記述することです。

----
###-
#---
#---
##--
#-#-
--#-
--#-
##--
----
----

 

こういうテキストデータをモノクロビットマップからperlプログラムを使って、生成したのです。

このpalm用のプログラムをそのままでは、今回の用途としては使えませんが、今回のプログラムソース用のデータも作れるはずと、プログラムを改造を試みました。

 

で、どんなperlプログラムかというと、以下のようなものです。

結構力づくで変換していますが、PICの動作に関係なく、たまに使うだけのもですから、お許しください。

 

bmp2txt.plというファイル名としています。

#
# bmp2txt.pl : モノクロbmpをフォントリソースに変換
# 2016/7/10 Copyright Kazuki Ohno
#
# bmpには、最下行に、文字ごとの切れ目マークを入れる。文字の左下に点があること。
# 左端には、行を示す点が必要。
#
# Usage: perl bmp2txt.pl ***.bmp [output.txt]
# 入力:モノクロbmpファイル
# (1)左端に行を示す点を上側と下側に入れる。
# 上端の点は、データ領域に含まれ、下端の点は、含まれない
# これにより、各行が離れたデータを処理が可能となる。
# (2)各文字の左下に点を区切りとして入れてあること。この点は、領域外。
# (3)行の最後は、3ドットの点を区切りとして入れてあること。
# 例:以下のようなモノクロビットマップとなる
# ■:黒ドット(位置を示すマーカ)、□:白ドット、○データ領域
# ■□○○○○○○○○○○□○○○○□○○○
# □□○○○○○○○○○○□○○○○□○○○
# □□○○○○○○○○○○□○○○○□○○○
# □□○○○○○○○○○○□○○○○□○○○
# □□○○○○○○○○○○□○○○○□○○○
# □□○○○○○○○○○○□○○○○□○○○
# □□○○○○○○○○○○□○○○○□○○○
# ■□■□□□□□□□□□□■□□□□■□□
# X方向は、等間隔の必要なし
#
# 出力:テキストファイルを生成
# bmpファイルと同じディレクトリに***.bmp.txtというファイル名ができる。

 

# ビットマップフォーマット
#  00   2   bfType          "BM"    BMPファイル識別符号
#  02   4   bfsize                  ファイルサイズ
#  06   2   bfReserved1     0       予備
#  08   2   bfReserved2     0       予備
#  0A   4   bfOffbits               ファイル内のイメージデータ開始位置
#  0E   4   biSize          40      ヘッダのサイズ
#  12   4   biWidth                 イメージの幅(ピクセル)
#  16   4   biHeight                イメージの高さ(ピクセル)
#  1A   2   biPlanes                イメージのプレーン数
#  1C   2   biBitCount              ピクセルあたりのビット数、
#                                     1,4,8,16,24,32 の何れか.
#                                     (但し、16,32 は圧縮のみ)
#  1E   4   biCompression           圧縮型式
#                                     0  非圧縮、
#                                     0  以外圧縮されている(説明省略)
#  22   4   biSizeImage             イメージデータのサイズ
#  26   4   biXPixelsPerMeter       対象デバイス水平解像度
#                                     (ピクセル / メートル)
#  2A   4   biYPixelsPerMeter       〃 垂直解像度(〃)
#  2E   4   biClrUsed               使用する色数
#  32   4   biClrImportant          重要な色数.0 の時全色が重要
#  36       bmiColors         Color Table (RGBQUAD の配列)開始.
#                             各エントリーは 4 ビット、
#                               (rgb 強度 + 予備(rgbReserved=0)).
#                             非圧縮の場合、
#                               biClrUsed が 0 の場合のエントリー数は、
#                               biBitCount の値に応じて、
#                                 1   2 エントリ
#                                 4   16
#                                 8   256
#                                 24  0.
#                               biClrUsed が非 0 の場合のエントリー数は、
#                               biClrUsed の値に等しい.
#
# bfOffbitsに格納された位置から bitmap データが記述される.
#
# bitmap データは画像のピクセルごとの Color Table のインデックスまたは
#rgb 値である.
# データは画像のピクセルが、左から右へ向かう順に、1行ずつ保存される.
# それぞれの行は、4バイトの倍数になるようにゼロパディングされる.
# 行は画像の下から上へ向かう順に保存される.

 

# 切り上げ関数
sub ceil{
    ( $_[0] == int($_[0]) ? $_[0] : int($_[0] + 1) );
}

 

# ビットマップの左端のドットのY座標を探して返す
sub searchYdot {
    while ($Hcoord < $biHeight) {
# グローバルの$Hcoordの現在の座標位置から最初のドットが見つかるまでデータを読み出す
        $rpos = $bfOffbits + &ceil($biWidth/32)*4*($biHeight-$Hcoord-1);
        seek(IN, $rpos, 0);
        read(IN, $buffer, 4);
        $Hcoord++;

        $data=unpack( "N", $buffer);    #符号なしcharとしてunpack
#        printf("%x: %x\n", $rpos, $data);

        #左端は、文字の上端と下端のペアで区切り
        if (($data & 0x80000000) == 0) {    #黒ドットは、0
            return ($Hcoord-1);    # 見つかったY座標値を返す
        }
    }
    return -1; # エラー時は、-1
}


# ビットマップの各行の下端のドットのX座標を探す
sub searchXdot {
    my ($y) = @_;
    while ($Wcoord < $biWidth) {
        # $Wcoordの最初のデータを読み出す
        $rpos = $bfOffbits + &ceil($biWidth/32)*4*($biHeight-$y-1)+ int($Wcoord/32)*4;
        seek(IN, $rpos, 0);
        read(IN, $buffer, 4);

        $data=unpack( "N", $buffer);    #符号なしcharとしてunpack
#        printf("0x%x: %x\n", $rpos, $data);

        # 32ドットの中に黒ドットがあるかチェック
        $xsub = $Wcoord & 0x1f;
        $Wcoord = $Wcoord & 0xffffffe0;
        while ($xsub < 32) {
            my $mask = 0x80000000 >> $xsub;
            if (($data & $mask) == 0) {    #黒ドットは、0
                $Wcoord = $Wcoord + $xsub + 1;
                return ($Wcoord-1);
            }
            $xsub++;
        }
        $Wcoord = $Wcoord + 32; # 4バイト単位なので、32ドット分加える
    }
    return -1; # エラー
}


# 128x48ドット グラフィックLCD用のフォントをbmpデータから作成

 

$filename = shift;
$address  = 0;

 

open( IN, "$filename" ) or die "Can't open $filename\n";
$fileOut=shift;
#第2引数がない時は、元のファイル名に.txtをつける。
if ($fileOut eq '') { $fileOut=$filename.".txt"; }
open( OUT, ">$fileOut" );

 

binmode( IN );    # 入力するbmpファイル
binmode( OUT ); # 出力テキストファイル
#ファイルは、UNIX形式の改行であること、そうでないとできたファイルがおかしくなる

 

read( IN, $bfType, 2); # BMという識別子が取得されるはず、チェックしていない
printf( "bfType = %s\n", $bfType );
$address  += 2;

 

read( IN, $buffer, 4); # ファイルサイズ
$bfsize=unpack( "V", $buffer);
printf( "bfsize = %x\n", $bfsize );
$address  += 4;

 

read( IN, $buffer, 4); # 読み飛ばし
$address  += 4;

 

read( IN, $buffer, 4); # データ開始位置を示すオフセット
$bfOffbits=unpack( "V", $buffer);
printf( "bfOffbits = %x\n", $bfOffbits );
$address  += 4;

 

read( IN, $buffer, 4); # ヘッダサイズ
$biSize=unpack( "V", $buffer);
printf( "biSize = %d\n", $biSize );
$address  += 4;

 

read( IN, $buffer, 4); # イメージのXビット幅
$biWidth=unpack( "V", $buffer);
printf( "biWidth = %d\n", $biWidth);
$address  += 4;

 

read( IN, $buffer, 4); # イメージのYビット幅
$biHeight=unpack( "V", $buffer);
printf( "biHeight = %d\n", $biHeight );
$address  += 4;

 

# その他のデータはスキップ

 

$code=0x20;

 

# 全データを読み込むループ
$Hcoord = 0;
while ($Hcoord < $biHeight) {

    # 左端にある行区切り情報を探し、最初の行の範囲を取得
    $startY = &searchYdot(); # 開始Y座標
    if ($startY < 0) {
        last;    # ドットデータが見つからない時は、終了
    }
    printf("\nstartY=%d, ", $startY);

 

    $endY = &searchYdot(); # 終了Y座標
    printf("endY=%d\n", $endY);

 

    # 読み込む1行分のデータ範囲が分かったので、1文字分ずつ読み込む
    $Wcoord = 1; # 左端は、マーカーなので、読み飛ばす必要あるため
    $endX = &searchXdot($endY);

 

    while ($Wcoord < $biWidth) {
        $startX = $endX; #前のendXが、次のstartXとなる
        printf("startX=%d, ", $startX);

        $endX = &searchXdot($endY);
        printf("endX=%d\n", $endX);

# もし、startXとendXが連続している時は、3ドットの区切りかチェック
        if ($startX+1 == $endX) {
            printf(OUT "\n");
            last;
        }

 

# ここまでで得たキャラクタの矩形領域をサーチして、データを作成する
        $xx = 0;
        for ($ii = $startX; $ii < $endX; $ii++) {
            $chdata[$xx] = 0;
            $yy = 0;
            for ($jj = $startY; $jj < $endY; $jj++) {
                $rpos = $bfOffbits + &ceil($biWidth/32)*4*($biHeight-$jj-1)+ int($ii/32)*4;
                seek(IN, $rpos, 0);
                read(IN, $buffer, 4);
                $data=unpack( "N", $buffer);    #符号なしcharとしてunpack
               
                $mask = 0x80000000 >> ($ii & 0x1f);

                if (($data & $mask) ==0) { # 黒ドットなら0
                    $chdata[$xx] = $chdata[$xx] | (1 << $yy);
                }
                $yy++;
            }
            $xx++;
        }
        # できた$chdataを出力
        printf(OUT "{");
        for ($ii = 0; $ii < ($endX-$startX); $ii++) {
            printf(OUT "0x%02x, ", $chdata[$ii]);
        }
        printf(OUT "}, // '%c'\n", $code);
        $code++;

    }
}

close( IN );
close( OUT );

 

printf( "%s 生成完了\n", $fileOut );

# end of file

プログラム内容は、見てもらえばわかるはずですので、説明はしません。

特にプログラム最初の所に説明がありますので、お読み下さい。

 

続きがありますが、また、字数制限のため、ここでいったん切ります。

記事へブログ気持玉 / トラックバック / コメント


続きを見る

トップへ

月別リンク

KazHatブログ/BIGLOBEウェブリブログ
文字サイズ:       閉じる