[[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番に接続 - 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(おもしろかった[15],そうでもない[0],わかりずらい[0]) #vote(おもしろかった[16],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 - 説明でMOSIとSCKLのピン番号が間違っていました。訂正してお詫びします。 -- [[竹本 浩]] &new{2012-12-16 (日) 14:09:50}; #comment_kcaptcha