LSI Jiu-Jitsu

電子工作とブラジリアン柔術

OLED 0.96インチで遊ぶ (3) - PBMファイル表示

またまた久しぶりの投稿です(笑)
OLEDについて纏めたネタが色々あるので少しづつ上げていこうと思います。

今回は画像ファイルを表示する方法について紹介します。

任意の画像をGIMPで128x64にリサイズして、PBMフォーマットにエクスポートします。

f:id:mohran:20180521230445j:plain

フォーマット指定はASCIIにします。
f:id:mohran:20180521230839j:plain

こんな感じのスクリプトを通して変換→表示を行いました。
(画素値を128x64の配列に取り込んで、縦8列を1Byteにしてラスター順に出力しています)

#!/usr/bin/perl -w

open(RFP, "<" . $ARGV[0]) || die("Fatal : Can't open file ... $ARGV[0]\n");

@pbm = ();

$w = 0;
$h = 0;
$i = 0;
while(<RFP>){
  $l = $_;
  chomp($l);

  $l =~ s/#.*$//;

  if($l eq ''){ next; }

  $i++;
  if($i==1){
    if($l ne 'P1'){ die("Error : It isn't P1 format ...\n"); }
  }elsif($i==2){
    ($width, $height) = split(/\s+/, $l);
  }else{
    foreach $d (split(//, $l)){
      $pbm[$h][$w] = $d; 
      $w++;
      if($w==$width){
        $h++;
        $w = 0;
      }
    }
  }
}
close(RFP);

# display set
$cmd = 'i2cset -y 1 0x3c 0x00 0xa0 0xc0 i';
system($cmd);

# horizontal mode
#    column = 0 ... 127
#    page = 0 ... 7
$cmd = 'i2cset -y 1 0x3c 0x00 0x20 0x00 0x21 0x00 0x7f 0x22 0x00 0x07 i';
system($cmd);

$i = 0;
for($h=0; $h<$height; $h+=8){
  for($w=0; $w<$width; $w++){
    $d = unpack("C", pack("B8", $pbm[$h+7][$w] .
                                $pbm[$h+6][$w] .
                                $pbm[$h+5][$w] .
                                $pbm[$h+4][$w] .
                                $pbm[$h+3][$w] .
                                $pbm[$h+2][$w] .
                                $pbm[$h+1][$w] .
                                $pbm[$h+0][$w]));
    if($i==0){
      $cmd = "i2cset -y 1 0x3c 0x40 ";
    }
    $cmd .= sprintf("0x%02x ", $d);
    $i++;
    if($i==16){
      $i = 0;
      $cmd .= "i";
      system($cmd);
    }
  }
}

# display enable
$cmd = 'i2cset -y 1 0x3c 0x00 0x8d 0x14 0xaf i';
system($cmd);


引数にpbmファイルを指定して実行させます。

$ ./disp128x64.pl miku.pbm

写真ではちょっと見難いですが綺麗に表示できました。

[参考記事]

【柔術】JJFJ - ヒクソン・グレイシー杯2018 & JBJJF - 第12回全日本マスター柔術選手権

2018年の柔術コンペティションは2月11日に行われた

JJFJ - ヒクソン・グレイシー杯2018

から始まりました。

会場は、駒沢オリンピック体育館。

広くて綺麗な会場で、海外の試合会場の様な雰囲気でした。

 

試合は、4人トーナメントでした。

お正月に食べ過ぎたのか、体重がビックリするほど増えてしまったので(笑)、階級を1つ上げての挑戦です。

1回戦は開始早々にタックルで倒されて2点リードされてしまいましたが、なんとかガードに戻してスイープ成功。

その後はバックを奪えて試合終了。

チョークを狙ったのですが、極めきれず力を使ってしまいました・・。

15分後、決勝戦開始。

引き込みと同時にタックルを合わせられてしまい、またもや2点先制されてしまいました。

ガードに戻せたのですが、相手選手のベースが強い。

パスアタックを防ぎながら、スイープチャンスを伺いますが上手くいきません。

そのままタイムアップ。

準優勝で銀メダルでした。 

f:id:mohran:20180312234456j:image

その他、ヒクソンさんのミニセミナーなどがあったり、一緒に写真を撮って頂いたりと思い出に残る大会となりました。

ちなみにJJFJ のメダルは毎回ディテールまでしっかりした作りで高級感がありますね。

お金かかっていそうです。

 

そして、2週間後の2月24日に墨田区体育館で行われた

JBJJF - 第12回全日本マスター柔術選手権

にも出場して参りました。

4回目の全日本マスター挑戦です。

過去3回は、銀・銀・1回戦敗退と優勝は1度もありません。

一度で良いので取ってみたいタイトルなので、本来の階級でエントリーです。

今年のエントリーはなんと、去年と同じ面子の5名となりました。

試合前に今回は減量が上手くいかず苦戦しました。

試合前日に一気に水抜きをしたところ、落としすぎてしまい試合当日はマイナス800グラムという状態・・。

ちなみに相手選手の4名のうち、3名には過去の全日本マスターで負けています。

残りの1名は昨年の覇者。

このメンバーの中では実質、ワタクシが一番の弱者となります(笑)

1回戦は一昨年の決勝で負けた選手です。

試合開始。

お互い引き込んでWガードになりました。

一昨年は、このWガード20秒のペナルティがお互い3回付きました。

今年は・・。

上からアタック仕掛けちゃおう!

ワタクシが上になってアドバンテージ先制。

相手選手はディープハーフガードの使い手です。

左足に絡み着かれましたが、潜られないように必死に体制を低くしながら左足を抜きにかかります。

潜り狙いと、低い体勢での足抜き。

お互い全力で地味~な攻防です。

結局、そのままジワジワした攻防を5分間続けてタイムアップ。

アドバンテージ差で勝利となりましたが、なんともスッキリしない勝ち方です・・。

とは言ってもいちおうリベンジ成功。

そのまま優勝を狙います。

相手選手は、去年の1回戦の相手選手となりました。

三角締めでタップを取られた選手です。

今回も必殺の三角締めて勝ち上がって来ました。

 

試合開始。

引き込んで下から伺います。

スイープが成功するも下から強烈な脚力で足が絡みついて来ます。

防ぐので精一杯。

スイープされた方がまだマシなので、自分から下になります。

相手選手もあえてスイープされるのを狙っているようにも見えます。

カウンターの三角狙い。

残り時間1分。

体力もまだあるし、なんとか上から防げるかも。

上を取ったところ案の定、怒涛の足技が絡みついて来ました。

甘かった。

防ぎきれずにあっという間に捕まってしまいました。

なんとか状態を起こして三角締めは絶えましたが、残り時間20秒。

腕十字に切り替えられたところでタップ。

またもや完敗・・。

銀メダル。

どうしようも無いほどの完敗でしたが、またコツコツ頑張って、来年の全日本マスターにも挑戦しようと思います!

f:id:mohran:20180312234500j:image

そして、今回は無理な減量が影響したのか次の日から高熱が・・。

インフルエンザA型との診断でした(涙)

しばらく会社も練習も休むことになってしまい、ヒクソン杯と同様に忘れられない大会となりました(笑)

普段の節制が大切だと身をもって痛感しました。

 

【柔術】コパ・ブルテリアオープン2017

静岡県浜松市の浜松武道館で行われた

コパ・ブルテリアオープン2017

へ出場して参りました。

チームメイトと2人で初めての遠征試合。

会場まで車で3時間ほどかかりました(笑)

早めにエントリーしていたのですが、対戦相手選手が現れなかったので1階級上げてのワンマッチ試合です。

減量が無かったので気持ち的には楽でした。

今年最後の試合。

勝って締めくくりたいところです。

試合開始。

引き込み成功で下から伺います。

相手選手にズボンの嫌なところを掴まれてプレッシャーを掛けられます。

ジリジリとして攻防が続きます。

上手い選手だなぁと思ったところで、足を絡めてスイープチャンスが生まれました。

倒し際に起き上がり姿勢を取ろうとしたところで相手選手が横に回転をしました。

すると・・

おっと!

外掛けの体勢になってしまう。

直ぐに足を引っ込めたところで、レフリーのパロウの声!

ダメでした・・

一瞬でも鼠径部を超えてしまったのを見逃さなかったようです。

外掛け反則負け。

頭が真っ白になりました。

正直、厳しすぎる気もしましたがレフリーは絶対なので仕方ありません。

相手選手にお詫びして残念銀メダル。

チームメイトも1回戦で負けてしまい2人してモヤモヤした気分で会場を後にしました。

来年またリベンジしましょう!

2人で誓いあって浜松ブラブラ観光をしてから東名高速に乗りました(笑)

今回で今年の試合は最後でした。

今年は5大会出場して5勝3敗。

なんとか勝ち越せましたが、勝った試合も負けた試合も全て反省点が必ず何点かあります。

修正しながら来年に繋げたいと思います。

【柔術】DUMAU & デラヒーバ杯2017

半年ぶりの柔術試合の結果を2つです。

9月27日に台東リバーサイドで行われた

ASJJF - DUMAU JIU JITSU JAPAN GRAND PRIX 2017

に出場しました。

本来のカテゴリに対戦相手が現れなかったので、年齢を落としてワンマッチとなりました。

序盤にスイープが成功して2点先制するもあっさりひっくり返されてしまい同点。

起き上がり力が物凄い強い選手でした。

試合時間終了1分前にようやく再スイープが成功したので固めようとしましたが、掴まれたズボンが切れずにいたところ、残り時間20秒でまたもやひっくり返されてしまい試合終了です。

苦手な延長戦に突入・・。

タックル行くか引き込むかどうしよう・・?

と迷ったところに引き込まれて巴投げ!!

をやられて終了です。

負けました。

残念銀メダル。

そして2ヶ月後の11月26日に同じく台東リバーサイドで行われた

ヒカルド・デラヒーバ杯2017

に出場しました。

今回は紫帯になって初の無差別級にも挑戦です。

階級別はワンマッチ。

無差別級は5人トーナメントのシードで優勝までは2戦の山です。

会場はひとフロアに4面のマットを設置しているので人口密度が凄いことに・・。

チームメイトの応援にも一苦労です。

始めに階級別が行われました。

無差別はハナから諦めているので、年齢も体重も適正の階級別は何としても落としたくありません。

ここで負ければ3連敗。

絶対に勝つ!!

自分にプレッシャーを掛けながら挑みました。

引き込み成功で怒涛のパスアタックをガードで防ぎながらスイープチャンスを伺いますが、なかなか上手くいきません。

ポイント、アドバンテージどちらも0-0のまま残り時間30秒。

相手選手の疲れが見えたところで一気にバックを奪えました。

そのまま送り襟締めでタップアウト。

ようやく連敗を脱出できました。

緊張感も和らいだところで無差別級の試合開始。

相手選手は2階級上の選手です。

いつものように引き込んで上下の攻防。

残り時間1分を切ったところで三角クラッチに捕らえました。

極めまでは行けず外されてしまいましたが、レフリーへの印象として高いかも知れません。

階級別と同じくポイント、アドバンテージ0-0のまま残り時間30秒。

相手選手もレフリー判定では分が悪いと予想したのでしょう。

力ずくで倒れながらの腕十字を仕掛けてきました。

一瞬、腕が伸び切ってしまいましたがなんとか体勢を丸めて起き上がりスイープとなって試合終了。

なんとか決勝に進むことができました。

20分後、決勝戦開始。

相手選手は1回戦と同じく2階級上の選手。

その方は1回戦は更に1階級上の選手に勝利しての決勝戦進出です。

ダブルガードからワタクシが起き上がってアドバンテージ。

何故か上を選択してしまいました(笑)

スイープに気を付けながらパスアタック開始。

ハーフガードに入られながら、残り時間1分。

ようやくパスガードが成功して3P奪取。

そしてタイムアップ。

なんと、無差別級も優勝することができました!

1日に2つの金メダルは白帯の時以来です。

感無量。

おまけに今回は3試合とも1アドバンテージも取られませんでした。

しかし、ビデオで見返すと反省点も盛りだくさん・・。

これに奢らず今後も精進して参りたいと思います。

次は1週間後の静岡遠征。

ブルテリアオープンです。

OLED 0.96インチで遊ぶ (2) - SSD1306

SSD1306の設定レジスタ(コマンドテーブル)について纏めてみました。

こちらからダウンロードしたデータシートの9章に対応しています。

https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

1. Fundamental Command Table

0x81 : 明るさ設定(0x81送信後の0x00~0xffの256段階で指定する)

明るさ最小
$ i2cset -y 1 0x3c 0x00 0x81 0x00 i

明るさ最大
$ i2cset -y 1 0x3c 0x00 0x81 0xff i

明るさ最小

明る最大

0xA4 / 0xA5 : 全体表示設定

通常
$ i2cset -y 1 0x3c 0x00 0xa4 i

全画面描画
$ i2cset -y 1 0x3c 0x00 0xa5 i

全画面描画

0xA6 / 0xA7 : データRAMのビット極性設定

通常(データRAMのビット=1で描画)
$ i2cset -y 1 0x3c 0x00 0xa6 i

反転(データRAMのビット=0で描画)
$ i2cset -y 1 0x3c 0x00 0xa7 i

反転

0xAE / 0xAF : 表示Off/On設定

表示Off
$ i2cset -y 1 0x3c 0x00 0xae i

表示On
$ i2cset -y 1 0x3c 0x00 0xaf i

2. Scrolling Command Table

0x2E / 0x2F : スクロールOn/Off設定

スクロールOff
$ i2cset -y 1 0x3c 0x00 0x2e i

スクロールOn
$ i2cset -y 1 0x3c 0x00 0x2f i

0x26 / 0x27 : 横方向スクロール設定(0x26/0x27送信後の6バイトで指定する)

$ i2cset -y 1 0x3c 0x00 \
                   0x26 \ # 0x26:右方向 0x27:左方向
                   0x00 \ # ダミー
                   0x00 \ # 開始ページ 0~7
                   0x07 \ # スクロールフレーム間隔 0~7
                   0x07 \ # 終了ぺージ 0~7
                   0x00 \ # ダミー
                   0xff \ # ダミー
                   i

※ 上記設定は、全ページを右方向に最速でスクロール
※ フレーム間隔は0x03(256frame)が一番遅い

0x29 / 0x2A : 横方向&縦方向スクロール設定(0x29/0x2A送信後の5バイトで指定する)

$ i2cset -y 1 0x3c 0x00 \
                   0x29 \ # 0x29:右方向 0x2a:左方向
                   0x00 \ # ダミー
                   0x00 \ # 開始ページ 0~7
                   0x07 \ # スクロールフレーム間隔 0~7
                   0x07 \ # 終了ぺージ 0~7
                   0x01 \ # 縦方向オフセット 1~63
                   i

※ 上記設定は、全ページを右方向に最速でスクロール
※ 縦方向オフセットは、スクロール毎に上方向にシフトさせるライン数

0xA3 : 縦方向スクロールエリア(0xA3送信後の2バイトで指定する)

$ i2cset -y 1 0x3c 0x00 \
                   0xa3 \
                   10   \ # 開始ライン番号 0~63
                   20   \ # スクロールライン数 0~64
                   i

※ 上記設定は、10ライン目から20ライン(29ライン目まで)をスクロールさせる

3. Addressing Setting Command Table

(1)を参照

4. Hardware Configuration (Panel resolution & layout related) Command Table

5. Timing & Driving Scheme Setting Command Table

4, 5についてはパネルとクロックの設定なので特に触る必要はありませんが「0xA0 / 0xA1」と「0xC0 / 0xC8」の2箇所を設定することで上下左右を反転させることができます。

0xA0 / 0xA1 : カラムアドレス0位置の指定

通常(カラムアドレス0が左端)
$ i2cset -y 1 0x3c 0x00 0xa0 i

左右逆転(カラムアドレス0が右端)
$ i2cset -y 1 0x3c 0x00 0xa1 i

左右逆転

0xC0 / 0xC8 : ページ0位置の指定

通常(ページ0は上端)
$ i2cset -y 1 0x3c 0x00 0xc0 i

上下逆転(ページ0は下端)
$ i2cset -y 1 0x3c 0x00 0xc8 i

上下逆転

「0xA1」「0xC8」を設定して上下左右逆転させるとシルク印刷と同じ向きになります。


こちらが正しい向きなのかも知れません(笑)
ちなみに「上下逆転」は即時に反映されますが「左右逆転」は次の描画から反映されます。

[参考記事]

OLED 0.96インチで遊ぶ (1) - SSD1306

f:id:mohran:20170902171226j:plain

aitendoで0.96インチのOLED(有機EL)モジュール「M096P4W(BL)」を購入しました。
128x64ドットの領域に絵を表示したりして楽しく遊べています。
Raspberry PiからPerlを通して動作させたので使い方を纏めてみました。
主にコントローラーIC「SSD1306」の制御方法についてです。

初めに、基板の端子は下の写真の向きで左から
「SDA(I2C)」「SCK(I2C)」「GND」「VCC」
の並びになっています。

f:id:mohran:20170902171238j:plain

これをRaspberry Piの各Pinと接続します。
Pin1(3.3V) - VCC
Pin3(SDA) - SDA
Pin5(SCL) - SCL
Pin9(GND) - GND

f:id:mohran:20171117003327j:plain

写真は秋月電子のブレッドボード接続キットを通して接続しています。

f:id:mohran:20170902171246j:plain


「SSD1306」のデータシートは、下記のサイトよりpdfをダウンロードしました。
https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf

f:id:mohran:20170902002802j:plain

以下、データシードから抜粋しながら記載していきます。

■ I2Cフォーマット

「SSD1306」にアクセスするI2C通信のフォーマットは下記のようになっています。

f:id:mohran:20170902002920j:plain

スレーブアドレス(0x3c)の後に、コントロールバイト、データバイトの順に送信します。
コントロールバイトには「Co (Continuation bit)」と「D/C# (Data / Command Selection bit)」の2ビットが含まれています。
「Co=1」で送信した時は、データバイトの次に再度コントロールバイトを送る必要がありますが「Co=0」で送信した時は、データバイトのみを連続して送ることができます。
「D/C#」は、データバイトがコマンドかデータかの区別で、コマンドは設定レジスタ、データは画像データと考えて良いと思います。

Raspberry PiからI2C通信を行うには「Raspberry Piの設定」の「I2C」を有効にして再起動しておきます。

f:id:mohran:20170830130757p:plain

「I2C」が有効になっているとターミナルから「i2cset」コマンドでI2C通信を行うことが可能になります。

$ i2cset -y 1 0x3c \
        [コントロールバイト] \
        [データバイト] \
        [コントロールバイト] \
        [データバイト] \
        i

最後の「i」を入力するまでを「SSD1306」に送信してくれます。

例えば、下記のコマンド表は、画面の明るさを調整するコマンドですが、これを設定してみます。

f:id:mohran:20170902012151j:plain


「Co=1」 で送信すると、データバイトの次に再度コントロールバイトを送信する必要があります。

#!/usr/bin/perl -w

$cmd  = 'i2cset -y 1 0x3c ';
$cmd .= '0x80 ';  # コントロールバイト Co=1, D/C#=0
$cmd .= '0x81 ';  # データバイト 明るさ設定
$cmd .= '0x80 ';  # コントロールバイト Co=1, D/C#=0
$cmd .= '0xff ';  # データバイト 明るさ最大値
$cmd .= 'i';

system($cmd);


「Co=0」で送信すると、データバイトを連続して送信することができます。

#!/usr/bin/perl -w

$cmd  = 'i2cset -y 1 0x3c';
$cmd .= '0x00 ';  # コントロールバイト Co=0, D/C#=0
$cmd .= '0x81 ';  # データバイト 明るさ設定
$cmd .= '0xff ';  # データバイト 明るさ最大値
$cmd .= 'i'

system($cmd);

特に理由が無ければ常に「Co=0」で送信していて問題無いと思います。

■ 画面構成

画面の構成ですが、「SSD1306」は縦8画素x横128画素を1ページとして、8ページ構成になっています。

f:id:mohran:20170902182600j:plain

ページ(縦位置)とカラム(横位置)を指定してから、コントロールバイトの「D/C#」へ「1」をセットして画像データを送信することで、指定した座標から画像が表示されます。
縦8画素はちょうど1Byteなので、1ByteのうちLSBが画面上側、MSBが画面下側となっています。

f:id:mohran:20170902182613j:plain

■ アドレッシングモード

画像データを送信して、表示する方法として3種類のモード(アドレッシングモード)があり、コマンド「0x20」の後に送る値で指定します。

f:id:mohran:20170902182628j:plain

「0x00」Horizontal Addressing Mode
f:id:mohran:20170902182642j:plain
右方向に表示が進み、指定したカラム位置まで進むと次のページへ進みます。

「0x01」Vertical Addressing Mode
f:id:mohran:20170902183020j:plain
縦方向に表示が進み、指定した最終ページまで進むとカラム位置が右に1画素進みます。

「0x02」Page Addressing Mode
f:id:mohran:20170902183236j:plain
Horizontalと同じく右方向に進みますが、次のページには進まずに同じページ内でループします。

HorizontalモードとVerticalモードでは、カラム位置の指定はコマンド「0x21」で指定し、ページ位置は「0x22」で指定します。

「0x21」の後に送る1Byte目で開始カラム位置、次の1Byteで最終カラム位置を0~127の範囲で指定します。
f:id:mohran:20170902192612j:plain

「0x22」の後に送る1Byte目で開始ページ位置、次の1Byteで最終ページ位置を0~7の範囲で指定します。
f:id:mohran:20170902192626j:plain

Horizontalモードで、0x21 0x02 0x7d 0x22 0x01 0x06 と送ることで、このような順序で表示されます。
f:id:mohran:20170902193541j:plain


Pageモードでは、座標指定の方法が変わります。
「0xB0」~「0xB7」の1コマンドでページ位置を指定します。
f:id:mohran:20170902194546j:plain

カラム座標は、開始位置のみの指定となります。
「0x00」~「0x0F」で開始位置の下位4Bitを指定し、「0x10」~「0x1F」で上位4Bitを指定します。
(カラムは0~127なので、7Bitで良いはずなのですが、データシートは8Bit指定になっています)
f:id:mohran:20170902194554j:plain

以上がアドレッシングモードについてですが、座標指定に関してデータシート上はPageモードとHorizontal/Verticalモードで個別の指定方法が記載されていますが、実使用としてはモードに関係無くどちらの座標指定でも可能なようです(笑)
個人的にはHorizontalモードが一番使いやすかったのでこれだけで十分かなぁ、と思っています。

■ コンフィグレーション

pdfの下の方にあるアプリケーションノートにコンフィグレーションのフローが載っていました。

f:id:mohran:20170922230755j:plain

パネルの設定などを行っていますが、このモジュールはデフォルトの状態で使用できるので下2つの「チャージポンプ設定」と「表示On」のみ設定すれば画面が表示されます。

チャージポンプの設定はアプリケーションノートに記載されています。

f:id:mohran:20170922231631j:plain


下記のコマンドで、チャージポンプと画面表示を有効にしてみます。

#!/usr/bin/perl -w

$cmd  = 'i2cset -y 1 0x3c ';
$cmd .= '0x00 ';  # コントロールバイト Co=0, D/C#=0
$cmd .= '0x8d ';  # チャージポンプ設定
$cmd .= '0x14 ';  # チャージポンプOn
$cmd .= '0xaf ';  # 画面表示On
$cmd .= 'i';

system($cmd);

SSD1306内の画像データRAM(GDDRAM)が初期化されていないためノイズのような画面が表示されました。

これをHorizontalモードで初期化してみます。

#!/usr/bin/perl -w

$cmd  = 'i2cset -y 1 0x3c ';
$cmd .= '0x00 ';  # コントロールバイト Co=0, D/C#=0
$cmd .= '0x20 ';  # アドレッシングモード指定
$cmd .= '0x00 ';  #   Horizontalモード
$cmd .= '0x21 ';  # カラム指定
$cmd .= '0x00 ';  #   開始位置(0)
$cmd .= '0x7f ';  #   終了位置(127)
$cmd .= '0x22 ';  # ページ指定
$cmd .= '0x00 ';  #   開始ページ(0)
$cmd .= '0x07 ';  #   終了ページ(7)
$cmd .= 'i';

system($cmd);


# ゼロで初期化
$cmd  = 'i2cset -y 1 0x3c ';
$cmd .= '0x40 ';  # コントロールバイト Co=0, D/C#=1
$cmd .= '0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ';  # 8バイト
$cmd .= '0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ';  # 8バイト
$cmd .= '0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ';  # 8バイト
$cmd .= '0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ';  # 8バイト 合計32バイト
$cmd .= 'i';

system($cmd);

画像データを32バイト送信したので左上から右に32画素クリアされました。

ちなみに1度の送信でデータバイトは32バイトまでしか受け付けてくれないようで、33バイト以上だと下記のエラーが発生しました。

Error: Too many arguments!
Usage: i2cset [-f] [-y] [-m MASK] [-r] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]

