2013年06月13日

Arduino Due+DueVGAライブラリでFONTX2形式日本語を画面表示するモジュールを作成

Arduino Dueボードを使用して、VGAモニターやコンポジットビデオ出力に対して出力を行うDueVGAライブラリを実験します。また、DueVGAとの組み合わせで日本語表示を自在に行うライブラリをを作成してみました。本記事はその実験をしてみた記録になります。

IMG_20130613_234551resized.jpg
Arduino Dueは、その他のArduinoとは異なり、ATMEL社のARM Cortex-M3コアのマイコンボードで、高速な処理速度と、大容量ROM/RAMを搭載しています。
このArduino Dueには、映像出力は搭載していないのですが、DueVGAというライブラリを使用することで、VGAモノクロ、VGAカラー、コンポジットビデオ出力NTSC/PALを 出力する事ができます。

https://github.com/stimmer/DueVGA/

モノクロVGAは、白黒2値出力ですが、800×600の解像度まで対応します。カラーVGAは、320×240です。
また、コンポジットビデオ出力の場合、NTSCは320×200、PALは320×240となります。
出力信号はDMACやシリアルI/Oその他ATSAM3Xの持つハード機能を巧みに組み合わせて作成されてるようです。

今回は、VGA出力のモノクロとカラーを試してみたいと思います。モノクロの場合、VGAコネクタ1個、100Ω抵抗一本、各種線材を以下の図のように接続するだけで、簡単に
モニター出力を得ることができます。
DueVGA_Connection.png
カラーVGAの場合は、以下のように接続します(README.txtより引用)
全て繋ぐのが面倒であれば、R、G、Bのそれぞれ1本だけ、一番抵抗値の小さいものを繋げば8色カラーになります。
For VGA colour:
---------------
Upload File->Examples->VGA->HelloWorldColour
Connect Due to monitor as follows:

Due pin 34 -> 820R resistor -> VGA pin 3 (blue)
Due pin 35 -> 390R resistor -> VGA pin 3 (blue)

Due pin 36 -> 2k2 resistor -> VGA pin 2 (green)
Due pin 37 -> 1k resistor -> VGA pin 2 (green)
Due pin 38 -> 470R resistor -> VGA pin 2 (green)

Due pin 39 -> 2k2 resistor -> VGA pin 1 (red)
Due pin 40 -> 1k resistor -> VGA pin 1 (red)
Due pin 41 -> 470R resistor -> VGA pin 1(red)

Due pin 42 -> VGA pin 14 (VSync)
Due pin 43 -> VGA pin 13 (HSync)

Due pin GND -> VGA pins 5,6,7,8,10

コンポジットビデオ出力の場合、以下のように接続します。実は、僕もNTSC出力を試したのですが、手持ちのモニターではNTSCの色情報をきちんと認識
しなかったのでテストはあまりしていません。

For NTSC/PAL:
-------------
Upload File->Examples->VGA->DrawingTestNTSC (or DrawingTestPAL)
Connect Due to TV as follows:

Due pin 36 -> 3k3  resistor -> Video In
Due pin 37 -> 1k6  resistor -> Video In
Due pin 38 -> 820R resistor -> Video In
Due pin 39 -> 390R resistor -> Video In
Due pin 40 -> 200R resistor -> Video In
Due pin 41 -> 100R resistor -> Video In

Due pin GND -> Video GND


このDue VGAライブラリではプリミティブな描画機能(線描画や塗りつぶし矩形、アスキーコードのキャラ描画など)を持つAPIを提供してくれていて、以下のようなスケッチを
実行するだけで簡単に画面描画出来ます。
ここに、日本語文字列表示のライブラリを追加してみることにしました!

日本語文字の表示は、僕が昔書いていた、本サイトの前身?であるProject C3というところで取り上げた、「H8とノリタケ伊勢電子(株)のドットマトリクスVFDで、ビットマップ描画と漢字を取り扱う」
という記事のコードを掘り起こしました。
http://hp.vector.co.jp/authors/VA007110/technicalworkshop/vfd_bitmap_japanese/index.html

ここでは、FONTX2形式を使用します。FONTX2形式についても、昔僕が書いていたサイトのリンクを置くことで省略します^^;
http://hp.vector.co.jp/authors/VA007110/technicalworkshop/fontxstudy/index.html
# しかしもう8年前なのか〜。。。

