FrontPage

2012/11/17からのアクセス回数 8004

MARMEX_OBの液晶モジュール

Raspberry PiのSPI接続とSPIクラスが正常に動くことを確認できましたので、最終目標の液晶モジュールと接続します。今回使用するのは、 MARY-OB基板(OLED Board) です。

今回も、mbedのサイトから MARMEX_OB基板OLEDライブラリ (MARMEX_OB_oled) を使わせてもらいました。

Raspberry Piへの移植

mbedのライブラリからRaspberry Piの互換ライブラリに移植するには、以下の点を変更する必要があります。

  • クラスヘッダの修正  BaseやStreamといった親クラスは互換ライブラリには存在しないので、これをコメントします。
    class NokiaLCD : public Stream {
    
    を以下のように修正します
    class NokiaLCD /*: public Stream*/ {
    
     また、virtualメソッドからvirtualをコメントします。
    /*virtual*/ void _window(int x, int y, int width, int height);
    

MARY-OB基板(OLED Board)との接続

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

oled_connector.png

RaspberryPiとの接続は、以下のようにします。

  • GNDをCN1の1番に接続
  • 5VをCN1の2番に接続
  • 3.3VをCN1の3番に接続
  • 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のピン情報は、以下の通りです。

My-Pin-Layout.jpeg

テストプログラム(OledTest.cpp)

MARMEX_OB_oled.hに従ってテストメイン(OledTest.cpp)を以下のように作成しました。

#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 );
    }
    
}

動作確認

液晶モジュールと接続を確認して、いざテストと以下のコマンドを入力したのですが、全く反応がありません。

$ sudo ./OledTest

RaspberryPiのSPIドライバーは9bitモードでは動かないらしい

ネットで検索してみると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への変更を以下に示します。

// インクルードファイルと関数型定義の追加
#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の定義を追加しました。

#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

再実行

以下のコマンドを実行して再テストしてみました。

$ sudo ./OledTest

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

MARMEX_oled.png

最新のソース

mbed互換ライブラリに上記のソースを追加したバージョンを以下にアップしました。

コメント

選択肢 投票
おもしろかった 16  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。

  • 説明でMOSIとSCKLのピン番号が間違っていました。訂正してお詫びします。 -- 竹本 浩? 2012-12-16 (日) 14:09:50

(Input image string)


添付ファイル: fileMy-Pin-Layout.jpeg 1591件 [詳細] fileRaspberry-Pi.tgz 1216件 [詳細] fileMARMEX_oled.png 1635件 [詳細] fileoled_connector.png 1524件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-19 (水) 01:31:02 (2466d)
SmartDoc