これは、i2cset コマンドの制限のようで、PICなどのマイコンから制御する際は33バイト以上でも問題なく送信できました。


32バイト送信を4回繰り返して1ページ初期化。

更に7回繰り返して1画面全体を初期化することができます。


次に、ある特定の位置に表示を行ってみます。

3ページ目の30カラムから40カラムにかけて塗りつぶしてみます。

#!/usr/bin/perl -w

$cmd  = 'i2cset -y 1 0x3c ';
$cmd .= '0x00 ';  # コントロールバイト Co=0, D/C#=0
$cmd .= '0x20 ';  # アドレッシングモード指定
$cmd .= '0x00 ';  # Horizontalモード
$cmd .= '0x21 ';  # カラム指定
$cmd .= '30 ';    #   開始位置(30)
$cmd .= '39 ';    #   終了位置(39)
$cmd .= '0x22 ';  # ページ指定
$cmd .= '3 ';     #   開始ページ(3)
$cmd .= '3 ';     #   終了ページ(3)
$cmd .= 'i';

system($cmd);


$cmd  = 'i2cset -y 1 0x3c ';
$cmd .= '0x40 ';  # コントロールバイト Co=0, D/C#=1
$cmd .= '0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff ';
$cmd .= '0xff 0xff ';
$cmd .= 'i';

system($cmd);

一部分だけ塗りつぶすことができました。

このように座標位置の送信→画像データの送信の繰り返しで表示を行います。

Raspberry Piデビュー

f:id:mohran:20170830120359j:plain

秋月電子Raspberry Pi 3を買いました。

きっかけは、aitendoで見つけたこちらのOLED(有機EL)モジュール「M096P4W」です。

f:id:mohran:20170830120738j:plain

I2C通信を使って128x64のパネルを表示できるそうです。

これをPICから制御してみたいと思ったのですが、その前にI2Cの制御を簡単に行えるRaspberry Piで動かして使い方をマスターしようと考えました。

 

Raspberry Piは全く触ったことが無いので、こちらのサイトを参考にインストールを行いました。

trendy.nikkeibp.co.jp

 

以下は設定などです。

 

Raspberry PiWindowsのディスプレイを共用させたのですが、切り替えがめんどうなのでWindowsからsshでログインすることにしました。

Raspberry Piの設定画面でSSHを有効にします。

f:id:mohran:20170830130757p:plain

 

Raspberry Pi無線LAN固定IPアドレスに変更します。

$ sudo vi /etc/dhcpcd.conf

~~ こちらを追加して再起動 ~~

interface wlan0

static ip_address=192.168.xxx.xxx/24

