HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
1224
大富豪HSPでLEDの点灯28解決


大富豪

リンク

2022/12/24(Sat) 13:30:50|NO.97576

★HSPだけでLEDの点灯

条件によって複数のLEDを
HSPの制御で点灯させたいのですが、

やはりArduinoとかが必要でしょうか。
もっとシンプルかつ簡単な方法はありますか?

例えば、
キーボードのAを押すと赤色LED点灯、
マウスの右クリックで青色LED点灯。
とか。

hspextとかhspusbio、mod_usbioを調べましたが、
なかなか・・・。



この記事に返信する


zakki

リンク

2022/12/24(Sat) 15:39:56|NO.97578

> hspextとかhspusbio、mod_usbioを調べましたが、
> なかなか・・・。

のなかなかの詳細を書くと対策や対案回答しやすいんじゃないかと思います。



大富豪

リンク

2022/12/24(Sat) 16:11:18|NO.97580

>zakkiさん
 ありがとうございます。
 プログラムの書き方というより、
 周辺ハードの導入の件の質問です;

>やはりArduinoとかが必要でしょうか。
>もっとシンプルかつ簡単な方法はありますか?

Arduinoを購入すればそれ用のソースもあるのでなんとかなりそうですが、
そうではなく、”もっとシンプルかつ簡単な方法はありますか?”
ですね。

単に”LEDをソフトウェア(HSP)で点灯制御”するだけ。
ハードが絡むと急激にハードルが上がります・・・。

LED点灯用に1.5〜5V前後の出力をHSPで制御、
という事でございますが、

USBデバイスをHSPでON/OFFできれば十分ですが、
それもどうやるのか分かりません。

※接続中のUSBデバイスを接続したままで、
ソフト的にCOMポート指定してON/OFFを切り替る。
これが出来れば解決するんですが;分かりません。



usagi

リンク

2022/12/24(Sat) 17:56:39|NO.97581

おそらくですが、Arduinoでハード自作する方がシンプルで簡単かもしれませんね。
(ピンにLEDつないでPWMで好きに変調すればよいので)

LEDとの事ですが、USBデバイスとおっしゃっているので、何かレディーメイドな物が手元にあるのかと想像してますが、
その商品の仕様が分からないとプログラムが難しいかと思われます。(使用しているIC、ピンなど)

>プログラムの書き方というより、
まずは、ハードウェアの情報収集が必要かと思いますので、
もし何かしらのUSBデバイスを購入されたのであれば、その会社へ問い合わせや、HPに仕様書があればそれを確認。
なければ、非公開の仕様ですから、ご自身で分解、リバースエンジニアリングする必要がありそうです。


>ソフト的にCOMポート指定してON/OFFを切り替る。これが出来れば解決するんですが
以前USBでつないだスイッチをCOM判定するスレがあったので、
ご使用されているのもが近しいのであれば、スイッチをLEDに置き換える形で何か参考になるかもしれません。
http://hsp.tv/play/pforum.php?mode=pastwch&num=94434


>”もっとシンプルかつ簡単な方法はありますか?”
と、上記の様な、面倒な事が多く、ハードウェアの設計込みでソフトウェアを設定する必要がありますから、
大富豪さんが仰られるとおり、ハードルが高く、
"もっとシンプルで簡単な方法"はなかなか無いかと見つからないかと思います。

ハードウェア自体が専門的で学習コストが高いものなので、
Arduinoやarduino.asは非常に簡単にできており入門によくできると思いますので試しに遊んでみるのも良いかと思います。
※私も以前試しに電光掲示板を作ってみたのですがPICの頃より非常に簡単にできて感激しました。
※例えばお使いのLED:USBデバイスが電源ピンに繋げば光る仕様なのであれば、
 Arduinoのデジタルピン0〜に好きな数つないでON/OFFするだけとか(グランドには落とす)

また、運よく”ご自身が制御したいイメージ”で作られたUSBデバイスがあれば、
それを購入してプログラムするのがもっともシンプルかつ簡単で早いかもです。
ただ、経験上はハードは使い手の理想より、ハードの仕様に合わせる形が多いと思われますし、
パーツは仕様が公開されてますが、既製品は会社も商売でやっているので仕様が公開されていないことが多く、
なかなか理想のハードウェアを見つけるのは難しいかもしれません。



大富豪

リンク

2022/12/24(Sat) 18:18:25|NO.97582

>usagiさん
りがとうございます。
やはりArduinoにたどり着きますかね;

USBシリアル変換基板(CH340E)を繋いでCOM4で認識し、
arduino_init(arduino.as)では正常に認識しましたが、

uio_find(hspusbio.as/mod_usbio.as)ですと、
ドライバーが見つからないというstatが返ります。
(win10のデバイスマネジャーではCOM4認識済み)

★シリアル変換基板の先に、
何かスイッチングだけするような簡単な基板があればいいのですが、
やはりArduinoですかね・・・

当面はLEDしかやりたい事が無いので、
購入を躊躇している状況です。


シリアルに"1"を送信すると5V供給されるとか、
単なる電源のスイッチングだけの基板が・・・。

※デバイスのON/OFFの件
基板には5V出力があるのですが、
もしかして常時出力ですかね;
(ソフト側でON/OFF出来ないとか)

それがHSP(Arduino.as)でON/OFF出来ればいいのですが、
出来ない場合はデバイスそもののを
ON/OFFすればLEDのON/OFFが出来ます。
(USB端子を物理的に抜き差しするようにソフトでON/OFF)

難しいですね・・・。



zakki

リンク

2022/12/24(Sat) 18:32:36|NO.97584

USB-IOやArduino購入無しとなると、安めのキーボード分解してkeybd_eventでCapsLockやScreenLock連打とか…逆に面倒そうですね。



usagi

リンク

2022/12/24(Sat) 19:04:12|NO.97585

>基板には5V出力
お使いの基盤に印字されているのであれば、おそらく電源ですね。常時です。(VCCとか5v,3.3v)

>USB端子を物理的に抜き差しするようにソフトでON/OFF
USBの端と端の長い端子がVCC,GNDですから、通電してますのでおそらくご希望の制御は難しいかと思います。
※余談※
 USBのハードウェア的なアイデアの凄い所で、データ線よりこの電源線を長くした事で、
 必ず先に電源がつながりますから、つなぐだけで認識するという制御をソフト返さなくても
 ハードの構造だけで実現しているのです。目からうろこですね。
 (昔は繋いでからパソコンの電源いれるのが基本、ショートの危険もありますよね)


>シリアル変換基板の先に何かスイッチング
おくそくですが、”汎用ロジックIC”という便利なモジュールがあるので
ラッチ回路をつかうとか、いろいろあるので何か組み合わせるとできるかもしれません。


また、"CH340E"モジュールとの事でこの基盤はArduinoと接続するモジュールの様なので、
Arduinoとシリアル通信を行うのが最適で汎用性が高いかとおもいますが、
シンプルな案としては、、、、先に送ったスレの様なシリアル通信的な使い方ではなくなってしまいますが、
CN2側のRTSとGNDにLEDはんだ付けして
comcontrol 3 or 4 でON/OFFとかでおこなうなどで出来そうな気もします。
(手元に同じものが無いので検証できずすみませんが。)



zakki

リンク

2022/12/24(Sat) 19:20:53|NO.97586

> シリアルに"1"を送信すると5V供給されるとか、
> 単なる電源のスイッチングだけの基板が・・・。

自分で使ってないので詳しくありませんがUSB制御リレーがその手の商品じゃありませんか?

http://www.karing.jp/~yoshino/usbrelay.html



大富豪

リンク

2022/12/24(Sat) 19:48:02|NO.97587

>zakkiさん
ありがとうございます、
その手もありますね;
1000円前後で手配できますし、
簡単な回路でON/OFFが出来るでしょうね。
たしかにキー入力をHSPで制御すれば点灯可能です。
改造が・・・;

>usagiさん
ありがとうございます。

”汎用ロジックIC”足が沢山のいわゆるゲジゲジですよね;
一気に難易度が上がります・・・

※comcontrol
hspextですが、ヘルプに
【comclose命令でポートが解放されないままプログラムが終了すると、
他のプログラムがポートに二度とアクセスできなくなってしまう】
と恐ろしい事を書いているので遠慮しておりました。

勇気が出たら試してみようと思います。


>zakkiさん
USBリレー
まさにソレですね;そういうのが或るんですね。
(海外と日本で値段の幅がすごいですが;)

”仮想COMポート(RS-232Cシリアルポート)として動作しますので、
 シリアル通信の関数を使うことで”
スイッチングが出来るようですね。

arduino.asか、hspusbio.as/mod_usbio.asで
制御できるのかもしれませんね。

ありがとうございます、
検討してみます。



ze-na

リンク

2022/12/25(Sun) 09:02:36|NO.97590

>大富豪 さん

>USBシリアル変換基板(CH340E)を繋いでCOM4で認識し、

CH340Eのデータシートによると4ピンに出力信号(RTS)が
あるので、簡単なLED回路の自作とHSPシリアル制御だけで
LED「1つ」の点灯/消灯が可能なはずです。

>uio_find(hspusbio.as/mod_usbio.as)ですと、
>ドライバーが見つからないというstatが返ります。

名称が紛らわしいのですが、hspusbio.txtにもあるように
これはUSB制御の汎用I/Oモジュールではなく
「USB-IO」と名付けされた3製品限定の専用モジュールです。

現在モルフィー企画版とテクノキット版は販売終了のようで
販売している製品は、Km2Net版と秋月電子通商版のみです。

複数のLEDとなるとこの製品のようにUSB側のドライバ制御が
完成されているUSB入出力ボード製品が必要です。

ArduinoやPICなどの方法だとHSP(Win側USB制御)とは別に
USBドライバ通信やI/O制御のファームウェア制作が必要ですので
簡単には行かないと思います。



zakki

リンク

2022/12/25(Sun) 09:15:15|NO.97592

そうですねarduino.asはArduinoに、hspusbio.asやmod_usbio.asははUSB-IOモジュールにと、特定の製品のプロトコルに特化したモジュールなので、
CH340EやUSBリレーではや使えずhspext.asでのCOMポート読み書きやWin32 APIを使ったHID読み書きを自分で書く必要あります。



大富豪

リンク

2022/12/25(Sun) 11:47:06|NO.97599

>>ze-naさん
ありがとうございます。

 >4ピンに出力信号(RTS)が
 >簡単なLED回路の自作とHSPシリアル制御だけで

●出力信号(RTS)
これはあくまでも通信信号であって、
電圧の出力ではないんですよね。
GND(-)とRTSに、たとえばモーターだけ繋いでも動かず、
”電源をリレーしてON/OFFする別の回路(基板)”が必要という事ですよね。

〇LED回路
または、抵抗+LEDを繋げば点灯可能という意味でしょうか。

●hspusbio
承知しました、
だから認識不可だったんですね;

●hspusbio / uio_seldev
複数デバイス認識できるようですが、
複数同時使用ができないみたいですね。
順次切り替え式でOKか検討してみます。


>zakkiさん
ありがとうございます。

どうしても気になるのが、hspextヘルプの
【comclose命令でポートが解放されないままプログラムが終了すると、
他のプログラムがポートに二度とアクセスできなくなってしまうので注意してください。】

恐ろしくて手が出せません・・・。

そのUSB端子が使えなくなるという事ですよね。
やはりその記述通りなのでしょうか・・・。



MIZUSHIKI

リンク

2022/12/25(Sun) 15:28:00|NO.97600

本当の本当に「HSPだけでLEDの点灯」ということがしたいだけなら USB-IO2.0(AKI) を使うのが手っ取り早いと思います。
https://km2net.com/usb-io2.0/index.shtml (USB-IO2.0とは)
https://akizukidenshi.com/catalog/g/gM-05131/ (秋月電子通商)

昔、掲示板で話題が出たとき面白そうだと思って手を出しました。

//【 簡易的に mod_usbio.as を乗っ取って拡張 】 #undef print@m0 #define print@m0 if(vid==0x1352 && pid==0x121){ pid==0x100 }:logmes // ↑ProductID==0x121のとき0x121->0x100偽装して使えるようにする。(本当はモジュールの中身に判定を書き足すのが正しい) #include "mod_usbio.as" // ← ※他のモジュールより先に記述してください。(モジュール名「@m0」だと仮定して拡張します) #module mod_usbio_p #deffunc uio2aki_out int port1, int port2 if hHID@m0==0 : return 1 ; ERROR dim sz,1 sdim dat,OutputByte@m0+1 poke dat,0,0 poke dat,1,0x20 //入出力コマンド if port1 != -1 { poke dat,2,1 //出力1 ポート poke dat,3,port1 //出力1 値 } if port2 != -1 { poke dat,4,2 //出力2 ポート poke dat,5,port2 //出力1 値 } WriteFile@m0 hHID@m0, dat, OutputByte@m0, sz, 0 return (sz!=OutputByte@m0) #deffunc uio2aki_inp var port1, var port2 if hHID@m0==0 : return 1 ; ERROR dim sz,1 SendCnt = (SendCnt+1) \ 0xFF sdim dat,InputByte@m0+1 poke dat,0,0 poke dat,1,0x20 //入出力コマンド poke dat,InputByte@m0-1,SendCnt //識別カウンタ WriteFile@m0 hHID@m0, dat, OutputByte@m0, sz, 0 if sz!=OutputByte@m0 : return 1 ; ERROR //入力処理 f=1 repeat 100 ReadFile@m0 hHID@m0, dat, InputByte@m0, sz, 0 if stat==0 : break if peek(dat,InputByte@m0-1)==SendCnt { port1 = peek(dat,2) port2 = peek(dat,3) f=0 : break } loop return f #global title "USB-IO2.0(AKI) test" // USB-IO初期化 mes "USB-IOを接続してください" repeat uio_find : if stat==0 :break wait 10 loop mes "接続 // hHID="+hHID@m0+", InputByte="+InputByte@m0+", OutputByte="+OutputByte@m0 // 送信 uio2aki_out 0b01010101 ; bit指定で とりあえず LED 0 2 4 6 点灯(ポート1のみ) led_mae = 0b00000000 *main wait 1 // マウスのいる位置で点灯させるLEDを変更 id = mousex / (ginfo_sx/8) led = 1<<id ; bitシフト:LED点灯IDを指定 if mousey < ginfo_sy/2 : led = 0b00000000 ; 画面の上半分にいるときは無点灯に // キーボード1〜8でLED点灯IDを指定 repeat 8 getkey key, 49+cnt : if key : led |= 1<<cnt ; bitシフト:LED点灯IDを指定して重ねる loop // 受信 ;uio2aki_inp inp1, inp2 ; 各ポートの入力を取得(ポート1で入力を使いたいならシステム設定を書き込んでピンの入出力を変更する必要あり[コマンド:0xF9]) title "led = "+led;+", inp2="+inp2 if led_mae == led : goto *main led_mae == led // 画面描画 redraw 0 color 255,255,255 : boxf 0,ginfo_sy/2 : color 255 repeat 8 if (led>>cnt)&1 : boxf (ginfo_sx/8)*cnt, ginfo_sy/2, (ginfo_sx/8)*(cnt+1), ; 点灯箇所を色塗り loop redraw 1 // 送信 uio2aki_out led ; bit指定で ポート1のLED点灯(第2引数でポート2にも送信可。ただしシステム設定を書き込んでピンの入出力を変更する必要あり[コマンド:0xF9]) goto *main stop
動作させてみた感じを動画に撮ってtwitterに投稿してみました。
https://twitter.com/millline/status/1606898916704030720

