ボクにもわかるIchigoJam用マイコンボード

[IchigoJam メニューへ戻る]

I2C有機ELディスプレイOLEDの接続方法

IchigoJam S, TのCN5へ接続するだけ 超簡単!で、美しい!


I2C 有機ELディスプレイ OLED を IchigoJam S, T マイコンボードのCN5へ接続したときの様子
※専用のハード改造が不要という意味です
(動作するIchigoJamやCN5の取り付け等が必要です)

メイン・メニュー

 IchigoJam用OLEDのウェブページへようこそ。下表は本ページの主なコンテンツです。ピンクのマーカーは、ボクのお奨めソフトウェアです。

リンク言語容量
Bytes
速度
Hz
表示
方向
PCG備考
A1 BASIC ロゴ表示 BASIC のみ2760.4IchigoJamロゴ
A2 BASIC 練習用BASIC のみ2760.4BASIC 練習用
A0 BASICダイエット版BASIC のみ1920.6BASIC 小容量
もっとダイエット版BASIC のみ1500.6BASIC 最小容量
B1 高速表示BASIC+BIN2906.7縦画面ゲーム用
B2 高速表示 PCG BASIC+BIN3086.7縦・ゲーム・PCG
C1 高速・横表示BASIC+BIN3788.6横画面ゲーム用
C2 高速・横表示 PCGBASIC+BIN4028.6横・ゲーム・PCG
G1 グラフィック表示BASIC のみ5880.01要MixJuice・130秒
ドライバ部で使用するメモリ容量は BASIC版のA1が最も小さい。マシン語の処理が増えるほど多くのメモリを使用する。一方、表示速度はマシン語のほうが高速。通常の表示には BASIC版のA1を、ゲーム用にはB1またはC1を使用すると良い。

※上表の言語の列にある「+BIN」(マシン語)は、ARM用です。RISC-Vを搭載したIchigoJam R では「BASICのみ」のタイプを使用してください。

挿すだけの超・簡単接続

 アマゾンや AliExpress などで販売されている SSD1306 搭載の超小型 I2C 接続 OLED モジュール(128x64ドット)を、IchigoJam S, TのCN5へ接続し、BASICプログラムだけで文字を表示する実験を行ってみました。
 ハードウェアは、IchigoJam T または IchigoJam S の基板上の5ピンのCN5端子の手前側(+5V以外の端子)にOLEDモジュールを接続するだけです。I2Cインタフェースに関するより詳しい情報は「ボクにもわかる I2C(IIC) インタフェース方式」をご覧ください。


I2C 有機ELディスプレイ OLED のGND、VDD、SCL、SDAの端子を、IchigoJamのGND、3.3V、SCL、SDA端子へ接続する

 IchigoJam S, TのCN5に対応するOLEDモジュールの仕様を以下に示します。ハードウェアは、これだけで完成です。

秋月電子通商での取り扱いが始まりました。

2017/11 白色
https://akizukidenshi.com/catalog/g/gP-12031/

2020/11 青色
https://akizukidenshi.com/catalog/g/gP-15870/

OLEDモジュールの仕様と販売品の一例
制御ICの型番 SSD1306
解像度 128 × 64 ドット
ピン配列 GND、VDD、SCL、SDA
I2Cアドレス 0x78または0x3C
発光色 単一色のタイプ
その他の注意 写真と同じ商品が送ら
れてくるとは限らない
ので注意する。
右の商品は問題なし。
(2017/7現在)
【Column】SPI接続用OLEDも接続可能
 上記のI2C接続のタイプ以外にも、SPI接続用として販売されているSSD1306搭載OLEDモジュールがあります。改造を行うことでIchigoJamへ接続することが出来ますが、ハンダ付け作業が必要です。詳しくはブログ記事「SPIのOLEDを接続してみた」を参照ください。

 初代IchigoJamや第2世代のIchigoJam U、CQ出版社のIchigoJam用コンピュータ電子工作学習キットIF ICH-KITへ接続する場合は、IchigoJamのファームウェアをVer 1.2.1以上にアップデートし、OLEDのSDA(IC2の5番ピン)をIN3端子へ、SCL(IC2の27番ピン)をSCL端子へ接続してください。


まずは美しい表示を楽しもう

 それでは美しい有機ELディスプレイOLEDへIchigoJamの美しいフォントを表示してみましょう。当ページでは複数の表示用ドライバソフトを配布しています。一番、最初に試していただきたいのは、BASICだけで書かれたプログラムです。早速、入力して実行してみましょう

プログラムA1 縦画面 BASIC版 [PCG] ロゴ表示(ドライバ部 276 Bytes)
' I2C OLED Example A1 IchigoJam LOGO
' by 2017 Wataru KUNINO and Ruria Amanagi @ IchigoJam-FAN (Facebook)

' I2C OLED BASIC Driver for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Wataru KUNINO @ IchigoJam-FAN (Facebook)

' IchigoJam オヨビ IchigoJam ロゴ ハ jig.jp (ichigojam.net jig.jp) ノ
' トウロク ショウヒョウ デス. CC BY ライセンス ニ シタガッテ シヨウ シテマス.

new
1 cls:?"OLED LIB":?:?" for":?:gsb700:forI=0to15:?chr$(#E0+I);:ifi=7?
2 next:?:?:forI=0to7:?" ";chr$(255);" by ";chr$(255)
3 ?:?" Wataru":?" Kunino":?:?" ";chr$(255);" && ";chr$(255):?:?" Ruria":?" Amanagi
9 gsb800:end

700 'LOGO
710 A=#FFFF:B=#3333:C=#3030
720 let[0],#C0C0,#C0C0,#CFC0,#CCCF,C,C,#3F30,#333F,C,0,#3300,B,0,0,#F300,#33F3
730 let[16],0,0,#F000,#30F0,#6060,#6060,#6760,#6667,0,0,#E700,#63E7,0,0,#FF00,#33FF
740 let[32],#CFCC,#00CF,0,A,B,#0033,0,A,B,#0033,0,#F3F3,#F333,#30F3,C,#F3F3
750 let[48],#F330,#00F3,0,A,#E766,#00E7,0,A,#F363,#00F3,0,A,B,#0033,0,A
760 copy#700,#800,128:rtn

800 'INIT
810 let[85],#4000,33,#227F,#700,#D5AE,#8D80,#2014,#DA00,#8112,#D9CF,#DBF1,#A440,#AFA6
820 ifi2cw(60,#8AA,1,#8B2,18)?"E

900 'OUT
910 ifi2cw(60,#8AA,1,#8AC,6)?"E
920 for[98]=0to7:for[99]=0to15:copy#8A2,vpeek(7-[98],[99])*8,8:ifi2cw(60,#8AB,1,#8A2,8)?"E
930 next:next:rtn


メモリ・マップ(参考情報・入力不要)
' #800 [0]〜#87F 128 bytes ロゴ画像64×16px
' #880[64]〜#8A1  34 bytes (空き)
' #8A2[81]〜#8A9   8 bytes OLED データ8×8px
' #8AA[85]〜#8AB   2 bytes OLED モード切替
' #8AC[86]〜#8B1   6 bytes OLED 描画位置指定
' #8B2[89]〜#8C3  18 bytes OLED 初期化用
' #8C4[98]〜#8C7   4 bytes for ループ用変数
' #8C8[100]〜8CB   4 bytes 予備

 上記プログラムA1の行番号1〜9は表示部、行番号700番台はIchigoJamロゴ生成部です。OLED用のドライバ部は行番号800番以降です。テレビ画面に映った文字の横8桁、縦16行をOLEDモジュールへ転送することが出来ます。行番号800番台をgsb命令で呼び出すと、OLEDの初期化処理を行い、表示データをOLEDへ転送します。
 下図は実行結果です。美しいIchigoJamフォントが、美しい有機ELディスプレイに表示されました。


BASICで作成したプログラムA1実行時の様子。ロゴを32文字分のフォントへ変換して表示した。IchigoJamのロゴはCC BY ライセンス(jig.jp https://ichigojam.net/ )の範囲内で利用した。ただし、IchigoJamの看板そのものであり、権利者の不利益にならないように配慮しよう。

 OLEDへ表示されない場合は、テレビ画面を確認してください。「E」の文字が縦に並んで表示されているようであれば、OLEモジュールとの通信エラーです。配線が誤っているか、OLEDモジュールとの相性、OLEDモジュールの故障などが考えられます。「E」が表示されていない場合は、一度、OLEDモジュールをCN5から抜いてから付けなおし、OLEDをリセットしてください。上手く動かないときは「FAQ」もご覧ください。


練習してみよう [Practice 1] 好きな文字

 少し、使い方の練習をしてみましょう。プログラムA1を実行した後に、以下のコマンドを入力してみてください。「クニノ ワタル」の部分は自分の名前に変更してみると良いでしょう。

CLS:?"クニノ ワタル":gsb800

 上手く表示できたでしょうか。
 CLSは画面を消す命令です。はてなマーク(クエッションマーク)は、テレビ画面へ文字を表示する命令です。そして、gsb800はプログラムの一部を実行する命令です。ここでは、プログラムA1の行番号800以降を実行します。


練習してみよう [Practice 2] プログラミング

 さぁ、プログラムを自作してみましょう。先に、他のOLED用のサンプルを試したい方は次へ進んでください。
 プログラムA1の行番号800〜930の黄色部分がOLED用のドライバソフトです。この黄色の部分だけを残して、次のようにプログラムを組んでみましょう。

プログラムA2 縦画面 BASIC版 ABCを表示(ドライバ部 276 Bytes)
' I2C OLED Example A2 ABC

' I2C OLED BASIC Driver for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Wataru KUNINO @ IchigoJam-FAN (Facebook)
new
10 CLS          :' ガメン ヲ ケス
20 ?"OLED LIB"  :' TV ガメン ヘ ヒョウジ
30 GSB 800      :' ショキカ ト データ テンソウ
40 ?"ABC"       :' TV ヘ ABC ヲ ヒョウジ
50 GSB 900      :' OLED ヘ テンソウ
60 END          :' シュウリョウ
800 'INIT
810 let[85],#4000,33,#227F,#700,#D5AE,#8D80,#2014,#DA00,#8112,#D9CF,#DBF1,#A440,#AFA6
820 ifi2cw(60,#8AA,1,#8B2,18)?"E

900 'OUT
910 ifi2cw(60,#8AA,1,#8AC,6)?"E
920 for[98]=0to7:for[99]=0to15:copy#8A2,vpeek(7-[98],[99])*8,8:ifi2cw(60,#8AB,1,#8A2,8)?"E
930 next:next:rtn

 実行すると、行番号20で「OLED LIB」をテレビ画面へ表示し、GSB 800でOLEDの初期化と表示データの転送を行います。また、行番号40でテレビ画面へ「ABC」を表示してから、GSB 900でOLEDへ転送し、行番号60で終了します。


練習してみよう [Practice 3] キャラクタ表

 こんどはキャラクタ表を作成してみましょう。文字や記号のイメージをつかんだり、キャラクタコードを確認する際に利用しても良いでしょう。

プログラムA3 縦画面 BASIC版 文字コード表(ドライバ部 230 Bytes)
' I2C OLED Example A3 Character list
' CC BY (c) 2017 Wataru KUNINO and Ruria Amanagi @ IchigoJam-FAN

' I2C OLED BASIC Driver for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Wataru KUNINO @ IchigoJam-FAN
new
10 CLS              :' ガメン ヲ ケス
20 FOR Y=0 TO 15    :' 16 カイ クリカエス
30 FOR X=0 TO 7     :' 8 カイ クリカエス
40 LC X,Y           :' ヒョウジ イチ シテイ
50 ? CHR$(16*X+Y+32); :' キャラクタ ヒョウジ
60 NEXT             :' FOR X ヘ モドル
70 NEXT             :' FOR Y ヘ モドル
80 GSB 800          :' ショキカ ト ヒョウジ
90 END              :' シュウリョウ
800 'INIT
810 let[85],#4000,33,#227F,#700,#D5AE,#8D80,#2014,#DA00,#8112,#D9CF,#DBF1,#A440,#AFA6
820 ifi2cw(60,#8AA,1,#8B2,18)?"E

900 'OUT
910 ifi2cw(60,#8AA,1,#8AC,6)?"E
920 for[98]=0to7:for[99]=0to15:copy#8A2,vpeek(7-[98],[99])*8,8:ifi2cw(60,#8AB,1,#8A2,8)?"E
930 next:next:rtn



BASICで作成したIchigoJam文字コード表。画面の左上の空白文字が32番で、その下に向けて[!]33番、["]34番と続き、一番下の[/]47番の次は、一番上に戻って一つ右の[0]48番が表示される。グラフィック部が見たいときは行番号50の「+32」を「+128」に変更する

 文字が輝いて見えるのは、有機ELディスプレイ(OLED)が自己発光しているからです。液晶ディスプレイ(LCD)の場合は、液晶パネルそのものは発光しません。液晶テレビのように光って見えるのは、液晶の裏面にバックライトを搭載しているからです。テレビ画面に使われているような高価な液晶パネルであれば、有機ELとの違いは分からないかもしれません。しかし、安価なモノクロ表示ディスプレイの中で有機ELと、液晶を比べれば、有機ELの方が美しいでしょう。

【Column】妙な表示順序
 ところで、表示(描画)する際に、妙な位置から妙な順番に表示されたのに気づいたでしょうか。この順序は、データの転送順です。この製品はOLEDが180°逆に取り付けてあり、フォントは90°回転されて表示され、さらにIchigoJam本体に取り付けるときの向きは90°になります。この回転の回転の回転に混乱し、適切に表示されるまでに多くの回り道をしました。違和感だけでなく、若干の苦労の跡を感じていただければと思います。

IchigoJam 開発者の福野さんのブログ

 1行のコマンドで、すぐに動作確認が可能なBASIC(ダイレクトモード)の特長を生かした使用方法が、 IchigoJam 開発者の福野さんのブログ(http://fukuno.jig.jp/2003)で公開されています。初期化コマンドがとても短いので、BASIC・もっとダイエット版に利用させていただきました。


BASIC・ダイエット版

 近年、ドライバ部のソフトウェアには汎用的で多機能なものが求められるようになってきましたが、かつてはシンプルかつコンパクトで高速なものも多くありました。IchigoJamの限られたメモリ容量を活用するには、かつてのような小容量化が重要です。
 下記は一部の処理を省略したダイエット版です。ただし、OLEDへ転送中にESCキーなどでプログラムを停止すると、OLED画面の描画位置がずれてしまうことがあります。位置がずれた場合は、一度、OLEDモジュールをCN5から抜いて、OLEDをリセットしてください。

プログラムA0 縦画面 BASIC ダイエット版(ドライバ部 192 Bytes)
' I2C OLED Example A0 Pinout list

' I2C OLED BASIC Driver for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Wataru KUNINO @ IchigoJam-FAN (Facebook)
' Special thanks to Fukuno-san, Ono-san, Saito-san, and all members.

new
10 CLS
20 ?" PINOUT"
30 ?
40 GSB 800
100 'Output to TV
110 ?"VO1  KB1"
120 ?"VO2  SCL"
130 ?"IN1  KB2"
140 ?"IN2  SND"
150 ?"IN3  ISP"
160 ?"IN4  RST"
170 ?"VCC  GND"
180 ?"GND  VCC"
190 ?"OUT1 Ich"
200 ?"OUT2 Go"
210 ?"OUT3  O5"
220 ?"OUT4  O6"
230 ?"BTN  TXD"
240 ?"LED  RXD"
300 'Output to OLED
310 GSB 900
320 END

800 let[84],#4000,#D5AE,#8D80,#2014,#DA00,#8112,#D9CF,#DBF1,#A440,#AFA6
810 W=i2cw(60,#8A8,1,#8AA,18)
900 forV=0to7:forZ=0to15:copy#8A0,vpeek(7-V,Z)*8,8:W=i2cw(60,#8A9,1,#8A0,8):next:next:rtn


メモリ・マップ(参考情報・入力不要)
' #8A0[80]〜#8A7   8 bytes OLED データ8×8px
' #8A8[84]〜#8A9   2 bytes OLED モード切替
' #8AA[85]〜#8BB  18 bytes OLED 初期化用
' #8BC[94]〜#8CB  16 bytes 空き
' 変数V            2 bytes 横座標
' 変数W            2 bytes I2C応答値
' 変数Z            2 bytes 縦座標

 下の写真はモバイルバッテリーで動作させたときの様子です。小さなOLEDディスプレイがあると、コードレスで持ち運ぶような用途に応用ができそうです。ただし、モバイルバッテリーによっては自動的に電源が切れてしまい、長時間の連続動作が出来ない場合があります。


ドライバ部の容量を節約したダイエット版でIchigoJamのピン配列表を表示してみた。予めSAVE 0でファイル番号0へ保存しておくとBTNスイッチを押しながら電源ONでプログラムが起動する。

BASIC・もっとダイエット版

 IchigoJamの開発者である福野さんのブログで、より簡単な初期化方法を知ったので、「もっとダイエット版」として、プログラムにしました。輝度が低くなりますが、ドライバ部150バイトと、いまのところ最小容量です。

プログラムmotto 縦画面 BASIC・もっとダイエット版(ドライバ部 150 Bytes)
' I2C OLED BASIC Driver for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Wataru KUNINO @ IchigoJam-FAN (Facebook)
' Special thanks to Fukuno-san, Ono-san, Saito-san, and all members.

new
10 CLS
20 ?:?" モット"
30 ?:?" ダイエット"
40 GOSUB 800
50 END

800 let[94],#4000,#148D,#20,#AF
810 W=i2cw(60,#8BC,1,#8BE,5)
900 forV=0to7:forZ=0to15:copy#8C4,vpeek(7-V,Z)*8,8:W=i2cw(60,#8BD,1,#8C4,8):next:next:rtn


メモリ・マップ(参考情報・入力不要)
' #8BC[94]〜#8BD   2 bytes OLED モード切替
' #8BE[95]〜#8C3   6 bytes OLED 初期化用(5 bytes)
' #8C4[98]〜#8CB   8 bytes OLED データ8×8px
' 変数V            2 bytes 横座標
' 変数W            2 bytes I2C応答値
' 変数Z            2 bytes 縦座標

マシン語による高速化でゲームが作れるようになった

 前項のプログラムA1のBASICによるOLEDドライバの課題は、2.6秒もの時間がかかることです。この課題を解決するために、IchigoJam-FANグループのRuria Amanagiさんが、表示用データの収集部をマシン語へ変換してくれましたので、使わせていただきました。
 マシン語を使うことで、表示データ処理の時間を大幅に短縮することが出来、下図のようなゲームが作成できるようになりました。これは、OLEDドライバの最も大きな進歩です。


表示データ生成部をマシン語に変更したことで、ゲームが可能になった。OLEDドライバが大きく飛躍した

 マシン語部では 1列16文字分のデータをOLEDの転送用データへ並び替えます。前プログラムA1の行番号920の内側のforループの処理に相当します。以下にマシン語を利用した簡単なゲームのプログラムB1を示します。ドライバ部の動作内容はプログラムA1と同じです。

プログラムB1 縦画面 BASIC+マシン語 ゲーム(ドライバ部 290 Bytes)
' I2C OLED Example B1 Racing GAME
' CC BY 2015-2017 Wataru KUNINO
' https://shop.cqpub.co.jp/hanbai/books/48/48101.html
' ※プログラムのみ CC BYです。(書物の内容については無断複製禁止)

' I2C OLED Binary Driver for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Ruria Amanagi, Shiro Saito, and Wataru KUNINO
' Special thanks to Fukuno-san, and all members in IchigoJam-FAN

new
1 CLS:?"RACING":?"GAME":gsb800
10 X=4
20 C=2
30 P=0
40 wait120:cls
50 LC 0,0:?"--|$$$|-"
100 'DISP
110 LC X,12:?"O"
120 LC 0,15:?"P=";P;
130 LC RND(32),0:?"-"
140 LC C,0:?"|":LC C+4,0:?"|"
150 R=RND(50):gsb900
160 IF R<4 LC R+C+1,0:?"$"
170 IF R<20 AND C>0 THEN C=C-1
180 IF R>30 AND C<3 THEN C=C+1
190 WAIT 10-P/10
200 LC X,12:?" "
210 K=INKEY()
220 IF K=28 THEN X=X-1
230 IF K=29 THEN X=X+1
300 'JUDGE
310 SCROLL 2
320 V=VPEEK(X,12)
330 IF V=36 BEEP 1:P=P+10:V=0
340 IF V=0 GOTO 110
400 'CRUSH
410 BEEP 20,10
420 LC X,12:?"X"
430 LC 0,15:?"P=";P;" "
440 LC 0,7:?"GAME OVR":gsb900
450 LC 0,23:?:end

800 let[64],#b5f0,#1840,#2380,#11b,#18cb,#2410,#7806,#f6
810 let[72],#18b6,#cea0,#c3a0,#3020,#3c01,#d1f7,#bdf0
820 let[84],#4000,#D5AE,#8D80,#2014,#DA00,#8112,#D9CF,#DBF1,#A440,#AFA6
830 ifi2cw(60,#8A8,1,#8AA,18)E
900 for[98]=0to7:ifusr(#880,#907-[98])&0|i2cw(60,#8A9,1,#800,128)E
910 next:rtn


メモリ・マップ(参考情報・入力不要)
' #800[0] 〜#87F 128 bytes OLED データ128×8px
' #880[64]〜#89D  30 bytes マシン語
' #89E[79]〜#8A7  10 bytes 空き
' #8A8[84]〜#8A9   2 bytes OLED モード切替
' #8AA[85]〜#8BB  18 bytes OLED 初期化用
' #8BC[94]〜#8C3   8 bytes 空き
' #8C4[98]〜#8C7   4 bytes for ループ用 変数

 実行すると、行番号1のgsb800で、OLEDの初期化と画面データの転送を行い、ゲームを開始します。ゲーム画面を描画するたびに行番号150のgsb900で画面データをOLEDへ転送し、ゲーム画面が動いて見えます。gsb800とgsb900の違いは初期化の有無です。OLEDの電源を入れてから、一度だけgsb800を実行すれば、その後はgsb900で画面を転送することが出来ます。
 なお、一部の処理を省略しているので、描画中にプログラムを停止すると、次回、途中からの描画になることがあります。そんな時は、一度、OLEDをCN5から抜いてリセットしてください。

【Column】たった3バイトのI2C通信エラー処理
 IchigoJam BASICの命令は、戻り値の有無によって書式が明確化されています。I2Cインタフェース用の命令I2CWは、戻り値のある関数の形式になっているので、「A=I2CW(〜)」のように戻り値を変数で受けることが出来ます。もし、戻り値が不要な場合であっても、「A=」が無いとエラーになってしまいます。
 一方、BASICの場合、ドライバ部とアプリケーション部に分けたとしても、変数は共用となります。このため、ドライバ部で変数を多用すると、不具合の原因となる場合があります。そこで、ボクはI2C命令が登場した当初から、IF命令を使って変数の使用を避けてきました。例えば、BASICのみのプログラムA1においても「IF I2CW(〜) ?"E"」のようにI2C通信エラーが発生したときに「E」の文字を表示するようにしています。
 ところで、この手法は、後に大きな革新がおこります。とても簡単な命令で、「I2Cエラー発生時にプログラムを停止させビープ音を鳴音する方法(http://fukuno.jig.jp/1426)」が発明されたのです。仕組みは通信エラー時にERR命令を実行するというものですが、実はERR命令という命令は存在しません。存在しない命令を実行させることでエラーを発生させるという、まさに目からウロコのアイデアです。
 本プログラムの行番号830と900では、この方法に倣って「E命令」を利用させていただきました。IF命令と合わせても、わずか3バイトで実現することが出来ます。

マシン語によるデータ処理部について

 マシン語のデータ処理部についても紹介しておきます。BASICのみのプログラムA1では、行番号920のforループの内側の計算式に、長い処理時間がかかっていました。プログラムB1では、この処理をマシン語部で実行しています。
 下記は時間を要していたBASICでの処理部と、マシン語への変換後のソースリストです。マシン語部は、アセンブリ言語ASM15(https://boxheadroom.com/15/asm15)によって書かれています。アセンブリ言語をバイナリへ変換した結果は、プログラムB1の行番号800と810に展開されています。行番号820にもバイナリデータがありますが、これはOLEDの初期化コマンドで、BASICのみ版と共通です。

マシン語に変換したBASIC部(参考情報・入力不要)
    for Y=0 to 15               :' ループ数
    copy #8A0,vpeek(7-X,Y)*8,8  :' FontをCopy
    next

マシン語部のアセンブラ ASM15 表記(参考情報・入力不要)
' I2C OLED ASM15 Binary Module 2017 Ruria Amanagi

  PUSH {LR,R4,R5,R6,R7} ' b5f0, スタックへ退避
  R0=R0+R1              ' 1840, R0=VRAMアドレス
  R3=#80                ' 2380, R3=#80
  R3=R3<<4              ' 011b, R3=#800
  R3=R1+R3              ' 18cb, R3=R1+#800 保存先
  R4=16                 ' 2410, R4=LOOP:ループ数
@LOOP
  R6=[R0]               ' 7806, R6=取得したChar
  R6=R6<<3              ' 00f6, R6*=8
  R6=R6+R2              ' 18b6, R6+=R2 (R2=ROM)
' ldm r6,{r5,r7}        ' Font先頭R6から8Byteを
' stm r3,{r5,r7}        ' R5,R7経由でR3へコピー
  data W #cea0          ' cea0
  data W #c3a0          ' c3a0
  R0+=32                ' 3020, 画面Y方向移動
  R4-=1                 ' 3c01, LOOPカウンタ
  IF !0 GOTO @LOOP      ' d1f7, R4>0で@LOOPへ
  POP {PC,R4,R5,R6,R7}  ' bdf0 スタックから戻入
※Ruria Amanagiのご厚意で公開していただいたASM15のソースリスト(コメントを追記して掲載させていただきました)
【Column】IchigoJam用アセンブリ言語ASM15がサポートしていない命令
 アセンブリ言語で書かれた一部の命令(ldm、stmなど)はASM15でサポートされていないので、先頭に「'」を付与してコメント行とし、すぐ後にデータとして保持しています。ASM15でコンパイルが可能なソースコードにしたい場合に、この方法を用います。

マシン語による高速版でPCG転送

 BASICのみ版では自分で作成したPCGキャラクタをOLEDへ転送することが出来ました。しかし上記の高速版のプログラムB1では、固定フォントROMしかアクセスできません。
 下記の動画は、OLED用ドライバにPCG対応のマシン語部を組み込み、イカのPCG用キャラクタを使ったゲームです。キャラクタがジャンプする様子の表現力が増しました。


ビデオ再生するには画像をクリック

PCGを使用したキャラクター「イカ」のジャンプゲーム。BTNを押すとイカがジャンプする。離すと落ちてくる。キャラクタのイカは、福野さんのブログ(https://fukuno.jig.jp/1062)のものを使用。ジャンプの時にイカが変形したり加速度がかかる点もブログを参考にした。

 下記はマシン語によるPCG転送のドライバ部を含んだ「いかジャンプ」ゲームのプログラムです。(黄色文字の)ドライバ部の容量が大きいので、固定フォントしか使わない場合はプログラムB1のドライバ部を使用したほうが良いでしょう。

プログラムB2 縦画面 BASIC+マシン語 [PCG]対応(ドライバ部 308 Bytes)
' I2C OLED Example B2 OLED Jumping IKA Game
' CC BY Wataru KUNINO https://bokunimo.net/ichigojam/oled.html

' PCGヨウ イカ キャラクタ http://fukuno.jig.jp/1062

' I2C OLED Binary Driver [PCG] for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Ruria Amanagi and Wataru KUNINO @ IchigoJam-FAN (Facebook)

new
1 cls:?"イカ ジャンプ by クニノ / PCGキャラ フクノ サン";
2 clv:let[0],#3810,#FE7C,#3838,#5428,0,0,#7C10,#54FE:copy#700,#800,16:gsb800
3 Y=14:lc0,15:forI=0to7:?CHR$(RND(4)+1);:next

100 'MAIN
110 IF Y=14 && BTN() B=1:BEEP
120 IF B A=A+1 ELSE A=A-1
130 IF !BTN() B=0
140 IF !RND(8) LC 8,14:?".";
150 LC 1,Y:?" ";
160 LC 8,15:?CHR$(RND(4)+1);
170 SCROLL 3:Y=Y-A
180 IF Y>14 Y=14:A=0:BEEP 3
190 IF SCR(1,Y)=46 GOTO 300
200 LC 1,Y:? CHR$(224+B)
210 GSB 900:GOTO 100
300 'END
310 LC 1,Y:?"X";:GSB 900
320 BEEP 2,20:WAIT 120
330 IF !BTN() GOTO 330
340 RUN

800 let[64],#b5f0,#1840,#2380,#11b,#18cb,#2410,21,#7806,#2ee0,#d300
810 let[74],#d,#f6,#1976,#cea0,#c3a0,#3020,#3c01,#d1f3,#bdf0
820 let[84],#4000,#D5AE,#8D80,#2014,#DA00,#8112,#D9CF,#DBF1,#A440,#AFA6
830 ifi2cw(60,#8A8,1,#8AA,18)E
900 for[98]=0to7:ifusr(#880,#907-[98])&0|i2cw(60,#8A9,1,#800,128)E
910 next:rtn


メモリ・マップ(参考情報・入力不要)
' #800[0] 〜#87F 128 bytes OLED データ128×8px
' #880[64]〜#8A5  38 bytes マシン語
' #8A6[83]〜#8A7   2 bytes 空き
' #8A8[84]〜#8A9   2 bytes OLED モード切替
' #8AA[85]〜#8BB  18 bytes OLED 初期化用
' #8BC[94]〜#8C3   8 bytes 空き
' #8C4[98]〜#8C7   4 bytes for ループ用 変数

マシン語部のアセンブラ ASM15 表記(参考情報・入力不要)
' I2C OLED ASM15 Binary Module 2017 Ruria Amanagi

    PUSH {LR,R4,R5,R6,R7}
    R0=R0+R1                ' R0=VRAMのアドレス
    R3=#80                  ' R3=#80
    R3=R3<<4                ' R3=#800
    R3=R1+R3                ' R3=R1+#800 保存先
    R4=16                   ' R4=ループ数/文字数
@LOOP
    R5=R2                   ' R2=ROMオフセット
    R6=[R0]                 ' R6=取得キャラクタ
    R6-#E0                  ' E0未満でキャリーF
'   if !C goto @skip        ' F無しのとき@skipへ
'   R5=R1                   ' PCG用オフセット
    data W #d300
    data W #000d
@skip
    R6=R6<<3                ' R6*=8
    R6=R6+R5                ' R6+=R5(ROM/RAM差)

'   ldm r6,{r5,r7}          ' フォント先頭R6から
'   stm r3,{r5,r7}          ' 8バイト,R3へコピー
    data W #cea0            '   (R5,R7経由して)
    data W #c3a0            ' 

    R0+=32                  ' 画面上のY方向移動
    R4-=1                   ' LOOPカウンタ
    IF !0 GOTO @LOOP        ' R4>0で@LOOPへ

    POP {PC,R4,R5,R6,R7}
※Ruria Amanagiのご厚意で公開していただいたASM15のソースリスト(コメントを追記して掲載させていただきました)
【Column】マシン語部の保持方法
 BASICで処理をマシン語へ置き換えるにあたり、マシン語のコードをPOKE文で保持するためのBASIC部が肥大化してしまう課題がありました。以前に「容量を低減するためのツール」を紹介したこともありますが、短いマシン語プログラムの場合、展開部のコードほうが負担になります。
 そこで思いついたのが、マシン語コードを配列へ代入する方法です。これまでも2進数で書いたフォントを代入する方法として使われていました。それを応用し、複数の2バイトの16進数を代入することで容量を削減することができました。さらに、IchigoJamの配列変数、マシン語のオペコードのどちらも2バイトなので、ハンドアセンブル時の相性も良く、今後、様々なIchigoJam用マシン語の展開に活用してもらえそうです。

高速・横画面表示

 こんどは横画面表示です。これまでの縦画面に比べてドライバ部のプログラム容量が増大します。限られた少ない残り容量でアプリケーションを製作する必要があります。

 以下のプログラムは「あらしテニスゲーム(原作=すがやみつる氏)」をもとにOLED版へ移植しました。権利についても、ご注意ください。

プログラムC1 横画面(ドライバ部 378 Bytes)
' I2C OLED Example C1 Arashi Tennis for IchigoJam

' Mitsuru Sugaya (Original)
' https://www.m-sugaya.jp/basic/tennis_game.htm

' Shiro Saito (IchigoJam Version)
' https://d.hatena.ne.jp/shiro0922/20150824/1440425034

' Wataru KUNINO (OLED Version)

' I2C OLED Binary Driver [LAND] for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Ruria Amanagi, Wataru KUNINO, and Shiro Saito
' Special thanks to Fukuno-san, Ono-san, and all members in IchigoJam-FAN.

new
10 ?"Arashi":cls:clv:gsb 800
20 P=5:X=RND(10)+1:Y=0:D=1:E=1
100 '
110 IF BTN(LEFT) GSB 380
120 IF BTN(RIGHT) GSB 420
130 LC P,7:?" ===== ";
140 LC 0,7:?"="::LC 15,7:?"=";
150 GSB 900
160 '
170 U=X+D:V=Y+E
180 IF U=0 OR U=15 THEN D=-D:GOTO 160
190 IF V=-1 THEN E=1:GOTO 160
200 S=SCR(U,V)
210 IF S=#3D GSB 460:GOTO 160
220 LC X,Y:?" ";
230 LC U,V:?"@";
240 X=U:Y=V
250 IF Y<8 GOTO 100
260 '
270 BEEP 30,60:WAIT 60
300 LC 3,3:?"GAME OVER":?
310 ?" Press [SPACE]":GSB 900
320 IF INKEY()=32 RUN
330 GOTO 320
380 '
390 P=P-1
400 IF P<0 THEN P=0
410 RTN
420 '
430 P=P+1
440 IF P>9 THEN P=9
450 RTN
460 '
470 BEEP 10
480 T=T+1
490 LC 0,0:?T;
500 E=-1
510 RTN

800 let[71],#4000,#D5AE,#8D80,#2014,#A100,#DAC8,#8112,#D9CF,#DBF1,#A440,#AFA6
810 ifi2cw(60,#88E,1,#890,20)E
820 let[72],#B5F0,#1840,#2308,#21B,#18C9,#4694,#2410,#7803,#DB,#18D2
830 let[82],#2708,#2507,#5D56,#40FE,#415B,#3D01,#D2FA,#700B,#3101,#3F01
840 let[92],#D1F5,#3001,#4662,#3C01,#D1ED,#BDF0
900 for[98]=0to7:ifusr(#890,#900+[98]*32)&0|i2cw(60,#88F,1,#800,128)E
910 next:rtn


メモリ・マップ(参考情報・入力不要)
' #800[0] 〜#87F 128 bytes OLED データ128×8px
' #88E[71]〜#88F   2 bytes OLED モード切替
' #890[72]〜#8A3  20 bytes OLED 初期化用
' #890[72]〜#8C3  52 bytes マシン語

' #8C4[98]〜#8C5   2 bytes for ループ用 変数

ご注意:
横画面表示を行ったあとに、縦画面表示のプログラムを動かす場合は、一度、OLEDモジュールを取り外して、OLEDの電源を切ってください。

ゲームセンターあらしがBASICによるプログラミング方法を漫画で説明する解説書「こんにちわマイコン」に掲載されたゲームをOLED版へ移植してみました。
当時、初心者向けBASIC解説書としては、製造メーカーがパソコンに同梱していたり、テレビ番組と連携した分かりやすい書籍も販売されていました。そういった書物が広まっている中、ゲーム作りに集中した点や、身近な漫画のキャラクターが解説する点が斬新で、大ヒットしました。この漫画の中で主となったプログラムが「あらしテニスゲーム」です。原作者のウェブサイトにMSX2用BASIC版が掲載されており、SHIROのモバイル日記にはIchigoJam版が公開されています。これらを基にOLED用ドライバの追加と、機能削減を行い、OLED表示版を作成しました。
※OLED用ドライバ部分以外の著作権は、原作者(すがやみつる氏)および、斎藤史郎(IchigoJam-FAN)が保有します。
【Column】挑戦してくれた人たちの全員による成果
 本ページで使用したSSD1306搭載OLEDモジュールは、もともと横表示で使用する商品です。ボクは昨2016年末に5個ほど購入し、Raspberry PiやArduino、ESP8266へ接続して使用していました。購入したときにIchigoJam BASICでの利用も試みたのですが、文字の回転の部分に手間がかかりそうだったため、諦めていました。そんなある日、ふとIchigoJam TのCN5へ縦向きに接続できることに気づきます。文字回転の問題解決を不要にしつつ、ハードの製作も不要という、一石二鳥が過ったのです。
 そんな経緯もあり、横画面表示については悩みの一つでした。そこに、IchigoJam-FANグループのAmanagiさん、尾野さんがマシン語での文字回転に挑戦し、完成したのが高速・横表示版です。尾野さんの横画面への疑問に対し、Amanagiさんは瞬時に上記の仕組みを理解し、マシン語部での文字回転を実装し、尾野さんがテストを繰り返すことで開発が進められました。最後の仕上げとなる画面全体の180°回転については、OLEDへのコマンド追加で対応しました。
 さらに、IchigoJamの開発者である福野さんからVIDEO 3モードでの使用の提案を受け、主にBASIC部分を調整して仕上げたVIDEO 3バージョンでは、配列変数を解放することが可能に。まさに、IchigoJam-FAN グループで作りあげたといっても過言ではないデバイスドライバです。

高速・横画面表示・PCG対応版

 本ページ最後のOLED用ドライバは、高速・横画面表示の自作PCGキャラクタ対応版です。使い方は同じです。OLEDドライバの最終成果といってよいでしょう。容量は最も大きくなります。ゲームのプログラムは単純・小容量だけど、画像に凝りたいといった用途向けです。


高速・横画面表示・PCG対応版OLEDドライバを使ったスロットゲーム

 サンプルプログラムはスロットゲームです。実行すると、グー、チョキ、パーのアイコンがスクロールし、BTNを押すと止まります。作成時のドライバ部のサイズは428バイト(現在402バイト)、PCGキャラクタ部が352バイト、ゲーム部は242バイト、合計1022バイト(空き2バイト)と限られた容量でした。スロットの結果の判定はありません。

プログラムC2 横画面 [PCG]対応(ドライバ部 402 Bytes)
' I2C OLED Example C2 SLOTS GAME
' CC BY (c) 2017 Wataru KUNINO

' I2C OLED Binary Driver [LAND] [PCG] for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Ruria Amanagi, Wataru KUNINO, and Shiro Saito
' Special thanks to Fukuno-san, Ono-san, and all members in IchigoJam-FAN.

new
10 gsb800:gsb70
11 forI=1TO3:D=C+RND(3)*4:gsb50
12 lcI*3+1,8:?CHR$(D);CHR$(D+1);
13 lcI*3+1,9:?CHR$(D+2);CHR$(D+3);
14 next:scroll0:gsb900:gsb50:scroll0:gsb900
15 if!BTN()goto11
16 end
50 forJ=0to3:lcJ*3+3,2:?" ";:lcJ*3+3,4:?"|";:next:rtn
70 A=#F8:B=#F0:C=63
71 poke#700,0,0,0,0,0,0,13,31,0,0,0,0,0,0,#B0,A
72 poke#710,31,31,C,C,C,31,15,0,A,A,A,A,A,A,B,0
73 poke#720,3,51,51,59,27,27,31,31,0,0,0,0,0,0,#B0,A
74 poke#730,31,C,C,C,C,31,15,0,A,A,A,A,A,A,B,0
75 poke#740,3,51,51,51,27,27,#9F,#DF,96,96,96,98,#66,#EE,#FC,#FC
76 poke#750,#FF,#FF,#7F,C,31,15,15,0,A,A,A,A,A,B,B,0
77 C=#E0:rtn

800 let[67],#4000,#D5AE,#8D80,#2014,#A100,#DAC8,#8112,#D9CF,#DBF1,#A440,#AFA6
810 ifi2cw(60,#886,1,#888,20)E
820 let[68],#B5F0,#1840,#468E,#4694,#2308,539,#18C9,#2410,#4665,#7803
830 let[78],#2BE0,#D300,#4675,#DB,#18EA,#2708,#2507,#5D56,#40FE,#415B
840 let[88],#3D01,#D2FA,#700B,#3101,#3F01,#D1F5,#3001,#3C01,#D1EA,#BDF0
900 for[98]=0to7:ifusr(#888,#900+[98]*32)&0|i2cw(60,#887,1,#800,128)E
910 next:rtn


メモリ・マップ(参考情報・入力不要)
' #800[0] 〜#87F 128 bytes OLED データ128×8px
' #886[67]〜#887   2 bytes OLED モード切替
' #888[68]〜#8A3  20 bytes OLED 初期化用
' #888[68]〜#8C3  60 bytes マシン語

' #8C4[98]〜#8C5   2 bytes for ループ用 変数

マシン語部のアセンブラ ASM15 表記(参考情報・入力不要)
' I2C OLED ASM15 Binary Module (c) 2017 Ruria Amanagi

    PUSH {LR,R4,R5,R6,R7}

    R0=R0+R1                ' R0=VRAMアドレス
    R14=R1                  ' R14= RAM
    R12=R2                  ' R12= ROM

    R3=#8
    R3=R3<<8
    R1=R1+R3                ' R1+=#800 保存先
    R4=16                   ' R4=ループ数/文字数
@LOOP
    R5=R12                  ' 固定フォント用
    R3=[R0]                 ' R3=取得キャラクタ
    R3-#E0                  ' E0未満でキャリーF
'   if !C goto @SKIP
    data w #d300
    R5=R14                  ' PCG用オフセット
@SKIP
    R3=R3<<3                ' R3*=8
    R2=R5+R3                ' R3=該当フォント
    R7=8                    ' R7=LOOP2:ループ数px横
@LOOP2
    R5=7                    ' R5=参照ビット位置px縦
@LOOP1
    R6=[R2+R5]              ' R6=フォント+ビット位置
    R6>>=R7                 ' ドット横の参照位置
'   adc(R3,R3)
    data w #415b
    R5-=1                   ' R5=参照位置px縦を上に
'   if C goto @LOOP1        ' C解除まで繰り返す
    data w #d2fa

    [R1]=R3                 ' 保存先へ書き込み
    R1+=1
    R7-=1
    IF !0 GOTO @LOOP2

    R0+=1
    R4-=1
    IF !0 GOTO @LOOP

    POP {PC,R4,R5,R6,R7}
※Ruria Amanagiのご厚意で公開していただいたASM15のソースリスト(コメントを追記して掲載させていただきました)
【Column】無知な偶然による思わぬ問題解決
 当初、プログラムB2の縦表示のPCG版と、C1の横表示のPCGなし版を、合体させて作成してみたところ、マシン語でのコード容量が70バイトになってしまいました。ここでも、Amanagiさんが、アドレス計算の無駄を省いて小容量化を図り、60バイトに抑えてくれました(マシン語のコード容量は、プログラムB1、B2、C1、C2の順に、30バイト、38バイト、52バイト、60バイトと増大する。また、マシン語をプログラム上で保持するにはコード容量の3〜4倍を消費する)
 ボクはレジスタR14の利用でAmanagiさんの悩みを解決したようですが、実はそれはARM上でのマシン語の扱いが初めてだったボクのビギナーズラック。既にR12が使われていて、またR13は使えないことを理解していたので、その次のR14を使って、レジスタを監視しながら動作確認をしただけでした。

グラフィックス表示

 MixJuiceを使用し、GiHubから画像ファイルをダウンロードし、OLEDへ転送するためのプログラムです。MixJuiceを無線LANアクセスポイントへ接続してから、実行してください。表示完了まで、約130秒を要します。


I2C 有機ELディスプレイ OLED のGND、VDD、SCL、SDAの端子を、IchigoJamのGND、3.3V、SCL、SDA端子へ接続する

プログラムG1 縦画面 [GRAPHICS] ダウンローダ(588 Bytes)
' I2C OLED BMP Downloader [GRAPHICS] for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Wataru KUNINO @ IchigoJam-FAN (Facebook)

new
100 cls:?"OLED BMP":?"ダウンローダ":?:?"by":?"W.Kunino":gsb800
110 ifi2cw(60,#8A8,1,#8AA,6)?"E
120 B=-1:goto300
200 'LINE
210 cls:uart0:forI=0to15:?chr$(#E0+I);:next:?:?"Step ";B+1;"/8"
220 ifi2cw(60,#8A9,1,#700,128)?"E
300 'MJ
310 B=B+1:ifB<8uart1:?"MJ GETS git.bokunimo.com/MJ/pg05/bmp/ras/";B;".txt"
320 end
800 'INIT
810 let[84],#4000,33,#227F,#700,#D5AE,#8D80,#2014,#DA00,#8112,#D9CF,#DBF1,#A440,#AFA6
820 ifi2cw(60,#8A8,1,#8B0,18)?"E
900 'OUT
910 ifi2cw(60,#8A8,1,#8AA,6)?"E
920 for[98]=0to7:for[99]=0to15:copy#8A0,vpeek(7-[98],[99])*8,8:ifi2cw(60,#8A9,1,#8A0,8)?"E
930 next:next:rtn


応用例

 IchigoJam S, Tへの接続が簡単で、バックライト付きの液晶ディスプレイよりも消費電力も小さい(10mA程度・表示内容による)ので、様々な応用が考えられます。以下に応用例について紹介します。

  • NameDake(ネームダケ) (SHIROのモバイル日記)
    胸ポケットに合う、ミニ名札


    OLED部分だけがシャツの外に出る部分が面白い。製作および撮影は FacebookのIchigoJam-FANグループの斎藤さん。

  • リモコンカムロボOLED (SHIROのモバイル日記)
    ロボットの操作内容をOLEDへ表示


    ビデオ再生するには画像をクリック

    ロボットにもOLED。動作状態を文字で確認できる。

  • 連打OLED (SHIROのモバイル日記)
    ボタンを押すだけの連打ゲームOLED版


    ボタンを押すたびにドットが消える。全て消すのに何秒かかる?

  • アニメーション表示(ボクにもわかる電子工作・ブログ)
    3枚の画像を順次表示して簡単なアニメを表示する


    ビデオ再生するには画像をクリック

    IchigoJamのファイル領域へ画像を保存し、順次表示するアイデアをRuina Amanagiさんからいただいた。詳しくはブログ

  • 広告表示・超小型電子掲示板(ボクにもわかる電子工作・ブログ)
    会社や展示会の受付などに設置する超小型の電子掲示板

  • くまモンを表示(ボクにもわかる電子工作・ブログ)
    人気のくまモン、OLEDの中に入ります


    IchigoJam Tの上に、MixJuiceを実装し、くまモンを表示してみた。くまモンの画像の権利情報:(c)2010熊本県くまモン

  • くまモンで表示 (SHIROのモバイル日記)
    人気のくまモン、OLEDの中から出てきました


    くまモン、OLEDを保持します。ディスプレイの向きが逆さまだが、画面の逆さ表示は簡単に行える。詳細:Facebook内の投稿
    くまモンの画像の権利情報:(c)2010熊本県くまモン

トラブル対策 FAQ

  • OLEDへ何も表示されない
  • プログラムA1を動かすと、TV画面に「E」の文字が連続表示される。
    • CN5への差し込みがズレている場合、表示されません。
    • OLEDモジュールのピン配列が異なっている場合は、表示されません。GND、VCC(またはVDD)、SCL、SDAの順に並んでいることを確認してください。
    • IchigoJam UのCN5へ接続しても表示されません。IchigoJam S, T をお買い求めください。
    • 一度、OLEDモジュールをCN5から抜いてリセットすると直る場合があります。
    • OLEDモジュールをCN5から外し、プログラムA1を実行したときに「E」の文字が表示されることを確認してください。何も表示されない場合は、他のI2C接続デバイスが異常な状態となっています。
    • SCL、SDAがプルアップされていない可能性があります。モジュール裏面のR1とR2に4.7kΩを実装してください(REF番号は機種によって異なる場合がある)。

  • Syntax errorが表示される
    • IchigoJamのファームウェアが古い可能性があります。本ページに掲載されているプログラムではVer 1.2.1以上を、VIDEO 3命令を使用しているプログラムにはVer 1.2.2以上を使用してください。

  • 画面転送中にESCを押し、その後に再開すると表示位置がズレる
    • OLED側の表示用メモリ転送の途中で止めると、その次に実行したときに止めたところから描画されるからです。プログラムA1を動かすと直ります。または、一度、OLEDモジュールをCN5から抜いてリセットして下さい。

  • 画面が逆に表示される
  • 無関係な画像、文字、記号が表示される
  • EEPROMへのアクセスが出来ない
    • 一度、OLEDモジュールをCN5から抜いて、リセットしてください。

  • 全然、簡単じゃないし、面白くもない上、このページの文字数が多すぎる
    • 一度、IchigoJamの電源を抜いて、気持ちをリセットしてください。
    • Columnは無駄話です。読み飛ばしてください。
    • OLEDのことは嫌いになってもIchigoJamのことは嫌いにならないでください。

関連投稿記事

技術情報

 以下に本ドライバでOLEDへ送信するコマンドを示します。ディプレイの回転表示(90°/180°)については、回転に応じたコマンドを追加しています。

OLEDの初期化手順と描画位置設定
OLED モード切替 2 bytes
    ADR, VAL, Description
	#00, #00, Command mode
	#01, #40, Data mode

OLED 初期化用 18 bytes
    ADR, VAL, Description
	#00, #AE, DISPLAY OFF
	#01, #D5, SET DISPLAY CLOCK DIV
	#02, #80,     0x80
	#03, #8D, CHARGE PUMP
	#04, #14,     0x10(enable)/0x14(disable)
	#05, #20, MEMORY MODE
	#06, #00,     0x00
	#07, #DA, SET COMPINS
	#08, #12,     0x12
	#09, #81, SET CONTRAST
	#0A, #CF,     0x7F(defalt) -> 0xCF
	#0B, #D9, SET PRECHARGE PERIOD
	#0C, #F1,     0x02(defalt) -> 0xF1
	#0D, #DB, SET VCOM DETECT
	#0E, #40,     0x40
	#0F, #A4, DISPLAY ALLON_RESUME
	#10, #A6, NORMAL DISPLAY
	#11, #AF, DISPLAY ON

OLED 描画位置指定 6 bytes
    ADR, VAL, Description
	#00, #21, COLUMN ADDR
	#01, #00,     Column start
	#02, #7F,     Column end
	#03, #22, PAGE ADDR
	#04, #00,     Page start
	#05, #07,     Page end

謝辞

 本OLEDドライバの作成にあたり、FacebookグループIchigoJam-FANのRuina Amanagiさんのマシン語コード(表示データ生成部)やアドバイスなどを使用させていただきました。ありがとうございました。
 また、OLEDの初期化手順や初期設定には、Adafruit社のAdafruit_Python_SSD1306、ならびにブログ「福野泰介の一日一創(http://fukuno.jig.jp/2003)」に記載の手順を参考にしました。


掲載情報について

  • こどもパソコン IchigoJamを用いた電子工作、プログラム等を紹介しています。
  • IchigoJamは株式会社jig.jpの登録商標です。当ページはjig.jp社の作成物ではありません。(本サイトでは jig.jp の商品やソフトの呼称として使用しています。)
  • 出典を明記した情報については前項に関わらず出典元の権利を継承します。
  • 作成にあたりFacebookグループIchigoJam-FANの情報を参照しました。
  • 当ウェブサイトの内容や情報については、ご自身の責任でご利用ください。
    製作品などで事故が発生した場合であっても当方は一切の補償をいたしません。

IchigoJam メインメニューへ戻るページの先頭へ戻る