ブログだいちゃん

ブログだいちゃん

趣味のブログ

ブログだいちゃん

Arduino UNO を 使用した Plot Clock を作成してみました

何を作ろうか考えていたところ、かなり前にホワイトボードに時刻を描くプロットクロックの動画を YouTube で見た事を思い出しました。

Plot Clock はこのようなものです、時刻を書いては消して、また書く動作を続けますアナログぽくておもしろいですね。



www.youtube.com


この動画のようにホワイトボード用の水性ペンを使用した場合、拭き取り時の汚れやペンの乾きの問題があるので躊躇していました。

しかし、この問題を解決したYouTube動画がありました。

グローシールにUV LED の光を照射して時刻を表示させる物です、照射したあと残光が残りますので連続的に時刻を描くと汚くなりますが、押しボタンスイッチを押したときに表示させれば問題ありません。

今回はこのタイプを作成してみることにします。



www.youtube.com
 
 

 
 

回路図・スケッチ・ケース


ここからファイルをダウンロード出来ます。

www.thingiverse.com


作成及び設定方法は上記参考動画(Part1:制作編)と下記参考動画(Part2:設定編)があります。


www.youtube.com


作成及びキャリブレーション

 

ブレッドボードに仮組み

調整と動作確認のためブレッドボード上に配線し、前面パネルを印刷してサーボ等を取り付けました。

f:id:blogdaichan:20211012081621j:plain
 

キャリブレーション

動画Part2を参考にキャリブレーションを行います、ある程度4隅に合わせたら時間を表示させながらさらに調整しますが、この調整に相当時間が掛かります。

また、アーム接続箇所のネジを締めすぎると表示される文字が歪みますので、文字がうまく表示されないようなら調整が必要です。


表示させてみました、手書きっぽいところがよいですね。

f:id:blogdaichan:20211012081623j:plainf:id:blogdaichan:20211012081625j:plain


動作動画


仮組み出来たので動作確認しました、書き順はマネしないようにして下さい。(^_^)


www.youtube.com


Rspberry PI Pico に GPS を接続し OLED に表示してみた

スマートフォンにはGPSが搭載されているので位置情報などはスマフォで見れば事足ります。

なので、GPSモジュールを使用して緯度経度を測定するような事は必要なくなりましたが、手元にドローンで使用するために購入してあったGPSがありますので Raspberry PI Pico を使用してOLEDに情報を表示してみたいと思います。
 
 

 
 

参考動画


YouTube にアップされていたこの動画を参考にしました、GitHub へのリンクがありコードと配線図がダウンロード出来ます。


www.youtube.com


ライブラリーの導入


OLEDとGPSのライブラリーが必要になります、プログラムコード内にライブラリーのリンクが記入されていますのでインストールします。

OLEDのライブラリーは以下のURLです。

github.com

GPSのライブラリーです。

github.com


使用パーツ


GPS:NEO-M8N 小型(2×2cm)の物を使用しました、ubloxです同じような物が使用できると思います。

f:id:blogdaichan:20210824095030j:plain


OLED:0.96インチ


配線と動作確認


ブレッドボード上に配線しました、パーツはOLEDとGPSのみですので簡単です。

f:id:blogdaichan:20210824093509j:plainf:id:blogdaichan:20210824093506j:plain

起動後 no data と表示され GPSデーターが表示されなかったので、 GPS が対応していないのかと諦めかけましたが、20分程度経過したら緯度・経度などが表示されました、部屋の中だったので衛星の補足に時間が掛かったのかも知れません、屋外であれば補足までの時間短縮が可能かと思います。

GPS衛星補足数を表示させると、屋内でも10個程度の衛星を補足しましたので、緯度・経度を地図に照らし合わすとピッタリ自宅の位置を示しました。

※ 緯度・経度にはモザイクをかけています。

GPS衛星補足数表示には以下を追加します。


衛星補足数を取得する。
sate = str(my_gps.satellites_in_use) # OLEDに表示させるには文字列に変換する


OLEDに表示する。
oled.text("satellites:"+ sate, 0, 48) #日付の部分に表示させる(置き換える)

マキタの人気コードレス掃除機を購入してみた

我が家の愛犬ラブラドールレトリバー、黒ラブのダイスケは短毛ですが抜け毛は半端なく多く掃除が大変です。

抜け毛の多い犬を飼っている方は掃除に苦労されていることと思います。

掃除には強力なコード付き掃除機(紙パック式)を使用していますがそろそろ寿命が近づいてきました、またコードが付いるため稼働範囲が制限されるのでコンセントの差し替えなどイライラが耐えません。

コードレス掃除機はこのイライラを解消してくれる唯一の掃除機ですが問題は吸い込み能力です、カーペットなどに絡みつく犬の抜け毛がどれくらい吸い取れるのか不安があったので手を出せずにいました。