・ブレッドボードを使う場合でも、ピンをはんだ付けする必要があるので注意して下さい。
・各ピンの入出力設定を変更できますが、以下のツールから行うと良いです。
 https://km2net.com/usb-io2.0/io_sample_kai.shtml
 (フォルダ展開して USB-IO\USB-IO2.0(AKI)\USB-IO2.0(AKI)\bin\x86\Release\USB-IO2.0(AKI).exe)
・以下ページ内のサンプルも参考になりますが、「USB-IO2.0(AKI)」は「USB-IO2.0」と違い、連続出力コマンド(0x22)が使えないので注意してください。
 https://km2net.com/usb-fsio/sample.shtml



usagi

リンク

2022/12/25(Sun) 15:48:06|NO.97601

>勇気が出たら試してみようと思います。
comclose の実態は EscapeCommFunction と CloseHandle なので
ただ単にハンドル解放しないと他のプログラムがアクセスできないってだけだと思うので、
やらかしたらUSB抜いてWindowsの電源入れなおせばよいと思われます。。。
が、どの様な環境か分からないので無責任なことは言えないですよねぇ。。。

ハードの理解は敷居が高いですね。

>出来ない場合はデバイスそもののをON/OFFすればLEDのON/OFFが出来ます。
意味としてはデバイスマネージャから該当のデバイスを無効にすると、やりたいことが実現できている感じですか?

そうであればソフトの話になってしまいますがPowershell経由で管理者権限で
Disable-PnpDevice使うとか手っ取り早いかもです。



zakki

リンク

2022/12/25(Sun) 15:51:15|NO.97602

> 【comclose命令でポートが解放されないままプログラムが終了すると、
> 他のプログラムがポートに二度とアクセスできなくなってしまうので注意してください。】

試してませんが、comcloseはCloseHandle呼んだり開放処理してるだけでそのハンドルが閉じられないので、Windowsの再起動までそのCOMポート番号が占有されるの意味だと思います。
arduino.asだとarduino_initでcomopenしてarduino_byeでcomcloseしますが、arduino_bye忘れるとArduinoが永遠に使えなくなるわけじゃないですよね?

あとデバイスマネージャーでそのデバイスをOn/Offしたり、USB経由抜き差しでも、再起動無しで開放されそうな気もします。

本当かは詳しい人お願いします。



大富豪

リンク

2022/12/25(Sun) 17:10:59|NO.97605

★皆さま大変ありがとうございます。
素人の無謀な質問だったような気がして来ました・・・。


★MIZUSHIKIさん
 ありがとうございます。

>USB-IO2.0(AKI)
・PINツールを別途用意しなくても
 5V出力をその基板だけでソフト制御できる、
・PINを変える場合はツールが必要、
 という事でしょうか

たとえば自分で応用してgetkeyとか、
HSPで判定した条件に応じてON/OFF出来ればいいのですが・・・、
プログラムアレンジとかかなりハードルが高そうな・・・感じが;
(動画拝見しました、すごいですね!まさにソレです。)


★usagiさん
ありがとうございます。

comclose の件承知しました、
少し安心しました。

デバイスON/OFFの件は、
CH340の常時5V出力を使って点灯させておき、
ソフト側でデバイスのON/OFFが出来れば、
希望どおりの動作なので良いかなと思いまして。
 (物理的な抜き差しと同じ状況をHSPで再現)

ソフト的に認識していないだけで物理的に接続(通電)されている状況ですと、
たぶん5Vが出力されるままなのでNGでございます。
(頻繁な”点滅”ではなく5分ON・・・15分OFF・・・程度のクリ返しです)


★zakkiさん
ありがとうございます、
”ポート占有/再起動でポート開放”
少し安心しました;



MIZUSHIKI

リンク

2022/12/25(Sun) 22:13:06|NO.97615

>大富豪 さん
>>USB-IO2.0(AKI)
>・PINツールを別途用意しなくても
> 5V出力をその基板だけでソフト制御できる、
>・PINを変える場合はツールが必要、
> という事でしょうか

そうですね。この製品とPCがあればそれだけで大丈夫です。
逆に言うと、Arduino等と違い USB-IO2.0(AKI) の中にプログラムを送信して書き込むことは出来ないので、電源を挿しただけのスタンドアロンの状態では動作できません。
なので、USB-IO2.0(AKI)を挿したPC内で常にHSPのプログラムが動いている必要があります。

前述した「各ピンの入出力設定を変更できるツール」の件ですが、基本的には必要ありません。
https://km2net.com/usb-io2.0/index.shtml
このサイトの画像を見て欲しいのですが、購入した時点では「下側8つのピンは(5V)出力専用、上側4つピンが入力専用」となっています。
「購入時点で8つのLEDを光らせられて、システム設定を変えれば上側も出力用に出来るため計12個のLEDを光らせたりできるよ。」というだけの話でした。

>たとえば自分で応用してgetkeyとか、
>HSPで判定した条件に応じてON/OFF出来ればいいのですが・・・、
>プログラムアレンジとかかなりハードルが高そうな・・・感じが;

0b000 とか |= とか ビットシフト とかは、人によっては難しかったかもしれませんね。

プログラムのアレンジ/改造は

mes "接続 // hHID="+hHID@m0+", InputByte="+InputByte@m0+", OutputByte="+OutputByte@m0
の行より下を書き換えてもらえばOKです。