このライブラリを使用して文字列描画を行うライブラリが、Arduinoライブラリ「DrawFont」という、今回作成したライブラリです。
FONTX2形式は、上記のURLにも記した通り、シフトJISエンコーディングのデータ形式です。Arduino IDEのソースコードは、UTF-8です。
従ってUTF-8からShift-JISへの変換をしなければいけません。

調べると、日本語の表現範囲であれば、UTF-8をUTF-16にすることで2バイトにおさまります。このUTF16とJISとの変換表の改良版というのを、以下のURLで公開されていましたので、頂きました。
http://hp.vector.co.jp/authors/VA010341/unicode/
この変換表の約7000文字分のデータを効率よく省資源マイコンで活用するには、圧縮したり、ハッシュテーブル化するなど、工夫はいろいろ出来そうですが、今回は、Arduino DueがROM 512KBもあり、16×16のフォント(210Kバイト程度)を入れてもまだまだ空きは一杯あるので、完全にベタの変換配列を用意しました!
(と、かっこ良く言ってみましたが、工夫を何もしてないだけです。。。笑)
変換表から、配列への出力は、以下に貼りつけたRubyスクリプト「convert_utftable.rb」で行なってます(後述のgithubリポジトリ内にも入れてあります)。


convert_utftable.rb
# table converter
# coded by Yasuhiro ISHII,6/13/2013

file = "JIS_X_0208.txt"

table = Hash::new

f = File::open(file,"r")
while (l = f.gets)
  if l =~ /^0x([0-9A-F]{4}).0x([0-9A-F]{4})\r\n$/ then
    code_jis = $1.hex
    code_utf16 = $2.hex
    table[code_utf16] = code_jis
  end
end

f.close

(0..65535).each { |utf16|
  if table.has_key?(utf16) == true then
    printf("\t0x%04X,\t\t// 0x%04X\n",table[utf16],utf16)
  else
    printf("\t0x0000,\t\t// 0x%04X (dummy)\n",utf16)
  end
}

と、いうわけで、以下のようなスケッチで直接日本語表示をVGAモニターに行えるようになりました。
ライブラリは以下のgithubで公開しています。Arduino 1.5.2+Due VGAライブラリの組み合わせで動作確認済みです。

Arduinoライブラリ DrawLibのソースコード全体は、以下に置いています。
https://github.com/yishii/Arduino_FONTX2Lib_DrawFont

ライブラリ内に、8*16のASCIIフォントと、16*16の漢字フォントを盛り込んでいます。
ASCIIフォントは、以下のサイトにある、IPAフォントをベースとしたものを利用させて頂きました。
また、漢字については、16x16の東雲フォントを盛り込んでいます。

以下、Arduinoスケッチ例です。Arduinoライブラリディレクトリに、Due VGAライブラリと、先ほど説明したDrawFontライブラリを入れておけば、ビルド出来ます。

ちなみに、Arduino Dueは2つのUSBポートを搭載しています。(Programming PortとNative USB Port)
本スケッチのサイズは大きいので、Native USB Portを使用したほうが遥かに高速に書き換えできます!

#include <stdio.h>
#include <VGA.h>
#include <DrawFont.h>

#define LINE_CONV(x) (x*16)
void setup() {
  VGA.begin(800,600);
  Serial.begin(9600);
  drawFontInit();

  drawFontString_UTF8((unsigned char*)"Arduino VGAライブラリと、自作日本語フォントライブラリのテスト",0,LINE_CONV(2),1,0,false);
  drawFontString_UTF8((unsigned char*)"=============================================================",0,LINE_CONV(3),1,0,false);

  drawFontString_UTF8((unsigned char*)"本日は晴天なり!!!  E-mail : ishii.yasuhiro@gmail.com",0,LINE_CONV(6),1,0,false);
  drawFontString_UTF8((unsigned char*)"日本語の漢字データは、FONTX2形式でROM内に保持しています。",0,LINE_CONV(7),1,0,false);
  drawFontString_UTF8((unsigned char*)"Arduino IDEのUTF-8を変換して表示しています。",0,LINE_CONV(8),1,0,false);
}

void loop() {
  char string[64];
  static int i;
  
  sprintf(string,"カウント値 = %04d    ",i++);
  drawFontString_UTF8((unsigned char*)string,0,LINE_CONV(15),1,0,true);
  
}
ではではー!
Arduino Due
Arduino Due
posted with amazlet at 13.06.13
GHEO SA
売り上げランキング: 21,078
ユニコード戦記 ─文字符号の国際標準化バトル
小林龍生
東京電機大学出版局
売り上げランキング: 214,956
posted by いしいっち at 23:58| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2013年06月09日

RaspberryPiを使って太陽電池の充電状態をXivelyにアップロードする機器を作る

先日、.NET Micro Frameworkの勉強会の準備会というのが梅田でありまして、参加させて頂きました。

その時、参加されていた林田さんと吉田さんから、Xivelyというネットサービスを教えてもらいました。
Xivelyというのは、過去CosmやPathubeと呼ばれていたネットサービスで、センサーなどからのデータをアップする事が出来るものです。林田さんの資料の言葉を借りますと、「Xively はセンサデータを公開し合うユーチューブを意識したサービスとしてスタートした経緯がある。そのデータ投稿管理が良く出来てるので、簡易なM2Mクラウドとして利用する。」との事です。

Xivelyへのアップロードは、Xively側で各種環境向けにライブラリを公開してくれていて、それを利用することで手軽に実施出来ます。
2013年6月9日時点では、Android、Arduino、mBed、C、ElecricImp、Java、JavaScript、Objective-C、Python、Rubyに対応したライブラリが公開されているようです。

xivelyLib.png
今回は、ベランダに設置した以下のような太陽電池を使って、バッテリーを充電し、それをモニタリングしてみたいと思います。
solar.jpg
そこで、Raspberry Piで簡単な製作を行なってみました。本記事はその取り組みの紹介になります。
今回、僕はRaspberryPiで太陽電池から鉛シール蓄電池へ充電を行い、そのバッテリー電圧をモニターしてXivelyにアップロードしてみることにします。

測定に使用するモジュールはストロベリーリナックスで販売されている、「INA226 I2Cディジタル電流・電圧・電力計モジュール」を使用します。これは、I2C接続で電圧と電流をモニターできるものです。
ina226.jpg

このモジュールは以前本ブログの「Raspberry PiのI2Cを利用して簡易電流・電圧計を作る」で取り上げたものです。
http://projectc3.seesaa.net/article/350916175.html

システム構成はこんな感じです。
xively_solar_blockdiagram.png

Raspberry Pi側のソフトはCで作成しました。XivelyのライブラリはC用のものをそのまま使用しています。
Cのライブラリの実装は、普通のPOSIX環境で実行できるもののようで、実際にMacOSX上と、Raspberry Pi上で試しましたところ、そのままアッサリ問題なく動いてくれました。
制御はシンプルに、2秒ごとにバッテリー電圧と充電電流をI2C経由で取得し、Xively側にアップロードします。
ソースコードはこちらです。
https://github.com/yishii/rpi_solar_charger_with_xively

上記リポジトリ内に、Xivelyのアップロードに使用するライブラリ(libxively.a)のソースも含んでいます。src直下でmakeすると、libxively.aとメインプログラムのビルドをまとめて行います。

(なお、conf_xively.hにXivelyで使用するキー(API KEYやFEED ID等)に関する情報を設定するようにしています)

こんな感じで確認できます。(電流の系は接続してないので0のままです^^;) xively_SS.png
実際のXivelyのURL : https://xively.com/feeds/2077712670

IMG_20130609_181657resized.jpg
と、いうわけで、Raspberry Piを使用することで、とてもお手軽に測定データをアップして共有する事ができます。今回は有線LAN接続していますが、USB-3Gドングルを接続するなどすると、外に設置した(ex.ビニールハウスに設置して、温度をアップするとか)機器のデータのアップロードも非常に簡単に行えますし、結構楽しそうですね。

Raspberry Pi Type B 512MB
Raspberry Pi Type B 512MB
posted with amazlet at 13.06.09
RS Components Ltd
売り上げランキング: 457

Raspberry Piユーザーガイド
Eben Upton Gareth Halfacree
インプレスジャパン
売り上げランキング: 2,358

50W 単結晶ソーラーパネル 太陽光パネル
POWERTEC
売り上げランキング: 3,194

図解入門よくわかる最新太陽電池の基本と仕組み (How‐nual Visual Guide Book)
東京理科大学総合研究機構太陽光発電研究部門
秀和システム
売り上げランキング: 193,610
posted by いしいっち at 19:18| Comment(0) | TrackBack(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする