Arduino + MAX7219 + 1088AS 8×8 matrix LED + MIDI でパターン表示

手持ちしていました 1088AS 8×8 matrix LED とコントローラー MAX7219 の DIG/SEG 配線にちょっと手こずりましたので備忘録です。最終的に出来上がったシールドは MIDI と接続してみました。:)

MAX7219 データーシート

MAX7219/MAX7221は、コンパクトなシリアル入力/出力コモンカソードディスプレイドライバで、マイクロプロセッサ(μP)と、最大8桁の7セグメント数字LEDディスプレイ、バーグラフディスプレイ、または64の個別LEDをインタフェースします。

Arduino の LedControl ライブラリサンプルで MAX7219 をふたつ接続した場合は次のようになると思います。

LedControl lc = LedControl(12, 11, 10, 2);
1088AS MAX7219 Arduino 備考
1 3  DIG 4
2 5  DIG 6
3 14  SEG A
4 16  SEG B
5 8  DIG 7
6 23  SEG D
7 10  DIG 5
8 6  DIG 2
9 2  DIG 0
10 20  SEG C
11 21  SEG E
12 7  DIG 3
13 22  SEG DP
14 11  DIG 1
15 15  SEG F
16 17  SEG G
1 12  DIN
4 GND
9 GND
12 10 MAX7219#2 の LOAD(CS) も
13 11 MAX7219#2 の CLK も
18 ISET (LED 電流制限 10KΩ)
19 Vcc 0.1μF(+10μF)のパスコン入れる
24 MAX7219#2 の DIN(1) へ

1088AS は型番が書いてある真ん中にとんがりがある方が下で、左下が 1pin となり、あとは IC といっしょで反時計回りに 1, 2, 3pin となります。(右上が 9pin、左上が 16pin)

Arduino MEGA のシールドにマトリクス LED と MAX7219 をそれぞれ 2つ実装してみました。(狭いので半田付けが結構厳しかったです…)

出来上がったシールドの活用として、Arduino の ATmega16u2 側のファームを Midi Firmware for Arduino Uno (Moco) で書き換え MIDI USB デバイスにし、プログラムをかいて MIDI IN をひろって 8×8 LED でパターン表示できるようにしています。 🙂

反応も良くてなかなか良い感じです!ヒョー

Visual Studio Code extension for Arduino で電子工作

Visual Studio Code Advent Calendar 2017 の 13日目の記事です。 🙂

昨日の「Visual Studio Code の PHP 言語サポート vscode-php-intellisense 2017年版」に続きまして今日は VS Code と Arduino による電子工作です。

なんだか今年は趣味の電子工作をよくしていた年だったように思いますが、そんな中でも我らが VS Code が活躍してくれました。

Microsoft 謹製 “Visual Studio Code extension for Arduino” という思わぬ伏兵のリリースにびっくりしてしまいましたが、IntelliSense が使える快適なマイコンプログラミングができるようになりました。 🙂

この記事は Windows と Linux で動作することを確認しています。(シリアルポートドライバーの関係で電子工作では  macOS を使う機会がなかったのでした…)

準備

vscode-arduino は、VS Code 上で Arduino のマイコンプログラミングを可能にする拡張です。vscode-cpptools と依存関係があり、C++ の IntelliSense と Arduino 操作が協調して動作します。

Arduino のコンパイラや転送ソフトウェア自体は Arduino IDE に含まれるものが使われますので Arduino IDE の導入が必要です。導入された Adruino IDE は vscode-arduino により自動的に認識されます。

Arduino IDE と vscode-arduino 拡張の導入後、vscode-arduino の次の基本設定を “Default” から “Tag Parser” に変更してください。

{
    "C_Cpp.intelliSenseEngine": "Tag Parser"
}

Arduino の C like なソースコードは include することなく標準ライブラリが使えるようになっていますが、Default パーサーの場合は厳密にソースコードで #include <Arduino.h> などとしないとパースできず IntelliSense が効きません。

このことから “Fuzzy” な検索が出来る “Tag Parser” を使うことでこれを解決してあげます。

ここまでの準備ができたら、空のフォルダを vscode で開き、Arduino のソースファイルとなる空の hogehoge.ino ファイルを作成し開くと vscode-arduino が活動を開始します。(ステータスバーに Arudino の情報がでれば OK です)

Visual Studio Code extension for Arduino

空の hogehoge.ino ファイルができたらまずはターゲットとなる Arduino ボードの設定をします。

F1 キー押下後 “Arduino Board Config” を選択してください。

設定画面がでますので、ターゲットとなるボードを選択します。

選択後、プロジェクトフォルダに .vscode と 2つのファイルが作成されます。

  • arduino.json – Arduino の設定情報が入ります。
  • c_cpp_properties.json – C/C++ パーサーの設定情報が入ります。

