【EXCEL】USB赤外線リモコンの送出

# やること
　Excelを用いて、ビット・トレード・ワン社のUSB赤外線リモコンアドバンスADIR01P(以下ADIR01P)から信号送出する。
 
 　ADIR01P詳細は下記参照。
[ADIR01P USB赤外線リモコンアドバンス | Bit Trade One, LTD](https://bit-trade-one.co.jp/product/module/adir01p/)

　また、上記以外にも下記にツールが紹介されている。
 [ホビー | Bit Trade One, LTD](https://bit-trade-one.co.jp/assemblydeskfiles/hobby/)


# 事前確認：Qiitaでの記事
　ということで、以下の検索をしたところ、7件ヒットした。(2025/04/07時点)
[「ADIR01P」の検索結果 - Qiita](https://qiita.com/search?q=ADIR01P)
　このうち2件は赤外線リモコンとは無関係であった。


## USBIR_Remote_Controller_Advance_Libraryを使用
[GitHub - bit-trade-one/ADIR01P-USB_IR_Remote_Controller_Advance](https://github.com/bit-trade-one/ADIR01P-USB_IR_Remote_Controller_Advance/tree/master) にあるものを使用したものが1件。


[すまーときりたん (Google Homeときりたんが家電を制御するよ！) #C# - Qiita](https://qiita.com/spicapaula/items/00883525fa0f08294375)
最終更新日 2017年11月27日 投稿日 2017年11月26日


## UNIX系環境用コマンドライン操作ツールを使用
[GitHub - Drunkar/bto_ir_advanced_cmd: Bit Trade One IR Remocon ADVANCE tool for Linux.](https://github.com/Drunkar/bto_ir_advanced_cmd/tree/master)　を使用したものが4件。


[Google AssistantとRaspberry Piで自宅の家電を操作する #Python - Qiita](https://qiita.com/104ki/items/9dcfe03246099d03d4dd)
最終更新日 2018年01月14日　投稿日 2017年10月29日


[USB赤外線リモコンアドバンス(BitTradeOne)をRaspberry-Piで操作する #RaspberryPi - Qiita](https://qiita.com/orihomotakanat/items/8f735a73169ea5144503)
投稿日 2017年05月24日


[Slackから自宅のエアコンを操作する #初心者 - Qiita](https://qiita.com/watari_eng/items/2f70d8bd80cd18da3f0f)
最終更新日 2019年08月06日　投稿日 2019年08月05日


[エアコンを外出先から遠隔操作(by MQTT) #Python - Qiita](https://qiita.com/Kaz-su/items/93ec120b4bb90de7da2b)
最終更新日 2019年01月24日　投稿日 2016年12月26日


# 実現方法
　USBIR_Remote_Controller_Advance_Libraryを使用する。ただし、送出するための信号は、「赤外線送信アプリ(ADIR01P_Trns_CT_v12)」で学習したものを利用する。


## 赤外線送信アプリ
　以下より入手。
[GitHub - bit-trade-one/ADIR01P-USB_IR_Remote_Controller_Advance](https://github.com/bit-trade-one/ADIR01P-USB_IR_Remote_Controller_Advance/tree/master)
![20250407_011500.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838258/25e3541e-64f2-4963-94da-10e1c2627b37.jpeg)

　取り急ぎ、手持ちのDIGAのリモコンを記録する。
 ![20250407_010000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838258/22d4d9f0-f861-4875-95bb-a75f8601a2ff.jpeg)

　エクスポートでCSVファイルに出力する。
 ![20250407_012000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838258/758b9501-e23a-40f5-9809-1753679947b9.jpeg)


## USBIR_Remote_Controller_Advance_Library
 赤外線送信アプリ同様に、以下より入手。併せてドキュメントも入手。
[GitHub - bit-trade-one/ADIR01P-USB_IR_Remote_Controller_Advance](https://github.com/bit-trade-one/ADIR01P-USB_IR_Remote_Controller_Advance/tree/master)
![20250407_012500.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838258/d49d4614-334b-4607-9a62-ceb2b8b1a7b3.jpeg)

　自分の場合は、USB_IR_Library_x64_v6.0.0.0.zipを使用し、「USB_IR_Library.dll」を C:\ に置いた。

　EXCELでエクスポートされたCSVファイルを開き、以下を使用する。
```vb:USB_IR_RCAL_x64_64bit
Option Explicit
'GitHub -bit - trade - one / ADIR01P - USB_IR_Remote_Controller_Advance
'https://github.com/bit-trade-one/ADIR01P-USB_IR_Remote_Controller_Advance
'
' DLLﾌｧｲﾙの関数定義:USB_IR_Library_x64_v6.0.0.0.zip
' 「USB_IR_Remote_Controller_Advance_Library x64 64bit 版 取扱説明書 2022/11/21 x64 版 R01」より
' 以下の事例では、USB_IR_Library.dll は C:\ に置いている
' ("USB_IR_Library.dll"として、C:\Windows\System や C:\Windows\System32 に置いても良い)
Declare PtrSafe Function openUSBIR Lib "C:\USB_IR_Library.dll" (ByVal hRecipient As LongLong _
) As LongLong       ' USB IR Remote Controller Advance と接続をします。
Declare PtrSafe Function closeUSBIR Lib "C:\USB_IR_Library.dll" (ByVal HandleToUSBDevice As LongLong _
) As Integer        ' USB IR Remote Controller Advance との接続を切断します。
Declare PtrSafe Function writeUSBIRData2 Lib "C:\USB_IR_Library.dll" ( _
    ByVal HandleToUSBDevice As LongLong, _
    ByVal freq As Long, _
    ByRef data As Byte, _
    ByVal bit_len As Long _
) As Integer        ' USB IR Remote Controller Advance から赤外線コードを送信します。
' Windows API
Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String _
) As LongPtr

' グローバル変数でハンドルを保持
Dim gHandleToUSBDevice As LongLong


Sub CallOpenUSBIR()
    Dim hRecipient As LongLong
    hRecipient = FindWindow("XLMAIN", vbNullString)
    gHandleToUSBDevice = openUSBIR(hRecipient)
    If gHandleToUSBDevice <> 0 Then
        MsgBox "openUSBIR関数が成功しました。ハンドル: " & gHandleToUSBDevice
    Else
        MsgBox "openUSBIR関数の呼び出しに失敗しました。"
    End If
End Sub


Sub CallCloseUSBIR()
    Dim closeResult As Integer
    If gHandleToUSBDevice = 0 Then
        MsgBox "openUSBIR関数をcloseUSBIR関数より先に実行してください。"
        Exit Sub
    End If
    closeResult = closeUSBIR(gHandleToUSBDevice)
    If closeResult = 0 Then
        MsgBox "closeUSBIR関数が正常に実行されました。"
        gHandleToUSBDevice = 0
    Else
        MsgBox "closeUSBIR関数の実行中にエラーが発生しました。エラーコード: " & closeResult
    End If
End Sub


Sub CallWriteUSBIRData2()
    Dim i As Single
    Dim j As Single
    j = 1                           ' ADIR01P_Trns_CT_v12のNo.1 (1行目)
    Dim freq As Long
    freq = Cells(j, 2)              ' 一般的なリモコンの周波数は、38kHz
    Dim irData(0 To 9599) As Byte
    For i = 1 To Cells(j, 3)
        irData(i * 2 - 2) = CStr(Val("&H" & Mid(Cells(j, i + 3), 3, 2)))
        irData(i * 2 - 1) = CStr(Val("&H" & Mid(Cells(j, i + 3), 5, 2)))
    Next i
    Dim bit_len As Long
    bit_len = Cells(j, 3) * 2
    Dim result As Integer
'    Debug.Print "ハンドル: " & gHandleToUSBDevice
'    Debug.Print "周波数: " & freq
'    Debug.Print "データ長: " & bit_len
'    For i = LBound(irData) To bit_len
'        Debug.Print "irData(" & i & ") = " & irData(i)
'    Next i
    result = writeUSBIRData2(gHandleToUSBDevice, freq, irData(0), bit_len)
    If result = 0 Then
        MsgBox "writeUSBIRData2関数が正常に実行されました。" & Cells(j, 1)
    Else
        MsgBox "writeUSBIRData2関数の実行中にエラーが発生しました。エラーコード: " & result
    End If
End Sub

Sub Main_SendIR()
    Call CallOpenUSBIR
    Call CallWriteUSBIRData2
    Call CallCloseUSBIR
End Sub
```
Main_SendIRを使用すると、DIGAの電源が切り替わった。