投稿

11月, 2023の投稿を表示しています
 mouse 40W MAX core i5 8250U メモリ8GB SSD無し ACアダプタ無し、仕様書が検索できないのだが、FullHDなのはわかったので、7350円+送料1100円=計8450円で落札。 ノートパソコンが到着し、公式ページで型番を元に、FAQ等を検索できるようになり、M2.SSDと2.5インチSSDの両方を搭載でき、メモリも空きスロットが1つあり、増設可能と判明。 高速なSSDは搭載できず、普通のSSDと同じ速度のM2.SSDしか搭載でき無さそう。 実際に問題ないか、中を開けて見る。 中を開けるのが嫌になるほど面倒だったが、搭載に問題なさそう。 無難に、低発熱が気に入っており、128GBを2台購入して問題の無かった、安価なSSD、Hanye N400の256GB版を発注し、2580円。 ACアダプタは、ハードオフを2軒回って、19Vではないが使えるだろうと、550円でHPの18.5V 3.5Aを購入。 ACアダプタを接続して、起動しようとしてみたが、ドライブを接続していないと起動でき無さそう。 これでWindowsを入れて動作するようなら、11580円で済みそう。 安く済みそうなので、Acerノートも メモリ8GBにしておこうと、730円+送料230円で落札。 到着が楽しみ。
 i5 8250U メモリ8GB SSD256GB FullHD以上のノートパソコンの格安調達、予算1万円を目指そうと思ったが、中古販売をいろいろ見て回ったが、3万弱ぐらいになりそう。 ヤフオクも、OS付きの完動品は2万を超えそう。 SSD128GBで妥協するにしても、メモリ4GBを買ってメモリ増設してたら結局2万を超えそう。 USB2.0の外付けで内臓SSDやHDDを接続するものを持っているので、SSDを別購入、OSを自分で入れなおすことを前提に、ジャンクを検討してみると、1万円強で何とかなりそう。 傷はあっても、SSDを入れると動作に問題なさそうなものの入札を始めた。
 簡易検査BOXの作成を進め、デモをするように進めているが、スモールタワーといえど、重い本体と、1つしかない液晶ディスプレイを運んでデモをするというのはリスクが高い。 FullHDのノートパソコンで、i5-7400ぐらいの速度があれば、プログラムをFullHD専用できて、画面のレイアウトを調整しまくる必要も無くなり、プログラムを設定用と検査用に分ける必要性も低下して、統合すれば開発が楽になるし、デモの速度が遅いことに悩む必要も無くなるし。 しかし、販売が決まらないことにはこれ以上の投資をあまりしたくない。 そこで、i5 8250U メモリ8GB SSD256GB FullHD以上のノートパソコンの格安調達を進めてみることにした。 並行して、PrimeA Galleria AM J02(A6-3500)よりも、メモリを増やすと処理速度が早くなる Acer Aspire AS5742(i5-480M)のメモリ8GB化も検討する。 (AS5742は、MS-Officeがインストールされている唯一のPCなので、残せるようにしておきたい。)
CPU A6-3500 WQindows10home64bitでの、検査プログラムでのメモリ使用量検証。 i5-7400 16GB windows11Pro64bitのプログラム開発機では、トリミング無しだと7.7~8.0GB程度メモリを使用していたが、A6-3500の4GBメモリを外して8GBとし、検査物48cmx38cmの若干内側に設定した周囲200dot程度のトリミングでは、5GB程度のメモリ使用量に収まった。 当初予定の37cm離れて長辺50cm検査よりも、5mmほど多く距離が開いて長辺56cm程度になっているが、設定プログラムでトリミング設定をしてから検査プログラムを動作させると、8GBメモリ+CPU内臓ビデオでのビデオメモリシェアでも動きそう。 ぎりぎりの検証は、面倒。仕様書に注意事項を記載し、もう手抜きでいいや。 以上より、メモリの最低動作環境を8GB、推奨動作環境を16GBとすることに決定した。
 monicaに質問してみた。 Python+OpenCVでの質問です。USBカメラは、ret, frame = cap.read()コマンドを発行すると、コマンド発行前にキャプチャーしたデータを出力するようです。この状態は、一般的なUSBカメラの動作ですか? はい、一般的なUSBカメラでは、cap.read()コマンドを発行すると、コマンドが実行される前にキャプチャーされたフレームが返されることがあります。これは、カメラがビデオフレームをリアルタイムで提供するための仕組みです。retはブール型の変数で、フレームの読み取りに成功したかどうかを示します。frameは実際のビデオフレームデータです。このような方法でフレームを取得することで、OpenCVを使用してリアルタイムの映像処理や画像処理を行うことができます。 うわ、これって一般的なことなのか。 高解像度ゆえの1FPSの低速キャプチャースピードでは、かなり考え物の仕様だな。
イメージ
上の様な感じで検証開始。 トリミング設定もうまくでき、本プログラムへの設定受け渡しもOK。 検査は、i5-7400機では9.3秒程度~の検査時間が、12.5秒程度~に伸びた。タイミング調整で計8秒のasyncio . run ( asyncio . sleep ())を入れているので、タイミング調整以外で1.3秒から4.5秒と3倍強遅くなっている。 ただ、感度を上げて全面欠点判定になると、i5-7400機では~40秒程度の検査時間が、~2.5分程度に伸びた。 100円ショップの大きな画用紙は、巻きで売っていたので端がカールして、かなり感度を落とさないと広範囲の欠点判定になってしまう。 また、露光時間の切り替えに7秒程度の時間がかかるために露光時間を固定にしたが、上と下のLED照明を一緒にしたため、露光時間を上に合わせると下照射の撮影が暗すぎる、下に合わせようとすると上照射の撮影が全面白飛びする。 また、LEDの設置範囲を検査物のサイズギリギリに合わせたが、下照射は端の方が暗くなり、端の方が欠点判定になりやすくなる。 LEDの追加や検査BOXの大型化はすぐには難しいので、アルミホイル等で光を反射拡散してなんとかしてみたいところ。 何回か動作させていると、途中で上照射と下照射の混ざった画像が撮影された。 更に、色画用紙を赤に交換しながら検査撮影していたら、画用紙をセットしている手が映り込んだ。なぜ??? どうも、1~2秒前の画像を取り込んでいるようだ。 ret, frame = cap.read()で新たに撮影してデータが出力されるのでは無く、1FPSの撮影が常時行われていて撮影済のデータを出力しているらしい。 どうりでどう見てもLEDの安定化に3秒もかかってなさそうなのに、asyncio . run ( asyncio . sleep (4))で4秒も確保する必要があるはずだ。 また、パソコンの処理速度が遅くなると、5秒も確保する必要があるらしい。 何てことだ。タイミング処理を見直す必要がある。 しかし、根本的な解決には高速な高解像度カメラが欲しいが、8MPぐらいまでしか見つからない上、高くて、ソフトの販売が決定していない以上、今は手が出せない。 どうしたものか。
イメージ
 非常用に保有しているパソコンは、PrimeA Galleria AM J02。 CPUはA6-3500でターボで2.4GHz、メモリ4+8の12GBに増量、HDD500GB、Windows10Home 64bit、ビデオはお金をあまりかけずに少しでも早くしようとしてGF8400GSをWindows8のドライバで動作させている変態機。 前のメインの自作機Core2Duo E7300にも速度で負けていたパソコンだが、遅いパソコンでも動作するかの検証にはなるはず。 ディスプレイはメイン機と共用だったので、ディスプレイの移動が面倒だが仕方ない。 書き忘れていたように思うが、Windowsは日本語を含まないユーザー名で登録しているし、日本語を含まないフォルダ名を使用していたが、「スペース」を含むフォルダ名で開発していた。 しかし、バッチファイルで起動させるにあたり、「スペース」を含まないフォルダ名にしないとパスが通らず、プログラムを保存しているファイルに「CD」で移動してから起動する必要があるため、プログラムの一応の完成と共に、「スペース」を含まないフォルダに移動し、検証しなおしている。 GalleriaにVSCodeをインストールし、Python3.11をパスを通してインストールし、バッチファイルでライブラリをインストール。 (AS5742では若干インストールしていたため、初めて最初からの検証になる。) 間違ってプログラム用のバッチファイル起動しまったが、相変わらず環境変数の一時追加はできないが、手動で環境変数を追加していないにも関わらず、動作してしまった。 「\site-packages」フォルダへのパスは通さなくてもいいの? 単にhdiapiライブラリの認識が、VSCodeでは非常に遅いだけ? まあ、何はともあれ動作したので、メモリの使用量をタスクマネージャーで確認しながら検証開始。
 保有しているノートパソコンは、Acer Aspire AS5742-F52D/K。 CPUは、Core i5 480M、メモリを4GBに増設し、HDDをSSD128GBに換装し、Windows10Home 64bitにアップグレードしたもの。 4656x3496の解像度でメモリ上でデータを扱うため、メモリ使用量が1.4~3.5GBになることを確認してはいるが、SSDなので仮想メモリも高速なのでなんとかなるかな。と思っていた時期もありました。 まず、 Windows11とは違い、 Windows10では、バッチファイルで環境変数パスの一時追加ができない。 どうも、Windows11でも、パスに使用できる記号が 「¥」や「/」では一時追加できず、 「\」半角のバックスラッシュでバッチファイルの記述をしなくてはならかったのですが、Windows10では、半角バックスラッシュを「¥」に勝手に変換してしまい、 環境変数パスの一時追加ができない状態に陥る。 (Windows11はProのみ、Windows10はhomeしか保有していないため、Proとhomeの違いかは確認できない。) 仕方なく、環境変数を手動で入力設定し、パスを通して動作検証開始。 ret, frame = cap.read()の部分でエラーが出る。 FullHDでの撮影にしても、エラーが出る。 カメラ解像度を設定せずVGAでの撮影にすると、エラーが出ない。 OpenCVって、メモリが十分無いとエラーが出るのか~。 仮想メモリでは対応できないのか~。 とりあえず、メイン機が故障したときのための繋ぎとして非常用に保有している、スモールタワーで、Core2Duoよりも遅いメモリ12GBのWindows10のサブ機で再検証することにする。
イメージ
 検査ボックスのテープ細工見本に、10列にLEDテープを貼り付けた結果はこんな感じ。 天井の穴は、カメラの出口。 ATX電源に直結で、問題なくLEDが発光することを確認。 後ろにリレーを貼り付けて、カメラをはめ込んだプラダンを載せて撮影方向を変更できるようにして、動作チェックできるようになった。 次は設定プログラム。 画面解像度のスライダーを動かすと強制的に自動再起動しようとしたが、私にはできない。 何故できないかわからず、とりあえず手動で再起動して設定を反映させるように修正。 また、トリミング範囲を決めた後、左上の座標と右下の座標を保存するようにしていたが、複数の撮影解像度に対応しようとすると問題があることに気づいた。 端から何ドットトリミングするかを保存して、本プログラムの方もそれに対応するように修正。 移動プレゼンできるよう、ノートパソコンでの検証に進む。
イメージ
 検査ボックスのテープ細工見本に、LEDテープを貼り付け、一列ごとに発光確認しながら組み込んでいたが、どうにも手間がかかる。 (一列長さがおかしくて短い方を選択したが、後でハンダ付けして長い方に戻す予定。) いろいろなLEDテープのレビューの書き込みを眺めていると、1列のまま電気を供給するよりも、2列にして電気を供給する方が明るい、との書き込みがあった。 もしかして、10列を直列で電気供給するよりも、並列にして電気供給した方が安定化時間が短くてすむようになるのでは?と思いついた。 10列を並列に接続するための部品をホームセンターに探しに行ってみる。
 ファイルへの保存は、読み込みとは同じ形にできなかったが、タプルとして保存するようにしたら、できた。     elif event == 's' : # 「s」キーが押されたら、設定をファイル保存         TY2 = CAY1 - TY3         TX2 = CAX1 - TX3         env_vars [ 0 ] = ( 'CAY1' , CAY1 )         env_vars [ 1 ] = ( 'CAX1' , CAX1 )         env_vars [ 2 ] = ( 'VCAP1' , VCAP1 )         env_vars [ 3 ] = ( 'EXP1' , EXP1 )         env_vars [ 4 ] = ( 'TY1' , TY1 )         env_vars [ 5 ] = ( 'TX1' , TX1 )         env_vars [ 6 ] = ( 'TY2' , TY2 )         env_vars [ 7 ] = ( 'TX2' , TX2 )         env_vars [ 8 ] = ( 'DSP' , DSP )         with open ( 'C:/code/py311/Ta2S Inspection soft/settings1.txt' , 'w' ) as f :             for key , value in env_vars :           ...
 設定プログラムに組み込もうとしたが、エラーが出て動かない。 doubleが関係しているようだが、整数にdoubleなんてない!!! いろいろ調べていくと、エラーの原因は、タプルで読み込んでいるため、とあたりがついた。 printして確認してみると、 ut_now = datetime . datetime . now () print ( ut_now , CAY1 , CAX1 , VCAP1 , EXP1 ) print ( ut_now , TY1 , TX1 , TY2 , TX2 , DSP ) print ( ut_now , DY1 , DX1 , SY1 , SX1 ) asyncio . run ( asyncio . sleep ( 10 )) CAY1 = env_vars[0]などとしてしまうと、CAY1=('CAY1', 4656)などになってしまい、整数じゃない!!! そりゃーエラーもでるわ。 ここから数値だけ抜き出す方法を調べ、とりあえず読み込み側を修正してみると、エラーが出ずに先に進めるようになった。 # ファイルから整数の配列を読み込む with open ( 'C:/code/py311/Ta2S Inspection soft/settings1.txt' , 'r' ) as f :     lines = f . readlines () # 配列を環境変数に格納する env_vars = [] for line in lines :     key , value = line . strip (). split ( '=' )     env_vars . append (( key , int ( value ))) CAY1 = env_vars [ 0 ][ 1 ] CAX1 = env_vars [ 1 ][ 1 ] VCAP1 = env_vars [ 2 ][ 1 ] EXP1 = env_vars [ 3 ][ 1 ] TY1 = env_vars [ 4 ][ 1 ] TX1 = env_vars [ 5 ][ 1 ] TY2 = env_vars [ 6 ][ 1 ] TX2 =...
