2011/12/12(月)mbed向けにAD-128160-UARTのライブラリ作った

2011/12/12 18:14 mbedimportnucho
aitendoには高速1.77インチ液晶モジュールというとても便利そうなLCDモジュールが売っています。

このLCDの特徴としては
  • 3.3V単電源で駆動できる
  • 少ない信号線で制御できる(txとresetの二線のみ)
  • 点、直線、四角形、円などの図形を高速に描画できる
  • ASCIIフォントが組み込まれている。(設定を行うことで日本語も書き込めるみたいです)
  • miniUSB端子が付いており、PCからもコマンドを送ることで制御できる
などなど嬉しいことずくめです。これは一家にひとつ常備しておかなくてはなりませんね。知りませんけど。

というようにスペック上は魅力あふるるLCDなのですが、発売後数ヶ月経ってもaitendoが碌にデータシートを公開していないため、これまでは真っ暗な液晶を眺めながら可能性を想像する程度の置物レベルの価値しかありませんでした。
現在はGingaXさんが使い方をまとめてくださって、基本的な使い方はわかるようになったので今回はmbed用にライブラリをつくってみたという次第です。

使ってみる

写真

RIMG0592_org

回路図

AD_128160_UART_circuit

プログラム

#include "mbed.h"
#include "AD128160.h"

AD128160 lcd(p9,p20);//tx reset

//2バイトRGBをつくるための関数
int rgb565(int r, int g,int b)
{
    int rgb;
    
    rgb = (r & 0xF8) << 8;        /* RRRRR----------- */
    rgb |= (g & 0xFC) << 3;       /* -----GGGGGG----- */
    rgb |= b >> 3;                /* -----------BBBBB */
    
    return rgb;
}

int main() {
    lcd.backgroudColor(rgb565(255,0,0));//文字の背景色を赤に設定
    lcd.locate(2,lcd.rows()/2);         //大体真ん中あたりに移動して
    lcd.printf("Hello World!\n");       //お馴染みの文を表示
    
    lcd.color(rgb565(0,255,0)); //図形の色を緑に設定
    lcd.box(12,76,116,100,0);   //塗りつぶしなしで矩形表示
    lcd.box(8,120,124,146,1);   //塗りつぶしありで矩形表示
    
    lcd.color(rgb565(255,0,0)); //図形の色を赤に設定
    lcd.circle(16,40,16,0);     //塗りつぶしなしで円表示
    lcd.circle(48,40,16,1);     //塗りつぶしありで円表示
    lcd.circle(80,40,16,1);     //塗りつぶしありで円表示
    lcd.circle(112,40,16,0);    //塗りつぶしなしで円表示
}
細かいライブラリの使い方なんかはクラスリファレンスを読んでください。
ライブラリをつくるときにStreamクラスを継承して_putc()メンバー関数をLCDにあわせて作成することでprintfにもあっさり対応できてます。

画像も表示させてみる

RIMG0595_org
どのくらいの発色なんかなーと16bit bitmapデータを作って表示させてみました。
まーまー綺麗に表示できますね。

こちらのプログラムも一応ここに置いておきます。
試すときの128x128の16bit bitmapは各自準備してください。。

2010/10/20(水)NokiaLCDライブラリに日本語フォントを組み込んだぞ

2010/10/20 11:53 mbedimportnucho
以前NokiaLCDにNOKIA3300用の設定を追加したものを書きましたが、
今回はさらに美咲フォントを組み込んで日本語表示ができるようにしました。

これにあたって
AD-12864-SPIのコントローラ
mbedからOLEDに日本語表示しましたよ
のお二方のプログラムをパクり…、もとい参考にさせて頂きました。どうもありがとうございます!

ついでに"\n"で改行されるようにもしたので、元からの変更点は
  • NOKIA3300用の設定の追加
  • 日本語フォントの追加
  • "\n"による改行の追加
となります。

動いたところ

101021-130328.jpg

昇圧回路をどこかにやってしまったので、またバックライトが点いてません…。
恰好悪いし見づらいのでそのうち写真差し替えます。
差し替えました。ぴかーん。

プログラム

上の写真はライブラリをインポートしてmain文を以下のようにしたものです。
#include "mbed.h"
#include "NokiaLCD.h"

NokiaLCD lcd(p5, p7, p8,p9,NokiaLCD::LCD3300); // mosi, sclk, cs, rst


int main() {
    lcd.background(0x0000FF);
    lcd.cls();
    lcd.fill(2, 51, 128, 10, 0x00FF00);
    lcd.fill(50, 1, 10, 128, 0xFF0000);
    lcd.locate(0,4);

    lcd.printf("   胎児よ\n\n");
    lcd.printf("   胎児よ\n\n");
    lcd.printf("   何故躍る\n\n");
    lcd.printf("   母親の心がわかって\n\n");
    lcd.printf("   おそろしいのか\n\n");

    for (int i=0; i<130; i++) {
        lcd.pixel(i, 80 + sin((float)i / 5.0)*10, 0x000000);
    }
}

NokiaLCDは元々Streamクラスという抽象クラスを継承しているので、純粋仮想関数となっている_putc()を書き換えるだけで簡単にprintfに対応させることが出来ました。

また、mbed Compilerは日本語の入力に対応していませんが、コピペで貼り付ければ一応表示できます
ただ"Invalid multibyte character sequence"というwarningが出てくるのと、一度閉じると文字化けしてしまうことに注意してください。

余談になりますが、フォントを移植しようとした際にコメント文に文字化けが入っていたのが原因でテーブルデータがずれて読み込まれるということがありました。
コピペで入力できるものの予期しない動作をする可能性があるので、本当はLynx-EyEDさんのようにフラッシュから読み込むという風にした方がいいかと思います。

それでは、作ったライブラリはここに置いておきます。
NokiaLCD_With_JapaneseFont

10/20追記

あら、「表示」と表示させようとしたら化けてしまいました。
液晶の表示向きの関係で90度回転させたやつが使えなかったので、適当に90度元に戻した奴を準備してたんですが、そのせいで一部のフォントが崩れたのかな…。
元気があるときに調べてみます。

2010/08/17(火)mbedでロータリーエンコーダを読んでみた

2010/08/18 05:53 mbednucho
mbedのCookbookを覗いていたら、QEIライブラリというものを見かけました。
このライブラリはロータリーエンコーダのパルス数を数えるためのものなようです。
ロータリーエンコーダは使う予定があるので、試しに使ってみました。

ロータリーエンコーダとは

 ロータリーエンコーダとは回転量を測定するために使われるセンサです。安価で扱いが簡単なインクリメンタル式と高価なアブソリュート式の二種類があり、今回扱うものはインクリメンタル式の方です。*1
 インクリメンタル式のロータリーエンコーダは軸が一定量回転するごとに位相がずれたA相とB相のパルスを出力します。A相とB相は回転方向によって出力タイミングが逆の関係になるため、どちらの方向へどれだけ回っているのかということを計測することができるわけですね。
 また、A相、B相の立ち上がり立下りから1周期分のパルス出力で4個の分解能を取ることができるため、エンコーダ分解能は出力パルスの4倍ということになります。
つまり、360度回転する間に24パルス出力するロータリーエンコーダであれば
360[deg] / (24[pulse]*4) = 3.75[deg]
の分解能があると計算できます。

rotaryencorder_pulse.png


*1 : 延々周り続ける電子レンジのつまみとかは確かこれです

QEIライブラリを使ってみる

QEIはQuadrature Encoder Interfaceの略でインクリメンタル式のロータリーエンコーダを読むためのライブラリです。
今回はとりあえず手元にあった秋月で200円で売っているエンコーダの出力パルス数を計測し、キャラクタLCDに表示するものを作ってみました。
100818-051809.jpg

回路図

RotaryEncorder_test.PNG

プログラム

QEI_test
#include "QEI.h"
#include "TextLCD.h"


TextLCD lcd(p5, p6, p11, p12, p13, p14); // rs, e, d0-d3
Serial pc(USBTX, USBRX);

#define ROTATE_PER_REVOLUTIONS  24
//Use X4 encoding.
QEI wheel(p30, p29, NC, ROTATE_PER_REVOLUTIONS, QEI::X4_ENCODING);
//Use X2 encoding by default.
//QEI wheel (p30, p29, NC, 624);

int main() {
    while(1){
        wait(0.1);
        lcd.printf("Pulses: %07d\n", wheel.getPulses());
        lcd.printf("Rotate: %04.3f\n", (double)wheel.getPulses()/(ROTATE_PER_REVOLUTIONS*4));
    }
}


それでは要点の説明です。
#define ROTATE_PER_REVOLUTIONS  24
//Use X4 encoding.
QEI wheel(p30, p29, NC, ROTATE_PER_REVOLUTIONS, QEI::X4_ENCODING);
QEIのインスタンスを生成しています。
第一、第二引数にA相のピン、B相のピンを設定します。
第三引数はオプションで回転数を数えるピンがあればそれを設定するようです。
第四引数はロータリーエンコーダが一回転あたり何パルス出力するかを設定しています。*2
第五引数はモードを設定しています。X4_ENCODINGモードであればロータリーエンコーダの分解能を完全に使って1パルス出力で4カウント増加します。X2_ENCODINGモードであれば、ロータリーエンコーダの分解能を半分にして1パルス出力で2カウント増加します。おそらくX2_ENCODINGモードにすると周波数が高い時に取りこぼしが少なくなると考えられるので、分解能があまり必要でなく精度が必要な場合はこちらを使うという風に使い分けるのだと思います。


        lcd.printf("Pulses: %07d\n", wheel.getPulses());
        lcd.printf("Rotate: %04.3f\n", (double)wheel.getPulses()/(ROTATE_PER_REVOLUTIONS*4));
キャラクタLCDに出力しています。
1行目ではwheel.getPulses()メソッドによって初期状態から現在のどちら方向にどのくらい回ったかというのを取得しています。
2行目では軸が何回転したかというのを計算して表示しています。

*2 : でも内部では使用されてなくて、何のために設定しているかちょっとよくわかりません…^^;。

終わりに

機械接点式のロータリーエンコーダであるため、チャタリングというノイズがのり速く回したりするとどんどん実際の回転数とズレが出てきてしまいますね。X2_ENCODINGモードだとちょっとましになるのかな…?

準備が出来たら次はこのモータで計測を行ってみたいと思ってます。

参考

ロータリーエンコーダを使う

2010/07/09(金)NokiaLCDライブラリでNOKIA3300-LCDが動いた

2010/07/10 01:33 mbednucho
NOKIA3300-LCDとはaitendoさんで販売されている128*128pixels、4096色のカラー液晶です。
mbedのNokiaLCDライブラリで使われている液晶と、コントロ-ラICが一緒だったので使えないかと思って試してみたところ、コマンドをほんの少しだけ設定し直すことで使うことが出来るようになりました。

NOKIA3300-LCDは単品だと500円ですし、キャリーボード付きでも1500円程度なので、簡単に動かせるとなると結構嬉しいですね。

動かしたところ

Nokia3300.jpg

回路図はCookbookに載っているまんまです。
昇圧回路がないので、バックライトが点けられていません…。

プログラム

NokiaLCDをそのまま使用すると、表示位置と色が反転してしまいます。そこで、
Nokia6100 液晶って130x130なんですけど – Sim's blog
こちらの記事を参考にDATCTLコマンドのパラメータを適切にすることで解決できました。

具体的にはNokia6600用の設定の
            command(0xBC);
            data(0);
            data(1);
            data(4);
の部分をNokia3300用に
            command(0xBC);
            data(1);
            data(0);
            data(4);
とだけ書き換えることで正常に表示されるようになりました。
データシートではP37を見ると少し詳細が書いてあります。

NokiaLCDライブラリにNOKIA3300-LCD用の設定を追加したプログラムを以下にあげておきます。
NokiaLCD_AddNOKIA3300

2010/07/04(日)mbedでZY-FGD1442701V1を動かしてみた その2

2010/07/04 22:52 mbednucho
前回の続きでZY-FGD1442701V1に画像を表示してみました。

SDカードまたはmbedのフラッシュメモリから16bitビットマップ画像を読み取るということをしています。
16bitビットマップ画像(R5 G5 B5)はこちらを参考にGimp2を使って準備しました。

動かしてみたところ

100703-213115.jpg
  
100703-205336.jpg

色数が65536色だけあって、表示は思っていたよりもずっと綺麗です。

回路図

ZY_FGD1442701V1_sample2.PNG

相変わらずカオスな回路図ですみません…。
SDカード、液晶共にVccはmbedのVoutと接続しています。
mbed内のフラッシュメモリを使う場合はSDカード部分は必要ありません。

プログラム

SDカードから読み込みをする場合
ZY_FGD1442701V1_sample2

mbedのフラッシュメモリから読み込みをする場合
ZY_FGD1442701V1_sample2_local
今回のプログラムはここに置いておきます。
SDカードまたはmbedのフラッシュメモリ内に作成したビットマップ画像をsample.bmpという名前で置いておけば液晶に表示されるはずです。

処理について

単純に、ビットマップ画像を2ビットずつ読み込んで、液晶に2ビット送信して…という処理をしています。

初期化はデモプログラムの時とほとんど同じですが、そのままだと画像が反転して表示されたので
    WriteCOM(0x36);//MV,MX,MY,RGB
    WriteDAT(0xC8);
の部分を
    WriteCOM(0x36);//MV,MX,MY,RGB
    WriteDAT(0x88);
とだけ変えました。
このへんの詳細はデータシートのP60あたりに載っています。

また、16bitビットマップの取り扱いについてはbeizのノート@ ウィキさんを参考にさせて頂きました。
参考というかそのまま(^^;

処理時間

初期化に860ms表示に763msかかっていますが、beizのノート@ ウィキさんに載っているように液晶への書き込みをバッファリングしたら、さらに高速化できるものと思われます。