ブログだいちゃん

ブログだいちゃん

趣味のブログ

ブログだいちゃん

Raspberry PI Pico とロータリーエンコーダーでWindowsを使いやすくする

Rspberry PI Pico をポチってから micro-Python をかじり始め、簡単なプログラムを作成しながら習得に努めています。

今回は CircuitPython を Pico にインストールし ロータリーエンコーダーを使い、Windows用に 拡大縮小、左右のスクロール、ボリュームコントロール、スリープなどが出来るようにコントロールノブを作成します。

 

回路図


回路図はパーツが少ないので簡単ですが Fritzing で作成したので載せておきます、回路図上ではLEDが3個表示されていますがRGB_LED を使用していますので1個になります。

エンコーダーの電源は Pico の 3.3V から取ります、LEDの抵抗は1kΩを使用していますが適宜変更して下さい。

f:id:blogdaichan:20210725153032j:plain

プログラム


プログラムは下記のYouTubeを参考にしています、ケースのSTLデータやプログラムへのリンクがあります。



www.youtube.com

準備

このプログラムは CircuitPython を使用しますので、Picoにインストールします、ダウンロード先はこちら。

circuitpython.org

次にlibraryをインストールします、下記よりZIPファイルをダウンロード解凍し、解凍した中にある adafruit_hid フォルダを Pico に作成した lib フォルダ内に入れます。

github.com


Windows10設定

Windows用の機能は、拡大縮小、ボリュームコントロール、水平スクロール、長押しでスリープ になります。

スリープ機能はWindows上で休止の無効化とショートカットの作成が必要になります、方法については分かりやすい参考サイトがありますので載せておきます。

作成したスリープのショートカットはディスクトップに置いておかないと動作しないようです。

休止の無効化

novlog.me


ショートカットの作成

www.lifehacker.jp


Windows用に変更したプログラム

参考動画はMAC版なのでWindows用に変更し各モード表示用にLED部分 を追加しました、 色は 青・赤・緑 で登録した機能により点灯します 。

機能を変更して使用したい場合はここを参考に設定できます、また機能を多く登録するとかえって操作が面倒になります。

import digitalio
import board
import usb_hid
import time
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.mouse import Mouse
from adafruit_hid.keycode import Keycode
from adafruit_hid.consumer_control import ConsumerControl
from adafruit_hid.consumer_control_code import ConsumerControlCode

print("== Pi Pico 多機能ノブ 1.0 ==")

led0 = board.GP6
led1 = board.GP7
led2 = board.GP8

led0 = digitalio.DigitalInOut(led0)
led1 = digitalio.DigitalInOut(led1)
led2 = digitalio.DigitalInOut(led2)

led0.direction = digitalio.Direction.OUTPUT
led1.direction = digitalio.Direction.OUTPUT
led2.direction = digitalio.Direction.OUTPUT

CLK_PIN = board.GP4
DT_PIN = board.GP3
SW_PIN = board.GP2
clk_last = None
count = 0
totalMode = 3
currentMode = 0

cc = ConsumerControl(usb_hid.devices)
mouse = Mouse(usb_hid.devices)
keyboard = Keyboard(usb_hid.devices)


clk = digitalio.DigitalInOut(CLK_PIN)
clk.direction = digitalio.Direction.INPUT

dt = digitalio.DigitalInOut(DT_PIN)
dt.direction = digitalio.Direction.INPUT

sw = digitalio.DigitalInOut(SW_PIN)
sw.direction = digitalio.Direction.INPUT
sw.pull = digitalio.Pull.UP

def led():
    if (currentMode == 0):
        led2.value = False
        led0.value = True
        
    elif (currentMode == 1):
         led0.value = False
         led1.value = True
        
    elif (currentMode == 2):
         led1.value = False
         led2.value = True

def millis():
    return time.monotonic() * 1000

def ccw():
    print("CCW")
    
    if (currentMode == 0): # 画面縮小
        keyboard.press(Keycode.CONTROL)
        mouse.move(wheel=-1)
        keyboard.release(Keycode.CONTROL)
        
    elif(currentMode == 1):   # ボリューム下げる
        cc.send(ConsumerControlCode.VOLUME_DECREMENT)
        
    elif(currentMode ==2):    # 水平スクロール右
        keyboard.press(Keycode.SHIFT)
        mouse.move(wheel=-1)
        keyboard.release(Keycode.SHIFT)
        