イメージ
プラダンの切れ端に若干小さめの四角い穴をあけ、 USBカメラモジュールをはめ込み取り付けた。 ぐらつきやバタつきもなく、いい感じ。 軽いので、たわみも無さそう。 設定プログラムができたら、位置決めして固定しよう。 ATX電源のショートはこんな感じ。電源奥のスイッチか、テーブルタップでON/OFFする。 電源コードのハンダ付け工作は、こんな感じ。 これで、LEDテープを余裕のある電源で、使用できるようになった。
 配列を設定ファイルに使う方向で、調べてみて、基本的な動作ができるものができた。 # ファイルから整数の配列を読み込む with open ( 'C:/code/py311/Ta2S Inspection soft/settings0.txt' , 'r' ) as f :     lines = f . readlines () # 配列を環境変数に格納する env_vars = [] for line in lines :     key , value = line . strip (). split ( '=' )     env_vars . append (( key , int ( value ))) # 配列の値を修正する env_vars [ 0 ] = ( 'CAY1' , 4656 ) env_vars [ 1 ] = ( 'CAX1' , 3496 ) env_vars [ 2 ] = ( 'TY1' , 50 ) env_vars [ 3 ] = ( 'TX1' , 50 ) env_vars [ 4 ] = ( 'TY2' , 4556 ) env_vars [ 5 ] = ( 'TX2' , 3396 ) env_vars [ 6 ] = ( 'DSP' , 2 ) # 環境変数をファイルに書き込む with open ( 'C:/code/py311/Ta2S Inspection soft/settings1.txt' , 'w' ) as f :     for key , value in env_vars :         f . write ( f " { key } = { value } \n " ) import無しで動くので、Pythonの基本機能で動いているのか? これを設定プログラムに組み込めば動くのだろうが、理解していないものを組み込むことになる。 だが、import osを使うよりはシンプルで、今後感覚的には理解できそうな気がする。
 LEDテープの発光安定化に4秒かかる件、 LEDテープの15Wに対し、付属のACアダプタが18W、これが遅れの原因かも、とハードオフに中古のACアダプタを見に行ったが、ちょうどいいもの無し。 古いATX電源の予備があるので、不細工になるけど、これでショートさせて使えばどうか? と思い立ち、準備を開始。12Vは、216Wもあるし。 電源を単独起動させる方法 スズメッキ線を購入し、2㎝ぐらいに切って折り曲げ、ショート。 マザーボードに12V電源供給するためのオプションケーブルを購入し、切断して、絶縁被覆付圧着スリーブで接続できるようにしようとしたが、すぐ抜ける。 初心者向けの、やっすい30Wのハンダこても念のために買っておいたし。(前は借り物) 明日、ハンダ付けにしよう。 USBカメラモジュールの、ローリングシャッターの動きが悪いわけではないよね?
 カメラの設置位置決めが、カメラが小さいのでかなり難しそう。 被検査物の設置場所も、それほど正確にできないだろうし。 ということで、monicaの回答を参考に、トリミングを追加した。       sg . Frame ( '' , [[ sg . Text ( 'トリミング480  なし:0<==>500:MAX  4656-2n' )],                    [ sg . Slider (( 0 , 500 ), 0 , 50 , orientation = 'h' , key = 'SLIDER_TY1' , enable_events = True )],                    [ sg . Text ( 'トリミング380  なし:0<==>500:MAX  3496-2n' )],                    [ sg . Slider (( 0 , 500 ), 0 , 50 , orientation = 'h' , key = 'SLIDER_TX1' , enable_events = True )], まずは、両側を決め打ちで、同量削っている。         ret , frame01 = cap . read () # BGR         asyncio . run ( asyncio . sleep ( 2 )) # 撮影2秒待ち/2秒入れないと前の画像が残る         # トリミング処理         TY1 = int ( values [ 'SLIDER_TY1' ]) # トリミングスライダーYの読み込み         TX1 = in...
イメージ
プログラムがかなり仕上がってきたので、デモ用に、プラダンとデコパネで、検査ボックスの、テープ細工見本を作成した。  天井にカメラモジュール用の穴をあけている。 プラダンは柔らかいので、カメラを取り付けてたれ下がるようであれば、天井手前の補強が必要かも。