投稿者「wpepea」のアーカイブ

Aliexpressで買った3wレーザーダイオードモジュール

おそらく同じもの複数売られているけどこいつ

Vfは3.05ぐらいだったのでおおよそ表示通り。30mA(15mAの定電流ダイオード2並列)でしっかりと光る。それより若干電流が小さくてもレーザーとして光ったはず。(試して時間がたったので記憶が曖昧)

電線は蚊トンボの足のようにもげやすい。(付け直しのはんだはやりやすかった)

電池2本駆動だとレーザーダイオードで3Vつかい、昇圧しないと定電流回路を動かす分の電圧が足りない。

というわけでAliで売っているいつもの昇圧コンバーターで昇圧。どうせ、昇圧するなら作るの簡単な定電流ダイオード2並列で雑に作ろうということで定電流ダイオード(秋月のこいつ)の動作に必要な4.3vをたして3V(レーザー)+4.3V(定電流ダイオード)の7.3V以上に昇圧。(ちょっと余裕持たせて8.5Vぐらい)

単三電池*2->昇圧コンバーター->定電流ダイオード(15mAの2並列)->スイッチ->ダイオードのシンプル構成

余っていた使わない基盤に張り付けて完成。1月ほど使っているけど今のところ安定動作。

電流はおおよそしか制御できていないはずだけど安い部品なのでざっくり。

試していないけど、Aliに使えそうな定電流ICがあった。電池2本だと厳しいだろうけどリチウム電池やスマホから5Vとれるならシンプルに使えそうなきがする

(2025/10/1追記)

壊れたレーザーポインターの基板に取り付けて使っていた動いた。よく見るとその基盤は、22Ω抵抗とスイッチのみ(単三2本で動作)。レーザーの劣化が若干早い気はしたけど、いつもスイッチが下手るのが先。そんな単純な構成でもおおよそ動く模様。部品高いものでもないし壊れたら交換するぐらいに割り切って使ってもよいかもしれない。

トリマー(Makita3707)用1/4インチシャンクコレットコーン

先日Aliexpressでならい加工用のトリマービット(こいつ)を買ったが、よくみたらシャンク径が1/4インチで元々6mm軸なのでそのままだと入らなかった。

Aliexpressに1/4インチ用のコレットコーン(接続部品:こいつ)が売っていたので購入。

本日、届き動作確認したところ使えた。

ただし、ナットが1回転程ほど6mmのやつより回っていない気がする。

6mmのコレットも1/4インチのコレットもともに高さ、外径をはかると同じと思われる。ただし、円周の計測このノギスだと微妙に測りにくいので0.35mmとか違うのかもしれない。

動かす分にはガタ等も感じないのでこのまま使うが、コレットコーンと一緒に純正(高さ12mm)より1mm高い13mmのナットも売っているようなのでそっちに変えるとよりしっくりするかもしれない。

LTspiceのコンデンサ初期電圧設定

久しぶりにLTspiceを使ったらコンデンサの初期電圧設定方法がわからなかったのでメモ。

バージョンは24.1.10

上部のアイコン欄にあるSPICE DIRECTIVE(“.t”アイコン)をクリック

出てくるテキスト入力欄に、コンデンサの電圧初期状態を指定してあげる。例

.ic V(n002)=0

chatgptに書かせた開設がわかりやすいのでそのままぺたっと

.ic コマンドとは

.ic は Initial Condition(初期条件) の略です。

回路シミュレーションで コンデンサやインダクタなどの状態を初期値から始めたいときに指定します。

形式:

.ic V(node)=値


V(node):指定するノードの電圧

値:初期値(V単位)

2. 具体例:.ic V(n002)=0
.ic V(n002)=0


ノード n002 の電圧を シミュレーション開始時に 0V に固定

これは、コンデンサや回路の「立ち上がり電圧」を指定するときに使います

例:

回路にコンデンサ C1 があって、ノード n002 がコンデンサの一端に接続されているとします

.ic V(n002)=0 を指定すると、LTspiceはシミュレーション開始時に C1の電圧を0Vとして計算を始める

これにより、シミュレーションで不要な初期トランジェントを避けたり、特定の初期状態を作ったりできます

3. 注意点

