銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

C# でUSB-IO2.0 (AKI)を操作する (1) LED点灯

さて準備ができたので、C#からLEDを点灯させたいと思います。

tech.tanaka733.net

VBですがサンプルコードがあるのでそれを参考にできるのと、こちらに仕様があります。

km2net.com

がHIDについてあまり詳しくない私のような場合はPythonでの操作について書かれたこちらの記事の方がわかりやすかったです。

qiita.com

さて、VBのサンプルコードではhid.dllなどのAPIを直接実行しているので、C#からP/Invokeすれば同じことができるはずです。が、そんなコードを一から書きたくないと思って検索するとHidLibraryというライブラリがあるのを見つけました。なんと、.NET Standard対応までされています。

github.com

というわけでHidLibraryを使ってコードを書いていきます。今後複雑な操作をさせるために操作用のクラスUSBIO2Deviceを作ることにします。

HidDevices.EnumerateでVendorIdとProductIdを指定すると、指定した接続デバイスの一覧が返ってきます。VendorIdとProductIdの値は仕様書に書いてあります。SendAndReceiveメソッドでJ1側の端子とJ2側の端子に出力される値を指定しています。

using HidLibrary;
using System;
using System.Linq;

namespace HIDLabs.AkiUSBIO2.Library
{
    public class USBIO2Device : IDisposable
    {
        private const int VendorId = 0x1352;
        private const int ProductId = 0x121;

        public static HidDevice[] ListDevices() => HidDevices.Enumerate(VendorId, ProductId).ToArray();

        public static USBIO2Device Connect(HidDevice device) => new USBIO2Device(device);

        public static USBIO2Device Connect(HidDevice device)
        {
            return new USBIO2Device(device);
        }

        public static USBIO2Device Connect()
        {
            var device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();
            if (device == null)
            {
                throw new InvalidOperationException("Deviceが見つかりません");
            }
            return new USBIO2Device(device);
        }

        bool disposed = false;
        readonly HidDevice device;

        private USBIO2Device(HidDevice device)
        {
            this.device = device;
        }

        public void Dispose()
        {
            // Dispose of unmanaged resources.
            Dispose(true);
            // Suppress finalization.
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposed)
                return;

            if (disposing)
                device.Dispose();

            disposed = true;
        }

        public (byte j1, byte j2) SendAndReceive(byte j1, byte j2)
        {
            var sendData = new byte[64];
            sendData[1] = 0x20;
            sendData[2] = 0x1;
            sendData[3] = j1;
            sendData[4] = 0x2;
            sendData[5] = j2;
            var res = device.Write(sendData);
            if (!res)
                throw new InvalidOperationException("送信に失敗しました");

            var receiveData = device.Read();
            if (receiveData.Status != HidDeviceData.ReadStatus.Success)
                throw new InvalidOperationException($"受信に失敗しました: {receiveData.Status}");
            return (receiveData.Data[2], receiveData.Data[3]);
        }
    }
}

J1の0番端子の出力をOFF、ON繰り返すコードがこのようになります。すべてONが0xFFで、n番端子をOFFにするためには0xFF XOR 2^(n+1)の値を書き込めばよいです。なお、HidLibraryにはHIDに対するほかの操作ができるメソッドが用意されていますが、USB-IO2.0に実行すると対応していないというエラーがかえってきました。

using HIDLabs.AkiUSBIO2.Library;
using System;
using System.Threading.Tasks;

namespace HIDLabs.AkiUSBIO2.ConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello USB IO2.0!");

            using var device = USBIO2Device.Connect();

            for (int i = 0; i < 10; i++)
            {
                device.SendAndReceive(0xFF ^ 1, 0xFF);
                await Task.Delay(TimeSpan.FromMilliseconds(100));
                device.SendAndReceive(0xFF, 0xFF);
                await Task.Delay(TimeSpan.FromMilliseconds(100));
            }
            device.SendAndReceive(0, 0);
        }
    }
}

こんな感じで実際に点滅します。(パラメーターがサンプルコードと違う気がしますが...)

C# でUSB-IO2.0 (AKI)を操作する (0) 準備

以前、Raspberry PiでLEDを光らせたことがあったのですが、意外と周辺機器をつなぐのにお金がかかるのと、デバイス側にプログラム仕込みたいというよりPC側で制御したいという気持ちが強かったので、USBデバイスとして制御できるものを探していました。すると、USB-IO2.0 (AKI)というものを見つけました。USBのHID (Human Interface Device)として動作する基盤で、USB経由で5Vの出力が可能なのでそのままLEDを光らせることができます。

km2net.com

実際の購入は秋月電子通商から行います。

akizukidenshi.com