uio2aki_out (光らせたいLEDのピンID) ←この命令を記述するだけで、取り付けたLEDが光ります。

0〜7ピンの計8つにそれぞれIDが割り振られていて、下記のようになっていると考えてください。
ピン0 : 1 (= 0b00000001)
ピン1 : 2 (= 0b00000010)
ピン2 : 4 (= 0b00000100)
ピン3 : 8 (= 0b00001000)
ピン4 : 16 (= 0b00010000)
ピン5 : 32 (= 0b00100000)
ピン6 : 64 (= 0b01000000)
ピン7 : 128(= 0b10000000)

例えば 0と3のピンのLEDを光らせたいときは

uio2aki_out 1+8 ; (0b00001001と同じこと)
みたいに記述してあげれば良いです。



大富豪

リンク

2022/12/26(Mon) 00:00:45|NO.97618

>MIZUSHIKIさん
な、なんと素晴らしい・・・。
詳細に解説して頂き誠にありがとうございます。
大変よく分かりました。
HSP+基板(LED)でON/OFF出来るなら必要十分で御座います。

※すみません、いくつか質問が;

点灯命令を出し続ける事でON状態を維持する、
という感じのプログラムでしょうか。
(命令を出していなければOFF)
(モーメンタリースイッチのような感じ)

または、
一度ONにしてとループを抜けてプログラムstop、
buttonクリックでOFF用の命令を出して消しstop。
も可能でしょうか。
(オルタネイトスイッチのような感じ)

uio2aki_out 0b00000000
これは全消灯(?)命令なんですかね、
個別ピン指定OFFも出来ますか?
(モーメンタリースイッチのような感じであれば関係ない思いますが)

(実際に基板を用意して動かしながらやってみれば
 分かるとは思うのですが、
どの変数がどこでどう対応しているのかが
初心者には難しいです、すみません;)



MIZUSHIKI

リンク

2022/12/26(Mon) 08:44:56|NO.97619

>大富豪 さん

>一度ONにしてとループを抜けてプログラムstop、
>buttonクリックでOFF用の命令を出して消しstop。
>も可能

こちらのほうです。

>uio2aki_out 0b00000000
>これは全消灯(?)命令なんですかね、
>個別ピン指定OFFも出来ますか?

はい。全消灯となります。

個別ピンを消したいときは前回のを覚えておく必要があります。
uio2aki_out 0b00001001
例えば、0と3ピンの点灯をしているところで0ピンを消灯したいなら
uio2aki_out 0b00001000
と指定してください。



大富豪

リンク

2022/12/26(Mon) 09:13:15|NO.97620

>MIZUSHIKIさん
 ありがとうございます。

という事は、
repeat- loop内で
”命令を出している間だけ点灯する”
という感じですかね。

”個別のピンを消灯したい場合は、
命令を出さなければいい”ので。

・・・あれ?
またはトグルやDIPスイッチにように一旦ONにすれば
プログラムを停止してもONを保持している(オルタネイト動作)になるんですかね。

その場合ですと個別にOFFさせる命令が必要になりますが、
もしかしてどっちも出来るとかでしょうか。

>uio2aki_out 0b00001001
>例えば、0と3ピンの点灯をしているところで0ピンを消灯したいなら
>uio2aki_out 0b00001000

という事は事前に
>ピン0 : 1 (= 0b00000001)
>ピン3 : 8 (= 0b00001000)
の命令が出されいてONを保持、

>ピン3 : 8 (= 0b00001000)
#3ピンの点灯命令をもう一度出すと、#0ピンが消灯する事に・・・

>uio2aki_out 0b00001001
これの意味は・・・

ちょっと混乱気味ですが、実際に試してみようと思います。



MIZUSHIKI

リンク

2022/12/26(Mon) 12:14:10|NO.97623

>大富豪 さん

>repeat- loop内で
>”命令を出している間だけ点灯する”
>という感じですかね。

いいえ。
前回の質問の ↓前半の方ではなくて、

>>点灯命令を出し続ける事でON状態を維持する、
>>という感じのプログラムでしょうか。
>>(命令を出していなければOFF)
>>(モーメンタリースイッチのような感じ)。

↓後半の方が正しいです。と言ったつもりでした。

>>一度ONにしてとループを抜けてプログラムstop、
>>buttonクリックでOFF用の命令を出して消しstop。
>>も可能でしょうか。
>>(オルタネイトスイッチのような感じ)

ただ、勘違いを産みやすかったかもしれません。
OFF用の命令というものはありません。

uio2aki_out には、どこを点灯して欲しいかの数値を指定しています。逆に点灯指示が無い箇所は消えます。
(もしかしたら、そういう意味では「モーメンタリースイッチのような感じ」ということになるのでしょうか?)

私は「repeat-loop内で毎回指定する必要はありません。プログラムstopしても光り続けるし、buttonクリックのgoto->stopでも運用できるよ。」という意味で回答していました。


>>uio2aki_out 0b00001001
>これの意味は・・・

すみません。
>uio2aki_out 0b00000000
>これは全消灯(?)命令なんですかね、
という例を出して頂いていたので 理解したかな と思い、安易に 0b00001001 としてしまいました。
 0b00001001 = 1 + 8 です。
uio2aki_out には、どこを点灯して欲しいかの数値を指定しており、逆に点灯指示が無い箇所は消えるので、
 uio2aki_out 1+8 で、ピン#0と#3だけが光ります。