.ic は DC解析やトランジェント解析で使う

トランジェント解析の場合、コンデンサやインダクタの初期値として作用

代わりに、コンデンサの属性で IC=0 を設定することもできます

💡 まとめ

V(n002)=0 → ノード n002 の電圧を初期値0Vとしてシミュレーション

コンデンサやインダクタが絡む回路で、シミュレーションの開始状態を制御するために使う

解説にはコンデンサの属性で指定できると書いてあるけど、GUI上の入力欄はなくなっているっぽい

こわれた3Dプリンターからはぎ取ったステッピングモーターの動作確認

少し前に、最初に買った3DPが壊れた。(というかいじっていて壊した。)こわれたものはiUSEとかかいてある格安のやつ。(写真内から同じもののブログ記事

ステッピングモーターを一つ外したところXY42STH40-1684Aというものがついていた。(XYSLDJがブランド名?)

6pinのコネクターがついている。6ピンあるけど2番ピンと5番ピンは使用していない。

1,3番ピンと4,6番ピンがセットで使用する物。

コネクターの種類はモーター側は6ピンのJST-XHコネクター、プリンター側は4ピンのJST-XHコネクターだった。ケーブルの色は黒1番ピン、緑3番ピン、赤4番ピン、青6番ピンだった。

元々の3DPはモータードライバーがA4988だったのでアリでこちらのモジュールを購入

ステッピングモータの(コイルが内部でつながっている)1&3番ピンをモジュールのA1/B1のペア、4&6番ピンをA2/B2のペアに接続。

モーターの動作用に12Vの外部電源を接続。

モジュールの大まかな使い方イメージはこちら参考

以下のソースで動作確認。12Vの外部電源でパルスが5000マイクロセカンド未満だと、早すぎてうまく回ってくれなかった。

const int DIR  = 8;
const int STEP = 9;
const int SLEEP_PIN = 7;
const int ENABLE_PIN = 6;
const int pals = 5000;

void setup() {
  Serial.begin(115200);
  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  digitalWrite(DIR, LOW);
  digitalWrite(STEP, LOW);
}

void loop() {
  
  digitalWrite(DIR, HIGH);
  Serial.println("HIGH");
  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(pals);
    digitalWrite(STEP, LOW);
    delayMicroseconds(pals);
  }

  delay(1000);

  digitalWrite(DIR, LOW);
  Serial.println("LOW");
  for (int i=0; i<200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(pals);
    digitalWrite(STEP, LOW);
    delayMicroseconds(pals);
  }

  delay(1000);

}

WindowsのGemini CLIにて日本語入力が効かない

power shellでgemini cliを動かそうとしたが、日本語の入力をしようとしても最後の一文字しか入力されなくなってしまった。昨日はじめて動かしたときは入力できていた。変更があったのはWindowsのアップデートがかかったことと、Power Shellを手動バージョンアップしたこと。

Xを見たところ、他の人も今日から発生といっている人がいたのでWindowsアップデートが原因の可能性が高そう。

@ファイルパス と入力するとそのファイルに書き込んでいる指示内容を読み取ってくれる機能があるとのことなので、直下にgemini_order.txtというものを作成し、そのテキストに指示を書いた。

 @gemini_order.txt

上記を打ち込むことで取り急ぎ回避。(下に回避策追加)

回避策

isuue

npm install -g @google/gemini-cli
でインストールしたら動くよというのがある。npxだとだめだと。
試したら日本語入力できた
In short, using npm install -g @google/gemini-cli and running gemini works fine with the input method. The problem only happens when running with npx https://github.com/google-gemini/gemini-cli .

中身の差分とかもまだみていない。issueみてたら自分で見るより早く差分特定される気がする。

geminiに差分聞いたら、readline周りのライブラリが変わっている模様。面倒なので中身はやっぱり見ていない

✦ 承知いたしました。npxで直接GitHubリポジトリを指定して実行した場合に日本語入力が機能しない問題ですね。ソースコードの差分を調査し、原因の可能性をご説明し
ます。

結論の要約

npxでGitHubから直接実行される最新の開発版と、npmで公開されている安定版とでは、ユーザーからの入力を受け取るためのライブラリが変更されています。


この新しいライブラリ、あるいはその使い方に、マルチバイト文字(日本語など)の扱いに対応しきれていない問題がある可能性が非常に高いです。

---

差分の詳細な説明


1. 実行されるバージョンの違い
* npm install -g @google/gemini-cli:
npmリポジトリに公式にリリースされた安定バージョンをインストールします。これは、十分なテストが行われたバージョンです。
* npx https://github.com/google-gemini/gemini-cli .: GitHubにある最新のソースコード(開発中のバージョン)を直接ダウンロードして実行します。これには
、まだテストが不十分な変更や、開発途中の機能が含まれている可能性があります。

2. 具体的なソースコードの差分



npmで公開されている安定版と、現在のGitHub上の最新版のソースコードを比較すると、コマンドラインでの対話的な入力処理を担う部分に大きな変更がありました。


* 安定版(npmでインストールされるバージョン):
比較的基本的なNode.jsのreadlineモジュールなどを利用して、ユーザー入力を処理しています。これらのモジュールは、標準的なターミナルでの日本語入力
に長年対応してきた実績があります。


* 最新開発版(npxで実行されるバージョン):
より高度な対話機能(例えば、入力履歴の保持や複雑なプロンプト表示など)を実現するために、新しい外部ライブラリ(例: node:readline/promises
の新しい使い方や、その他のCLIライブラリ)への移行が進められています。


この新しい入力処理の仕組みが、Windows環境における日本語(マルチバイト文字)の入力確定(Enterキー)や変換中の文字表示を正しくハンドリングできていな
いことが、今回の問題の直接的な原因であると考えられます。

npmで入れた方は入れた方でgitignoreで無視しているファイル読み込めていない気がする。また後程確認

Upload LittleFSの容量指定(Arduino IDE)

久しぶりに、ESP8266のhttps接続用のcerts.arをLittleFSにアップロードしようとしたら容量が足りないと怒られた。

LittleFS Filesystem Uploader

Building LittleFS filesystem
C:\Users\kitam\AppData\Local\Arduino15\packages\m5stack\tools\mklittlefs\3.0.0-gnu12-dc7f933/mklittlefs.exe -c C:\Users\kitam\git\yobidashi\client\home_yobidashi/data -p 256 -b 4096 -s 65536 C:\Users\kitam\AppData\Local\Temp\tmp-117808-VE8L5miTrPX8-.littlefs.bin
/certs.ar
lfs warn:475: No more free space 20
lfs_write error(-28): File system is full.

error adding file!
ERROR: Mklittlefs failed, error code: 1

-s 65536 の部分が最大容量指定。ArduinoIDEのUpload LittleFSだとtools->FlashSizeで指定されたFSから容量を引っ張ってきている模様。

190k強あるので256KB指定したところ動いた。

LittleFS Filesystem Uploader

Building LittleFS filesystem
C:\Users\kitam\AppData\Local\Arduino15\packages\m5stack\tools\mklittlefs\3.0.0-gnu12-dc7f933/mklittlefs.exe -c C:\Users\kitam\git\yobidashi\client\home_yobidashi/data -p 256 -b 4096 -s 262144 C:\Users\kitam\AppData\Local\Temp\tmp-117808-U6m8GHSN31Wr-.littlefs.bin
/certs.ar


Uploading LittleFS filesystem
C:\Users\kitam\AppData\Local\Arduino15\packages\esp8266\tools\python3\3.7.2-post1/python3.exe C:\Users\kitam\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2/tools/upload.py --chip esp8266 --port COM9 --baud 115200 write_flash 765952 C:\Users\kitam\AppData\Local\Temp\tmp-117808-U6m8GHSN31Wr-.littlefs.bin
esptool.py v3.0
Serial port COM9
Connecting........_____....._____....._____....._____....._____....._____....._____

A fatal esptool.py error occurred: Failed to connect to ESP8266: Timed out waiting for packet header
Completed upload.

AIロボット入門のdocker内VNCでなく手元のVSCodeで操作

ROS2とPythonで作って学ぶAIロボット入門を始めた。

dokcer環境が用意されていて、dokcer内のubuntu上VNCで色々操作をする流れだけどコピペ等が面倒。手元のWindowsからVSCodeでコマンドを打ちたくなった。(なお、書籍ではLinuxPCからlocalhostのdockerにつないで色々学ぶ形だが、LinuxPCでなく同じネットワーク内のWindowsPCからLinuxにつないでいる)

WindowsPCのVSCodeからdockerコンテナにアタッチしてそっちのターミナルで操作することにした。

2章はじめぐらいに以下コマンドを打てというものがあったので打ったところエラー(内容は長いので下に全文コピペ)

ros2 launch turtlebot3_gazebo empty_world.launch.py

ubuntu上VNCから直接コマンドを打つと動く。VNCのdisplay設定がVSCodeでされていない模様。

VSCodeからつなげたdockeのターミナルで以下を実行。

root@fb5b03f29614:~/airobot_ws/install/turtlebot3_gazebo/share/turtlebot3_gazebo/models# export DISPLAY=:1.0

これで動いた模様。DISPLAY=:1.0の1.0とかは配布されているdockerなのできっと教材内では同じ。設定依存のはずではあるので動かなければVNC上のターミナルで以下を打って確かめるとよいかも。

ubuntu@fb5b03f29614:~$ echo $DISPLAY
:1.0

毎回exportするのも面倒なのでbashrcに書いとく。(まだ書籍を始めたばかりなので設定いじったことで後で何か起こるかもしれないけどそんなに影響ないと思う)

echo 'export DISPLAY=:1.0' >> ~/.bashrc

エラーの時のログべたばり

参考

root@fb5b03f29614:~/airobot_ws/install/turtlebot3_gazebo/share/turtlebot3_gazebo/models# ros2 launch turtlebot3_gazebo empty_world.launch.py
[INFO] [launch]: All log files can be found below /home/ubuntu/.ros/log/2025-05-23-09-11-53-206520-fb5b03f29614-734030
[INFO] [launch]: Default logging verbosity is set to INFO
world_file_namee : empty_worlds/waffle_pi.model
urdf_file_name : turtlebot3_waffle_pi.urdf
[INFO] [gzserver-1]: process started with pid [734136]
[INFO] [gzclient -2]: process started with pid [734139]
[INFO] [ros2-3]: process started with pid [734142]
[INFO] [robot_state_publisher-4]: process started with pid [734144]
[robot_state_publisher-4] [WARN] [1747991519.112923629] [robot_state_publisher]: No robot_description parameter, but command-line argument available. Assuming argument is name of URDF file. This backwards compatibility fallback will be removed in the future.
[robot_state_publisher-4] Parsing robot urdf xml string.
[robot_state_publisher-4] Link base_link had 7 children
[robot_state_publisher-4] Link camera_link had 1 children
[robot_state_publisher-4] Link camera_rgb_frame had 1 children
[robot_state_publisher-4] Link camera_rgb_optical_frame had 0 children
[robot_state_publisher-4] Link caster_back_left_link had 0 children
[robot_state_publisher-4] Link caster_back_right_link had 0 children
[robot_state_publisher-4] Link imu_link had 0 children
[robot_state_publisher-4] Link base_scan had 0 children
[robot_state_publisher-4] Link wheel_left_link had 0 children
[robot_state_publisher-4] Link wheel_right_link had 0 children
[robot_state_publisher-4] [INFO] [1747991519.129392605] [robot_state_publisher]: got segment base_footprint
[robot_state_publisher-4] [INFO] [1747991519.129444392] [robot_state_publisher]: got segment base_link
[robot_state_publisher-4] [INFO] [1747991519.129457726] [robot_state_publisher]: got segment base_scan
[robot_state_publisher-4] [INFO] [1747991519.129469065] [robot_state_publisher]: got segment camera_link
[robot_state_publisher-4] [INFO] [1747991519.129480764] [robot_state_publisher]: got segment camera_rgb_frame
[robot_state_publisher-4] [INFO] [1747991519.129492582] [robot_state_publisher]: got segment camera_rgb_optical_frame
[robot_state_publisher-4] [INFO] [1747991519.129504564] [robot_state_publisher]: got segment caster_back_left_link
[robot_state_publisher-4] [INFO] [1747991519.129516189] [robot_state_publisher]: got segment caster_back_right_link
[robot_state_publisher-4] [INFO] [1747991519.129527665] [robot_state_publisher]: got segment imu_link
[robot_state_publisher-4] [INFO] [1747991519.129539155] [robot_state_publisher]: got segment wheel_left_link
[robot_state_publisher-4] [INFO] [1747991519.129551238] [robot_state_publisher]: got segment wheel_right_link
[gzclient -2] Aborted (core dumped)
[ERROR] [gzclient -2]: process has died [pid 734139, exit code 134, cmd 'gzclient '].
[ERROR] [gzserver-1]: process has died [pid 734136, exit code 255, cmd 'gzserver /home/ubuntu/airobot_ws/install/turtlebot3_gazebo/share/turtlebot3_gazebo/worlds/empty_worlds/waffle_pi.model -s libgazebo_ros_init.so -s libgazebo_ros_factory.so -s libgazebo_ros_force_system.so '].
[ros2-3] Wait for service timed out
[ERROR] [ros2-3]: process has died [pid 734142, exit code 1, cmd 'ros2 param set /gazebo use_sim_time True'].
^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT)
[INFO] [robot_state_publisher-4]: process has finished cleanly [pid 734144]

pythonのWebsocketの引数は現在async def handler(websocket):

環境

websockets 15.0.1

(.venv) PS D:\develop\test> pip show websockets
Name: websockets
Version: 15.0.1
Summary: An implementation of the WebSocket Protocol (RFC 6455 & 7692)
Home-page: https://github.com/python-websockets/websockets
Author:
Author-email: Aymeric Augustin <aymeric.augustin@m4x.org>
License: BSD-3-Clause
Location: d:\develop\test\.venv\Lib\site-packages
Requires:
Required-by:

10.1でなくなって13から非推奨になっていた模様(こちら

正しい呼び方

async def handler(websocket): //pathがない
    print("Client connected!")
    connected_clients.add(websocket)

正しくない呼び方

async def handler(websocket, path): // pathがある
    print("Client connected!")
    connected_clients.add(websocket)

その時のエラー

connection handler failed
Traceback (most recent call last):
File "d:\develop\test\.venv\Lib\site-packages\websockets\asyncio\server.py", line 376, in conn_handler
await self.handler(connection)
~~~~~~~~~~~~^^^^^^^^^^^^
TypeError: handler() missing 1 required positional argument: 'path'

server.py”, line 376でインスタンス化できない。

chatgptに騙されたのでメモ。

店の呼び出しブザーをDiscord対応

以前ラズパイで作った店の呼び出しボタンだけどLine Nofityがサービス終了になるという事でDiscordの通知を追加した。該当部のソース

#!/usr/bin/env python3
# coding: utf-8
import os
import requests
import json

def send_discord_message(message_content):
    """
    DiscordのWebhookにメッセージを送信する関数
    PCでログインしているとandroidのポップアップ通知出ない模様
    エラーハンドリングしていない

    :param message_content: 送信するメッセージ
    """
    headers = {"Content-Type": "application/json"}
    payload = {"content": message_content}

    webhook_url = os.environ['DISCORD_WEBHOOK']

    response = requests.post(webhook_url, data=json.dumps(payload), headers=headers)

if __name__ == '__main__':
    send_discord_message( '2018/11/12 固定' )

その他追加箇所

--- a/control.py
+++ b/control.py
@@ -11,6 +11,8 @@ import RPi.GPIO as GPIO

from mail import visitmail
from line_notify import line_notify
+from discord_notify import send_discord_message
+
#from voice import make_voice

def handler(signal, frame):
@@ -52,6 +54,7 @@ def callBuzzer(channel):
str_current_time = current_time.strftime("%Y/%m/%d %H:%M:%S")
visitmail(str_current_time)
line_notify(str_current_time)
+ send_discord_message(str_current_time)
#make_voice(str_current_time)

webhook_url = os.environ[‘DISCORD_WEBHOOK’]のwebhook_url はこちらを参考に取得。

os.environはserviceのEnvironmentFileから仕込んであるけどwebhook_url べた書きでも多分困らない。

なんとなく作業中の注意点メモ。下からのツリー