static routers=192.168.xxx.xxx

static domain_name_servers=192.168.xxx.xxx

 

クライアントターミナルは「Tera Term (v4.95)」を使いました。

ttssh2.osdn.jp

 

インストール時のコンポーネントの選択で「Tera Term Menu」をOnにしておきます。

f:id:mohran:20170830132702j:plain

 

インストール完了後「Tera Term Menu」を実行すると右下にアイコンが現れます。

f:id:mohran:20170830133804j:plain

 

右クリックの「リスト編集」からログインサーバーのRaspberry Piを設定します。

ホスト名    : 先ほど設定したRaspberry Pi無線LAN IPアドレス

ユーザー名  : pi

パスワード  : raspberry (初期パスワード)

ttsshを使う : On

左向きの三角をクリックして登録します。

 f:id:mohran:20170830134016j:plain

 

「Tera Term Menu」の左クリックから「Pi」をクリックしてRaspberry Piにログイン完了です。

f:id:mohran:20170830135035j:plain

 

OLEDパネルの制御IC「SSD1306」について色々と調べて、なんとか文字や画像を表示させることができました。

f:id:mohran:20170830120440j:plain

f:id:mohran:20170830120447j:plain

 

青パネルでも表示させてみました。

f:id:mohran:20170830120415j:plain

f:id:mohran:20170830120431j:plain

 

SSD1306は、慣れると簡単ですが、それまでが少しとっつき難い感じのコントローラでした。

詳しい制御方法についてはそのうち纏めてみたいと思います。