その後に
 uio2aki_out 8 とすると、ピン#3だけが光ります。

以下をスクリプトエディタにコピペして実行してみてください。少し理解の助けになるかもしれません。(色々いじくってみてください。)

mes 0b00001001 ; ← 9と表示されます。(ピン#0,#3 に相当) mes 0b00001000 ; ← 8と表示されます。(ピン#3 に相当) // 先頭に「0b」 = 2進数のときに使う。 // 先頭に「0x」 =16進数のときに使う。(「0xF3」等ではなくて「$F3」というようにも書ける)



大富豪

リンク

2022/12/26(Mon) 12:53:24|NO.97624

>MIZUSHIKIさん
大変ありがとうございます。


>逆に点灯指示が無い箇所は消えます。
=命令さえ出さなければ消えているという事ですので、
0b00000000(全消灯)命令がなぜあるのか疑問でした。

機械的なスイッチで言えば、押している間だけONで、
離せばOFFになる動作がモーメンタリですが、

>uio2aki_out 1+8
stop(HSPの停止コマンド)

とすると、
命令された一瞬だけ点灯してすぐに消える事になる(はず)ですので、

点灯を保持するためには、

repeat
uio2aki_out 1+8
(wait)
loop

が必要になる事になります(?)。
(wait time⇒点滅スピード)


※ 仮にピン0〜7まで全部点灯させたい場合は、
uio2aki_out 1+2+4+8+16+32+64+128
にすればいいんですよね(二進数の足し算が分からないので;)。

※ ピン0と7だけ点灯させたい場合は、
uio2aki_out 1+128

(点灯が保持しているかどうかは別として)

----------
取りあえず『実際に動かして確認』ですね。
提示して頂いたソースを元に色々やってみようと思います。
(部品の手配もあるので年明けからボチボチ活動します)

大変ありがとうございます、
改めてお礼を申し上げます。

☆皆さんもご対応頂き大変ありがとうございました。



MIZUSHIKI

リンク

2022/12/26(Mon) 19:39:44|NO.97626

>大富豪 さん
>取りあえず『実際に動かして確認』ですね。
>提示して頂いたソースを元に色々やってみようと思います。
>(部品の手配もあるので年明けからボチボチ活動します)

はい。
それで挙動を見て体験するのが一番確実に理解できると思います。

私も 表現がつたない/上手く伝えきれていない 所もあると思うので、勘違いや思い込みを誘発してしまっているかもしれません。
ぜひ実機で確かめてみてください。

----------
一応最後に、大富豪さん が考察された動作に対して補足しておきますが、これに対しての新たなコメントは不要です(実機で試したら一瞬で理解できるはずなので)。
実際に実機が来て確かめてみて『あぁ、こういうことね。』と感じて頂ければ良いかと思います。

>>uio2aki_out 1+8
>stop(HSPの停止コマンド)
>とすると、
>命令された一瞬だけ点灯してすぐに消える事になる(はず)ですので、

いいえ。「一瞬だけ点灯してすぐに消え」たりはしません。
stop したら後はずっと点灯しっぱなしになります。

いつまで点灯しっぱなしになるかというと、次に uio2aki_out命令 を使う時までです。

なので
>点灯を保持するためには、
uio2aki_out で目的のLEDを光らせた後、uio2aki_out命令を使わなければOKです。

繰り返しになってしまいますが、
uio2aki_outを repeat-loop内で毎回指定する必要はありません。プログラムstopしても光り続けるし、buttonクリックのgoto->stopでも運用できます。

>※ 仮にピン0〜7まで全部点灯させたい場合は、
>uio2aki_out 1+2+4+8+16+32+64+128
>にすればいいんですよね(二進数の足し算が分からないので;)。
>※ ピン0と7だけ点灯させたい場合は、
>uio2aki_out 1+128

これに関しては、両方とも正解です。



大富豪

リンク

2022/12/26(Mon) 20:31:44|NO.97627

>MIZUSHIKIさん
大変ありがとうございます、
おかげさまでより理解が深まりました。
たぶん大丈夫だと思いますが^^、
実際にやってみます。

-----
皆さんありがとうございました、
一旦解決済みCLOSEとさせて頂きます。
良い新年をお迎えください。



大富豪

リンク

2022/12/30(Fri) 16:37:37|NO.97639

★HELPです。
 点灯できません;

>mes "接続 // hHID="+hHID.... (の後に)

uio2aki_out 1+2+4+8+16+32+64+128
stop

これで全点灯になるハズですよね;
ドライバー無しで接続しただけで使えると書いているのですが、
何か他に特殊な事が必要なのでしょうか。

プラスマイナスの関係ないモーターを接続してテストしました。
GND と J1-0 から J1-7までテスト。

ハード的に電気が出来ているのでしょうけど、
GND+VCCでは正常に電気が来ています。

その状態でVCCからJ1-*に繋げ変えても動作しません。

デバイスマネージャーでは USB入力デバイスとして表記されています。
デバイスの種類:ヒューマン インターフェイス デバイス


・・・助けてください・・・



大富豪

リンク

2022/12/30(Fri) 17:09:27|NO.97640

ハヤトチリで大変お騒がせしました。

無事点灯しました・・・;
モーターを回すほどの電流ではない
という事なんでしょうね。

LEDでテストすると
無事点灯しました;



大富豪

リンク

2023/1/6(Fri) 11:40:03|NO.97653

新年あけましておめでとうございます。

>MIZUSHIKIさん
ご対応頂きありがとうございました。

すみません;再び質問です・・・。

★本件で使っているデバイス(基板)は、
複数同時接続してもプログラム側で
同時利用できないんですよね。
(hspusbio.asのコマンド[uio_seldev]では同時利用できない感じ)
(一旦遮断して切り替えれば出来るんでしょうけど)

★入力側のソースも公開していらっしゃいますが、
出力と入力をひとつのソースにまとめるのって結構大変ですか?
もし宜しければご指南頂けるとありがたいです・・・。



MIZUSHIKI

リンク

2023/1/6(Fri) 21:53:46|NO.97659

>大富豪さん
あけましておめでとうございます。

2つある質問のまずはコチラ
>★入力側のソースも公開していらっしゃいますが、
>出力と入力をひとつのソースにまとめるのって結構大変ですか?
から行きたいのですが、

実は以前示したサンプルスクリプトで既に出力と入力をひとまとめに出来ています。

// 受信 ;uio2aki_inp inp1, inp2 ; 各ポートの入力を取得(ポート1で入力を使いたいならシステム設定を書き込んでピンの入出力を変更する必要あり[コマンド:0xF9]) title "led = "+led;+", inp2="+inp2
この部分の「;」によるコメントアウト記号2つを消してみてください。

この状態でスイッチ入力を試してみるとタイトルバーの『inp2=15』の数値が変わって入力値を受け取れていることが分かります。
(スイッチを簡単に試すには、ジャンパーワイヤ(オス-オス)で片っぽGNDに刺して、もう片方をJ2-0〜3ピンにちょんちょん触ってみると分かりやすいと思います。)

あと補足ですが、USB-IO2.0(AKI)は初期状態だと「J2-0〜3はスイッチを押すとそこのビットが0になる(プルアップ)」ので、inp2の値のビットを反転させて使ってやると分かり易いかもしれません。
具体的にはこんな感じです。

// 受信 uio2aki_inp inp1, inp2 ; 各ポートの入力を取得 inp2 = inp2 ^ 0b1111 ; 分かり易くする為ビットを反転 push = "" if inp2 & 1/*(0b0001)*/ : push += "J2-0, " if inp2 & 2/*(0b0010)*/ : push += "J2-1, " if inp2 & 4/*(0b0100)*/ : push += "J2-2, " if inp2 & 8/*(0b1000)*/ : push += "J2-3, " title "led = "+led+", inp2="+inp2+" push="+push


次にコチラ
>★本件で使っているデバイス(基板)は、
>複数同時接続してもプログラム側で
>同時利用できないんですよね。
>(hspusbio.asのコマンド[uio_seldev]では同時利用できない感じ)

hspusbio.asのコマンド[uio_seldev] のバグなのかなと思います。
モジュールを見ると「#deffunc uio_seldev int n」としているので、数行下の「CreateFile devpath(dev),……」は本当は『devpath(n)』じゃないと駄目だと思うんですよね。

ただそのままの修正だと uio_seldev で切り替える度にデバイスハンドルを閉じたり開いたり繰り返すので、書き換えて乗っ取ってみました。
(ここまで来ると簡易的な乗っ取りじゃなくて1つのモジュールにするべきかもしれませんが、今のところとりあえずこれで。)

注意点ですが「認識した複数デバイスのどれがどっち?」という識別方法の良いアイディアが出なかったので、メインデバイスのスイッチ(J2-0〜3のどれか)を押して貰って識別するという方法をとっています。

/* mod_usbio_p2aki.as - ver.1.1 by MIZUSHIKI ------------------------------------------------------------------------ HSP3同梱の標準モジュール mod_usbio.as を無理やり拡張したモジュールです。 必ず他のモジュールより先に #include "mod_usbio_p2aki.as" してください。 (その内ちゃんとした mod_usbio2aki.as を作るかもしれません。) */ //【 簡易的に mod_usbio.as を乗っ取って拡張 】 #undef print@m0 #define print@m0 if(vid==0x1352 && pid==0x121){ pid=0x100 }:logmes // ↑ProductID==0x121のとき0x121->0x100偽装して使えるようにする。(本当はモジュールの中身に判定を書き足すのが正しい) #include "mod_usbio.as" // ← ※他のモジュールより先に記述する必要あり。(モジュール名「@m0」だと仮定して拡張します) // ↓uio_getdevs, uio_seldev, uio_free を書き換えて乗っ取り #undef uio_getdevs #define global ctype uio_getdevs devs@m0 #undef uio_seldev #define global uio_seldev uio_seldev@mod_usbio_p2aki #undef uio_free #define global uio_free uio_free@mod_usbio_p2aki #module mod_usbio_p2aki #deffunc uio_seldev@mod_usbio_p2aki int n if (n>=devs@m0) :return if length(hHID@m0) <= n : hHID@m0(n) = 0 if hHID@m0(n) != 0 { selDev = n return hHID@m0(selDev) } CreateFile@m0 devpath@m0(n),0xC0000000,3,NULL,3,0 if (stat==-1) : return selDev = n hHID@m0(selDev)=stat dim hPreparsedData dim Caps,16 HidD_GetPreparsedData@m0 hHID@m0(selDev),hPreparsedData HidP_GetCaps@m0 hPreparsedData,Caps HidD_FreePreparsedData@m0 hPreparsedData InputByte@m0(selDev) = Caps(1)&0xffff OutputByte@m0(selDev) = Caps(1)>>16&0xffff return hHID@m0(selDev) #define global uio2aki_out(%1=-1,%2=-1) uio2aki_out@mod_usbio_p2aki %1,%2 #deffunc uio2aki_out@mod_usbio_p2aki int port1, int port2 if length(hHID@m0) <= selDev : return 1 ; ERROR if hHID@m0(selDev)==0 : return 1 ; ERROR dim sz,1 sdim dat,OutputByte@m0(selDev)+1 poke dat,0,0 poke dat,1,0x20 //入出力コマンド if port1 != -1 { poke dat,2,1 //出力1 ポート poke dat,3,port1 //出力1 値 } if port2 != -1 { poke dat,4,2 //出力2 ポート poke dat,5,port2 //出力2 値 } WriteFile@m0 hHID@m0(selDev), dat, OutputByte@m0(selDev), sz, 0 return (sz!=OutputByte@m0(selDev)) #deffunc uio2aki_inp var port1, var port2 if length(hHID@m0) <= selDev : return 1 ; ERROR if hHID@m0(selDev)==0 : return 1 ; ERROR if OutputByte@m0(selDev)<InputByte@m0(selDev) : return 1 ; ERROR dim sz,1 SendCnt = (SendCnt+1) \ 0xFF sdim dat,InputByte@m0(selDev)+1 poke dat,0,0 poke dat,1,0x20 //入出力コマンド poke dat,InputByte@m0(selDev)-1,SendCnt //識別カウンタ WriteFile@m0 hHID@m0(selDev), dat, InputByte@m0(selDev), sz, 0 if sz!=InputByte@m0(selDev) : return 1 ; ERROR //入力処理 f=1 repeat 100 ReadFile@m0 hHID@m0(selDev), dat, InputByte@m0(selDev), sz, 0 if stat==0 : break if peek(dat,InputByte@m0-1)==SendCnt { port1 = peek(dat,2) port2 = peek(dat,3) f=0 : break } loop return f #deffunc uio_free@mod_usbio_p2aki onexit repeat length(hHID@m0) if hHID@m0(cnt) != 0 : CloseHandle@m0 hHID@m0(cnt) : hHID@m0(cnt)=0 loop devs@m0=0 return #global //========================================================↑mod_usbio_p2aki.as== ;#include "mod_usbio_p2aki.as" title "USB-IO2.0(AKI) test mod-Ver1.1" // USB-IO初期化 mes "USB-IOを2つ接続してください。",1 repeat uio_find mes "( "+uio_getdevs()+" / 2 )",1 if uio_getdevs()==2 :break wait 10 color 255,255,255:boxf ginfo_cx-ginfo_mesx,ginfo_cy:color:pos ginfo_cx-ginfo_mesx loop pos 0,ginfo_cy+ginfo_mesy mes "デバイスの識別をします。メインデバイスのスイッチを押してください。" repeat uio_seldev 0 uio2aki_inp inp1_0, inp2_0 uio_seldev 1 uio2aki_inp inp1_0, inp2_1 mes strf("inp2_0=%d(%s), inp2_1=%d(%s)", inp2_0,ToBit4(inp2_0), inp2_1,ToBit4(inp2_1) ), 1 if inp2_0 != 0b1111 : mainDev=0 : subDev=1 :break if inp2_1 != 0b1111 : mainDev=1 : subDev=0 :break wait 10 color 255,255,255:boxf ginfo_cx-ginfo_mesx,ginfo_cy:color:pos ginfo_cx-ginfo_mesx loop pos 0,ginfo_cy+ginfo_mesy mes "接続(メイン) // hHID="+hHID@m0(mainDev)+", InputByte="+InputByte@m0(mainDev)+", OutputByte="+OutputByte@m0(mainDev)+" // mainDev="+mainDev mes "接続(サブ ) // hHID="+hHID@m0(subDev)+", InputByte="+InputByte@m0(subDev)+", OutputByte="+OutputByte@m0(subDev)+" // subDev="+subDev // 送信 uio_seldev mainDev ; メインデバイス uio2aki_out 0b01010101 ; bit指定で LED 0 2 4 6 点灯(1つ飛ばし) uio_seldev subDev ; サブデバイス uio2aki_out 0b00001111 ; bit指定で LED 0 1 2 3 点灯 (前方4つ) stop #module #defcfunc ToBit4 int p b="" : repeat 4 : b = ""+((p>>cnt)&1)+b : loop return "0b"+b #global



大富豪

リンク

2023/1/6(Fri) 22:38:07|NO.97661

>MIZUSHIKIさん
大変お手数をおかけしております、
誠にありがとうございます。

(入力)よく見ると書かれてますね@@;
気が付きませんでした;
プルアップや反転についても勉強せて頂きます。

※J2信号でメイン指定
 →outの前にデバイス指定。
大変よく分かりました。

モジュールとか#deffuncとは全く分からないのですが、
実際に動作させてジックリと勉強しようと思います。

ありがとうございます☆



ONION software Copyright 1997-2023(c) All rights reserved.