FrontPage

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

MARMEX_OBの液晶モジュール

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

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

Raspberry Piへの移植

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

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

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

oled_connector.png

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

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に以下の修正をしました。

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互換ライブラリに上記のソースを追加したバージョンを以下にアップしました。

コメント

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

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


(Input image string)

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