掃除機の選定基準


コードレス掃除機にする:イライラ解消のためコードレスは必須です。

吸引力の大きいもの:カーペットなどに絡みつく犬の毛を吸い取れるもの。

掃除機のメンテナンス:サイクロン式で掃除機の清掃が面倒でないもの

価格対性能:コストパフォーマンスの良いもの。

以上を考慮して探し見付けたのがこれです、18V・サイクロン付き・紙パック式・バッテリー充電器無しのタイプをチョイスしました。

YouTube 動画でのレビューで高評価、商品ページでも評価が高いコメントが多いようです、またマキタの電動工具を持っていますので、バッテリーを共有出来るのが最大のメリットです。



使用感


コードレス最高、手軽にいつでも使えるのがいいですね、コード式の面倒さが解消されました。

吸引力は今まで使っていたコード式掃除機には劣りますが、18Vタイプなので「強」で行えば犬の抜け毛も結構吸い込んでくれますし手軽に使えるので小まめに掃除が出来、部屋が汚れなくて快適に過ごせます。

サイクロンのオプションは絶対おすすめです、メンテナンスも簡単ですし紙パックには殆どゴミがたまらないので紙パックの節約にもなります。

マキタの工具を持っていればバッテリーを共有出来ますのでコストの面でも有利ですね。

ウォーターポンプを使用した自動アルコールディスペンサーを超音波センサー式に変更する

前の記事でウォーターポンプを使用した自動アルコールディスペンサーを作成しましたが、IRセンサーだとやはり周りの光に影響され誤動作が起こります。

そこで、光に影響されない超音波センサーを使用した物に変更したいと思います。
 
 

 
   
前回作成したIRセンサー式の記事
blogdaichan.hatenablog.com


使用部品


超音波センサー:HC-SR04、前回のパーツのIRセンサーを超音波センサーに変更します。


抵抗:1kΩ×1本 2kΩ×1本、5V⇒3.3Vにプルダウンするため


回路図


IRセンサーを超音波センサーに変え、プルダウン用の抵抗を追加しました、3.3Vに接続しプルダウン抵抗無しで動くかも知れません、試していませんが。


 
 

ケースの一部変更(超音波センサー取付のため)


超音波センサーを取り付けるためケースの一部を変更します、またスプレーノズルを市販のスプレーボトルのノズル部分を使用するよう変更しました(前回記事のパーツリストにあるスプレーボトルのノズルに対応しています)。

プログラムコード(2021/08/08 更新)


HC-SR04 のライブラリーを使用するとプログラムが簡単になりますので 、Thonnyを使用しライブラリーをインストールします。

Thonny を起動し [ツール]⇒[ Manage packages] を開き [hcsr04] で検索し、検索された中の [mPython-hcsr04] をクリックしインストールするとMicroPython用のライブラリーがインストールできます。


 

MicroPython プログラムコード


動作させると Thonny で以下のエラーが出ますが問題なく動きます。

WARNING: Could not sync device's clock: 'RTC' object has no attribute 'init'
WARNING: Device's real-time clock seems to be off by 18960713 seconds

これについての関連記事がありました。

forum.micropython.org

このフォーラムによると Thonny を Ver.3.3.11 にすると出ないようです、ちなみに私のはVer.3.3.10でした。
 

from machine import Pin
from hcsr04 import HCSR04
from utime import sleep
relay = Pin(16,Pin.OUT)     
led_red = Pin(17,Pin.OUT)
led_blue = Pin(18,Pin.OUT)
sonic = HCSR04(trigger_pin=14,echo_pin=15,echo_timeout_us=1000000)
while True: 
    distance = int(sonic.distance_cm())
    print (distance)    
    if distance > 6:
        relay.value(0)
        led_red.value(1)
    else:
        led_red.value(0)
        led_blue.value(1)
        sleep(0.2)
        relay.value(1)
        sleep(0.3)
        relay.value(0)
        sleep(2)
        led_blue.value(0)    

 
 

動作試験(仮組み)


動作試験を行うため仮組みしました、最初画像の上側の超音波センサーを使用しましたが動作が不安定で下側の超音波センサーに変えました、同じHC-SR04ですが全くの別物です。

手持ちに水晶発振子の付いた画像下側の超音波センサーがなかったので、不具合が出た超音波センサーを使用しましたが距離測定が不安定ではまりました、。



組み込んだ画像です、スプレーノズルはホットグルーで超音波センサーに貼り付けました、見た目は良くありませんが蓋で隠れますので。(^_^;

 

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:B09KBB37KC: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端子 に接続します。(取付画像参照)


プログラム


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プリンターで作成しました、サポートを最小限にするため分割して印刷しています。


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


組み込み


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

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

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

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


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


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


動作させてみました



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