USBIOを使ってみよう

ポート1でLEDを点滅させる

USB接続デジタル入出力モジュール USB-IO2.0(AKI)をC#でコントロールする。
ハードフェアのデフォールトの設定ではポート1は8bitの出力で、ポート2は4bitの入力になっています。
以下のMainプログラムを実行するにはusbLib.dllを用います。
注意:usbLib.dllは、まだ開発途中なので、動作が不安定の可能性があります。
コンパイルをするには以下のようなコマンドを用います。

csc /platform:x86 /R:usbLib.dll usbio.cs

次のプログラムの動作は、ポート1のbit0とbit1につながっているLEDを交互に光らせ、ポート2の値を16進数で表示します。

ポート1でLEDを点滅させるプログラム usbio.cs
using System;
using System.Threading;

public class iousb
{
  public static void Main()
  {
    USBIO usb = new USBIO();
    usb.Connect();
    int val;
    while(true){
      val = usb.outIn(2,0);
      Console.WriteLine("{0,2:X2}",val>>8);
      Thread.Sleep(200);
      usb.outIn(1,1);
      Thread.Sleep(200);
    }
  }
}
 1 
 2 Sleepを使うため
 3 
 4 
 5 
 6 
 7 
 8 オブジェクトを作る
 9 接続する
10 
11 
12 入出力を同時に行うoutIn(P1, P2)
13 入力した値を16進数で表示する
14 
15 
16 
17 
18 
19 

入出力の設定をする

入出力のデフォールト値にするプログラムです。
つまり、ポート1は出力、ポート2は入力に設定します。
入力はプルアップします。
設定した場合は、USBIOの抜き差しが必要になります。

usbset.cs
using System;
using System.Threading;

public class iousb
{
  public static void Main()
  {
    USBIO usb = new USBIO();
    usb.Connect();
    usb.Setting(0x00, 0xff, true);
  }
}
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 ポート1は出力、ポート2は入力、入力はプルアップする
11 
12 


7セグメントLEDに数字を表示させる


桁の切り替えはP1のbit7で行っています。つまり、同時に二つを表示しているのではなく、高速に上下の桁を切り替えて表示するようにしています。ここでは上の桁のスイッチとして、DTC144を用い、下の桁のスイッチはその出力を2N7000で受けてスイッチしています。スイッチとして用いることかできるようなものならは何でも可とは思いますが、このスペースに入れるにはこれくらいしか無いかと思います。ただ、ここでは使っていませんが、P2を出力ポートに指定して使えば、スイッチは要らなくなります。(電流制限に依存する)


下のプログラムは7セグメントLEDに2桁の数字を表示するクラスを作るべきです。
これは課題として各自作ってみてください。

main.cs
using System;
using System.Threading;

public class IOusb
{
  USBIO usb;
  public static void Main()
  {
    new IOusb().main();
  }
  
  public IOusb()
  {
    usb = new USBIO();
    usb.Connect();
  }
  private void wait(int n)
  {
    for(int j=0; j<n; j++)
      for(int i=0; i<1000; i++);
  }
  private void digit(byte n)
  {
    byte[] pattern = 
   // 0    1    2    3    4    5    6    7    8    9
    {0x08,0x3b,0x14,0x11,0x23,0x41,0x40,0x1b,0x00,0x03 };
    
    if(n>10)
      usb.P1Write((byte)(pattern[n&0x7f]|0x80));
    else
      usb.P1Write(pattern[n]);
  }
  private void digitTwo(byte n)
  {
    byte high= (byte)(n/10);
    byte low = (byte)(n%10);
    for(int i=0; i<150; i++){ 
      digit((byte)(high | 0x80));
      wait(100);
      digit(low);
      wait(100);
    }
  }
  public void main()
  {
    while(true){
      for(byte i=0; i<100; i++) digitTwo(i);
    }
  }
}
 1 7セグメントLEDはA-551SRDを用いる
 2 アノードコモンである
 3 AAAAAA
 4 F    B
 5 F    B
 6 FGGGGB
 7 E    C
 8 E    C
 9 EDDDDC
10 
11 表示面から見ての接続
12   G F + A B
13 
14   E D + C .
15 
16 ポート1の対応表
17 7 6 5 4 3 2 1 0
18 x B A F G C D E
19 
20 
21 
22 一桁表示ルーチン
23 
24 
25 
26 数字と表示パターンの表
27 
28 
29 bit7が上位/下位のスイッチ
30 
31 
32 
33 二桁表示ルーチン
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 00~99まで繰り返し表示
48 
49 
50