[[FrontPage]]

#contents

2012/11/17からのアクセス回数 &counter;

** MARMEX_OBの液晶モジュール [#c85b666c]
Raspberry PiのSPI接続とSPIクラスが正常に動くことを確認できましたので、最終目標の液晶モジュールと接続します。今回使用するのは、
[[MARY-OB基板(OLED Board)>http://www.marutsu.co.jp/images/mm12/081202/0000000200110331_2.jpg]]
です。

今回も、mbedのサイトから
[[MARMEX_OB基板OLEDライブラリ (MARMEX_OB_oled)>http://mbed.org/users/nxpfan/notebook/MARMEX_OB_oled_lib/]]
を使わせてもらいました。

*** Raspberry Piへの移植 [#qb0e7222]
mbedのライブラリからRaspberry Piの互換ライブラリに移植するには、以下の点を変更する必要があります。
- クラスヘッダの修正
 BaseやStreamといった親クラスは互換ライブラリには存在しないので、これをコメントします。
#pre{{
class NokiaLCD : public Stream {
}}
を以下のように修正します
#pre{{
class NokiaLCD /*: public Stream*/ {
}}
 また、virtualメソッドからvirtualをコメントします。
#pre{{
/*virtual*/ void _window(int x, int y, int width, int height);
}}

*** MARY-OB基板(OLED Board)との接続 [#i510cf42]
MARY-OB基板(OLED Board)のコネクターとピンの定義は以下の通りです。

&ref(oled_connector.png);

RaspberryPiとの接続は、以下のようにします。
- GNDをCN1の1番に接続
- 5VをCN1の2番に接続
- 3.3VをCN1の3番に接続
- p5(MOSI)をCN4の4番(OLED_SDIN)に接続
- p7(SCKL)をCN4の2番(OLED_SCLK)に接続
- p10(MOSI)をCN4の4番(OLED_SDIN)に接続
- p12(SCKL)をCN4の2番(OLED_SCLK)に接続
- p18をCN3の2番(OLED_CSN)に接続
- p19をCN3の1番(OLED_RESN)に接続
- p21をCN2の1番(OLED_VCC_ON)に接続

Raspberry Piのピン情報は、以下の通りです。

&ref(My-Pin-Layout.jpeg);

** テストプログラム(OledTest.cpp) [#mdba84c8]
MARMEX_OB_oled.hに従ってテストメイン(OledTest.cpp)を以下のように作成しました。
#pre{{
#include "mbed.h"
#include "MARMEX_OB_oled.h"
#include <math.h>


#define SIZEX (160)
#define SIZEY (120)

int main() {
	MARMEX_OB_oled   oled1( p10, p12,  p18, p19, p21 ); // mosi, sclk, cs, rst, power_control
    oled1.background( 0x000000 );
    oled1.cls();
    
    int colorbar_width  = MARMEX_OB_oled::WIDTH / 8;
    for ( int i = 0; i < 8; i++ )
        oled1.fill( colorbar_width * i, 0, colorbar_width, MARMEX_OB_oled::HEIGHT, 
((i & 0x4) ? 0xFF0000 : 0x000000) | ((i & 0x2) ? 0x00FF00 : 0x000000) | ((i & 0x1) ? 0x0000FF : 0x000000) );
    
    oled1.fill(  50,  50,  64,  64, 0xCCCCCC );;
    
    oled1.locate( 0, 3 );
    oled1.printf( "Hello World!" );
    oled1.locate( 0, 4 );
    oled1.printf( "SPI = %s", MERMEX_OB_SPI_MODE_STR );
    
    for (int i = 0; i < MARMEX_OB_oled::WIDTH; i++ ) {
        oled1.pixel( i, 80 + sin( (float)i / 5.0 ) * 10, 0x000000 );
    }
    
}
}}

** 動作確認 [#l2ea4b7c]
液晶モジュールと接続を確認して、いざテストと以下のコマンドを入力したのですが、全く反応がありません。
#pre{{
$ sudo ./OledTest
}}

*** RaspberryPiのSPIドライバーは9bitモードでは動かないらしい [#a518ee95]
ネットで検索してみるとSPIドライバーの9bitモードでのトラブルがいくつか見つかりました。

ほとんど諦めかけていたら、MARMEX_OB_oled.hにMARMEX_OB_SPI_8BIT_MODEという単語を見つけました。
調べてみると9bitのデータを8bit, 8bitの2回に分けて送ることで対処しているみたいです。

MARMEX_OB_oled.hに以下の修正をしました。
- 8bitモードのdefine文の定義
- printfの追加
- _putcの再定義(NokiaLCDの_putcは8bit対応していないので)
- フォントデータをMARMEX_OB_oled.cppに追加しました。

MARMEX_OB_oled.hへの変更を以下に示します。
#pre{{
// インクルードファイルと関数型定義の追加
#include    <cstdarg>
#ifdef __cplusplus
extern "C" {
#endif
extern int vasprintf(char **strp, const char *fmt, va_list ap);
extern void free(void *ptr);
#ifdef __cplusplus
}
#endif
// 8bit対応
//#define MARMEX_OB_SPI_8BIT_MODE
#define MARMEX_OB_SPI_8BIT_MODE
// 追加関数
    int printf(const char* format, ...) {
	va_list ap;
	va_start(ap, format);
	char* allocatedBuffer;
	int size = vasprintf(&allocatedBuffer, format, ap);
	va_end(ap);
	char*   p = allocatedBuffer;
	while(*p) {
	    _putc(*p++);
	}
	free(allocatedBuffer);
    }

int _putc(int value) {
    int x = _column * 8;  // FIXME: Char sizes
    int y = _row * 8;
    bitblit(x + 1, y + 1, 8, 8, (char*)&(MARMEX_OB_oled::FONT8x8[value - 0x1F][0]));

    _column++;

    if (_column >= COLS) {
        _row++;
        _column = 0;
    }

    if (_row >= ROWS) {
        _row = 0;
    }

    return value;
}

enum {
	fontlength = 97,
	fontsize   = 8
};
static const unsigned char FONT8x8[fontlength][fontsize];
}}

MARMEX_OB_oled.cppには、FONT8x8の定義を追加しました。
#pre{{
#include "MARMEX_OB_oled.h"

const unsigned char MARMEX_OB_oled::FONT8x8[fontlength][fontsize] = {
    {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20
 途中省略
    {0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // }
    {0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~
    {0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00}
}; // DEL
}}

*** 再実行 [#l6c4a782]
以下のコマンドを実行して再テストしてみました。
#pre{{
$ sudo ./OledTest
}}

とすると以下のように無事液晶モジュールにテスト画面が表示できました。

&ref(MARMEX_oled.png);

** 最新のソース [#b67e3b40]
mbed互換ライブラリに上記のソースを追加したバージョンを以下にアップしました。
- &ref(Raspberry-Pi.tgz);

** コメント [#tef58c96]
#vote(おもしろかった[3],そうでもない[0],わかりずらい[0])
#vote(おもしろかった[16],そうでもない[0],わかりずらい[0])

皆様のご意見、ご希望をお待ちしております。
- 説明でMOSIとSCKLのピン番号が間違っていました。訂正してお詫びします。 -- [[竹本 浩]] &new{2012-12-16 (日) 14:09:50};

#comment_kcaptcha


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc