goo blog サービス終了のお知らせ 

酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

秋プラも追い込みで卓上ベルを買ってきた

2024年11月07日 20時17分42秒 | マイコン(ESP32・Arduino等)
秋プラで使う「フラッシュザウルス」の開始ボタンをちょっと面白くしたくて。
前回の実験装置は1個のマイコンで開始ボタンも停止ボタンも制御してて簡単なのですが
配線が目障りなのと、アルミ箔+段ボールでできたスイッチも味気ない。
近くのCan★Doへ電話したら卓上ベルがあるというのでお散歩がてら買いに行きました。330円



機械的なマイクロスイッチを使ってベル押下を検知するつもりだったけど、なかなか軽くて小さくて組み込みやすそうな手持ちスイッチが無かった。
おまけに下手に組み込むと綺麗なベル音の発振を妨害してしまいそう。
内部構造を観察してみた。(図①と②)

ベル内部の中央に金属板があって、ベルを押下すると角度が変わって反射角度が変わるはず。(図③と④)
なので、赤外線センサーユニットを使ってみた。



センサーユニットを机上に置き、上からベルを被せる。
センサーのデータはmicro:bitの2番Pinへ繋いでアナログ値を読み込む。



ベルを鳴らすまでは1002という値が出ているけど、押すと値が20に下がることがわかった。



何度も押されることを考えて、一回押下を検出すると「Kicked」という変数を「1」にするプログラムとした。
連続して無線を飛ばさないよう変数「Freeze」を設け、Freeze=0の時だけ値を読み込むようにし、送信ループ内は5秒間待つようにしてある。

無線でこの情報を送信すれば、離れた場所にある別システムでスタートボタンが押されたことを知ることができます。

赤外リモコン関係記事

2024年09月24日 22時12分02秒 | マイコン(ESP32・Arduino等)
TinyIRライブラリで受信しLED点灯させる
https://blog.goo.ne.jp/villanova555/e/dc9eb64513ea59508f40c39558008b54

標準ライブラリでIR実験
https://blog.goo.ne.jp/villanova555/e/e4442244cf4589c7f710dc0e1546fc96

赤外線通信 arduino相互間の通信 (3)
https://blog.goo.ne.jp/villanova555/e/3c79618feaf5b151550a1e2d6c591600
赤外線通信 arduinoで赤外線リモコンデータの発信(2)
https://blog.goo.ne.jp/villanova555/e/3f78c532ab31632d05a9ef192872ac5e
IR受信パーツを発掘し使ってみた(秋月 CRVP1738)
https://blog.goo.ne.jp/villanova555/e/25d7f78a7ca962003f9eb56c6f97fb72

よみやさん
https://www.youtube.com/watch?v=SuZ1tiTnX7Y&t=697s



圧着工具の注文を誤ってしまったので返品・・

2024年09月23日 23時03分25秒 | マイコン(ESP32・Arduino等)
「JST XH2.54」をかしめるには「0.08-0.5mm2極小端子対応 SN-01BM」を買うべし!

詳しい説明と写真もありました。こちら こちら 
詳細全般の解説はこちら
============
昨日届いた圧着工具、お試しで数個作ってみた。



画面右からPin端子を差し込むと写真のようになるらしい。
 ・左端の大きめの爪は、ビニール被膜を挟み込むヤツ
 ・左端から2番目の爪は、電線をくわえ込むヤツ(下記で言うC型ホール)
みたいだ。
Pin先が差し込めなくなるので、右の2つのリングを潰してはならない。
これらはやった後でわかった話



こんな風に「コンタクト」を挟んで、ぐいっと圧縮する



がががっ
出来上がったヤツ見て愕然
ビニール被覆はくわえているが、銅線を全然挟んでいないではないかっ
おまけにPinを差し込むC型ホールは完全に潰れてる。
オカシイ
調べると購入したのは「0.25〜1.5mm2小・中型端子対応 SN-58B」
対象端子の一覧には今回必要としている「JSTーXH2.54」規格が入っていない。(基盤ピッチが2.5mmだからこの規格でないと使えない)

購入すべきだったのは「0.08-0.5mm2極小端子対応 SN-01BM」だったのだ。
これな。



こいつのターゲットには「JST XH2.54」が入ってる。
ピンヘッダやリポ電池コネクタ(PH)もカシメられるのかも。

やれやれ、泣く泣く返品手続きを取りました。
さすがamazon最近は返送料500円をしっかり徴収。
しょうがないよね、私がアホなんだから。

明日の朝、近くのPUDOから送り返してみます。

マクロレンズで拡大しないと私にはもう拡大鏡使っても見えません。
昔は超近場から遠方まで何でもくっきり見えてたのになぁ・・・

amazonから爆買い(古希レベルで・・)

2024年09月23日 13時43分18秒 | マイコン(ESP32・Arduino等)
amazonの無料配達枠が倍近くに上がって以来ちょっと遠のいていたのだが、
猛暑&高湿度の中での先日からのハンダ付け作業の嵐で、ハンダ台&ACケーブルを引っ張り回しての作業にイラついた結果、充電式コテの注文に走ったです。
もうこの際だからと、JST-XH コネクタの導入も敢行



・新潟精機 SK センターポンチ 100mm CP-100 421円
 差し迫った必要性は無いのだが以前から欲しかった。
 アイスピックでは弱いのでちゃんとマークが付けられん。
・アイウィス(IWISS) 精密同時圧着ペンチ
 端子 0.25〜1.5mm2小・中型端子対応 SN-58B 2080円
・サムコス XHキット XHコネクター 230個 615円
・充電式 半田ごて ワイヤレス ハンダゴテ(こて先3本等付属)2150円
 故障返品が面倒くさいので50円高いamazon発送版を選びました。
 暫く待てば1800円に下がるのは見えてるんだけど・・・面倒
合計支払い 5285円(ポイント割引31円)

年金生活の古希には結構高額出費なんですっ



amazonさんピッタリの箱にキチッと詰めて送ってきた。気持ちが良いです。
しかしあれだね、XHコネクタ部品が小さすぎて今のメガネではよく見えん(悲)
暫く練習ですな。



ちょこっと使ってみた。2箇所だけだけどね。
使うまでがメッチャ早い。私のレベルでは十分な性能
何より、あのビヨビヨのゴムケーブルをゴチャ付く机上に這わせ、100Vへ突っ込んで、更にコテ台セットし差し込まなくても良い。
引き出しの隅っこへこっそりと置いておける。
気になったのは、蓋をするとちょっと長めな点(16.5cm)ぐらい。
サイコー



爆買いついでにダイソーで5000mAのモバイルバッテリー購入 税込770円
トリセツには HIDISC製のhdda-mb05taWH/BL という型番が書いてあった。
充電はType-C、出力はType-Aが2個 ケーブルは付属していない。
ネットでマイコン系の微弱電流でも勝手にシャットダウンされないと聞きつけて。
右上はずいぶん昔のパナソニック製品で、5400mA 約5分で切られてしまう。
もう一個ある24000mAなどは速攻で電源断される。

が、ダイソー製品30分経っても切れなんだ。ありがたや。
公称容量は5000と小さめだが、サイズが小さいし2ポートあるし電子工作にはもってこいです。
PANAは当時6000円程度だったらしいので安くなったもんだ。

コネクタについて調べてみた(JST-xx)