def cw():
    print("CW")
    
    if (currentMode == 0):     # 画面拡大
        keyboard.press(Keycode.CONTROL)              
        mouse.move(wheel=1)
        keyboard.release(Keycode.CONTROL)
        
    elif(currentMode == 1):     # ボリューム上げる
        cc.send(ConsumerControlCode.VOLUME_INCREMENT)
        
    elif(currentMode ==2):     # 水平スクロール左
        keyboard.press(Keycode.SHIFT)
        mouse.move(wheel=1)
        keyboard.release(Keycode.SHIFT)
         
def long_press():
    #スリープ: Ctrl+Shift+Alt+End
    keyboard.press(Keycode.CONTROL, Keycode.SHIFT,Keycode.ALT,Keycode.END)
    keyboard.release_all()

while(1):
    led()
    clkState = clk.value
    if(clk_last !=  clkState):
        if(dt.value != clkState):
            cw()
        else:
            ccw()
            
    if (sw.value == 0):
        pressTime = millis()
        time.sleep(0.2)
        longPress = False
        
        while(sw.value == 0):
            if(millis() - pressTime > 1000 and not longPress):
                print("longPress")
                longPress = True
                long_press()               

        if (not longPress):
            currentMode += 1
            currentMode %= totalMode
            print("Mode: " + str(currentMode))
                      
    clk_last = clkState


ケース作成と組み込み


ケースは参考動画の物が使用できますが、LED を追加したため新しく作成しました 、大きさは幅60mm×高さ40mmです。

f:id:blogdaichan:20210725153018j:plainf:id:blogdaichan:20210725153023j:plainf:id:blogdaichan:20210725153010j:plain


動作確認

 
 

www.youtube.com

ウォーターポンプを使用した自動アルコールディスペンサーの作成

自動アルコールディスペンサーの記事にアクセスが多くあり、武漢コロナの影響がまだまだ大きいことがうかがえます。

以前作成した自動アルコールディスペンサーはアルコールボトルの大きさに制限があり、汎用性に乏しかったと反省しています。

そこで市販のディスペンサーボトルを使用した自動アルコールディスペンサーを作成することにしました、今回はウォーターポンプを使用します。

パーツなど合計すると市販の自動ディスペンサーが購入できてしまいますが、自作する楽しみを優先していますのであしからず。

 

使用するパーツ


マイコンRaspberry PI PICO いま流行の PICO を使用してみます。


ウォーターポンプ:水中ポンプではなく、ポンプがアルコールと接触しないタイプのものです。


IRセンサー:検知距離は短いですが十分使えます。


リレー:5V1回路で小型のもの、ポンプのON・OFF に使用


リチウムイオンバッテリ:18650 3.7V3000mA 2本

[asin:B097JVZ4DR:detail]


ディスペンサーボトル:容量500ミリリットルの物を使用します、手押しポンプ部分は取り外します、幅80×奥行き60×高さ150mm 以内の容器があれば使えます。


シリコンチューブ:外径5mm×内径3mm 付属のチューブは短いので。


その他:電源スイッチ、5Vレギュレーター(L7805CV-DG)、100nFコンデンサー、47μF電解コンデンサー、2色LED (OSRB5131A)、
5mmLED用ワンタッチブラケット、1KΩ抵抗、ユニバーサル基板(30×70mm)、電池ボックスなど。


回路図


今回はArduinoではなく、いま流行の Raspberry PI PICO をポチってあったので使用してみました、電源はリチウムイオンバッテリー2本を使用しました、アルカリ電池4本(6V)でも動作可能ですがポンプの動作時間の調整が必要になります、回路図ではLED2個表示されていますが赤/青の2色LED(5mmΦ)を使用します。

使用したIRセンサーは回路図の物とは異なり4端子ですが、VCC GND D0端子 に接続します。(取付画像参照)

f:id:blogdaichan:20210719132020j:plain


プログラム


Thonny を使用してプログラムしました、Python は習い始めなのでプログラムがスマートではないかも知れませんが参考になればと思い載せておきます。

# automatic Alcohol dispenser 
# water pump version
#  ===========================

from machine import Pin
import utime

relay = Pin(16,Pin.OUT)     # 5Vリレーピン
sensor = Pin(15,Pin.IN)     # IRセンサーピン
led_red = Pin(17,Pin.OUT)   # 電源表示用赤色LEDピン
led_blue = Pin(18,Pin.OUT)  # ポンプ動作表示用青色LEDピン

while True:
    if sensor.value()==1:    # IRセンサーが動作していないときは(High)
        relay.value(0)       # リレーは動作させない
        led_red.value(1)     # 赤LED点灯
    else:                    # それ以外の時(センサーが動作している)の処理
        led_red.value(0)      # 赤LED消灯して
        led_blue.value(1)     # 青LED点灯
        relay.value(1)        # リレー ON (ポンプ動作)
        utime.sleep_ms(300)   # ポンプ動作時間(0.3秒) 液量により調整する
        relay.value(0)        # リレー OFF (ポンプOFF)
        utime.sleep(2)        # 次の動作までの待ち時間(2秒)
        led_blue.value(0)     # 青LED消灯

   

ディスペンサーのケース


ディスペンサーのケースは3Dプリンターで作成しました、サポートを最小限にするため分割して印刷しています。

f:id:blogdaichan:20210719143143j:plainf:id:blogdaichan:20210719143132j:plainf:id:blogdaichan:20210719143146j:plainf:id:blogdaichan:20210719143136j:plainf:id:blogdaichan:20210719143139j:plain


ケースの STL_file が必要な方はコメントでお知らせ下さい。


組み込み


アルコールボトルを入れるケースにセンサーとスプレーノズルを取り付ける部分をセットした画像です、これに2色LEDを取り付けたカバーをかぶせます。

スプレーノズルは3Dプリンターで作りましたが、ディスペンサーボトルに付いているノズルを使用しても良さそうです。

ディスペンサーボトルはポンプ部分を取り外し、シリコンチューブを通す穴を開けたパッキンを取り付けました。

IRセンサー は周囲の明るさにより感度が変化しますので、ディスペンサーを使用する場所で感度調整をしてから使用しないと不要な動作の原因となります。

f:id:blogdaichan:20210719151025j:plain


メカ部分とポンプ部分です、ユニバーサル基板30mm×70mmを使用し5VレギュレータとPICOを載せました、ポンプはシリコンチューブをローラーで押して液体を送り出す仕組です。

f:id:blogdaichan:20210719151028j:plainf:id:blogdaichan:20210719151035j:plain


メカケースとディスペンサーケースは両面テープで貼り付け固定しました。

f:id:blogdaichan:20210719151038j:plainf:id:blogdaichan:20210719151042j:plain


動作させてみました



www.youtube.com


自作PCがWindows11に対応しているかチェックしてみた

Windows11への Update が最近話題になっていますね。

この記事によると10月頃から無償アップデートが始まるようです。

iphone-mania.jp

Windows10からWindows11にアップデートするにはシステム条件に適合していないとだめなようです、Microsoftから適合の可否を判断してくれるソフトをダウンロード出来るので試してみました。

PC正常性をチェック

互換性確認ツールは下記よりダウンロード出来ましたが現在は準備中になっております、理由は必要条件を満たしていない「このPCでは Windows11を実行できません」が表示された場合、どこが条件を満たしていないのかが説明されず、ユーザーから不満が続出したので対応している模様です。

また、システム要件の見直しも行っているようです、要件が緩和されるのでしょうか?。

forest.watch.impress.co.jp


ツールをダウンロード出来るMicrosoftのサイトです、2021/06/29 時点では準備中になっています。

www.microsoft.com



私の場合準備中前にダウンロードしていたのでとりあえずチェックしてみましたが、案の定対応不可でした。

f:id:blogdaichan:20210629133011j:plain

ハードウエアの必要条件は満たしているので、他に問題があるみたいですがどこが対応していないのか不明です。

窓の杜にこんな記事がありました、アップデートできない問題箇所を表示してくれるようです、リンクを辿るとGithubからツールをダウンロード出来ます。

forest.watch.impress.co.jp


Githubにツールを実行したときの画像があります、この中で赤色になっている所が対応していないので、自分のPCで確認するとやはり同じ箇所が対応していませんでした。

f:id:blogdaichan:20210629140136j:plain


そんなわけでこのツールをインストールする前に対応していない箇所をチェックします。

Windows11に適合していない箇所を適合させる

ディスクパーテーションを MBR から GPT に変更する

使用しているマザーボードASUS TUF B450M-PRO GAMING なのでUEFIに対応しています、システムディスクがMBR なので GPT に変更すれば BIOSモードをUEFIで起動できるはずです。

システムディスクの内容(プログラムデータなど)をそのままで MBR⇒GPT に変更します、Windows10に入っている mbr2gpt というツールを使用して変更しました。

マザーボードUEFI に対応していなかったり、データの損傷など起きると起動出来なくなりますのでシステムをバックアップ後に行います。

使い方は「データを保持したままMBRからGPTに変換する」このサイトが参考になります。

BIOSモードをレガシー から UEFI に変更する

システムディスクを MBR⇒GPT に変更出来ましたので、PCを再起動してマザーボードセットアップに入り UEFI の有効を確認し Windows10 を立ち上げます、PCが立ち上がるか不安がありましたが無事立ち上がりました。

以上で BIOSモードをレガシーから UEFI に、セキュアブートモードを有効に設定できました。


f:id:blogdaichan:20210629173048j:plain



再度PC正常性チェックツールで確認したところ、まだ「実行できません」のメッセージ、調べたところ Windows11の最小必須要件の中に TPM 2.0 が必要と書いてあります。

トラステッド プラットフォーム モジュール (TPM) バージョン 2.0 に設定する

これもマザーボードセットアップで設定します、私のマザーボードの場合詳細タブの fTPM 設定項目を有効に設定し、有効の確認はPCを起動しディバイスマネージャーを開きセキュリティーディバイスの中に「トラステッド プラットフォーム モジュール2.0」があればOKです。

f:id:blogdaichan:20210629173045j:plain


別のチェックツール ReadySunValley_x64 でチェックした結果、全てクリアしました。

f:id:blogdaichan:20210703060300j:plain


最後にPC正常性チェックツールで再度チェック、結果Windows11に無償アップデート可能になりました、結構厳しい条件なので古いPCなどはアップデート出来ない可能性がかなりありそうですね。

f:id:blogdaichan:20210629171739j:plain

ESP32 と リレーモジュールで車庫の電灯を制御する

自宅から6~7m離れた場所に車庫兼物置があります、電灯のスイッチは車庫の軒先、車庫内部、物置の3箇所を1つのスイッチボックスに入れています。

車庫軒先の電灯は庭の照明も兼ねており、来客時など点灯すると歩きやすくなりますがスイッチが車庫にあるので、即対応することが出来ません。

自宅に居ながら車庫のスイッチをスマフォで入り切り出来ればこの問題が解決します、そこで小規模なホームオートメーションを作成してみたいと思います。

ちなみに電気工事士の資格は持っています。

どの様なやり方にするか

Amazon Alexa または Google を使用して音声で操作することも考えましたが 、Echo Dot や Google home は持っていないし、スマフォで行うならいちいち声を出さなくても指で操作すれば事足ります。

したがって、スマフォを使用して指操作でスイッチの開閉をすることにします、ただ自宅から少し離れていますのでWiFiの電波が弱くなり上手く動作するか不安もありますが。

ここのサイトが参考になります

ESP WROOM-32 をWeb server に設定してスマフォから接続し操作するようにします。

randomnerdtutorials.com


使用パーツ

ESP WROOM-32:WiFi開発ボードD1 Mini Pro ESP-32S 小型のWROOM-32 開発ボードです。


リレーモジュール:4回路リレーモジュール


降圧モジュール:KKHMF 3個 LM2596S DC-DC 3.2-35V 電源降圧モジュール 3A 可変降圧コンバータ。


直流電源:12V2A 手持ちの物、5V電源があれば降圧コンバーターは必要ありませんが手元に無かったので。


ユニバーサル基板:70×90(mm)


電源ジャックメス:【8個入り】DC電源ジャック ソケット 基板実装DCジャック ソケット 5.5mmx2.1mm


本体を収めるケース:百均のタッパー 縦110×横80×深さ50(mm)くらいの物。

