2021年04月

2021年04月16日

SPI接続のスマートウォッチ用ディスプレイをnRF52840 Express で動かす

Aliexpress で見つけたスマートウォッチ用のディスプレイをAdafruit ItsyBitsy nRF52840 Express にて動かす方法です。

Evernote にいろいろと調べてやり方などをメモしていますが、Blog に書くのもたまには良いかと思って書いていきます。

前提

Adafruit ItsyBitsy nRF52840 Express を使うために必要な設定はここでは触れませんので、適宜インストールなどを行ってください。

使用するディスプレイ

Aliexpress で見つけたスマートウォッチ用のディスプレイです。外観は下記のようなものとなっています。
SPI 接続で使える状態のものなのでお手軽に使うことができます。

20210412_1



このディスプレイはコントローラーにGC9A01 を使っておりそれに対応したライブラリを使うと楽に操作が行えるでしょう。 入力電圧については3.3V をそのまま接続できるため、下記ボードの3.3V を配線しました。

Adafruit ItsyBitsy nRF52840 Express で使うにあたって

Arduino IDE やその他の方法でライブラリのインストールを行います。
今回使うライブラリはArduino GFX Graphics library です。
もし、ライブラリマネージャーからインストールする場合には下記のライブラリを検索してください。


20210412_2



Adafruit にもAdafruit GFX Library がありますが、Arduino の方がソースコードが分かりやすかったためこちらを使うことになりました。とはいってもソースコードをたどるとAdafruit のライブラリを参考にしていたりそこにたどり着くのですが……

各ピンの接続

Adafruit ItsyBitsy nRF52840 Express ディスプレイ(GC9A01)
GND GND
3V VCC
SCK(4) SCL
MOSI(3) SDA
空いているIO(RESとして使う) RES
空いているIO(DCとして使う) DC
空いているIO(CSとして使う) CS
空いているIO BLK

BLK はバックライトのオンオフのためのピンとなっています。面倒なときは解放状態でも問題ありません。
今回はCS を7ピンに、DC を10ピンにRES を9ピンにそれぞれ繋ぎました。

ソースコード

下記のソースコードはArduino GFX Graphics library を入れると一緒に手に入るサンプルコードのHelloWorld を今回の接続に合わせて変えたものです。
出力フォントについては今回は触れません。詳しく知りたい方はArduino_GFX クラスにあるsetFont まわりを調べてください。

/******************************************************************************* * Start of Arduino_GFX setting ******************************************************************************/ #include <Arduino_GFX_Library.h> // Definition for GPIO. #define TFT_CS 7 #define TFT_DC 10 #define TFT_RST 9 // #define TFT_BL 6 // General hardware SPI Arduino_DataBus *bus = new Arduino_HWSPI(TFT_DC, TFT_CS); // GC9A01 IPS LCD 240x240 Arduino_GC9A01 *gfx = new Arduino_GC9A01(bus, TFT_RST, 0 /* rotation */, true /* IPS */); /******************************************************************************* * End of Arduino_GFX setting ******************************************************************************/ void setup(void) { gfx->begin(); gfx->fillScreen(BLACK); #ifdef TFT_BL pinMode(TFT_BL, OUTPUT); digitalWrite(TFT_BL, HIGH); #endif gfx->setCursor(10, 10); gfx->setTextColor(RED); gfx->println("Hello World!"); delay(5000); // 5 seconds } void loop() { gfx->setCursor(random(gfx->width()), random(gfx->height())); gfx->setTextColor(random(0xffff)); gfx->setTextSize(random(9) /* x scale */, random(9) /* y scale */, random(3) /* pixel_margin */); gfx->println("Hello World!"); delay(1000); // 1 second }

表示されるもの


20210412_3



こんな感じに表示されます。サンプル通りです。

続きを読む

rabbitcats at 18:00|PermalinkComments(0) プログラミング | circuit

2021年04月13日

【VSCode】mdwiki をスムーズに閲覧する方法

大規模なWiki システムは必要ないけれども、ちょっとしたことを階層的にまとめるのにちょうどいいmdwiki ですが、最近ではブラウザで手元のmdwiki.html を開いても正しく表示されないことがあります。

そんな時にVSCode の拡張であるLive Serverを使うことでスムーズに閲覧することができます。

使い方

上記リンク先を見てもらえばわかるので詳しい方法は割愛します!
簡単に言えば、mdwiki.html ファイルをVSCode で開いて、画面下の「Go Live」を選択してアクセスするか、コマンドパレットから「>Live server: Open with Live Server」を選択してアクセスすることで閲覧できます。