2024年09月21日 09時45分52秒 | マイコン(ESP32・Arduino等)
配線特にトラブルの原因となる接続部分:コネクタについて調べてみた
以下の記事には誤りがあると思いますので悪しからず。
まずはこの動画を見て概要を知りましょう。
https://www.youtube.com/watch?v=b03yTEeWDgE
で、購入するのは
 ・「JST-XHシリーズ」基盤のピッチと同じ 2.5mmピッチ
     (カスを掴ませれないように十分注意!
  Pin数5レベルで私には十分なので。
 ・圧着工具は安いやつではこれ
       https://www.amazon.co.jp/dp/B01A8CTZ5K/
合わせて3000円程度だな。

=====以下は経過======

今回使った端子台の名称は「差し込み式端子台」

まずはコパイロットに聞く。高校生レベルで答えさすw
・日本圧着端子製造株式会社(JST)が製造している電気配線用のコネクタ
・主なシリーズ
 XHシリーズ: 2.5mmピッチで、ロボットや小型電子機器によく使われます。
  基盤のピッチが2.5mmなので使いやすそう。
 PHシリーズ: 2.0mmピッチで、より小型のデバイスに適しています。
  リポ電池はこれだな。
 ZHシリーズ: 1.5mmピッチで、非常に小型の電子機器に使用されます。
  たまーに見る。

参考ブログはこちら
 電子工作でよく使うコネクタ|くりばた (note.com)
・カシメ用の工具
 これが高価なんだよ・・・5000円とか
 安めのは2000円程度から
・コネクタのセット品
 XHセット品がアマゾンで1000円弱です。
 
これは「JST- 2.0 PH」
リポ電池でよく見ます。一応結線済みを5セット程度持ってる。
たまに赤黒逆接続があるので要注意


今回LEDのテープの接続で使われていたやつ
電源2ラインと信号線1ライン、合計3本のやつね。

【MILコネクタ】

これはマイコン同士を密に繋ぐ時くらいで、ちょっと出番は無さそう

番外編:エーモン

「エーモン」の自動車用(E2)はタイヤを買った際の付与ポイント消費で一個持ってるが、使ったこと無い。
線材が太すぎて電子工作では余り出番は無さそう。
ああいうポイントって無駄なんだよな。

車の場合はちゃんとした知識・工具と接続端子を使わないと超危険
なるほど。勉強になりました。
ポタ電でネジ止めターミナル使ってるけどあ俺も本来はヤバいんだね。
(走行中には12V給電しないし独立回路なんだけども)


デュポン・コネクタのポンコツさに疲れるが・・・

2024年09月21日 08時39分55秒 | マイコン(ESP32・Arduino等)


arduinoやmicro:bitなど電子工作でよく使うデュポンケーブル
ビンボが災いして800円程度の安いケーブルを購入することが多いが、こいつら本当にいい加減な製品が多い
 ・コネクタがすぐスッカスカに抜け出すやつがある
 ・芯線がメチャクチャ細いのがある
ポンコツはカットして使うが、そもそも使うこと自体が大きなストレス
 ・複雑になればなるほど、どこが接触不良かわからなくなる。
 ・ある日突然動作しなくなるので、コネクタを確認するとすっぽ抜けてる
 ・日をまたいで動作不良が出ると全部チェックするため大変な手間になる
ほとほと疲れ果てた。

今回の「フラッシュザウルス」 では細く長い配線を何本も扱う。
やっとられんのよ。ほんま



ということで、端子台を作ることにした。
6年前ぐらいに購入していたmicro:bitブレークボード
当時は使い方がイマイチ良くわかっていなかったし使いにくかったので、投げてることが多かった。
無駄に信号線部分に2列のPinをハンダ付けしており、電源ラインは未接続という有り様

端子台はいつ買ってたんだろうね、1個40円程度で10個セットと袋に手書き。



はい、ハンダ吸い取り線とペンチで全部引っこ抜きました。


ここまでは奇跡的にきれいに仕上がった。



写真を見ると基盤にはちゃんと信号線がシルク印刷されている。
もう拡大鏡を使っても+ーなんかはっきり読めない。もう長うないのぅ


じゃが、裏側はイマイチ
この工作は半日かけて午後5時近くまで。
本日はプラザでピボット勉強会があってそこでお披露目の予定
なんとかギリギリ間に合わせたはずだった。
が、Pin0から出る効果音をBTスピーカに繋いだら爆音のハム音が発生
ほとんど「ブーン!!」という音で効果音が聞き取れない。
電源ラインの向きとかあれこれ試すが全然ダメ
カウントダウン中「2」の時だけはクリアな音になる。なんでや?
コネクタは切捨てて全部やり直してるので、解決方策がないまま会場に向かう。


フィールドテスト中
ゲーム内容は好評だったが全般的に派手さがないので、もっと盛り上げるが吉といろいろアドバイスを頂きました。

それと個人的な見解なのだが、ゴチャ付くケーブルをどうにかしたい


端子台へはドライバーで結線してるが本数も多いので運搬の際に外すのも面倒だし、そういう行為が断線とかをもたらすことは明白
上記写真に加え、スピーカケーブル、LEDのテープ、ACアダプタのケーブルが展開されるのだ。
見てるとイライラして気が狂いそう。

今まで避けてきたJSTコネクタを導入しようか・・・
太線はワンタッチコネクタで
https://www.youtube.com/watch?v=1_iGMVGiI1I
なんでGooブログはリンクがはれんのか。もう嫌がらせレベル
相変わらずのクソ





アドレッサブルLED(WS2812B)NeoPxcel 関係のまとめ

2024年09月19日 18時39分12秒 | マイコン(ESP32・Arduino等)
※重要な問題
 PIN3へ繋ぐと、コンパイルエラーが出ます。
 これを転送すると、PC全体を再起動しないとmicro:bit側の動作が全くおかしくなります。(2025/6/12)原因わからん
 故障でもないのに、全く点灯すらしなくなる。


WS2812B、アドレッサブルLED,シリアルLED、LEDストリップ、NeoPxcel
など多彩な呼び方があるデバイスに関する おまとめ
[ 2024/9  ] NeoPxcel on micro:bit 習作  いろいろサンプル・プログラム作成
 

[ 2024/7  ] アドレッサブルLEDテープ [WS2812B] 届いた
 他サイトへのリンク多数有
 WS2812FXライブラリ関係




NeoPxcel on micro:bit 習作

2024年09月19日 13時38分37秒 | マイコン(ESP32・Arduino等)


0 端っこで跳ね返るワーム こちら

1 全てのLEDのを一斉に点滅 こちら
https://makecode.microbit.org/_e2LK8CgtbWmw

1-2 一斉に点滅(カラーArray使用) こちら
https://makecode.microbit.org/_E2misDa2LAW9

2 Stripの任意部分に特定色の輝度変化する任意長の部分を作る こちら

3 流れる弾の境界でのバウンド・左右分割流れ こちら

4 左右から発射した弾が中央で交差後そのまま走り抜ける こちら
  放射状にLEDを配置し収縮(拡散)するときっと引き込まれる。
   1次元ではなく2次元(面)でやるべきか。そうなると三角関数・・・
  1次元を無理やり円錐形に貼り付け2次元化したらどうなんだろうか。
   多数制御はmicro:bitではちょっと制御が難しそう。やはりarduinoだよな。

5 マイクから拾った音(V2)でピークレベルメータもどき こちら

6 中央に向けてレインボーパターンが流れ込む(range2個を使う基礎パーツの応用) こちら
 多分だが、Rangeを多数設けても同じように動くだろう。
 ただしレインボーパターンのセットブロックは値が昇順でないとBUGって全赤になります。

7 ホタル未満
  点灯実験は こちら
  とりあえずVer3は こちら
  だけど、発想がイマイチ。
  オブジェクト思考で作れないことが初期から情けなかった。
  出来なかったことで費やした無駄な時間・・・
  object志向なら一匹作れば、何匹であっても生成できるはずだが。
  micro:bitのmakecoeEditorでは出来ないのか?

もう次の課題に進むよ。

8 フラッシュザウルス(東京フレンドリーパークから) Ver.1.0 こちら
  https://makecode.microbit.org/_WFLgzxa8xJdH
  秋プラはこれで行こうかな。簡単だしw
  A/B スイッチ2個を引き出せばOK
  Ver.1.3 外部スイッチ対応
   Aスイッチでは手続きが呼び出されるまでどえりゃー時間がかかることが判明。のでPin直読み込みに変更
  またコメントが消されたりプログラム内容がぶっ飛ばさたりしましたとさ。あほくさ

9 デモ付きバージョン
  Ver.1.51 こちら
  https://makecode.microbit.org/_CUYT6iW2pXkD
  (https://makecode.microbit.org/_abuYzgEqT2Vk)
  https://makecode.microbit.org/_M113dyeU8Um2
  本番用(5mテープ版)
  Ver. 2.0 バカGoo
  (一般向Level4までは60番目がターゲット、Level5は位置可変)
==============
先日、MS社のアプデでEdgeの設定が消されてMakeCodeで作ってきたプログラム(へのリンク)が全部消された。
なので、以前は使用を最低限にとどめていたが、現在は片っ端からShareしてクラウド上へ保存させている。
Win11への切り捨て移行とかムカつくことが多いし。


AliExから5mのNeoPxcel届いた

2024年09月15日 20時42分31秒 | マイコン(ESP32・Arduino等)
5mNeoPxcel 黒色ストリップ IP65規格防水で1mあたり60個のLED
1578円と少し高額だが前回の2倍のLEDの数だし、
長すぎるので秋プラ終了後、3mと2mにカットして使おうかと思ってる。
確かにLEDのは合計300個付いておりました。


右側は144個の高密度実装ストリップ(1m)のリール
左が今回の到着5mヤツ


LEDの密度の比較。15個 vs 6個
3mで使う場合はこれくらいの密度でも十分だと思ってこいつを購入
もっと疎なヤツもあるんだがそれでは離れすぎると感じたので。

家の廊下で5mを伸ばして例のゲームをやってみたんだが、いやいや長すぎでしょうw 
全体のゲームバランスを考えて調整が必要です。







秋プラゲーム(メイン)一応出来た

2024年09月10日 23時51分29秒 | マイコン(ESP32・Arduino等)


写真は簡易キーボードw
無線機能を組み込んで対になる相方「くす玉くん」を手が空いたら実装します。

プログラムは こちら(Gooblog相変わらずLinkが張れんクソ仕様)

=================
/**
* ■ レベル選択
*
*  起動時の規定レベルは2
*
*  起動時3秒以内にAボタンを押すとレベル選択モードに入る
*
*  Aを押すと2->3->1->2・・とサイクリックに増加する
*
*  Bを(ちょっと長めに)押すとその値で起動する(当然記憶は出来ません)
*
*  「Levelパラメータ設定」ルーチンで難易度を設定する
*
*  ゲーム中Bを押すとLevel値を表示する
*
* ■ 自動デモモード
*
*  一定期間アクセ無いとフルカラーデモモードに遷移する
*
* ■ ゲーム
*
*  Aボタンを押すと、配列最後に置いたLEDがレベルに応じた速度で配列[0]に向けて走ってくる
*
*  ターゲットは中央あるいはランダムな位置に現れる白いLED
*
*  Pin1に繋いだ外部ボタンでこれを止めてターゲットとの距離が近いとWin
*
*  Bで停止などもやってみたが割り込み速度の遅さでkントロールがムズいため、外部スイッチに切り替えた
*
*  走る速度はLevel変数の値ごとすっ飛ばしてやってくる(Level1は1コマごと、Level3は3駒ごと)
*
* ■ 「ずっと」の役割
*
*  P1に繋がれたボタンの押下を監視する
*
*  キー入力なし時間の監視とオーバー時のmicro:bitリセット
*
*  リセットがかかって誰もキー操作をしないと自動的に「デモ」モードに入る仕組みです。
*
* ■ 勝者/敗者へのお祝い
*
*  それっぽいLEDのカラーとチープな音で盛り上/下げる
*
* ■ 用意丼
*
*  カウントダウンの表示+効果音
*
* ■ 他装置制御
*
*  無線で他のmicro:bitへ結果を伝える
*
*  他の機器はくす玉を割ったりLEDを点滅したりクラッカーを飛ばしたりと盛り上げる予定
*
*  2024/9/10
*/
function デモ () {
strip.setBrightness(8)
work = strip.length() / 2
range = strip.range(0, work - 1)
range.showRainbow(1, 360)
range2 = strip.range(work, work)
range2.showRainbow(1, 360)
strip.show()
strip.setPixelColor(work - 1, neopixel.colors(NeoPixelColors.White))
basic.pause(500)
while (!(input.buttonIsPressed(Button.A)) && !(input.buttonIsPressed(Button.B))) {
range.rotate(1)
range2.rotate(-1)
strip.show()
basic.pause(20)
最終アクセス時間 = control.millis()
}
LED初期化()
}
input.onButtonPressed(Button.A, function () {
if (startGame == 1) {
levelパラメータ設定()
strip.clear()
strip.setPixelColor(strip.length() - 1, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
停止命令 = 0
弾の位置 = 143
用意丼()
while (弾の位置 >= 0) {
strip.clear()
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
basic.pause(1)
if (停止命令 == 1) {
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Red))
strip.show()
break;
}
弾の位置 += Level * -1
}
当たり判定()
}
最終アクセス時間 = control.millis()
})
function 当たり判定 () {
if (Math.abs(弾の位置 - 当たり位置) <= 誤差) {
basic.showIcon(IconNames.Square)
strip.setBrightness(8)
music._playDefaultBackground(music.builtInPlayableMelody(Melodies.Entertainer), music.PlaybackMode.InBackground)
for (let index = 0; index < 3; index++) {
strip.showRainbow(1, 360)
strip.show()
basic.pause(500)
strip.clear()
strip.show()
basic.pause(500)
}
strip.setBrightness(255)
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Red))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
} else {
music._playDefaultBackground(music.builtInPlayableMelody(Melodies.Wawawawaa), music.PlaybackMode.InBackground)
basic.showIcon(IconNames.No)
}
}
function levelパラメータ設定 () {
if (Level == 1) {
当たり位置 = strip.length() / 2
誤差 = 2
} else if (Level == 2) {
当たり位置 = strip.length() / 2 + randint(-40, 20)
誤差 = 2
} else {
当たり位置 = strip.length() / 2 + randint(-40, 20)
誤差 = 3
}
}
function Level変更 () {
while (!(input.buttonIsPressed(Button.B))) {
basic.showNumber(Level)
if (input.buttonIsPressed(Button.A)) {
Level += 1
最終アクセス時間 = control.millis()
}
if (Level > 3) {
Level = 1
}
basic.pause(10)
}
basic.showString("SET")
}
input.onButtonPressed(Button.B, function () {
最終アクセス時間 = control.millis()
basic.showNumber(Level)
})
function LED初期化 () {
strip = neopixel.create(DigitalPin.P2, 144, NeoPixelMode.RGB)
strip.setBrightness(255)
strip.showColor(neopixel.colors(NeoPixelColors.Black))
}
function 用意丼 () {
count = 3
for (let index = 0; index < 3; index++) {
basic.showNumber(count)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Green))
strip.show()
music.play(music.tonePlayable(392, music.beat(BeatFraction.Half)), music.PlaybackMode.InBackground)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Black))
strip.show()
music.rest(music.beat(BeatFraction.Whole))
count += -1
}
basic.showNumber(0)
music.play(music.tonePlayable(523, music.beat(BeatFraction.Double)), music.PlaybackMode.InBackground)
}
let count = 0
let 誤差 = 0
let 弾の位置 = 0
let 停止命令 = 0
let 最終アクセス時間 = 0
let range2: neopixel.Strip = null
let range: neopixel.Strip = null
let work = 0
let 当たり位置 = 0
let strip: neopixel.Strip = null
let Level = 0
let startGame = 0
LED初期化()
startGame = 0
Level = 2
for (let index = 0; index < 30; index++) {
if (input.buttonIsPressed(Button.A) || input.buttonIsPressed(Button.B)) {
Level変更()
break;
}
basic.pause(100)
}
デモ()
pins.setPull(DigitalPin.P1, PinPullMode.PullUp)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
startGame = 1
basic.forever(function () {
if (startGame == 1) {
if (pins.digitalReadPin(DigitalPin.P1) == 0) {
停止命令 = 1
最終アクセス時間 = control.millis()
}
basic.pause(1)
if (control.millis() - 最終アクセス時間 > 60000) {
control.reset()
}
}
})