その他:プラスティックねじ3mm、スペーサー、配線用ワイヤーなど。

作成及び外観

作成方法は参考サイトに詳しく書かれていますので割愛します、自宅 WiFi の ID Pass リレーモジュールのリレー個数、ESP32 の GPIO番号など必要なところは変更しています。

今回使用したESP32は、USBコネクタからの電源供給ではリレーが動作しませんでした(ESP32のVCC端子からではリレーの電源供給不足)。

そんなわけで、外部電源(12V2A)を5Vに降圧してリレーとESP32のVCCに接続しています、ESP32-DevKitC等では大丈夫かも、試していませんが。


f:id:blogdaichan:20210614144454j:plainf:id:blogdaichan:20210614150912j:plainf:id:blogdaichan:20210614144444j:plain



百均のタッパーに入れた状態です

f:id:blogdaichan:20210614144448j:plainf:id:blogdaichan:20210614144451j:plain


机上で動作確認

スマフォからESP32サーバーに接続して、リレーの動作を確認してみました。



www.youtube.com

Arduino と breadboard をセットするケー作成

Arduino と ブレッドボードをワイヤーで配線する場合、ボードが浮き上がったりして上手くセット出来ないことがあります。

そこで、Arduinoとブレッドボードをケースに収め配線しやすく、また見栄え良くしたいと考え 3Dプリンターでケースを作成することにしました。

ケースの作成

以前 YouTube だったか不明ですが、ケースを作成し活用している動画を見たことがあり、空覚えながら同じような物を作ってみました。

設計画像

縦並び用のケースを設計しました。

f:id:blogdaichan:20210530114856j:plain

セットしてみました

Arduino UNO と NANO I/O shield を取り付けてみました、配線で浮き上がらず安定しますので配線しやすくなりました。

f:id:blogdaichan:20210530114851j:plainf:id:blogdaichan:20210530114859j:plain

STLファイルです:Arduino_breadboard_case

壊れて放置されていた古い TrackIR4 をリストアしてみる

15年以上前にフライトシミュレーターで使っていた TrackIR4 、壊れたので何処かに保管したことを思い出し、段ボール箱の底から見つけ出しました。

カメラ本体の首が折れてディスプレイにセット出来なくなってそのまま放置されていたものです、使えるか分かりませんがとりあえずディスプレイにセットできるようにします。


古いWebカメラの台座を使用する


使わなくなったWebカメラの台座を利用し、 壊れた TrackIR4 が載るようにスペーサーみたいな物を3Dプリンターで作成して、両面テープで貼り付けました。

f:id:blogdaichan:20210515113218j:plainf:id:blogdaichan:20210515113206j:plainf:id:blogdaichan:20210515113153j:plain


Win10 64bit で動作するのか?


とりあえずディスプレイにはセットできるようになりました、さてWim10で動作するのでしょうか、これを使用していたときはWin XP だったような気がする。

メーカーサイトで確認してみました、今は TrackIR5になっていますね 4は使えるのでしょうか?

www.naturalpoint.com


フォーラムを見ると TrackIR4 についてのスレッドがありました、最新の TrackIR5ドライバー・ソフトウエアで動作するようですが、最近の書き込みでは不具合が出るようなことが書いてあります。

ダメ元で最新の ドライバー(Ver.5.4.2)をインストールしてみましたが、なんと言うことでしょう何の問題も無く動作しました。

TrackIR4が使えそうでFS2020にも対応しているので、次の問題 Track Clip の性能がいまいちなのを解消したいと思います。

感度が良くない Track Clip をなんとかする


Track Clip とは反射板が3個付いていて帽子などに取り付け顔の動きを検知するものです。

f:id:blogdaichan:20210515131824j:plain


感度が悪く使いにくいので、Track Clip Pro と言う製品が発売されています。

f:id:blogdaichan:20210515133314j:plain

ヘッドフォンに取り付けるタイプで赤外線LEDを光らせる電源用にUSBコードが付いています。

持っているヘッドフォンはコードレスなのでこれを取り付けた場合コードが邪魔になります、また自作出来そうなのでコードレスのTrack Clipを作ってみようと思います。

コードレス Track Clip の自作


TrackIR を自作している方の動画を YouTube で見かけます、PlayStation Eye を使って作成しているようです 、これらの中に Track Clip の寸法などがありましたので参考に作成します。

使用パーツ

バッテリー:リチウムイオン3.7V 手持ちの小型ノートのバッテリーから取った物を使用します、同じような物はこれ。


IR LED:5mm 940nm 3個 、手持ちの物を使用しました。


充電ボード:1S用1Aまで充電可能、USBケーブルで充電出来ます。


小型基板用スイッチ:電源スイッチとして使用


LED:3mm 赤・青 充電及び電源インジケータ用


抵抗器:2KΩ×1本 50Ω×3本 1/4W 程度、使用するLEDのスペックにより変更する。


その他配線ケーブル

ケースは3Dプリンターで作成しました。

f:id:blogdaichan:20210516083753j:plain

必要な方はお使い下さい。 
TrackClip STL ファイル


回路図


Fritzing を使って回路図を書いてみました、充電表示用の赤色LEDは充電ボードの充電表示LEDを取り外し、そこから配線しています。

使用するLEDのスペックにより抵抗値が変わりますので注意が必要です。


f:id:blogdaichan:20210517092407j:plain

完成した TrackClip

IR LED は縁を削り取りアームに3mm埋め込みます、LEDが出っ張っていてかっこ悪いですが埋め込むと横を向いたとき LED の光が途切れてしまうので仕方ありません。

f:id:blogdaichan:20210515113231j:plainf:id:blogdaichan:20210515113245j:plain


電源LED(青)と充電LED(赤)を点灯させています、充電表示LEDは満充電で消灯します。

f:id:blogdaichan:20210515113143j:plain


ヘッドフォンに取り付けた状態、ヘッドフォンはロジクールH800rです。

f:id:blogdaichan:20210516091456j:plainf:id:blogdaichan:20210516091451j:plain



動作確認


コードレス TrackClip をヘッドフォンに取付動作確認しました、問題なく動作したので FS2020で TrackIR 4 を使ってみようと思います。



www.youtube.com


FS2020に使用できるHead Tracker を試す

日本語に対応したMSFS2020を購入して10数年ぶりのフライトシムを満喫しています。

昔に比べて圧倒的に美しく繊細になった機体やシーナリーに魅了されていますが、操縦の方は全然ダメで教則本が早く発売されないか心待ちにしています。

慣れない操縦をしている最中視点を移動する場合、ジョイスティックまたはキーボード・マウスなどで操作するため操縦が疎かになりもう大変。(;゚ロ゚)

そこでYouTubeなどで紹介されているヘッドトラッカーを試してみたいと思います。

無料で使えるヘッドトラッカー2種類を試す

最初に試すのは EDTracker

arduinoと加速度センサーで動作させるようです、使用するパーツは持っていますのでまずはこれを作成します。

使用パーツ

arduino pro micro


ジャイロセンサー MPU-9250


ブレッドボード上に配線し動作確認しました、作成方法はこの記事が参考になります。

f:id:blogdaichan:20210511162634j:plain

ヨー・ピッチ の動きはスムーズで問題なしですが、上下・前後の動きに対応しないのが欠点です、またUSBケーブルでPCに常時接続しなければならずケーブルが邪魔になります。

動作動画


www.youtube.com


FS2020でこれを使用するためには別に OpenTrack が必要です、この記事が参考になります。

EDTracker github

OpenTrack github


AITrack+OpenTrack

Webカメラを使用したヘッドトラッカーで、Webカメラ以外に必要なハードはありません。

使用したWebカメラ


参考にした動画


www.youtube.com

手 順

AITrack を立ち上げ 設定から IP:127.0.0.1 Port:4242 に設定する。

OpenTrack を立ち上げ
Input:UDP over network にして 右側の設定を開き Port:4242 に設定する。
Output:freetrack 2.0 Enhanced に設定する

Options をクリックし Output タブで Pirch と Z を invert にする。

Mapping で好みの動きに合わせる。

動作動画

www.youtube.com


頭に付けるものがないので煩わしさはありません、ヨー・ピッチに加え上下・前後にも対応しています、頭の微妙な動きにも反応するので車酔いしそうになります、このあたりはMappingで調整出来そうですが。

AITrack github