c_cpp_properties.json を開き、Arduino IDE の位置を正しく自動認識して brows.path に設定されていることを確認してください。

"browse": {
    "limitSymbolsToIncludedHeaders": false,
    "path": [
        "C:\\Users\\hirom\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.19\\cores\\arduino"
    ]
}

先に設定した “C_Cpp.intelliSenseEngine”: “Tag Parser” では、解析の設定に brows.path が用いられます。外部ライブラリなどで IntelliSense が正しく働かない場合は、この部分にパスを追加してみてください。(なお Default パーサーでは “includePath” が使われるようです)

では早速ソースコードを書いてみましょう。

IntelliSense やコードレンズが効いて良い感じです。標準の Arduino IDE は補完がサポートされておらず、また Java / Swing でできていることもありフォントなども綺麗にでませんでしたが、vscode-arduino なら全て解決で嬉しくなってしまいます 🙂

最後に Arduino へのプログラムの転送ですが、 “Arduino Board Config” と同様に F1 キーから “Arduino Select Serial Port” で接続先の COM (/dev/ttyUSB) を指定した後、”Arduino Upload” をすれば OK です。

シリアルモニターも同じ操作から “Arduino Open Serial Monitor” で起動可能です。

hexdump for VS Code

vscode-arduino とは直接関係ありませんが、hexdump for VS Code 拡張が便利でしたので合わせて紹介します。

マイコンプログラミングをしているとバイナリデーターと格闘しなくてはいけないことがありますが、hexdump for VS Code は VS Code 内でバイナリ表示・編集を可能にする拡張です。

VS Code エクスプローラーのファイル右クリックコンテキストメニューが拡張され、”Show Hexdump” できるようになります。表示されたバイナリではカーソル選択による “Hex Inspector” が使え、選択値の各種長さの 10進数表現を見たり、右クリックメニューから 1byte 単位の編集が行えます。(便利!)

VS Code で電子工作

今年は実際に Visual Studio Code extension for Arduino を活用して、数台の電子工作を行ってみましたが、トラブルもなく非常に快適でした。

では最後にそんな中の 1台の “未来ガジェット” の紹介をして今年の VS Code Advent Calendar 2017 の担当分を終わろうと思います。 3日間に渡りすいませんでした。

また来年。

# 動画中 vscode-arduino のコンソールが文字化けしているのは半年ほど前の古いバージョンの不具合で、現在は修正されています。:)

未来ガジェット 3号 “古の電子オルゴール”

何十年前ものPC ゲーム少年達を魅了したYAMAHA のシンセサイザー LSI YM2151 で、今再び楽曲を奏でるという、未来ガジェットと呼ぶにふさわしい趣味の一品。

YM2151 は YAMAHA 自身が iOS でエミュレーターをつくるなど、今なお多くの人を魅了する FM 音源と呼ばれるシンセサイザーで、暖かみのあるエレピやゲーム向きのエッジの効いた音が発声できることを特徴としています。

発売から数十年経過し、当然生産終了しているこの LSI を海外ルートから取り寄せ、先人が残した情報を元に回路を再現。オルゴールの盤面ともいえる ROM に格納した楽曲データーをマイコンから LSI に送信することで発声させています。

特にマイコン側の制御ソフトウェアが難しかったですが、小中学校時代に毎夜毎晩打ち込んでいた MML を思い出しながら、ついに楽曲が奏でられた時は泣きそうになったのでした。

この作品は基板が小さく、自分の腕前ではデジタル側とアナログ側の GND をうまく分離できず、よく聴くとチリチリと裏でデジタルノイズが鳴ってしまっているのですが、小学生の頃 PC から奏でられていた楽曲にも同じノイズが乗っていたことがフラッシュバックしタイムリープ寸前に。

いつか僕らが未来振り返る時には。骨董品を極めた作品となりました。

関連

Visual Studio Code の PHP 言語サポート vscode-php-intellisense 2017年版

Visual Studio Code Advent Calendar 2017 の 12日目の記事です。 🙂

昨日の「フロントエンド技術を導入した Java ウェブアプリケーション開発」に続きまして今日は PHP です。

実は昨年の Visual Studio Advent Calendar 2016 でも vscode-php-intellisense について書かせていただいておりましたが、2016年 12月時点ではユーザー定義関数の IntelliSense が git master ブランチ上にはあったものの未リリースの段階でした。(VS Code 側の対応待ちがあった)

1年経ちましてユーザー定義関数の補完も無事動作するようになり、また PHP パーサーが Microsoft 謹製のものに変わるなどパフォーマンスを大幅にあげ、実際のプログラミングで活用されている方も多くなったように思います。

準備

