- 追加された行はこの色です。
- 削除された行はこの色です。
[[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