購入すると、こんなものが入っています。本体と、端子、サンプルプログラムが入っているCD-ROMです。なお、USB端子はmini-Bなのでもし持っていない場合は別途購入する必要があります。

f:id:tanaka733:20200430230357j:plain

本体に端子をつけるにははんだ付けが必要です。付属の端子を8ピンずつ切断し、両サイドにはんだ付けします。また、折れ曲がっている端子は5ピン分に切断してはんだ付けします。

f:id:tanaka733:20200430232820j:plain

さて、付属のサンプルアプリは.NET Framework 3.5が必要です。Windows 10では.NET Framework 3.5をインストールして起動するか、プロジェクトが付属しているのでVisual Studioで最新の形式に変換してビルドすると起動できます。なのですが、付属のアプリはVB製なので、次回はC#で操作できるようプログラムを書いてみたいと思います。

TeamsとSlackとVisual Studio Live ShareによるASP.NET Coreオンラインハンズオンの参加準備

この記事は、今度予定しているC# Tokyoでのオンラインハンズオンの準備を説明しています。C# TokyoではSlackをコミュニケーションの中心にしているので、SlackのチャットとTeamsのオンライン会議を分けていますが、ほかのケースではどちらかに統一したりするのもいいでしょう。

C# TokyoのSlackに参加する

質疑応答などテキストベースのやりとりはSlackを使うのでC# TokyoのSlackに参加してください。こちらのページの最下部にリンクがあります*1

csharp-tokyo.connpass.com

Teams会議にゲストアクセスする準備をする

Teams会議にはWebブラウザもしくはアプリから参加できます。参加方法についてわかりやすいリンクがあったのでご紹介します。

www.slideshare.net

今回はハンズオンなので、Teams会議はスマホから視聴して、PCはコーディングに使う、といった使い分けをしてもいいかもしれません。

Live Shareの環境を準備する

Live ShareはVisual Studio 2019、Visual Studio Code、さらにプレビューでWebブラウザで参加できます。ゲスト参加の場合は認証いりませんが、セッションをリクエストする場合は必要なのでMicrosoftアカウント、もしくはGitHubアカウントによる認証をお願いします。

visualstudio.microsoft.com

Visual Studioの場合

Live Share機能はVisual Studio 2019に含まれているはずです。コードなしでVisual Studioを開き、Live Shareビューを表示されていない場合、表示メニューから表示します。

f:id:tanaka733:20200419110121p:plain

次に、https://prod.liveshare.vsengsaas.visualstudio.com/join?885A5D488918739D76530D97E67263AC52AB といったURLを共有しますので、セッションに参加するアイコンをクリックし、URLをペーストして結合をクリックします。

f:id:tanaka733:20200419110319p:plain

f:id:tanaka733:20200419110456p:plain

するとこのように表示されます。今回は読み取り専用で共有する予定です。

f:id:tanaka733:20200419110905p:plain

自分の環境で開発する場合は、新たにウィンドウを立ち上げてそちらで作業を行います。そこでわからないことがあった場合、講師とヘルプ担当の人にLive Shareで自分の環境を見てもらえるようにする予定です*2。その場合、Live Shareビューでセッションの開始をクリックします*3

f:id:tanaka733:20200419111326p:plain

すると共有用のURLが自動でクリップボードにコピーされます。もう一度コピーしたい場合は、停止アイコンの右側のメニューからコピーメニューをクリックします。停止アイコンから提出するとLive Shareを終了します。

f:id:tanaka733:20200419111456p:plain

Visual Studio Codeの場合

まず、Live Share Extension Pack拡張機能をインストールします。

marketplace.visualstudio.com

参加する場合、新規にウィンドウ左端の拡張機能アイコンでLive Shareを選び、Join Collaboration Sessionを選びます。

f:id:tanaka733:20200419114825p:plain

共有したURLを入力します。

f:id:tanaka733:20200419114928p:plain

Visual Studio Codeの場合、ホスト側が開いているファイルを自動的に開く機能はないので、参加側で手動で開いてください。開いたファイルの中身は自動的に同期されます。

f:id:tanaka733:20200419115145p:plain

ヘルプが必要な場合は自分の環境でLive ShareのメニューからStart Collaboration Sessionを選びます。

f:id:tanaka733:20200419115207p:plain

リンクをコピーや終了するメニューはここにあります。(Macでスクショをとるとアイコンが消えるので位置だけ)

f:id:tanaka733:20200419115627p:plain

.NET Core SDKをインストールする

こちらのサイトから.NET Core SDK 3.1をインストールしてください。

dotnet.microsoft.com

*1:URLがたまに失効して都度更新しているので直リンクではないです

*2:参加者とヘルプ担当の人数次第

*3:読み取り専用の場合、こちらでコードを編集できないです。