2012/11/17からのアクセス回数 8313
RaspberryPiのSPI接続とSPIクラスが正常に動くことを確認できましたので、 MARY-OB基板(OLED Board) を接続してみることにします。
今回も、mbedのサイトから MARMEX_OB基板OLEDライブラリ (MARMEX_OB_oled) を使わせてもらいました。
mbedのライブラリからRaspberryPiの互換ライブラリに移植するには、以下の点を変更する必要があります。
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)のコネクターとピンの定義は以下の通りです。
RaspberryPiとの接続は、以下のようにします。
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
ネットで検索してみると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
とすると以下のように無事テスト画面が表示できました。
mbed互換ライブラリに上記のソースを追加したバージョンを以下にアップしました。
皆様のご意見、ご希望をお待ちしております。