それでは良いmdwiki ライフを!



rabbitcats at 20:00|PermalinkComments(0) ソフトウェア | プログラミング

2021年04月09日

【Googleスプレッドシート】INDIRECTとADDRESSとMATCHを使って値を取得する

タイトルが仰々しい感じではありますが、買い物をした時の商品の値段や購入場所、日付などをgoogleスプレッドシートに追加していき、最安値とその価格を良い感じに抜き出したかったのが発端です。

いろいろと調べてみるとVLOOKUPで抜き出す方法が最初に目につきますが、それでは使い勝手が少し悪く、INDEXとMATCHを使った方が良いよとの記事もありましたがなかなか上手くできなかったのでタイトルの関数たちで実現することになりました。

ちなみに検索していたら、相互リンクしている「ソースに絡まるエスカルゴ」さまのページにたどり着いたので記事を参考に同じように解説していこうと思います。

表データの準備

まずは取得したい表データを準備します。表データはGoogleスプレッドシートにて作成しています。
作成した表は下記のとおりです。買い物(や価格調査)をするたびに行数を増やしていくことになります。

日付 場所 ツナ缶 鯖缶 おでん缶
1977/04/08 村上商店 288 358 379
1977/05/13 松井商店 250 381
1977/06/21 スーパー北斗 360 360

実際に作成した表は下記のような感じです。購入していない(価格を調べていない)ところは空白になっています。

20210408_1

各商品の最安値とそれを購入した場所を調べる

やり方は下記のとおりです。

まずはおでん缶の最安値を探します。単純にMIN 関数で良いでしょう。

=MIN(E2:E)

これを例えばセルG2に入れておきます。

次に最安値をキーとして最安値の場所を良い感じに調べます。

=INDIRECT(ADDRESS(MATCH(G2,E:E,0),2,1,TRUE))

やっていることはMATCH 関数でE列の中から最安値と一致する行番号を探し、ADDRESS 関数で行番号と列番号(2はB列のこと)からアドレス値"$B$2"文字列を作成し、INDIRECT 関数にてアドレス値の文字列からセル参照を取得します。
結果として下記の画像のように良い感じに値の取得ができます。


20210408_2



各関数の詳しい説明については下記を参照してください。

MATCH - ドキュメント エディタ ヘルプ

ADDRESS - ドキュメント エディタ ヘルプ

INDIRECT - ドキュメント エディタ ヘルプ

VLOOKUP について

VLOOKUP - ドキュメント エディタ ヘルプの使い方を見ると下記のようになっています。

VLOOKUP(検索キー, 範囲, 番号, [並べ替え済み])

この関数では問題が2つあります。

  1. VLOOKUP では検索キーに指定したキーを範囲内から探し、"範囲内の"番号で指定した列の値しか取れないこと
    今回の表で言えばツナ缶の最安値である「250」から場所の「松井商店」を探すためには検索キーに「250」を入れ、範囲は「B1:C4」とする必要があります(今後も増える可能性を考えれば「B:C」とかにする)。
    今回のようなキーが数字で調べたい対象が文字列の場合にはすべて範囲に含めても良いですが、どちらも数字だったり文字で重複が考えられる場合は範囲に含められません。
  2. 範囲に飛び値を指定できない
    こちらは調査不足の可能性がありますが、VLOOKUP の範囲指定を場所と鯖缶だけのような指定にする方法がわかりませんでした。いちおう飛び値の指定方法として「(B:B,D:D)」のような方法がありますが、うまく動作してくれませんでした。
    また、Google スプレッドシートで配列を使用する - ドキュメント エディタ ヘルプ を参考に「{B:B,D:D}」のように新たに配列を作って検索がうまくできませんでした。
INDEX とMATCH について

これでできることについては【Googleスプレッドシート】INDEXとMATCHを使って値を取得する - ソースに絡まるエスカルゴ に詳しく書かれていますのでそちらを参考にしてください。

このやり方では問題が1つあります。

  1. INDEX 関数では範囲内からでしか値を取得できない
    VLOOKUP と同様ですね。

このやり方ではINDEX の範囲を配列を使って作成することで飛び値も良い感じに検索できるので、1に挙げた問題が気にならなければこの方法で良いと思います。

続きを読む

rabbitcats at 10:00|PermalinkComments(0) ソフトウェア