vscode-php-intellisense は、同じ作者の方が PHP 7 で実装された php-language-server が使われています。このためお使いの OS に PHP 7.0 以上が導入されている必要があります。

コマンドライン・ターミナルから php -v コマンドを実行し次のようになっていれば使い始められます。(Windows / powershell.exe の例)

PS C:\> php -v
PHP 7.0.13 (cli) (built: Nov 8 2016 13:45:28) ( ZTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

OS (パス)の実行環境を変えたくないよという方は、VS Code の基本設定の次のキーに PHP 7 実行ファイルへのパスを設定してください。優先して使われるようになります。

{
  "php.executablePath": "...."
}

また、VS Code 内蔵の PHP サポートが有効になっていると IntelliSense が混乱しますので無効に設定してください。

{
  "php.suggest.basic": false
}

これにて準備完了です。 PHP プロジェクトのフォルダを VS Code で開き、いずれかの .php ファイルを開くと php-language-server が浮き上がり vscode-php-intellisense の機能が使えるようになります。

拡張の起動ログは「出力」の PHP Language Server から見ることができます(パースが完了すると IntelliSense が使えるようになります。Microsoft の PHP パーサーになってからかなり速くなりました!)

ログを確認すると分かりますが、現在のところパース対象の .php ファイルの大きさが 150000byte に制限されています。 例えば WordPress では制限容量を超えたファイルがいくつか存在し、IntelliSense の対象から外されてしまいますので、拡張のファイルを直接書き換えて対応してください。

Windows の場合

C:\Users\[ユーザー名]\.vscode-insiders\extensions\felixfbecker.php-intellisense-2.0.4\vendor\felixfbecker\language-server\src\PhpDocumentLoader.php

macOS / Linux の場合

~/.vscode-insiders/extensions/felixfbecker.php-intellisense-2.0.4/vendor/felixfbecker/language-server/src/PhpDocumentLoader.php

ソースファイルを 150000 で検索し、300000 くらいにすれば OK です。

    public function load(string $uri): Promise {
        return coroutine(function () use ($uri) {
            $limit = 150000; // ここを修正します

拡張のソースファイルを直接書き換えているため、バージョンアップがあると上書きされます。(再設定してください)

設定から limit が調整できるようなプルリクが届いていますので、近い将来改善されることを期待しています。(実は結構前のプルリクで進展がないのですが… 😛

以上で拡張を使う準備完了です。

PHP IntelliSense

ユーザー定義系の補完以外は去年紹介しましたので、今年はユーザー定義系のIntelliSense を確認してみます。

WordPress プロジェクトをサンプルに、テーマをコーディングしている想定です。

add_filter は WordPress が定義するグローバル関数ですが正しく IntelliSense できています。

ちなみに PowerShell の拡張などでは次のように引数のホバーを確認しながら入力を進めことができますが、残念ながらこの動きは vscode-php-intelliSense では未実装です。(TODO に入っていますので期待です!)

と思っていたら、昨日のアップデートで実装されてしまいました!

素晴らしい…

IntelliSense 確定後はコードレンズ(定義をここに表示)でシグネチャーを確認できますので、こちらで代用すると良いと思います。

残念ながら PHP の標準関数はコードレンズできませんので、カーソルホバーで確認しましょう。 🙂

PHP は動的型付け言語ですので、完全な型参照はできなく IntelliSense の対応もある程度までになりますが、コメントアノテーションや PHP 7 の型定義で補完が効くようになります。

class Test {
    /** @var wpdb */
    private $wpdb1;

    /**
     * @param wpdb $wpdb2
     */
    public function hoge($wpdb2) {
        $this->wpdb1->query(); // OK!

        $wpdb2->query(); // OK!

        /** @var wpdb $wpdb3 */
        global $wpdb3;
        //$wpdb3->; 無念...
    }
}

例にしている $wpdb は WordPress がグローバルに定義する DB のアクセサです。

  • PHPDoc 付き private メンバーの $wpdb1 は補完 OK!
  • PHPDoc 付きメソッドパラメーターの $wpdb2 は補完 OK!
  • メソッド内のインラインコメントアノテーション $wpdb3 は補完できず

という結果でした。

ちなみに、Eclipse PDT や PhpStome ではインラインコメントアノテーションも OK です。このアノテーション方式が何かしらの規格なのかは存じ上げませんがもしかすると将来対応されるかもしれませんね。 🙂

VS Code で PHP

ここ 1年ほど PHP は全て VS Code と vscode-php-intelliSense でコーディングしましたが、VS Code の操作系ともマッチしており快適に作業を進めることが出来ました。

また、昨日紹介しましたが、VS Code は昨今のフロントエンド系の技術との親和性が高いため、PHP などのウェブアプリケーションと相性が良いです。合わせて使うと強力な相棒となってくれることと思います。