inajob's blog 2024-03-27T20:00:36+09:00 inajob Hatena::Blog hatenablog://blog/13208692334729892155 Raspberry Pi PicoとCircuitPythonで和音楽器を作る hatenablog://entry/6801883189093156717 2024-03-27T20:00:36+09:00 2024-03-27T20:00:36+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例はJLCPCBに基板を発注して作成した、以前の基板を更に活用した内容です。 inajob.hatenablog.jp これは何? 私が作っているRakuChordは、もともとArd… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240324/20240324152615.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.jp%2F%3Ffrom%3Dina_ani" title="PCBプロトタイプ&PCB製造メーカー - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.jp/?from=ina_ani">jlcpcb.jp</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例はJLCPCBに基板を発注して作成した、以前の基板を更に活用した内容です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Frakuchord-smd-12mm" title="表面実装部品版RakuChordの改良版を作った - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/rakuchord-smd-12mm">inajob.hatenablog.jp</a></cite></p> <h1 id="これは何">これは何?</h1> <p>私が作っているRakuChordは、もともと<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOなどで用いられているATmega328をメインCPUとしたものでした。 しかし昨今<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>の高騰や新しい組み込み向けのCPUの登場により、ATmega328以外の選択肢も模索したいという気持ちが高まってきました。</p> <p>ということでこの記事では<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoに搭載されていることでおなじみのRP2040を使って和音楽器を作る方法について紹介します。</p> <h1 id="Raspberry-Pi-Picoでのプログラミング"><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoでのプログラミング</h1> <p>今回利用するのはRP2040-Zeroという開発ボードで、厳密には<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoとは異なります。 しかし回路の構成はほぼ<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoと同じなので、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoでもほぼ同じように和音楽器を作ることができるはずです。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0BQZ4L8YN?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41BZwn7CdVL._SL500_.jpg" class="hatena-asin-detail-image" alt="マイクロコントローラ ミニ開発ボード、PCB RP2040 ゼロ ミニ開発ボード、デュアル コア プロセッサ、29 GPIO ピン、Usb C" title="マイクロコントローラ ミニ開発ボード、PCB RP2040 ゼロ ミニ開発ボード、デュアル コア プロセッサ、29 GPIO ピン、Usb C"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0BQZ4L8YN?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">マイクロコントローラ ミニ開発ボード、PCB RP2040 ゼロ ミニ開発ボード、デュアル コア プロセッサ、29 GPIO ピン、Usb C</a></p><ul class="hatena-asin-detail-meta"><li>ASHATA</li></ul><a href="https://www.amazon.co.jp/dp/B0BQZ4L8YN?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0972DTW7S?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41p3UyrE7bS._SL500_.jpg" class="hatena-asin-detail-image" alt="Raspberry Pi Pico ラズベリーパイピコ マイコンRP2040(Arm Cortex-M0+デュアルコア@133MHz (1個)" title="Raspberry Pi Pico ラズベリーパイピコ マイコンRP2040(Arm Cortex-M0+デュアルコア@133MHz (1個)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0972DTW7S?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Raspberry Pi Pico ラズベリーパイピコ マイコンRP2040(Arm Cortex-M0+デュアルコア@133MHz (1個)</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a></li></ul><a href="https://www.amazon.co.jp/dp/B0972DTW7S?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoに搭載されているRP2040は、ATmega328などの8bit CPUと比べるとかなりパワフルな<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>です。 <a class="keyword" href="https://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>での開発はもちろんできますがMicroPythonやCircuitPythonなどの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%D7%A5%EA%A5%BF">インタプリタ</a>言語も動作します。</p> <p>今回は和音楽器の作成にあたり、CircuitPythonを使うことを選択しました。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>と違い、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%D7%A5%EA%A5%BF">インタプリタ</a>型のCircuitPythonでの開発は、少し変更して実行してみるというトライ&amp;エラーがやりやすく、高速に開発することができると感じました。 最終的にパフォーマンスの要件などで<a class="keyword" href="https://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>を使うとしても、プロトタイプとしてCircuitPythonを使って動作検証を行うのはかなりアリだと思います。</p> <h1 id="CircuitPythonで和音を鳴らす">CircuitPythonで和音を鳴らす</h1> <p>CircuitPythonは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%D7%A5%EA%A5%BF">インタプリタ</a>方式の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>で、<a class="keyword" href="https://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>と比べると明らかに実行速度が遅いです。 そのため、音の生成、特に和音の生成などをCircuitPythonの層で実装することは現実的ではありません。</p> <p>しかしCircuitPythonには標準の組み込みのモジュールとしてsynthioという和音をサポートして音源ライブラリが搭載されており、これを利用することで、気軽な<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%D7%A5%EA%A5%BF">インタプリタ</a>方式の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC">プログラミング言語</a>で、高速動作が要求される和音の生成を実現することができます。</p> <h1 id="synthio">synthio</h1> <p>RP2040で動作する<a class="keyword" href="https://d.hatena.ne.jp/keyword/Python">Python</a>の実装としては有名なのはMicroPythonとCircuitPythonがあります。これらはそれぞれ微妙に違った特性を持っていますが、今回CircuitPythonを選択したのは、CircuitPythonには組み込みライブラリとしてsynthioがあったからです。</p> <p>このライブラリは音を鳴らすためのもので、今回やりたい和音の生成もサポートしています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.circuitpython.org%2Fen%2Flatest%2Fshared-bindings%2Fsynthio%2Findex.html" title="synthio – Support for multi-channel audio synthesis — Adafruit CircuitPython 9.0.0 documentation" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://docs.circuitpython.org/en/latest/shared-bindings/synthio/index.html">docs.circuitpython.org</a></cite></p> <h2 id="配線">配線</h2> <p>synthioは<a class="keyword" href="https://d.hatena.ne.jp/keyword/DAC">DAC</a>出力とPWM出力をサポートしています。今回は追加部品が不要なPWM出力を利用します。 このために出力ピンは適切なRCフィルタを構成のが定石のようですが、ちょっと試す分には、深く考えずスピーカやオーディオアンプを直接繋いでも動作を確認できます。 参考元の資料では1kΩの抵抗と100nFの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>でRCフィルタを作成していました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240324/20240324144939.png" width="1042" height="559" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="単音を鳴らしてみる">単音を鳴らしてみる</h2> <p>以下のようなシンプルな<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>でファの音を0.5秒毎にON/OFFできます。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> board, time <span class="synPreProc">import</span> synthio <span class="synPreProc">import</span> audiopwmio audio = audiopwmio.PWMAudioOut(board.GP10) synth = synthio.Synthesizer(sample_rate=<span class="synConstant">22050</span>) audio.play(synth) <span class="synStatement">while</span> <span class="synIdentifier">True</span>: synth.press(<span class="synConstant">65</span>) <span class="synComment"># midi note 65 = F4</span> time.sleep(<span class="synConstant">0.5</span>) synth.release(<span class="synConstant">65</span>) time.sleep(<span class="synConstant">0.5</span>) </pre> <p>from <a href="https://github.com/todbot/circuitpython-synthio-tricks?tab=readme-ov-file#play-a-note-every-second">GitHub - todbot/circuitpython-synthio-tricks: tips, tricks, and examples of using CircuitPython synthio</a></p> <h2 id="和音を鳴らしてみる">和音を鳴らしてみる</h2> <p>和音を鳴らすのも単音と同じようにできます。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> board, time <span class="synPreProc">import</span> audiopwmio <span class="synPreProc">import</span> synthio audio = audiopwmio.PWMAudioOut(board.GP10) synth = synthio.Synthesizer(sample_rate=<span class="synConstant">22050</span>) audio.play(synth) <span class="synStatement">while</span> <span class="synIdentifier">True</span>: synth.press( (<span class="synConstant">65</span>,<span class="synConstant">69</span>,<span class="synConstant">72</span>) ) <span class="synComment"># midi notes 65,69,72 = F4, A4, C5</span> time.sleep(<span class="synConstant">0.5</span>) synth.release( (<span class="synConstant">65</span>,<span class="synConstant">69</span>,<span class="synConstant">72</span>) ) time.sleep(<span class="synConstant">0.5</span>) </pre> <p>from <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Ftodbot%2Fcircuitpython-synthio-tricks%3Ftab%3Dreadme-ov-file%23play-a-chord" title="GitHub - todbot/circuitpython-synthio-tricks: tips, tricks, and examples of using CircuitPython synthio" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/todbot/circuitpython-synthio-tricks?tab=readme-ov-file#play-a-chord">github.com</a></cite></p> <h2 id="キー操作に対応して音を鳴らしてみる">キー操作に対応して音を鳴らしてみる</h2> <p>ここまでの例は無限ループでsleepさせて音を鳴らしていましたが、ここをキーの入力判定に書き換えればキー操作に対応して音を鳴らすことが出来る、いわゆる「楽器」を作ることが出来ます</p> <p>この例では<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoのGPIO2番にタクトスイッチつながっており、スイッチを押下することでGNDとショートするような回路を想定しています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240324/20240324145116.png" width="297" height="141" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> board, time <span class="synPreProc">import</span> audiopwmio <span class="synPreProc">import</span> synthio audio = audiopwmio.PWMAudioOut(board.GP10) synth = synthio.Synthesizer(sample_rate=<span class="synConstant">22050</span>) audio.play(synth) p1 = digitalio.DigitalInOut(board.GP2) p1.direction = digitalio.Direction.INPUT p1.pull = digitalio.Pull.UP isPlaying= <span class="synIdentifier">False</span> <span class="synStatement">while</span> <span class="synIdentifier">True</span>: <span class="synStatement">if</span> p1.value == <span class="synIdentifier">False</span> <span class="synStatement">and</span> isPlaying== <span class="synIdentifier">False</span>: synth.press( (<span class="synConstant">65</span>,<span class="synConstant">69</span>,<span class="synConstant">72</span>) ) <span class="synComment"># midi notes 65,69,72 = F4, A4, C5</span> isPlaying= <span class="synIdentifier">True</span> <span class="synStatement">else</span>: <span class="synStatement">if</span> isPlaying== <span class="synIdentifier">True</span>: synth.release( (<span class="synConstant">65</span>,<span class="synConstant">69</span>,<span class="synConstant">72</span>) ) isPlaying= <span class="synIdentifier">False</span> </pre> <h1 id="和音を鳴らす以外の処理が複雑になると音が途切れてしまう問題の対処">和音を鳴らす以外の処理が複雑になると音が途切れてしまう問題の対処</h1> <p>さて、ここまでで電子楽器を作るための準備が整いました。 しかし、楽器を作りこんでいくにしたがって、音を鳴らす以外の処理が増えてきます。前述のキーの入力検出に始まり、画面の制御なども実装していくと、だんだん生成される音にノイズが混じるようになってきます。</p> <p>これはsynthioの音波の生成がほかの処理により遅れてしまい、音の再生スピードに追い付かなくなることから発生するようです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240324/20240324145935.png" width="911" height="531" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>根本的には、音波の生成以外の処理を減らせば、この問題は起きませんが、もっと処理を詰め込むことは出来ないでしょうか?</p> <p>こんな時に役立つのがsynthioのバッファリング機能です。</p> <p>synthioでは、生成する音波をバッファにためておく機能があり、これを使うことで、少しほかの処理が複雑になっても、バッファにためておいたデータの分だけ時間に余裕が出来ます。</p> <p>ただ、バッファを大きくすればするほど、音の生成にラグが生じるので、バッファの大きさには注意が必要です。楽器として使いやすくするうえではバッファをなるべく小さくして、キーを入力したらなるべく早く音が鳴ってくれる方がが扱いやすいので、ここは操作性との<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A1%BC%A5%C9%A5%AA%A5%D5">トレードオフ</a>となります。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> board, time <span class="synPreProc">import</span> audiopwmio <span class="synPreProc">import</span> audiomixer <span class="synPreProc">import</span> synthio audio = audiopwmio.PWMAudioOut(board.GP10) <span class="synComment"># ここからがバッファリングの処理</span> mixer = audiomixer.Mixer(sample_rate=<span class="synConstant">22050</span>, buffer_size=<span class="synConstant">2048</span>) <span class="synComment"># ここの2048を大きくするとバッファを大きくできる</span> synth = synthio.Synthesizer(sample_rate=<span class="synConstant">22050</span>) mixer.voice[<span class="synConstant">0</span>].play(synth) mixer.voice[<span class="synConstant">0</span>].level = <span class="synConstant">0.25</span> <span class="synComment"># 音量の調整もできる</span> <span class="synComment"># ここまでバッファリングの処理</span> p1 = digitalio.DigitalInOut(board.GP2) p1.direction = digitalio.Direction.INPUT p1.pull = digitalio.Pull.UP isPlaying= <span class="synIdentifier">False</span> <span class="synStatement">while</span> <span class="synIdentifier">True</span>: <span class="synStatement">if</span> p1.value == <span class="synIdentifier">False</span> <span class="synStatement">and</span> isPlaying== <span class="synIdentifier">False</span>: synth.press( (<span class="synConstant">65</span>,<span class="synConstant">69</span>,<span class="synConstant">72</span>) ) <span class="synComment"># midi notes 65,69,72 = F4, A4, C5</span> isPlaying= <span class="synIdentifier">True</span> <span class="synStatement">else</span>: <span class="synStatement">if</span> isPlaying== <span class="synIdentifier">True</span>: synth.release( (<span class="synConstant">65</span>,<span class="synConstant">69</span>,<span class="synConstant">72</span>) ) isPlaying= <span class="synIdentifier">False</span> </pre> <h1 id="OLEDの制御">OLEDの制御</h1> <p>さて、ここまでで和音楽器として実用的なものが作れるようになりましたが、私の作ろうとしている楽器には128x64のI2C接続のOLEDが搭載されており、キーの入力に合わせてOLEDの表示も変更する必要がありました。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0C9X72TPM?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51PyDBcb2wL._SL500_.jpg" class="hatena-asin-detail-image" alt="FUSHUI 0.96インチ OLEDディスプレイ I2C OLEDモジュール OLED LCDディスプレイLCDモジュール 2個セット LCD SSD1306ドライバー 128X64 SSD1306 4ピン Arduino/Raspberry PiVCC/GND/SCL/SDA用" title="FUSHUI 0.96インチ OLEDディスプレイ I2C OLEDモジュール OLED LCDディスプレイLCDモジュール 2個セット LCD SSD1306ドライバー 128X64 SSD1306 4ピン Arduino/Raspberry PiVCC/GND/SCL/SDA用"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0C9X72TPM?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">FUSHUI 0.96インチ OLEDディスプレイ I2C OLEDモジュール OLED LCDディスプレイLCDモジュール 2個セット LCD SSD1306ドライバー 128X64 SSD1306 4ピン Arduino/Raspberry PiVCC/GND/SCL/SDA用</a></p><ul class="hatena-asin-detail-meta"><li>FUSHUI</li></ul><a href="https://www.amazon.co.jp/dp/B0C9X72TPM?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>CircuitPythonは組み込みのライブラリではOLED制御をするためのものが含まれていないのでOLEDを制御するためのライブラリを導入します。</p> <p>OLED制御のライブラリはCircuitPython Library Bundleという標準的なライブラリ集に含まれているので、これをダウンロードします。</p> <p><a href="https://circuitpython.org/libraries">Libraries</a></p> <p>この中に含まれるファイルを<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>にコピーします。 <code>adafruit_framebuf.mpy</code>, <code>adafruit_ssd1306.mpy</code>を<code>lib</code>以下に、<code>font5x8.bin</code>をルートに配置します。</p> <p>ここまで準備すれば、以下のようなプログラムでOLEDに文字を表示できます。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> board <span class="synPreProc">import</span> busio <span class="synPreProc">import</span> adafruit_ssd1306 i2c = busio.I2C(board.GP11, board.GP10) oled = adafruit_ssd1306.SSD1306_I2C(<span class="synConstant">128</span>, <span class="synConstant">64</span>, i2c) oled.text(<span class="synConstant">&quot;Hello World!&quot;</span>,<span class="synConstant">20</span>,<span class="synConstant">5</span>,<span class="synConstant">1</span>) oled.show() </pre> <h1 id="OLEDの表示と和音生成の両立">OLEDの表示と和音生成の両立</h1> <p>しかし上記の方法でOLEDを制御しつつ音を鳴らそうとすると、画面表示にCPU処理を使いすぎてしまい、かなり大きなバッファを設けないとノイズが発生してしまう問題が起きました。</p> <p>しかし、バッファを大きくすると前述のようにラグが大きくなり、実用に耐えない楽器となってしまうという問題があります。</p> <p>色々調べているうちに、OLEDの画面転送のオプションを変更し、1つの画面をいくつかに分割して更新することで、バッファを小さく保ったままノイズのない音を生成することが出来ました。</p> <p>これは、OLEDの画面転送を分割することで、その隙間にsynthioの音波生成の処理を実行することが出来るようになるからだと考えています。</p> <p>副作用として画面の更新が少し遅くなりますが、楽器を操作するうえで気になるほどではありませんでした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240324/20240324150755.png" width="1200" height="566" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> board <span class="synPreProc">import</span> busio <span class="synPreProc">import</span> adafruit_ssd1306 i2c = busio.I2C(board.GP11, board.GP10) <span class="synComment"># page_addressing=True により画面更新を分割する</span> oled = adafruit_ssd1306.SSD1306_I2C(<span class="synConstant">128</span>, <span class="synConstant">64</span>, i2c, page_addressing=<span class="synIdentifier">True</span>) <span class="synComment"># なぜか手元のOLEDだと表示位置がずれるので微調整</span> oled.page_column_start[<span class="synConstant">1</span>] = oled.page_column_start[<span class="synConstant">1</span>] -<span class="synConstant">4</span> oled.text(<span class="synConstant">&quot;Hello World!&quot;</span>,<span class="synConstant">20</span>,<span class="synConstant">5</span>,<span class="synConstant">1</span>) <span class="synComment"># page_addressingの設定を変更したのでこのshowの中身の動作が変わり、画面更新を分割して実行する</span> oled.show() </pre> <h1 id="ATmega328用の基板を流用してRP2040の動作の確認をする">ATmega328用の基板を流用してRP2040の動作の確認をする</h1> <p>ここまでで、ソフトウェア的にRakuChord的なものをRP2040で実行できる目途が立ちました。</p> <p>ここからは、ハードウェア的にRakuChord的な構成を作り、動作検証をしていきたいので、このために新たに基板を作る必要がありそうです、、、が、、</p> <p>そういえば以前<a href="https://inajob.hatenablog.jp/entry/rakuchord-smd-12mm">&#x8868;&#x9762;&#x5B9F;&#x88C5;&#x90E8;&#x54C1;&#x7248;RakuChord&#x306E;&#x6539;&#x826F;&#x7248;&#x3092;&#x4F5C;&#x3063;&#x305F; - inajob&#39;s blog</a>の記事で作成したRakuChordは、キー入力のためのピンを引き出して設計していたので、この基板を流用して、RP2040の開発ボードと無理やりくっつけることで、ハードウェア的な動作確認もできるのでは?と考えました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240324/20240324151514.png" width="1041" height="712" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>その結果がこちら!</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240324/20240324150907.png" width="1185" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>動画はこちら</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/v83fiZPOPxU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="RakuChordをRP2040で実装する実験"></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=v83fiZPOPxU">www.youtube.com</a></cite></p> <p>21個のキーの入力を受け付けるために3*7のマトリクスで処理しているので、全部で10本の信号線と電源の線をつなげる必要があり、こんな風にモジャモジャになりました。アンプやスピーカーもつなげました。</p> <p>これで、RP2040をコアとしたRakuChordの試作機が完成しました。</p> <p>こんなこともあろうかと、キー入力のパッドを引き出しておいてよかったです。</p> <p>で、実際にRakuChord的なソフトウェアをCircuitPythonで作って、触ってみたところ、、特に問題なく動作しそうでした。</p> <p>さて、次はこの構成を踏まえてRP2040をコアとしたRakuChordの基板を発注するぞ!という気持ちです。(それはまた別の話と言うことで・・)</p> <h1 id="まとめ">まとめ</h1> <p>今までATmega328を使っていたRakuChordのCPUをRP2040かつCircuitPythonに変更できるかを色々検証しました。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>に比べるとパフォーマンスの低いCircuitPythonでも、工夫すれば音の生成とOLEDの描画が出来そうなことがわかりました。</p> <p>CircuitPythonでの開発は非常に手軽なので、簡単な電子楽器を作ろうと考えている方にはとてもお勧めの手法です。</p> <p>また、過去に作成したATmega328用のボードの「こんなこともあろうかと」用意しておいた拡張端子をうまく利用することで、新たに基板を設計する前に、動作確認することが出来ました。</p> <h1 id="参考">参考</h1> <p>Synthioの活用法については以下の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>が参考になりました</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Ftodbot%2Fcircuitpython-synthio-tricks" title="GitHub - todbot/circuitpython-synthio-tricks: tips, tricks, and examples of using CircuitPython synthio" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/todbot/circuitpython-synthio-tricks">github.com</a></cite></p> inajob UARTで書き込みできるCH32V003開発ボードを作った hatenablog://entry/6801883189085836640 2024-02-26T18:35:50+09:00 2024-03-06T12:34:17+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 これは何? 以前CH32V003を使った基板を作って遊びました。今回はその時の知見を活かして、UARTで書き込みできるCH32V003… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225123841.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.jp%2F%3Ffrom%3Dina_ani" title="PCBプロトタイプ&PCBファブリケーションメーカー - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.jp/?from=ina_ani">jlcpcb.jp</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="これは何">これは何?</h1> <p>以前CH32V003を使った基板を作って遊びました。今回はその時の知見を活かして、UARTで書き込みできるCH32V003開発ボードを作成してみました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fpianoboard-ch32v003" title="CH32V003を使った和音の鳴るピアノ基板 - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/pianoboard-ch32v003">inajob.hatenablog.jp</a></cite> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fch32v003-next-step" title="CH32V003でさらに遊んでみた - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/ch32v003-next-step">inajob.hatenablog.jp</a></cite></p> <h1 id="仕様">仕様</h1> <p>この基板は何か専用の機能を持つものではなく、汎用的な開発基板です。</p> <ul> <li>CH32V003F4P6</li> <li>USBコネクタ(フットプリントのテストのため3種)</li> <li>USBシリアル変換IC CH340G</li> <li>RSTスイッチ、BOOTスイッチ</li> <li>自動リセット回路(ESP32などの回路をまねたもの)</li> <li>WCH-LinkE接続用端子</li> </ul> <h1 id="基板の設計">基板の設計</h1> <p>今回の基板は以前作ったCH32V003の基板とよく似たものですが、USBシリアル変換ICとRSTスイッチ、BOOTスイッチが搭載されているのが特徴です。 また、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>ではおなじみの自動リセットの仕組みを実現するための回路も搭載しています。</p> <p>今回利用する<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>は、起動時にPC0の状態を読み取り、LOWであれば書き込みモードに入るという動作をするものです。 これを実現するためにBOOTスイッチを搭載しています。つまり、BOOTスイッチを押しながらRSTスイッチを押すことで書き込みモードに入るということです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225105416.png" width="427" height="384" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>CH32V003のUART書き込みのサンプルは、PC0がHIGHであれば書き込みモードに入るような作りになっていますが、ここではESP32などで良く用いられる自動リセット回路をまねて作る関係でこの動作を変更してLOWであれば書き込みモードに入るという作りに変更しました。</p> <p>さらにこの基板で特徴的なのは3つのUSBポートです。 これは何か3つに特別な機能がある、というわけではなく、手元にある3種類のUSBソケットの実装練習のためのものです。</p> <p>3つのうち2つがUSB Type-Cのソケットなので、CC1、CC2ピンのための抵抗も配置します。(この抵抗が無いとType-C -> Type-Cケーブルを使った時に給電されないことが起きるようです)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225123021.png" width="1197" height="842" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225104731.png" width="760" height="632" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="JLCPCBに発注">JLCPCBに発注</h1> <p>今回も発注はJLCPCBです。基板は赤色にしました。また基板の厚さを1mmにしています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.jp%2F%3Ffrom%3Dina_ani" title="PCBプロトタイプ&PCBファブリケーションメーカー - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.jp/?from=ina_ani">jlcpcb.jp</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <h1 id="動作確認のための実装">動作確認のための実装</h1> <p>CH340Gは<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoのクローンなどでよく利用されているICで、自分もそのような基板を自作したことがあるので、難なく実装できました。 CH32V003F4P6も前回の挑戦ではんだ付けしたことがあったので、こちらも簡単。</p> <p>MicroUSBコネクタはよく使うのですが、なかなか実装のコツがつかめず、よく接続不良を起こしてしてしまいます。ホットエアーガンを使い今回は(たまたま)一発で動作しました。</p> <p>ということで、あっという間に実装できました。</p> <p>自動書き込み回路や、あと2つのUSBコネクタの実装は後回しです。</p> <h1 id="ブートローダーの準備と書き込みテスト"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーの準備と、書き込みテスト</h1> <p><a href="https://inajob.hatenablog.jp/entry/ch32v003-next-step">CH32V003&#x3067;&#x3055;&#x3089;&#x306B;&#x904A;&#x3093;&#x3067;&#x307F;&#x305F; - inajob&#39;s blog</a>で紹介した<a href="https://github.com/74th/ch32v003-uart-bootloader/releases/tag/20230326">74thさんのファームウェア</a>を少し改造して利用しました。 74thさんのものは書き込みモードに入る際にPC0をHIGHにする必要がありましたが、今回はPC0がLOWのときに書き込みモードに変更したものを用意しました。</p> <p>この<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>をWCH-LinkEを使い<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ー領域に書き込めば準備は完了です。</p> <p>基板上のMicro USB端子をパソコンとつなげ、BOOTスイッチを押しながら、RSTスイッチを押して書き込みモードにしたのちに、<a href="https://github.com/74th/ch32v003-uart-programmer">74thさん作のCLIツール</a>を使い適当なプログラムを書き込み、最後にRSTスイッチを押して、実行モードにすれば、書き込んだプログラムが動き始めます。</p> <h1 id="USBソケットの実験">USBソケットの実験</h1> <p>前述したようにこの基板には3つのUSBソケットのフットプリントがあります。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225104924.png" width="695" height="337" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="Micro-USB">Micro USB</h2> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225120623.jpg" width="810" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>いつものソケットです。ここまでの実験ではこのソケットを使い接続しています。 このソケット、実装の難易度はそこそこ高く、個人的にははんだごてではうまく実装できず、ホットエアーで実装しています。</p> <p>いつも使っているのですが、Micro USBということで、稀にコネクタが「もげ」るという事故が起きます。 ということで、そろそろ自分もUSB Type-Cのコネクタを試してみたいなと考えていました。</p> <p>そこで出てきたのが次の2つのUSB Type-Cソケットです</p> <h2 id="USB-Type-Cスルーホール">USB Type-C(スルーホール)</h2> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225120705.jpg" width="538" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>スルーホール型のソケットです。後述の表面実装のものと比べると価格が高いのですが、実装しやすそうだなと思い、今回試してみることにしました。</p> <p>スルーホール型ではあるのですが、足がそこまで長くないため、一般的な厚さ1.6mmの基板では足が下まで届かないので、はんだ付けが難しいようで、今回は厚さ1mmの基板としました。</p> <p>スルーホールとはいえ、かなりピンが近くにあるので、はんだ付けは気を遣いましたが、何とかはんだごてで実装し、動作することを確認しました。</p> <h2 id="USB-Type-C表面実装">USB Type-C(表面実装)</h2> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225120736.jpg" width="587" height="589" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>よく見かけるソケットです。ピンの幅が狭く、実装の難易度が高そうに見えます。 はんだごてで実装するとすぐにブリッジ思想だったので、ホットエアーを使って実装しました。</p> <p>フットプリントは以下の記事を参考にして、いくつかのパッドを長くすることで、はんだ付けしやすいようにしました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2Fusb-type-c%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%258D%25E3%2582%25AF%25E3%2582%25BF%25E3%2581%25AE%25E3%2583%2595%25E3%2583%2583%25E3%2583%2588%25E3%2583%2597%25E3%2583%25AA%25E3%2583%25B3%25E3%2583%2588%25E3%2581%25AE%25E3%2583%25A9%25E3%2583%25B3%25E3%2583%2589%25E3%2582%2592%25E4%25BC%25B8%25E3%2581%25B0%25E3%2581%2597%25E3%2581%25A6%25E3%2581%25AF%25E3%2582%2593%25E3%2581%25A0%25E4%25BB%2598%25E3%2581%2591%25E3%2581%2597%25E3%2582%2584%25E3%2581%2599%25E3%2581%258F%25E3%2581%2599%25E3%2582%258B%2F" title="USB Type-Cのコネクタのフットプリントのランドを伸ばしてはんだ付けしやすくする | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/usb-type-c%E3%81%AE%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%81%AE%E3%83%95%E3%83%83%E3%83%88%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%89%E3%82%92%E4%BC%B8%E3%81%B0%E3%81%97%E3%81%A6%E3%81%AF%E3%82%93%E3%81%A0%E4%BB%98%E3%81%91%E3%81%97%E3%82%84%E3%81%99%E3%81%8F%E3%81%99%E3%82%8B/">inajob.github.io</a></cite></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225124231.png" width="459" height="476" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>心配しましたが、こちらも動作することを確認しました。</p> <h1 id="自動書き込み回路の動作確認">自動書き込み回路の動作確認</h1> <p>最後に、ESP32などの開発ボードでよくみられる、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%F3%A5%B8%A5%B9%A5%BF">トランジスタ</a>を2つ使った、自動書き込み回路の動作を確認しました。 この回路は抵抗付きの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%F3%A5%B8%A5%B9%A5%BF">トランジスタ</a>が2つ内蔵されたUMH3Nという部品により実現されます。(この部品は以前<a href="https://inajob.hatenablog.jp/entry/espboy">ESPboy&#x3068;&#x3044;&#x3046;&#x30AA;&#x30FC;&#x30D7;&#x30F3;&#x30BD;&#x30FC;&#x30B9;&#x306E;&#x643A;&#x5E2F;&#x30B2;&#x30FC;&#x30E0;&#x6A5F;&#x3092;&#x65E5;&#x672C;&#x7528;&#x306B;&#x518D;&#x8A2D;&#x8A08;&#x3057;&#x3066;&#x307F;&#x305F; - inajob&#39;s blog</a>で利用したことがありました)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225104834.png" width="263" height="347" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240225/20240225122907.png" width="897" height="441" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ちょっと小さな部品ですが、これを実装します。</p> <p>この<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%F3%A5%B8%A5%B9%A5%BF">トランジスタ</a>2つをうまく組み合わせて、USBシリアル変換ICの~DTR, ~<a class="keyword" href="https://d.hatena.ne.jp/keyword/RTS">RTS</a>信号を、CH32V003のリセット信号と、書き換えモード切替信号(PC0)への入力に変換します。</p> <p>ESP32などでは書き込みツールがDTR、<a class="keyword" href="https://d.hatena.ne.jp/keyword/RTS">RTS</a>信号をうまい具合に制御してくれるのですが、今回はそういうツールが無いので、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Python">Python</a>の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を用意して、書き込みモードへの切り替えの動作を実現しました。</p> <p>具体的には以下のようなコードで書き込みモードに入ります</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> serial ser = serial.Serial() ser.port = <span class="synConstant">&quot;COM14&quot;</span> <span class="synComment"># 利用するポートの番号</span> ser.baudrate = <span class="synConstant">115200</span> <span class="synComment"># Write mode</span> ser.setDTR(<span class="synIdentifier">True</span>) ser.setRTS(<span class="synIdentifier">False</span>) ser.open() ser.close() </pre> <p>そして以下のようなコードで実行モードに入ります</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> serial ser = serial.Serial() ser.port = <span class="synConstant">&quot;COM14&quot;</span> <span class="synComment"># 利用するポートの番号</span> ser.baudrate = <span class="synConstant">115200</span> <span class="synComment"># Run mode</span> ser.setDTR(<span class="synIdentifier">False</span>) ser.setRTS(<span class="synIdentifier">True</span>) ser.open() ser.close() </pre> <p>これと<a href="https://github.com/74th/ch32v003-uart-programmer">74thさん作のCLIツール</a>を組み合わせると、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>風の書き込み環境となります。</p> <h1 id="まとめ">まとめ</h1> <p>ということで、一度<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーを用意してしまえば、後は開発基板のみで書き換えができる基板が完成しました。</p> <p>まぁ、CH32V003でやるならこの方法ですが、もう一つ上のスペックのCH32V203などではIC単体でUSB書き込み機能を備えているので、あえてCH32V003でここまでする意味はないかもしれませんが、構成例の一つとして、誰かの役に立てば幸いです。</p> <p>また、自動リセット回路について、CH32V003でも期待通り動くことが確認できました。</p> <p>おまけとして、3種類のUSBソケットの実装実験が出来ました。ホットエアーガンがあればどのソケットもそこまで難しくなく実装できることが確認できました。</p> <h1 id="参考">参考</h1> <p>自動リセット回路の動作原理について詳しく説明されています <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdays-of-programming.blogspot.com%2F2018%2F05%2Fesp8266dtrrts.html" title="ESP8266にDTRとRTSで自動書き込みをする" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://days-of-programming.blogspot.com/2018/05/esp8266dtrrts.html">days-of-programming.blogspot.com</a></cite></p> <p>前回記事に続き <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2F74th.hateblo.jp%2Fentry%2F2023%2F03%2F17%2F232023" title="CH32V003で、UARTで書き込みできるブートローダを書き込んで利用する - @74thの制作ログ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://74th.hateblo.jp/entry/2023/03/17/232023">74th.hateblo.jp</a></cite></p> inajob CH32V003でさらに遊んでみた hatenablog://entry/6801883189073984991 2024-01-23T19:44:22+09:00 2024-03-06T12:35:18+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な上海の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 前回までのあらすじ 以前作った基板を流用して CH32V003 で遊んでみることにしました。 inajob.hatenablog.j… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240122/20240122225222.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な上海の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="前回までのあらすじ">前回までのあらすじ</h1> <p>以前作った基板を流用して CH32V003 で遊んでみることにしました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fpianoboard-ch32v003" title="CH32V003を使った和音の鳴るピアノ基板 - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/pianoboard-ch32v003">inajob.hatenablog.jp</a></cite></p> <h1 id="CH32V003F4P6を自分ではんだ付けしてみる">CH32V003F4P6を自分ではんだ付けしてみる</h1> <p>前回の記事では、CH32V003の開発ボードを使ったため、CH32V003F4P6を直接はんだ付けすることはしませんでした。</p> <p>しかし、この基板は開発ボードでも、ICを直接実装するでも、どちらでも動作するように作っていたので、今回は直接のはんだ付けを試してみました。</p> <p>表面実装でピンの間は0.65mmでこれが10*2=20か所はんだ付けします。</p> <p>うまくはんだ付けできるか心配でしたが、意外と簡単にはんだ付けできました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240111/20240111153839.jpg" width="1143" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>過去の実績としてはATmega328が0.8㎜ピッチで32か所というのがありましたが、これと比べると今回のはんだ付けは簡単でした。</p> <p><figure class="figure-image figure-image-fotolife" title="比較するとこんな感じ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240111/20240111153916.jpg" width="1200" height="1097" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>比較するとこんな感じ</figcaption></figure></p> <p>というのも、ATmega328はICの4辺すべてに足が出ているQFPと呼ばれるパッケージで、今回の物は2辺に足が出ているTSSOPと呼ばれるパッケージだったというのが大きいです。</p> <p>分析するに、QFPの方はICの向きが少しずれるとどこかの辺のピンがパッドからずれてしまうのに対し、TSSOPの方はピンのある辺に水平にずれる分には問題ないというのが原因だと感じました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240112/20240112234203.png" width="1037" height="662" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ピッチは今回のICの方が細かかったですが、その点はあまり気になりませんでした。</p> <p>温調付きのはんだごてと、フラックスがあれば比較的簡単だと思いますので、挑戦する方はこれらの機材をそろえると良いと思います。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B006MQD7M4?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/315d3oNrVHL._SL500_.jpg" class="hatena-asin-detail-image" alt="白光(HAKKO) ダイヤル式温度制御はんだこて FX600-02" title="白光(HAKKO) ダイヤル式温度制御はんだこて FX600-02"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B006MQD7M4?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">白光(HAKKO) ダイヤル式温度制御はんだこて FX600-02</a></p><ul class="hatena-asin-detail-meta"><li>白光(HAKKO)</li></ul><a href="https://www.amazon.co.jp/dp/B006MQD7M4?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B000TGJTUW?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41uJKrzUVQL._SL500_.jpg" class="hatena-asin-detail-image" alt="ホーザン(HOZAN) フラックス 鉛フリーハンダ対応 便利なハケ付きキャップ付 容量30mL H-722" title="ホーザン(HOZAN) フラックス 鉛フリーハンダ対応 便利なハケ付きキャップ付 容量30mL H-722"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B000TGJTUW?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">ホーザン(HOZAN) フラックス 鉛フリーハンダ対応 便利なハケ付きキャップ付 容量30mL H-722</a></p><ul class="hatena-asin-detail-meta"><li>ホーザン(HOZAN)</li></ul><a href="https://www.amazon.co.jp/dp/B000TGJTUW?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="最低限動作に必要な部品">最低限動作に必要な部品</h1> <p>改めて回路を見直してみると、このICは周辺の部品は、ほぼ何もなくても動くことがわかりました。 開発ボードには水晶発振子が付いていましたが、ICの内部にも発振機能があるようで、精度が多少悪くなりますがこちらを使うようにすれば、水晶発振子は不要でした。</p> <p>いわゆる「おまじない<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>」と言ったりする<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%B3%A5%F3">パスコン</a>(バイ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%B3%A5%F3">パスコン</a>デンサ)を一応1つ取り付けました。</p> <p><figure class="figure-image figure-image-fotolife" title="ここに写っている部品のみでOK"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240112/20240112234315.png" width="1037" height="662" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ここに写っている部品のみでOK</figcaption></figure></p> <h1 id="書き込み">書き込み</h1> <p>書き込みは開発ボードを使った時と同様にWCH-LinkEという専用の書き込み機を使いました。 ソフトウェアは前回の記事で紹介したch32v003funを利用しました。</p> <h1 id="専用書き込み機を使わずに書き換える方法">専用書き込み機を使わずに書き換える方法</h1> <p>WCH-LinkEを使わないと書き換えられないのが少し気になって、調べてみると、WCH社が公式のサンプルとしてUART経由でプログラムを書き換えることが出来るサンプルプログラムを公開していることを知りました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fopenwch%2Fch32v003%2Ftree%2Fmain%2FEVT%2FEXAM%2FUSART_IAP" title="ch32v003/EVT/EXAM/USART_IAP at main · openwch/ch32v003" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/openwch/ch32v003/tree/main/EVT/EXAM/USART_IAP">github.com</a></cite></p> <p>UARTを使って書き換えるといえば、よく知られている例だと<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOなどの方式です。</p> <p>この方式は、素朴ですが、ボード上にUSBシリアル変換ICを搭載することで、そのボード単体で開発が完結するという点で魅力的です。 (もちろん一番初めにこのプログラムを書き込むためにWCH-LinkEが必要なのですが、一度書き込んでしまえば以降はUARTで書き換えることが出来ます。)</p> <p>さらに、このWCH社が提供しているサンプルの細かい問題点を解消したものを74thさんが作っているのを発見したので、今回はこちらを利用しました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2F74th%2Fch32v003-uart-bootloader%2Freleases%2Ftag%2F20230326" title="Release 2023-03-29 · 74th/ch32v003-uart-bootloader" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/74th/ch32v003-uart-bootloader/releases/tag/20230326">github.com</a></cite></p> <p>WCH-LinkEにはUSBシリアル変換の機能も搭載されているので、この書き換えの仕組みもWCH-LinkEで動作確認できました。また念のため手元にあったCH340G搭載のUSBシリアル変換モジュールを使っても書き換えが出来ました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240111/20240111155611.jpg" width="1200" height="1035" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>書き込みのためにはPC側で動作する書き込みソフトが必要となります。<a href="https://github.com/openwch/ch32v003/blob/main/EVT/EXAM/USART_IAP/WCHMcuIAP_WinAPP.exe">WCH社公式のWindows専用ツール</a>、<a href="https://github.com/74th/ch32v003-uart-programmer">74thさん作のCLIツール</a>の2つがありますがどちらでも書き込みできました。</p> <h1 id="RSTスイッチでリセットされない問題">RSTスイッチでリセットされない問題</h1> <p>74thさんが改良したプログラムでは以下の2つの変更が加わっていました</p> <ul> <li>UART通信の精度を上げるため書き込み速度を115200に低下させる</li> <li>書き換えモードに入るためのピンをプルダウンし、ピンに何もつながっていないときは、実行モードとする</li> </ul> <p>これで随分使いやすくなっていたのですが、<a href="https://74th.hateblo.jp/entry/2023/03/17/232023">74thさんのブログでも言及されている</a>のですが、RSTスイッチの挙動が少し期待と異なるという問題が残っていました。</p> <p>RSTスイッチは私の利用している開発ボードではタクトスイッチと接続されており、このスイッチを押すことで<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボードを「リセット」しプログラムをはじめから実行しなおすことができます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20240112/20240112235253.png" width="1200" height="1084" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>UARTで書き込みを実現するプログラムは、起動時に特定のピンの状態を確認し、それがHIGHであれば書き込みモードに入り、LOWであれば実行モードに入るというロジックとなっています。</p> <p>こういう書き込みロジックはESP32などでも採用されており、このようなボードにはBOOTスイッチとRESETスイッチが搭載されていることが一般的です。</p> <p>BOOTスイッチを押しながらRESETスイッチを押すことで書き込みモードで起動し、BOOTスイッチを押さずにRESETスイッチを押すと、実行モードで起動するというのが期待する動作です。</p> <p>もちろん手でスイッチを操作する以外にも、USBシリアル変換ICのDTRや<a class="keyword" href="https://d.hatena.ne.jp/keyword/RTS">RTS</a>の信号をうまく使って、自動的に書き込みモードに入るというようなことも行われたりします。</p> <p>さて、今回のUARTで書き込みを実現するプログラムを利用する際、このRSTスイッチはどのようにふるまうかというと・・</p> <ul> <li>書き込みモードで起動中 <ul> <li>RSTスイッチを押すと、実行モードで起動する</li> <li>書き込みピンをHIGHにしてRSTスイッチを押すと、書き込みモードで起動する</li> </ul> </li> <li>実行モードで起動中 <ul> <li>RSTスイッチを押すと、再び実行モードで起動する</li> <li>書き込みピンをHIGHにしてRSTスイッチを押しても、再び実行モードで起動する(ここがおかしい!!)</li> </ul> </li> </ul> <p>実行モードで起動中に、書き込みピンをHIGHにしたときに、書き込みモードに移行せず、実行モードとなってしまうことが期待と違うと感じました。</p> <p>この原因を調べるために<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>を見てみると、UARTで書き込みを実現するプログラムは以下のように実装されているようでした</p> <ul> <li>UARTで書き込みを実現するロジックは<a class="keyword" href="https://d.hatena.ne.jp/keyword/Flash">Flash</a>メモリのBOOT領域に書き込まれている</li> <li>BOOT領域の処理の一番初めに書き込みピンの状態を確認するロジックがある <ul> <li>ここでLOWが検出されると、User領域から実行するフラグを立ててソフトウェアリセットをする</li> </ul> </li> <li>User領域を実行中にRSTスイッチによるリセットが起きても、User領域から再実行される</li> </ul> <p>というような動きをしているようでした。(データシートで細かい裏付けをしているわけではなく、あくまで挙動から推測した動きです)</p> <p>ということで、以下のような処理をUser領域に書くことで、User領域を実行中にRSTスイッチによりリセットされたときにBOOT領域の処理が実行されるようにしてみたところ、期待通りに実行モードで起動中にRSTスイッチを押した際に、書き込みモードで起動することが確認できました。</p> <pre class="code" data-lang="" data-unlink> if(RCC-&gt;RSTSCKR &amp; RCC_PINRSTF){ // リセットボタンを押されて起動した場合に真となる FLASH-&gt;BOOT_MODEKEYR = FLASH_KEY1; FLASH-&gt;BOOT_MODEKEYR = FLASH_KEY2; FLASH-&gt;STATR |= (1&lt;&lt;14); NVIC_SystemReset(); }</pre> <p>要は、UARTで書き込みする対象のプログラムに、おまじない的に、このロジックを入れておけば良いということです。</p> <p>さて、今回はここまでの調査で打ち切りましたが、この先はUSBシリアル変換ICを搭載した基板を作ったり、RSTやDTRで自動プログラム機能を作りこんだ書き込み用のプログラムを作ったりすると、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>っぽく書き込みできる仕組みが作れそうです。</p> <h1 id="そこまでしてUARTで書き込みしたい">そこまでしてUARTで書き込みしたい?</h1> <p>ここで調査を打ち切ったのは、CH32V003をどこまで頑張って使い倒すか?ということを考えたからです。</p> <p>実はCH32VシリーズのCH32V203は、CH32V003よりは高いですが、その分スペックも良く、USB経由での<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>書き込みもサポートしています。</p> <p>ここまでCH32V003を<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>的に書き換える方法を探ってきましたが、そんなに頑張らなくともCH32V203を使えばよいのでは・・?という気がしてきました。</p> <p>ということで、近いうちにCH32V203を購入して、その使い勝手を確かめてみることとします。</p> <p>日本で買うなら <a href="https://booth.pm/ja/items/4492691">RISC-V MCU CH32V203 ProMicro Like &#x958B;&#x767A;&#x30DC;&#x30FC;&#x30C9;&#x30AD;&#x30C3;&#x30C8;(&yen;1,500) [74th-034] - 74th Books &amp; Gadgets - BOOTH</a>、AliExpressでもいくつかの開発ボードを見つけることが出来ます。</p> <h1 id="まとめ">まとめ</h1> <p>前回記事では、開発ボードを利用していましたが、ICを直接基板に実装する方法も試すことが出来ました。</p> <p>これにより開発ボードに頼らずに、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B9%A5%BF%A5%F3%A5%C9%A5%A2%A5%ED%A1%BC%A5%F3">スタンドアローン</a>なガジェットを作れるようになりました。</p> <p><a href="https://inajob.github.io/iroiro-review/post/ch32%E7%94%A8%E3%81%AEwch%E5%85%AC%E5%BC%8F%E3%81%AEarduino%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%8C%E7%99%BB%E5%A0%B4/">Arduino互換のSDKも整備されてきている</a>ようなので、次何か作る時の候補に入れておくことにします。</p> inajob 2023まとめ hatenablog://entry/6801883189070601278 2023-12-30T09:25:05+09:00 2023-12-30T09:25:05+09:00 今年もいろいろなことがありました。 毎年恒例ですがまとめていきます。 ピックアップニュース ポッドキャストを始めた 5月ごろから#inajob の試しに録音してみた を始めました。なんだかんだでほぼ毎週配信できています。 open.spotify.com ポッドキャスト仲間とのコミュニケーションが出来たり、音声編集のテクニックが身についたり得るものが多くありました。 また、ポッドキャストをよく聞くようにもなり、お気に入りのポッドキャストもたくさんできました。 副次的な効果として、日記をしっかり書くようになり、日々をより噛み締めて生活できるようになり、人生を濃くすることが出来ていると感じます。 … <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231229/20231229231250.png" width="829" height="676" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>今年もいろいろなことがありました。</p> <p>毎年恒例ですがまとめていきます。</p> <h1 id="ピックアップニュース">ピックアップニュース</h1> <h2 id="ポッドキャストを始めた"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>を始めた</h2> <p>5月ごろから#inajob の試しに録音してみた を始めました。なんだかんだでほぼ毎週配信できています。</p> <p><iframe style="border-radius: 12px" width="100%" height="152" title="Spotify Embed: #inajob の試しに録音してみた" frameborder="0" allowfullscreen allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy" src="https://open.spotify.com/embed/show/6nDe9T61ZUBvLWfavKS98y?utm_source=oembed"></iframe><cite class="hatena-citation"><a href="https://open.spotify.com/show/6nDe9T61ZUBvLWfavKS98y">open.spotify.com</a></cite></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>仲間とのコミュニケーションが出来たり、音声編集のテクニックが身についたり得るものが多くありました。</p> <p>また、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>をよく聞くようにもなり、お気に入りの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>もたくさんできました。 副次的な効果として、日記をしっかり書くようになり、日々をより噛み締めて生活できるようになり、人生を濃くすることが出来ていると感じます。</p> <h2 id="ChatGPTを活用し始めた">ChatGPTを活用し始めた</h2> <p>このブログではあまり紹介していませんでしたが、自分の日記をChatGPTに分析させたり、<a href="https://scrapbox.io/omoikane/">omoikane</a>に参加して、ChatGPTを使ったSFプロトタイピングを体験したりしました。</p> <p>このあたりの話は以下の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>のエピソードでも話しています。</p> <p><iframe style="border-radius: 12px" width="100%" height="152" title="Spotify Embed: talk16: 自分のWikiを読むAIアシスタント" frameborder="0" allowfullscreen allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy" src="https://open.spotify.com/embed/episode/4XPoFcImONgMtPti44JY9A?utm_source=oembed"></iframe><cite class="hatena-citation"><a href="https://open.spotify.com/episode/4XPoFcImONgMtPti44JY9A?si=OokPG-MvTE2TCnpkYvjwfg">open.spotify.com</a></cite></p> <h2 id="PASMOがバズる"><a class="keyword" href="https://d.hatena.ne.jp/keyword/PASMO">PASMO</a>がバズる</h2> <p>誤って<a class="keyword" href="https://d.hatena.ne.jp/keyword/PASMO">PASMO</a>を洗濯機に投入してしまい、破片しか残らなかったエピソードがバズりいくつかのメディアで記事にしてもらいました。 平和な内容でバズるのはまぁインターネットと言う感じで面白かったです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnlab.itmedia.co.jp%2Fnl%2Farticles%2F2304%2F12%2Fnews112.html" title="PASMOをうっかり洗濯したら…… 小さな残骸だけが残るレアな事故に「悲しいですね」「こんなに削れるんだ」" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://nlab.itmedia.co.jp/nl/articles/2304/12/news112.html">nlab.itmedia.co.jp</a></cite></p> <h1 id="ステータス">ステータス</h1> <ul> <li>今の家に引っ越してから7年目</li> <li>会社に入ってから14年目</li> <li>結婚して7年ちょっと</li> <li>娘が生まれて3年目</li> </ul> <p>子供がいる生活にもだんだんと慣れてきて、そういった環境でもできる新たな挑戦などにも取り組めていると思います。引き続きやっていこう!</p> <h1 id="今年学んだスキル">今年学んだスキル</h1> <p>今年は技術的なところというよりは、家族周りの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B9%A5%AD%A5%EB%A5%A2%A5%C3%A5%D7">スキルアップ</a>も多かった年でした。 親の介護なんていう次なる課題も見えてきて、色々と考える機会となりました。</p> <ul> <li>高速道路の運転</li> <li>親の介護周りの知識</li> <li>子連れ外出</li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>の配信・<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>を聞く</li> <li>ChatGPT</li> <li>CadQuery</li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>の使い方</li> <li>静電容量タッチセンサーの作り方</li> <li>CircuitPythonで和音</li> <li>CH32V003で和音</li> <li>ホットエアーガンでRP2040実装</li> </ul> <h1 id="今年買ったもの">今年買ったもの</h1> <p>ハンドソープディスペンサー(娘の手洗いがずいぶん楽になりました) <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0CHM54LJC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41LR5-fb5OL._SL500_.jpg" class="hatena-asin-detail-image" alt="ビオレu 自動で出る泡ハンドソープ 本体+つめかえ用430ml ハンドソープ 泡 オートディスペンサー キッチンにも 洗面台にも" title="ビオレu 自動で出る泡ハンドソープ 本体+つめかえ用430ml ハンドソープ 泡 オートディスペンサー キッチンにも 洗面台にも"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0CHM54LJC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">ビオレu 自動で出る泡ハンドソープ 本体+つめかえ用430ml ハンドソープ 泡 オートディスペンサー キッチンにも 洗面台にも</a></p><ul class="hatena-asin-detail-meta"><li>ビオレu</li></ul><a href="https://www.amazon.co.jp/dp/B0CHM54LJC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>ヘッドセット(<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>の録音はこれで行っています。リーズナブル!) <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B079QB3DS5?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41FhLQBPXuL._SL500_.jpg" class="hatena-asin-detail-image" alt="【Amazon.co.jp限定】ロジクール ヘッドセット H111r ステレオ 3.5mm接続 ノイズキャンセリング マイク 軽量 ヘッドフォン windows mac Chrome テレワーク リモートワーク Web会議 国内正規品 2年間メーカー保証" title="【Amazon.co.jp限定】ロジクール ヘッドセット H111r ステレオ 3.5mm接続 ノイズキャンセリング マイク 軽量 ヘッドフォン windows mac Chrome テレワーク リモートワーク Web会議 国内正規品 2年間メーカー保証"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B079QB3DS5?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">【Amazon.co.jp限定】ロジクール ヘッドセット H111r ステレオ 3.5mm接続 ノイズキャンセリング マイク 軽量 ヘッドフォン windows mac Chrome テレワーク リモートワーク Web会議 国内正規品 2年間メーカー保証</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Logicool">Logicool</a>(<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%AF%A1%BC%A5%EB">ロジクール</a>)</li></ul><a href="https://www.amazon.co.jp/dp/B079QB3DS5?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%C5%C5%B5%A4%B0%B5%CE%CF%C6%E9">電気圧力鍋</a>(料理で大活躍) <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B08QCPDK4F?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41qmTUkOEMS._SL500_.jpg" class="hatena-asin-detail-image" alt="アイリスオーヤマ 電気圧力鍋 圧力鍋 6L 低温調理可能 予約調理対応 ケーキも作れる メーカー保証付き ホワイト PC-EMA6-W" title="アイリスオーヤマ 電気圧力鍋 圧力鍋 6L 低温調理可能 予約調理対応 ケーキも作れる メーカー保証付き ホワイト PC-EMA6-W"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B08QCPDK4F?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">アイリスオーヤマ 電気圧力鍋 圧力鍋 6L 低温調理可能 予約調理対応 ケーキも作れる メーカー保証付き ホワイト PC-EMA6-W</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A2%A5%A4%A5%EA%A5%B9%A5%AA%A1%BC%A5%E4%A5%DE">アイリスオーヤマ</a>(IRIS OHYAMA)</li></ul><a href="https://www.amazon.co.jp/dp/B08QCPDK4F?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>ロボットペット(親の方が欲しかった、クリスマスプレゼント) <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0CN8QGJCH?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/31viN+xHgWL._SL500_.jpg" class="hatena-asin-detail-image" alt="Loona (ルーナ) Blue 【ペットロボット コミュニケーションロボット 会話 ゲーム プログラミング 】" title="Loona (ルーナ) Blue 【ペットロボット コミュニケーションロボット 会話 ゲーム プログラミング 】"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0CN8QGJCH?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Loona (ルーナ) Blue 【ペットロボット コミュニケーションロボット 会話 ゲーム プログラミング 】</a></p><ul class="hatena-asin-detail-meta"><li>Loona</li></ul><a href="https://www.amazon.co.jp/dp/B0CN8QGJCH?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>レゴ(親も楽しい、誕生日プレゼント) <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B00PY3EYQO?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51TLnfOI9sL._SL500_.jpg" class="hatena-asin-detail-image" alt="レゴ (LEGO) クラシック おもちゃ 玩具 クリスマスプレゼント 黄色のアイデアボックス スペシャル クリスマス 男の子 女の子 子供 知育玩具 誕生日 プレゼント ギフト レゴブロック 10698 4歳 ~" title="レゴ (LEGO) クラシック おもちゃ 玩具 クリスマスプレゼント 黄色のアイデアボックス スペシャル クリスマス 男の子 女の子 子供 知育玩具 誕生日 プレゼント ギフト レゴブロック 10698 4歳 ~"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B00PY3EYQO?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">レゴ (LEGO) クラシック おもちゃ 玩具 クリスマスプレゼント 黄色のアイデアボックス スペシャル クリスマス 男の子 女の子 子供 知育玩具 誕生日 プレゼント ギフト レゴブロック 10698 4歳 ~</a></p><ul class="hatena-asin-detail-meta"><li>レゴ(<a class="keyword" href="https://d.hatena.ne.jp/keyword/LEGO">LEGO</a>)</li></ul><a href="https://www.amazon.co.jp/dp/B00PY3EYQO?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/ScanSnap">ScanSnap</a> S1500(全然使える、中古で買った) <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B001QXCZ12?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/31yg5ANoeHL._SL500_.jpg" class="hatena-asin-detail-image" alt="FUJITSU ScanSnap S1500 FI-S1500" title="FUJITSU ScanSnap S1500 FI-S1500"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B001QXCZ12?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">FUJITSU ScanSnap S1500 FI-S1500</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%C9%D9%BB%CE%C4%CC">富士通</a></li></ul><a href="https://www.amazon.co.jp/dp/B001QXCZ12?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>コンパクトなキーボード <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0C3QXM4H9?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41bRbQItbwL._SL500_.jpg" class="hatena-asin-detail-image" alt="エレコム 有線キーボード 子供用 パソコン学習 プログラミング KEY PALETTO キーパレット 大阪電気通信大学 兼宗進副学長監修 抗菌 よみがなシール付 ブラック TK-FS10UMKBK" title="エレコム 有線キーボード 子供用 パソコン学習 プログラミング KEY PALETTO キーパレット 大阪電気通信大学 兼宗進副学長監修 抗菌 よみがなシール付 ブラック TK-FS10UMKBK"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0C3QXM4H9?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">エレコム 有線キーボード 子供用 パソコン学習 プログラミング KEY PALETTO キーパレット 大阪電気通信大学 兼宗進副学長監修 抗菌 よみがなシール付 ブラック TK-FS10UMKBK</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A8%A5%EC%A5%B3%A5%E0">エレコム</a>(ELECOM)</li></ul><a href="https://www.amazon.co.jp/dp/B0C3QXM4H9?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="感想">感想</h1> <p>昨年から模索している非同期コミュニケーション手段の1つとして<a class="keyword" href="https://d.hatena.ne.jp/keyword/Scrapbox">Scrapbox</a>に加えて<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>の配信を始めたというのが一番大きな変化です。</p> <p>最新の技術であるChatGPTを触ることが出来ているのも良かったです。</p> <p>朝ジョギングを始めるなど、健康維持についても行動できているので、継続していきたいです。</p> <p>娘も3歳となり、一緒に技術展示のイベントに参加したり、宿泊を伴う旅行に連れて行けるようになったりと、行動の幅が広がったのも良かったです。引き続き、英才教育・・という名の親の趣味に付き合わせていきたいなと思っています。</p> <h1 id="月別生データ">月別生データ</h1> <h2 id="1月">1月</h2> <ul> <li>親子2人で電車でお出かけ</li> <li>動画で子守するのを解禁</li> <li>凧揚げ</li> <li>内窓を設置</li> <li>前半は風邪、後半は胃<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C4%B2%B1%EA">腸炎</a></li> </ul> <p>ひらがなおもちゃを作る <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">自分の娘のためのおもちゃを設計している。<br>うちの<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>は多色対応してないから上だけ塗るかな・・<br><br>下の面は初めは丸だったのだけど、向きがわかりにくいかと思い四角に変更。おもちゃって色々考えて作られてますね。<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/baolzN7q0f">pic.twitter.com/baolzN7q0f</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1610836263623610369?ref_src=twsrc%5Etfw">2023年1月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>RakuChordのSMD版を作る <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Frakuchord-smd" title="表面実装部品版RakuChordをつくってみた - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/rakuchord-smd">inajob.hatenablog.jp</a></cite></p> <h2 id="2月">2月</h2> <ul> <li>節分</li> <li>水族館にいく</li> <li>成田空港にいく</li> </ul> <p>おしたくボード改 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">妻の作った「おしたくボード」が大活躍!<br>以前出した時はまだ早すぎたみたいだが、今ならOK!<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/BPoeZA4qyl">pic.twitter.com/BPoeZA4qyl</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1629261008018735105?ref_src=twsrc%5Etfw">2023年2月24日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>MakePython Audio Expansionレビュー <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2F%25E8%2587%25AA%25E4%25BD%259C%25E3%2581%25AE%25E3%2582%25AA%25E3%2583%25BC%25E3%2583%2587%25E3%2582%25A3%25E3%2582%25AA%25E3%2583%2597%25E3%2583%25AC%25E3%2582%25A4%25E3%2583%25A4%25E3%2583%25BC%25E3%2582%2592%25E4%25BD%259C%25E3%2582%258B%25E3%2581%259F%25E3%2582%2581%25E3%2581%25AE%25E6%258B%25A1%25E5%25BC%25B5%25E3%2583%259C%25E3%2583%25BC%25E3%2583%2589makepython-audio-expansion%2F" title="自作のオーディオプレイヤーを作るための拡張ボード「MakePython Audio Expansion」 | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/%E8%87%AA%E4%BD%9C%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%8B%A1%E5%BC%B5%E3%83%9C%E3%83%BC%E3%83%89makepython-audio-expansion/">inajob.github.io</a></cite></p> <p>HandiPiを作る <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2F2023%2F02%2F28%2FHandiPi%25E3%2581%25AE%25E6%2589%258B%25E3%2581%25AE%25E3%2581%25B2%25E3%2582%2589%25E3%2582%25B5%25E3%2582%25A4%25E3%2582%25BA%25E3%2581%25AE%25E3%2582%25AD%25E3%2583%25BC%25E3%2583%259C%25E3%2583%25BC%25E3%2583%2589%25E3%2582%2592%25E4%25BD%259C%25E3%2581%25A3%25E3%2581%25A6%25E3%2581%25BF%25E3%2581%259F" title="HandiPiの手のひらサイズのキーボードを作ってみた - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/2023/02/28/HandiPi%E3%81%AE%E6%89%8B%E3%81%AE%E3%81%B2%E3%82%89%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F">inajob.hatenablog.jp</a></cite></p> <p>事前に議事録を作る方式について <cite class="hatena-citation"><a href="https://qiita.com/inajob/items/d04ef69eb43c4fba81d8">qiita.com</a></cite></p> <h2 id="3月">3月</h2> <p>なぜなぜ分析 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">娘が「なぜなぜ分析」してくる件<br><br>明日は休みだよ<br>「なんで休みなの?」<br>土曜だからね<br>「なんで土曜日は休みなの?」<br>パパとママが休みだからね<br>「なんで、パパとママは休みなの?」<br>(娘)ちゃんと遊びたいからね<br>「なんで遊びたいの?」<br>(娘)ちゃんがかわいいからね<br>「可愛いと遊びたいの?」<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1631602030149242880?ref_src=twsrc%5Etfw">2023年3月3日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>おもちゃの分解 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これ動かなくなってしまった<br>開けたら直せるかな?<br><br>電源周りならワンチャン直せるかも?<br>しかしオートスリープ機能もあるし、そこが壊れてると辛そう <a href="https://t.co/YpNOAUFEO5">pic.twitter.com/YpNOAUFEO5</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1631820019402440705?ref_src=twsrc%5Etfw">2023年3月4日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>Web Assembly <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2Fe321d9a4b24c32601360" title="今更WebAssembly体験、Goの画像生成プログラムをブラウザで動かす - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/e321d9a4b24c32601360">qiita.com</a></cite></p> <p>ChatGPTに英語記事の要約を頼む実験</p> <p>OLEDの不良品を激安の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%C3%A5%AF%A5%A2%A5%CA%A5%E9%A5%A4%A5%B6">ロジックアナライザ</a>ーで分析 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fscrapbox.io%2Ffab-wiki%2F%25E5%2580%258B%25E4%25BD%2593%25E5%25B7%25AE%25E3%2581%25A7%25E3%2583%258F%25E3%2583%25BC%25E3%2583%2589%25E3%2582%25A6%25E3%2582%25A7%25E3%2582%25A2I2C%25E3%2581%25A7%25E5%2588%25B6%25E5%25BE%25A1%25E3%2581%25A7%25E3%2581%258D%25E3%2581%25AA%25E3%2581%2584OLED%25E3%2581%258C%25E3%2581%2582%25E3%2582%258B" title="個体差でハードウェアI2Cで制御できないOLEDがある - fab-wiki" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://scrapbox.io/fab-wiki/%E5%80%8B%E4%BD%93%E5%B7%AE%E3%81%A7%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2I2C%E3%81%A7%E5%88%B6%E5%BE%A1%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84OLED%E3%81%8C%E3%81%82%E3%82%8B">scrapbox.io</a></cite></p> <p>オーディオコメンタリーメーカーを作る <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Finajob%2Faudio-commentary-maker" title="GitHub - inajob/audio-commentary-maker" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/inajob/audio-commentary-maker">github.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fesp32-touch-flick" title="ESP32の静電容量タッチでフリック入力を実現してみた - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/esp32-touch-flick">inajob.hatenablog.jp</a></cite></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>の寸法チェック用モデル <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">1mm, 2mm, 3mm, 4mmのサンプルを作った。<br>これを差し込んで寸法を調整する<a href="https://twitter.com/hashtag/3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#3Dプリンター</a> <a href="https://t.co/TlvmNv0B4J">pic.twitter.com/TlvmNv0B4J</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1639211471950462976?ref_src=twsrc%5Etfw">2023年3月24日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>蛇口延長用アダプタ <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">周りに合わせて白フィラメントにした!<br>まだ若干蛇口が下を向くけど、まぁ一旦これで完成かな <a href="https://t.co/S7d5LwyNBS">pic.twitter.com/S7d5LwyNBS</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1640611178291556353?ref_src=twsrc%5Etfw">2023年3月28日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ESPHomeを試す(が結局プログラミングすることに・・)</p> <h2 id="4月">4月</h2> <p>レタスの発芽(失敗) <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なんか枯れてきた芽があるな、、まだ土への移植は早い気がするけど、、 <a href="https://t.co/nZb5k7XfDZ">pic.twitter.com/nZb5k7XfDZ</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1645926767184744448?ref_src=twsrc%5Etfw">2023年4月11日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/PASMO">PASMO</a>がバズる <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a class="keyword" href="https://d.hatena.ne.jp/keyword/Pasmo">Pasmo</a>が無くなったと先週気づいて、どこに行ったかなー、、と思ってたら洗濯機の糸屑フィルターから出てきた、、<br><br>これ、タッチして改札通れるかな、、? <a href="https://t.co/6DzDnRdiWh">pic.twitter.com/6DzDnRdiWh</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1644458373595955200?ref_src=twsrc%5Etfw">2023年4月7日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>電子メモパッドのレビュー <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2F13-5%25E3%2582%25A4%25E3%2583%25B3%25E3%2583%2581%25E3%2581%25AE%25E5%25B7%25A8%25E5%25A4%25A7%25E9%259B%25BB%25E5%25AD%2590%25E3%2583%25A1%25E3%2583%25A2%25E3%2583%2591%25E3%2583%2583%25E3%2583%2589%2F" title="ホワイトボードの代わりに!13.5インチの巨大電子メモパッド | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/13-5%E3%82%A4%E3%83%B3%E3%83%81%E3%81%AE%E5%B7%A8%E5%A4%A7%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%A2%E3%83%91%E3%83%83%E3%83%89/">inajob.github.io</a></cite></p> <p>小型のフルカラーLEDのテスト基板 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2FWS2812C-2020-breakout" title="小型のフルカラーLED「WS2812C-2020」テスト基板を作った - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/WS2812C-2020-breakout">inajob.hatenablog.jp</a></cite></p> <p>モノクロ液晶の試食 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">試運転。<br>全表示内容をメモリに持たせようとしたらメモリ不足で表示が壊れる、、<br><br>たまたまに”hello inajob”が表示できた <a href="https://t.co/VmlbNH4rmP">pic.twitter.com/VmlbNH4rmP</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1652512649622724608?ref_src=twsrc%5Etfw">2023年4月30日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ESP32で動く日本語入力対応<a class="keyword" href="https://d.hatena.ne.jp/keyword/Wiki">Wiki</a>的なもの <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">少しわかりづらいけどM5Stackとキーボードを繋げて、日本語入力できる<a class="keyword" href="https://d.hatena.ne.jp/keyword/Wiki">Wiki</a>みたいな仕組みが作れた!<br><br>操作性には改良の余地があるが、なかなか面白いぞ! <a href="https://t.co/nQV79WA6DG">pic.twitter.com/nQV79WA6DG</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1652542612916809731?ref_src=twsrc%5Etfw">2023年4月30日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h2 id="5月">5月</h2> <ul> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DD%A5%C3%A5%C9%A5%AD%A5%E3%A5%B9%A5%C8">ポッドキャスト</a>を始める</li> </ul> <p>枝豆・トマトを植える <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今年は枝豆やってみよう <a href="https://t.co/mwYyWEt62Z">pic.twitter.com/mwYyWEt62Z</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1653926365417308163?ref_src=twsrc%5Etfw">2023年5月4日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>埼玉県近代美術館 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">コインロッカーに、みるからに怪しいオブジェが!!<a href="https://twitter.com/hashtag/%E5%9F%BC%E7%8E%89%E7%9C%8C%E8%BF%91%E4%BB%A3%E7%BE%8E%E8%A1%93%E9%A4%A8?src=hash&amp;ref_src=twsrc%5Etfw">#埼玉県近代美術館</a> <a href="https://t.co/cOxkkhfX9z">pic.twitter.com/cOxkkhfX9z</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1657588645380100096?ref_src=twsrc%5Etfw">2023年5月14日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>電気圧力釜を買った <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">My New Gear… <a href="https://t.co/83HIn3DuIt">pic.twitter.com/83HIn3DuIt</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1659730447734304768?ref_src=twsrc%5Etfw">2023年5月20日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/DIY">DIY</a>こいのぼり <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">牛乳パックでこどもの日っぽい工作をした。<br><br>シールを娘に貼ってもらったが、目を描いたりハサミで切るところも手伝って貰えばよかったな<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/O9VtaWbUZK">pic.twitter.com/O9VtaWbUZK</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1652982885572558848?ref_src=twsrc%5Etfw">2023年5月1日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>粘土に夢中 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あぶらねんど を買ったので(親が)作った<br>娘に好評<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/6xA8Cx0G7Q">pic.twitter.com/6xA8Cx0G7Q</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1659520392925687809?ref_src=twsrc%5Etfw">2023年5月19日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>自動ハンドソープディスペンサー購入</p> <p>トイレの最中 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ジャーン!!<br>これは前から目をつけていた「トイレの最中」という大蔵餅のお菓子!!<br><br>娘のトイトレの役に立つかなw?<br>(むしろ逆効果?) <a href="https://t.co/1SPR89FAgU">pic.twitter.com/1SPR89FAgU</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1659807152721244166?ref_src=twsrc%5Etfw">2023年5月20日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ケースづくり <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ケース設計むずいな <a href="https://t.co/jNUP91nYyV">pic.twitter.com/jNUP91nYyV</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1654014376251396096?ref_src=twsrc%5Etfw">2023年5月4日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ESP32搭載の<a class="keyword" href="https://d.hatena.ne.jp/keyword/DIY">DIY</a>時計ガジェットキットレビュー <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2Fesp32%25E6%2590%25AD%25E8%25BC%2589%25E3%2581%25AEdiy%25E6%2599%2582%25E8%25A8%2588%25E3%2582%25AC%25E3%2582%25B8%25E3%2582%25A7%25E3%2583%2583%25E3%2583%2588%25E3%2582%25AD%25E3%2583%2583%25E3%2583%2588%2F" title="ESP32搭載のDIY時計ガジェットキット | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/esp32%E6%90%AD%E8%BC%89%E3%81%AEdiy%E6%99%82%E8%A8%88%E3%82%AC%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%82%AD%E3%83%83%E3%83%88/">inajob.github.io</a></cite></p> <p>ペン型マルチメー<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BF%A1%BC%A5%EC">ターレ</a>ビュー <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2F%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%2591%25E3%2582%25AF%25E3%2583%2588%25E3%2581%25A7%25E5%258F%2596%25E3%2582%258A%25E5%259B%259E%25E3%2581%2597%25E3%2582%2584%25E3%2581%2599%25E3%2581%2584%25E3%2583%259A%25E3%2583%25B3%25E5%259E%258B%25E3%2583%259E%25E3%2583%25AB%25E3%2583%2581%25E3%2583%25A1%25E3%2583%25BC%25E3%2582%25BF%25E3%2583%25BC-mustool-a008%2F" title="コンパクトで取り回しやすいペン型マルチメーター MUSTOOL A008 | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%81%A7%E5%8F%96%E3%82%8A%E5%9B%9E%E3%81%97%E3%82%84%E3%81%99%E3%81%84%E3%83%9A%E3%83%B3%E5%9E%8B%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC-mustool-a008/">inajob.github.io</a></cite></p> <p>乾電池駆動の<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoボード <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fbattery-arduino-nano" title="Arduino Nanoを単4電池で動かすボードを作った - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/battery-arduino-nano">inajob.hatenablog.jp</a></cite></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Vision">Vision</a> Five2試食</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%BD%A1%BC">ダイソー</a>で買ったおもちゃ <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">できたー!<br>増し締めしたらかなりしっかりした!<br>これは楽しい<br><br>1つしか買わなかったけどあと2種も買えばよかったかな <a href="https://t.co/FIV6XIuYoH">pic.twitter.com/FIV6XIuYoH</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1663131601193275392?ref_src=twsrc%5Etfw">2023年5月29日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h2 id="6月">6月</h2> <ul> <li>長靴を買った</li> <li>七五三の前撮り</li> <li>KEY PALETTOを購入</li> <li>omoikane参加</li> <li>blueskyを始める</li> </ul> <p>ノートパソコンのバッテリーが膨らむ <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">悲報、、ノートパソコンのバッテリーが、、、 <a href="https://t.co/Q1fnHTzp6F">pic.twitter.com/Q1fnHTzp6F</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1669966054020481024?ref_src=twsrc%5Etfw">2023年6月17日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ジャガイモを収穫 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ささやかながら、じゃがいもを収穫。日光が足りなかったかな? <a href="https://t.co/v9iERbbCbm">pic.twitter.com/v9iERbbCbm</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1667312523144761344?ref_src=twsrc%5Etfw">2023年6月9日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B9%A5%AB%A5%A4%A5%C4%A5%EA%A1%BC">スカイツリー</a>を見に行く <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なう<br>高いなー <a href="https://t.co/MrpEdgcjOq">pic.twitter.com/MrpEdgcjOq</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1672792260466073602?ref_src=twsrc%5Etfw">2023年6月25日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoを使った携帯ゲーム機 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fraspberry-pi-pico-mobile" title="Raspberry Pi Picoを使った携帯ゲーム機 - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/raspberry-pi-pico-mobile">inajob.hatenablog.jp</a></cite></p> <h2 id="7月">7月</h2> <ul> <li>地域のソーメン流し参加</li> <li>ブルーベリー狩り</li> <li>打ち上げ花火を見る</li> <li>Threadsに参加</li> <li>(今更)<a class="keyword" href="https://d.hatena.ne.jp/keyword/Twitter">Twitter</a> <a class="keyword" href="https://d.hatena.ne.jp/keyword/API">API</a> V2を試す</li> <li>ヘッドセット、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%AF%A1%BC%A5%EB">ロジクール</a>H111rを買った</li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/SNS">SNS</a>を同期する仕組みの作成</li> </ul> <p>トマト、枝豆の収穫</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">トマトもいい感じになってきた!<br>娘も普段はトマトはあまり食べてくれないけど、自分で収穫したら(薄皮が結構分厚いけど)頑張って食べてくれた! <a href="https://t.co/Qen1wTj98d">pic.twitter.com/Qen1wTj98d</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1676535682607775747?ref_src=twsrc%5Etfw">2023年7月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>絵を描いて教える <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">朝から娘がヨーグルトをひっくり返した。<br>どうも「悲しかったことを絵に描く」というアンガーマネージメント?が気に入ったらしく、「ヨーグルトこぼした絵を描いてー」と言ってきたので描いた。<br><br>ついでに「む」も覚えてもらう作戦<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/rHUz86qpUZ">pic.twitter.com/rHUz86qpUZ</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1680729695854407680?ref_src=twsrc%5Etfw">2023年7月17日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">交通事故の話をしたら、「絵に描いてくれ」と言われたので描いてみた、、<br><br>納得してくれたかな、、<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/b5OQ8vEKMg">pic.twitter.com/b5OQ8vEKMg</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1676550693447147520?ref_src=twsrc%5Etfw">2023年7月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>お金やさん <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なんか、娘がお金並べてた<br>「おかねやさん」とのこと、、<br>本を持っていくとお金に変えてくれるらしい、、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A5%C3%A5%AF%A5%AA%A5%D5">ブックオフ</a>か、、?<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/Zlw3H2Sc9P">pic.twitter.com/Zlw3H2Sc9P</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1682973438598877185?ref_src=twsrc%5Etfw">2023年7月23日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h2 id="8月">8月</h2> <ul> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/ETC%A5%AB%A1%BC%A5%C9">ETCカード</a>取得</li> <li>親の介護に関する書籍を読む</li> <li>ChatGPTと<a class="keyword" href="https://d.hatena.ne.jp/keyword/Twitter">Twitter</a>の過去発言データから体調不良を分析</li> <li>GiNZAで<a class="keyword" href="https://d.hatena.ne.jp/keyword/%BC%AB%C1%B3%B8%C0%B8%EC%BD%E8%CD%FD">自然言語処理</a></li> <li>日記を読む<a class="keyword" href="https://d.hatena.ne.jp/keyword/AI%A5%A2%A5%B7%A5%B9%A5%BF%A5%F3%A5%C8">AIアシスタント</a>実験</li> </ul> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Pico搭載のマクロパッド <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fdiy-macropad" title="オリジナルのマクロパッドを作ってみた - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/diy-macropad">inajob.hatenablog.jp</a></cite></p> <p>バタフライピー <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">レモンを入れると色が変わる紅茶<br>バタフライピーというものらしい <a href="https://t.co/F28MktTDuG">pic.twitter.com/F28MktTDuG</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1694249440536908111?ref_src=twsrc%5Etfw">2023年8月23日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D3%A5%EA%A5%E4%A5%CB">ビリヤニ</a> <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">流行ってるようなので、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D3%A5%EA%A5%E4%A5%CB">ビリヤニ</a>。<br>最近辛いものを食べるとお腹を下すので妻のを少し分けてもらった。<br>このご飯の方だけでも美味しいので、こっちだけ買えないかな? <a href="https://t.co/movQUQeT9m">pic.twitter.com/movQUQeT9m</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1690316214978097153?ref_src=twsrc%5Etfw">2023年8月12日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ポップコーン <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ポップコーン作った<br>親の方がワクワクしてた<br>娘は音が怖くて避難してた<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/Iwsxm4XE7x">pic.twitter.com/Iwsxm4XE7x</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1687712353302003712?ref_src=twsrc%5Etfw">2023年8月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>市販キーボード用のマウンタ <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">家にあるコンパクトなキーボードのマウンタを作ってみた。<br>この穴に他のモジュールをくっつけることを想定してる<a href="https://twitter.com/hashtag/3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#3Dプリンター</a> <a href="https://t.co/AWL1JpTUJ0">pic.twitter.com/AWL1JpTUJ0</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1692463221188579621?ref_src=twsrc%5Etfw">2023年8月18日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ログ機能付きの電流計自作 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">よーし、画面付きの電流計が作れたぞ!<br>過去しばらくの電流の動きが見れるのが便利そう <a href="https://t.co/dmn66LfcoZ">pic.twitter.com/dmn66LfcoZ</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1695430533281689727?ref_src=twsrc%5Etfw">2023年8月26日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>フレキシブル<a class="keyword" href="https://d.hatena.ne.jp/keyword/HDMI">HDMI</a>ケーブル <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">スリムな<a class="keyword" href="https://d.hatena.ne.jp/keyword/HDMI">HDMI</a>ケーブルを求めて、、フレキシブルケーブルのやつを購入 <a href="https://t.co/ptKtALlq7T">pic.twitter.com/ptKtALlq7T</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1694972754007847133?ref_src=twsrc%5Etfw">2023年8月25日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Farchive%2F2023%2F08%2F17" title="2023-08-17から1日間の記事一覧 - inajob&#39;s blog" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/archive/2023/08/17">inajob.hatenablog.jp</a></cite></p> <h2 id="9月">9月</h2> <ul> <li>写真データを<a class="keyword" href="https://d.hatena.ne.jp/keyword/Google">Google</a> Photosから自宅の<a class="keyword" href="https://d.hatena.ne.jp/keyword/NAS">NAS</a>に移行</li> <li>synthioを試す</li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoで遊ぶ</li> <li>MSX0で遊ぶ</li> <li>NS8002オーディオアンプ実験</li> <li>CH32V003で和音実験</li> <li>遊園地に行く</li> </ul> <p>自作キーボード <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fhanamuguri" title="自作キーボードHanamuguriを作った - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/hanamuguri">inajob.hatenablog.jp</a></cite></p> <h2 id="10月">10月</h2> <ul> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%BE%E5%CC%EE%C6%B0%CA%AA%B1%E0">上野動物園</a>、ジャグリング鑑賞</li> <li>地元の秋祭り</li> <li>自転車が壊れる</li> <li>コテンラジオを聞き始める</li> <li>安い<a class="keyword" href="https://d.hatena.ne.jp/keyword/%B9%FC%C5%C1%C6%B3">骨伝導</a>イヤホンを買った(いまいち)</li> <li>LISTEN<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a>(仮)に参加</li> <li>パパ友とバーベキュー会主催</li> <li>七五三撮影</li> </ul> <p>RP2040実装練習</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ホットエアーガンでRP2040実装できた! <a href="https://t.co/ytVa01Rta3">pic.twitter.com/ytVa01Rta3</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1715346757905957293?ref_src=twsrc%5Etfw">2023年10月20日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Frakuchord-smd-12mm" title="表面実装部品版RakuChordの改良版を作った - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/rakuchord-smd-12mm">inajob.hatenablog.jp</a></cite></p> <h2 id="11月">11月</h2> <ul> <li>幼稚園の入園面談</li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%B9%F1%CE%A9%B2%CA%B3%D8%C7%EE%CA%AA%B4%DB">国立科学博物館</a>に行く</li> <li>ChatGPT with Voiceで子守してみる</li> <li>サーキュレーターを買った</li> <li>加湿器を買った</li> <li>喰い切りニッパーを買った</li> <li>Milk-V Duo試食</li> <li>CadQueryを学ぶ</li> </ul> <p>娘を連れてNT東京2023を見に行った <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">子連れ参戦 <a href="https://t.co/jAJjRWVRRE">pic.twitter.com/jAJjRWVRRE</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1720620204961509476?ref_src=twsrc%5Etfw">2023年11月4日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>不良品と思われるATmega328の調査 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">怪しいATmega328の実験ができるようになった。が、買ってすぐのものは問題なさそうだな、、実装時に壊してるのかな? <a href="https://t.co/M6yXNt9qsO">pic.twitter.com/M6yXNt9qsO</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1721059065596686484?ref_src=twsrc%5Etfw">2023年11月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Figeta-pico" title="グリッド楽器igetaを作った - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/igeta-pico">inajob.hatenablog.jp</a></cite></p> <h2 id="12月">12月</h2> <ul> <li>娘を連れて高尾山に登る</li> <li>娘が<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A2%A5%C7%A5%CE%A5%A6%A5%A4%A5%EB%A5%B9">アデノウイルス</a>にかかる</li> </ul> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%B9%A5%C8%A5%B3">コストコ</a>入会 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">My new card...!<br>エンタメ的に入ってみたかったので、、<br><br>知り合いで入ってみたい方、声かけてもらえれば一緒に入ることができますよ!(ただしうちの3歳の娘とセットになると思いますが、、) <a href="https://t.co/dkgEkuKl3n">pic.twitter.com/dkgEkuKl3n</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1730862375073706164?ref_src=twsrc%5Etfw">2023年12月2日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>クリスマスオーナメントを作る <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a class="keyword" href="https://d.hatena.ne.jp/keyword/iPhone">iPhone</a>で加工して少しそれっぽく見えるようにしてみたり、、(チート) <a href="https://t.co/voZ8YpFUtX">pic.twitter.com/voZ8YpFUtX</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1731179725077540957?ref_src=twsrc%5Etfw">2023年12月3日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>クリスマスツリーを作る <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今年の<a class="keyword" href="https://d.hatena.ne.jp/keyword/DIY">DIY</a>ツリー、さらに飾って写真にいい感じに加工した <a href="https://t.co/KAZU8j6QE5">pic.twitter.com/KAZU8j6QE5</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1738851559335965065?ref_src=twsrc%5Etfw">2023年12月24日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>Loona購入 <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">My New Gear...<br>ロボットペットのLoonaです! <a href="https://t.co/0iuDLNF4j9">pic.twitter.com/0iuDLNF4j9</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1738712686354178338?ref_src=twsrc%5Etfw">2023年12月24日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fpianoboard-ch32v003" title="CH32V003を使った和音の鳴るピアノ基板 - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/pianoboard-ch32v003">inajob.hatenablog.jp</a></cite></p> inajob CH32V003を使った和音の鳴るピアノ基板 hatenablog://entry/6801883189070015839 2023-12-28T08:35:10+09:00 2024-03-06T12:35:30+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 これは何? CH32V003という最近流行りのRISC-Vの激安マイコンモジュールを使って楽器を作ってみました。 仕様 128*64… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231228/20231228081959.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="これは何">これは何?</h1> <p>CH32V003という最近流行りの<a class="keyword" href="https://d.hatena.ne.jp/keyword/RISC">RISC</a>-Vの激安<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>モジュールを使って楽器を作ってみました。</p> <h1 id="仕様">仕様</h1> <ul> <li>128*64 モノクロOLED</li> <li>CH32V003</li> <li>NS8002オーディオアンプモジュール</li> <li>鍵盤を含む20個のタクトスイッチ</li> <li>スピーカ</li> <li>オーディオジャック</li> <li>ボリューム</li> </ul> <h1 id="パーツ紹介-CH32V003F4P6">パーツ紹介-CH32V003F4P6</h1> <p>最近流行りのWCH社製の<a class="keyword" href="https://d.hatena.ne.jp/keyword/RISC">RISC</a>-V<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>です。 CH32VのシリーズはほかにもありますがCH32V003はその中でも最も廉価なシリーズです。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%BD%A9%B7%EE%C5%C5%BB%D2">秋月電子</a>でも販売しており、記事執筆時点では1つ50円です</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fakizukidenshi.com%2Fcatalog%2Fg%2FgI-18061%2F" title="32ビットRISC-Vマイコン CH32V003F4P6: 半導体 秋月電子通商-電子部品・ネット通販" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://akizukidenshi.com/catalog/g/gI-18061/">akizukidenshi.com</a></cite></p> <p>プログラムメモリ16KB, RAM 2KB、GPIO18個というシンプルなスペックですが、ちょっとした電子工作のロジックを作るには十分です。</p> <h1 id="パーツ紹介-CH32V003モジュール">パーツ紹介-CH32V003モジュール</h1> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0CPY6FVTF?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41tgr6SHbSL._SL500_.jpg" class="hatena-asin-detail-image" alt="Lzcxszzm Linke CH32V003F4P6 MCU 搭載 CH32V003 開発ボード QingKe RISC-V2A 1 線 SDI システム メイン周波数 48MHz WCH 耐久性" title="Lzcxszzm Linke CH32V003F4P6 MCU 搭載 CH32V003 開発ボード QingKe RISC-V2A 1 線 SDI システム メイン周波数 48MHz WCH 耐久性"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0CPY6FVTF?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Lzcxszzm Linke CH32V003F4P6 MCU 搭載 CH32V003 開発ボード QingKe RISC-V2A 1 線 SDI システム メイン周波数 48MHz WCH 耐久性</a></p><ul class="hatena-asin-detail-meta"><li>Lzcxszzm</li></ul><a href="https://www.amazon.co.jp/dp/B0CPY6FVTF?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>今回のピアノ基板はCH32V003F4P6を基板に直接取り付けることもできますが、よくあるCH32V003を搭載した開発ボードを使うこともできます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231227/20231227005429.png" width="773" height="654" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>今回はまずはこのCH32V003モジュールを利用する方法で組み立てました。</p> <p>CH32V003はUSBデ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の機能を持っていないので当然ですが、このモジュールのUSB端子は電源用で、書き込みを行うことは出来ません。</p> <p>書き込みのためには専用の書き込み装置であるWCH-Linkが必要となります。(セット販売しているものを買いました)</p> <h1 id="基板の設計">基板の設計</h1> <p>今まで私は、この手のちょっとした音が鳴るガジェットを作ったことは結構あるので、ここまでのブログ記事などでも紹介しているような「鉄板」の構成で設計しました。</p> <p>20個のタクトスイッチは 4*5のマトリクス配線とし、同時押しをサポートするために<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>を実装しています。</p> <p>オーディオ周りはいつものスイッチ付きのオーディオジャックや、NS8002オーディオアンプ、ボリューム、表面実装スピーカなどを採用しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231227/20231227005457.png" width="705" height="583" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="JLCPCBに発注">JLCPCBに発注</h1> <p>今回も発注はJLCPCBです。基板の色は白にしました。</p> <p>この基板も10cm×10cmに収まるように設計したので5枚だと $2 + 送料です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <h1 id="実装">実装</h1> <p>今回はそこまで複雑な回路ではないので、サクッと実装できました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231227/20231227124419.jpg" width="1200" height="1010" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231227/20231227124435.jpg" width="1200" height="1054" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="ソフトウェアの実装">ソフトウェアの実装</h1> <p>今回のチャレンジはソフトウェアです。CH32V003は比較的新しい<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>なので、参考となる<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>が少ないのが現状です。</p> <p>CH32V003公式の開発環境としてはMounRiver Studio <a class="keyword" href="https://d.hatena.ne.jp/keyword/IDE">IDE</a>という<a class="keyword" href="https://d.hatena.ne.jp/keyword/GUI">GUI</a>の<a class="keyword" href="https://d.hatena.ne.jp/keyword/IDE">IDE</a>と公式の<a class="keyword" href="https://d.hatena.ne.jp/keyword/SDK">SDK</a>を使う手があるのですが、どうも大げさな開発環境で、肌になじまなかったので、シンプルなch32v003funを使うことにしました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fcnlohr%2Fch32v003fun" title="GitHub - cnlohr/ch32v003fun: An open source software development stack for the CH32V003, a 10¢ 48 MHz RISC-V Microcontroller" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/cnlohr/ch32v003fun">github.com</a></cite></p> <p>ch32v003funはシンプルな実装ですが、このくらいの規模のCH32V003の開発には必要十分で、サンプルも豊富です。 いくつかのサンプルを組み合わせることで目的のプログラムを作ることが出来ました。</p> <ul> <li>blink <ul> <li>まずはLEDをチカチカします</li> <li>これで最低限の雰囲気をつかみました</li> </ul> </li> <li>tim2_pwm <ul> <li>音を鳴らすために利用するPWMの機能</li> <li>LEDをフェードイン・フェードアウトするような使い方にも利用できます</li> </ul> </li> <li>systick_<a class="keyword" href="https://d.hatena.ne.jp/keyword/irq">irq</a> <ul> <li>音源のオシレータを一定時間ごとに進めるためにタイマ割込みの機能</li> </ul> </li> <li>i2c_oled <ul> <li>I2C接続のOLEDの制御</li> <li>ホビー電子工作でよく利用するSSD1306向けの描画ロジックが便利です</li> </ul> </li> </ul> <p>ch32v003funを使うにあたっては以下のブログ記事が非常に参考になりました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2F74th.hateblo.jp%2Fentry%2Fusing-ch32v003fun" title="ch32v003funでCH32V003を便利に開発している話 - @74thの制作ログ" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://74th.hateblo.jp/entry/using-ch32v003fun">74th.hateblo.jp</a></cite></p> <p>つぎはぎですが<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>はこんな感じです (ch32v003funのi2c_oledのexampleを以下のように書き換えて、ビルドしました)</p> <p><script src="https://gist.github.com/inajob/eea0d77adb8807662e5c3bd0a80da697.js"> </script><cite class="hatena-citation"><a href="https://gist.github.com/inajob/eea0d77adb8807662e5c3bd0a80da697">gist.github.com</a></cite></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231227/20231227155100.jpg" width="1200" height="904" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">激安<a class="keyword" href="https://d.hatena.ne.jp/keyword/RISC">RISC</a>-V<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>のCH32V003で和音が鳴るピアノ的な実験<br><br>あとでブログ記事にします! <a href="https://t.co/anxwkKBn2y">pic.twitter.com/anxwkKBn2y</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1739958020468343053?ref_src=twsrc%5Etfw">2023年12月27日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="まとめ">まとめ</h1> <p>安価な<a class="keyword" href="https://d.hatena.ne.jp/keyword/RISC">RISC</a>-V<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>であるCH32V003を使って、和音の鳴るピアノ的な楽器を作ることが出来ました。</p> <p>ch32v003funという軽量なライブラリを利用して、比較的簡単に楽器的なロジックを作れることがわかりました。</p> <p>自分が今までよく利用していた<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOのメイン<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>であるATmega328は<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>不足で価格が高騰し、今ではだいぶ落ち着きましたが、それでもまだ価格が高止まっています。また、ATmega328は昔からある<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>であることもあってテキトーに買うと偽物が混ざっているようなこともあり困っていました。</p> <p>CH32V003は非常に安く、新しい<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>であるため今のところ偽物の情報も聞きません。</p> <p>ちょっとここらで、メインで使う<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>をCH32シリーズに移行してみても良いかも・・と感じました。</p> inajob グリッド楽器igetaを作った hatenablog://entry/6801883189060964625 2023-11-25T14:26:37+09:00 2024-03-06T12:35:51+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 グリッド楽器igetaとは まぁ世の中によくあるグリッド型の電子楽器的なものを自分も作ってみようという試みです。 有名なところだとT… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231125/20231125011352.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="グリッド楽器igetaとは">グリッド楽器igetaとは</h1> <p>まぁ世の中によくあるグリッド型の電子楽器的なものを自分も作ってみようという試みです。</p> <p>有名なところだと<a class="keyword" href="https://d.hatena.ne.jp/keyword/TENORI-ON">TENORI-ON</a>とか Launch Padというものがあったりしますね。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B002WLHHBK?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51c8QjlX9HL._SL500_.jpg" class="hatena-asin-detail-image" alt="YAMAHA TENORI-ON O" title="YAMAHA TENORI-ON O"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B002WLHHBK?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">YAMAHA TENORI-ON O</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E4%A5%DE%A5%CF">ヤマハ</a>(<a class="keyword" href="https://d.hatena.ne.jp/keyword/YAMAHA">YAMAHA</a>)</li></ul><a href="https://www.amazon.co.jp/dp/B002WLHHBK?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B07WNSHR3V?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/31Qyi2af+jL._SL500_.jpg" class="hatena-asin-detail-image" alt="Novation ノベーション/Launch Pad mini MK3 MIDIグリッドコントローラー" title="Novation ノベーション/Launch Pad mini MK3 MIDIグリッドコントローラー"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B07WNSHR3V?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Novation ノベーション/Launch Pad mini MK3 MIDIグリッドコントローラー</a></p><ul class="hatena-asin-detail-meta"><li>Novation</li></ul><a href="https://www.amazon.co.jp/dp/B07WNSHR3V?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>igetaは8x8のスイッチと8x8のLEDを搭載した入力装置です。 音声出力する機能もあり、オーディオアンプやボリュームも搭載しています</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231124/20231124173209.jpg" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="仕様">仕様</h1> <ul> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Pico</li> <li>8x8=64個 タクトスイッチ</li> <li>8x8=64個 LED</li> <li>NS8002オーディオアンプモジュール</li> <li>ボリューム</li> </ul> <p>今回は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoの性能に全のっかりで行きます</p> <h1 id="パーツ紹介---NS8002オーディオアンプモジュール">パーツ紹介 - NS8002オーディオアンプモジュール</h1> <p>AliExpressで発見したモノラルのオーディオアンプモジュールです。 詳しいことはよく知らないですが、今まで使っていたLM386よりも3.3Vで大きな音が出る点が気に入っています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231124/20231124165515.jpg" width="1166" height="830" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="その他のパーツたち">その他のパーツたち</h1> <p>タクトスイッチは<a href="https://inajob.hatenablog.jp/entry/my-first-pcba">FusionPCB&#x3092;&#x4F7F;&#x3063;&#x3066;(&#x307B;&#x307C;)&#x306F;&#x3093;&#x3060;&#x4ED8;&#x3051;&#x305B;&#x305A;&#x306B;&#x81EA;&#x4F5C;&#x30B2;&#x30FC;&#x30E0;&#x6A5F;&#x3092;&#x4F5C;&#x3063;&#x305F;&#xFF08;PCBA&#xFF09; - inajob&#39;s blog</a>で紹介した DTSM-62K-S-V-T/R(SN431)です。 楽器としてはカチカチ音が鳴る点が微妙かもしれませんが、軽いタッチ(100gF)で押せるのでなかなか気に入っています。</p> <p>LEDは以前購入していた1206サイズの赤色LEDを使いました。別に何色でも良いので、次作る時は別の色にしようかなと思います。</p> <p>ボリュームは<a href="https://inajob.hatenablog.jp/entry/diy-macropad">&#x30AA;&#x30EA;&#x30B8;&#x30CA;&#x30EB;&#x306E;&#x30DE;&#x30AF;&#x30ED;&#x30D1;&#x30C3;&#x30C9;&#x3092;&#x4F5C;&#x3063;&#x3066;&#x307F;&#x305F; - inajob&#39;s blog</a>で紹介したB103です。薄型の部品で、側面にちょっとした隙間があれば実装できる点が気に入っています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731152840.jpg" width="428" height="436" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoは言わずと知れた有名な<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボードです。ちょっと前まではArduno Nanoをメインに使っていたのですが、最近の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>不足の影響か価格が高騰しています。また<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoに搭載されている<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>であるATmegaはどうも質の悪い偽物が出回っているようで、一見ちゃんと動いているようでも、細かい部分の動作がおかしい個体があるように見えます。</p> <p>一方で<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoは安価で、性能が高く、コアとなるRP2040も新しい<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>のためか、偽物の情報もあまり聞かないので、最近はこちらをメインに利用しています。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0972DTW7S?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41p3UyrE7bS._SL500_.jpg" class="hatena-asin-detail-image" alt="Raspberry Pi Pico ラズベリーパイピコ マイコンRP2040(Arm Cortex-M0+デュアルコア@133MHz (1個)" title="Raspberry Pi Pico ラズベリーパイピコ マイコンRP2040(Arm Cortex-M0+デュアルコア@133MHz (1個)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0972DTW7S?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Raspberry Pi Pico ラズベリーパイピコ マイコンRP2040(Arm Cortex-M0+デュアルコア@133MHz (1個)</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a></li></ul><a href="https://www.amazon.co.jp/dp/B0972DTW7S?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="基板の設計">基板の設計</h1> <p>今回の基板のキモは大量のタクトスイッチとLEDの接続です。</p> <p>タクトスイッチ64個とLED64個をどうやって<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoに接続するかという話です。 よくあるのはマトリクスで配線する方法ですが、これは64個の部品を制御するのに16個のGPIOが必要となります。</p> <p>素朴にLEDとタクトスイッチのそれぞれをマトリクス配線するとなると16+16=32のGPIOが必要となります</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoのGPIOは28個なので、このままではGPIOが足りません。</p> <p>そこで今回は、Charlieplexingという手法を採用します。この手法により16個のGPIOでこれらの制御ができます。</p> <p>しかしCharieplexingは配線が複雑で、回路図を描くのが難しいという課題があります。</p> <p>これについても様々な解決策があるのですが、今回はikkeiplexingという手法を採用しました。</p> <p>この手法は <a href="https://twitter.com/jh3kxm">https://twitter.com/jh3kxm</a>さんが考案されたもので、<a href="http://ikkei.akiba.coocan.jp/ikkei_Electronics/ikkeiplexing_shield.html">ikkeiplexing shield</a>のページのPDFが非常に参考になりました。</p> <p>回路図を示すと以下のような感じとなりました</p> <p>左下がタクトスイッチ(と<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>)、右上がLEDで、左縦一列の16個のGPIOで制御できます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123063513.png" width="730" height="666" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>LEDが抵抗なしでGPIOと接続されていますがRP2040はGPIOの電流制限の機能があるようなので、正しく設定して利用すれば問題ないと理解しています。(<a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf</a> のp239 2mA, 4mA, 8mA, 12mAの間で設定可能)</p> <p>で、後は基板を設計するだけ!</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123064358.png" width="613" height="588" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>だけ、と書きましたが、意外とこの基板配線が複雑で、配置を工夫する必要がありました。</p> <p>配線は自動配線ツールのFreeroutingに丸投げなのですが、配置が悪いといくら待っても配線が完了しない感じになります。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoはスルーホール穴での実装はせずに、端面スルーホールを利用し表面実装することにしました。これで裏面が自由に使えるので配線の複雑さが緩和されます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123064626.png" width="419" height="255" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>オーディオアンプNS8002は、出来合いのモジュールを使う方法と、直接基板に実装する方法の2パターンに対応しました。 (直接基板に実装するパターンは、手元に部品がなくまだ動作が確認できていないですが・・)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123064747.png" width="272" height="318" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="JLCPCBに発注">JLCPCBに発注</h1> <p>今回も発注はJLCPCBです。今回の基板の色は黒色です。</p> <p>この基板も10cm×10cmに収まるように設計したので5枚だと $2 + 送料です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <h1 id="実装">実装</h1> <p>今回はとにかく、タクトスイッチ、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C8%AF%B8%F7%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">発光ダイオード</a>の数が多いというのが大変なところでした。</p> <p>ひたすらはんだ付けです・・</p> <p>そんな中で、今回もいくつかのトラブルが起きました。</p> <h2 id="配線が足りてない">配線が足りてない!</h2> <p>今回のミスです。単純にCharieplexingの配線を間違えており、必要な部分が結線されていませんでした。 いくつかのパターンをカットし、8本の配線を後から追加で足すことで、正しい回路に修正しましたが、表面はもじゃもじゃのケーブルが這うことになりました。</p> <h2 id="USBケーブルが基板と干渉する">USBケーブルが基板と干渉する</h2> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoを基板の端からやや内側に配置したことと、端面スルーホールを利用して表面実装したために、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoのUSBポートが基板にかなり近くなってしまいました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123072532.png" width="731" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>その影響で、USBケーブルを指そうとすると基板と干渉してしまいうまく接続できない問題が起きました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123072545.png" width="680" height="455" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>これはどうしようもないか・・と思ったのですが、手元にあるちょっと変わった形のUSBケーブルを使うと、何とか干渉せずに接続することが出来ました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123072608.png" width="653" height="382" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>とはいえ、一般的なUSBケーブルが刺さらないのは問題なので、次回は直したいところです。</p> <h1 id="完成">完成</h1> <p>何とか動作するものが出来ました。</p> <h1 id="ソフトウェアの実装">ソフトウェアの実装</h1> <p>今回はCircuitPythonで実装しました。</p> <p>今回の回路設計に用いたCharieplexingという手法の難しい所は配線だけではなく、ソフトウェアの実装についてもです。 適切な順番でGPIOを制御しないと、意図しないLEDが光ったり、正しくキー入力を検知できない問題が起きます。</p> <p>CircuiyPythonはプログラムを変更してから実行するまでのサイクルが<a class="keyword" href="https://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>と比べると早いので(特に<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>が不要というのが大きい)こういう試行錯誤には向いていると感じました。</p> <p>一応「楽器」ということで、音を鳴らす機能も付けてみることにしました。CircuitPythonには音を鳴らすためのSynthioというライブラリがデフォルトで同梱されているのでこれを使うことにしました。</p> <p>Synthioはとてもシンプルな制御で、和音も鳴らすことが出来るのでちょっとした音の鳴るおもちゃを作るのに非常に便利だと感じました。</p> <p>ただCircuitPyhton自体がネイティブと比べると処理が遅いので、凝ったことをしようとすると音が途切れてしまったり、期待した速度で動かないことなどがあるので、そういう場合はおとなしく<a class="keyword" href="https://d.hatena.ne.jp/keyword/C/C%2B%2B">C/C++</a>を使うのがよさそうです。</p> <p>ということで、できました。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今月の制作<br>8x8キー、8x8LED、制御は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> pico<br>名前はigeta <a href="https://t.co/8BJbvK1xfB">pic.twitter.com/8BJbvK1xfB</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1728282690791883108?ref_src=twsrc%5Etfw">2023年11月25日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>押したキーに対応するLEDが点灯し、かつそのキーに対応した音が鳴るプログラムです。 同時押しにも対応しており、同時押しすると和音を演奏できます。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synConstant">&quot;&quot;&quot;</span> <span class="synConstant">igeta-pico test</span> <span class="synConstant">Copyright (c) 2023 inajob</span> <span class="synConstant">This software is released under the MIT License.</span> <span class="synConstant">http://opensource.org/licenses/mit-license.php</span> <span class="synConstant">&quot;&quot;&quot;</span> <span class="synPreProc">import</span> digitalio <span class="synPreProc">from</span> board <span class="synPreProc">import</span> * <span class="synPreProc">import</span> time <span class="synPreProc">import</span> synthio <span class="synPreProc">import</span> audiopwmio audio = audiopwmio.PWMAudioOut(GP18) synth = synthio.Synthesizer(sample_rate=<span class="synConstant">22050</span>) audio.play(synth) <span class="synComment">#synth.press((65,69,72))</span> p1 = GP2 p2 = GP3 p3 = GP4 p4 = GP5 p5 = GP6 p6 = GP7 p7 = GP8 p8 = GP9 p9 = GP10 p10 = GP11 p11 = GP12 p12 = GP13 p13 = GP14 p14 = GP15 p15 = GP16 p16 = GP17 ports = [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16] pports = [] <span class="synStatement">for</span> p <span class="synStatement">in</span> ports: pports.append(digitalio.DigitalInOut(p)) sw = [ [<span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">False</span>], [<span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>, <span class="synIdentifier">True</span>], [<span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>], [<span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>], [<span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>], [<span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>], [<span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>], [<span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>, <span class="synIdentifier">False</span>], ] <span class="synStatement">def</span> <span class="synIdentifier">scanKey</span>(n): <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">8</span>): pports[i].switch_to_input(digitalio.Pull.UP) pports[n + <span class="synConstant">8</span>].switch_to_output(<span class="synIdentifier">False</span>) <span class="synComment"># active</span> <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">8</span>): <span class="synStatement">if</span> pports[i].value: <span class="synStatement">if</span> sw[i][n]: <span class="synStatement">pass</span> <span class="synStatement">else</span>: synth.release(i*<span class="synConstant">8</span>+n+<span class="synConstant">64</span>) <span class="synStatement">else</span>: <span class="synStatement">if</span> sw[i][n]: synth.press(i*<span class="synConstant">8</span>+n + <span class="synConstant">64</span>) <span class="synStatement">else</span>: <span class="synStatement">pass</span> sw[i][n] = pports[i].value pports[n + <span class="synConstant">8</span>].switch_to_input(<span class="synIdentifier">None</span>) <span class="synComment"># deactive</span> <span class="synStatement">def</span> <span class="synIdentifier">scanLed</span>(n): <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">8</span>): <span class="synStatement">if</span> sw[n][i]: pports[i].switch_to_input(<span class="synIdentifier">None</span>) <span class="synStatement">else</span>: pports[i].switch_to_output(<span class="synIdentifier">False</span>) <span class="synComment">#time.sleep(0.1)</span> pports[<span class="synConstant">8</span> + n].switch_to_output(<span class="synIdentifier">True</span>) <span class="synComment"># flash</span> time.sleep(<span class="synConstant">0.001</span>) pports[<span class="synConstant">8</span> + n].switch_to_input(<span class="synIdentifier">None</span>) <span class="synComment"># Hi-Z</span> <span class="synStatement">while</span> <span class="synIdentifier">True</span>: <span class="synComment"># scan switch</span> <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">8</span>): scanKey(i) <span class="synComment"># LED</span> <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">8</span>): pports[i].switch_to_output(<span class="synIdentifier">False</span>) pports[i+<span class="synConstant">8</span>].switch_to_input(<span class="synIdentifier">None</span>) <span class="synComment">#time.sleep(1)</span> <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">8</span>): scanLed(i) </pre> <h1 id="まとめ">まとめ</h1> <p>グリッド楽器igetaを作ることが出来ました。</p> <p>この過程で以下を学ぶことが出来ました</p> <ul> <li>Charieplexingを使い多数のスイッチとLEDを制御</li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Pico + CircuitPythonを使ってCharieplexingを実現</li> <li>Synthioを使った簡易的な楽器の作成</li> </ul> <p>あとやりたいこととしては、筐体の作成、楽器としての機能の拡充、乾電池駆動でモバイル楽器化などを考えています。まぁボチボチやります。</p> <h1 id="おまけ-過去のigeta">おまけ 過去のigeta</h1> <p>実はこのグリッド楽器igetaは過去に別のアプローチで試作したことがありました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123072039.png" width="510" height="680" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>その時は <a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> NanoとCH451を使った構成でした。</p> <p>CH451というのが、この時のキモで、8×8入力、8×8出力を一気に扱えるインターフェースICです。</p> <p>しかし、作ってから気づいたのですがこのCH451はキーの同時押しに対応しておらず、楽器として利用するには機能が足りないという点でお蔵入りとなりました。</p> <p>また、この時は小型のスイッチと<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で作成したスイッチのカバープレートを組み合わせて、スイッチ自体が光るような見た目にできないかと模索していました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231123/20231123071711.png" width="510" height="680" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この試みは一定の成果があり、キーが光るような見た目の筐体を作ることはできたのですが、手元の<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>の精度ではどうしてもキーが引っかかったりとか、押し心地にムラが出る、という結果となりました。</p> <p>ということで今回は素朴に6mm角のタクトスイッチをそのまま使う設計としました。</p> <p>この過去のigetaでも音を鳴らすところまではプログラムを作り、それなりに遊んだりもしました。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">やったー!<a class="keyword" href="https://d.hatena.ne.jp/keyword/MIDI">MIDI</a><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B7%A1%BC%A5%B1%A5%F3%A5%B5">シーケンサ</a>出来たよ!<br>ここまで来たら次は音源も内蔵したい。 <a href="https://t.co/QviCKtPBhC">pic.twitter.com/QviCKtPBhC</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1400438080419504131?ref_src=twsrc%5Etfw">2021年6月3日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">自作グリッド楽器「igeta」<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B9%A5%BF%A5%F3%A5%C9%A5%A2%A5%ED%A1%BC%A5%F3">スタンドアローン</a>化してみた <a href="https://t.co/VljcwcSXEo">pic.twitter.com/VljcwcSXEo</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1533309840499814400?ref_src=twsrc%5Etfw">2022年6月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>こういう過去があっての今回のigetaの製作につながっています。</p> <p>ってこれやってたの2021年5月とかですね、、意外と歴史があります。</p> inajob 表面実装部品版RakuChordの改良版を作った hatenablog://entry/6801883189050610564 2023-10-17T18:49:29+09:00 2024-03-06T12:36:02+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 表面実装版RakuChordとは? RakuChordというのはinajobが開発している電子楽器です。 inajob.github… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015212640.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="表面実装版RakuChordとは">表面実装版RakuChordとは?</h1> <p>RakuChordというのはinajobが開発している電子楽器です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Frakuchord%2F" title="RakuChord(らくこーど)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/rakuchord/">inajob.github.io</a></cite></p> <p>ワンタッチで和音を演奏できるボタンがあり、だれでも比較的簡単に演奏ができるという電子楽器で、少しずつバージョンアップをさせながら、電子工作キットとしての販売をしています。</p> <p>以前RakuChordの表面実装版を作ったことがありましたが、今回はこれの更なる改良版です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Frakuchord-smd" title="表面実装部品版RakuChordをつくってみた - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/rakuchord-smd">inajob.hatenablog.jp</a></cite></p> <h1 id="今回の表面実装版RakuChordの設計">今回の表面実装版RakuChordの設計</h1> <p>基本的な設計は前回の表面実装版RakuChordと同じです</p> <p>前回は6mmのスイッチで、修飾キーは基板裏面に配置したのですが、どうにも使い勝手が悪かったので、今回の改良で12mmタクトスイッチを採用し、従来のRakuChordの操作性を再現することと、修飾キーを上側に並べることを試すことにしました。</p> <ul> <li>タクトスイッチは12mmスルーホール <ul> <li>表面実装版と謳っているいるが、家にこの部品がたくさんあるのでスルーホールを使うことにする</li> </ul> </li> <li>昇圧回路は安価な昇圧モジュールも利用できるようにする</li> <li>7つの修飾キーは基板裏面ではなく、90度の角度が付いたものを上辺に並べる</li> <li>相変わらず10cm×10cmに収める(安いので)</li> <li>表面実装部品のサイズを0603に変更(以前は1206)</li> </ul> <h2 id="90度の角度が付いたタクトスイッチ">90度の角度が付いたタクトスイッチ</h2> <p>以前、AliExpressでタクトスイッチのアソートを買ったのですが、その中に90度の角度が付いたものがあり、これを使うことにしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015212315.jpg" width="1200" height="1079" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>タクトスイッチのアソートは100種類のタクトスイッチがそれぞれ5個ずつ入っているような商品で、スイッチ好きの人にはたまらないものとなっています。お勧めです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015211502.png" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015211837.png" width="1000" height="1000" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <a href="https://s.click.aliexpress.com/e/_DCnekvl">商品リンク</a></p> <h1 id="基板の設計">基板の設計</h1> <p>今回は以前作ったデータを改良する形で設計を行いました。そのため比較的簡単に設計が完了しました。 (前回の作例を記事にしていたおかげで、修正が必要なバグが探しやすかったです)</p> <p>実際<a class="keyword" href="https://d.hatena.ne.jp/keyword/%CF%C0%CD%FD%B2%F3%CF%A9">論理回路</a>図の変更部分は非常に少なく、フットプリントの付け替えや、拡張端子の引き出し程度でした。</p> <p>実体配線図は、さすがに流用することが難しいので新たに作っています。 タクトスイッチが6mmのものから12mmのものに変更となったので、基板の横幅を少し広げました。</p> <h1 id="JLCPCBに発注">JLCPCBに発注</h1> <p>今回も発注はJLCPCBです。今回の基板の色は紫色です。</p> <p>10cm×10cm以内で5枚だと $2 + 送料です。お安い・・</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015155051.png" width="533" height="282" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <h1 id="実装">実装</h1> <p>さてさて、今回もいくつかのトラブルに見舞われました</p> <h2 id="我が家のICがやはりおかしい">我が家のICがやはりおかしい</h2> <p>今回もどうもATmega328の様子がおかしく、シリアル通信の速度を遅くしないと書き込みができませんでした。 以前の記事ではUSBシリアル変換ICであるCH340Nがおかしいかも、と書きましたが、色々実験をしているとATmega328の方がおかしいようでした。</p> <p>我が家にストックしているATmega328が偽物という可能性が出てきています・・・どうしたものか・・</p> <p>ともあれ、前回と同様にだましだまし書き込むことで一応期待した動作をしています。</p> <h2 id="格安の昇圧モジュールから電源を供給すると動作が不安定">格安の昇圧モジュールから電源を供給すると動作が不安定</h2> <p>今回は、HT7750を使った昇圧回路とは別に、格安の昇圧モジュール(名称不明)を使って乾電池2本から5Vへの昇圧が出来るように設計していました。 しかし、こちらの昇圧モジュールを使った場合、どうも動作が不安定になるという事象が発生しました。</p> <p>おそらく、音を鳴らす際に多くの電流を取り出そうとするために、電圧低下を起こしてしまっているのだと思います。 おとなしく前回と同じHT7750を用いた昇圧回路の方を使うことにしました。</p> <p>昇圧方法を両方用意しておいてよかったです。</p> <p>この格安の昇圧モジュールについては <a href="https://inajob.hatenablog.jp/entry/battery-arduino-nano">Arduino Nano&#x3092;&#x5358;4&#x96FB;&#x6C60;&#x3067;&#x52D5;&#x304B;&#x3059;&#x30DC;&#x30FC;&#x30C9;&#x3092;&#x4F5C;&#x3063;&#x305F; - inajob&#39;s blog</a> で紹介しました</p> <h2 id="ダイオードのフットプリントが1つだけ逆向き"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>のフットプリントが1つだけ逆向き</h2> <p>この基板にはスイッチの同時押しを実現するために、多数の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>が存在しています。 <a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>には極性があるため、実装時には注意が必要ですが、実装を簡単にするため、同じような位置に存在する<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>の向きは揃えておいたつもりだったのですが・・・</p> <p>1つだけ並んでいるなかで向きが逆のものが残ってしまっていました。 案の定実装するときに、ほかと同じ向きに実装してしまい、キーが認識されないという問題が発生しました。</p> <p>基板上には正しい向きが指定されているので、バグではないのですが、実装ミスを誘う良くない設計だと感じました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015154639.png" width="813" height="663" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="格安の昇圧モジュールの向きが逆">格安の昇圧モジュールの向きが逆</h2> <p>昇圧モジュールは単純に2.54mm間隔ピンが3つ出ているだけなので、専用のフットプリントを作らず、汎用的な<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%CD%A5%AF%A5%BF%C9%F4%C9%CA">コネクタ部品</a>とを配置し、格安の昇圧モジュールの配置を示す四角形を基板上に描画していたのですが、この四角形の配置を間違えており、実際の格安の昇圧モジュールの配置と食い違っていました。</p> <p>そのままでは乾電池ケースと干渉してしまい、格安の昇圧モジュールが実装できない、という感じだったのですが、想定していた基板の面とは逆の表面に実装することで対応しました。 (上に書いたようにこのモジュールはそもそも性能不足で利用できなかったのですが・・)</p> <h2 id="電源スイッチの配線が間違っている">電源スイッチの配線が間違っている</h2> <p>電源スイッチ周りの配線は、格安の昇圧モジュールからくるもの、HT7750の昇圧モジュールからくるものの両方を考慮する必要があったのですが、格安の昇圧モジュールからくるものを見落としており、こちらは電源スイッチとは関係なく導通した状態になってしまっていました。</p> <p>これは一部の回路のパターンを切断し、導線を使ってジャンパすることで、修正しました。</p> <p>(これも上に書いたように、このモジュールの性能不足により、利用できないのですが・・・)</p> <h2 id="ダイオードが破損"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>が破損</h2> <p>これは実装が終わってしばらく遊んでいる最中に起きたことなのですが、1つのキーが反応しなくなりました。 原因がわからずいろいろ試していたところ、キーの同時押しを実現するための<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>の1つが壊れていることが判明しました。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>は通常片方向からのみ電気を通す素子ですが、なぜかどちらからも電気を通さない状態になっていました。</p> <p>部品を交換することで、この問題を解消しました。 <a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>って壊れやすいんですかね?</p> <h1 id="ケースの作成">ケースの作成</h1> <p>演奏しやすいように<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>でケースを作るというのもやってみました。</p> <p>利用したツールはOpenSCADとLibreCADです。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E2%A5%C7%A5%EA%A5%F3%A5%B0">モデリング</a>を簡単にするために、KiCADから基板データをdxf形式エクスポートしたものを積極的に利用するスタイルで設計しました。</p> <p>まず基板外形を使いベースとなる形を整え、それをくりぬいていくという手法です。 くりぬく範囲もKiCADのUserレイヤーを使い<a class="keyword" href="https://d.hatena.ne.jp/keyword/GUI">GUI</a>で作成しました。</p> <p>くりぬきは貫通、micro USBコネクタの高さ、筐体側2mm残しの3段階とし、それぞれのレイヤーをdxfでエクスポートし、OpenSCADを使って切り抜きました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015143713.png" width="615" height="643" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>(この画像で黄色、薄緑、灰の3色の塗りつぶしがくりぬきを表しています)</p> <p>この手法は、OpenSCADのプログラミングによる手軽な設計の良さと、KiCADで部品を見ながらくりぬき範囲を描画できる<a class="keyword" href="https://d.hatena.ne.jp/keyword/GUI">GUI</a>の良さを両立させる手法だと感じています。</p> <p>指をひっかけるための突起は、LibreCADやOpenSCADで頑張って設計しています。(ここはもうちょっとどうにかしたい)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231017/20231017213252.png" width="519" height="467" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015143903.png" width="561" height="516" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015152742.jpg" width="1200" height="1152" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20231015/20231015152802.jpg" width="1200" height="1196" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="まとめ">まとめ</h1> <p>以前とほぼ同じ構成ですが、表面実装RakuChordの改良版を作りました。</p> <p>やはり新しく作った個所で問題が起こりやすいことがわかりました。前回の物より演奏しやすくなって満足です。</p> <p>格安昇圧モジュールは試してみたものの、今回の用途では性能不足であることが分かったのも収穫で、かつそのような問題があってもHT7750を使った昇圧回路を利用できるようにした「こんなこともあろうかと」の設計が役立って良かったです。</p> inajob 自作キーボードHanamuguriを作った hatenablog://entry/820878482968169781 2023-09-19T08:52:21+09:00 2024-03-06T12:36:17+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 自作キーボード「Hanamuguri」とは Hanamuguriはinajobの2つ目に設計した自作キーボードです。 いわゆる40%… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917154834.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="自作キーボードHanamuguriとは">自作キーボード「Hanamuguri」とは</h1> <p>Hanamuguriはinajobの2つ目に設計した自作キーボードです。</p> <p>いわゆる40%キーボードと呼ばれるレイアウトで、コンパクトながら実用的なキー配列となっています。一般的なパソコンのキーボードとしても利用できますが、どちらかというと、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>などを使って作られたコンパクトな自作モバイル端末を実現するための部品の一つとして利用できるものを目指しています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917145810.jpg" width="1121" height="841" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>前作は<a href="https://inajob.hatenablog.jp/entry/allpcb39">ALLPCB39</a>というキーボードを作りました。こちらもコンパクトなキー配列のキーボードです。</p> <p>ALLPCB39はオーソリニアと呼ばれる格子状のキーボードだったのですが、今回のHanamuguriはロウ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B9%A5%BF%A5%C3%A5%AC%A1%BC%A5%C9">スタッガード</a>と呼ばれる、行ごとに少しずつキーがずれている、いわゆる一般的なキーボードの配列のキーボードと同じ配列を選択しました。 加えて、ALLPCB39はCherry MX互換キーボードスイッチを採用しましたが、HanamuguriはGateronのLowProfileを利用できるようにして、より薄くなりました。</p> <p>これも含めて以下のような特徴があります</p> <ul> <li>49キー(配列はいわゆる40%キーボード的)</li> <li>独立カーソルキー</li> <li>固定用のねじ穴がたくさんある</li> <li>ユニバーサル基板っぽい領域がキーボード上部にある</li> <li>対応キーボードスイッチ <ul> <li>Gateron LowProfile</li> <li>Gateron LowProfile Hot swap</li> <li>Cherry MX(not LowProfile)</li> </ul> </li> <li>キーボードスイッチはパネルマウント</li> <li>128*64 OLED</li> <li>開発ボードはRP2040-Zero</li> <li>キーボードマトリクス、未使用ピンのための拡張ピンヘッダ</li> </ul> <p>Hanamuguriをいきなり作るのは心配だったので、まず <a href="https://inajob.hatenablog.jp/entry/diy-macropad">&#x30AA;&#x30EA;&#x30B8;&#x30CA;&#x30EB;&#x306E;&#x30DE;&#x30AF;&#x30ED;&#x30D1;&#x30C3;&#x30C9;&#x3092;&#x4F5C;&#x3063;&#x3066;&#x307F;&#x305F; - inajob&#39;s blog</a>を使ってキーボードスイッチまわりのフットプリントの使い方に問題がないかを検証しています。そのため、キーの数が多いことを除いては、以前作ったマクロパッドと同じような構成となっています。</p> <h1 id="RP2040-Zero">RP2040-Zero</h1> <p>今回のキーボードのキモともいえるこの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボード。コアとなる<a class="keyword" href="https://d.hatena.ne.jp/keyword/MCU">MCU</a>はRP2040で、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoと同じものですが、RP2040-Zeroの方が基板がコンパクトであることや、USB Type-C端子であることに魅力を感じ、こちらを選択しました。</p> <p>コンパクトな分利用できるGPIOは少ない、、と思いきや裏面に細かいピッチでパッドが並んでいるので、この部分をはんだ付けできればより多くのGPIOを利用できます。(Hanamuguriではこの部分のピンは今後の拡張のために引き出しているだけで、利用していません) <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917141415.png" width="560" height="497" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.waveshare.com%2Fwiki%2FRP2040-Zero" title="RP2040-Zero - Waveshare Wiki" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.waveshare.com/wiki/RP2040-Zero">www.waveshare.com</a></cite></p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0CJ4CM8XZ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/410YKXVdIRL._SL500_.jpg" class="hatena-asin-detail-image" alt="Raspberry RP2040-ゼロチップデュアルコアアーム Cortex M0+ プロセッサ柔軟なクロック実行最大 133 MHz Cortex M0+" title="Raspberry RP2040-ゼロチップデュアルコアアーム Cortex M0+ プロセッサ柔軟なクロック実行最大 133 MHz Cortex M0+"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0CJ4CM8XZ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Raspberry RP2040-ゼロチップデュアルコアアーム Cortex M0+ プロセッサ柔軟なクロック実行最大 133 MHz Cortex M0+</a></p><ul class="hatena-asin-detail-meta"><li>Milue</li></ul><a href="https://www.amazon.co.jp/dp/B0CJ4CM8XZ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="基板の設計">基板の設計</h1> <p>基板の設計と書きましたが、以前のALLPCB39を作った時と同様、<a href="http://www.keyboard-layout-editor.com/">Keyboard Layout Editor</a>のデータから基板のデータを半自動的に生成します。</p> <p>ということで、まずキーレイアウトを作成しました。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917144225.png" width="684" height="247" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>keyboard-layout-editorのデータから回路図を作るツールについて、KiCADのバージョンを上げたせいか、以前使ったツールはうまく動かなくなっていたので、今回はKiCADのアドオンである<a href="https://github.com/adamws/kicad-kbplacer">GitHub - adamws/kicad-kbplacer: KiCad plugin for automatic keyboard&#39;s key placement and routing</a>を使いました。</p> <p>使い方はkicad-kbplacerのREADMEに従いましたが、ちょっとわかりにくかったので、ここでも説明します</p> <p>まず、キーボードマトリクスの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%CF%C0%CD%FD%B2%F3%CF%A9">論理回路</a>図を作成します。今回はキーの数が44キーなので、Rowが7ピン、Columが7ピンのマトリクスレイアウトを採用します。結果として49キー利用できるので、キーボードの配列とは別に5つのキーを利用できるように設計することとします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917133056.png" width="761" height="651" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>で、この<a class="keyword" href="https://d.hatena.ne.jp/keyword/%CF%C0%CD%FD%B2%F3%CF%A9">論理回路</a>図の部品に番号を振ります</p> <p>annotation機能を実行すれば番号を振れるのですが、その際に以下の画像のように設定します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917133138.png" width="1200" height="694" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>おそらくここを変な形で設定しても、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>でうまいこと設定すれば対応できそうですが、今回はおとなしく指示に従いました。 その後、フットプリントを割り当てます。</p> <p>Gateron LowProfileのキーのフットプリントは以前作成したものがあるので、これを使います。</p> <p>次にKiCADの基板エディタで、ネットリストを読み込みます。 読み込んだ直後は以下のようになっています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917133354.png" width="821" height="451" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>さて、ここでこの部品たちをkeyboard-layout-editorで設計したキー配列のように並べるのがkicad-kbplacerの役割です。</p> <p>keyboard-layout-editorで作成した<a class="keyword" href="https://d.hatena.ne.jp/keyword/json">json</a>をkle-serial形式に変換する必要があるので、以下のツールを利用しました</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fadamws.github.io%2Fkle-serial%2F" title="kle-serial" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://adamws.github.io/kle-serial/">adamws.github.io</a></cite></p> <p>その後<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB%A5%D0%A1%BC">ツールバー</a>にあるkbplacerをクリックし、設定画面を開きます</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917133617.png" width="346" height="68" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917133640.png" width="728" height="533" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>kle-serial形式の<a class="keyword" href="https://d.hatena.ne.jp/keyword/json">json</a>ファイルを指定して、OKをクリックすると以下のように、部品がkeyboard-layout-editorで設定したものと同様の配列になりました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917133659.png" width="795" height="460" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>なお、今回は45キーのレイアウトだったので、余っている5キーについては手動で配置します。</p> <p>ここまででキーボードスイッチと<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>についてはレイアウトが決定しました。</p> <p>その他の部品や基板外形はいつもの回路設計と同様に行います。</p> <p>RP2040-Zeroのフットプリントは <a href="https://github.com/crides/kleeb">GitHub - crides/kleeb: Collection of Kicad 6.0 symbols, footprints and 3D models useful in keyboard creation</a>を利用しました。</p> <p>キーボードの上部にユニバーサル基板のような領域を作ってみました。</p> <p>これを作るにあたっては<a href="https://www.pcbway.com/blog/PCB_Design_Tutorial/KiCad___________Pcbnew____________________via_______1.html">KiCad&#x306E;&#x30EC;&#x30A4;&#x30A2;&#x30A6;&#x30C8;&#x30A8;&#x30C7;&#x30A3;&#x30BF;&#xFF08;Pcbnew&#xFF09;&#x3067;&#x534A;&#x7530;&#x4ED8;&#x3051;&#x30D1;&#x30C3;&#x30C9;&#x3092;&#x81EA;&#x7531;&#x306B;&#x8FFD;&#x52A0;&#x3059;&#x308B;&#x65B9;&#x6CD5;&#xFF08;via&#x3092;&#x5229;&#x7528;&#x3059;&#x308B;&#xFF09; - PCB Design Tutorial - PCBway</a>で紹介されているviaとソルダーマスクを使用する方法を利用しました。 ただしこの方法を愚直にやるとfreeroutingで自動配線するときにviaをfreeroutingが認識せず、自動配線がユニバーサル基板領域と重なってしまう問題が起きました。</p> <p>そのため、まずはユニバーサル基板領域を配線禁止エリアとし、自動配線後にviaとソルダーマスクを並べる手法でユニバーサル基板風の基板を作りました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917134502.png" width="1024" height="621" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>続いて、トッププレートも作成します。作り方は以前の<a href="https://inajob.hatenablog.jp/entry/diy-macropad">&#x30AA;&#x30EA;&#x30B8;&#x30CA;&#x30EB;&#x306E;&#x30DE;&#x30AF;&#x30ED;&#x30D1;&#x30C3;&#x30C9;&#x3092;&#x4F5C;&#x3063;&#x3066;&#x307F;&#x305F; - inajob&#39;s blog</a>と同じです。</p> <h1 id="基板の発注">基板の発注</h1> <p>発注はもちろんJLCPCBです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>10cm×10cm以内の基板が激安なのは、今まで紹介してきたとおりですが、今回の基板はそれより大きいです、さて、いくらくらいかかるのか・・?</p> <p>大きさは、本体基板が 242.6 mm × 127 mm、トッププレートが242.6 mm × 92.2 mmです。 注文後にメールが1つきて「配線が含まれない基板があるけどデータが間違っているのでは?」(英語)と確認されました。こちらはキーボードのトッププレートなので、配線なしで合っているので、問題ないので進めてくださいと返しました。</p> <p>その後さらにAn additional charge will be applied to your order[JLCPCB] というメールが来て、「細かい穴が多いので追加で$7.5支払ってほしい」と連絡がありました。これも問題ないので追加で支払いを行いました。</p> <p>具体的にはこのあたりが追加料金となった原因とのことでした。(まぁ、確かに細かい穴が多い)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917140220.png" width="635" height="265" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ということで5セット作ってもらうのに、お値段は下記に加えて追加の$7.5、送料の$13.77がかかりました。(別にもう1種類基板を発注していたので、送料はそれも込みのものとなっています)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917135654.png" width="347" height="368" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="部品の発注">部品の発注</h1> <p>Gateronの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EB">ロープロファイル</a>のキーボードスイッチ、これに対応した<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B9%A5%EF%A5%C3%A5%D7">ホットスワップ</a>ソケット、RP2040-Zero、128*64のI2C接続のOLED、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>、キーキャップが必要でしたが、今回はこれらの部品は家のストック部品を利用しました。</p> <p>Gateronの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EB">ロープロファイル</a>キーボードスイッチの2Uのスタビライザーは家になかったのでAliExpressで購入しました。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0CJ4CM8XZ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/410YKXVdIRL._SL500_.jpg" class="hatena-asin-detail-image" alt="Raspberry RP2040-ゼロチップデュアルコアアーム Cortex M0+ プロセッサ柔軟なクロック実行最大 133 MHz Cortex M0+" title="Raspberry RP2040-ゼロチップデュアルコアアーム Cortex M0+ プロセッサ柔軟なクロック実行最大 133 MHz Cortex M0+"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0CJ4CM8XZ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Raspberry RP2040-ゼロチップデュアルコアアーム Cortex M0+ プロセッサ柔軟なクロック実行最大 133 MHz Cortex M0+</a></p><ul class="hatena-asin-detail-meta"><li>Milue</li></ul><a href="https://www.amazon.co.jp/dp/B0CJ4CM8XZ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="今回のミス">今回のミス</h1> <p>スペースキーが横に長い(2.75U)ため、スタビライザーを取り付けられるように溝を付けたのですが、そのフットプリントのサイズが誤っており、そのままでは取り付けられないものとなりました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917142103.png" width="375" height="195" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>やはり、新しい部分があると、そこでミスしますね・・ 今回は取り敢えず、スタビライザーなしで組み立てることとしました。</p> <h1 id="部品実装">部品実装</h1> <p>RP2040-Zeroは端面スルーホール部品なので、基板を重ねて実装することが出来るのですが、とりあえず後で着脱が出来るようにピンヘッダ・ピンソケットを介して実装しました。OLEDも同様にピンヘッダ・ピンソケットを介して実装しました。</p> <p>後は<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>と、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B9%A5%EF%A5%C3%A5%D7">ホットスワップ</a>ソケットです。単純な部品なのですが、何しろ44個もあるので、実装が大変でした。特に<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B9%A5%EF%A5%C3%A5%D7">ホットスワップ</a>ソケットは、はんだがパッド面ではなくソケットの溝の方にばかり流れ込んでしまい、一見はんだが乗っているように見えるが、パッドと部品が接続されていないという状態になるケースが多発し、苦労しました。</p> <p>加えて、とても初歩的なミスですが、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>の向きを一部間違えて実装してしまい、これも修正が面倒でした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230917/20230917154107.png" width="631" height="841" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="ファームウェア実装"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>実装</h1> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>は<a href="http://kmkfw.io/">KMKfw | KMK</a>を使いました。 これはCircuitPython上に実装された、自作キーボード向けの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>で、非常に簡単に利用することが出来ました。</p> <p>実装した<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>はこんな感じです</p> <ul> <li>日本語キー配列(KMKは日本語キー配列もサポートしていました)</li> <li>レイヤーは2つ <ul> <li>通常レイヤー(<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AD%A1%BC%A5%C8%A5%C3%A5%D7">キートップ</a>に刻印されているアルファベット)</li> <li>数字レイヤー (一般的なキーボードの1行目にあるキーや、一部の記号)</li> </ul> </li> <li>OLEDにレイヤーの状態を表示</li> </ul> <p>これだけの記述でカスタマイズできるのはとても便利だと感じました。またCircuitPythonは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%D7%A5%EA%A5%BF">インタプリタ</a>として動いているので、修正・確認の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A3%A1%BC%A5%C9%A5%D0%A5%C3%A5%AF%A5%EB%A1%BC%A5%D7">フィードバックループ</a>を素早く回すことが出来たのも良かったです。(その分実行速度は遅いですが、今回の用途ではその遅さが気になることはなかったです)</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> board <span class="synPreProc">from</span> kmk.kmk_keyboard <span class="synPreProc">import</span> KMKKeyboard <span class="synPreProc">from</span> kmk.keys <span class="synPreProc">import</span> KC <span class="synPreProc">from</span> kmk.scanners <span class="synPreProc">import</span> DiodeOrientation <span class="synComment"># レイヤーを利用する</span> <span class="synPreProc">from</span> kmk.modules.layers <span class="synPreProc">import</span> Layers <span class="synComment"># 日本語対応</span> <span class="synPreProc">import</span> kmk.extensions.keymap_extras.keymap_jp <span class="synComment"># OLED対応</span> <span class="synPreProc">from</span> kmk.extensions.peg_oled_display <span class="synPreProc">import</span> Oled,OledDisplayMode,OledReactionType,OledData keyboard = KMKKeyboard() <span class="synComment"># ピンアサイン</span> keyboard.col_pins = (board.GP11, board.GP12, board.GP13, board.GP14, board.GP15, board.GP26,board.GP27) keyboard.row_pins = (board.GP4, board.GP5, board.GP6, board.GP7, board.GP8, board.GP9, board.GP10) keyboard.diode_orientation = DiodeOrientation.COL2ROW <span class="synComment"># レイヤー</span> keyboard.modules.append(Layers()) <span class="synComment"># OLED用のピンアサイン</span> keyboard.SCL=board.GP3 keyboard.SDA=board.GP2 <span class="synComment"># OLEDの設定</span> oled_ext = Oled( OledData( corner_one={<span class="synConstant">0</span>:OledReactionType.STATIC,<span class="synConstant">1</span>:[<span class="synConstant">&quot;layer&quot;</span>]}, corner_two={<span class="synConstant">0</span>:OledReactionType.LAYER,<span class="synConstant">1</span>:[<span class="synConstant">&quot;1&quot;</span>,<span class="synConstant">&quot;2&quot;</span>,<span class="synConstant">&quot;3&quot;</span>,<span class="synConstant">&quot;4&quot;</span>]}, corner_three={<span class="synConstant">0</span>:OledReactionType.LAYER,<span class="synConstant">1</span>:[<span class="synConstant">&quot;base&quot;</span>,<span class="synConstant">&quot;raise&quot;</span>,<span class="synConstant">&quot;lower&quot;</span>,<span class="synConstant">&quot;adjust&quot;</span>]}, corner_four={<span class="synConstant">0</span>:OledReactionType.LAYER,<span class="synConstant">1</span>:[<span class="synConstant">&quot;qwerty&quot;</span>,<span class="synConstant">&quot;nums&quot;</span>,<span class="synConstant">&quot;shifted&quot;</span>,<span class="synConstant">&quot;leds&quot;</span>]} ), toDisplay=OledDisplayMode.TXT,flip=<span class="synIdentifier">False</span>,oWidth=<span class="synConstant">128</span>, oHeight=<span class="synConstant">64</span>) keyboard.extensions.append(oled_ext) <span class="synComment"># よく使うキー</span> LOWER = KC.MO(<span class="synConstant">1</span>) _______ = KC.TRNS <span class="synComment"># キーマップ</span> keyboard.keymap = [ <span class="synComment"># layer0</span> [ KC.ESC, KC.Q, KC.W, KC.E, KC.R, KC.T, KC.Y, KC.U, KC.I, KC.O, KC.P, KC.BSPC, KC.TAB, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.ENT, KC.LSFT, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.UP,LOWER, KC.LCTRL, KC.LGUI, KC.LALT, LOWER, KC.MINUS, KC.SPC, KC.DOT, KC.LEFT, KC.DOWN, KC.RIGHT, KC.N0, KC.N1, KC.N2, KC.N3, KC.N4 ], <span class="synComment"># layer1</span> [ KC.GRAVE, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.BSLASH, _______, _______, _______, KC.CIRC, KC.JYEN, KC.AT, KC.SCLN, KC.COLN, KC.LBRC, KC.RBRC, _______, _______, _______, _______, _______, _______, _______, KC.SLASH, KC.BSLS, _______, _______,LOWER, _______, _______, _______, LOWER, LOWER, _______, _______, _______, _______, _______, KC.N0, KC.N1, KC.N2, KC.N3, KC.N4 ], ] <span class="synStatement">if</span> __name__ == <span class="synConstant">'__main__'</span>: keyboard.go() </pre> <h1 id="まとめ">まとめ</h1> <p>自分としては2つ目の自作キーボードを設計・実装しました。 kicad-kbplacerを使った自動配置、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EB">ロープロファイル</a>キーボードスイッチ、KMKなど、以前とは違う手法・構成を使い、多くの学びを得ました。</p> <p>前回のときも感じましたが、自作キーボードは、趣味の電子工作のジャンルの中でもとてもポピュラーなものとなってきており、周辺ツールや文書が潤沢にあるため、非常に入門しやすく、簡単に作り上げることが出来ると感じました。</p> <p>Hanamuguriは、まだキーボードとして最低限動作するところまでしかできていないので、今後ケースの作成、キーマップの充実、OLEDやカラーLEDの活用、これを組み込んだモバイル端末の作成など、まだまだやりたいことがたくさんあります。</p> <p>また進展があれば、ブログ記事などで紹介しようと思います。</p> inajob ガラケー型開発ボード「PiPoPa」を作った hatenablog://entry/820878482958922754 2023-08-17T18:30:13+09:00 2024-03-06T12:36:49+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 ガラケー型開発ボード「PiPoPa」とは PiPoPaはガラケー型の開発ボードです。Arduinoで開発でき、以下の機能を持ちます … <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816154422.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="ガラケー型開発ボードPiPoPaとは"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AC%A5%E9%A5%B1%A1%BC">ガラケー</a>型開発ボード「PiPoPa」とは</h1> <p>PiPoPaは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AC%A5%E9%A5%B1%A1%BC">ガラケー</a>型の開発ボードです。<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>で開発でき、以下の機能を持ちます</p> <ul> <li>2+3×4キー</li> <li>5wayキースイッチ</li> <li>USBシリアル(CH340N)による<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>での書き込み</li> <li>I2C接続のOLED</li> <li>RTC DS1307</li> <li>表面実装スピーカー</li> <li>単4乾電池2本駆動</li> <li>5V昇圧(以下から選べる) <ul> <li>5V昇圧モジュール</li> <li>HT7750を使った昇圧回路</li> </ul> </li> <li>ICSP書き込みピン</li> <li>I2C接続ポート</li> <li>余ったピンの接続ポート</li> <li>乾電池の電圧測定</li> </ul> <p>なお、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AC%A5%E9%A5%B1%A1%BC">ガラケー</a>の形はしていますが<strong>無線通信機能は搭載していません</strong></p> <p>さて、次に今回利用した特徴的な部品について紹介していきます。</p> <h1 id="CH340N">CH340N</h1> <p>安い<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>クローンなどで使われているUSBシリアルICであるCH340Gとよく似たICですが、CH340Nの特徴は水晶発振子が不要というところです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816151434.jpg" width="196" height="160" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> (ピンぼけ画像ですが・・8ピンで比較的はんだ付けしやすいパッケージです)</p> <p>これにより部品点数を押さえてUSBシリアル機能を持たせることが出来ます。</p> <h1 id="DS1307">DS1307</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816151456.jpg" width="320" height="307" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>で時刻を扱う際によく用いられるRTCです。周辺回路が同梱されたモジュールとなったものをよく見かけますが、今回はICをそのまま取り付けています。 バックアップ電源を用いることで、メイン電源が切れても時を刻み続けることが出来ますが、今回はメイン電源をそのままバックアップ電源として接続しています。 (電源スイッチがOFFでもRTCのバックアップ電源ポートに電気が流れるようにしてあります)</p> <h1 id="5Wayキースイッチ">5Wayキースイッチ</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816152437.jpg" width="156" height="152" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>上下左右とセンタークリックの5つのスイッチが内部に備えたスイッチです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816152448.jpg" width="343" height="318" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この部品は背面に凸が2つあり、基板に位置合わせできるようになっていますが、この穴の位置が似たような部品でも違うパターンのものがあるので注意が必要です。</p> <p>スイッチの感触は少し硬いように感じますが、そのおかげで誤った操作はしづらくなっていると感じます。</p> <h1 id="5V昇圧モジュール">5V昇圧モジュール</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816152812.jpg" width="192" height="186" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>これは以前紹介しました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fbattery-arduino-nano" title="Arduino Nanoを単4電池で動かすボードを作った - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/battery-arduino-nano">inajob.hatenablog.jp</a></cite></p> <p>上記の記事の<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoを単4電池で動かすボードと同様に5V昇圧モジュールとHT7750の好きな方を実装できるようにしています。 単4電池2本(3V)から5V昇圧し、標準的な<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>と同じ電圧で動作するようにしています。</p> <p>(今回利用している部品だと3Vのままでも一応動くような気がします)</p> <h1 id="デザイン発注">デザイン、発注</h1> <p>この基板は、以前似たようなものを作っていて、それを改良する形で作成しました。</p> <p>回路的には<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Unoとほとんど同じで、それにRTC回路や、昇圧回路、キーボードマトリクスなどを付け足した感じです。 部品の配置は、なるべくスマートになるようにギュっっと詰め込みました。</p> <p>横幅は33mm以内となっているため、10cmx10cmの中に3枚面付けできるようになっています(今回は面付けしていませんが・・)</p> <h1 id="基板の発注">基板の発注</h1> <p>JLCPCBに基板を発注します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite></p> <p>今回は何かカッコ良さそうな紫色の基板にしました。</p> <h1 id="今回のミス">今回のミス</h1> <p>スピーカーに直列して470Ωの抵抗をつける回路にしていたのですが、これはいつもRakuChordで利用している大きめのスピーカーのための抵抗値で、実際はもっと小さい抵抗値にする必要がありました。まぁこれはシルクが間違っているだけなので、適切な部品を使うことで対応できました。</p> <p>RTC用の水晶のフットプリントが電池ボックスと少し干渉している問題もありました。この部品はスルーホール部品なので、表面からはんだ付けすることで、裏面の電池ボックスと干渉している部分にはんだ付けすることを回避しました。組み立て順を工夫して、先にRTC用の水晶を取り付けるようにしても、この問題を回避できます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816153510.png" width="280" height="607" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="動作確認">動作確認</h1> <p>動作確認として、まずはOLEDの表示、キーの入力、RTC、電源電圧測定を試してみました。 どれも想定通りに動き、安心しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816151405.jpg" width="415" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230816/20230816151425.jpg" width="397" height="562" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>OLEDの操作はu8g2、RTCの操作はRTCLibを利用しました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Folikraus%2Fu8g2" title="GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/olikraus/u8g2">github.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fadafruit%2FRTClib" title="GitHub - adafruit/RTClib: A fork of Jeelab&#39;s fantastic RTC Arduino library" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/adafruit/RTClib">github.com</a></cite></p> <p>以下の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>で、時計の表示・設定、電源電圧の測定、キーの入力を試すことが出来ました。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;Arduino.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;U8g2lib.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;Wire.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;avr/sleep.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;avr/wdt.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;RTClib.h&gt;</span> <span class="synPreProc">#define COL1 </span><span class="synConstant">8</span> <span class="synPreProc">#define COL2 </span><span class="synConstant">9</span> <span class="synPreProc">#define COL3 </span><span class="synConstant">10</span> <span class="synPreProc">#define COL4 </span><span class="synConstant">11</span> <span class="synPreProc">#define COL5 </span><span class="synConstant">12</span> <span class="synPreProc">#define ROW1 </span><span class="synConstant">4</span> <span class="synPreProc">#define ROW2 </span><span class="synConstant">5</span> <span class="synPreProc">#define ROW3 </span><span class="synConstant">6</span> <span class="synPreProc">#define ROW4 </span><span class="synConstant">7</span> <span class="synPreProc">#define BAT A0</span> <span class="synPreProc">#define INT </span><span class="synConstant">2</span> <span class="synPreProc">#define M_NORMAL </span><span class="synConstant">0</span> <span class="synPreProc">#define M_SETTING </span><span class="synConstant">1</span> <span class="synType">int</span> mode = M_NORMAL; RTC_DS1307 RTC; U8G2_SSD1306_128X64_NONAME_F_HW_I2C <span class="synIdentifier">u8g2</span>(U8G2_R0, <span class="synComment">/* reset=*/</span> U8X8_PIN_NONE); <span class="synType">enum</span> Button{ LEFT, UP, DOWN, RIGHT, CENTER, SS1, SS2, BTN1, BTN2, BTN3, BTN4, BTN5, BTN6, BTN7, BTN8, BTN9, BTN0, BTNS, BTNA, BTNNUM }; byte trigger[BTNNUM]; String buf = <span class="synConstant">&quot;&quot;</span>; <span class="synType">char</span> timebuf[<span class="synConstant">32</span>]; <span class="synType">int</span> count = <span class="synConstant">0</span>; <span class="synType">bool</span> isCounting = <span class="synConstant">false</span>; <span class="synType">void</span> <span class="synIdentifier">setup</span>(){ RTC.<span class="synIdentifier">begin</span>(); u8g2.<span class="synIdentifier">begin</span>(); u8g2.<span class="synIdentifier">setFont</span>(u8g2_font_profont17_tf); <span class="synIdentifier">pinMode</span>(COL1, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(COL2, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(COL3, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(COL4, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(COL5, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW1, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW2, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW3, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW4, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(INT, INPUT_PULLUP); <span class="synIdentifier">analogReference</span>(DEFAULT); <span class="synIdentifier">pinMode</span>(BAT, INPUT); <span class="synIdentifier">digitalWrite</span>(BAT, LOW); <span class="synIdentifier">pinMode</span>(<span class="synConstant">3</span>, OUTPUT); <span class="synIdentifier">tone</span>(<span class="synConstant">3</span>, <span class="synConstant">440</span>, <span class="synConstant">100</span>); <span class="synStatement">for</span>(byte i = <span class="synConstant">0</span>; i &lt; BTNNUM; i ++){ trigger[i] = <span class="synConstant">0</span>; } } <span class="synType">void</span> <span class="synIdentifier">loop</span>(){ <span class="synType">bool</span> state[BTNNUM]; state[SS2] = !<span class="synIdentifier">digitalRead</span>(INT); <span class="synIdentifier">pinMode</span>(ROW1, OUTPUT); <span class="synIdentifier">digitalWrite</span>(ROW1, LOW); <span class="synIdentifier">pinMode</span>(ROW2, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW3, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW4, INPUT_PULLUP); state[LEFT] = !<span class="synIdentifier">digitalRead</span>(COL1); state[CENTER] = !<span class="synIdentifier">digitalRead</span>(COL2); state[DOWN] = !<span class="synIdentifier">digitalRead</span>(COL3); state[RIGHT] = !<span class="synIdentifier">digitalRead</span>(COL4); state[UP] = !<span class="synIdentifier">digitalRead</span>(COL5); <span class="synIdentifier">pinMode</span>(ROW1, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW2, OUTPUT); <span class="synIdentifier">digitalWrite</span>(ROW2, LOW); <span class="synIdentifier">pinMode</span>(ROW3, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW4, INPUT_PULLUP); state[SS1] = !<span class="synIdentifier">digitalRead</span>(COL5); state[BTN1] = !<span class="synIdentifier">digitalRead</span>(COL4); state[BTN4] = !<span class="synIdentifier">digitalRead</span>(COL3); state[BTN7] = !<span class="synIdentifier">digitalRead</span>(COL2); state[BTNA] = !<span class="synIdentifier">digitalRead</span>(COL1); <span class="synIdentifier">pinMode</span>(ROW1, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW2, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW3, OUTPUT); <span class="synIdentifier">digitalWrite</span>(ROW3, LOW); <span class="synIdentifier">pinMode</span>(ROW4, INPUT_PULLUP); state[BTN2] = !<span class="synIdentifier">digitalRead</span>(COL4); state[BTN5] = !<span class="synIdentifier">digitalRead</span>(COL3); state[BTN8] = !<span class="synIdentifier">digitalRead</span>(COL2); state[BTN0] = !<span class="synIdentifier">digitalRead</span>(COL1); <span class="synIdentifier">pinMode</span>(ROW1, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW2, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW3, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(ROW4, OUTPUT); <span class="synIdentifier">digitalWrite</span>(ROW4, LOW); state[BTN3] = !<span class="synIdentifier">digitalRead</span>(COL4); state[BTN6] = !<span class="synIdentifier">digitalRead</span>(COL3); state[BTN9] = !<span class="synIdentifier">digitalRead</span>(COL2); state[BTNS] = !<span class="synIdentifier">digitalRead</span>(COL1); <span class="synStatement">for</span>(byte i = <span class="synConstant">0</span>; i &lt; BTNNUM; i ++){ <span class="synStatement">if</span>(state[i]){ trigger[i] ++; }<span class="synStatement">else</span>{ trigger[i] = <span class="synConstant">0</span>; } } <span class="synType">bool</span> dirty = <span class="synConstant">false</span>; <span class="synStatement">if</span>(mode == M_NORMAL){ <span class="synStatement">for</span>(byte i = <span class="synConstant">0</span>; i &lt; BTNNUM; i ++){ <span class="synStatement">if</span>(trigger[i] == <span class="synConstant">1</span>){ <span class="synStatement">switch</span>(i){ <span class="synStatement">case</span> SS1: mode = M_SETTING; <span class="synStatement">break</span>; <span class="synStatement">case</span> SS2: <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN1: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;1&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN2: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;2&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN3: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;3&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN4: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;4&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN5: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;5&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN6: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;6&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN7: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;7&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN8: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;8&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN9: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;9&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN0: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;0&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTNA: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;*&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTNS: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;#&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> LEFT: <span class="synStatement">if</span>(buf.<span class="synIdentifier">length</span>() &gt; <span class="synConstant">0</span>){buf.<span class="synIdentifier">remove</span>(buf.<span class="synIdentifier">length</span>() - <span class="synConstant">1</span>);} <span class="synStatement">break</span>; } <span class="synStatement">if</span>(buf.<span class="synIdentifier">length</span>() &gt; <span class="synConstant">14</span>){ buf.<span class="synIdentifier">remove</span>(buf.<span class="synIdentifier">length</span>() - <span class="synConstant">1</span>); } dirty = <span class="synConstant">true</span>; } } <span class="synStatement">if</span> (RTC.<span class="synIdentifier">isrunning</span>()) { DateTime now = RTC.<span class="synIdentifier">now</span>(); <span class="synIdentifier">sprintf</span>(timebuf, <span class="synConstant">&quot;</span><span class="synSpecial">%02d</span><span class="synConstant">:</span><span class="synSpecial">%02d</span><span class="synConstant">:</span><span class="synSpecial">%02d</span><span class="synConstant">&quot;</span>, now.<span class="synIdentifier">hour</span>(), now.<span class="synIdentifier">minute</span>(), now.<span class="synIdentifier">second</span>()); } <span class="synType">float</span> bat = <span class="synConstant">5.0</span> * <span class="synIdentifier">analogRead</span>(BAT)/<span class="synConstant">1024</span>; <span class="synType">char</span> bbuf[<span class="synConstant">6</span>]; <span class="synIdentifier">dtostrf</span>(bat, <span class="synConstant">3</span>,<span class="synConstant">2</span>, bbuf); <span class="synType">char</span> batbuf[<span class="synConstant">25</span>]; <span class="synIdentifier">sprintf</span>(batbuf, <span class="synConstant">&quot;</span><span class="synSpecial">%s</span><span class="synConstant">V&quot;</span>, bbuf); u8g2.<span class="synIdentifier">clearBuffer</span>(); u8g2.<span class="synIdentifier">drawStr</span>(<span class="synConstant">0</span>,<span class="synConstant">12</span>,<span class="synConstant">&quot;HELLO PiPoPa2!&quot;</span>); u8g2.<span class="synIdentifier">drawStr</span>(<span class="synConstant">0</span>,<span class="synConstant">24</span>, buf.<span class="synIdentifier">c_str</span>()); u8g2.<span class="synIdentifier">drawStr</span>(<span class="synConstant">0</span>,<span class="synConstant">36</span>, timebuf); u8g2.<span class="synIdentifier">drawStr</span>(<span class="synConstant">0</span>,<span class="synConstant">48</span>, batbuf); u8g2.<span class="synIdentifier">sendBuffer</span>(); }<span class="synStatement">else</span> <span class="synStatement">if</span>(mode == M_SETTING){ <span class="synStatement">for</span>(byte i = <span class="synConstant">0</span>; i &lt; BTNNUM; i ++){ <span class="synStatement">if</span>(trigger[i] == <span class="synConstant">1</span>){ <span class="synStatement">switch</span>(i){ <span class="synStatement">case</span> SS1: <span class="synStatement">break</span>; <span class="synStatement">case</span> SS2: mode = M_NORMAL;<span class="synStatement">break</span>; <span class="synStatement">case</span> BTN1: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;1&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN2: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;2&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN3: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;3&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN4: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;4&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN5: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;5&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN6: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;6&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN7: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;7&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN8: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;8&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN9: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;9&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTN0: buf.<span class="synIdentifier">concat</span>(<span class="synConstant">&quot;0&quot;</span>); <span class="synStatement">break</span>; <span class="synStatement">case</span> BTNA: <span class="synStatement">break</span>; <span class="synStatement">case</span> BTNS: <span class="synStatement">break</span>; <span class="synStatement">case</span> LEFT: <span class="synStatement">if</span>(buf.<span class="synIdentifier">length</span>() &gt; <span class="synConstant">0</span>){buf.<span class="synIdentifier">remove</span>(buf.<span class="synIdentifier">length</span>() - <span class="synConstant">1</span>);} <span class="synStatement">break</span>; } <span class="synStatement">if</span>(buf.<span class="synIdentifier">length</span>() == <span class="synConstant">12</span>){ <span class="synComment">// complete</span> <span class="synType">int</span> year = buf.<span class="synIdentifier">substring</span>(<span class="synConstant">0</span>, <span class="synConstant">4</span>).<span class="synIdentifier">toInt</span>(); <span class="synType">int</span> month = buf.<span class="synIdentifier">substring</span>(<span class="synConstant">4</span>, <span class="synConstant">6</span>).<span class="synIdentifier">toInt</span>(); <span class="synType">int</span> day = buf.<span class="synIdentifier">substring</span>(<span class="synConstant">6</span>, <span class="synConstant">8</span>).<span class="synIdentifier">toInt</span>(); <span class="synType">int</span> hour = buf.<span class="synIdentifier">substring</span>(<span class="synConstant">8</span>, <span class="synConstant">10</span>).<span class="synIdentifier">toInt</span>(); <span class="synType">int</span> minute = buf.<span class="synIdentifier">substring</span>(<span class="synConstant">10</span>, <span class="synConstant">12</span>).<span class="synIdentifier">toInt</span>(); RTC.<span class="synIdentifier">adjust</span>(<span class="synIdentifier">DateTime</span>(year, month, day, hour, minute, <span class="synConstant">0</span>)); buf = <span class="synConstant">&quot;&quot;</span>; mode = M_NORMAL; } dirty = <span class="synConstant">true</span>; } } <span class="synStatement">if</span> (RTC.<span class="synIdentifier">isrunning</span>()) { DateTime now = RTC.<span class="synIdentifier">now</span>(); <span class="synIdentifier">sprintf</span>(timebuf, <span class="synConstant">&quot;</span><span class="synSpecial">%02d</span><span class="synConstant">:</span><span class="synSpecial">%02d</span><span class="synConstant">:</span><span class="synSpecial">%02d</span><span class="synConstant">&quot;</span>, now.<span class="synIdentifier">hour</span>(), now.<span class="synIdentifier">minute</span>(), now.<span class="synIdentifier">second</span>()); } u8g2.<span class="synIdentifier">clearBuffer</span>(); u8g2.<span class="synIdentifier">drawStr</span>(<span class="synConstant">0</span>,<span class="synConstant">12</span>,<span class="synConstant">&quot;SETTING&quot;</span>); u8g2.<span class="synIdentifier">drawStr</span>(<span class="synConstant">0</span>,<span class="synConstant">24</span>, <span class="synConstant">&quot;YYYYMMDDHHMM&quot;</span>); u8g2.<span class="synIdentifier">drawStr</span>(<span class="synConstant">0</span>,<span class="synConstant">24</span>, buf.<span class="synIdentifier">c_str</span>()); u8g2.<span class="synIdentifier">drawBox</span>(buf.<span class="synIdentifier">length</span>() * <span class="synConstant">9</span>,<span class="synConstant">12</span> + <span class="synConstant">12</span>-<span class="synConstant">2</span>, <span class="synConstant">9</span>, <span class="synConstant">2</span>); u8g2.<span class="synIdentifier">drawStr</span>(<span class="synConstant">0</span>,<span class="synConstant">36</span>, timebuf); u8g2.<span class="synIdentifier">sendBuffer</span>(); } } </pre> <h1 id="まとめ">まとめ</h1> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AC%A5%E9%A5%B1%A1%BC">ガラケー</a>型開発ボードPiPoPaを作成しました。<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の標準的な構成にすることで、既存の資源をうまく利用した設計が出来ました。 基本機能の確認をしただけですが、キーがたくさんあるので、かつての<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AC%A5%E9%A5%B1%A1%BC">ガラケー</a>のような操作性を備えたアプリケーションを色々動かすことが出来そうです。 (うまいことやれば<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A4%D2%A4%E9%A4%AC%A4%CA%C6%FE%CE%CF">ひらがな入力</a>くらいまではできそうに思います)</p> <p>また、基板むき出しのこのままでは使いづらいので<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>でケースを作ることにも挑戦したいなと考えています。</p> inajob オリジナルのマクロパッドを作ってみた hatenablog://entry/820878482952922502 2023-08-01T08:52:47+09:00 2024-03-06T12:37:02+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 オリジナルのマクロパッドとは? マクロパッドというのはキーボードの補助として用いる、キーボードのような装置です。 一般的にはメインの… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731155250.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="オリジナルのマクロパッドとは">オリジナルのマクロパッドとは?</h1> <p>マクロパッドというのはキーボードの補助として用いる、キーボードのような装置です。 一般的にはメインのキーボードよりキーの数が少なく、よく使う機能などを割り当ててパソコンの操作を簡単にするために用いるものです。</p> <p>今回はこのマクロパッドを自作してみようと思います。</p> <h1 id="材料">材料</h1> <ul> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボード <ul> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Pico / Pro Micro <ul> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボードは2種類から選べるようにしました</li> </ul> </li> </ul> </li> <li>キーボードスイッチ <ul> <li>Gateron low-profile(hot-swap / direct) / Cherry MX <ul> <li>キーボードスイッチも2種類、固定の仕方も選べるようにしました</li> </ul> </li> </ul> </li> <li>128x64 OLED <ul> <li>なんとなく表示機がついている方が面白そうなのでつけました</li> </ul> </li> <li>オーディオジャック/表面実装スピーカー <ul> <li>なんとなく音が鳴ると面白そうだったのでつけました</li> </ul> </li> </ul> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0B6NPGH7Z?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41k+TXonivL._SL500_.jpg" class="hatena-asin-detail-image" alt="Raspberry Pi Pico H ラズベリーパイ ピコ H" title="Raspberry Pi Pico H ラズベリーパイ ピコ H"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0B6NPGH7Z?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Raspberry Pi Pico H ラズベリーパイ ピコ H</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a></li></ul><a href="https://www.amazon.co.jp/dp/B0B6NPGH7Z?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h2 id="キーボードスイッチ-Gateron-low-profile">キーボードスイッチ Gateron low-profile</h2> <p>Gateron low-profileは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EB">ロープロファイル</a>キーボードスイッチの中でも比較的安価なスイッチです。<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EB">ロープロファイル</a>キーボードスイッチにはKailh Choc V1/V2やCherry MX low-profileなど様々な種類があり、それぞれフットプリントが違うので基板を流用することが出来ない点に注意が必要です。(一方で普通のキーボードスイッチはCherry MX互換スイッチが多く、多くの場合は基板が流用できます)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731152935.jpg" width="540" height="506" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="ホットスワップソケット"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B9%A5%EF%A5%C3%A5%D7">ホットスワップ</a>ソケット</h2> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B9%A5%EF%A5%C3%A5%D7">ホットスワップ</a>ソケットはGateron low-profileはフットプリントが独自なので専用のものが必要です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731153011.jpg" width="397" height="302" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="キーキャップ">キーキャップ</h2> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EB">ロープロファイル</a>のキーキャップもキーボードスイッチの種類によって形状が違うため、Gateron low-profileに適合したものが必要です。 しかし調べるとGateron low-profile専用のキーキャップはあまり見当たりません、そこで寸法を色々調べたところCherry MX low-profile用のキーキャップが、かなり近い形をしていたので、今回はこれを購入してみました。</p> <p>結果、問題なくキーキャップとして利用できました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731153028.jpg" width="223" height="221" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="表面実装スピーカー">表面実装スピーカー</h2> <p>表面実装のスピーカーを雑に検索して見つかったものを使用しています。型番的には8530というもののようです(単にサイズを表した数字列です) 特に増幅などもせず<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoのハイパスフィルタとしての<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>経由して接続しています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731152816.jpg" width="265" height="250" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="スイッチ付きイヤホンジャック">スイッチ付きイヤホンジャック</h2> <p>このイヤホンジャック、デスクトップパソコンなどでよく見かけるものと同じものだと思います。 5極のピンがあり、イヤホンジャックが抜かれているときだけ導通するようになっており、この部品だけで、イヤホンを接続しているとイヤホンから、イヤホンを接続していないときはスピーカーから、という制御ができる優れものです。</p> <p>型番はPJ-307と呼ばれているもののようです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731152907.jpg" width="563" height="448" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>スイッチの仕組みは仕様書の図だとこんな感じです。</p> <p><figure class="figure-image figure-image-fotolife" title="https://www.aitendo.com/product/4432 から転載"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731155147.png" width="90" height="64" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="https://www.aitendo.com/product/4432">https://www.aitendo.com/product/4432</a> から転載</figcaption></figure></p> <h2 id="ボリューム">ボリューム</h2> <p>2連の薄型のボリュームです。今回は2連である必要はないのですが、手元にこれがあったのでこれの1つのボリュームだけを使っています。 スルーホールの部品ですが、かなり薄型なので、コンパクトなガジェットにも使いやすくてお気に入りです。</p> <p>注意点としてこのボリューム、同じ見た目でピン配置が異なるものがあるようです。</p> <p>型番的にはB103と呼ばれているもののようです。(103はおそらく抵抗値だろうから、104とかもあると思います)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230731/20230731152840.jpg" width="428" height="436" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="基板の設計">基板の設計</h1> <p>今回はキーボードスイッチを固定するためのトッププレートも基板として発注することにします。 つまりメインボードと、トッププレートの2枚を設計しJLCPCBに発注します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230726/20230726232921.png" width="914" height="426" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>基板の設計にあたってはいくつか工夫した点があります。</p> <h2 id="2種類のマイコンボードをサポート">2種類の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボードをサポート</h2> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoと Pro Microという自作キーボード界ではメジャーな<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボード両方に対応するため、2つのフットプリントを少しずらして重ねて配置しています。もちろん配線は両方の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>に接続させています</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230726/20230726233009.png" width="308" height="509" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="3種類のキーボードスイッチをサポート">3種類のキーボードスイッチをサポート</h2> <p>自作キーボードで用いるキーボードスイッチにはいくつか種類があり、その種類によりフットプリントの形状が異なります。 今回試したかったのはGateronのlow-profile(<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EB">ロープロファイル</a>)のキーボードスイッチです。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%D7%A5%ED%A5%D5%A5%A1%A5%A4%A5%EB">ロープロファイル</a>というのは、通常のキーボードスイッチよりも高さの低いキーボードスイッチの種類です。</p> <p>このスイッチのフットプリントは一般的なCherry MXのものとは違っていたので、フットプリントから自作することにしました。 (後に<a href="https://github.com/alg0002/kicad_library/tree/main/footprints">すでにあるフットプリントの存在</a>を教えてもらいましたが、、まぁ勉強ということで・・)</p> <p>せっかく作るので、通常のGateronのlow-profile、Gateron low-profileの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B9%A5%EF%A5%C3%A5%D7">ホットスワップ</a>ソケット(キーボードスイッチを取り外しできるようにソケットを介してつなげる方式)、そしてキーボード界の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%D5%A5%A1%A5%AF%A5%C8%A5%B9%A5%BF%A5%F3%A5%C0%A1%BC%A5%C9">デファクトスタンダード</a>であるCherry MXの3種類に対応したフットプリントを作りました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230726/20230726233237.png" width="405" height="379" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="トッププレートの設計">トッププレートの設計</h2> <p>トッププレートはキーボードスイッチを固定するための四角い穴の開いた板です。 基板のキーボードスイッチの固定位置とぴったり合わせて、穴の大きさもキーボードスイッチぴったりに作る必要があるので、気を付けて設計します。</p> <p>具体的には、まずフットプリントとして、キーボードスイッチを固定するための四角穴を作ります。この際、部品の原点がキーボードスイッチのフットプリントと同一になるように注意が必要です。</p> <p>その後、完成したキーボード基板のデータをコピーし、不要な部品を削除したうえで、キーボードスイッチのフットプリントをキーボードスイッチの四角穴のフットプリントに置換します。</p> <p>最後にディスプレイのための窓などもくりぬくように指定をして完成です。</p> <p>この後、基板に修正を加える場合は、部品の位置をずらさないように注意しました。(よくわからなくなった場合は、トッププレートを再度作り直しました)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230726/20230726233337.png" width="853" height="718" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="基板の発注">基板の発注</h1> <p>発注はもちろんJLCPCBです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite></p> <p>通常の基板は1.6mmなのですが、トッププレートはGateronのlow-profileの仕様に合わせて1mmにしました。 (比較用で1.2mmも作ってみましたが、どちらでも問題なかったです、強いて言えば1.2mmのほうがしっかり固定できている感じがします)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230801/20230801085035.png" width="732" height="51" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>基板は100mm*100mm以内に収めるようにしたため、5枚で$4(はじめの1つは$2)+送料で発注できました。 色はなんとなくかっこいい黒!</p> <h1 id="今回のミス">今回のミス</h1> <p>懲りずにまたミスをしてしまいました・・</p> <p>雑に設計したため、Raspbery Pi Picoの3V3につなげるべき配線を3V3_ENに繋いでしまっていました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230728/20230728001216.png" width="418" height="374" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>今回も配線がシンプルだったので1か所パターンをカットして、正しい配線をジャンパ線でつなげて修正完了です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230730/20230730163759.png" width="234" height="308" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="動作確認">動作確認</h1> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoとGateron low-profileのキーボードスイッチをhot-swapソケットでマウントする方式で組み立ててみました。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoとOLEDはピンソケット経由で取り付けましたが、基板に直接はんだ付けした方が薄く済ませることが出来ます。</p> <p>実はこのマクロパッドの配線は、以前作った<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoを使った携帯ゲーム機と同じような配線になっているため、同じプログラムが動作します。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fraspberry-pi-pico-mobile" title="Raspberry Pi Picoを使った携帯ゲーム機 - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/raspberry-pi-pico-mobile">inajob.hatenablog.jp</a></cite></p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">マクロパッドのつもりで作ってだけど、普通に作曲装置にもなりそう! <a href="https://t.co/V7UnShdFf3">pic.twitter.com/V7UnShdFf3</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1685908896932888577?ref_src=twsrc%5Etfw">2023年7月31日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="マクロパッドとしての動作確認">マクロパッドとしての動作確認</h1> <p>さて、ここからはキーボードとしての振る舞いを実装していきます。</p> <p>調べると、MicroPythonではなくCircuitPythonを使うと簡単にキーボードやマウスが作れるとのこと・・</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fcircuitpython.org%2Fboard%2Fraspberry_pi_pico%2F" title="CircuitPython - Pico Download" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://circuitpython.org/board/raspberry_pi_pico/">circuitpython.org</a></cite></p> <p>CircuitPythonのuf2ファイルを取得し、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoに書き込みます(RUNを操作するための、スイッチを付けて置けばよかったと後悔・・BOOTスイッチを押しながら、USBケーブルを抜き差しします)</p> <p>CircuitPythonはMicroPythonとは違い実行中もUSBマスストレージとして認識され、ライブラリなどをPCから直接コピーすることができます。</p> <p>まずはOLEDの制御用に Adafruit_CircuitPython_SSD1306 をインストール(lib<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リにコピーする)</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fadafruit%2FAdafruit_CircuitPython_SSD1306" title="GitHub - adafruit/Adafruit_CircuitPython_SSD1306: Adafruit CircuitPython framebuf driver for SSD1306 or SSD1305 OLED displays. Not for use with displayio. See README." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/adafruit/Adafruit_CircuitPython_SSD1306">github.com</a></cite></p> <p>文字を表示するには以下のフォントファイルが必要です(ルート<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リにコピーする)</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fadafruit%2FAdafruit_CircuitPython_framebuf%2Fblob%2Fmain%2Fexamples%2Ffont5x8.bin" title="Adafruit_CircuitPython_framebuf/examples/font5x8.bin at main · adafruit/Adafruit_CircuitPython_framebuf" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/adafruit/Adafruit_CircuitPython_framebuf/blob/main/examples/font5x8.bin">github.com</a></cite></p> <p>さらにマウスやキーボード制御のために Adafruit_CircuitPython_HID をインストールします。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fadafruit%2FAdafruit_CircuitPython_HID" title="GitHub - adafruit/Adafruit_CircuitPython_HID: USB Human Interface Device drivers." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/adafruit/Adafruit_CircuitPython_HID">github.com</a></cite></p> <p>後は初期化コードを少し書いて、スイッチの状態に合わせてキーコードを送信すればマクロパッドの基礎は完成です。</p> <p>ここでは、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%BD%BD%BB%FA%A5%AD%A1%BC">十字キー</a>とA,Bというそのままの機能を割り付けましたが、もっと自由に、1キー打鍵すると複数の文字を入力できるようにしたり、OLEDに表示されたメニューから選択した文字を入力するなどといった複雑な機能を作ることもできます。</p> <p>工夫した点としては、キーが押され始めるとカウントアップする変数を用意して、キーが押されてから2フレーム目にキー入力を発行するようにした点です。(もっとちゃんとするなら、キーの押し下げ、押し上げなども送信するのが良いと思います。)</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synConstant">&quot;&quot;&quot;</span> <span class="synConstant">Raspberry Pi Pico Keyboard test</span> <span class="synConstant">Copyright (c) 2023 inajob</span> <span class="synConstant">This software is released under the MIT License.</span> <span class="synConstant">http://opensource.org/licenses/mit-license.php</span> <span class="synConstant">&quot;&quot;&quot;</span> <span class="synPreProc">import</span> board <span class="synPreProc">import</span> busio <span class="synPreProc">import</span> digitalio <span class="synPreProc">import</span> time <span class="synComment"># OLED</span> <span class="synPreProc">import</span> adafruit_ssd1306 i2c = busio.I2C(board.GP5, board.GP4) <span class="synComment"># (SCL, SDA)17,16</span> display = adafruit_ssd1306.SSD1306_I2C(<span class="synConstant">128</span>, <span class="synConstant">64</span>, i2c, addr=<span class="synConstant">0x3C</span>) display.fill(<span class="synConstant">0</span>) display.text(<span class="synConstant">&quot;Hello&quot;</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">1</span>) display.show() <span class="synComment"># USB HID</span> <span class="synPreProc">import</span> usb_hid <span class="synPreProc">from</span> adafruit_hid.keyboard <span class="synPreProc">import</span> Keyboard <span class="synPreProc">from</span> adafruit_hid.keycode <span class="synPreProc">import</span> Keycode right = digitalio.DigitalInOut(board.GP16) right.switch_to_input(pull=digitalio.Pull.UP) left = digitalio.DigitalInOut(board.GP18) left.switch_to_input(pull=digitalio.Pull.UP) up = digitalio.DigitalInOut(board.GP19) up.switch_to_input(pull=digitalio.Pull.UP) down = digitalio.DigitalInOut(board.GP17) down.switch_to_input(pull=digitalio.Pull.UP) btna = digitalio.DigitalInOut(board.GP15) btna.switch_to_input(pull=digitalio.Pull.UP) btnb = digitalio.DigitalInOut(board.GP14) btnb.switch_to_input(pull=digitalio.Pull.UP) kbd = Keyboard(usb_hid.devices) trigger = [<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>] <span class="synStatement">while</span> <span class="synIdentifier">True</span>: <span class="synStatement">if</span> <span class="synStatement">not</span>(left.value): trigger[<span class="synConstant">0</span>] = trigger[<span class="synConstant">0</span>] + <span class="synConstant">1</span> <span class="synStatement">else</span>: trigger[<span class="synConstant">0</span>] = -<span class="synConstant">1</span> <span class="synStatement">if</span> <span class="synStatement">not</span>(right.value): trigger[<span class="synConstant">1</span>] = trigger[<span class="synConstant">1</span>] + <span class="synConstant">1</span> <span class="synStatement">else</span>: trigger[<span class="synConstant">1</span>] = -<span class="synConstant">1</span> <span class="synStatement">if</span> <span class="synStatement">not</span>(up.value): trigger[<span class="synConstant">2</span>] = trigger[<span class="synConstant">2</span>] + <span class="synConstant">1</span> <span class="synStatement">else</span>: trigger[<span class="synConstant">2</span>] = -<span class="synConstant">1</span> <span class="synStatement">if</span> <span class="synStatement">not</span>(down.value): trigger[<span class="synConstant">3</span>] = trigger[<span class="synConstant">3</span>] + <span class="synConstant">1</span> <span class="synStatement">else</span>: trigger[<span class="synConstant">3</span>] = -<span class="synConstant">1</span> <span class="synStatement">if</span> <span class="synStatement">not</span>(btna.value): trigger[<span class="synConstant">4</span>] = trigger[<span class="synConstant">4</span>] + <span class="synConstant">1</span> <span class="synStatement">else</span>: trigger[<span class="synConstant">4</span>] = -<span class="synConstant">1</span> <span class="synStatement">if</span> <span class="synStatement">not</span>(btnb.value): trigger[<span class="synConstant">5</span>] = trigger[<span class="synConstant">5</span>] + <span class="synConstant">1</span> <span class="synStatement">else</span>: trigger[<span class="synConstant">5</span>] = -<span class="synConstant">1</span> <span class="synStatement">if</span> trigger[<span class="synConstant">0</span>] == <span class="synConstant">2</span>: kbd.send(Keycode.LEFT_ARROW) display.fill(<span class="synConstant">0</span>) display.text(<span class="synConstant">&quot;LEFT&quot;</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">1</span>) display.show() <span class="synStatement">if</span> trigger[<span class="synConstant">1</span>] == <span class="synConstant">2</span>: kbd.send(Keycode.RIGHT_ARROW) display.fill(<span class="synConstant">0</span>) display.text(<span class="synConstant">&quot;RIGHT&quot;</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">1</span>) display.show() <span class="synStatement">if</span> trigger[<span class="synConstant">2</span>] == <span class="synConstant">2</span>: kbd.send(Keycode.UP_ARROW) display.fill(<span class="synConstant">0</span>) display.text(<span class="synConstant">&quot;UP&quot;</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">1</span>) display.show() <span class="synStatement">if</span> trigger[<span class="synConstant">3</span>] == <span class="synConstant">2</span>: kbd.send(Keycode.DOWN_ARROW) display.fill(<span class="synConstant">0</span>) display.text(<span class="synConstant">&quot;DOWN&quot;</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">1</span>) display.show() <span class="synStatement">if</span> trigger[<span class="synConstant">4</span>] == <span class="synConstant">2</span>: kbd.send(Keycode.A) display.fill(<span class="synConstant">0</span>) display.text(<span class="synConstant">&quot;A&quot;</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">1</span>) display.show() <span class="synStatement">if</span> trigger[<span class="synConstant">5</span>] == <span class="synConstant">2</span>: kbd.send(Keycode.B) display.fill(<span class="synConstant">0</span>) display.text(<span class="synConstant">&quot;B&quot;</span>,<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">1</span>) display.show() </pre> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">もちろんマクロパッドとしても動きます!<br>記事書いてるところなので乞うご期待! <a href="https://t.co/fjARxFNRKb">pic.twitter.com/fjARxFNRKb</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1685910717302714368?ref_src=twsrc%5Etfw">2023年7月31日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="まとめ">まとめ</h1> <p>Gateronのlow-profileのキーボードスイッチを使ったマクロ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AD%A1%BC%A5%D1%A5%C3%A5%C9">キーパッド</a>を作ってみました。 キーボードパネルも基板として発注することで、手軽にしっかりしたつくりのマクロパッドを作成できました。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoでこのようなマクロパッドを使う際はCircuitPythonが便利であることも知りました。</p> <p>次はもっとキーの数の多いキーボードの作成にも挑戦してみたいと思いました。</p> <h1 id="参考">参考</h1> <p>以下の記事を参考にしました。</p> <p><a href="https://hf-labo.net/ew-pico-mouse-keyboard/">https://hf-labo.net/ew-pico-mouse-keyboard/</a><cite class="hatena-citation"><a href="https://hf-labo.net/ew-pico-mouse-keyboard/">hf-labo.net</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flogikara.blog%2Fraspi_pico_oled_circuitpy%2F" title="ラズパイPicoでSSD1306有機ELディスプレイの使い方 CircuitPython編" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://logikara.blog/raspi_pico_oled_circuitpy/">logikara.blog</a></cite></p> inajob Raspberry Pi Picoを使った携帯ゲーム機 hatenablog://entry/820878482943154937 2023-06-26T17:12:52+09:00 2024-03-06T12:37:16+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 Raspberry Pi Picoを使った携帯ゲーム機とは? 文字通り、Raspberry Pi Picoを搭載した携帯ゲーム機です… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230626/20230626134012.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV%3Ffrom%3Dinaani" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV?from=inaani">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="Raspberry-Pi-Picoを使った携帯ゲーム機とは"><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoを使った携帯ゲーム機とは?</h1> <p>文字通り、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoを搭載した携帯ゲーム機です。 1枚の基板で色々なことが試せるように工夫しました。</p> <ul> <li>ディプレイは以下から1つ <ul> <li>I2C接続OLED</li> <li>SPI接続OLED</li> <li>SPI接続カラー<a class="keyword" href="https://d.hatena.ne.jp/keyword/TFT">TFT</a>(128px*128px)</li> </ul> </li> <li>スピーカー</li> <li>3.5mmオーディオジャック端子</li> <li>ボリューム</li> <li>電源は以下から1つ <ul> <li> 単4電池2つ</li> <li>LiPOバッテリー(充電モジュールは既製品を想定)</li> </ul> </li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/MicroSD">MicroSD</a>カードソケット</li> <li>十字ボタン、A,Bボタン</li> <li>電源用スライドスイッチ</li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoのすべての端子を引き出した拡張端子</li> </ul> <p>タクトスイッチは6mm角の表面実装の物、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>は0603(1608M)を使っています</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230626/20230626131244.jpg" width="644" height="579" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230626/20230626131347.jpg" width="570" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="複数のディスプレイ複数の電源への対応">複数のディスプレイ、複数の電源への対応</h1> <p>まぁ単純にフットプリントを重ねて配置しただけです。どれか1つしか使わない想定なので、フットプリント自体が重なることは問題がないため、スルーホール穴が重ならないように配置しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230621/20230621214242.png" width="412" height="511" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>電源も、乾電池ホルダーに重ねてLiPoバッテリーの充電モジュールを配置し、どちらか一方を利用できるようにしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230621/20230621214312.png" width="472" height="622" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="発注">発注</h1> <p>今回は基板の色は黒で発注しました。JLCPCBの黒の基板はツヤ消しマットのような質感で、高級感があり良いものだと思いました。</p> <p>基板サイズは10cm*10cm以内なので、JLCPCBの最安料金で発注できました。 (1注文当たり5枚の基板が1つだけ割引になるため、1注文なら5枚で$2+送料)</p> <h1 id="今回の失敗">今回の失敗</h1> <p>今回も凡ミスをしてしまいました・・</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoのGNDが他のGNDと繋がっておらず、電源を入れても、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoに電源が供給されない状態でした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230621/20230621215325.png" width="755" height="570" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>まぁ、修正は簡単で、適当なGNDの来ているピンから<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoのGNDピンにジャンパ線を取り付けて修正しました。</p> <p>毎回ミスはありますね・・</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230626/20230626132310.png" width="447" height="476" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="単4電池2つでRaspberry-Pi-Pico">単4電池2つで<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Pico?!</h1> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoは3.3V駆動なので単4電池2つでは少し電圧が足りないと思って、DC-DCコンバータを別途取り付けようと思っていたのですが、よく仕様を見ると<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoにはDC-DCコンバータが搭載されており、1.8~5.5Vを印加すると、いい感じに3.3Vにしてくれるようで、外部部品が不要であることに気づきました。</p> <p><figure class="figure-image figure-image-fotolife" title="https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf より(CC BY-ND)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230621/20230621220024.png" width="785" height="79" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf">https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf</a> より(CC BY-ND)</figcaption></figure></p> <h1 id="MicroPythonでのプログラミング">MicroPythonでのプログラミング</h1> <p>とりあえず I2C接続OLED、単4電池2つの構成で組み立てました。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoを使ったゲーム機の動作テスト<br>MicroPythonでもここまで速度が出る<br><br>基板は <a href="https://twitter.com/hashtag/JLCPCB?src=hash&amp;ref_src=twsrc%5Etfw">#JLCPCB</a> で作った。<br>ブログ記事、もうすぐ公開します。<a href="https://t.co/lf2W6eXcL8">https://t.co/lf2W6eXcL8</a> <a href="https://t.co/aTmKjxbhCj">pic.twitter.com/aTmKjxbhCj</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1673241419337863168?ref_src=twsrc%5Etfw">2023年6月26日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>動作確認がてらMicroPythonでプログラミングしてみました。 以下の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>で、キー入力を取得し、画面に文字を表示し、音を鳴らすことができます。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synConstant">&quot;&quot;&quot;</span> <span class="synConstant">Raspberry Pi Pico Sequencer test</span> <span class="synConstant">Copyright (c) 2023 inajob</span> <span class="synConstant">This software is released under the MIT License.</span> <span class="synConstant">http://opensource.org/licenses/mit-license.php</span> <span class="synConstant">&quot;&quot;&quot;</span> <span class="synPreProc">from</span> machine <span class="synPreProc">import</span> Pin, I2C, PWM, Timer <span class="synPreProc">import</span> ssd1306 <span class="synPreProc">import</span> time buzzer = PWM(Pin(<span class="synConstant">9</span>)) freqLis = [<span class="synConstant">262</span>, <span class="synConstant">294</span>, <span class="synConstant">330</span>, <span class="synConstant">349</span>, <span class="synConstant">392</span>, <span class="synConstant">440</span>, <span class="synConstant">494</span>, <span class="synConstant">523</span>] idx = <span class="synConstant">0</span> i2c = I2C(<span class="synConstant">0</span>, sda=Pin(<span class="synConstant">4</span>), scl=Pin(<span class="synConstant">5</span>) , freq=<span class="synConstant">400000</span>) BTNA = Pin(<span class="synConstant">15</span>, Pin.IN, Pin.PULL_UP) BTNB = Pin(<span class="synConstant">14</span>, Pin.IN, Pin.PULL_UP) BTNU = Pin(<span class="synConstant">19</span>, Pin.IN, Pin.PULL_UP) BTND = Pin(<span class="synConstant">17</span>, Pin.IN, Pin.PULL_UP) BTNL = Pin(<span class="synConstant">18</span>, Pin.IN, Pin.PULL_UP) BTNR = Pin(<span class="synConstant">16</span>, Pin.IN, Pin.PULL_UP) display = ssd1306.SSD1306_I2C(<span class="synConstant">128</span>, <span class="synConstant">64</span>, i2c) count = <span class="synConstant">0</span> pos = [<span class="synConstant">0</span>,<span class="synConstant">0</span>] MAX_STEP = <span class="synIdentifier">int</span>(<span class="synConstant">128</span>/<span class="synConstant">4</span>) MAX_TONE = <span class="synIdentifier">int</span>(<span class="synConstant">64</span>/<span class="synConstant">4</span>) data = [[<span class="synIdentifier">False</span>] * MAX_TONE <span class="synStatement">for</span> _ <span class="synStatement">in</span> <span class="synIdentifier">range</span>(MAX_STEP)] playPos = <span class="synConstant">0</span>; <span class="synStatement">def</span> <span class="synIdentifier">draw</span>(): display.fill_rect(<span class="synConstant">0</span>,<span class="synConstant">0</span>,<span class="synConstant">128</span>,<span class="synConstant">64</span>,<span class="synConstant">0</span>) <span class="synStatement">for</span> step <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">128</span>/<span class="synConstant">4</span>): <span class="synStatement">for</span> tone <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">64</span>/<span class="synConstant">4</span>): <span class="synStatement">if</span> data[step][tone]: display.fill_rect(step*<span class="synConstant">4</span>, tone*<span class="synConstant">4</span>, <span class="synConstant">4</span>, <span class="synConstant">4</span>, <span class="synConstant">1</span>) display.fill_rect(pos[<span class="synConstant">0</span>]*<span class="synConstant">4</span>, pos[<span class="synConstant">1</span>]*<span class="synConstant">4</span>, <span class="synConstant">4</span>, <span class="synConstant">4</span>, <span class="synConstant">1</span>) display.fill_rect(playPos*<span class="synConstant">4</span>, <span class="synConstant">0</span>, <span class="synConstant">1</span>, <span class="synConstant">64</span>, <span class="synConstant">1</span>) <span class="synStatement">def</span> <span class="synIdentifier">tick</span>(timer): <span class="synStatement">global</span> idx <span class="synStatement">global</span> count <span class="synStatement">global</span> pos <span class="synStatement">global</span> playPos draw() count = count + <span class="synConstant">1</span> <span class="synStatement">if</span> count &gt; <span class="synConstant">2</span>: count = <span class="synConstant">0</span> playPos = playPos + <span class="synConstant">1</span> <span class="synStatement">if</span> playPos &gt;= <span class="synConstant">8</span>: playPos = <span class="synConstant">0</span> display.show() <span class="synStatement">if</span>(BTNA.value() == <span class="synConstant">0</span>): data[pos[<span class="synConstant">0</span>]][pos[<span class="synConstant">1</span>]] = <span class="synIdentifier">True</span> <span class="synStatement">if</span>(BTNB.value() == <span class="synConstant">0</span>): data[pos[<span class="synConstant">0</span>]][pos[<span class="synConstant">1</span>]] = <span class="synIdentifier">False</span> <span class="synStatement">if</span>(BTNU.value() == <span class="synConstant">0</span>): pos[<span class="synConstant">1</span>] = pos[<span class="synConstant">1</span>] - <span class="synConstant">1</span> <span class="synStatement">if</span> pos[<span class="synConstant">1</span>] &lt; <span class="synConstant">0</span>: pos[<span class="synConstant">1</span>] = <span class="synConstant">0</span> <span class="synStatement">if</span>(BTND.value() == <span class="synConstant">0</span>): pos[<span class="synConstant">1</span>] = pos[<span class="synConstant">1</span>] + <span class="synConstant">1</span> <span class="synStatement">if</span>(BTNL.value() == <span class="synConstant">0</span>): pos[<span class="synConstant">0</span>] = pos[<span class="synConstant">0</span>] - <span class="synConstant">1</span> <span class="synStatement">if</span> pos[<span class="synConstant">0</span>] &lt; <span class="synConstant">0</span>: pos[<span class="synConstant">0</span>] = <span class="synConstant">0</span> <span class="synStatement">if</span>(BTNR.value() == <span class="synConstant">0</span>): pos[<span class="synConstant">0</span>] = pos[<span class="synConstant">0</span>] + <span class="synConstant">1</span> f = <span class="synIdentifier">False</span> <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(MAX_TONE): <span class="synStatement">if</span> data[playPos][i]: buzzer.freq(freqLis[i]) buzzer.duty_u16(<span class="synConstant">256</span>*<span class="synConstant">16</span>) f = <span class="synIdentifier">True</span> <span class="synStatement">if</span> <span class="synStatement">not</span>(f): buzzer.duty_u16(<span class="synConstant">0</span>) tim = Timer() tim.init(period=<span class="synConstant">100</span>, mode=Timer.PERIODIC, callback=tick) </pre> <p>MicroPythonの開発にはThony( <a href="https://thonny.org/">https://thonny.org/</a> )を利用しました。</p> <p>MicroPythonは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>することなく、パソコン上の<a class="keyword" href="https://d.hatena.ne.jp/keyword/IDE">IDE</a>からプログラムを転送し、実行できるので、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>などに比べるとトライ&amp;エラーがやりやすいと感じました。</p> <h1 id="Arduinoでのプログラミング"><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>でのプログラミング</h1> <p>MicroPythonで作曲ソフトを作りましたが、これでは和音に対応できません。 ということで<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を使って和音も利用できる作曲ソフトを作ってみました。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">和音が鳴らしたかったので<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>にも挑戦 <a href="https://t.co/dXihQI4i1f">pic.twitter.com/dXihQI4i1f</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1673241929461661696?ref_src=twsrc%5Etfw">2023年6月26日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>OLEDの制御は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOでよく利用しているu8g2というライブラリがそのまま動いたので、簡単でした。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Folikraus%2Fu8g2" title="GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/olikraus/u8g2">github.com</a></cite></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>は雑ですが、、こんな感じです。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synComment">/**</span> <span class="synComment">Raspberry Pi Pico Sequencer test</span> <span class="synComment">Copyright (c) 2023 inajob</span> <span class="synComment">This software is released under the MIT License.</span> <span class="synComment">http://opensource.org/licenses/mit-license.php</span> <span class="synComment">*/</span> <span class="synPreProc">#define NOTE_B0 </span><span class="synConstant">31</span> <span class="synPreProc">#define NOTE_C1 </span><span class="synConstant">33</span> <span class="synPreProc">#define NOTE_CS1 </span><span class="synConstant">35</span> <span class="synPreProc">#define NOTE_D1 </span><span class="synConstant">37</span> <span class="synPreProc">#define NOTE_DS1 </span><span class="synConstant">39</span> <span class="synPreProc">#define NOTE_E1 </span><span class="synConstant">41</span> <span class="synPreProc">#define NOTE_F1 </span><span class="synConstant">44</span> <span class="synPreProc">#define NOTE_FS1 </span><span class="synConstant">46</span> <span class="synPreProc">#define NOTE_G1 </span><span class="synConstant">49</span> <span class="synPreProc">#define NOTE_GS1 </span><span class="synConstant">52</span> <span class="synPreProc">#define NOTE_A1 </span><span class="synConstant">55</span> <span class="synPreProc">#define NOTE_AS1 </span><span class="synConstant">58</span> <span class="synPreProc">#define NOTE_B1 </span><span class="synConstant">62</span> <span class="synPreProc">#define NOTE_C2 </span><span class="synConstant">65</span> <span class="synPreProc">#define NOTE_CS2 </span><span class="synConstant">69</span> <span class="synPreProc">#define NOTE_D2 </span><span class="synConstant">73</span> <span class="synPreProc">#define NOTE_DS2 </span><span class="synConstant">78</span> <span class="synPreProc">#define NOTE_E2 </span><span class="synConstant">82</span> <span class="synPreProc">#define NOTE_F2 </span><span class="synConstant">87</span> <span class="synPreProc">#define NOTE_FS2 </span><span class="synConstant">93</span> <span class="synPreProc">#define NOTE_G2 </span><span class="synConstant">98</span> <span class="synPreProc">#define NOTE_GS2 </span><span class="synConstant">104</span> <span class="synPreProc">#define NOTE_A2 </span><span class="synConstant">110</span> <span class="synPreProc">#define NOTE_AS2 </span><span class="synConstant">117</span> <span class="synPreProc">#define NOTE_B2 </span><span class="synConstant">123</span> <span class="synPreProc">#define NOTE_C3 </span><span class="synConstant">131</span> <span class="synPreProc">#define NOTE_CS3 </span><span class="synConstant">139</span> <span class="synPreProc">#define NOTE_D3 </span><span class="synConstant">147</span> <span class="synPreProc">#define NOTE_DS3 </span><span class="synConstant">156</span> <span class="synPreProc">#define NOTE_E3 </span><span class="synConstant">165</span> <span class="synPreProc">#define NOTE_F3 </span><span class="synConstant">175</span> <span class="synPreProc">#define NOTE_FS3 </span><span class="synConstant">185</span> <span class="synPreProc">#define NOTE_G3 </span><span class="synConstant">196</span> <span class="synPreProc">#define NOTE_GS3 </span><span class="synConstant">208</span> <span class="synPreProc">#define NOTE_A3 </span><span class="synConstant">220</span> <span class="synPreProc">#define NOTE_AS3 </span><span class="synConstant">233</span> <span class="synPreProc">#define NOTE_B3 </span><span class="synConstant">247</span> <span class="synPreProc">#define NOTE_C4 </span><span class="synConstant">262</span> <span class="synPreProc">#define NOTE_CS4 </span><span class="synConstant">277</span> <span class="synPreProc">#define NOTE_D4 </span><span class="synConstant">294</span> <span class="synPreProc">#define NOTE_DS4 </span><span class="synConstant">311</span> <span class="synPreProc">#define NOTE_E4 </span><span class="synConstant">330</span> <span class="synPreProc">#define NOTE_F4 </span><span class="synConstant">349</span> <span class="synPreProc">#define NOTE_FS4 </span><span class="synConstant">370</span> <span class="synPreProc">#define NOTE_G4 </span><span class="synConstant">392</span> <span class="synPreProc">#define NOTE_GS4 </span><span class="synConstant">415</span> <span class="synPreProc">#define NOTE_A4 </span><span class="synConstant">440</span> <span class="synPreProc">#define NOTE_AS4 </span><span class="synConstant">466</span> <span class="synPreProc">#define NOTE_B4 </span><span class="synConstant">494</span> <span class="synPreProc">#define NOTE_C5 </span><span class="synConstant">523</span> <span class="synPreProc">#define NOTE_CS5 </span><span class="synConstant">554</span> <span class="synPreProc">#define NOTE_D5 </span><span class="synConstant">587</span> <span class="synPreProc">#define NOTE_DS5 </span><span class="synConstant">622</span> <span class="synPreProc">#define NOTE_E5 </span><span class="synConstant">659</span> <span class="synPreProc">#define NOTE_F5 </span><span class="synConstant">698</span> <span class="synPreProc">#define NOTE_FS5 </span><span class="synConstant">740</span> <span class="synPreProc">#define NOTE_G5 </span><span class="synConstant">784</span> <span class="synPreProc">#define NOTE_GS5 </span><span class="synConstant">831</span> <span class="synPreProc">#define NOTE_A5 </span><span class="synConstant">880</span> <span class="synPreProc">#define NOTE_AS5 </span><span class="synConstant">932</span> <span class="synPreProc">#define NOTE_B5 </span><span class="synConstant">988</span> <span class="synPreProc">#define NOTE_C6 </span><span class="synConstant">1047</span> <span class="synPreProc">#define NOTE_CS6 </span><span class="synConstant">1109</span> <span class="synPreProc">#define NOTE_D6 </span><span class="synConstant">1175</span> <span class="synPreProc">#define NOTE_DS6 </span><span class="synConstant">1245</span> <span class="synPreProc">#define NOTE_E6 </span><span class="synConstant">1319</span> <span class="synPreProc">#define NOTE_F6 </span><span class="synConstant">1397</span> <span class="synPreProc">#define NOTE_FS6 </span><span class="synConstant">1480</span> <span class="synPreProc">#define NOTE_G6 </span><span class="synConstant">1568</span> <span class="synPreProc">#define NOTE_GS6 </span><span class="synConstant">1661</span> <span class="synPreProc">#define NOTE_A6 </span><span class="synConstant">1760</span> <span class="synPreProc">#define NOTE_AS6 </span><span class="synConstant">1865</span> <span class="synPreProc">#define NOTE_B6 </span><span class="synConstant">1976</span> <span class="synPreProc">#define NOTE_C7 </span><span class="synConstant">2093</span> <span class="synPreProc">#define NOTE_CS7 </span><span class="synConstant">2217</span> <span class="synPreProc">#define NOTE_D7 </span><span class="synConstant">2349</span> <span class="synPreProc">#define NOTE_DS7 </span><span class="synConstant">2489</span> <span class="synPreProc">#define NOTE_E7 </span><span class="synConstant">2637</span> <span class="synPreProc">#define NOTE_F7 </span><span class="synConstant">2794</span> <span class="synPreProc">#define NOTE_FS7 </span><span class="synConstant">2960</span> <span class="synPreProc">#define NOTE_G7 </span><span class="synConstant">3136</span> <span class="synPreProc">#define NOTE_GS7 </span><span class="synConstant">3322</span> <span class="synPreProc">#define NOTE_A7 </span><span class="synConstant">3520</span> <span class="synPreProc">#define NOTE_AS7 </span><span class="synConstant">3729</span> <span class="synPreProc">#define NOTE_B7 </span><span class="synConstant">3951</span> <span class="synPreProc">#define NOTE_C8 </span><span class="synConstant">4186</span> <span class="synPreProc">#define NOTE_CS8 </span><span class="synConstant">4435</span> <span class="synPreProc">#define NOTE_D8 </span><span class="synConstant">4699</span> <span class="synPreProc">#define NOTE_DS8 </span><span class="synConstant">4978</span> <span class="synType">int</span> tones[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6, NOTE_D6, NOTE_E6, NOTE_F6, NOTE_G6, NOTE_A6, NOTE_B6 }; <span class="synPreProc">#include </span><span class="synConstant">&quot;hardware/pwm.h&quot;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;U8g2lib.h&gt;</span> U8G2_SSD1306_128X64_NONAME_F_HW_I2C <span class="synIdentifier">u8g2</span>(U8G2_R0, <span class="synComment">/* reset=*/</span> U8X8_PIN_NONE); <span class="synPreProc">#define </span><span class="synIdentifier">PWM_AUDIO_L </span><span class="synPreProc">(</span><span class="synConstant">9</span><span class="synPreProc">)</span> <span class="synComment">//#define PWM_AUDIO_R (28)</span> <span class="synPreProc">#define </span><span class="synIdentifier">RANDOMBIT </span><span class="synPreProc">(*((uint *)(ROSC_BASE + ROSC_RANDOMBIT_OFFSET)) &amp; </span><span class="synConstant">1</span><span class="synPreProc">)</span> <span class="synPreProc">#define </span><span class="synIdentifier">PWM_RANGE_BITS </span><span class="synPreProc">(</span><span class="synConstant">10</span><span class="synPreProc">)</span> <span class="synPreProc">#define </span><span class="synIdentifier">PWM_RANGE </span><span class="synPreProc">(</span><span class="synConstant">1</span><span class="synPreProc">&lt;&lt;PWM_RANGE_BITS)</span> <span class="synPreProc">#define </span><span class="synIdentifier">NUM_PSG </span><span class="synPreProc">(</span><span class="synConstant">4</span><span class="synPreProc">)</span> <span class="synPreProc">#define </span><span class="synIdentifier">PSG_VOL_MAX </span><span class="synPreProc">(PWM_RANGE / NUM_PSG - </span><span class="synConstant">1</span><span class="synPreProc">)</span> <span class="synPreProc">#define </span><span class="synIdentifier">SAMPLE_RATE </span><span class="synPreProc">(</span><span class="synConstant">125000000</span><span class="synPreProc"> / PWM_RANGE)</span> <span class="synPreProc">#define </span><span class="synIdentifier">OMEGA_UNIT </span><span class="synPreProc">(FIXED_1_0 / SAMPLE_RATE)</span> <span class="synPreProc">#define </span><span class="synIdentifier">FIXED_0_5 </span><span class="synPreProc">(</span><span class="synConstant">0x40000000</span><span class="synPreProc">)</span> <span class="synPreProc">#define </span><span class="synIdentifier">FIXED_1_0 </span><span class="synPreProc">(</span><span class="synConstant">0x7fffffff</span><span class="synPreProc">)</span> <span class="synType">typedef</span> <span class="synType">uint32_t</span> fixed; <span class="synComment">// 1.0=0x7fffffff, 0.0=0x0</span> <span class="synType">enum</span> psg_type {OSC_SQUARE, OSC_SAW, OSC_TRI, OSC_NOISE}; <span class="synType">struct</span> psg_t { <span class="synType">volatile</span> fixed phi; <span class="synComment">// 0..FIXED_1_0</span> fixed step; <span class="synComment">// 0..FIXED_1_0</span> <span class="synType">volatile</span> <span class="synType">int</span> sound_vol; <span class="synComment">// 0..PSG_VOL_MAX</span> <span class="synType">enum</span> psg_type type; }; <span class="synType">static</span> <span class="synType">struct</span> psg_t psg[NUM_PSG]; <span class="synType">void</span> <span class="synIdentifier">psg_freq</span>(<span class="synType">int</span> i, <span class="synType">float</span> freq) { <span class="synIdentifier">assert</span>(i &lt; NUM_PSG); psg[i].step = freq * OMEGA_UNIT; } <span class="synType">void</span> <span class="synIdentifier">psg_vol</span>(<span class="synType">int</span> i, <span class="synType">int</span> value) { <span class="synIdentifier">assert</span>(i &lt; NUM_PSG); <span class="synStatement">if</span> (value &lt; <span class="synConstant">0</span>) { value = <span class="synConstant">0</span>; } psg[i].sound_vol = value % (PSG_VOL_MAX + <span class="synConstant">1</span>); } <span class="synType">void</span> <span class="synIdentifier">psg_type</span>(<span class="synType">int</span> i, <span class="synType">enum</span> psg_type type) { <span class="synIdentifier">assert</span>(i &lt; NUM_PSG); psg[i].type = type; } <span class="synType">static</span> <span class="synType">inline</span> uint <span class="synIdentifier">psg_value</span>(<span class="synType">int</span> i) { <span class="synIdentifier">assert</span>(i &lt; NUM_PSG); uint result; <span class="synStatement">if</span> (psg[i].type == OSC_SQUARE) { result = (psg[i].phi &gt; FIXED_0_5) ? psg[i].sound_vol : <span class="synConstant">0</span>; } <span class="synStatement">else</span> <span class="synStatement">if</span> (psg[i].type == OSC_SAW) { result = ((psg[i].phi &gt;&gt; (<span class="synConstant">31</span> - PWM_RANGE_BITS)) * psg[i].sound_vol) &gt;&gt; PWM_RANGE_BITS; } <span class="synStatement">else</span> <span class="synStatement">if</span> (psg[i].type == OSC_TRI) { result = ((psg[i].phi &gt;&gt; (<span class="synConstant">30</span> - PWM_RANGE_BITS)) * psg[i].sound_vol) &gt;&gt; PWM_RANGE_BITS; result = (result &lt; psg[i].sound_vol) ? result : psg[i].sound_vol * <span class="synConstant">2</span> - result; } <span class="synStatement">else</span> { <span class="synComment">// OSC_NOISE</span> result = RANDOMBIT * psg[i].sound_vol; } <span class="synStatement">return</span> result; } <span class="synType">static</span> <span class="synType">inline</span> <span class="synType">void</span> <span class="synIdentifier">psg_next</span>() { <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; NUM_PSG; i++) { psg[i].phi += psg[i].step; <span class="synStatement">if</span> (psg[i].phi &gt; FIXED_1_0) { psg[i].phi -= FIXED_1_0; } } } <span class="synType">void</span> <span class="synIdentifier">on_pwm_wrap</span>() { uint sum = <span class="synConstant">0</span>; <span class="synIdentifier">pwm_clear_irq</span>(<span class="synIdentifier">pwm_gpio_to_slice_num</span>(PWM_AUDIO_L)); <span class="synPreProc">#ifdef PWM_AUDIO_R</span> <span class="synIdentifier">pwm_clear_irq</span>(<span class="synIdentifier">pwm_gpio_to_slice_num</span>(PWM_AUDIO_R)); <span class="synPreProc">#endif</span> <span class="synIdentifier">psg_next</span>(); <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; NUM_PSG; i++) { sum += <span class="synIdentifier">psg_value</span>(i); } <span class="synIdentifier">pwm_set_gpio_level</span>(PWM_AUDIO_L, sum); <span class="synPreProc">#ifdef PWM_AUDIO_R</span> <span class="synIdentifier">pwm_set_gpio_level</span>(PWM_AUDIO_R, sum); <span class="synPreProc">#endif</span> } <span class="synType">void</span> <span class="synIdentifier">psg_pwm_config</span>() { <span class="synIdentifier">gpio_set_function</span>(PWM_AUDIO_L, GPIO_FUNC_PWM); <span class="synPreProc">#ifdef PWM_AUDIO_R</span> <span class="synIdentifier">gpio_set_function</span>(PWM_AUDIO_R, GPIO_FUNC_PWM); <span class="synPreProc">#endif</span> uint slice_num = <span class="synIdentifier">pwm_gpio_to_slice_num</span>(PWM_AUDIO_L); <span class="synIdentifier">pwm_clear_irq</span>(slice_num); <span class="synIdentifier">pwm_set_irq_enabled</span>(slice_num, <span class="synConstant">true</span>); <span class="synIdentifier">irq_set_exclusive_handler</span>(PWM_IRQ_WRAP, on_pwm_wrap); <span class="synIdentifier">irq_set_enabled</span>(PWM_IRQ_WRAP, <span class="synConstant">true</span>); pwm_config config = <span class="synIdentifier">pwm_get_default_config</span>(); <span class="synIdentifier">pwm_config_set_clkdiv_int</span>(&amp;config, <span class="synConstant">1</span>); <span class="synIdentifier">pwm_config_set_wrap</span>(&amp;config, PWM_RANGE); <span class="synIdentifier">pwm_init</span>(slice_num, &amp;config, <span class="synConstant">true</span>); <span class="synPreProc">#ifdef PWM_AUDIO_R</span> slice_num = <span class="synIdentifier">pwm_gpio_to_slice_num</span>(PWM_AUDIO_R); <span class="synIdentifier">pwm_init</span>(slice_num, &amp;config, <span class="synConstant">true</span>); <span class="synPreProc">#endif</span> } <span class="synType">void</span> <span class="synIdentifier">psg_init</span>() { <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; NUM_PSG; i++) { psg[i].phi = <span class="synConstant">0</span>; psg[i].step = <span class="synConstant">0</span>; psg[i].sound_vol = PSG_VOL_MAX / <span class="synConstant">4</span>; psg[i].type = OSC_SQUARE; } <span class="synIdentifier">psg_pwm_config</span>(); } <span class="synType">void</span> <span class="synIdentifier">psg_all_vol</span>(<span class="synType">int</span> value) { <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span> ; i &lt; NUM_PSG; i++) { <span class="synIdentifier">psg_vol</span>(i, value); } } <span class="synType">int</span> channel = <span class="synConstant">0</span>; <span class="synType">int</span> cursorX = <span class="synConstant">0</span>; <span class="synType">int</span> cursorY = <span class="synConstant">0</span>; <span class="synType">int</span> pos = <span class="synConstant">0</span>; <span class="synPreProc">#define SIZE </span><span class="synConstant">16</span> <span class="synType">bool</span> scoreData[SIZE][<span class="synConstant">32</span>]; <span class="synType">int</span> trigger[<span class="synConstant">6</span>]; <span class="synType">void</span> <span class="synIdentifier">setup</span>() { <span class="synIdentifier">psg_init</span>(); <span class="synIdentifier">psg_type</span>(<span class="synConstant">0</span>, OSC_SQUARE); <span class="synIdentifier">psg_type</span>(<span class="synConstant">1</span>, OSC_SQUARE); <span class="synIdentifier">psg_all_vol</span>(<span class="synConstant">0</span>); <span class="synIdentifier">psg_vol</span>(channel, PSG_VOL_MAX / <span class="synConstant">4</span>); <span class="synIdentifier">psg_vol</span>(<span class="synConstant">1</span>, PSG_VOL_MAX / <span class="synConstant">4</span>); <span class="synIdentifier">psg_freq</span>(channel, <span class="synConstant">220</span>); <span class="synIdentifier">psg_freq</span>(<span class="synConstant">1</span>, <span class="synConstant">220</span>); <span class="synIdentifier">pinMode</span>(<span class="synConstant">14</span>, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(<span class="synConstant">15</span>, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(<span class="synConstant">16</span>, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(<span class="synConstant">17</span>, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(<span class="synConstant">18</span>, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(<span class="synConstant">19</span>, INPUT_PULLUP); u8g2.<span class="synIdentifier">begin</span>(); u8g2.<span class="synIdentifier">setFont</span>(u8g2_font_ncenB08_tr); <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; <span class="synConstant">128</span>/SIZE; i ++){ <span class="synStatement">for</span>(<span class="synType">int</span> j = <span class="synConstant">0</span>; j &lt; <span class="synConstant">32</span>; j ++){ scoreData[i][j] = <span class="synConstant">false</span>; } } <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; <span class="synConstant">6</span>; i ++){ trigger[i] = <span class="synConstant">0</span>; } } <span class="synType">void</span> <span class="synIdentifier">draw</span>(){ u8g2.<span class="synIdentifier">drawLine</span>(pos*<span class="synConstant">128</span>/SIZE, <span class="synConstant">0</span>, pos*<span class="synConstant">128</span>/SIZE, <span class="synConstant">63</span>); <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; SIZE; i ++){ <span class="synStatement">for</span>(<span class="synType">int</span> j = <span class="synConstant">0</span>; j &lt; <span class="synConstant">32</span>; j ++){ <span class="synStatement">if</span>(scoreData[i][j]){ u8g2.<span class="synIdentifier">drawBox</span>(i*<span class="synConstant">128</span>/SIZE, j*<span class="synConstant">2</span>, <span class="synConstant">128</span>/SIZE, <span class="synConstant">2</span>); } } } u8g2.<span class="synIdentifier">drawBox</span>(cursorX * <span class="synConstant">128</span>/SIZE, cursorY*<span class="synConstant">2</span>, <span class="synConstant">128</span>/SIZE, <span class="synConstant">2</span>); } <span class="synType">int</span> count = <span class="synConstant">0</span>; <span class="synType">void</span> <span class="synIdentifier">loop</span>() { count ++; <span class="synStatement">if</span>(count &gt; <span class="synConstant">3</span>){ count = <span class="synConstant">0</span>; pos ++; <span class="synStatement">if</span>(pos &gt; SIZE - <span class="synConstant">1</span>){pos = <span class="synConstant">0</span>;} <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; NUM_PSG; i ++){ <span class="synIdentifier">psg_freq</span>(i, <span class="synConstant">0</span>); <span class="synIdentifier">psg_vol</span>(i, <span class="synConstant">0</span>); } <span class="synType">int</span> freeChan = <span class="synConstant">0</span>; <span class="synStatement">for</span>(<span class="synType">int</span> j = <span class="synConstant">0</span>; j &lt; <span class="synConstant">32</span>; j ++){ <span class="synStatement">if</span>(scoreData[pos][j]){ <span class="synIdentifier">psg_vol</span>(freeChan, PSG_VOL_MAX); <span class="synIdentifier">psg_freq</span>(freeChan, tones[j]); freeChan ++; <span class="synStatement">if</span>(freeChan &gt;= NUM_PSG){ freeChan = <span class="synConstant">0</span>; } } } } <span class="synStatement">if</span>(!<span class="synIdentifier">digitalRead</span>(<span class="synConstant">16</span>)){trigger[<span class="synConstant">0</span>] ++;}<span class="synStatement">else</span>{trigger[<span class="synConstant">0</span>] = -<span class="synConstant">1</span>;} <span class="synStatement">if</span>(!<span class="synIdentifier">digitalRead</span>(<span class="synConstant">17</span>)){trigger[<span class="synConstant">1</span>] ++;}<span class="synStatement">else</span>{trigger[<span class="synConstant">1</span>] = -<span class="synConstant">1</span>;} <span class="synStatement">if</span>(!<span class="synIdentifier">digitalRead</span>(<span class="synConstant">18</span>)){trigger[<span class="synConstant">2</span>] ++;}<span class="synStatement">else</span>{trigger[<span class="synConstant">2</span>] = -<span class="synConstant">1</span>;} <span class="synStatement">if</span>(!<span class="synIdentifier">digitalRead</span>(<span class="synConstant">19</span>)){trigger[<span class="synConstant">3</span>] ++;}<span class="synStatement">else</span>{trigger[<span class="synConstant">3</span>] = -<span class="synConstant">1</span>;} <span class="synStatement">if</span>(!<span class="synIdentifier">digitalRead</span>(<span class="synConstant">15</span>)){trigger[<span class="synConstant">4</span>] ++;}<span class="synStatement">else</span>{trigger[<span class="synConstant">4</span>] = -<span class="synConstant">1</span>;} <span class="synStatement">if</span>(!<span class="synIdentifier">digitalRead</span>(<span class="synConstant">14</span>)){trigger[<span class="synConstant">5</span>] ++;}<span class="synStatement">else</span>{trigger[<span class="synConstant">5</span>] = -<span class="synConstant">1</span>;} <span class="synStatement">if</span>(trigger[<span class="synConstant">0</span>] == <span class="synConstant">3</span>){cursorX ++;} <span class="synStatement">if</span>(trigger[<span class="synConstant">1</span>] == <span class="synConstant">3</span>){cursorY ++;} <span class="synStatement">if</span>(trigger[<span class="synConstant">2</span>] == <span class="synConstant">3</span>){cursorX --;} <span class="synStatement">if</span>(trigger[<span class="synConstant">3</span>] == <span class="synConstant">3</span>){cursorY --;} <span class="synStatement">if</span>(trigger[<span class="synConstant">4</span>] == <span class="synConstant">3</span>){scoreData[cursorX][cursorY] = <span class="synConstant">true</span>;} <span class="synStatement">if</span>(trigger[<span class="synConstant">5</span>] == <span class="synConstant">3</span>){scoreData[cursorX][cursorY] = <span class="synConstant">false</span>;} <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; <span class="synConstant">6</span>; i ++){ <span class="synStatement">if</span>(trigger[i] == -<span class="synConstant">1</span>)trigger[i] = <span class="synConstant">0</span>; } <span class="synStatement">if</span>(cursorX &lt; <span class="synConstant">0</span>)cursorX = <span class="synConstant">0</span>; <span class="synStatement">if</span>(cursorY &lt; <span class="synConstant">0</span>)cursorY = <span class="synConstant">0</span>; <span class="synStatement">if</span>(cursorX &gt; SIZE - <span class="synConstant">1</span>)cursorX = SIZE - <span class="synConstant">1</span>; <span class="synStatement">if</span>(cursorY &gt; <span class="synConstant">64</span>/<span class="synConstant">2</span> - <span class="synConstant">1</span>)cursorY = <span class="synConstant">64</span>/<span class="synConstant">2</span> - <span class="synConstant">1</span>; <span class="synIdentifier">sleep_ms</span>(<span class="synConstant">3</span>); u8g2.<span class="synIdentifier">clearBuffer</span>(); <span class="synIdentifier">draw</span>(); u8g2.<span class="synIdentifier">sendBuffer</span>(); } </pre> <h1 id="参考にしたもの">参考にしたもの</h1> <p>以下のRP2040を使ったゲーム機の回路を参考にしており、SPIのOLEDを搭載した場合は、同じように動作するように設計しました(試していないですが・・)</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fsolderparty%2Frp2040_stamp_console_hw%2F" title="GitHub - solderparty/rp2040_stamp_console_hw" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/solderparty/rp2040_stamp_console_hw/">github.com</a></cite></p> <p>和音を使った演奏については以下の記事を参考にしました</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fblog.boochow.com%2Farticle%2Fpico-pwm-sound.html" title="Raspberry Pi Picoでピコピコサウンドを出してみる" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://blog.boochow.com/article/pico-pwm-sound.html">blog.boochow.com</a></cite></p> <h1 id="まとめ">まとめ</h1> <p>この手のゲーム機といえば、Arduboy( <a href="https://www.arduboy.com/">https://www.arduboy.com/</a> )が有名で、自分も本物を持っていますし、互換機を作ったこともあります、それに比べるとこの<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoを使ったゲーム機は、性能がケタ違いに高いものとなっており、様々なゲームを動かすポテンシャルがあります。</p> <p>また、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>不足の影響もあり、おそらく<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoを使ったこのゲーム機の方が安上がりで作れそうです。</p> <p>まぁ、Arduboyほどのスタイリッシュなデザインにするのは、かなり大変で、Arduboyの価値はそちらの方にあると思うのですが、自作ゲーム機界隈も日進月歩だなと感じています。</p> <p>最後に、この基板が数枚余っていますので、もしほしい人がいたら連絡ください。 (可能なら、ボツ基板交換的なノリで、何か自作の面白い基板と交換してもらえると嬉しいです。 私が提供できるボツ基板は<a href="https://scrapbox.io/inajob/%E3%83%9C%E3%83%84%E5%9F%BA%E6%9D%BF">こちらにまとめています。</a>)</p> inajob Arduino Nanoを単4電池で動かすボードを作った hatenablog://entry/4207575160649069258 2023-05-16T19:28:52+09:00 2024-03-06T12:37:30+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 どういうもの? Arduino NanoはArduino UNOと同じATMega328を搭載した、小型の開発ボードです。 小型ゆえ… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515142607.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="どういうもの">どういうもの?</h1> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoは<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOと同じATMega328を搭載した、小型の開発ボードです。 小型ゆえそのまま製品に組み込みやすく、例えば私の作っている電子楽器のRakuChordでも、このボードをそのまま組み込んでいます。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoの電源はUSBコネクタを経由して供給するのが普通ですが、携帯できるガジェットを作る場合は電池で動かせると便利です。</p> <p>電池で動かす場合は、USBと同じ5Vを作る必要があるので、例えば単四電池を4本の電池で6Vを作り、レギュレータで降圧するような構成が必要です。</p> <p>しかし、携帯できるガジェットとなると大きさの制約などもあり単四電池4本だとかさばってしまうこともあり、もう少しコンパクトな電源が利用できると便利です。</p> <p>ということで、単4電池1本1.5Vを昇圧して5Vを作り出すような開発ボードが欲しくなりました。</p> <h1 id="機能紹介">機能紹介</h1> <ul> <li>単4電池x1ホルダー</li> <li>I2C接続のOLED</li> <li><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nano</li> <li>電源用スライドスイッチ</li> <li>5V昇圧</li> </ul> <p>細かくそれぞれの機能について紹介します。</p> <h1 id="単4電池x1ホルダー">単4電池x1ホルダー</h1> <p>単4電池を1つ固定するための電池ホルダーを利用します。 単4電池2本にするか、1本にするかは動作時間に影響するので、迷ったのですが、今回は省スペースを意識して1本にしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515133341.png" width="836" height="618" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この電池ホルダーは、AliExpressで出回っているものですが、ほかの種類のものはあまり見当たりません。 安いのは良いのですが、以下のような問題点もあるので注意です</p> <ul> <li>電池を取り外すのが大変 <ul> <li>電池を取り出さないようにするためのガードがきつすぎて、逆に外すのが大変</li> </ul> </li> <li>ピンが太すぎて、ニッパーで切るのが大変</li> </ul> <p>以上の問題はありますが、比較的安価($0.3くらい)で基板に直接固定できるため、コンパクトな開発ボードを作るのにはかなり適した部品であると思い、今回はこれを使いました。</p> <h1 id="I2C接続のOLED">I2C接続のOLED</h1> <p>開発ボードには何かしらの表示機がついていると便利だと思い定番の128x64のOLEDを搭載することにしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515135206.png" width="633" height="377" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> (手元には2種類のOLEDボードがありました、ピン配置、コントローラICは同じですが、若干ボードのサイズが違います)</p> <p>I2C接続のもの、SPI接続の物、I2C接続の中でもピンの並びが違うもの、などいろいろなバリエーションがあるので注意が必要ですが、今回はI2C接続でピンがGND, VCC, SCL, SDAの並びのものを選びました。</p> <h1 id="Arduino-Nano"><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nano</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515135045.png" width="468" height="280" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOと同じATMega328を搭載した開発ボードです。家にあったのはこれの互換品で、USB端子がMicro-Aのものです。 純正のものと機能は変わらず、ボードの大きさやピンの配列も同じです。</p> <h1 id="電源用スライドスイッチ">電源用スライドスイッチ</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515133528.png" width="372" height="278" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>これも我が家の定番部品。基板の端に取り付ける基板表面に対して垂直な向きのスライドスイッチです。</p> <h1 id="5V昇圧">5V昇圧</h1> <p>5V昇圧については2種類の回路を用意しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515133620.png" width="248" height="236" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>1つは5V昇圧用の3ピンのモジュールを取り付ける方法、もう一つはHT7750という昇圧用のICとその周辺部品を取り付ける方法です。</p> <p>今まで5Vに昇圧するときはHT7750というICを使っていたのですが、AliExpressで3ピンの5V昇圧用モジュールをみつけ、便利そうだと思ったので、今回はどちらか1つを実装できるように基板を設計しました。</p> <p>これで、仮に3ピンの5V昇圧モジュールに問題があった場合は、実績のあるHT7750を使うこともできます。このように基板上に複数の同じ役割のパターンを作るのは「こんなこともあろうかと」という感じで、有用なのですが、あまりやりすぎると複雑になりすぎて、設計を間違えてしまい、結果としてどちらも動かない役立たずの基板になったりすることもあるので注意が必要です。</p> <h1 id="デザイン発注">デザイン、発注</h1> <p>今回の基板は、なるべくコンパクトにしたかったので、部品の配置に気を遣いました。 また、開発ボードということで、自由に部品を配置できるようなユニバーサル基板的なゾーンも用意しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515140617.png" width="535" height="590" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoのピンはすべて引き出して、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoの機能はそのまま利用できるようにしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515141300.png" width="839" height="596" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>また、ADCポートでバッテリーの残量も確認できるようにしました。</p> <p>大きさは名刺サイズ程度にし、JLCPCBの最安料金で発注できるようにしました。 (1注文当たり5枚の基板が1つだけ割引になるため、1注文なら5枚で$2+送料)</p> <h1 id="組み立てと今回の設計ミス">組み立てと今回の設計ミス</h1> <p>ICを直接マウントしていないため、このボードの組み立ては比較的簡単です。 電池ケース、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nano、5V昇圧モジュール、スライドスイッチ、OLEDをはんだするだけです。</p> <p>なのですが、、</p> <p>今回も設計をミスってしまいました・・、とても初歩的な間違いで恥ずかしいのですが、まぁこれも誰かの役に立つかもしれないので、紹介します。</p> <h2 id="Arduino-Nanoから引き出したピンの順番がおかしい"><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoから引き出したピンの順番がおかしい</h2> <p>今回の動作テストではあまり関係なかったですが、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoのピンをそのまま引き出したつもりが、一部のピンの配置が入れ替わっており、紛らわしい仕様となっていました。 まぁ、これはこれらのピンを利用する際に気を付ければ問題は起きないのですが、不可解な仕様となってしまいました。</p> <h2 id="Arduino-NanoのGNDが未結線"><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> NanoのGNDが未結線</h2> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> NanoのGNDの端子をバッテリーのGNDの端子がつながっていませんでした。そのため、組み立てて電源を入れても<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoが起動しない問題が発生しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515134018.png" width="449" height="611" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>これは単純に回路図上の<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> NanoのGNDのピンが未結線だったためで、デザインルールチェックを実行するとエラーが出るのですが、未結線のまま発注してしまいました。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%A2%A5%E9%A5%A6%A5%F3%A5%C9">ワークアラウンド</a>として、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> NanoのGNDのピンと近くのGNDが来ているパッドを導線ではんだ付けしました。</p> <h2 id="5V昇圧モジュールのVINが未結線">5V昇圧モジュールのVINが未結線</h2> <p>こちらも凡ミスです。電源のラインに「BAT」というラベルを付けていたのですが、「BAT+」という表記と混ざってしまい、意図した結線が行われていませんでした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515134236.png" width="788" height="530" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>こちらも<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%AF%A5%A2%A5%E9%A5%A6%A5%F3%A5%C9">ワークアラウンド</a>として電源の来ているピンと5V昇圧モジュールのVINを導線ではんだ付けしました。<span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515142425.png" width="565" height="580" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="動作確認">動作確認</h1> <p>OLEDのライブラリであるu8g2ライブラリのデモプログラムを書き込んで動作を確認しました。 電池駆動でOLEDを制御できることを確認しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230515/20230515140430.jpg" width="449" height="543" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="まとめと感想">まとめと感想</h1> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoを単四電池1本で動作させるためのOLED付きの開発ボードを設計しました。 <a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を使ったモバイルゲーム機や、電子楽器などのプロトタイピングに役立ちそうだと感じました。</p> <p>また5V昇圧モジュールも初めて使い、問題なく1.5Vを5Vに昇圧できることを確認しました。</p> <p>開発ボードを設計してみて、開発ボードに乗せる機能の選別について、かなりのデザインセンスが必要だということを感じました。あれもこれも機能を乗せたいという気持ちもありつつ、色々乗せれば乗せるほど基板が大きくなったり、部品点数が増えてしまったりと<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A1%BC%A5%C9%A5%AA%A5%D5">トレードオフ</a>があります。</p> <p>また、開発ボードの設計は1つの世界を作るような楽しさがあり、うまくコンセプトにあったボードを設計できると何とも言えない達成感がありました。</p> <p>皆さんも、自分の考える最強の開発ボード、作ってみませんか?</p> inajob 小型のフルカラーLED「WS2812C-2020」テスト基板を作った hatenablog://entry/4207112889980945250 2023-04-17T19:15:00+09:00 2024-03-06T12:37:39+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 WS2812とは? WS2812はシリアル接続のフルカラーLEDとしてはデファクトスタンダードとなった部品ですが、よく見られるものは… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230416/20230416150301.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="WS2812とは">WS2812とは?</h1> <p>WS2812はシリアル接続のフルカラーLEDとしては<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%D5%A5%A1%A5%AF%A5%C8%A5%B9%A5%BF%A5%F3%A5%C0%A1%BC%A5%C9">デファクトスタンダード</a>となった部品ですが、よく見られるものは5mm角のものが一般的ですが、2mm角の「WS2812C-2020」というものがあることを発見しました。</p> <p>自分はAliExpressで購入しましたが、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%BD%A9%B7%EE%C5%C5%BB%D2">秋月電子</a>で購入することもできます。 <a href="https://akizukidenshi.com/catalog/g/gI-15068/">&#x30DE;&#x30A4;&#x30B3;&#x30F3;&#x5185;&#x8535;RGBLED WS2812C-2020: &#x30AA;&#x30D7;&#x30C8;&#x30A8;&#x30EC;&#x30AF;&#x30C8;&#x30ED;&#x30CB;&#x30AF;&#x30B9; &#x79CB;&#x6708;&#x96FB;&#x5B50;&#x901A;&#x5546;-&#x96FB;&#x5B50;&#x90E8;&#x54C1;&#x30FB;&#x30CD;&#x30C3;&#x30C8;&#x901A;&#x8CA9;</a></p> <p>2mm角ということで、非常にコンパクトで手のひらサイズのガジェットに搭載するのにぴったりです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230416/20230416144330.png" width="273" height="224" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="テスト基板の設計">テスト基板の設計</h1> <p>今回はテスト基板ということで、非常にシンプルな設計にします。</p> <p>「WS2812C-2020」を8個並べただけの細長い基板です。注意点としては「WS2812C-2020」は部品1つ毎に100nFの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>を並べる必要があるということです。(データシートのTypical Application Circuitに記載があります)</p> <p>まぁよく見かける5mm角のWS2812Bなどでも、たくさん並べる際には<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>を挟んだ方が良い気がします。(いわゆるおまじない<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>というやつ)</p> <p>折角フルカラーLEDを小型のものを使っているので、この<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>は、今回から0603(1608M)サイズにしました。(今までは1206(3216M)サイズを使っていました)</p> <p>基板の両端にVCC, GND, DINとVCC, GND, DOUTのピンを配置し、この基板を数珠繋ぎに接続できるようにしました。</p> <p>長辺は85mm程度なので、JLCPCBの安く製造できる100m角に収めました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230413/20230413232358.png" width="623" height="517" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="基板の発注">基板の発注</h1> <p>JLCPCBに発注します。10枚で$5 + 送料でした。 色によって値段は変わらないので、白色の基板にしてみました。(緑に比べると製造が遅くなるようです)</p> <p>合わせて0603(1608M)サイズの100nFの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>もAliExpressに注文しました。</p> <h1 id="設計ミス発覚">設計ミス、発覚</h1> <p>単純な基板だったのですが、数珠繋ぎ用の配線を間違えてしまい、VCC, GND, DOUTのところがVCC, VCC, DOUTとなってしまいました・・ まぁ数珠つなぎにしなければ問題ないし、数珠繋ぎする場合もGND配線を引き回せばこの問題は回避できます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230413/20230413232134.png" width="702" height="536" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="部品の実装">部品の実装</h1> <p>2mm角のWS2812C-2020は、はんだ付けが難しいかなと思い、はんだペーストとホットエアーガンを使い実装しました。 が、小さいですが4ピンのWS2812C-2020は、4隅をはんだ付けするだけなので同じピッチの6ピンのICなどと比べるとはんだ付けは比較的簡単に感じました。</p> <p>0603(1608M)サイズの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>も実装できるか心配でしたが、ピンセットを使いつつはんだ付けすれば特に問題なく実装できました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230416/20230416144818.png" width="274" height="252" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B000TGFODS?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/31mbQsWqShL._SL500_.jpg" class="hatena-asin-detail-image" alt="ホーザン(HOZAN) 先曲がりピンセット カーブタイプ 材質ステンレス 全長115mm 重量18g 開き幅7mm P-882" title="ホーザン(HOZAN) 先曲がりピンセット カーブタイプ 材質ステンレス 全長115mm 重量18g 開き幅7mm P-882"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B000TGFODS?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">ホーザン(HOZAN) 先曲がりピンセット カーブタイプ 材質ステンレス 全長115mm 重量18g 開き幅7mm P-882</a></p><ul class="hatena-asin-detail-meta"><li>ホーザン(HOZAN)</li></ul><a href="https://www.amazon.co.jp/dp/B000TGFODS?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="制御">制御</h1> <p>WS2812は<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%D5%A5%A1%A5%AF%A5%C8%A5%B9%A5%BF%A5%F3%A5%C0%A1%BC%A5%C9">デファクトスタンダード</a>なフルカラーLEDなので、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>向けのライブラリは充実しています。 今回はその中でも間違いなさそうなAdafruitのものを利用しました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fadafruit%2FAdafruit_NeoPixel" title="GitHub - adafruit/Adafruit_NeoPixel: Arduino library for controlling single-wire LED pixels (NeoPixel, WS2812, etc.)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/adafruit/Adafruit_NeoPixel">github.com</a></cite></p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;Adafruit_NeoPixel.h&gt;</span> <span class="synPreProc">#define PIN </span><span class="synConstant">2</span> <span class="synPreProc">#define NUMPIXELS </span><span class="synConstant">8</span> Adafruit_NeoPixel <span class="synIdentifier">pixels</span>(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); <span class="synType">void</span> <span class="synIdentifier">setup</span>() { pixels.<span class="synIdentifier">begin</span>(); pixels.<span class="synIdentifier">setBrightness</span>(<span class="synConstant">16</span>); } <span class="synType">int</span> count = <span class="synConstant">0</span>; <span class="synType">int</span> number = <span class="synConstant">0</span>; <span class="synType">void</span> <span class="synIdentifier">loop</span>() { pixels.<span class="synIdentifier">clear</span>(); <span class="synStatement">for</span>(byte i = <span class="synConstant">0</span>; i &lt; <span class="synConstant">8</span>; i ++){ pixels.<span class="synIdentifier">setPixelColor</span>(i, pixels.<span class="synIdentifier">Color</span>(((<span class="synConstant">8</span>-i)*<span class="synConstant">30</span> + count+<span class="synConstant">128</span>)%<span class="synConstant">256</span>, ((<span class="synConstant">8</span>-i)*<span class="synConstant">30</span> + count)%<span class="synConstant">256</span>, (i*<span class="synConstant">30</span> + count)%<span class="synConstant">256</span>)); } pixels.<span class="synIdentifier">show</span>(); <span class="synIdentifier">delay</span>(<span class="synConstant">1</span>); count ++; } </pre> <p>ちなみに100nFの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>は無くても問題なく動作しました。まぁもっと光らせて電源が不安定になった場合などにはあったほうが良い気がします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230416/20230416143417.jpg" width="710" height="290" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">2mm角のシリアル制御LEDの実験中<a href="https://twitter.com/hashtag/JLCPCB?src=hash&amp;ref_src=twsrc%5Etfw">#JLCPCB</a> <a href="https://t.co/dSDGgDOw3L">pic.twitter.com/dSDGgDOw3L</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1647477613945065473?ref_src=twsrc%5Etfw">2023年4月16日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="まとめ">まとめ</h1> <p>単純なテスト基板でしたが「WS2812C-2020」の動作を確認できました。</p> <p>制御も簡単、2mm角で小回りの利くフルカラーLEDは、手のひらサイズのガジェットなどに搭載するのはぴったりだと感じました。</p> inajob ESP32の静電容量タッチでフリック入力を実現してみた hatenablog://entry/4207112889972778160 2023-03-23T08:56:47+09:00 2024-03-06T12:37:48+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 ESP32の静電容量タッチ機能とフリック入力への応用 ESP32には静電容量タッチ機能が搭載されており、ESP-WROOM-32には… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319134148.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="ESP32の静電容量タッチ機能とフリック入力への応用">ESP32の静電容量タッチ機能と<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>への応用</h1> <p>ESP32には静電容量タッチ機能が搭載されており、ESP-WROOM-32には10個のピンを静電容量タッチセンサーとして利用できます。</p> <p>よくある作例としては、10個のパッドを搭載し、静電容量タッチでテンキーなどを作っているものがあります。</p> <p>ピンが10個しかないので、10個のパッドしか用意できない、というのは、ある意味その通りなのですが、もっとたくさんの入力を得るための工夫の余地はいろいろあります。</p> <p>今回はこれらの静電容量タッチセンサーの2つのピンの組み合わせを1つのスイッチのように扱うことで5×5=25個のスイッチとして扱うような基板をデザインしてみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319124206.png" width="958" height="723" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="静電容量タッチ周りの設計">静電容量タッチ周りの設計</h1> <p>静電容量タッチの基板を作る際は、通常の回路の設計よりも気にすべきことが多いです。 ぱっとわかりやすいところとしては、タッチ検知に関する配線を変に迂回させたり、高周波の信号線と平行に並べない、などという制限があったりします。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2FESP32DE%2Fesp-iot-solution-1%2Fblob%2Fmaster%2Fdocuments%2Ftouch_pad_solution%2Ftouch_sensor_design_en.md" title="esp-iot-solution-1/documents/touch_pad_solution/touch_sensor_design_en.md at master · ESP32DE/esp-iot-solution-1" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/ESP32DE/esp-iot-solution-1/blob/master/documents/touch_pad_solution/touch_sensor_design_en.md">github.com</a></cite></p> <p>まぁ、すべてのルールを守って設計するのは、なかなか大変なので、今回はそこまで厳密にルールに従わず、静電容量タッチまわりの配線をなるべく迂回させずに配置する、程度にしています。</p> <h1 id="基板全体の設計">基板全体の設計</h1> <p>静電容量タッチ以外の部分については、なるべくシンプルになるように余計な機能をつけず、既存のモジュールを並べるだけの構成にしました。</p> <ul> <li>ESP32-DevKitC用ピンヘッダ <ul> <li>定番の開発ボード</li> </ul> </li> <li>128x64のI2C接続のOLEDモジュール用ピンヘッダ</li> <li>128x128のSPI接続の<a class="keyword" href="https://d.hatena.ne.jp/keyword/TFT">TFT</a>液晶モジュール用ピンヘッダ <ul> <li>上記のOLEDとどちらかを利用できる</li> </ul> </li> <li>SDカードモジュール用ピンヘッダ</li> <li>スピーカー接続用ピンヘッダ</li> <li>外部静電容量タッチセンサー用ピンヘッダ</li> </ul> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319130502.png" width="599" height="482" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Amazon">Amazon</a>のリンクだと以下のような部品を想定しています。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B087TP5471?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41Fjwy1fmWL._SL500_.jpg" class="hatena-asin-detail-image" alt="ESP32-DevKitC-32E 開発ボード" title="ESP32-DevKitC-32E 開発ボード"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B087TP5471?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">ESP32-DevKitC-32E 開発ボード</a></p><ul class="hatena-asin-detail-meta"><li>Espressif</li></ul><a href="https://www.amazon.co.jp/dp/B087TP5471?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B081ZQ5Z97?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41AiIEIoASL._SL500_.jpg" class="hatena-asin-detail-image" alt="VKLSVAN 2個 0.96&quot; iic i2c ホワイトOLEDモジュール128×64 OLED LCDディスプレイArduinoに対応" title="VKLSVAN 2個 0.96&quot; iic i2c ホワイトOLEDモジュール128×64 OLED LCDディスプレイArduinoに対応"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B081ZQ5Z97?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">VKLSVAN 2個 0.96&quot; iic i2c ホワイトOLEDモジュール128×64 OLED LCDディスプレイArduinoに対応</a></p><ul class="hatena-asin-detail-meta"><li>VKLSVAN</li></ul><a href="https://www.amazon.co.jp/dp/B081ZQ5Z97?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0972VMH3J?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41dowRuVrqL._SL500_.jpg" class="hatena-asin-detail-image" alt="LCDディスプレイパネルモジュール、カラーTFTパネルモジュール1.44インチ128X128カラーLCDTFTディスプレイモジュール5110/3310用PCBボード付きLCDシリアルポートモジュール" title="LCDディスプレイパネルモジュール、カラーTFTパネルモジュール1.44インチ128X128カラーLCDTFTディスプレイモジュール5110/3310用PCBボード付きLCDシリアルポートモジュール"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0972VMH3J?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">LCDディスプレイパネルモジュール、カラーTFTパネルモジュール1.44インチ128X128カラーLCDTFTディスプレイモジュール5110/3310用PCBボード付きLCDシリアルポートモジュール</a></p><ul class="hatena-asin-detail-meta"><li>KAKAKE</li></ul><a href="https://www.amazon.co.jp/dp/B0972VMH3J?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B07MB9TS13?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51KO2P7V13L._SL500_.jpg" class="hatena-asin-detail-image" alt="Aideepen 5個セットマイクロSDストレージ拡張ボードマイクロSDカードメモリシールドモジュール ARM AVR用ピン付き" title="Aideepen 5個セットマイクロSDストレージ拡張ボードマイクロSDカードメモリシールドモジュール ARM AVR用ピン付き"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B07MB9TS13?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Aideepen 5個セットマイクロSDストレージ拡張ボードマイクロSDカードメモリシールドモジュール ARM AVR用ピン付き</a></p><ul class="hatena-asin-detail-meta"><li>Aideepen</li></ul><a href="https://www.amazon.co.jp/dp/B07MB9TS13?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B088QJ8VWC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51Vh+4DBHnL._SL500_.jpg" class="hatena-asin-detail-image" alt="Milageto MPR121ブレークアウト容量性タッチセンシティブモジュールキーボード" title="Milageto MPR121ブレークアウト容量性タッチセンシティブモジュールキーボード"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B088QJ8VWC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Milageto MPR121ブレークアウト容量性タッチセンシティブモジュールキーボード</a></p><ul class="hatena-asin-detail-meta"><li>Milageto</li></ul><a href="https://www.amazon.co.jp/dp/B088QJ8VWC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="静電容量タッチのフットプリントのデザイン">静電容量タッチのフットプリントのデザイン</h1> <p>静電容量タッチのフットプリントのデザインは、以前の300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>のスイッチ部分と同じような方式で用意しました。</p> <p>KiCADの自動生成ツールの「Mutualcap Touch Button」というツールを使います。 このツールで作成するフットプリントはソルダーレジストがついた状態のものですが、今回はタッチ部分はソルダーレジストなしに編集しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319123438.png" width="538" height="429" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>静電容量タッチのほかのボードを見るとソルダーレジストありの物を多く見かけるので、それでもおそらく動作すると思うのですが、電極が露出していた方が、より感度が高くなるのでは?という雑な考えの元このように変更してみました。 (結局比べていないので、どちらが良かったのかはまだ不明です。)</p> <h1 id="基板の発注">基板の発注</h1> <p>今回もJLCPCBに発注しました。基板サイズが10cm×10cm以内だったので、非常に安くで作ることが出来ました。 5枚発注だと送料を抜くと$2でした。送料も$1程度なので、ワンコイン以内ですね。</p> <h1 id="組み立て">組み立て</h1> <p>今回は、モジュールを組み合わせるだけなので、組み立ては簡単です。 念のためソケットを介して各モジュールを実装しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319132433.png" width="581" height="671" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="動作確認とファームウェア開発">動作確認と<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>開発</h1> <p>まずはI2C OLEDの動作確認をします。といってもこれは素直にESP32のI2Cのポートに取り付けただけなのでu8g2ライブラリを使えば、かんたん・・</p> <p>と思っていたのですが、手元のOLEDが不良品だったようで妙に動作確認に手間取りました、まぁこれは本質と関係ないので割愛します。</p> <p>u8g2ライブラリは日本語フォントにも対応しており、今回の用途にはぴったりでした。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Folikraus%2Fu8g2" title="GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/olikraus/u8g2">github.com</a></cite></p> <p>次に静電容量タッチの動作確認をしたところ、どうもT1のポートが反応していないことに気が付きました。 詳しく確認してみると、このT1はGPIO0に使われているピンで、BOOTという起動時の動作を設定するためのピンでもあることがわかりました。 そのためESP32 DevkitCのモジュールでは自動リセットの回路の一部としてこのピンが利用されていました。</p> <p>おそらくこの影響でT1が意図しない状況になっており、うまくタッチセンサーとして機能しない状況になっているようでした。</p> <p>T1についてはあきらめてしまおうかと思っていたのですが、色々試行錯誤していると、どうもパソコンとのシリアル接続がつながっている状態だと、問題なく静電容量タッチが動作することに気付きました。</p> <p>これは自動リセットにかかわるDTR、<a class="keyword" href="https://d.hatena.ne.jp/keyword/RTS">RTS</a>の信号が、うまい具合にシリアル通信の際に設定されることで、T1のポートが静電容量タッチセンサーとしてうまく機能する状態になるようでした。</p> <p>(おそらくシリアル通信中は<a class="keyword" href="https://d.hatena.ne.jp/keyword/RTS">RTS</a>が大半の期間LOWとなるため、IO0がハイ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D4%A1%BC%A5%C0%A5%F3%A5%B9">インピーダンス</a>になるのではないかと思います。)</p> <p><a href="https://dl.espressif.com/dl/schematics/esp32_devkitc_v4-sch.pdf">https://dl.espressif.com/dl/schematics/esp32_devkitc_v4-sch.pdf</a></p> <p><figure class="figure-image figure-image-fotolife" title="上記PDFより"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319124511.png" width="658" height="499" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>上記PDFより</figcaption></figure></p> <p>まぁ、こんな具合でこの基板は何とか動作しましたが、シリアル通信をしていないときはT1ポートが使えないのは、かなり問題なので、ESP32DevKitCなど、自動リセット回路を搭載している回路構成ではT1ポートを静電容量タッチセンサーとして使うのはお勧めしません。</p> <p>タッチセンサーの入力はアナログ値として取り出せます。この値は絶対値ではなく、パッドの位置や環境によって毎回異なるもののようなので、起動時の初期値を覚えておいて、その値からの変化を見ることで、タッチを検出するのが定番のようです。</p> <p>ここまでで、25個のキーのどこに触れたかを検出できるようになり、その結果をOLEDに表示できるようになりました。</p> <p>25キーの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AD%A1%BC%A5%D1%A5%C3%A5%C9">キーパッド</a>が作りたいだけなら、ここで完成です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319123723.png" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="フリック入力のロジックの実装"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>のロジックの実装</h1> <p>25個の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AD%A1%BC%A5%D1%A5%C3%A5%C9">キーパッド</a>の入力が検出できるようになったので、次は本命の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>のロジックを実装します。</p> <p>様々な実現方法がありますが、今回は比較的単純な実装とします。 それでも、ちょっと複雑なので、まずは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>の状態遷移について考えました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319125031.png" width="749" height="607" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>まずは、スワイプではなくタップについて考えます。これは、あるキーの入力が検知され、その後一定期間経過後にどのキーの入力も検出されなくなる、と定義できそうです。</p> <p>一定期間待つのは、タップ開始中や、タップしている最中に静電容量センサーの状態が不規則にON/OFFされる、いわゆる<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C1%A5%E3%A5%BF%A5%EA%A5%F3%A5%B0">チャタリング</a>的な現象が発生するからです。</p> <p>次にスワイプについてです。これはタップのような現象が短い間隔で2度連続して発生することと定義できそうです。厳密には2つの入力の間にどのパッドにも指が触れない瞬間があるか、続けて2つのキーが検出されるかは場合によるので、初回タップのリリースが検出されない場合もありそうです。</p> <p>などと考えると、結構ややこしいです。</p> <p>状態遷移図はこのような問題を考えるときに良い道具となります。</p> <p>まだまだ改善点はありますが、現時点での<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>を公開しておきます。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Finajob%2Fesp32-5x5cap-board" title="GitHub - inajob/esp32-5x5cap-board" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/inajob/esp32-5x5cap-board">github.com</a></cite></p> <h1 id="フリック入力のデモ"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>のデモ</h1> <p>そんなこんなで、一応<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>のプログラムが完成しました。 <a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>のようにスムーズに、というわけにはいかないですが、一応<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>でひらがなを入力できました。</p> <p>現時点では実用は難しそうですが、ソフトウェア的に改良できる点は多いので、ESP32で少ない部品点数で日本語を入力する手法として可能性があると感じました。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ESP32の静電容量タッチでやりたかった<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>ができた!<br><br>正直めちゃくちゃ入力しにくいけど、可能性を感じる! <a href="https://t.co/hNAg8b8OCB">pic.twitter.com/hNAg8b8OCB</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1636732922341511169?ref_src=twsrc%5Etfw">2023年3月17日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="さらなる改良案">さらなる改良案</h1> <p>今回は、キーの検出を静電容量タッチセンサーの値を2値化して、処理しましたが、アナログ値のままで、最も大きな値のものを選択するなどの実装にすると、スワイプの途中に少し隣のキーをかすってしまうような場合もうまく処理ができるようになるのではと考えています。</p> <p>また、今回は5x5の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AD%A1%BC%A5%D1%A5%C3%A5%C9">キーパッド</a>の形状に配線しましたが、X軸,Y軸に5本の細長いパッドを配置し、各パッドの検出値の重みを考慮して、タッチされたX,Y座標を計算するような方式の方が、より応用例の多いタッチセンサーになるかなと感じました。この方式であれば、ノートパソコンに搭載されている<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%C3%A5%AF%A5%D1%A5%C3%A5%C9">トラックパッド</a>のような操作にも対応できそうです。(というか<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%C3%A5%AF%A5%D1%A5%C3%A5%C9">トラックパッド</a>自体がそのような仕組みなのだと思いますが・・)</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.dush.co.jp%2Fmethod-type%2Fcapacitive-touchscreen%2F" title="静電容量方式タッチパネルの仕組み" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.dush.co.jp/method-type/capacitive-touchscreen/">www.dush.co.jp</a></cite> <figure class="figure-image figure-image-fotolife" title="上記サイトより"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230319/20230319123604.png" width="399" height="258" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>上記サイトより</figcaption></figure></p> <h1 id="まとめ">まとめ</h1> <p>以下のことがわかりました</p> <ul> <li>ESP32を使うと10個の静電容量タッチが利用できる <ul> <li>うちT1については自動書き込み回路の影響で、利用は推奨できない</li> <li>タッチセンサーは部品なしにスイッチを作ることが出来るため、コスト削減にもつながる</li> </ul> </li> <li>10個の静電容量タッチは、組み合わせることで、より多くのタッチ入力センサーとして利用できる</li> <li>5x5の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%BF%A5%C3%A5%C1%A5%D1%A5%C3%A5%C9">タッチパッド</a>の構成において、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AF%C6%FE%CE%CF">フリック入力</a>が実装可能であること <ul> <li>ただし、ソフトウェアをもう少し工夫しないと実用的とはいいがたい</li> </ul> </li> <li>静電容量タッチのアナログ値を利用することで、より精度の高いタッチセンサーの製作が可能であること</li> </ul> <p>簡単な基板でしたが、多くのことを学ぶことが出来ました。 静電容量タッチの仕組みがなんとなく理解できたので、今後のガジェット作成で活用していきたいです。</p> <p>最後に、この基板が数枚余っていますので、もしほしい人がいたら連絡ください。 (可能なら、ボツ基板交換的なノリで、何か自作の面白い基板と交換してもらえると嬉しいです。 私が提供できるボツ基板は<a href="https://scrapbox.io/inajob/%E3%83%9C%E3%83%84%E5%9F%BA%E6%9D%BF">こちらにまとめています</a>。)</p> inajob HandiPiの手のひらサイズのキーボードを作ってみた hatenablog://entry/4207112889966339422 2023-02-28T09:12:12+09:00 2024-03-06T12:38:00+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 HandiPiとは? 今回作るのは手のひらサイズのキーボードです。 自分で設計してもよいのですが、今回はHandiPiという手のひら… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226141934.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="HandiPiとは">HandiPiとは?</h1> <p>今回作るのは手のひらサイズのキーボードです。</p> <p>自分で設計してもよいのですが、今回はHandiPiという手のひらサイズの<a class="keyword" href="https://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>コンソールのプロジェクトのキーボード部分のデータが<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>になっていたのでそれを使うことにしました。 (というかこのHandiPiのキーボードに一目ぼれして、作ってみよう、と思い立ったというのが正確なところです)</p> <p><figure class="figure-image figure-image-fotolife" title="https://github.com/brickbots/HandiPi より"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226014513.png" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="https://github.com/brickbots/HandiPi">https://github.com/brickbots/HandiPi</a> より</figcaption></figure></p> <p>このキーボードは、大半がスルーホール部品で構成されており、基板と少しの追加部品を購入すれば我が家の部品箱にある部品で作れそうでした。</p> <h1 id="Miryokuとは">Miryokuとは</h1> <p>このキーボードはMiryokuというキーボード配列を採用しています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fmanna-harbour%2Fmiryoku%2F" title="GitHub - manna-harbour/miryoku: Miryoku is an ergonomic, minimal, orthogonal, and universal keyboard layout." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/manna-harbour/miryoku/">github.com</a></cite></p> <p>これは36キーのキーボード配列で、様々なキーボード<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>でこの配列を利用できます。 今回はQMK版の<a href="https://github.com/manna-harbour/miryoku_qmk/tree/miryoku/users/manna-harbour_miryoku">miryoku_qmk/users/manna-harbour_miryoku at miryoku &middot; manna-harbour/miryoku_qmk &middot; GitHub</a>を使用します。</p> <p>横10列のキーと、下の6つのキーが存在し、下の6つのキーでレイヤーを切り替えながら、横10列のキーを打鍵するというスタイルです。</p> <p><figure class="figure-image figure-image-fotolife" title="https://github.com/manna-harbour/miryoku/tree/master/docs/reference より"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226014619.png" width="668" height="319" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="https://github.com/manna-harbour/miryoku/tree/master/docs/reference">https://github.com/manna-harbour/miryoku/tree/master/docs/reference</a> より</figcaption></figure></p> <p>下の6つのキーのどれか一つを親指で押さえながらほかのキーを打鍵することで、数字や記号を入力することが出来ます。 この配列の賢い点は、抑える親指と反対の手のキーのみに配列が割り当てられていことです。</p> <p>具体的には、右下真ん中を押下したNumというレイヤーの配列の場合、数字キーは左手側にテンキーの配列で割り当てられています。 <figure class="figure-image figure-image-fotolife" title="https://github.com/manna-harbour/miryoku/tree/master/docs/reference より"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226014650.png" width="668" height="319" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="https://github.com/manna-harbour/miryoku/tree/master/docs/reference">https://github.com/manna-harbour/miryoku/tree/master/docs/reference</a> より</figcaption></figure></p> <p>一方、左真ん中を押下したNavというレイヤーの場合は、カーソル移動のキーは右手側に割り当てられています。</p> <p><figure class="figure-image figure-image-fotolife" title="https://github.com/manna-harbour/miryoku/tree/master/docs/reference より"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226014711.png" width="668" height="319" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="https://github.com/manna-harbour/miryoku/tree/master/docs/reference">https://github.com/manna-harbour/miryoku/tree/master/docs/reference</a> より</figcaption></figure></p> <p>細かいカスタマイズの設定も用意されています。</p> <p>上のキーの割り当て表を見て謎のキー配列だと思う方もいるかもしれませんが、これは<a href="https://colemakmods.github.io/mod-dh/">Colemak Mod-DH</a>という配列のようです。HandiPiではこの配列ではなくなじみのある<a class="keyword" href="https://d.hatena.ne.jp/keyword/QWERTY%C7%DB%CE%F3">QWERTY配列</a>のオプションを選択しています。また、それに合わせてカーソルキーをVIライクなH,J,K,Lに変更するオプションも有効にしています。</p> <h1 id="発注までの流れ">発注までの流れ</h1> <p>下記のプロジェクトの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>に、KiCADの設計ファイルやガーバーデータが置いてあります。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fbrickbots%2FHandiPi" title="GitHub - brickbots/HandiPi: Handheld RPI4 based computer with keyboard and display" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/brickbots/HandiPi">github.com</a></cite></p> <p>KiCADの設計ファイルを使うと、オリジナルを少し改変したものを作ることもできますが、今回はそのままガーバーデータを使い、全く同じものを発注することにしました。</p> <p>トッププレートと、ボトムプレートの2種類の基板が必要となります。</p> <p>それぞれを5枚発注して$7×2 + 送料となりました。 (ほかの基板と一緒に発注したので$7になりましたが、JLCPCBでは1枚目の基板が安くなるはずです)</p> <p>トッププレートは1mm厚、 本体基板は通常通りの1.6mm厚で注文しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226140735.jpg" width="689" height="694" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="必要な部品の購入">必要な部品の購入</h1> <p>このキーボードをつくるにあたって必要な部品はそれほど多くありません。</p> <p>メイン<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>のATMega328Pは<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOのメイン<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>として有名なもので、我が家にも在庫がいくつかありました。 またその周辺部品として必要な16MHzの水晶発振子、や22pFの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>、バイ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%B3%A5%F3">パスコン</a>デンサである0.1uFの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>なども家にありました。</p> <p>キーボードのスイッチとなるのも、一般的な6mm角のスイッチで、これは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%BD%A9%B7%EE%C5%C5%BB%D2">秋月電子</a>で売っているものがありました。これは比較的軽い押し心地で、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%B9%A5%D1">コスパ</a>もよいのでお勧めです。</p> <p>ファントムキー防止のための<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>は表面実装のものが必要です。これもちょうど家にあったので、買う必要はありませんでした。</p> <p>このキーボードはATMega328Pにソフトウェア的にUSB HIDを実装するV-USBというライブラリを使用します。そのため、USB周りのちょっと普段は使わない部品が必要です。</p> <p>具体的には 75Ωの抵抗と、3.6Vのツェナー<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>です。これは家になかったのでAliExpressで注文しました。 また、4方向スイッチもそれっぽいものをAliExpressで注文しました。(が、このスイッチは現状の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>ではうまく動きませんでした)</p> <h1 id="ATMega328Pへのファームウェアの書き込み">ATMega328Pへの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>の書き込み</h1> <p>さて、基板と部品がそろったら、いよいよ組み立てたいところなのですが、、まずはメイン<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>であるATMega328Pに<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>を書き込む必要があります。</p> <p>しかし、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>を眺めても、どうも<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>の作り方についての詳細が記載されておらず、Issueで聞いてみることにしました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fbrickbots%2FHandiPi%2Fissues%2F4" title="How to build QMK for HandiPi? · Issue #4 · brickbots/HandiPi" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/brickbots/HandiPi/issues/4">github.com</a></cite></p> <p>この件は私のほかにも気になっていた方がいたようでした。 親切にも作者の方がビルドに必要な<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>の場所と、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>を教えてくれました。</p> <p>私はDocker環境でこれを実行し、必要なhexファイルを作りました</p> <pre class="code" data-lang="" data-unlink># リポジトリをcloneする $ git clone https://github.com/brickbots/qmk_firmware $ cd qmk_firmware $ git checkout handipi # submoduleをpullする $ git submodule init $ git submodule update # docker上のQMK環境に入る $ docker run -it -v //`pwd`:/qmk_firmware -w //qmk_firmware qmkfm/qmk_cli # 教えてもらったコマンドラインでビルドする $ make clean handipi:manna-harbour_miryoku:flash MIRYOKU_ALPHAS=QWERTY MIRYOKU_NAV=VI</pre> <p>ここまでを実行すると <code>handipi_manna-harbour_miryoku.hex</code> が生成されます</p> <p>qmkをDockerではなく直接マシンにインストールしていればこの流れで書き込みができるようなのですが、自分は手元の環境にいろいろ入れたくなかったのでDockerを使ったため、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>への書き込みは別途avrdudeコマンドを使うことで行いました</p> <pre class="code" data-lang="" data-unlink>$ avrdude -c diecimila -p m328p -b19200 -U flash:w:handipi_manna-harbour_miryoku.hex -v</pre> <p>さて、順番が前後しますが、ATMega328Pに<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>は焼いたものの、<a class="keyword" href="https://d.hatena.ne.jp/keyword/fuse">fuse</a> bitの設定が出来ていません。 デフォルトの<a class="keyword" href="https://d.hatena.ne.jp/keyword/fuse">fuse</a>の設定ではうまく動作しないので、こちらも設定します(qmkで焼くときは<a class="keyword" href="https://d.hatena.ne.jp/keyword/fuse">fuse</a>の設定もうまくされるのだろうか?)</p> <p><a href="https://github.com/manna-harbour/miryoku_qmk/blob/miryoku/docs/fuse.txt">miryoku_qmk/docs/fuse.txt at miryoku &middot; manna-harbour/miryoku_qmk &middot; GitHub</a> ここを見るとATMega168での<a class="keyword" href="https://d.hatena.ne.jp/keyword/fuse">fuse</a>の設定例が載っているので、これと同じような設定をATMega328Pでも設定すれば良さそうです。</p> <p>大事そうな設定は、外部水晶発振を使用することと、クロックを1/8しない(CKDIV8 = 1)くらいだと思います。</p> <p><a href="https://www.engbedded.com/fusecalc/">AVR&reg; Fuse Calculator &ndash; The Engbedded Blog</a>を使って、<a class="keyword" href="https://d.hatena.ne.jp/keyword/fuse">fuse</a>を計算すると、<code>lfuse 0xEF, hfuse 0xD9, efuse 0xFE</code>となりました。</p> <p>ということでこの<a class="keyword" href="https://d.hatena.ne.jp/keyword/fuse">fuse</a>を書き込みます</p> <pre class="code" data-lang="" data-unlink>$ avrdude -c diecimila -p m328p -b19200 -U lfuse:w:0xef:m -U hfuse:w:0xd9:m -U efuse:w:0xfe:m</pre> <h1 id="組み立て">組み立て</h1> <p>ひとまずキーボードと<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>以外の部品をはんだ付けします。</p> <p>22pFの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>は表面実装のものしかなかったので、スルーホールのフットプリントの上に無理やり乗せました 1.5kΩの抵抗も手元になかったので1kΩの表面実装抵抗3つをうまく使って1.5kΩの抵抗を作りました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226023509.png" width="647" height="863" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>USB部分はコネクタではなく、4本の配線が出ているだけだったので、動作テストのためには古くなったマウスのUSBケーブルを切り取ったものをつなげてPCに接続してみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226140748.jpg" width="1151" height="863" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>うまくいくとPCでUSB機器として認識されます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226022144.png" width="518" height="453" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この状態でキー1つと対応する<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>を取り付けると、キーボードとしての動作も確認できます。</p> <p>ここまでくれば後はすべてのキーと<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>を実装します。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>は表面実装で、数も多いので実装が大変ですが、黙々とはんだ付けします。</p> <h1 id="動作確認">動作確認</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230226/20230226141336.jpg" width="689" height="583" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>キーを順番に押して行って、すべてのキーが想定通りに動作するか確認します。</p> <p>自分の場合ははんだ付けがうまくいってなかったり、製作の過程で基板に傷をつけて、断線してしまっている箇所があり、ここで少し苦労しました。</p> <p>Miryokuの組み合わせキーも試してみると、マウスの操作もこのキーボードでできることが確認できました。</p> <h1 id="まとめ">まとめ</h1> <p>HandiPiプロジェクトのキーボード部分のデータを利用して、自分でも手のひらサイズのキーボードを自作できました。 HandiPiのようにRaspberryPiと組み合わせて手のひら端末を作るのも良し、ほかの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボードと組み合わせるにも良しの、便利なモジュールだと感じました。</p> <p>組み立ての過程でATMega328PをUSB HIDとして利用するためのV-USBや、QMKを使ったキーボード<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>のビルド、Miryokuという面白いキー配列の知識も学ぶことが出来ました。</p> <p>自分で基板を設計するのも勉強になりますが、こういうほかの人の作例を真似して作ることでも、多くの学びを得ることが出来ることも実感しました。</p> <p>最後に、この基板が数枚余っていますので、もしほしい人がいたら連絡ください。 (可能なら、ボツ基板交換的なノリで、何か自作の面白い基板と交換してもらえると嬉しいです。 私が提供できるボツ基板は<a href="https://scrapbox.io/inajob/%E3%83%9C%E3%83%84%E5%9F%BA%E6%9D%BF">こちらにまとめています</a>。)</p> inajob 表面実装部品版RakuChordをつくってみた hatenablog://entry/4207112889952172527 2023-01-19T17:20:38+09:00 2024-03-06T12:38:09+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 表面実装版RakuChordとは? RakuChordというのはinajobが開発している電子楽器です。 inajob.github… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109152931.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="表面実装版RakuChordとは">表面実装版RakuChordとは?</h1> <p>RakuChordというのはinajobが開発している電子楽器です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Frakuchord%2F" title="RakuChord(らくこーど)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/rakuchord/">inajob.github.io</a></cite></p> <p>ワンタッチで和音を演奏できるボタンがあり、だれでも比較的簡単に演奏ができるという電子楽器で、少しずつバージョンアップをさせながら、電子工作キットとしての販売をしています。</p> <p>今まではキットという性質上、リード部品のみを使った構成だったのですが、今回は実験も兼ねて表面実装部品を利用するものを作ってみることにしました。</p> <h1 id="表面実装版RakuChordの仕様と設計">表面実装版RakuChordの仕様と設計</h1> <p>せっかく作るので、少しは新しい機能を搭載することにします。</p> <ul> <li>単4電池ホルダx2を基板に搭載 <ul> <li>これによりケースに電池ホルダをマウントする必要がなくなり、小型化がやりやすくなります</li> </ul> </li> <li>5V昇圧機能 <ul> <li>上記の電池ホルダは3Vしか作れないので、5V昇圧機能を搭載します</li> </ul> </li> <li>8個のフルカラーLED搭載 <ul> <li>何かと便利そうなフルカラーLEDを搭載してみます</li> </ul> </li> </ul> <p>もともとのRakuChordは<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Nanoをそのまま貼り付けていたのですが、今回はそれに近い構成をRakuChordのメイン基板に実装する必要があるので以下の機能も自分で設計する必要があります。</p> <ul> <li>USB-Serial</li> <li>ICSP書き込み端子</li> <li>何かあった時用のシリアル書き込み端子(<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Mini互換)</li> </ul> <p>ということで回路図を・・・描きました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109144106.png" width="1166" height="772" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="PCBの設計">PCBの設計</h1> <p>一部の家にリード部品がたくさん余っている部品はリード部品とし、大半の部品を表面実装部品で設計しました。 基板サイズも今までのRakuChordより一回り小さくなるようにしました。</p> <p>今回は実装する部品が多いので、機能ごとに枠線を書くという工夫もしてみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109144225.png" width="622" height="616" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>いつものように定数を基板上に表示しておくのも実施しています。</p> <h1 id="JLCPCBに発注">JLCPCBに発注</h1> <p>そして、今回もJLCPCBに発注です。サイズは100mmx100mm以下なのでとてもお安く作ることが出来ます。</p> <p>今回はなんとなく白色の基板にしてみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230117/20230117155427.png" width="712" height="172" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>これに送料がかかりますが、$2って!安い!(元々$4なのですが、今は割引中のようです)</p> <h1 id="実装">実装</h1> <p>1~2週間で基板が届いたので、実装します。</p> <p>(写真は従来のRakuChordの基板との比較です)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109144315.png" width="919" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>一気に全部実装すると設計ミスがあった時に<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>がしづらくなるので順番に実装します。</p> <p>まずはメインプロセッサ周り。実装後ICSP端子から<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーを書き込みます。</p> <p>ここで、気づいたのですが、ICSP端子にはいつもピンの役割を明記するようにしていたのですが、これを忘れていることに気付きました。 これはうっかり。まぁ見た目だけの問題なので、特に困ることはありませんでした。</p> <p><figure class="figure-image figure-image-fotolife" title="右は300円テトリス基板のICSP端子"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109144504.png" width="435" height="196" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>右は300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>基板のICSP端子</figcaption></figure></p> <h2 id="USB-Serial周り">USB-Serial周り</h2> <h3 id="MicroUSB端子のはんだ付けが難しい">MicroUSB端子のはんだ付けが難しい</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109144550.png" width="211" height="174" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>その後USB-Serial周りを実装しますが、どうもここがうまく動かない。原因はいくつかあるのですが、まずMicroUSB端子のはんだ付けが難しく、雑につけるとコネクタを差し込んだ時にすぐ外れてしまうという問題がありました。 これはホットエアーガンではんだを多めに流すことで解消しました。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B08LKZ8VRC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51QcTbjS-FL._SL500_.jpg" class="hatena-asin-detail-image" alt="Portable SMD Rework Soldering Station 2 in 1 Hot Air Soldering Iron Digital Display Welding Tool BGA PCB IC Repair" title="Portable SMD Rework Soldering Station 2 in 1 Hot Air Soldering Iron Digital Display Welding Tool BGA PCB IC Repair"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B08LKZ8VRC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Portable SMD Rework Soldering Station 2 in 1 Hot Air Soldering Iron Digital Display Welding Tool BGA PCB IC Repair</a></p><ul class="hatena-asin-detail-meta"><li>Getue</li></ul><a href="https://www.amazon.co.jp/dp/B08LKZ8VRC?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h3 id="回路の間違い">回路の間違い</h3> <p>USB-Serial周りの実装をしようと、改めて回路図を見ていて、間違いに気づきました。 なんとUSB信号線のD+と、USB-Serial変換ICの3V端子が意図せず接続してしまっています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109145454.png" width="916" height="528" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>これはKiCADで操作するときに、配線がICの端子の上を横切ってしまい、意図せず接続してしまったことによるものです。 このままではうまくUSBの信号をICに届けることが出来ないので、対策が必要です。</p> <p>恐る恐る配線図を見てみたところ、きれいにD+と3Vの配線だけが通っている箇所があったので、ここをアクリルカッターで「エイヤ」とパターンカットすることで、この間違いを修正することが出来ました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109145639.png" width="640" height="398" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230109/20230109145739.png" width="466" height="360" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>このまま部品を実装すると、謎の挙動をして、頭を悩ませるところでした。</p> <h3 id="Arudinoの書き込みができない1">Arudinoの書き込みができない1</h3> <p>USB-Serial周りの部品を実装したのですが、どうも<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>としての書き込みが出来ません。</p> <p>切り分けをするために<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Mini互換の書き込み端子に外からUSB-Serialモジュールをつなげて、書き込みをテスト・・しようとして、問題に気付きました。 この端子のTX,RXが逆になっています! UART接続のTX, RXは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>側と書き込み側でクロスに接続する必要があるのですが、これを間違えていました。 とりあえず、ブレッドボードを介してTX, RXピンを入れ替えて接続することで、書き込みできることを確認しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230117/20230117032411.png" width="995" height="285" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h3 id="Arudinoの書き込みができない2">Arudinoの書き込みができない2</h3> <p>書き込みはできるということで、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーは正常であることが確認でき、問題は基板上のUSB-Serial変換ICのようでした。</p> <p>今回利用したCH330N(同じピン配置のCH340Nも)というUSB-Serial変換ICは、外部に水晶発振子が不要で部品点数が少なくなって便利かなと思い採用したのですが、どうも<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>が利用する57600baudの通信がうまくできません。</p> <p>あまり詳しく詰めていませんが、9600baudなら通信できたので、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーをビルドしなおして、通信速度を変更したものを用意して、書き込むことで一応解決しました。 <a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>書き込みの速度を変更したので、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="https://d.hatena.ne.jp/keyword/IDE">IDE</a>から書き込むためにも少し工夫が必要となってしまいました。 次回設計するときは素直に王道のCH340Gと水晶発振子を使うのが良いかなと思っています。</p> <p><strong>(CH330N/CH340N で似たような現象をご存じの方いたら教えてください・・)</strong></p> <h2 id="5V昇圧部分オーディオアンプ部分スイッチ">5V昇圧部分・オーディオアンプ部分・スイッチ</h2> <p>その後は5V昇圧部分を実装します。ここは全く問題なし、乾電池2本=3Vから5Vが出力できました。 さらにオーディオアンプ部分、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C5%C5%B2%F2%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">電解コンデンサ</a>のはんだ付けが甘く、一度音が出ないトラブルがありましたが、すぐに修正しました。</p> <p>そしてたくさんのスイッチと<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9">ダイオード</a>をどを並べて・・RakuChordの完成です。</p> <p>ピン配置は今までのRakuChordと同じにしたので、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>はそのままで動作しました。</p> <h2 id="OLED">OLED</h2> <p>フットプリントを間違えて、意図した場所とは違う位置に逆向きに実装する必要がある作りになってしまっています。 まぁほかの部品と干渉しない位置ですし、画面表示の反転はプログラムの修正で治すことが出来るので致命傷ではないですが・・</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20230117/20230117030142.png" width="768" height="1024" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="フルカラーLED">フルカラーLED</h2> <p>おまけでフルカラーLEDを並べて動作確認します。まずは1つ配置、ライブラリはAdafruitのものを利用しました。 説明通りに実装すれば問題なく制御できましたが、ここでデータシートをよく見ると、!!!。どうもこのフルカラーLEDは1つずつにバイ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%B3%A5%F3">パスコン</a>デンサを1つ配置する必要があったようで、この基板は仕様に沿っていないことがわかりました・・</p> <p>まぁ、一旦仕様のことは無視して、8個のLEDを実装してみたところ、一応動作するものの、稀に点灯しなかったり、意図しない色に光ったりすることがわかりました。これが<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%B3%A5%F3">パスコン</a>の有無による問題なのかはまだ分かっていないですが、次回設計するときは、1つずつにバイ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%B3%A5%F3">パスコン</a>デンサを実装してみます。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">改良中の小型のRakuChord<br>和音の構成音が光るようにしてみた! <a href="https://t.co/gdMrsMQcuN">pic.twitter.com/gdMrsMQcuN</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1611256030876536837?ref_src=twsrc%5Etfw">2023年1月6日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="演奏テスト">演奏テスト</h1> <p>スピーカーは既製品を使って、演奏テストをしてみました。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">新しいRakuChordの演奏テスト<br>普通に今までと同じ感じ <a href="https://t.co/6FCSKB1u92">pic.twitter.com/6FCSKB1u92</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1614141962147487744?ref_src=twsrc%5Etfw">2023年1月14日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>使っているスピーカーはこちら <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B072JMHJNW?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/31+q6IVdf5L._SL500_.jpg" class="hatena-asin-detail-image" alt="【正規品】 ポータブルスピーカー、有線スピーカー、ミニスピーカー、5倍の大音量 スマホ スピーカー、3.5mmイヤホンジャック 電源不要、手軽に使える 日本人による企画 PC、テレビ 、ラジオ、便携式 CD 、ウォークマン、MP4に対応" title="【正規品】 ポータブルスピーカー、有線スピーカー、ミニスピーカー、5倍の大音量 スマホ スピーカー、3.5mmイヤホンジャック 電源不要、手軽に使える 日本人による企画 PC、テレビ 、ラジオ、便携式 CD 、ウォークマン、MP4に対応"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B072JMHJNW?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">【正規品】 ポータブルスピーカー、有線スピーカー、ミニスピーカー、5倍の大音量 スマホ スピーカー、3.5mmイヤホンジャック 電源不要、手軽に使える 日本人による企画 PC、テレビ 、ラジオ、便携式 CD 、ウォークマン、MP4に対応</a></p><ul class="hatena-asin-detail-meta"><li>LC-dolida</li></ul><a href="https://www.amazon.co.jp/dp/B072JMHJNW?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="まとめ">まとめ</h1> <p>ということで、色々なトラブルはあったものの表面実装部品版のRakuChordが一応動作するところまで組み立てられました。</p> <p>RakuChordとしては何度も設計している構成なのですが、新しく設計を変更した部分はどうしても、このように問題があり、一発ではうまくいかないものですね。</p> <p>次はこれにケースをつけたりして、演奏しやすくできればと考えています。 今後の展開をお楽しみに!</p> <p>(例によってこの基板、3枚ほど余っています、腕に覚えのある方でほしい方は <a href="http://twitter.com/ina_ani">http://twitter.com/ina_ani</a> まで連絡ください。<a href="https://scrapbox.io/inajob/%E3%83%9C%E3%83%84%E5%9F%BA%E6%9D%BF">ボツ基板交換</a>のお相手も募集しています。)</p> inajob 2022まとめ hatenablog://entry/4207112889948094236 2022-12-26T08:47:26+09:00 2022-12-26T08:51:42+09:00 今年もいろいろなことがありました。 毎年恒例ですがまとめていきます。 ピックアップニュース Scrapboxによる共同編集プロジェクトの運営 育児+コロナ禍で、人と会うことが減り、かつ自由にできる時間が減ったため、オンラインでの懇親会などにも参加が難しくなっていたのですが、今年はScrapboxを活用することで、この問題を少し解決することが出来ました。 具体的には以下の2つのプロジェクトを作り、ここでいろいろな方と非同期にコミュニケーションしています。 まずは育児Scrapboxです。こちらは育児のTipsをまとめるというプロジェクトです。 scrapbox.io もう一つはfab-wikiと… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221225/20221225231011.png" width="828" height="688" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>今年もいろいろなことがありました。</p> <p>毎年恒例ですがまとめていきます。</p> <h3 id="ピックアップニュース">ピックアップニュース</h3> <h4 id="Scrapboxによる共同編集プロジェクトの運営"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Scrapbox">Scrapbox</a>による共同編集プロジェクトの運営</h4> <p>育児+コロナ禍で、人と会うことが減り、かつ自由にできる時間が減ったため、オンラインでの懇親会などにも参加が難しくなっていたのですが、今年は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scrapbox">Scrapbox</a>を活用することで、この問題を少し解決することが出来ました。</p> <p>具体的には以下の2つのプロジェクトを作り、ここでいろいろな方と非同期にコミュニケーションしています。</p> <p> </p> <p>まずは育児<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scrapbox">Scrapbox</a>です。こちらは育児のTipsをまとめるというプロジェクトです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fscrapbox.io%2Fchildcare%2F" title="育児" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://scrapbox.io/childcare/">scrapbox.io</a></cite></p> <p>もう一つはfab-<a class="keyword" href="http://d.hatena.ne.jp/keyword/wiki">wiki</a>というデジタルファブリケーションのTipsをまとめるプロジェクトです。</p> <p>今年の5月ごろからfabnewsという毎週気になったモノづくり系ニュースを紹介する取り組みも始めています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fscrapbox.io%2Ffab-wiki%2F" title="fab-wiki" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://scrapbox.io/fab-wiki/">scrapbox.io</a></cite></p> <p>また、こちらは私が始めたものではないのですが、<a href="https://scrapbox.io/villagepump/">井戸端</a>という<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scrapbox">Scrapbox</a>で雑談を行うプロジェクトにも参加させてもらい、すっかり馴染んでいます。</p> <p>これらの活動により、育児、コロナ禍にもかかわらず、十分にコミュニケーションを行うことが出来た1年でした。</p> <h4 id="育児チームリーダー">育児+チームリーダー</h4> <p>仕事の面では年明けからチームのリーダーの役割を拝命しました。</p> <p>育児をしながらということで、不安もあったのですが、うまく自分なりの進め方を見つけることが出来たと感じています。</p> <p>このあたりの話は会社の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C9%A5%D9%A5%F3%A5%C8%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC">アドベントカレンダー</a>として紹介しましたので、興味があればご覧ください。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F3a627d97af3090952d4e" title="ゼットラボでの育休取得から復帰までの話 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/3a627d97af3090952d4e">qiita.com</a></cite></p> <h4 id="水耕栽培"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%E5%B9%CC%BA%CF%C7%DD">水耕栽培</a></h4> <p>なぜか急に始めたレタスの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%E5%B9%CC%BA%CF%C7%DD">水耕栽培</a>。5月ごろから始めて、9月に収穫しました。</p> <p>すごくうまくいったわけではないですが、全滅することなく収穫できたので、まぁよしとしましょう。</p> <p>収穫量はちょっとでしたが、新しい体験で、面白かったです。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221226/20221226084035.png" width="338" height="451" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4 id="300円テトリス">300円<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a></h4> <p>10月、12月に記事にしたものですが、実はこの計画、今年の2月からコツコツと進めていたものなのです。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%BD%A1%BC">ダイソー</a>で手に入る300円<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>ゲーム、前から改造してみたかったのですが、その夢がやっと叶いました。</p> <p>おかげさまでたくさんのブックマークもいただくことが出来ました。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/LCD">LCD</a>を搭載したゲーム機を乗っ取る方法が大体わかったので、面白い液晶のガジェットがあったらまた挑戦してみたいです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Ftetris-hack" title="300円テトリスに好きな画像を出すまでの道のり - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/tetris-hack">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Ftetris-hack2" title="改造した300円テトリスの実験とゲーム開発 - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/tetris-hack2">inajob.hatenablog.jp</a></cite></p> <h3 id="ステータス">ステータス</h3> <ul> <li>今の家に引っ越してから6年目</li> <li>会社に入ってから13年目</li> <li>結婚して6年ちょっと</li> <li>娘が生まれて2年目</li> </ul> <h3 id="今年学んだスキル">今年学んだスキル</h3> <p>電子工作系が多いですが、React.jsとか流行りの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>プロダクトを試したりと、時間が少ない中でもいろいろ挑戦出来たのが良かったです。</p> <ul> <li>子供のおもちゃの修理</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>によるクッキー型作成</li> <li>Kritaによる画像編集</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/DLNA">DLNA</a>でTVチューナーに喝を入れる手法</li> <li>ESP32で定点カメラ作成</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>によるキーキャップ、フレーム作成</li> <li>Buildrootによる<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>用イメージの作成</li> <li>VOICEVOXで遊ぶ</li> <li>金属3Dプリント</li> <li>OpenSCADのライブラリBOSL2</li> <li>React.jsを少し学びなおす</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B5%A5%F3%A5%C9%A5%E1%A1%BC%A5%AB%A1%BC">ホットサンドメーカー</a>による調理</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>ハードウェアの回路図からオリジナルの基板生成(ESPBoy)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%F7%CE%CF%C8%AF%C5%C5">風力発電</a>とスーパー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%E3%A5%D1%A5%B7%A5%BF">キャパシタ</a>の実験</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>で動く写真ギャラリーソフト試食</li> <li>Brainuxを試す</li> <li>3Dプリントの発注</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoで和音楽器を作る</li> <li>TWELITEの実験</li> <li>CH552試食(Lチカ程度)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>でスキャナと<a class="keyword" href="http://d.hatena.ne.jp/keyword/OCR">OCR</a>による文書管理</li> <li>AR眼鏡の原理自作</li> </ul> <h3 id="今年買ったもの">今年買ったもの</h3> <ul> <li>電子レンジ <ul> <li>壊れたので買い換えました</li> </ul> </li> <li>調味料ボトル <ul> <li>ワンプッシュで大さじ1杯でるので、楽です</li> </ul> </li> </ul> <div class="freezed"> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B006KZ8PBK?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/31DEiqsKljL._SL500_.jpg" class="hatena-asin-detail-image" alt="台和 調味料入れ 酒専用ボトル 360ml ワンプッシュ 10cc 15cc 日本製 さじかげんM ME400S" title="台和 調味料入れ 酒専用ボトル 360ml ワンプッシュ 10cc 15cc 日本製 さじかげんM ME400S" /></a> <div class="hatena-asin-detail-info"> <p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B006KZ8PBK?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">台和 調味料入れ 酒専用ボトル 360ml ワンプッシュ 10cc 15cc 日本製 さじかげんM ME400S</a></p> <ul class="hatena-asin-detail-meta"> <li>台和(Daiwa)</li> </ul> <a href="https://www.amazon.co.jp/dp/B006KZ8PBK?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div> </div> </div> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B5%A5%F3%A5%C9%A5%E1%A1%BC%A5%AB%A1%BC">ホットサンドメーカー</a> <ul> <li>最近の朝ご飯はこれで作ってます</li> <li>なんでも挟んで焼けばおいしくなる(暴論?)ので夕食づくりでもたまに使います</li> </ul> </li> </ul> <div class="freezed"> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B01MZ203IG?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41yYZKPtNjL._SL500_.jpg" class="hatena-asin-detail-image" alt="ヨシカワ ホットサンドメーカー 焼き目がサクサク シングル フッ素加工 ななめ焼き目 ガス火専用 SJ2408 ブラック 全幅/35cm" title="ヨシカワ ホットサンドメーカー 焼き目がサクサク シングル フッ素加工 ななめ焼き目 ガス火専用 SJ2408 ブラック 全幅/35cm" /></a> <div class="hatena-asin-detail-info"> <p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B01MZ203IG?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">ヨシカワ ホットサンドメーカー 焼き目がサクサク シングル フッ素加工 ななめ焼き目 ガス火専用 SJ2408 ブラック 全幅/35cm</a></p> <ul class="hatena-asin-detail-meta"> <li>ヨシカワ(Yoshikawa)</li> </ul> <a href="https://www.amazon.co.jp/dp/B01MZ203IG?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div> </div> </div> <h3 id="感想">感想</h3> <p>育休をあけて2年目、リーダーを任されるところからのスタートでしたが、これは1年目で十分に役割を果たせた、無事会社に復帰できた証明ともいえるかなと思っています。</p> <p>娘も2歳になり、昨年ほど手がかかることがなくなり、育児、仕事、趣味ともに力を注げた1年でした。</p> <p>しかし娘が風邪をひいたり、濃厚<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%DC%BF%A8">接触</a>者となり登園できなかったり、家族全員が風邪をひいたりと、予想外のイベントは相変わらず盛りだくさんで、計画的に物事を進めるのは難しいと感じています。</p> <p>育児、コロナ禍での課題だったコミュニケーションの問題については<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scrapbox">Scrapbox</a>の活用という、育休以前よりも良いやり方を見つけることが出来たのが良かったです。</p> <p>このブログにもスポンサーがついたりと、趣味の方面でも新しい動きがでてきており、育児をしながらでも、できることが結構あるなと感じています。</p> <p><a href="https://inajob.github.io/iroiro-review/">inajobがいろいろ紹介するサイトです – inajobのいろいろレビュー</a>も、引き続きほぼ平日毎日更新できています。</p> <p>来年は娘の昼寝がなくなってきそうなので、もしかしたら今年よりもできることが少なくなるかも・・なんてびくびくしつつ、その分娘と遊ぶためのおもちゃ作りなどに力を入れようかな?なんて思ったりしています。</p> <p>引き続き、環境の変化に柔軟に対応しつつ楽しく生きていきたいと思います!</p> <h3 id="月別生データ">月別生データ</h3> <h4 id="1月">1月</h4> <ul> <li>帰省疲れ</li> <li>娘のおもちゃ修理</li> <li>チームリーダを拝命</li> <li>水切り棚の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%A3%B6%F1">治具</a>の検討</li> <li>電子レンジ故障</li> <li>いろいろレビューで日本の事例も扱い始める</li> <li>井戸端に参加</li> </ul> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Funko-cookie" title="3Dプリンタと無料のツールで「うんこクッキー」を作った - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/unko-cookie">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2Farduino%25E3%2581%25A7%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B0%25E3%2583%25A9%25E3%2583%259F%25E3%2583%25B3%25E3%2582%25B0%25E3%2581%25A7%25E3%2581%258D%25E3%2582%258Bwifi%25E3%2581%25AB%25E3%2582%2582%25E5%25AF%25BE%25E5%25BF%259C%25E3%2581%2597%25E3%2581%259F%25E3%2583%25AC%25E3%2582%25B7%25E3%2583%25BC%25E3%2583%2588%25E3%2583%2597%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25BFatom-printer%2F" title="ArduinoでプログラミングできるWiFiにも対応したレシートプリンタ「ATOM Printer」 | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/arduino%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%8D%E3%82%8Bwifi%E3%81%AB%E3%82%82%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F%E3%83%AC%E3%82%B7%E3%83%BC%E3%83%88%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BFatom-printer/">inajob.github.io</a></cite></p> <h4 id="2月">2月</h4> <ul> <li><a href="https://github.com/matobaa/tact31_keyboard">tact31_keyboard</a> の組み立て</li> <li>ichirowoさんのタクトキーテスターを買う</li> <li>100均の300円<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>に興味を持つ</li> <li>fab-<a class="keyword" href="http://d.hatena.ne.jp/keyword/wiki">wiki</a>を始める</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">できたぞ!<br />Layer切り替えはどのキーだ? <a href="https://t.co/3RbICHGrn0">pic.twitter.com/3RbICHGrn0</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1492391540135964680?ref_src=twsrc%5Etfw">2022年2月12日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">これは、、良いものです! <a href="https://t.co/iDr8PcSvJs">pic.twitter.com/iDr8PcSvJs</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1493913105600237568?ref_src=twsrc%5Etfw">2022年2月16日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">【参加者募集】見切り発車で「fab-<a class="keyword" href="http://d.hatena.ne.jp/keyword/wiki">wiki</a>」というデジタルファブリケーションのための情報を集積できる<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scrapbox">Scrapbox</a>プロジェクトを作りました。<br /><br />ひとまずは電子工作や<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>周りの情報を書いていますが、「作る」なら何でもOKで情報を募集しています。<a href="https://t.co/Rg61mVLsV3">https://t.co/Rg61mVLsV3</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1495380539229962247?ref_src=twsrc%5Etfw">2022年2月20日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2Fesp32%25E3%2582%2592%25E6%2590%25AD%25E8%25BC%2589%25E3%2581%2597%25E3%2581%259F%25E6%2590%25BA%25E5%25B8%25AF%25E3%2582%25B2%25E3%2583%25BC%25E3%2583%25A0%25E3%2582%25A8%25E3%2583%259F%25E3%2583%25A5%25E3%2583%25AC%25E3%2583%25BC%25E3%2582%25BFesplay-micro-v2%2F" title="ESP32を搭載した携帯ゲームエミュレータ「ESPlay Micro V2」 | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/esp32%E3%82%92%E6%90%AD%E8%BC%89%E3%81%97%E3%81%9F%E6%90%BA%E5%B8%AF%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BFesplay-micro-v2/">inajob.github.io</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2Fatsamd21%25E6%2590%25AD%25E8%25BC%2589circuitpython%25E3%2581%25A7%25E3%2582%25B2%25E3%2583%25BC%25E3%2583%25A0%25E3%2581%258C%25E4%25BD%259C%25E3%2582%258C%25E3%2582%258B%25E6%25BF%2580%25E5%25AE%2589%25E6%2590%25BA%25E5%25B8%25AF%25E3%2582%25B2%25E3%2583%25BC%25E3%2583%25A0%25E7%25AB%25AF%25E6%259C%25ABpewpew-standalone%2F" title="ATSAMD21搭載CircuitPythonでゲームが作れる激安携帯ゲーム端末「PewPew Standalone」 | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/atsamd21%E6%90%AD%E8%BC%89circuitpython%E3%81%A7%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%8C%E4%BD%9C%E3%82%8C%E3%82%8B%E6%BF%80%E5%AE%89%E6%90%BA%E5%B8%AF%E3%82%B2%E3%83%BC%E3%83%A0%E7%AB%AF%E6%9C%ABpewpew-standalone/">inajob.github.io</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Ftv-tuner-dlna" title="TVチューナー(EX-BCTX2)が時々HDDを見失う対策と録画一覧をDLNAで引っこ抜く話 - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/tv-tuner-dlna">inajob.hatenablog.jp</a></cite></p> <h4 id="3月">3月</h4> <ul> <li>メ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%CB">カニ</a>カルキーボード購入</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>によるキーキャップ・フレームの自作</li> <li>我が家の換気口が開いていないことに気付く</li> <li>自主隔離</li> <li>洗面所のドアストッパー自作</li> <li>ESP32で日本語入力のプロジェクトを少し進める</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">大体わかってきた <a href="https://t.co/qGNBNRwycw">pic.twitter.com/qGNBNRwycw</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1504017140625866752?ref_src=twsrc%5Etfw">2022年3月16日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">おお! <a href="https://twitter.com/necobut?ref_src=twsrc%5Etfw">@necobut</a> さんのアド<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>で片方を爪にして、サイズを切り詰めたらいい感じ!<br /><br />これなら数ヶ月はいけそうな予感。 <a href="https://t.co/DSQUDH6Xi9">pic.twitter.com/DSQUDH6Xi9</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1505527797049348098?ref_src=twsrc%5Etfw">2022年3月20日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">いいねー、これだけでメモできる<br />しかも日本語で! <a href="https://t.co/5yeM1HyCXx">pic.twitter.com/5yeM1HyCXx</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1506985170251190277?ref_src=twsrc%5Etfw">2022年3月24日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p> </p> <div class="freezed"> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B08M3BVXWK?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/412SZtfbGML._SL500_.jpg" class="hatena-asin-detail-image" alt="ロジクール K835OWR 有線 メカニカルキーボード 赤軸 リニア テンキーレス コンパクト メカニカル キーボード 有線 有線キーボード オフホワイト windows surface K835 国内正規品" title="ロジクール K835OWR 有線 メカニカルキーボード 赤軸 リニア テンキーレス コンパクト メカニカル キーボード 有線 有線キーボード オフホワイト windows surface K835 国内正規品" /></a> <div class="hatena-asin-detail-info"> <p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B08M3BVXWK?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">ロジクール K835OWR 有線 メカニカルキーボード 赤軸 リニア テンキーレス コンパクト メカニカル キーボード 有線 有線キーボード オフホワイト windows surface K835 国内正規品</a></p> <ul class="hatena-asin-detail-meta"> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Logicool">Logicool</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B8%A5%AF%A1%BC%A5%EB">ロジクール</a>)</li> </ul> <a href="https://www.amazon.co.jp/dp/B08M3BVXWK?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div> </div> </div> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">1歳11か月現在の夫婦のスケジュールこんな感じ。<br />夜の睡眠が安定してきたので、親の朝寝は不要になった。<br />寝る時間が30分ほどずれた。<br /><br />という違いはあるが半年前からそこまで生活スタイルは変わっていない。<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/FgvvzRDySK">pic.twitter.com/FgvvzRDySK</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1508074350573850625?ref_src=twsrc%5Etfw">2022年3月27日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2F2%25E6%259C%25AC%25E7%259B%25AE%25E3%2581%25AB%25E3%2581%2584%25E3%2581%258B%25E3%2581%258C%25E3%2583%25AF%25E3%2582%25A4%25E3%2583%25A4%25E3%2583%25AC%25E3%2582%25B9%25E3%2583%2590%25E3%2583%2583%25E3%2583%2586%25E3%2583%25AA%25E3%2583%25BC%25E3%2581%25AF%25E3%2582%2593%25E3%2581%25A0%25E3%2581%2594%25E3%2581%25A6%2F" title="2本目にいかが?ワイヤレスバッテリーはんだごて | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/2%E6%9C%AC%E7%9B%AE%E3%81%AB%E3%81%84%E3%81%8B%E3%81%8C%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC%E3%81%AF%E3%82%93%E3%81%A0%E3%81%94%E3%81%A6/">inajob.github.io</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fraspberry-pi-fast-japanese" title="6.5秒で起動する日本語対応Vimマシンを作った - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/raspberry-pi-fast-japanese">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fkitchen-shelf" title="キッチン水切り棚の導入と3Dプリンターによる不具合修正 - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/kitchen-shelf">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fdiy-for-baby-2" title="エンジニアパパの2歳までのクリエイティブなDIY育児の記録 - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/diy-for-baby-2">inajob.hatenablog.jp</a></cite></p> <h4 id="4月">4月</h4> <ul> <li>風力の実験</li> <li>VOICEVOXで遊ぶ</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%CB%A5%C8%A5%DE%A5%C8">ミニトマト</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%A4%A1%BC%A5%C8%A5%D0%A5%B8%A5%EB">スイートバジル</a>、ピーマンと万能ねぎを植える</li> <li>娘、二語文をマスター</li> <li>ミサンガを作って遊ぶ</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">いい風吹いてきた! <a href="https://t.co/9TBCDPP0jX">pic.twitter.com/9TBCDPP0jX</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1510511965713879041?ref_src=twsrc%5Etfw">2022年4月3日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">ミサンガ、完全に理解した <a href="https://t.co/yWPsJ4EOIn">pic.twitter.com/yWPsJ4EOIn</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1518223756388605958?ref_src=twsrc%5Etfw">2022年4月24日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Scrapbox">Scrapbox</a>の会話テキストを基に、ラジオのような音声を生成できる<a class="keyword" href="http://d.hatena.ne.jp/keyword/scrapbox">scrapbox</a>-radio-makerを作ってみました!<br /><br />とにかくVOICEVOXがすごいです。<a href="https://t.co/jah4iCOIaJ">https://t.co/jah4iCOIaJ</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1513003922452934669?ref_src=twsrc%5Etfw">2022年4月10日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F7099e539078c38c60844" title="minikubeでoauth2-proxyとdexを動かして認証マイクロサービスを体験する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/7099e539078c38c60844">qiita.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fch9328" title="ArduinoとCH9328でお手軽自作キーボード - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/ch9328">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2Fesp32%25E6%2590%25AD%25E8%25BC%2589%25E3%2581%25AE%25E3%2582%25BF%25E3%2583%2583%25E3%2583%2581%25E5%25AF%25BE%25E5%25BF%259C%25E6%25B6%25B2%25E6%2599%25B6%25E4%25BB%2598%25E3%2581%258D%25E3%2581%25AE%25E3%2582%25B9%25E3%2582%25BF%25E3%2582%25A4%25E3%2583%25AA%25E3%2583%2583%25E3%2582%25B7%25E3%2583%25A5%25E3%2581%25AA%25E9%2596%258B%25E7%2599%25BA%25E3%2583%259C%25E3%2583%25BC%25E3%2583%2589wt320sc01%2F" title="ESP32搭載のタッチ対応液晶付きのスタイリッシュな開発ボード「WT32-SC01」 | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/esp32%E6%90%AD%E8%BC%89%E3%81%AE%E3%82%BF%E3%83%83%E3%83%81%E5%AF%BE%E5%BF%9C%E6%B6%B2%E6%99%B6%E4%BB%98%E3%81%8D%E3%81%AE%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AA%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AA%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89wt320sc01/">inajob.github.io</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fch9328" title="ArduinoとCH9328でお手軽自作キーボード - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/ch9328">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F7099e539078c38c60844" title="minikubeでoauth2-proxyとdexを動かして認証マイクロサービスを体験する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/7099e539078c38c60844">qiita.com</a></cite></p> <h4 id="5月">5月</h4> <ul> <li>fab-<a class="keyword" href="http://d.hatena.ne.jp/keyword/wiki">wiki</a>にてモノづくり系気になったニュースを毎週まとめるfabnewsという取り組みを始める</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%E5%B9%CC%BA%CF%C7%DD">水耕栽培</a>開始</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DB%A5%C3%A5%C8%A5%B5%A5%F3%A5%C9%A5%E1%A1%BC%A5%AB%A1%BC">ホットサンドメーカー</a>を買った</li> <li>調味料入れを買った</li> <li>Lexicalを試した</li> <li>いちご狩りに行った</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">レタスの種を発芽させてみる実験を始めてたのだが、、 <a href="https://t.co/sBgjogFtVR">pic.twitter.com/sBgjogFtVR</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1523564164081676288?ref_src=twsrc%5Etfw">2022年5月9日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h4 id="inajobhatenablogjp"> <iframe class="embed-card embed-blogcard" frameborder="0" loading="lazy" scrolling="no" src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fpoormans-usb-cable-checker-enclosure" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="貧者のUSBケーブルチェッカーをセルフパワー化するケースを設計する - inajob's blog"> </iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/poormans-usb-cable-checker-enclosure">inajob.hatenablog.jp</a></cite></h4> <h4 id="6月">6月</h4> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ESP-WROOM-02">ESP-WROOM-02</a>を使ったESPBoyの試作</li> <li>グリッド楽器の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%BF%A5%F3%A5%C9%A5%A2%A5%ED%A1%BC%A5%F3">スタンドアローン</a>化</li> <li>洗濯機の故障・修理</li> <li>水切り棚の横をふさぐ</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">自作グリッド楽器「igeta」<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%BF%A5%F3%A5%C9%A5%A2%A5%ED%A1%BC%A5%F3">スタンドアローン</a>化してみた <a href="https://t.co/VljcwcSXEo">pic.twitter.com/VljcwcSXEo</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1533309840499814400?ref_src=twsrc%5Etfw">2022年6月5日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">結局向きを変えた。パチっとはまる!<br />これで横から小皿が落ちることも無くなるだろう。<br /><br />良いものを作った!<a href="https://twitter.com/hashtag/3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#3Dプリンター</a> <a href="https://t.co/pBfWWY6Zis">pic.twitter.com/pBfWWY6Zis</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1537631293009448960?ref_src=twsrc%5Etfw">2022年6月17日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fremote-white-board" title="ホワイトボードの買い物リストを外から見えるようにする - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/remote-white-board">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2Fbd50ef8e4b264a18f81d" title="Prometheusが乱立して一見どれかわからない問題に対応する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/bd50ef8e4b264a18f81d">qiita.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F5529216fd446419e0f82" title="PrometheusのConsoleでちょっとしたHTMLを配信する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/5529216fd446419e0f82">qiita.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F8dcfd91c43b24efa75b5" title="GitHub CLIでチーム週報を生成する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/8dcfd91c43b24efa75b5">qiita.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F73306d7faa440701ffcc" title="SPIRE v1.2.1, v1.2.2, v.1.2.3変更点調査 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/73306d7faa440701ffcc">qiita.com</a></cite></p> <h4 id="7月">7月</h4> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%E9%A1%BC%A5%D1%A5%CD%A5%EB">ソーラーパネル</a>・スーパー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%E3%A5%D1%A5%B7%A5%BF">キャパシタ</a>の実験</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google">Google</a> Photoや<a class="keyword" href="http://d.hatena.ne.jp/keyword/Dropbox">Dropbox</a>の写真をおうち<a class="keyword" href="http://d.hatena.ne.jp/keyword/NAS">NAS</a>に移行</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>で動作する写真ギャラリーソフトを物色</li> <li>娘がRSウイルスに感染</li> <li>Brainuxで遊ぶ</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> PCの<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>換装</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> PicoでLチカ</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>端末になると聞いて買ってみたよ! <a href="https://t.co/a8nfa5GQgE">pic.twitter.com/a8nfa5GQgE</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1547191689877782530?ref_src=twsrc%5Etfw">2022年7月13日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">5V出る便利な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%E9%A1%BC%A5%D1%A5%CD%A5%EB">ソーラーパネル</a>を買った <a href="https://t.co/JUGJtEzcX5">pic.twitter.com/JUGJtEzcX5</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1543803094030757889?ref_src=twsrc%5Etfw">2022年7月4日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fjlcpcb-3dprint-service" title="JLCPCBに3Dプリントを発注してみた - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/jlcpcb-3dprint-service">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fkantan-usb-host" title="かんたんUSBホストを試してみた - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/kantan-usb-host">inajob.hatenablog.jp</a></cite></p> <h4 id="8月">8月</h4> <ul> <li>300円<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の基板設計開始</li> <li>TWLITE実験</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">TWE-Liteで通信できた!<br />とてもわかりづらいが、2つの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>は通信線では繋がってないです。<br />次は通信距離を測りたいな。<br /><br />これでまた一つ積み基板が減った <a href="https://t.co/KaDqJqEJsC">pic.twitter.com/KaDqJqEJsC</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1557599388050280448?ref_src=twsrc%5Etfw">2022年8月11日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fespboy" title="ESPboyというオープンソースの携帯ゲーム機を日本用に再設計してみた - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/espboy">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fjlcpcb-easyeda" title="JLCPCBにEasyEDAからサクッと注文して苦労した話 - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/jlcpcb-easyeda">inajob.hatenablog.jp</a></cite></p> <h4 id="9月">9月</h4> <ul> <li>自宅待機</li> <li>マンションの騒音苦情でハラハラする</li> <li>下痢</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%E5%CC%EE%C6%B0%CA%AA%B1%E0">上野動物園</a></li> <li>CH552試作</li> </ul> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F88c4539b0265f3f58dd6" title="共同編集できるWiki「Hedgedoc」のデータをLiteStreamでS3にレプリケーションし永続化する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/88c4539b0265f3f58dd6">qiita.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F747afc0481fe20b00869" title="共同編集WikiであるHedgeDocの最新版をdocker-composeでサクっと立ち上げる - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/747afc0481fe20b00869">qiita.com</a></cite></p> <h4 id="10月">10月</h4> <ul> <li>芋ほり</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoで和音</li> <li>電子の森ラジオに出演</li> <li>スキャナで文書管理システム</li> <li>ハロウィン用アニメーションランタン実験</li> <li>AR眼鏡の原理実験</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">My New Gear!!<br /><br />Windows10では動かないので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>に繋げて運用予定 <a href="https://t.co/exH0aTMoC6">pic.twitter.com/exH0aTMoC6</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1580108751830667264?ref_src=twsrc%5Etfw">2022年10月12日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">ハロウィンという事で <a href="https://twitter.com/hashtag/3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#3Dプリンター</a> と電子工作でお化けがアニメーションするランタンを作ってみた! <a href="https://t.co/y5JbEU3J2f">pic.twitter.com/y5JbEU3J2f</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1586510784456445952?ref_src=twsrc%5Etfw">2022年10月30日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">めっちゃ雑に実験してるけど、これでメガネ型ディスプレイ作れそう <a href="https://t.co/pv6kPgdLK4">pic.twitter.com/pv6kPgdLK4</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1579348598420303874?ref_src=twsrc%5Etfw">2022年10月10日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Picoで和音とキーボードの実験。簡単だー <a href="https://t.co/gdkhdBCGqw">pic.twitter.com/gdkhdBCGqw</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1578921440514301953?ref_src=twsrc%5Etfw">2022年10月9日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><iframe src="https://anchor.fm/electronic-wood/embed/episodes/002-e1pggg1" height="102px" width="400px" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://anchor.fm/electronic-wood/episodes/002-e1pggg1/a-a8nfeo4">anchor.fm</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2F3dprinted-branding-iron" title="金属3Dプリントサービスで「焼き印」を作ってみた - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/3dprinted-branding-iron">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Ftetris-hack" title="300円テトリスに好きな画像を出すまでの道のり - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/tetris-hack">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.github.io%2Firoiro-review%2Fpost%2F%25E9%25AB%2598%25E8%25A7%25A3%25E5%2583%258F%25E5%25BA%25A6%25E6%25B6%25B2%25E6%2599%25B6%25E4%25BB%2598%25E3%2581%258D%25E3%2581%25AEesp32%25E9%2596%258B%25E7%2599%25BA%25E3%2583%259C%25E3%2583%25BC%25E3%2583%2589makepython-esp32-color-lcd%2F" title="高解像度液晶付きのESP32開発ボードMakePython ESP32 Color LCD | inajobのいろいろレビュー" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.github.io/iroiro-review/post/%E9%AB%98%E8%A7%A3%E5%83%8F%E5%BA%A6%E6%B6%B2%E6%99%B6%E4%BB%98%E3%81%8D%E3%81%AEesp32%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89makepython-esp32-color-lcd/">inajob.github.io</a></cite></p> <h4 id="11月">11月</h4> <ul> <li>家族で順番に風邪をひく</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で数字のおもちゃを作る</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mastodon">Mastodon</a>始める</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で脱進機を作ろうとして失敗</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">できたー <a href="https://t.co/CNurTZAUyp">pic.twitter.com/CNurTZAUyp</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1590285932040949764?ref_src=twsrc%5Etfw">2022年11月9日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja">見様見真似で脱進機を設計してみたが全然ダメ<a href="https://twitter.com/hashtag/3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#3Dプリンター</a> <a href="https://t.co/pf0PtPXZLB">pic.twitter.com/pf0PtPXZLB</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1591293189176295424?ref_src=twsrc%5Etfw">2022年11月12日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h4 id="12月">12月</h4> <ul> <li>引き続きやや体調不良</li> <li>お手製の段ボールクリスマスツリー</li> </ul> <blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"> <p dir="ltr" lang="ja"><a class="keyword" href="http://d.hatena.ne.jp/keyword/DIY">DIY</a>クリスマスツリーまぁこんなもんじゃろ<br />娘と私の共同作業<a href="https://twitter.com/hashtag/%E3%83%91%E3%83%91%E8%82%B2?src=hash&amp;ref_src=twsrc%5Etfw">#パパ育</a> <a href="https://t.co/Nw7agrZ6nD">pic.twitter.com/Nw7agrZ6nD</a></p> — ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1606564927288012800?ref_src=twsrc%5Etfw">2022年12月24日</a></blockquote> <p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Ftetris-hack2" title="改造した300円テトリスの実験とゲーム開発 - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/tetris-hack2">inajob.hatenablog.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F0cfca901d616fba8a708" title="rpmdbの壊し方 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/0cfca901d616fba8a708">qiita.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Finajob%2Fitems%2F3a627d97af3090952d4e" title="ゼットラボでの育休取得から復帰までの話 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/inajob/items/3a627d97af3090952d4e">qiita.com</a></cite></p> <h3 id="参考">参考</h3> <ul> <li><a href="https://inajob.hatenablog.jp/entry/2020-recap">2020まとめ - inajob's blog</a></li> <li><a href="https://inajob.hatenablog.jp/entry/2019-recap">2019年まとめ - inajob's blog</a></li> <li><a href="https://inajob.hatenablog.jp/entry/2018/12/28/2018%E5%B9%B4%E3%81%BE%E3%81%A8%E3%82%81">2018年まとめ - inajob's blog</a></li> <li><a href="https://inajob.hatenablog.jp/entry/2017/12/28/2017%E3%81%BE%E3%81%A8%E3%82%81">2017まとめ - inajob's blog</a></li> <li><a href="http://inajob.hatenablog.jp/entry/20161228/1482930243">2016まとめ - inajob's blog</a></li> <li><a href="http://d.hatena.ne.jp/inajob/20151227">2015-12-27</a></li> <li><a href="http://d.hatena.ne.jp/inajob/20141231">2014-12-31</a></li> <li><a href="http://d.hatena.ne.jp/inajob/20131222">2013-12-22</a></li> </ul> inajob 改造した300円テトリスの実験とゲーム開発 hatenablog://entry/4207112889945902500 2022-12-19T18:35:00+09:00 2024-03-06T12:38:19+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 ここまでの流れ 前回の記事で、ダイソーの300円テトリスの中身を乗っ取り、画面に好きな画像を出すことが出来ました。 inajob.h… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221218/20221218145042.png" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="ここまでの流れ">ここまでの流れ</h1> <p>前回の記事で、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%BD%A1%BC">ダイソー</a>の300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の中身を乗っ取り、画面に好きな画像を出すことが出来ました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Ftetris-hack" title="300円テトリスに好きな画像を出すまでの道のり - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/tetris-hack">inajob.hatenablog.jp</a></cite></p> <p>しかし、基板の設計に失敗し、肝心の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>を基板に搭載することが出来ず、代わりに<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOを外付けして制御することになってしまっていました。</p> <p>今回はこの話の続きです。</p> <h1 id="失敗基板が活用できたわけは">失敗基板が活用できたわけは?</h1> <p>前回の失敗基板ですが、「こんなこともあろうかと」という精神で用意した仕掛けが、うまく利用できたために、完全なボツ基板とはならず、液晶制御の実験を行うことが出来ました。</p> <p>この仕掛けというのは、なるべく<strong>ICのピンを引き出しておく</strong>ことです。</p> <p>今回はHT1626という<a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>制御用の100ピンのICを使いましたが、この基板では、このICのピンをすべて引き出しています。 利用しないCOM、SEGの制御用のピンは表面実装用のパッドに、利用しているCOM、SEGや、制御用のピンはスルーホールのパッドに引き出しています。</p> <p>ここで、制御用のピンを引き出していたおかげで、外付けの<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOから簡単に液晶を制御できたという言うわけです。</p> <p>そのほかにもATMega328Pの未使用ピンや、ICSP端子、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Mini互換の書き込みポートなども引き出しています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221217/20221217230951.png" width="686" height="543" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221217/20221217231834.png" width="695" height="559" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="修正版の基板発注">修正版の基板発注</h1> <p>失敗基板の原因はメイン<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>であるATMega328Pの型番間違え、だったので、単純に正しい型番を指定し、再度配線を引き直すだけで再発注できました。</p> <p>今回も<a href="https://jlcpcb.com/JPV">JLCPCB</a>に基板の製作を依頼しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221217/20221217232054.png" width="600" height="453" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>なんとなく今回は紫色です。</p> <p>色を変えることで基板の取り違えを防ぐという目的もあります。</p> <p>緑と値段は変わりませんが、製作にかかる時間が少し長くなるようです。</p> <h1 id="修正版基板の実装">修正版基板の実装</h1> <p>配線以外は全く同じなので、実装は前と同じことをやるだけ、なのですが、HT1626は100個もピンがあるICなので、それなりに大変です。 出来た!と思ってもいくつかのピンがうまくはんだ付けできていないなど、苦労がありました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221217/20221217232142.png" width="867" height="736" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="書き込み用ポートの増設">書き込み用ポートの増設</h1> <p>基板が実装出来たら、いよいよ組み込みです。 今回はメイン<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>も基板上に実装できたので、300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>のケースの中にすべて収めることが出来、一見元の300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>のようだが、中身は<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>互換<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>、というのが実現しました。</p> <p>しかし、このままでは<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>として書き込みするためには、ケースを開いて中の書き込みポートとパソコンをつなげる必要があります。</p> <p>ということで、ケースを開かずに簡単に<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>として書き込みができるように、ケースに少し穴をあけて、書き込み用のピンを引き出すことにしました。</p> <p>あまり深く考えていなかったのですが、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Mini互換の書き込みポートがちょうどよい位置にあったので、ピンソケットを90度曲げたものを取り付けて、ケースを少し削ることで、ほとんど見た目に影響なく、書き込み口を取り付けることが出来ました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221218/20221218141728.png" width="510" height="572" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この書き込み口にUSB-シリアル変換モジュールを差し込むことで、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOのように簡単に書き込みできます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221217/20221217232359.png" width="1031" height="574" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="日本語表示の実験">日本語表示の実験</h1> <p>ここまで来たら、後はソフトウェアの世界です。</p> <p>300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>液晶の解像度は10×20で、小さいながら日本語のフォントも表示できそうです。</p> <p>ということで、この界隈では有名な「<a href="https://littlelimit.net/misaki.htm">美咲フォント</a>」を使うことにします。</p> <p><a href="https://github.com/Tamakichi/Arduino-misakiUTF16">Arduinoで簡単に美咲フォントを扱うためのライブラリ</a>があるので、これを使わせてもらうと・・・</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221217/20221217232530.png" width="617" height="676" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">美咲フォントを使って<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%A4%A5%BD%A1%BC">ダイソー</a>300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>に日本語表示ができた!! <a href="https://t.co/v9PHglNK6b">pic.twitter.com/v9PHglNK6b</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1599663082011521024?ref_src=twsrc%5Etfw">2022年12月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ほら出来た。 縦書きで2文字とちょっと1画面に表示できるので、これをスクロールして表示しています。</p> <p>スクロールさせて気づきましたが、この液晶は残像が結構長く残ります。そのためちょっと早めに画面を切り替えると、うまく文字が読めないという現象が起きました。</p> <p>ということで、スピード感のあるゲームなどをこれで実行するのは厳しそうです。</p> <h1 id="ボタンとスピーカーの実験">ボタンとスピーカーの実験</h1> <p>配線の確認もかねて、ボタンを押すとスピーカーから音階が流れるようなプログラムを作ってみました。 9個ボタンがあるので、1オクターブ以上ならせます。慣れればこれで1曲演奏できそうです。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">キーとスピーカーとテスト。<br>楽器としても使えるね!<br><br><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>の足が1つ浮いてて一度バラした <a href="https://t.co/HAZU00vUBe">pic.twitter.com/HAZU00vUBe</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1599663413063716867?ref_src=twsrc%5Etfw">2022年12月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%BD%BD%BB%FA%A5%AD%A1%BC">十字キー</a>の部分はマトリクス配線になっていたので、キースキャンのロジックを実装する必要がありました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221218/20221218143414.png" width="420" height="353" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>回転ボタンは一見4つキーがあるように見えますが、全部1つのキーとして扱われます。</p> <h1 id="簡易ライブラリの実装">簡易ライブラリの実装</h1> <p>前回の記事で、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>のブロック表示部分のロジックはできていたのですが、右側のスコア表示の部分はまだ処理が作れていませんでした。</p> <p>メモリマップのメモを頼りにこの部分を実装し、<code>setScore(100)</code>みたいな関数で簡単に設定できるようにします。</p> <p>ちなみに、この液晶のスコア表示、右側の00の部分はこれで1つのセグメントとなっており、どうやっても末尾は00としか表示できません。 また、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>坊やの体と、SPEED、LEVELの表示も1つのセグメントとなっており、これらはまとめてON/OFFしかできません。</p> <p>セグメントを節約しつつ表示要素を増やすという涙ぐましい努力なんですかね?</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221218/20221218143204.png" width="495" height="659" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>さらに、前の実験で作ったキースキャンのロジックなどもライブラリとして提供するようにしました。</p> <p>ここまでできると、300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>を使ったゲーム作りが簡単にできるようになります。</p> <h1 id="Flappy-Bird風ゲームの実装">Flappy Bird風ゲームの実装</h1> <p>ということで、かねてからの目的であった、300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>で、自作のゲームを動かす挑戦です。</p> <p>といっても、画面解像度が10×20しかないので、この画面で遊べるゲーム、となるとかなり絞られます。</p> <p>今回はよくあるFlappy Bird風のゲームを作ってみました。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">内蔵を入れ替えた <a href="https://twitter.com/hashtag/%E3%83%80%E3%82%A4%E3%82%BD%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#ダイソー</a> 300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>でFlappyBird風ゲームを自作してみた <a href="https://t.co/Fq70sb3FWy">pic.twitter.com/Fq70sb3FWy</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1603169478870986752?ref_src=twsrc%5Etfw">2022年12月14日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>ボタンを押している間だけ上昇し、離すと重力の影響で下に落ちてしまう磁気を操作し、迫りくる障害物をよけるゲームです。</p> <p>加速度のある動きは、300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の既存のゲームには存在しないので、ちょっと面白いかな?と思いこれを選びました。</p> <p>まぁ、普通に遊べますね。</p> <h1 id="ドット絵エディタ実装とハーフトーンの実験">ドット絵エディタ実装と<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%CF%A1%BC%A5%D5%A5%C8%A1%BC%A5%F3">ハーフトーン</a>の実験</h1> <p>ゲーム以外も何か作れないか?と考えて作ってみたのが、ドット絵エディタです。</p> <p>カーソルキーでポインタを動かして、ドットを打ち込むことが出来ます。 さらに、ONとOFFの中間の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%CF%A1%BC%A5%D5%A5%C8%A1%BC%A5%F3">ハーフトーン</a>の表現もできるようにしてみました。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%CF%A1%BC%A5%D5%A5%C8%A1%BC%A5%F3">ハーフトーン</a>なんて言ってますが、単に高速にON/OFFしているだけです。 一応<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%CF%A1%BC%A5%D5%A5%C8%A1%BC%A5%F3">ハーフトーン</a>の表示はできますが、あまり視認性は良くありませんでした。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ドット絵エディタを実装したので少し遊ぶ。<br>下の列に<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%CF%A1%BC%A5%D5%A5%C8%A1%BC%A5%F3">ハーフトーン</a>を実験してる。<br>まぁできなくはないが視認性が悪い <a href="https://t.co/nNUwFSAME6">pic.twitter.com/nNUwFSAME6</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1603387075058868225?ref_src=twsrc%5Etfw">2022年12月15日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="かんたん作曲ツールの実装">かんたん作曲ツールの実装</h1> <p>もう一つ、ゲーム以外の作例として、かんたん作曲ツールも作ってみました。</p> <p>ドット絵エディタと仕組みはほとんど同じなのですが、並べたドットに対応して音が鳴るというものです。 和音にはまだ対応しておらず、1音のみを8個並べることが出来るだけですが、プログラムを改良すれば、ちょっとした曲作りに使うものは作れそうです。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">かんたん作曲ツールを作ってみた。<br>まだ和音には未対応<br><br>音も聞いてね <a href="https://t.co/95jOZmRYIl">pic.twitter.com/95jOZmRYIl</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1603679985587621888?ref_src=twsrc%5Etfw">2022年12月16日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="DeepSleepの実験">DeepSleepの実験</h1> <p>この300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の筐体には電源の線をON/OFFするスイッチがなく、ON/OFFはモーメンタリなボタン(要は押している間だけ導通するスイッチ)で実現されています。</p> <p>これを再現するには、ATMega328のDeepSleep機能を使うのがよさそうだったので、これを試してみました。</p> <p><a href="https://www.hiramine.com/physicalcomputing/atmega328/sleepbuttonwakeup.html">&#x30B9;&#x30EA;&#x30FC;&#x30D7;&#x3078;&#x306E;&#x79FB;&#x884C;&#x3068;&#x30DC;&#x30BF;&#x30F3;&#x62BC;&#x4E0B;&#x306B;&#x3088;&#x308B;&#x5FA9;&#x5E30;</a> の記事などを参考にしながら、Deep Sleepモードをに移行させてみました。もちろんHT1626の機能もOFFにします。このための命令がHT1626には用意されていたので、ATMega328がスリープする直前に、HT1626も機能をOFFにする命令を発行しています。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">地味だけどDeepSleepの実験をした。<br>電源を落としてる風だけど、Sleepしてるだけで、メモリの内容は保持されてる。<br><br>消費電力などは未測定 <a href="https://t.co/coeifc6eqc">pic.twitter.com/coeifc6eqc</a></p>&mdash; ina_ani@3歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1604339604798468096?ref_src=twsrc%5Etfw">2022年12月18日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>DeepSleepは電源断とは違い、メモリの内容が保持されるので、上の動画のように編集中のドット絵はそのまま保持されています。</p> <p>雑に電力を測定すると、通常起動時は6mA程度、DeepSleep時は0.03mA程度の電流が流れていました。</p> <h1 id="ソフトウェアを作ってみて">ソフトウェアを作ってみて</h1> <p>メイン<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>のATMega328はFlash32K、RAMが2Kと、結構非力な<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ですが、ゲーム開発において、メモリ消費の大半を占めるのがグラフィックスであることを考えると、このゲーム機は画面が10*20しかないので、結構余裕があるように感じます。</p> <p>上記のソフトを作る時もメモリのことはほとんど気にせず、プログラミングして、特に問題は起きていません。</p> <p>ただ、当然その反動として、表現力が非常に低いのは課題です。</p> <p>英字すら2,3文字しか表示できないので、画面に文字で説明を入れることが出来ませんし、この解像度だと、キャ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タも1ドットくらいの表示となるため、ゲームキャ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タの個性なども出すことが出来ません。</p> <p>逆に考えると、この環境で面白いゲームが作れれば、かなり根源的に面白いといえるのでは?という気もします。</p> <p>言うまでもなく<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>はそういったゲームの1つですが、さて、自分はそういうゲームを考え付くことが出来るだろうか?なんて思いながら開発をしていました。</p> <h1 id="まとめ">まとめ</h1> <p>1度は基板の設計ミスで思うように動きませんでしたが、2度目の挑戦で、当初予定していたものが完成し、いくつかのソフトウェアを実装して、遊ぶことが出来ました。</p> <p>300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の改造を通して、多くの知識を得ることができ、また自分の新たなおもちゃが増えました。</p> <p>この知見を活かすと、任意の液晶付きのガジェットを、自分の好きな仕様で動かすことが出来ます。また一つ100円均一ショップに行くのが楽しみになってしまいました。</p> <p>この300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の改造、どの程度読者の方が興味を持っているかわからないのですが、<strong>キットとして頒布する、と言ったら欲しい人いますか?</strong> この記事のコメントや、<a class="keyword" href="https://d.hatena.ne.jp/keyword/Twitter">Twitter</a>( <a href="http://twitter.com/ina_ani">http://twitter.com/ina_ani</a> )などでフィードバックをいただけると、今後の展開を考えるうえでの参考になりますので、よろしくお願いします。</p> inajob 300円テトリスに好きな画像を出すまでの道のり hatenablog://entry/4207112889931113502 2022-10-28T18:27:18+09:00 2024-03-06T12:38:55+09:00 この記事ははJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 この記事の作例もJLCPCBに基板を発注して実現しました。 300円テトリス? 最近は100円均一ショップで電子ゲームが手に入るようになっているようです。 まぁさすがに100円とはいかず、30… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221028/20221028164529.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この記事ははJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV">jlcpcb.com</a></cite> (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>この記事の作例もJLCPCBに基板を発注して実現しました。</p> <h1 id="300円テトリス">300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>?</h1> <p>最近は100円均一ショップで電子ゲームが手に入るようになっているようです。</p> <p>まぁさすがに100円とはいかず、300円のようですが・・</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027160105.png" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>さて、この300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>ですが、好きなゲームをプログラミングして動かせるようにできないものでしょうか?</p> <p>そんな素朴な思いからこのプロジェクトは始まりました。</p> <h1 id="分解してみる">分解してみる</h1> <p>何はともあれ分解してみます。</p> <p>ねじを数本外すだけで簡単に分解できます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027160154.png" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>メインとなる基板はこれで、液晶の後ろに固定されています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027183718.png" width="669" height="892" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>メインの処理はこの黒い樹脂(いわゆるCOB)の中のようです。</p> <p>ここがプログラム可能な<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>などであれば、HACKのしようもあったのかもしれませんが、COBでは手出しができません。</p> <p>液晶と基板の接続は縦方向にのみ信号を通す導電ゴムで、ゼブラコネクタと呼ばれたりするものです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027160457.png" width="565" height="511" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="基板の設計を始める">基板の設計を始める</h1> <p>いつもだいたいこの辺であきらめるのですが、今回はスポンサーもついているので、ちょっと基板を設計してこの300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>を乗っ取るという挑戦をすることにしました。</p> <p>やりたいのは、メイン基板と互換性のあるプログラム可能な基板を作り、ごっそりそれを入れ替えることです。</p> <p>さて、この基板を作るにあたっての作業は意外とたくさんあります。順番に説明していきます。</p> <h1 id="液晶の仕様のリバースエンジニアリング">液晶の仕様の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%EA%A5%D0%A1%BC%A5%B9%A5%A8%A5%F3%A5%B8%A5%CB%A5%A2%A5%EA%A5%F3%A5%B0">リバースエンジニアリング</a></h1> <p>液晶はゼブラコネクタで基板と接続されていますが、どのような信号がやり取りされているか不明です。</p> <p>制御を乗っ取るにあたり、この液晶の仕様を知る必要があります。</p> <p>この液晶はいわゆる「<a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>」と呼ばれるもので、この知識があると解析はそこまで難しいものではありません。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>というのは2極間の電位差が生じていると光を通さなくなるいわゆる「液晶」を使った表示機です。</p> <p>この液晶をセグメントに区切って、数字や、<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>のブロックを表現しているのです。</p> <p>素直にすべてのセグメントに直接配線すると配線数が膨大になってしまうので、マトリクス状に配線されることが多いです。</p> <p>これらの配線はCommonとSegmentと呼ばれたりします。</p> <p>ここまで聞くと、いわゆるドットマトリクスLEDと同じかな、と思うのですが、液晶は電位差を与えれば光を通さなくなるのですが、長く電位が偏った状態が続くと急速に劣化してしまいます。そのためパルスを使って制御する必要があります。</p> <p>この<a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>を制御するパルスの生成は<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>にその機能があるものや、専用ICを使う方法、汎用<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>のGPIOを使い制御する方法などがあります。</p> <p>制御の手法はともかく、ここまでの知識でこの300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>液晶の仕様を解析することにします。</p> <p>ちょうど家に簡易<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AA%A5%B7%A5%ED%A5%B9%A5%B3%A1%BC%A5%D7">オシロスコープ</a>があるので、液晶とゼブラコネクタで接続しているピンに来ている信号を見てみることにします。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B077D3XWHX?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41khVNl4ChL._SL500_.jpg" class="hatena-asin-detail-image" alt="Quimat 2.4&quot;TFT デジタル オシロスコープ(組立完成品) 0-200KHz 5mV/Div-20V/Div感度 プローブ付き 9V DC オ シロスコープ Q15001" title="Quimat 2.4&quot;TFT デジタル オシロスコープ(組立完成品) 0-200KHz 5mV/Div-20V/Div感度 プローブ付き 9V DC オ シロスコープ Q15001"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B077D3XWHX?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Quimat 2.4&quot;TFT デジタル オシロスコープ(組立完成品) 0-200KHz 5mV/Div-20V/Div感度 プローブ付き 9V DC オ シロスコープ Q15001</a></p><ul class="hatena-asin-detail-meta"><li>Quimat</li></ul><a href="https://www.amazon.co.jp/dp/B077D3XWHX?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>接続しているパッドは18個のものが2列、計36個です。</p> <p>おそらくこの36個のパッドがそれぞれ、CommonだったりSegmentだったりするのだと思います。</p> <p>ということで信号を見てみると・・・ピンによって信号は様々なのですが、明らかに傾向が違う2種類のピンがあることがわかりました。</p> <p>10個並んだピンは4段階の電圧を行ったり来たりするようなパルスを出力していました、残りの26ピンは3段階の電圧を行ったり来たりするようなパルスか、もしくは全くパルスが出ていないものでした。</p> <p>Commonと思われる信号 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027182752.png" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>Segumentと思われる信号 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027182730.png" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>の制御の方式はいくつかあるようでデュー<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%A3%A1%BC">ティー</a>やバイアスといったパラメータで表現されるようですが・・・</p> <p>ここではそんな知識はなくとも2種類の信号が出るピンがあったということがわかればまぁOKです。</p> <p>一般的にCommonのピンの方が数が少ないので、おそらくCommonが10ピンと、残りの26ピンがセグメントだと見当がつきました。</p> <p>10*26=260でセグメントの総数としてもおおむね、この300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の画面のセグメント数と一致しそうな雰囲気です。</p> <p>ちなみにこの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の液晶、非常に多くの安価な<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>ゲームで使用されており、右下にかわいい「坊や」がいるので、「<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>坊やの液晶」なんて呼ばれていたりも・・(どこかで聞いた気がするのですが、ソースが見当たらず・・)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221028/20221028163552.png" width="806" height="524" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> (<a href="https://s.click.aliexpress.com/e/_DmWdhkR">https://s.click.aliexpress.com/e/_DmWdhkR</a> から転載)</p> <h1 id="制御方式の決定">制御方式の決定</h1> <p>さて、解析の結果この液晶はCommonが10本、Segmentが26本あることがわかりました。</p> <p>これを制御する仕組みを考えます。<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>で制御するとなると36個信号線が必要で、例えば<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOなどでは足りません。 また仮に信号線が足りたとしても、液晶制御用のパルスを生成するロジックを自前で実装する必要があり、面倒そうです。</p> <p>ということで、今回は専用ICを探すことにします。</p> <p>しかし普通の<a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>制御用のICはCommonが4本や8本のものがほとんどで、それ以上のものがなかなか見つかりませんでした。 あきらめず探していると1つだけありました。それが、Commonが16本利用できるHT1626というICです。</p> <p><a href="https://www.holtek.com/productdetail/-/vg/ht1626">Holtek</a></p> <p>正直16本も不要なのですが、これよりCommonが少ないもの、となると8本のものしかないので仕方がありません。</p> <p>そしてこのIC、足が100本もあります・・ はんだ付けが大変そうです・・</p> <p>まぁともあれこれで制御方式の目途が立ちました。</p> <h1 id="液晶制御とは関係ない部分">液晶制御とは関係ない部分</h1> <p>このボードは液晶制御ICのほかにメインのCPUも搭載しています。</p> <p>今回利用するのは<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>でおなじみのATmega328です。<a class="keyword" href="https://d.hatena.ne.jp/keyword/DIP">DIP</a>の部品だと300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の筐体に入らなそうなので、TQFPパッケージのものを利用します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221028/20221028172358.png" width="903" height="697" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>300円液晶の液晶下にある4つのボタンの入力もこの基板でセンシングします。</p> <p>といっても、ボタンの裏に導電ゴム付きのラバードームがついているので、これが<a class="keyword" href="https://d.hatena.ne.jp/keyword/%C0%DC%BF%A8">接触</a>したら導通するようにくし形のパターンを基板上に露出させればOKです。</p> <p>ここまでの部品は最低2.8Vで動くので、今回はレギュレータを使わず300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>筐体の電池ボックスに入る乾電池2本の3Vを直接繋げて制御することにしました。部品点数も少なくなるので作るのが簡単になります。</p> <h1 id="シンボルフットプリントの作成">シンボル・フットプリントの作成</h1> <p>液晶はゼブラコネクタを介して基板と接続されています。</p> <p>作成する基板にもこのゼブラコネクタに信号を伝えるためのパッドを用意する必要があります。</p> <p>KiCADのフットプリントウィザード(今回初めて存在を知りました)の、FPCコネクタを使って、パッドの数やサイズを合わせて、不要な要素を削除しました。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027011511.png" width="1200" height="689" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>で、できたものが↓です。</p> <p>明るい紫の矩形はソルダーマスク除外の指定です。これをしておかないとソルダーマスクされてしまい、ゼブラコネクタと導通させることが出来ません。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027011655.png" width="543" height="280" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>液晶制御用のHT1626もKiCADのライブラリに存在していないため、モジュールとフットプリントを作る必要があります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027184112.png" width="376" height="347" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>手はんだしやすいようにパッドは長めにしました。</p> <p>液晶下のボタンについても、適切な大きさのくし形のフットプリントの作成が必要です。</p> <p>こちらもフットプリントウィザードの、静電容量タッチセンサーのパターンを少し改造して作りました。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027012315.png" width="1122" height="685" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>こちらもソルダーマスク除外の指定を忘れないようにします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027012152.png" width="496" height="296" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="論理回路図の作成"><a class="keyword" href="https://d.hatena.ne.jp/keyword/%CF%C0%CD%FD%B2%F3%CF%A9">論理回路</a>図の作成</h1> <p>ここまでのところで、利用する部品が決まりました。</p> <p>これらの論理的は配線をKiCADでデザインします。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>制御のためのHT1626は配線は多いですが、ほとんどが液晶のゼブラコネクタに直結なので回路は単純です。</p> <p>基板に間違いがあったときにも、少しでも検証ができるように、液晶のゼブラコネクタ経由での信号線や、HT1626のすべてのピンを拡張端子として引き出しました。 これにより最悪の場合<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D6%A5%EC%A5%A4%A5%AF%A5%A2%A5%A6%A5%C8">ブレイクアウト</a>ボードとして利用できます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027012417.png" width="886" height="691" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="サイズ調整と実体配線図の作成">サイズ調整と実体配線図の作成</h1> <p>この乗っ取り基板は、サイズがとても重要です。</p> <p>ゼブラコネクタ、固定穴、基板サイズが適切でないと、300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の筐体に収めることが出来ません。</p> <p>ということで、本体基板のサイズをあれこれ測って、それをLibreCADにメモしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027012637.png" width="597" height="496" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>このメモしたデータをKiCADにインポートし、これをもとに部品の位置合わせや基板外形をデザインしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027012746.png" width="823" height="640" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>部品の配置が終わったら、配線を行いますが、この部分はFreerouterで自動配線しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027012534.png" width="1068" height="490" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="最終サイズ確認">最終サイズ確認</h1> <p>設計が終わった後、基板データをPDFで出力し、コンビニで印刷したものを、はさみで切り取り、実際の300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の筐体にはめてみて、大きさに問題がないかを念入りに確認しました。</p> <p><figure class="figure-image figure-image-fotolife" title="盛大に穴の位置がずれていることに気付きました。危ない危ない・・"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027183013.png" width="1200" height="1164" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>盛大に穴の位置がずれていることに気付きました。危ない危ない・・</figcaption></figure></p> <h1 id="部品購入">部品購入</h1> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>などは家にすでにあったのですが、今回初めて利用する<a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>制御用のICであるHT1626については、家になかったので、基板発注の前にAliExpressで購入しました。</p> <p>届いてみてびっくり!パッケージが期待したものとは違います。</p> <p>用意していたフットプリントは25×25の100ピンのICだったのですが、実際に届いたものは 30×20ピンのICでした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027183107.png" width="612" height="542" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>調べてみるとHT1626は同じ型番で2種類のデータシートが存在しており、それぞれピンの配置が異なっていることがわかりました。</p> <p>事情は分かりませんが、これは罠でした・・</p> <p>まぁ買ってしまったので今回は30×20ピンを使うこととして、フットプリントを作り直しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027011929.png" width="553" height="498" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>そしてこれ、フットプリントウィザードだとこのような比率が1:1でないパッケージは作れないようで、泣く泣く手で配置しました。 (プログラムでやったほうが良かったなぁ・・)</p> <h1 id="基板発注">基板発注</h1> <p>基板もJLCPCBに発注しました。</p> <p>サイズが10cm角以内だったので非常に安く済みました。</p> <p>5枚で送料も入れて・・$3!! 安いですねー</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027183128.png" width="359" height="221" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="動作確認">動作確認</h1> <p>基板が届いたら早速動作確認です。まずは<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>をはんだ付けして、ICSP端子から<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>を書き込む・・・・</p> <p>全く動きません</p> <p>途方に暮れて、配線を確認すると・・・</p> <p>やっちまいました・・・</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%CF%C0%CD%FD%B2%F3%CF%A9">論理回路</a>図では<a class="keyword" href="https://d.hatena.ne.jp/keyword/DIP">DIP</a>部品用のシンボルを使っていたにもかかわらず、フットプリントをTQFPにしてしまっていたのです・・・</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">さて、この回路、何が間違っているかな?<br>(悲しい・・) <a href="https://t.co/GvRt8xGezB">pic.twitter.com/GvRt8xGezB</a></p>&mdash; ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1582989571515523072?ref_src=twsrc%5Etfw">October 20, 2022</a></blockquote> <p> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>大半の部品がそうであるようにATmega328も<a class="keyword" href="https://d.hatena.ne.jp/keyword/DIP">DIP</a>部品とTQFP部品はピンの番号に対応する役割が違います(そもそもピン数が違います)</p> <p>ということで、この基板にATmega328を搭載して動かすことは難しいことがわかりました・・・</p> <p>悲しいですが気を取り直して、次はHT1626の動作確認です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027183343.png" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>基板上の<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>は前述のように利用できないので、基板の外の<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOから外出ししておいたHT1626の制御用のピンを使って制御してみます。</p> <p>まずは液晶を取り付けずに、メモリに値を書き込み、それが読み取れるかを確認します。</p> <p>(はんだ付け不良があり、何度か失敗したものの・・・)確認できました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027183414.png" width="669" height="892" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>その後300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の液晶を基板に押し付けて確認すると、メモリに対応するセグメントが黒く表示されることが確認でき、この基板がある程度は使い物になることが確認できました。よかった。</p> <blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">筐体に固定できた!<br><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>部分はミスがあったので外から<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOで制御しているが、理論的にはもうできたも同然だ!<br><br>300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の液晶乗っ取りに成功した! <a href="https://t.co/d1o7qEcwbr">pic.twitter.com/d1o7qEcwbr</a></p>&mdash; ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1583111710273339394?ref_src=twsrc%5Etfw">October 20, 2022</a></blockquote> <p> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p> <h1 id="メモリマップの作成">メモリマップの作成</h1> <p>HT1626は内部にメモリを持っており、そのメモリに読み書きすると、メモリ番地に対応したセグメントが黒くなる、という動作をします。</p> <p>今回雑にCommonとSegmentの種別のみを頼りにテキトーに配線したため、300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の画面とメモリの番地が結構おかしなことになっています。</p> <p>ということで、電子ノートを取り出して、メモリ番地と液晶のセグメントの対応をひたすら確認します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027183501.png" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>順にメモリの中身に1を書き込んでいき、メモリ番地をシリアルコンソールに出すプログラムを用意し、液晶を見つつ、セグメントが黒くなった番地をメモすることで、メモリマップを完成させました。</p> <h1 id="デモプログラムの作成">デモプログラムの作成</h1> <p>メモリマップが出来ればあとは、プログラムするだけです。</p> <p>無事、配列に格納したビットマップを300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の液晶に表示することが出来ました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221027/20221027183537.png" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="次にやること">次にやること</h1> <p>取り敢えずこの基板は<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>部分に問題があり、今回は外部の<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOから制御したので、これを修正したいです。 そうなると、基板単体で動作するようになり、300円<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>の筐体内にも収まります。</p> <p>ボタンのセンシングなども行うようにして、オリジナルのゲームを動くようにしてみたいです。</p> <p>ここまでのところで難所は乗り切ったので、おそらくそこまで難しくないはずです。(フラグ?)</p> <h1 id="まとめ">まとめ</h1> <p>小<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A4%B5%A4%A4%A4%B3%A4%ED">さいころ</a>、親に買ってもらってうれしかった手のひらサイズの<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>ゲームですが、まさかこんな形で再会するとは思っていませんでした。</p> <p>あの頃はゲーム機に内蔵されていた<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>ゲームで遊んでいただけだったのに、今やその中身をまるっと入れ替える基板を設計し、独自のプログラムを実行すべく改造していると考えると、結構自分も成長したなぁと感じます。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>の制御に用いたICはピンの間隔が0.65mmと結構細かい上に、100ピンもあったのですが、特に苦労することなくはんだ付けすることが出来たので、今後は臆せずこのサイズのICを使っていく自信がつきました。</p> <p>このプロジェクトはまだ途中なので、また進捗があったら記事を書きます。</p> <h1 id="参考記事">参考記事</h1> <p>無数にWebの記事を参考にしましたが、特に印象に残っている記事をリンクしておきます。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fhackaday.com%2F2022%2F02%2F24%2Fremoticon-2021-joey-castillo-teaches-old-lcds-new-tricks%2F" title="Remoticon 2021 // Joey Castillo Teaches Old LCDs New Tricks" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://hackaday.com/2022/02/24/remoticon-2021-joey-castillo-teaches-old-lcds-new-tricks/">hackaday.com</a></cite></p> <p>チープカシオの液晶を、今回やったのと同じように基板を総とっかえして乗っ取る話。 <a class="keyword" href="https://d.hatena.ne.jp/keyword/Youtube">Youtube</a>動画の中で、CommonとSegmentの見分け方なども詳しく解説されています(英語)</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fawawa.hariko.com%2Favr_lcd_drive.html" title="AVR 汎用I/Oポートで直接LCDを駆動する" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="http://awawa.hariko.com/avr_lcd_drive.html">awawa.hariko.com</a></cite></p> <p>今回はやりませんでしたが、汎用CPUで<a class="keyword" href="https://d.hatena.ne.jp/keyword/LCD">LCD</a>を駆動する方法。 最悪これでできそう、という目途が立ったため、実験に踏み切ることが出来ました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fvalerionew%2Fht1621-7-seg" title="GitHub - valerionew/ht1621-7-seg: arduino library for 7-segment lcd based on ht1621 drivers" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/valerionew/ht1621-7-seg">github.com</a></cite></p> <p>HT1621という、今回使ったICのモデル違い(COMが少ない版)の<a class="keyword" href="https://d.hatena.ne.jp/keyword/Arduino">Arduino</a>用制御コードです。 制御コードを0から作るのは大変だったので、これを参考にしました。</p> <p>基本的な<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%C8%A5%B3%A5%EB">プロトコル</a>はこれとよく似ていますが、アドレス長や、dutyの設定が無かったりと細かい違いがありました。</p> inajob 金属3Dプリントサービスで「焼き印」を作ってみた hatenablog://entry/4207112889925146448 2022-10-07T17:47:01+09:00 2024-03-06T12:39:13+09:00 ※この記事はJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 そんなJLCPCBですが、最近「3Dプリントサービス」を始めたようです。 以前このサービスを使って光造形式の3Dプリントを依頼したことがあります(下の記事です) inajob.hatenabl… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221007/20221007004516.jpg" width="1200" height="628" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>※この記事はJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPV" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPV">jlcpcb.com</a></cite></p> <p>(↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>そんなJLCPCBですが、最近「3Dプリントサービス」を始めたようです。</p> <p>以前このサービスを使って光造形式の3Dプリントを依頼したことがあります(下の記事です)</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fjlcpcb-3dprint-service" title="JLCPCBに3Dプリントを発注してみた - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/jlcpcb-3dprint-service">inajob.hatenablog.jp</a></cite></p> <p>今回は、このサービスの<strong>「金属3Dプリント」</strong>に挑戦してみました。</p> <h1 id="金属3Dプリンターを活用したい">金属<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>を活用したい</h1> <p>家ではなかなかできない金属<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>ですが、こういうサービスがあるなら使ってみたくなるのがMakerというものです。</p> <p>ということで何かを金属3Dプリントしたいのですが、、いざ考えてみると意外と良いネタが思いつきません。</p> <p>メカを作っている人は剛性が必要な部品などを作るのが普通の使い方でしょうが、私は電子工作のエン<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AF%A5%ED%A1%BC%A5%B8%A5%E3">クロージャ</a>に使うことがほとんどで、体積が大きくなりがちで、ちょっとお値段が高くなってしまいますし、また金属を使う必要性もあまり感じられません。</p> <p>ということで、普段作っているものからは離れて、<strong>「なるべく小さめの金属を使った何か」</strong>を考えた結果思いついたのが・・・</p> <p><strong>「焼き印」</strong>です!!</p> <h1 id="焼き印とは">焼き印とは?</h1> <p>自分もあまり詳しくないのですが、蒸しパンとか、パンケーキなどの表面に<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%ED%A5%B4%A5%DE%A1%BC%A5%AF">ロゴマーク</a>やキャ<a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>ターを焼き付けるために使う金属片です。</p> <p>金属片に模様が彫り込まれており、加熱した焼き印を対象物に押し付けることで焦げ目をつけるという単純な仕組みです。</p> <p>おそらくこれは、金属を切削して作るものだと思うのですが、金属3Dプリントでも同じものが作れるのでは?と思いました。</p> <p>しかも、当然好きな模様の焼き印を作ることが出来、3Dプリントサービスを使う意義もあります。</p> <h1 id="デザイン">デザイン</h1> <p>今回もOpenSCADを使って設計しました。</p> <p>筒状の金属片の両端に模様を彫り込み、2種類の模様を使い分けることのできるよう設計しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006232431.png" width="1093" height="791" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>模様は何にしようか迷ったのですが、いつもの「うんこ」マークにすることにしました。 反対側は保険として、「星」マークも用意しました。</p> <p>この金属片にどうにかして柄をつける必要があるので、固定用の穴を側面に開けました。 (この時はまだどうやって固定するか深く考えていませんでした、まぁ穴開けておけば何とかなるだろうと・・)</p> <p>大まかなサイズ感は直径3cm、高さ2.4cmの円柱です。</p> <p>ちなみに、この時に使った「うんこ」は以下のクッキー型を作る時に作ったものです。デジタルファブリケーションはこういうところで素材の流用ができて便利ですね。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Funko-cookie" title="3Dプリンタと無料のツールで「うんこクッキー」を作った - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/unko-cookie">inajob.hatenablog.jp</a></cite></p> <h1 id="発注">発注</h1> <p>発注は以前の光造形の3Dプリントと同じ要領だったので簡単です。</p> <p>ただ、お値段は桁が違います。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006232600.png" width="835" height="400" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>この造形だと$45.06でした、側面の穴を大きくすると値段が安くなったので、この金額は重量というか、金属の体積によるもののようです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006232621.png" width="919" height="361" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>Shipping MethodはOCS Expressを選択すると、$6.82で、総額$51.88で発注できました。</p> <p>ちょっとお値段がはりましたが、焼き印のサイズを小さくしたり、円柱を低くすることで、おそらく半額以下にできそうな気がします。</p> <p>今回は小さすぎて模様がつぶれてしまうことや、金属片が小さすぎて柄をつけることが難しくならないように、十分に大きく設計したのでこのサイズになりました。</p> <p>まぁでもオリジナルの焼き印を作る値段としてはそこまで高くないのではないでしょうか?</p> <h1 id="届いた">届いた!</h1> <p>待つこと1週間程度、届きました!</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006233231.jpg" width="535" height="618" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ずっしりと重たい、うんこ柄の金属片です。 穴も両面の刻印も特に問題なく造形できています。</p> <h1 id="柄をつける">柄をつける</h1> <p>取り敢えず練習で焼きを入れるだけなので、雑に手元にあった木片に針金で固定しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006233246.jpg" width="572" height="405" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>何度も利用する場合にはしっかり固定しないと危ないとは思うのですが、今回は万全の注意を払いつつ利用するということで、仮にこのような形にしました。</p> <h1 id="焼き付けてみる">焼き付けてみる</h1> <p>焼き印に<a class="keyword" href="https://d.hatena.ne.jp/keyword/%BF%A9%CD%D1%CC%FD">食用油</a>を塗り、ガスコンロの火で焼き印を加熱し、適当なタイミングでパンに押し付けてみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006233318.jpg" width="637" height="510" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>何度か試してみたところ・・、全然焼き色がつかない・・ と嘆いていたのですが、どうも焼き付ける時間が短すぎたことが原因だったようです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006233352.jpg" width="637" height="687" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006233404.jpg" width="640" height="853" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>焼き印を押しつけて、1分ほど放置すると・・ いい感じにできました! (普通の焼き印を調べるともっと短い時間でよさそうなことが書いてありますが、私の場合は加熱が足りなかったのかもしれません・・)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006233936.jpg" width="1137" height="853" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>調子に乗って盛り付けも頑張って、カフェのメニュー風にしてみました。いいですね!</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20221006/20221006233440.jpg" width="1137" height="853" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>※食品に利用していますが、安全性についてはよくわかっていませんので真似する際は自己責任でお願いします。</p> <h1 id="まとめ">まとめ</h1> <p>金属3Dプリントサービスを使って「焼き印」を作ってみました。 直径3cmのようなものを大きめに作りましたが$50程度で作ることが出来ました。</p> <p>もう少しうまくやれば半額くらいで作れそうです。</p> <p>柄の取り付けにはさらなる研究が必要そうですが、木材と針金でも何とかなりました。</p> <p>金属3Dプリントサービスは、業務用としては結構使われ始めていますが、自分のような個人が気軽に使えるようになったのはごく最近のことです。</p> <p>皆さんもぜひ金属<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>で何が作れる?というのを考えてみてはいかがでしょう? 世界でもまだ誰も挑戦していないようなネタがあるかもしれません。</p> inajob JLCPCBにEasyEDAからサクッと注文して苦労した話 hatenablog://entry/4207112889911251345 2022-08-29T18:32:53+09:00 2022-08-29T18:32:53+09:00 以下の記事で紹介したJLCPCBですが、今回は王道、基板を発注してみることにします。 inajob.hatenablog.jp ※今回もJLCPCBの提供です。(EasyEDAとJLCPCB周りの不具合の話で、提供していただくのも恐縮だったのですが、問題を含めて記事にして良いということで、今回包み隠さず書いています!) EasyEDAとは? EasyEDAはブラウザ上で動作する基板CADです。 作成した基板を公開することなどもでき、まぁ雑に言うとKiCAD+GitHubみたいなWebサービスです。 まるでネイティブアプリのような操作性で動作する基板CADです このEasyEDAですが、ちょっと… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827220213.jpg" width="600" height="314" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>以下の記事で紹介した<a href="https://jlcpcb.com/JPV">JLCPCB</a>ですが、今回は王道、基板を発注してみることにします。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fjlcpcb-3dprint-service" title="JLCPCBに3Dプリントを発注してみた - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/jlcpcb-3dprint-service">inajob.hatenablog.jp</a></cite></p> <p>※今回も<a href="https://jlcpcb.com/JPV">JLCPCB</a>の提供です。(EasyEDAとJLCPCB周りの不具合の話で、提供していただくのも恐縮だったのですが、問題を含めて記事にして良いということで、今回包み隠さず書いています!)</p> <h1 id="EasyEDAとは">EasyEDAとは?</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827133411.png" width="325" height="82" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><a href="https://easyeda.com/">EasyEDA</a>はブラウザ上で動作する基板CADです。 作成した基板を公開することなどもでき、まぁ雑に言うとKiCAD+<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a>みたいな<a class="keyword" href="http://d.hatena.ne.jp/keyword/Web%A5%B5%A1%BC%A5%D3%A5%B9">Webサービス</a>です。</p> <p><figure class="figure-image figure-image-fotolife" title="まるでネイティブアプリのような操作性で動作する基板CADです"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827144443.png" width="1200" height="446" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>まるでネイティブアプリのような操作性で動作する基板CADです</figcaption></figure></p> <p>このEasyEDAですが、ちょっとUIを見ていると、編集中の基板をそのままJLCPCBに発注できるボタンがあることに気付きました。</p> <p>今回は試していませんが、基板で使用する部品リストをLCSCに発注したり、PCBAを依頼するのも簡単にできるようでした。</p> <h1 id="今回やりたかったこと">今回やりたかったこと</h1> <p>EasyEDAでは様々な基板のデータが公開されています。</p> <p>今回は<strong>基板を設計せずに、人の公開したデータをEasyEDAからJLCPCBにぽちっと発注する</strong>というのを試してみたかったのです。</p> <p>これができると、<strong>基板づくりに詳しくない人も簡単にマージンを取られず原価で基板を作る</strong>ことが出来ます。</p> <p><strong>まぁ、今回の結果は、「そんなに甘くないぞ」というものだったのですが・・・</strong></p> <h1 id="EasyEDAでよさそうなデータを探す">EasyEDAでよさそうなデータを探す</h1> <p>EasyEDAには様々な基板のデータが公開されていますが、いざ自分で「作ってみよう」という観点で探すと意外と良いものが見つかりません</p> <ul> <li>家に、ある程度部品がそろっている <ul> <li>表面実装部品の場合はサイズもある程度合っている必要がある</li> <li>部品リストから型番が明らかでない部品もある</li> <li>部品が細かすぎて家で実装するのが難しいものがある</li> </ul> </li> <li>仕様がある程度公開されている必要がある <ul> <li>さすがに回路図だけではわからない</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>なども公開してあると良い</li> </ul> </li> </ul> <p>とか、色々考えて、みつけたのがこちら!! <strong>(注意!このデータで発注するといろいろ問題があります!!)</strong></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Foshwlab.com%2Foshw%2FGram_Piano_Kit_Open_hardware-X6USQOMJt" title="Gram Piano Kit (Open hardware) - EasyEDA open source hardware lab" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://oshwlab.com/oshw/Gram_Piano_Kit_Open_hardware-X6USQOMJt">oshwlab.com</a></cite></p> <h1 id="Gram-Pianoについて">Gram Pianoについて</h1> <p><figure class="figure-image figure-image-fotolife" title="https://www.sparkfun.com/products/retired/11835 より"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827133529.png" width="882" height="577" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption><a href="https://www.sparkfun.com/products/retired/11835">https://www.sparkfun.com/products/retired/11835</a> より</figcaption></figure></p> <p>これはSparkFunでかつて販売されていたキットのデータをEasyEDAにインポートしたもののようです。</p> <p>モノとしては<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>で作られた静電容量タッチで動作する電子ピアノのような基板です。</p> <p>部品はスルーホール品ばかりで扱いやすそうで、配線も単純で何かあった際の修復も難しくなさそうです。 一方静電容量タッチの部分はPCB基板ならではのアートワークとなっており、ユニバーサル基板では実現の難しい「発注向け」の基板です。</p> <p>販売されていたものですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Creative%20Commons">Creative Commons</a> BY-SA)で基板データが公開されているため、EasyEDAなどで再配布することも問題ないようです。</p> <p>元となる基板データや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>はこちらにありました</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fsparkfun%2FGram_Piano" title="GitHub - sparkfun/Gram_Piano: A keyboard that allows you to play music with capacitive touch inputs." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/sparkfun/Gram_Piano">github.com</a></cite></p> <h1 id="EasyEDAからJLCPCBへの発注">EasyEDAからJLCPCBへの発注</h1> <p>これは非常に簡単でした。</p> <p>EasyEDAはブラウザで動作する基板CADということで、普通のアプリケーションと同じような操作感です。 WebアプリではあるもののUIはパソコン用のアプリケーションと同じようなつくりになっています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827133639.png" width="406" height="228" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827133654.png" width="529" height="185" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827133714.png" width="847" height="549" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>メニューにOne Click Order PCB/SMT という項目があり、ここをクリックするとちょっとした確認画面を挟んだのちにJLCPCBの注文画面に遷移します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827133752.png" width="1200" height="709" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>自分が試したときは、ここでPCBAのオプションが有効になってしまっており、金額が異常に高くなっていましたが、手動でOFFにしました。</p> <p>内部的にはEasyEDAがガーバーファイルを書き出し、それをJLCPCBに送っているようです。</p> <p>ここでガーバーファイルを手元にダウンロードして確認することもできます。 (ここで念入りに確認しておけば・・・後述・・)</p> <p>今回はOCS Expressで送ってもらうことにしました。その他の送料は以下の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A1%BC%A5%F3%A5%B7%A5%E7%A5%C3%A5%C8">スクリーンショット</a>を参考にしてみてください。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827134021.png" width="763" height="586" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>合わせて、今回利用することになる2MΩの抵抗をAliExpressに注文しました。 それ以外の部品は家の部品箱にありました。</p> <h1 id="届いたが">届いた・・が・・</h1> <p>注文してから、10日くらいで基板が届きました。 (DHLを使うともう少し早い気がしますが、今回はAliExpressで注文した部品より早く届いても意味がないのでOCSで十分でした)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827150913.jpg" width="680" height="655" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>さて、基板が届きました。が・・・</p> <p>よくよく基板を見てみると、どうも妙なところがあります・・</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827134810.jpg" width="680" height="671" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>一部の部品のフットプリントが元データから消えているようなのです・・</p> <p>改めてEasyEDAの画面と比べてみると、基板の上の方に位置する部品のいくつかが消えていることが確認できました。</p> <p>これはJLCPCBが悪いのか・・? と思いこの段になってEasyEDAの生成するガーバーファイルを見てみると・・</p> <p>なんと! EasyEDAの生成するガーバーファイルにもこの部品は存在しないことが判明しました。</p> <p><figure class="figure-image figure-image-fotolife" title="手元で入稿したガーバーデータを見た"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827135107.png" width="794" height="649" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>手元で入稿したガーバーデータを見た</figcaption></figure></p> <p>つまり、この問題はEasyEDAに何か問題があって起きており、JLCPCBは、正しく納品したデータで基板を製造していることがわかりました。</p> <p>この Gram_PianoのデータはもともとEagleというソフトの形式で作られていたようでこれをEasyEDAにインポートする際に何か不具合が起きたのではないかと予想しています。</p> <p>タチが悪いことに、EasyEDAの画面上はすべての部品が正常に見えており、ガーバーを出力すると特定の部品が出力できないという問題のようで、ワンクリックの簡単さゆえにわからず発注してしまいました。</p> <p>次回からは、ワンクリックで注文せずにガーバーファイルを一度ダウンロードして目で確認するのが良いと感じました。</p> <h1 id="ファームウェアの用意"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>の用意</h1> <p>とりあえず間違った基板は何とか直すとして、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>を焼きこみ用意する必要があります。</p> <p>コアとなる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/DIP">DIP</a>パッケージのATmega328Pです。 この基板には水晶発振子がないため、<a class="keyword" href="http://d.hatena.ne.jp/keyword/fuse">fuse</a>を設定し内部発振8MHzにします。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/fuse">fuse</a>は<a href="https://www.engbedded.com/fusecalc/">AVR&reg; Fuse Calculator &ndash; The Engbedded Blog</a>で計算しました。 内部発振8MHz、2.7VでBODで、ほかはデフォルト値としました。 (lfuse 0xe2, hfuse 0xd8, efuse 0xfd)</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/fuse">fuse</a>の書き込みには手元にあったft232のbitbangモードを利用しました。</p> <p>自分は昔から<a href="https://make.kosakalab.com/arduino/bootloader/index.html#top">&#x5916;&#x4ED8;&#x3051;AVR&#x30E9;&#x30A4;&#x30BF;&#x7121;&#x3057;&#x3067;Bootloader&#x3092;&#x66F8;&#x304D;&#x8FBC;&#x3080;</a>を参考にしていましたが、かなり情報が古いので、最新のやり方を使うのが良いと思います。</p> <p>上のページではft232のbitbangモードをサポートした独自ビルドのavrdudeを利用していますが、現在配布されている<a href="https://github.com/avrdudes/avrdude">avrdudeの公式(v7.0)</a>ではこれがサポートされているので、公式のavrdudeを使うことが出来ます。</p> <p>また上記ページでは独自の<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>ツールを使って書き込みしていますが、avrdudeを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>から使うのであれば、この<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>ツールは不要です。</p> <p>ということで、参考になるのはft232とATmega328Pの接続の配線くらいです。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/fuse">fuse</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を書き込む方法としては、ほかにも<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を書き込み機にする方法や、純正のAVRライターを使う方法などもあります。 (手軽なのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を書き込み機にする方法だと思います)</p> <p>一応メモ的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>を書いておくと・・(これを間違えるとATmega328Pが普通に動かなくなり、元に戻せなくなることもあるので注意してください)</p> <pre class="code" data-lang="" data-unlink># COMポート番号などは必要に応じて書き換えてください # fuseの読み出し(はじめは低速じゃないと読めないかも・・) &gt; avrdude -PCOM8 -c diecimila -p m328p -b19200 -U lfuse:r:con:h -U hfuse:r:con:h -U efuse:r:con:h # fuseの書き込み &gt; avrdude -PCOM8 -c diecimila -p m328p -b19200 -U lfuse:w:0xE2:m -U hfuse:w:0xD8:m -U efuse:w:0xFD:m</pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>は<a href="https://github.com/arduino/ArduinoCore-avr/blob/master/bootloaders/atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex">ArduinoCore-avr/ATmegaBOOT_168_atmega328_pro_8MHz.hex at master &middot; arduino/ArduinoCore-avr &middot; GitHub</a>を利用しました。</p> <p>これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> Pro Mini 328 3.3V 8MHz用のものです。</p> <p>hexファイルの書き込み方はこんな感じ</p> <pre class="code" data-lang="" data-unlink>&gt; avrdude -PCOM8 -c diecimila -p m328p -b19200 -U flash:w:ATmegaBOOT_168_atmega328_pro_8MHz.hex:i</pre> <p>ここまで書き込みをすると、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>としてシリアル書き込みができるようになるので、ATmega328PのTX, RX, RESETを USBシリアル変換モジュールとつなげて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>用のスケッチを書き込めるようになります。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>はGram_Pianoの<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>にinoファイルがあるので、これをそのまま利用します。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>+書き込みを実行します。</p> <p>ライブラリとしてCapacitiveSensorをインストールする必要がありました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>のライブラリマネージャから最新の0.5.1をインストールすれば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>できました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827140251.png" width="777" height="210" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>内部発振の場合シリアル通信が不安定で、書き込みがうまくいかないことがありますが、まぁそういうものなので、何度か挑戦しました。(運が悪いと100%失敗する個体もあると思います)</p> <p>このあたりの話は、以下の記事に詳しく書きました。意外とこの作業は過去の知識の集大成という感じがあります。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2F2020%2F03%2F15%2Farduino-internal-clock" title="Arduinoを内部発振器で動かす時の誤差とその補正について - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/2020/03/15/arduino-internal-clock">inajob.hatenablog.jp</a></cite></p> <h1 id="部費の実装と基板の修復">部費の実装と基板の修復</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%C0%CD%FD%B2%F3%CF%A9">論理回路</a>図や正しい回路図があるので、それを正として基板を修復します。</p> <p>Gram_Pianoは部品数も少なく、ほとんどがATmega328PのICの足と部品がつながっているだけなので、フットプリントが消えてしまった部品は、ICの足と直接はんだ付けすることにしました。</p> <p><figure class="figure-image figure-image-fotolife" title="頑張って配線しました"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827144115.jpg" width="785" height="637" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>頑張って配線しました</figcaption></figure></p> <p>初めは基板に追加でドリルで穴をあけて、とりあえず部品を固定していたのですが、スルーホール穴ではないのではんだ付けすることが出来ず、あまり意味がないと感じたので途中でやめました。</p> <p><figure class="figure-image figure-image-fotolife" title="ドリルで穴をあけ、基板をやすりがけして、はんだ付けしたが、これは大変です・・"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827143722.jpg" width="637" height="551" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ドリルで穴をあけ、基板をやすりがけして、はんだ付けしたが、これは大変です・・</figcaption></figure></p> <p>Gram Pianoの肝である回路として構成されているタッチセンサー部分は消失していなったのが幸いし、比較的簡単に基板を修復できました。</p> <p>電池の固定用の部品は手元にあったのですが、部品消失の影響で利用できないため、外付けの電池ボックスを使うことにしました。もともと単三電池2本の3V駆動だったのですが、部品を見る限り電池4本の6Vでも動作しそうだったので、手元にちょうどあった単4電池4本用の電池ボックスを使うことにしました。</p> <p>スピーカーはフットプリントが消失していることに加えて、同じ部品が手元になかったので、適当なスピーカーをICに直接繋げました。</p> <h1 id="試運転">試運転</h1> <p>部品を一通り実装して、電源を入れたら・・・ 何度か試行錯誤があったものの・・(静電容量センサーの1つだけが部品消失の影響を受けており、微妙な調整が必要でした・・)</p> <p>期待通り動きました!</p> <p><figure class="figure-image figure-image-fotolife" title="これはArduinoから電源をもらって動作させている"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827144234.jpg" width="1132" height="849" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>から電源をもらって動作させている</figcaption></figure></p> <p>基板のタッチで操作できるというのは不思議な感覚です。</p> <h1 id="ケースの作成">ケースの作成</h1> <p>ここまで来たら後は好きな改造をしていきます。</p> <p>電池ボックスやスピーカーを外付けのパーツにしたこと、フットプリントが消失した部品を無理やり実装しているため、部品が外れやすくなっていることから、ケースが欲しくなりました。</p> <p>ということで、OpenSCADでササっとケースを作ることにしました。</p> <p><figure class="figure-image figure-image-fotolife" title="こういう単純な形はOpenSCADで作るのが楽です"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827144338.png" width="1093" height="593" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>こういう単純な形はOpenSCADで作るのが楽です</figcaption></figure></p> <p>我が家には<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>があるので、ちょちょいの・・・ちょい!</p> <p>配線は雑な感じですが、、</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827183149.jpg" width="680" height="906" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>出来ました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220827/20220827183119.jpg" width="1132" height="849" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="演奏動画">演奏動画</h1> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">My new gear?<br>何とか動いた!<br><br>AdafruitのGram Pianoという<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>の電子楽器です。<br><br>制作記事は来週公開予定!<br><br>Powered by <a href="https://twitter.com/hashtag/JLCPCB?src=hash&amp;ref_src=twsrc%5Etfw">#JLCPCB</a> <a href="https://t.co/cX1d6UnGYx">pic.twitter.com/cX1d6UnGYx</a></p>&mdash; ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1563457480965103617?ref_src=twsrc%5Etfw">2022年8月27日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1 id="まとめ">まとめ</h1> <p>ということで、思ったよりもてこずりましたが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>ハードウェアのGram PianoをJLCPCBに発注し、手元で組み立て、動作させることが出来ました。</p> <p>まぁ、こういうトラブルもあるので、最悪の場合、自分でも作れそうな基板に挑戦するのが無難だと感じました。</p> <p>仕様がオープンでも、電子パーツの互換性に関する知識や、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>の書き込みの知識、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D6%A5%EB%A5%B7%A5%E5%A1%BC%A5%C6%A5%A3%A5%F3%A5%B0">トラブルシューティング</a>の知識などがないと、基板だけあってもモノを作ることが出来ないと、身をもって体感しました。</p> <p>逆に考えると、人の作った基板を組み立てることで、強制的に知らなかった知識をインプットする必要性が出てくるので、ちょっと背伸びして勉強したい人などにお勧めです。</p> inajob ESPboyというオープンソースの携帯ゲーム機を日本用に再設計してみた hatenablog://entry/4207112889908291324 2022-08-13T15:39:30+09:00 2022-08-13T15:39:30+09:00 ESPboyとは ESPboy ESPboyはESP8266をコアとする携帯ゲーム機です。 オープンソースハードウェアとして開発が進められており、回路図を参照することで誰でも同じ仕様のESPboyを作ることが出来ます。 また完成済みの製品も販売されています。 (後述しますが、これらの製品は日本で利用するには問題があります) こちらは初代バージョンで$75です。 www.tindie.com こちらは改良版で$95です。筐体が違うだけで中の回路は論理的に等価です。 www.tindie.com ESPboyで遊べるゲームは、いくつかに分類することが出来ます まずはインディーズ携帯ゲーム機であるA… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813150506.jpg" width="600" height="314" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="ESPboyとは">ESPboyとは</h1> <p><a href="https://www.espboy.com/">ESPboy</a></p> <p>ESPboyはESP8266をコアとする携帯ゲーム機です。</p> <p><strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>ハードウェア</strong>として開発が進められており、回路図を参照することで誰でも同じ仕様のESPboyを作ることが出来ます。</p> <p>また完成済みの製品も販売されています。 (後述しますが、これらの製品は<strong>日本で利用するには問題があります</strong>)</p> <p>こちらは初代バージョンで$75です。 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.tindie.com%2Fproducts%2Fespboy%2Fespboy-the-ultimate-multi-gadget%2F" title="ESPboy - the ultimate multi-gadget by ESPboy on Tindie" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.tindie.com/products/espboy/espboy-the-ultimate-multi-gadget/">www.tindie.com</a></cite></p> <p>こちらは改良版で$95です。筐体が違うだけで中の回路は論理的に等価です。 <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.tindie.com%2Fproducts%2Fespboy%2Fespboy2-retro-gaming-and-software-dev-multi-tool%2F" title="ESPboy2 - retro gaming and software dev multi-tool by ESPboy on Tindie" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.tindie.com/products/espboy/espboy2-retro-gaming-and-software-dev-multi-tool/">www.tindie.com</a></cite></p> <p>ESPboyで遊べるゲームは、いくつかに分類することが出来ます</p> <p>まずはインディーズ携帯ゲーム機である<a href="https://www.arduboy.com/">Arduboy</a>、<a href="https://www.pokitto.com/">Pokitto</a>、<a href="https://gamebuino.com/">Gamebuino META</a>などのゲームです。 あまり耳なじみがないかもしれませんが、これらは最近この界隈では有名な(?)携帯ゲーム機です。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B097B2WWMG?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/315b0fqky+S._SL500_.jpg" class="hatena-asin-detail-image" alt="Arduboy FX オープンソース カードサイズ ゲームボード" title="Arduboy FX オープンソース カードサイズ ゲームボード"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B097B2WWMG?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Arduboy FX オープンソース カードサイズ ゲームボード</a></p><ul class="hatena-asin-detail-meta"><li>Seeedstudio</li></ul><a href="https://www.amazon.co.jp/dp/B097B2WWMG?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B07CMF4ZYV?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/412oBMgEMUL._SL500_.jpg" class="hatena-asin-detail-image" alt="Gamebuino Meta - レトロなポータブルゲームコンソールで、C ++とPythonでコードを書くことを学び、あなた自身のビデオゲームを作成します。フランス製(スターター)" title="Gamebuino Meta - レトロなポータブルゲームコンソールで、C ++とPythonでコードを書くことを学び、あなた自身のビデオゲームを作成します。フランス製(スターター)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B07CMF4ZYV?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Gamebuino Meta - レトロなポータブルゲームコンソールで、C ++とPythonでコードを書くことを学び、あなた自身のビデオゲームを作成します。フランス製(スターター)</a></p><ul class="hatena-asin-detail-meta"><li>Gamebuino</li></ul><a href="https://www.amazon.co.jp/dp/B07CMF4ZYV?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>これらのゲームはバイナリ互換というわけではなく、ESPboy用に移植された各ゲーム機の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>があるので、それを使って再<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>したものが遊べます。ゲームによってはハードウェア固有の機能を活用しているものもあり、そういったゲームはそのまま移植することが出来ない点に注意が必要です。</p> <p>もう一つは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%C8%A5%ED%A5%B2%A1%BC%A5%E0">レトロゲーム</a>機、パソコン用のゲームです</p> <p>ZX spectrum 48k, <a class="keyword" href="http://d.hatena.ne.jp/keyword/GameBoy">GameBoy</a>, Chip8/Schipの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%DF%A5%E5%A5%EC%A1%BC%A5%BF">エミュレータ</a>が動作し、それらのプラットフォームで動くゲームを遊ぶことが出来ます。</p> <p>最後が、ESPboy専用に作られたゲームです。</p> <p>まだ数は少ないですがESPboyの性能をフルに活用したゲームを遊ぶことが出来ます。 もちろんゲーム開発用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>も<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>なので、ゲームを自作することもできます。</p> <p>後述する<a href="https://espboy.m1cr0lab.com/demo/appstore/">Web App Store</a>の画面からもいくつかのゲームの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A1%BC%A5%F3%A5%B7%A5%E7%A5%C3%A5%C8">スクリーンショット</a>を見ることが出来ます。</p> <h1 id="なぜ自作したのか">なぜ自作したのか?</h1> <p>まぁ、<strong>そこに回路図があったからだ!</strong>というのも大きいのですが、一番の理由は<strong>「販売されているESPboyを日本で使うことが出来ない」</strong>からです。</p> <p>どういうことかというと、販売されているESPboyに搭載されているESP8266のモジュールに<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>がついていない</strong>のです。</p> <p>もちろん特例申請を使ったりすることで、一時的に日本で使うことはできそうですが、そういったものを人に勧めることも難しく、いまいち購入する気にはなりませんでした。</p> <p>しかしESP8266を使ったモジュールの中には<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>のついた、日本でも利用できる「<a class="keyword" href="http://d.hatena.ne.jp/keyword/ESP-WROOM-02">ESP-WROOM-02</a>」というモジュールが存在します。ESP8266というコアのICは同じなので、うまく設計すれば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>ありのESPboyが作れるのでは? と思いついたのが自作を始めたきっかけです。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0114ACUXO?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41CiwbfmkQL._SL500_.jpg" class="hatena-asin-detail-image" alt="ESP-WROOM-02 Wi-Fiモジュール(フラッシュ2MB)" title="ESP-WROOM-02 Wi-Fiモジュール(フラッシュ2MB)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0114ACUXO?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">ESP-WROOM-02 Wi-Fiモジュール(フラッシュ2MB)</a></p><ul class="hatena-asin-detail-meta"><li>スイッチサイエンス</li></ul><a href="https://www.amazon.co.jp/dp/B0114ACUXO?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h1 id="回路図を作る">回路図を作る</h1> <p>まぁこういう時はブレッドボードから、作るのが鉄則なのですが、最近は基板づくりも安くできるようになっているので、<strong>いきなり基板を発注してみる</strong>ことにしました。</p> <p>まずは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%C0%CD%FD%B2%F3%CF%A9">論理回路</a>図を設計します。</p> <p>と言ってもESPboyは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>ハードウェアなので、本家の設計を参考にすることが出来ます。</p> <p>大まかな構成図は公式ページの下の方に掲載されています。</p> <p><figure class="figure-image figure-image-fotolife" title="espboy.comから転載"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813133538.png" width="673" height="531" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>espboy.comから転載</figcaption></figure></p> <p>さらに詳しい回路図はこちらのページにあります。</p> <p><a href="https://oshwlab.com/ESPboy/espboy_v4-3">ESPboy_v4.3 - EasyEDA open source hardware lab</a></p> <p>この回路図にはLOLIN-ESP8266というモジュールが存在しており、今回はこのモジュールが使えないのでこの中身も知りたいところです。</p> <p>その回路図はここで見つけました。 <a href="https://www.wemos.cc/en/latest/d1/d1_mini.html">LOLIN D1 mini &mdash; WEMOS documentation</a></p> <p>このモジュールはESP8266を搭載し、USB端子からシリアル接続で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>として書き込みができるというものです。</p> <p>LOLIN-ESP8266と同等の機能を持った<a class="keyword" href="http://d.hatena.ne.jp/keyword/ESP-WROOM-02">ESP-WROOM-02</a>を搭載したモジュールとしては <a href="https://www.switch-science.com/catalog/2500/">ESPr&reg; Developer&#xFF08;ESP-WROOM-02&#x958B;&#x767A;&#x30DC;&#x30FC;&#x30C9;&#xFF09; - &#x30B9;&#x30A4;&#x30C3;&#x30C1;&#x30B5;&#x30A4;&#x30A8;&#x30F3;&#x30B9;</a> がよさそうですが、今回は回路図もあるので、このモジュールの部分も自作基板に含めることにしました。</p> <p>こうして出来上がったのがこの回路図です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813135006.png" width="956" height="710" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> (元のESPboyのライセンスに従って <a class="keyword" href="http://d.hatena.ne.jp/keyword/CERN">CERN</a> Open Hardware License とします) (このライセンスは本当は、さらに細かい区分があるようなので、ESPboyではどれに該当するのか聞いています・・)</p> <p>USBシリアル変換はCH340G、自動リセット回路などに2回路入り<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%F3%A5%B8%A5%B9%A5%BF">トランジスタ</a>UMH3Nを利用しています。</p> <p>LiPoバッテリーの充電に関しては、自分で実装せずに出来合いのモジュールを使うことにします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813151513.png" width="338" height="351" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="部品の購入">部品の購入</h1> <p>大半の部品は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A9%B7%EE%C5%C5%BB%D2">秋月電子</a>で購入しました。コアのモジュールであるESP8266、<a class="keyword" href="http://d.hatena.ne.jp/keyword/DAC">DAC</a>であるMCP4725や、I/OエキスパンダのMCP23017/SP、フルカラーLEDのWS2812Bなども<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A9%B7%EE%C5%C5%BB%D2">秋月電子</a>で扱っていました。</p> <p>USB Micro端子、AP1117-3.3、UMH3N、<a class="keyword" href="http://d.hatena.ne.jp/keyword/TFT">TFT</a>液晶、ボリューム、タクトスイッチ、スピーカー、LiPoバッテリー充電モジュールなどは、日本でも購入できるかもしれませんが、AliExpressで購入しました。</p> <p>液晶モジュールはESPboyと同じものを利用しないと、初期化コードなどが異なりバイナリ互換がなくなってしまうので注意が必要です。</p> <h1 id="配線図の作成">配線図の作成</h1> <p>ちょちょいのちょいで・・・とはいかず、色々と試行錯誤しました。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/ESP-WROOM-02">ESP-WROOM-02</a>のアンテナ部分には配線を通していけないようなので、Keep Outゾーンとしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813141108.png" width="904" height="779" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813141303.png" width="443" height="641" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="基板の発注">基板の発注</h1> <p>今回の基板は<a href="https://www.allpcb.com/">ALLPCB</a>に発注しました。というか発注したのは去年の12月ごろです。 そしてあれから半年程度、この基板は積まれていたのです・・・ いや、子育てとかいろいろ忙しくてですね・・(言い訳)</p> <p>送料込みでこんなお値段。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813151913.png" width="1047" height="149" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="部品の実装">部品の実装</h1> <p>この基板は表面実装部品ばかりで構成したので、実装も少し苦労しました。</p> <p>ピッチの狭いICであるUMH3NやMCP3725も6ピンのパッケージで真ん中、左右の順に足を固定すれば手はんだでも実装できました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813144943.png" width="1024" height="919" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>一番気を遣ったのはMicro USB端子です、これはホットエアーガンを使って実装しました。(まぁ<a href="https://inajob.github.io/hachibar/">HACHIBAR</a>で何度も実装したのでコツはなんとなくつかんでいました)</p> <h1 id="書き込みテスト">書き込みテスト</h1> <p>ESPboyはソフトウェアのデプロイ周りも充実しています。</p> <p>まずは<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/Web%A5%D6%A5%E9%A5%A6%A5%B6">Webブラウザ</a>から書き込みできる Web <a class="keyword" href="http://d.hatena.ne.jp/keyword/App%20Store">App Store</a></strong>というものがあります。ブラウザからゲームを選んで、書き込みボタンを押すだけでESPboyにゲームをインストールできます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813145028.png" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>もう一つは<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>経由でアプリをダウンロードできる<a class="keyword" href="http://d.hatena.ne.jp/keyword/App%20Store">App Store</a>です</strong>。これはゲーム機同時にBボタンを押しっぱなしにすることで起動します。初期設定は<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSID">SSID</a>やパスワードの入力が必要ですが、一度設定すると記憶されます。 一度設定するとインターネット上のAppStoreサーバからゲームの一覧を取得でき、そこからゲームをインストールすることが出来ます。まるで<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone">iPhone</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Android">Android</a>のようです!(大げさ)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813145059.png" width="704" height="938" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="ケースの作成">ケースの作成</h1> <p>ここまでで、一応動くゲーム機にはなりましたが、<strong>基板がむき出しで遊びづらい</strong>です。</p> <p>ということで<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>でケースを作ります。</p> <p>今回は<a href="https://www.freecadweb.org/?lang=ja">FreeCAD</a>で設計しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813143713.png" width="527" height="502" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>(ディスプレイ固定具用のデータがあったのですが、保存せずに終了して失われてしまいました・・無念)</p> <p>我が家には<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>があるので、精度はともかく、ササっとプロトタイピングが出来て良いです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220813/20220813145213.png" width="704" height="938" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ということでひとまず、そこそこ遊べるESPboy端末が出来ました。</p> <h1 id="まとめ">まとめ</h1> <p>ということで、日本でも利用できるESPboyを作ることが出来ました。</p> <p>基板製造、3Dプリント、AliExpressでの部品発注、ESP8266でのプログラミングなど、ここまでで得た知識を組み合わせることで、一つの製品を設計、開発できました。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>ハードウェアを参考に、少し自分用に手を加えて自分のオリジナルのガジェットを作るというのは、非常に面白いので、腕の覚えのある方はぜひ挑戦してみてください。</p> <p>また、ここで作った基板が数枚余っていますので、もしほしい人がいたら連絡ください。 (可能なら、ボツ基板交換的なノリで、何か自作の面白い基板と交換してもらえると嬉しいです。 私が提供できるボツ基板は<a href="https://scrapbox.io/inajob/%E3%83%9C%E3%83%84%E5%9F%BA%E6%9D%BF">こちらにまとめています。</a>)</p> inajob かんたんUSBホストを試してみた hatenablog://entry/4207112889902404863 2022-07-26T09:14:35+09:00 2022-07-26T09:14:35+09:00 かんたんUSBホストとは 文字通り簡単にUSBホスト機能を実現するためのモジュールです。 かんたんUSBホスト、サポートページから抜粋 ArduinoなどのマイコンボードでUSBホスト(USB機器に対する「親」)を実現するためには、ちょっと工夫が必要です。 よく目にするのはUSB Host Shieldを使う作例です。 USB Host Shieldは汎用的なUSBホストを実現するためのモジュールで、様々な用途で利用できる反面、使い方が簡単とは言えません。 一方で今回紹介する「かんたんUSBホスト」はUSB接続のキーボードの制御に特化することで非常に簡単に利用できるのが特徴です。 (かんたんU… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220725/20220725110446.jpg" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="かんたんUSBホストとは">かんたんUSBホストとは</h1> <p>文字通り簡単にUSBホスト機能を実現するためのモジュールです。</p> <p><figure class="figure-image figure-image-fotolife" title="かんたんUSBホスト、サポートページから抜粋"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220725/20220725110552.png" width="737" height="712" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>かんたんUSBホスト、サポートページから抜粋</figcaption></figure></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>などの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>ボードでUSBホスト(USB機器に対する「親」)を実現するためには、ちょっと工夫が必要です。</p> <p>よく目にするのはUSB Host Shieldを使う作例です。</p> <p>USB Host Shieldは汎用的なUSBホストを実現するためのモジュールで、様々な用途で利用できる反面、使い方が簡単とは言えません。</p> <p>一方で今回紹介する「かんたんUSBホスト」はUSB接続のキーボードの制御に特化することで非常に簡単に利用できるのが特徴です。</p> <p>(かんたんUSBホストの作者さんとは、知り合いで、実は以前に「かんたんUSBホスト」を頂いたのです。と言っても1年以上前のことで、折角頂いたのに「積み基板」となってしまっておりました・・、積んではいかんですね、ほかにも結構積んでいるので順番に試食していこうと思います。)</p> <h1 id="使い方">使い方</h1> <p>かんたんUSBホストは様々なオプションがあり、細かく制御することもできますが、まずはじめとしては、一番簡単な方法を見てみましょう。</p> <p>GNDとVCCとVBUS、TX→RXの4つの配線をするだけです。</p> <p><figure class="figure-image figure-image-fotolife" title="かんたんUSBホスト説明書より抜粋"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220725/20220725104449.png" width="248" height="226" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>かんたんUSBホスト説明書より抜粋</figcaption></figure></p> <p>これで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>のシリアル入力として簡単USBホストを利用することができます。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>は書き込みにシリアル入力を利用するので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>を書き込む際はTX→RXの配線を一時的に抜く必要があることに注意してください。 (SoftwareSerialなどで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>のハードウェアシリアルとは違うピンを利用してかんたんUSBホストと接続することで、この問題は解消できます。)</p> <p>あとは簡単USBホストにキーボードを接続し9600bpsでシリアルポートを読み取れば、押したキーのキーコードが取得できます。</p> <h1 id="簡易ワープロを作ってみる">簡易<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%D7%A5%ED">ワープロ</a>を作ってみる</h1> <p>さて、実際の動作を試しがてら、ちょっとした作品を作ってみましょう。</p> <p>作ったのはキーボードから入力した文字をディスプレイに表示する、というまぁ、これだけなんですが、いうなれば「簡易<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%D7%A5%ED">ワープロ</a>」です。</p> <p>ディスプレイとして利用するのは、たまたま家にあった、ちょっと大きめのOLEDです。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B095PW52VN?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41ptPPZWq9L._SL500_.jpg" class="hatena-asin-detail-image" alt="OLEDディスプレイモジュール、SSD1309 I2C SPIパラレルインターフェース用2.42インチOLEDディスプレイモジュール128X64(ホワイトテキスト)、ディスプレイASCIIおよびグラフィックに最適" title="OLEDディスプレイモジュール、SSD1309 I2C SPIパラレルインターフェース用2.42インチOLEDディスプレイモジュール128X64(ホワイトテキスト)、ディスプレイASCIIおよびグラフィックに最適"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B095PW52VN?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">OLEDディスプレイモジュール、SSD1309 I2C SPIパラレルインターフェース用2.42インチOLEDディスプレイモジュール128X64(ホワイトテキスト)、ディスプレイASCIIおよびグラフィックに最適</a></p><ul class="hatena-asin-detail-meta"><li>Liccx</li></ul><a href="https://www.amazon.co.jp/dp/B095PW52VN?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>大きさの割には解像度は128x64とかわいらしく、ノスタルジックな見た目となっています。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「かんたんUSBホスト」を使って簡易<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%D7%A5%ED">ワープロ</a>を組んでみた。<br><br>名前通りものすごく簡単に作れた。<br>—-<br>かんたんUSBホストはこちら↓<a href="https://t.co/J5IzjaRWsJ">https://t.co/J5IzjaRWsJ</a> <a href="https://t.co/jlmSvhmVQC">pic.twitter.com/jlmSvhmVQC</a></p>&mdash; ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1551196681399840769?ref_src=twsrc%5Etfw">2022年7月24日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>このOLEDの制御は定番のu8g2ライブラリを利用します。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>はこんな感じです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220725/20220725102046.png" width="598" height="508" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ほとんどがOLEDの制御コードで、かんたんUSBホストの制御は初期化と、キーの読み取りの部分だけです。</p> <p>「簡易」という事で本当に最低限の動きしかしませんが、それでもここまで簡単に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A1%BC%A5%D7%A5%ED">ワープロ</a>もどきが作れるのは楽しいです。</p> <h1 id="かんたん-以外に出来る事">かんたん 以外に出来る事</h1> <p>ここまで紹介してきたように、かんたんUSBホストは、かんたんにUSB接続のキーボード入力を得ることができますが、ほかにも様々な機能があります。</p> <p>説明書から少しかいつまんで紹介すると・・</p> <ul> <li>キー配列をJIS、USで切り替える</li> <li>CapsLockなどを設定する</li> <li>キーリピートの間隔を調節する</li> <li>特定キーの組み合わせに反応する</li> <li>シリアル接続のボーレートの変更</li> </ul> <p>他にも、制御とは関係ないところで以下のような機能も搭載しています</p> <ul> <li>USB Hub経由でのキーボードの接続</li> <li>動作中のキーボードの抜き差しへの対応</li> <li>キーリピート</li> </ul> <h1 id="USB-Host-Shieldとの違い">USB Host Shieldとの違い</h1> <p>USB Host Shieldはキーボードに特化していないため、キーボード固有の処理は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>側で実装する必要があります。CapsLockやNumLock, キーコードとASCIIコードとの変換、キーリピートの処理、などなど、実装コストも大きくなるし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>の限られたメモリを消費します。</p> <p>また巷に出回っているMini USB Host Shieldはちょっと癖のある基板で、5VのArdunoで利用するためには謎の改造をする必要があったりと、使い勝手も悪いです。</p> <p>そもそもUSB Host ShieldのコアとなっているMAX3421Eは、かんたんUSBホストのコアとなっているCH559と比べ高額なので、自然とそれを採用したボードの価格も高くなってしまいます。</p> <p>などなど、これらの理由により、USB接続のキーボードを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>から利用する場合はかんたんUSBホストに軍配が上がりそうです。</p> <p>一方で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%E0%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9">ゲームコントローラ</a>や、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>ドングル、USB-<a class="keyword" href="http://d.hatena.ne.jp/keyword/MIDI">MIDI</a>など、キーボード以外のUSB機器を利用する場面ではUSB Host Shieldが適していることもあると思います。(CH559でもこれらに対応した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>を作れば安価に対応できそうですが、作例もなく、いばらの道のように思います)</p> <h1 id="中身について">中身について</h1> <p>このかんたんUSBホストですが、コアとなる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>がCH559という、中国製のICです。</p> <p>USB Host、Deviceの機能を持つ汎用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>にもかかわらず、比較的安価ですが、昨今の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>不足の影響をあまり受けず、現在も簡単に入手できます。</p> <p>最近<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>部不足が深刻になっており、様々な汎用ICの在庫がなくなる中、でこれらの中国製のICはア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%C1%A5%E5%A5%A2">マチュア</a>電子工作愛好家の間で、にわかに脚光を浴びています。</p> <p>そんなトレンドに興味のあるMakerにとってもこのモジュールは魅力的だと思います。</p> <p>かんたんUSBホストの作者の方が、CH559に関する開発周りの知見を惜しげもなく公開されており、こちらの資料も必見です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fq61.org%2Fblog%2F2021%2F08%2F02%2Fdeveloping-with-ch559%2F" title="格安USBホストマイコン CH559をいじってみた(大盛) - q61.org blog" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://q61.org/blog/2021/08/02/developing-with-ch559/">q61.org</a></cite></p> <h1 id="まとめ">まとめ</h1> <p>かんたんUSBホストは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>でキーボード入力をサポートしたいときには非常に有用なモジュールです。</p> <p>USB、キーボード周りの面倒な処理のほとんどをこのモジュールが処理してくれるため、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>側に余計な実装をする必要がなく、省メモリ、省実装コストを実現できます。</p> <p>気になった方はスイッチサイエンス、BOOTHなどで購入できます。(同人ハードウェアの為、在庫はそんなにないかもしれません、気になったときが買い時ですよ!)</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.switch-science.com%2Fcatalog%2F7280%2F" title="USBキーボード→UART変換「かんたんUSBホスト」 - スイッチサイエンス" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.switch-science.com/catalog/7280/">www.switch-science.com</a></cite> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fq61.booth.pm%2Fitems%2F3028242" title="かんたんUSBホスト(HIDキーボード用) - 黒井電波 on booth - BOOTH" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://q61.booth.pm/items/3028242">q61.booth.pm</a></cite></p> inajob JLCPCBに3Dプリントを発注してみた hatenablog://entry/4207112889899334323 2022-07-18T13:38:52+09:00 2024-03-06T12:39:53+09:00 ※この記事はJLCPCBの提供でお送りします。 JLCPCBとは jlcpcb.com (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。) JLCPCBとは、プリント基板製造などで有名な香港の企業です。 日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。 値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。 そんなJLCPCBですが、最近「3Dプリントサービス」を始めたようです。 ということで、今回はこの3Dプリントサービスがどんなものなのかを、実際の私の発注を例に紹介しようと思います。 今回発注… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717140055.jpg" width="450" height="253" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>※この記事はJLCPCBの提供でお送りします。</p> <h1 id="JLCPCBとは">JLCPCBとは</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717072636.png" width="232" height="78" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjlcpcb.com%2FJPA" title="PCB Prototype &amp; PCB Fabrication Manufacturer - JLCPCB" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jlcpcb.com/JPA">jlcpcb.com</a></cite></p> <p>(↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)</p> <p>JLCPCBとは、プリント基板製造などで有名な香港の企業です。</p> <p>日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。</p> <p>値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。</p> <p>そんなJLCPCBですが、最近「3Dプリントサービス」を始めたようです。</p> <p>ということで、今回はこの3Dプリントサービスがどんなものなのかを、実際の私の発注を例に紹介しようと思います。</p> <h1 id="今回発注するデータ">今回発注するデータ</h1> <p>私は家に<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>を持っているので、これまでに多くの<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>用のデータを作成してきました。</p> <p>今回も、JLCPCBに3Dプリントを発注するにあたり、今まで作ってきた実績のある以下の2種類のデータを使うことにしました。</p> <ul> <li>RakuChordという電子楽器の筐体 <ul> <li><a href="https://inajob.github.io/rakuchord/">RakuChord(&#x3089;&#x304F;&#x3053;&#x30FC;&#x3069;) - &#x697D;&#x306B;&#x305D;&#x308C;&#x3063;&#x307D;&#x3044;&#x6F14;&#x594F;&#x304C;&#x3067;&#x304D;&#x308B;&#x96FB;&#x5B50;&#x697D;&#x5668;</a></li> </ul> </li> <li>水切り棚の皿受け <ul> <li><a href="https://inajob.hatenablog.jp/entry/kitchen-shelf">&#x30AD;&#x30C3;&#x30C1;&#x30F3;&#x6C34;&#x5207;&#x308A;&#x68DA;&#x306E;&#x5C0E;&#x5165;&#x3068;3D&#x30D7;&#x30EA;&#x30F3;&#x30BF;&#x30FC;&#x306B;&#x3088;&#x308B;&#x4E0D;&#x5177;&#x5408;&#x4FEE;&#x6B63; - inajob&#39;s blog</a></li> </ul> </li> </ul> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>の難しいところの一つに3Dプリントに適した設計というのがありますが、今回で言うと、この難しいところは過去の自分が頑張ってくれていたので、スキップすることが出来ました。</p> <p>一度データを作ってしまうと、こうやって何度も作成できるのが、手作業による加工と違い、3Dプリントなど機械加工の便利なところです。</p> <h1 id="発注について">発注について</h1> <p>早速発注方法です。JLCPCBのユーザ登録は済ませているものとして、Web上での中も方法を少し紹介します。</p> <p>と言っても、本当にデータをアップロードするだけで、特に難しいところは無いのですが・・</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/Web%A5%B5%A1%BC%A5%D3%A5%B9">Webサービス</a>の文字も中国の会社ですが英語で記載されており特に戸惑うところはありません。</p> <h1 id="注文データの登録">注文データの登録</h1> <p>まず初めに、3Dプリントではおなじみの<a class="keyword" href="https://d.hatena.ne.jp/keyword/STL">STL</a>ファイルを、注文ページからアップロードすると次のような画面が現れます。</p> <p>ここで素材と、個数と説明を書くだけです。</p> <p>素材は様々な樹脂や金属から選ぶことができますが、今回は安価な<a class="keyword" href="https://d.hatena.ne.jp/keyword/SLA">SLA</a>(Resin)を選択しました。</p> <p>さらにその中にも3種類の素材がありますが、これらの違いは微妙そうなので、大きな水切り棚については、一番安い9000R Resinを選択しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220715/20220715214345.png" width="815" height="375" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>金額はほぼ体積で決まるようで、この水切り棚は$16.49でした。(体積は送料にも響いてくるので、注意が必要です)</p> <p>Product Descというところにはそれが何かを説明する箇所です。今回は「Kitchen tool」としておきました。</p> <p>次にRakuChordのパーツです。水切り棚に比べて体積の小さなパーツのみなので、非常に安価です。 最も小さなネジのパーツはたったの$1.0でした。</p> <p>試しに同じ<a class="keyword" href="https://d.hatena.ne.jp/keyword/SLA">SLA</a>(Resin)の中の違う素材を選択してみました。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220715/20220715214842.png" width="922" height="893" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="送料について">送料について</h1> <p>そして、次に送料の確認です。</p> <p>非常に時間がかかるが安いもの、早いが高いもの、などいろいろありますが、今回は早くて若干高いDHLを選択しました。</p> <p>というのも、普段AliExpressなどで安い<a class="keyword" href="https://d.hatena.ne.jp/keyword/%B1%BF%C1%F7%B6%C8">運送業</a>者を使うと、本当に雑に梱包されて届いたり、届くのに1か月かかったり、破損していたりと、様々なトラブルを経験したことがあるからです。</p> <p>今回の送料はDHLだと $27.63でした。 (最安だとEconomical Global Direct Lineの $9.77というのがありました)</p> <p>つくるモノが大きいと送料もそれだけ大きくなるので、いくら製造コストが安くても送料で損をしてしまうケースもあるだろうなと感じました。</p> <h1 id="レビューについて">レビューについて</h1> <p>3Dプリントをやったことがある人なら、形状によっては3Dプリントが難しいことを知っているかと思います。</p> <p>という事でJLCPCBでは人手による(?)レビュープロセスが存在します。登録した注文データをOrderすると、支払い前にレビュープロセスで少し待たされます。</p> <p>自分の場合は翌日にはレビューが完了していました。</p> <p>一部の部品に非常に薄い箇所があり、この箇所は正しく出ないかもしれない、という警告が出ましたが、今回はそのまま進めてくれ(下の図で言うYES)を選択しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220715/20220715215552.png" width="426" height="360" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="待つ">待つ</h1> <p>発注してから待つこと、、6日、DHLで我が家に造形物が届きました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212350.jpg" width="671" height="672" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>自分で設計したオリジナルの造形物が6日で届くというのは、個人的には「早いな」という感覚でした。</p> <h1 id="出来栄えについて水切り棚">出来栄えについて(水切り棚)</h1> <p>今まで家庭用(?)の積層式の<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>しか扱ってこなかった自分にとって、光造形式の出力は非常に印象的でした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212012.jpg" width="671" height="752" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>積層痕もほとんど目立たず、中身もずっしりと樹脂が詰まっており、「これ、製品では?」と思うような質感でした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212024.jpg" width="671" height="793" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>レジンは白色の物しか選べないのですが、この無骨な白色が水切り棚という台所用品ともマッチしていて、無印あたりで売っていそうな雰囲気を感じさせます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212036.jpg" width="671" height="895" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>水切り棚については、単純な形状で、とても<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>にやさしい設計となっているため、造形の不具合なども全く見つかりませんでした。</p> <p>また寸法もすでに家にある<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>で作ったもので合わせてあるため、即台所で使い始めることが出来ました。</p> <p>比較相手としては全く適切ではないかもしれませんが、我が家の<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>(積層式)で作ったものとの比較です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220717/20220717135424.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="出来栄えについてRakuChord">出来栄えについて(RakuChord)</h1> <p>こちらも家にある積層式の<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で出力したことのあるデータだったのですが、水切り棚と比べると複雑な形状で、薄い部分も多く、<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>的には難易度の高い造形でした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212123.jpg" width="671" height="710" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212150.jpg" width="671" height="738" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>案の定、薄く角がとがっている部分は少し反って出力されており、やっぱりプロがやってもこういうことがあるんだな、と感じました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212135.jpg" width="668" height="481" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>まぁ私の用途では許容範囲の反りですが、やはりデータ通りに作るというのは、難しいところがあるようです。</p> <p><a class="keyword" href="https://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D0%A1%BC%A5%CF%A5%F3%A5%B0">オーバーハング</a>の個所が一部ありましたが、家の<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>でも出力できる程度の小さなものだったこともあり、特に問題なく出力されていました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212217.jpg" width="668" height="627" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>RakuChordは<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>製のネジで電池ボックスを固定するのですが、このネジについても、特に問題なく噛み合い、固定することが出来ました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220716/20220716212228.jpg" width="446" height="551" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="出来栄えについてまとめ">出来栄えについて(まとめ)</h1> <p>もともと<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で出力するように考慮して設計し、実際にも出力したことがあるデータだったため、大きなトラブルなく完成しましたが、手元に<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>がない状態で設計していきなり発注するのはちょっと難しいかも、と感じました。</p> <p>水切り棚のような単純な造形物であれば、それも可能ですが、RakuChordのような複雑な形状の場合は、手元で実際に何度も作りながら造形をブラッシュアップしていく必要があるため、手元の<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>が必要だと感じました。</p> <p>また、RakuChordの部品の各所で反りが発生しているのを確認しました。これは<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>あるあるなので、やはりか・・という感じですが、底面で鋭角の出っ張りを作るのを極力避けるか、側面が多少反っても問題ない設計にするなど、割り切りが必要だと感じました。</p> <p>細かい部分では、発注した3Dデータそのまま、というわけにはいきませんでしたが、家にある積層式<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で出力するよりは明らかにそれっぽい造形なので、ここぞ!という時に発注するのが良いかなと感じています。</p> <p>安価な素材である<a class="keyword" href="https://d.hatena.ne.jp/keyword/SLA">SLA</a>(Resin)は乳白色しかないので、この色が許容できない人は、利用が厳しいかもしれないと感じました。</p> <p>試していないですが、これに塗装するなど、ひと手間かければこの問題は解決できそうです。</p> <h1 id="3Dプリント以外のケース外注の選択肢">3Dプリント以外のケース外注の選択肢</h1> <p>平面的な造形であれば、3Dプリントではなく、PCBを基板をケースとして設計する方法もあり、こちらの方が安価です。 (いわゆる基板サンドイッチ方式、<a href="https://www.digilog.tokyo/products/paripidestroyer">パリピデストロイヤー</a>などがこの方式です)</p> <p>またレーザーカットなども外注できるサービスがあるので、透明なアクリル板やある程度厚みのある板をカットする場合にはこれらも選択肢に入れると、安くで作ることができるかもしれません。</p> <p>実際RakuChordの部品の一部はレーザーカットを外注しており、これは3Dプリントで同じものを外注するより安いうえに、精度が良いです。</p> <p>一方RakuChordの筐体や、水切り棚のように3次元的な造形や、非常に分厚い造形については<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>や自由度の高いCNCでないと作ることができません。</p> <p>まぁ、何が優れている、と言うよりは、適材適所の加工方法があるという事です。</p> <h1 id="まとめ">まとめ</h1> <p>初めての3Dプリントの発注でしたが、思っていたより安く、品質も値段の割には良かったと感じています。</p> <p>Webでの発注も非常に簡単で、気軽に利用できると感じました。</p> <p>ただ、やはり家に<a class="keyword" href="https://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>があり、手元で一度試作をしたデータを発注するのが、時間面、金銭面においては賢い選択かなと思いました。</p> <p>とにかく小さな造形物であれば数千円あれば発注できるので、興味のある人は、手元のデータを発注してみて、実物を見てみると良いと思います。</p> inajob ホワイトボードの買い物リストを外から見えるようにする hatenablog://entry/13574176438103130600 2022-06-19T14:08:17+09:00 2022-06-19T14:09:24+09:00 ホワイトボードの買い物リスト? 我が家では台所にホワイトボードを設置しており、そこに「買い物リスト」を書いています。 (以前はLINEのチャットボットを使い、スマートフォンで買い物リストを管理していたのですが、在宅勤務中心となったためホワイトボードに移行しました。) 買い物に行くときは、スマートフォンでパシャッと、このホワイトボードのリストを撮影します。 しかし、何かのついでにふらっとスーパーに寄ったときなど、家の買い物リストに何が書かれていたかを知ることができず、必要な買い物ができない場合があります。 また、出かけるたびにホワイトボードをスマートフォンで撮影するのも面倒です。 ということで、… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619140906.png" width="1170" height="860" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1>ホワイトボードの買い物リスト?</h1> <p>我が家では台所に<strong>ホワイトボード</strong>を設置しており、そこに<strong>「買い物リスト」</strong>を書いています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619132634.png" width="836" height="564" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>(以前は<strong>LINEのチャットボット</strong>を使い、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>で買い物リストを管理していたのですが、在宅勤務中心となったためホワイトボードに移行しました。)</p> <p>買い物に行くときは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>でパシャッと、このホワイトボードのリストを撮影します。</p> <p>しかし、何かのついでにふらっとスーパーに寄ったときなど、家の買い物リストに何が書かれていたかを知ることができず、必要な買い物ができない場合があります。</p> <p>また、出かけるたびにホワイトボードを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>で撮影するのも面倒です。</p> <p>ということで、<strong>「出先からホワイトボードを確認するための仕組み」</strong>を作ることにしました。</p> <h1>外から安全にホワイトボードを見たい</h1> <p>安直に考えれば、ホワイトボードが映るようにカメラを設置し、Webサーバか何かを外部に公開して、家の外から見えるようにするのが簡単です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619134656.png" width="820" height="363" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>しかし、家にWebサーバを立てて外からアクセスできるようにするのは、我が家のセキュリティを強固に保つために、できればやりたくありません。</p> <p>ということで、家にWebサーバを立てる案は却下です。</p> <h1>材料</h1> <p>さて、ここからはこの手法を実現するための材料を紹介します。</p> <h1><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a></h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619134837.png" width="128" height="128" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>家にWebサーバを立てないということで、今回利用したのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>です。</p> <p>ホワイトボードを撮影するカメラが撮影した画像を定期的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>にアップロードします。</p> <p>これにより我が家のセキュリティを強固に保ったままホワイトボードの写真を外から見ることができるようになります。</p> <h2>TTGO T-Camera</h2> <p>写真の撮影はTTGO T-Cameraを利用します。</p> <p>これはESP32-WROVER-Bとカメラモジュールの付いた、<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>カメラを作るためのモジュールです。</p> <p>似たようなボードは各種ありますが、今回利用するのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%BB%C5%AC">技適</a>を取得しているESP32-WROVER-Bが搭載されたボードです。</p> <p>(多分これかな? 自分はAliExpressで買いました) <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B07RV2QD4R?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/318BY41pZ1L._SL500_.jpg" class="hatena-asin-detail-image" alt="WINGONEER ESP32 TカメラESP32 WROVER PSRAMカメラモジュール4MB SPRAM ESP32-WROVER-B OV2640 0.96インチOLEDディスプレイスクリーン付きカメラモジュール" title="WINGONEER ESP32 TカメラESP32 WROVER PSRAMカメラモジュール4MB SPRAM ESP32-WROVER-B OV2640 0.96インチOLEDディスプレイスクリーン付きカメラモジュール"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B07RV2QD4R?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">WINGONEER ESP32 TカメラESP32 WROVER PSRAMカメラモジュール4MB SPRAM ESP32-WROVER-B OV2640 0.96インチOLEDディスプレイスクリーン付きカメラモジュール</a></p><ul class="hatena-asin-detail-meta"><li>WINGONEER</li></ul><a href="https://www.amazon.co.jp/dp/B07RV2QD4R?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> 3</h2> <p>TTGO T-Cameraで撮影した映像を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>から取得し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>にアップロードします。</p> <p>もしかしたらTTGO T-Cameraだけでも<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>にアップロードできるかもしれませんが、今回は簡単のために<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>を利用しました。</p> <p>丁度、我が家には「おうちサイネージ」として動かしている<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>があるのでこれを利用することにしました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fouchi-signage" title="Raspberry Piでおうちサイネージを作ってみよう! - inajob&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/ouchi-signage">inajob.hatenablog.jp</a></cite></p> <h1>調理</h1> <p>さて、これらの材料を組み合わせてシステムを完成させていきます。</p> <h2>概要</h2> <p>これから構築するシステムの概要です。</p> <p>TTGO T-Cameraで撮影した映像を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>で定期的に取得し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>にアップロードします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619134720.png" width="817" height="355" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2>TTGO T-Cameraの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>を我が家用に変更</h2> <p>TTGO T-Cameraを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Web%A5%AB%A5%E1%A5%E9">Webカメラ</a>として動作させるためには以下の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>を利用しました。 (というか購入時はこの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>が入っていたようです)</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2FXinyuan-LilyGO%2FLilyGo-Camera-Series" title="GitHub - Xinyuan-LilyGO/LilyGo-Camera-Series: 🔰 Compatible with all TTGO camera products" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/Xinyuan-LilyGO/LilyGo-Camera-Series">github.com</a></cite></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>のAPの設定を修正し家の<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>に接続できるように再<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>して書き込みます。</p> <p>起動すると画面に<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>が表示されるので、そこにアクセスするとカメラの映像を確認できます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619133004.png" width="562" height="735" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>我が家の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>と相性が悪いのか、長く起動していると<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>の接続が切れてしまう問題が発生しました。</p> <p>以下の記事を参考にし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>接続が切れた時は自動的に再接続するようにしました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Frandomnerdtutorials.com%2Fsolved-reconnect-esp32-to-wifi%2F" title="[SOLVED] Reconnect ESP32 to Wi-Fi Network After Lost Connection | Random Nerd Tutorials" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://randomnerdtutorials.com/solved-reconnect-esp32-to-wifi/">randomnerdtutorials.com</a></cite></p> <h2>TTGO T-Cameraを固定するための台</h2> <p>台所の壁に設置したホワイトボードを撮影するためには、TTGO T-Cameraを良い角度で固定する必要があります。</p> <p>このためのカメラの脚を<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で自作しました。</p> <p>FreeCADを使ってこのような立体を作りました。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619133230.png" width="590" height="525" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>このパーツは2つくっつけるとこのようにL字型の蝶番のようになります。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619133153.png" width="1015" height="1083" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>TTGO T-Cameraのケース(写真に写る紫のケース)は 以下のモデルを使いました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.thingiverse.com%2Fthing%3A3440888" title="TTGO ESP32 T-Camera Case with Wall Mount (Customizable) by drgrandios" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.thingiverse.com/thing:3440888">www.thingiverse.com</a></cite></p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>にアップロード用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を仕込む</h2> <p>定期的にTTGO T-Cameraから画像を取得し<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>にアップロードする<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を用意します。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>へのアップロードにはrcloneを利用します。</p> <p>rcloneの初期設定は<a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a>のウィザードで実施することができます。CLIENT_ID, CLIENT_SECRETを設定するのがちょっと面倒だったのですが、設定しなくても一応動かすことはできます。(ただし共用のIDを使うことになりすぐに制限に引っかかってしまうので、常用するのには向きません)</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>は以下のような感じです。</p> <p>(convertコマンドにより画像を反転したり、日付を入れたり、過去にアップロードした画像を削除したりもしています。)</p> <pre class="code bash" data-lang="bash" data-unlink>#/bin/bash cd `dirname $0` curl http://&lt;TTGO T-CameraのIPアドレス&gt;/capture -o todo.jpg convert todo.jpg -rotate 180 -fill white -pointsize 25 -font Helvetica -draw &#34;text 20,20 &#39;`date`&#39;&#34; -background white todo.jpg for f in $(rclone lsf &#34;google drive:/ouchi-raspberry-pi/&#34;); do echo &#34;delete $f&#34; rclone delete &#34;google drive:/ouchi-raspberry-pi/$f&#34; done; rclone copyto todo.jpg &#34;google drive:/ouchi-raspberry-pi/todo-$(date &#34;+%Y%m%d-%H%M&#34;).jpg&#34;</pre> <p>同じ名前のファイルをどんどん上書きしても良いのですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone">iPhone</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>のアプリのキャッシュの処理などにより、画像が更新されないという問題が起きたので、日時に合わせて画像ファイル名を変更するようにしました。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>の共有設定</h2> <p>このようにしてアップロードした写真は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Drive">Google Drive</a>の共<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%AD%B5%A1">有機</a>能を利用すると他人と共有することもできます。</p> <p>我が家でも妻と写真を共有し、夫婦どちらでも家の買い物リストを出先から見られるようにしました。</p> <h1>まとめ</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220619/20220619135753.png" width="1170" height="860" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>TTGO T-Camera, Rasperry Pi, <a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>などIoT的な装置をフルに使ってホワイトボードの画像を外から見るためのソリューションを作ることが出来ました。</p> <p>これでまた生活が便利になりました! 自分の知識を使って、生活を便利にするのは楽しいので、この記事をご覧の方もぜひ挑戦してみてください!</p> inajob 貧者のUSBケーブルチェッカーをセルフパワー化するケースを設計する hatenablog://entry/13574176438088420736 2022-05-02T14:58:26+09:00 2022-05-02T14:59:46+09:00 先に完成品の紹介 USBケーブルにイライラしたことはありませんか? というのも市販の製品に同梱されているケーブルの中には、充電のみに対応しているものが結構多くあります。 データ通信に使いたい場面で、この充電のみに対応したケーブルを使っていると、当然通信できず、イライラすることとなります。 という事で、家にあるケーブルが充電のみに対応したものなのか、データ通信もできるのかを調べたくなります。 という事で作ったのがこちらです!↓ 貧者のUSBケーブルチェッカーをセルフパワー化してみた。#3Dプリンター pic.twitter.com/bRHdGMAPp1— ina_ani@2歳児のパパ (@ina… <h1>先に完成品の紹介</h1> <p>USBケーブルにイライラしたことはありませんか?</p> <p>というのも市販の製品に同梱されているケーブルの中には、<strong>充電のみに対応しているもの</strong>が結構多くあります。</p> <p>データ通信に使いたい場面で、この充電のみに対応したケーブルを使っていると、当然通信できず、イライラすることとなります。</p> <p>という事で、<strong>家にあるケーブルが充電のみに対応したものなのか、データ通信もできるのか</strong>を調べたくなります。</p> <p>という事で作ったのがこちらです!↓</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">貧者のUSBケーブルチェッカーをセルフパワー化してみた。<a href="https://twitter.com/hashtag/3D%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#3Dプリンター</a> <a href="https://t.co/bRHdGMAPp1">pic.twitter.com/bRHdGMAPp1</a></p>&mdash; ina_ani@2歳児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1520288242159210496?ref_src=twsrc%5Etfw">2022年4月30日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <h1>貧者のUSBケーブルチェッカーとは</h1> <p>USBケーブルチェッカーと言えばこの製品が非常に有名です。 (便宜上こちらは<strong>富者のUSBケーブルチェッカー</strong>、と呼んでいます)</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B07Y8BPVV4?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/416Wfjf1a8L._SL500_.jpg" class="hatena-asin-detail-image" alt="BitTradeOne ADUSBCIM USB CABLE CHECKER 2" title="BitTradeOne ADUSBCIM USB CABLE CHECKER 2"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B07Y8BPVV4?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">BitTradeOne ADUSBCIM USB CABLE CHECKER 2</a></p><ul class="hatena-asin-detail-meta"><li>Bit Trade One</li></ul><a href="https://www.amazon.co.jp/dp/B07Y8BPVV4?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>この商品を買えば間違いはないのですが、自分の場合は、そこまで細かいスペックを知りたいわけではなく、単に「データ線が結線されていないUSBケーブルか否か」だけがわかれば良いという要件であることに気付きました。</p> <p>となれば、単に指定したピンが両端のコネクタで結線しているかだけを見ればよいので、もっとシンプルな回路でチェックできそうです。</p> <p>この観点でインターネットを探してみると・・ ズバリな商品がありました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fja.aliexpress.com%2Fitem%2F1005003164942005.html" title="524.0¥ |Qianli Mega ideaデータケーブルオンオフ検出ボードUSBタイプcラインテストツール|Power Tool Sets| - AliExpress" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://ja.aliexpress.com/item/1005003164942005.html">ja.aliexpress.com</a></cite></p> <p>ということで、早速これを購入してみました。</p> <p>今回はこの基板の電源付きケースを設計した話です。</p> <p>「この基板」では味気が無いので、私はこれを「貧者のUSBケーブルチェッカー」と呼ぶことにします。 <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220502/20220502144613.png" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1>セルフパワー化</h1> <p>この基板は外からUSBケーブルで電源を得るように設計されています。</p> <p>そのため、テストしたいケーブルの両端に加えて、外部電源用のケーブルを接続する必要があり、利用する際にケーブルだらけとなってしまい煩雑だと感じました。</p> <p>そこで基板にCR2032を取り付け直接電源を供給できるようにしました。</p> <p>CR2032は3Vなので、USB電源とは電圧が違いますが、チェック用のLEDを光らせることが出来ることを確認できたので、結果オーライという事でそのまま結線しています。</p> <p>基板上にテスト用のパッドが露出していたので、そこに導線をはんだ付けしました。</p> <p>今回CR2032ホルダーも<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で作ってみました。と言っても「口」の形で導線を通す穴を2つ開けただけの簡単なものです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220502/20220502144044.png" width="553" height="498" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1>ここで紹介する設計手法について</h1> <p>私も<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>向けのデータをどうやって作るかを、まだ模索している段階なのですが、今回のやり方を文書化することで、新たな発見があるかも・・と思い記事にしてることにしました。</p> <p>さらに良い方法があるよ、という方は是非教えてください。</p> <h1>利用するツール</h1> <p>今回は以下のソフトウェアを使って設計を行います</p> <ul> <li>LibreCAD <ul> <li><a href="https://librecad.org/">LibreCAD - Free Open Source 2D CAD</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>の2次元CADツール</li> <li>コンパスや定規などで作図する感じで造形できます</li> </ul> </li> <li>OpenSCAD <ul> <li><a href="https://openscad.org/">OpenSCAD - The Programmers Solid 3D CAD Modeller</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>の3次元CADツール</li> <li>プログラミングで立体を造形できます</li> </ul> </li> <li>BOSL2 <ul> <li><a href="https://github.com/revarbat/BOSL2">https://github.com/revarbat/BOSL2</a></li> <li>OpenSCADのライブラリ</li> <li>相対的に立体物を並べることができます</li> </ul> </li> </ul> <h1>設計手法の紹介</h1> <p>ではここから具体的な設計方法について紹介します。</p> <h2>LibreCADで基板の部品を書き写す</h2> <p>基板上のでっぱりのあるコネクタのサイズなどを測定し、LibreCADで作図をします。やはりこういう作図はマウスが利用できる<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>のツールが便利です。 (ここは行き当たりばったりでやってたのでレイヤー名とか雑ですね・・)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220502/20220502142635.png" width="1009" height="830" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>作図補助レイヤーで垂直・水平のガイドを作図し、でっぱり部分をレイヤーで作図します。 (図で緑色と黄色の線が作図補助のための直線です。)</p> <p>基板外形、でっぱりの高さが異なる部分は別のレイヤーにします。</p> <p>OpenSCADではDXFファイルのレイヤーを指定してインポートできるので、便利です。</p> <h2>OpenSCADで作図する</h2> <p>今回はBOSL2というライブラリを使います。</p> <p>このライブラリは、立体物にアンカーを設定して、そこに他の図形をアタッチする形で立体物を作成する機能を提供してくれます。</p> <p>DXFファイルからレイヤーを指定して読み込む場合には以下のように書きます。</p> <pre class="code" data-lang="" data-unlink>import (file = &#34;board.dxf&#34;, layer = &#34;rect-board&#34;);</pre> <p>論理演算で穴をあけるための造形物は以下のように書きます。(モジュール化もしています)</p> <pre class="code" data-lang="" data-unlink>module hole() linear_extrude(height=3) import (file = &#34;board.dxf&#34;, layer = &#34;hole&#34;); module hole2() linear_extrude(height=7) import (file = &#34;board.dxf&#34;, layer = &#34;hole2&#34;);</pre> <p>ケースの上部分はこのように書きます。</p> <pre class="code" data-lang="" data-unlink>baseW = 57; // 基板外形 幅 baseL = 46; // 基板外形 奥行き boardThickness = 1.6; // 基板厚 baseThickness = 2; // 底厚 baseSideThickness = 5; // 横壁厚 topH = 8; //ケース高さ render() // ちらつき防止 diff(&#34;cut&#34;) // cutというtagの図形を切り抜く yrot(180) // y軸中心に180度回転させる cube([baseW, baseL, topH], anchor=[0,0,1]){ // 底面にアンカーを設定したケース外形の直方体を作成 force_tags(&#34;cut&#34;){ // 切り抜く部分をグループ化 position([-1, -1, -1]){ // ケース外形の左-手前-下を原点とする hole(); // 基板上のでっぱりを引き算する(高さ別に4つのデータが存在) hole2(); hole3(); hole4(); union(){ // バッテリー収納部を作図する(ここはLibreCADで作っていない) translate([44,22,0]) // 位置合わせ linear_extrude(height=topH - 1){ // バッテリー部分の壁厚は1mm circle(r = 10+1); // CR2032の半径=10mm+マージン1mmの円 rotate([0,0,-90]) square([22+4, 14], center = true); // バッテリスナップ収納の為の矩形 } translate([33,30,0]) // 位置合わせ linear_extrude(height=2) // 配線用のスペースを作図する(ここはLibreCADで作っていない) square([10,10]); } } // スナップフィットジョイントの作図 xflip_copy() // X軸に対称にコピー position([-1, 0, -1]) // ケース外形の左-中央-下を原点とする yflip_copy() // Y軸に対称にコピー up(baseH - baseThickness - boardThickness) // ジョイントの高さ位置合わせ back(10) // ジョイントの前後位置合わせ xrot(90) cyl(r=1, l=10, anchor=[0, 1, 0]); // ジョイントをシリンダで作成、アンカーは下面に設定 } }</pre> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220502/20220502143017.png" width="472" height="326" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ケース下部分はこのように書きます</p> <pre class="code" data-lang="" data-unlink>baseH = 8; render() // ちらつき防止 translate([0,50,0]) // 位置合わせ diff(&#34;cut&#34;) //cutというtagの図形を切り抜く cube([baseW+0.2, baseL, baseThickness + boardThickness], anchor=[0,0,-1]){ // 底面にアンカーを設定したケース外形(スナップ用の左右はみ出し部分を除く)の直方体を作成 position([-1, -1, 1]) // ケース外形の左-手前-上を原点とする force_tags(&#34;cut&#34;) // 切り抜く部分をグループ化 zflip() linear_extrude(height=boardThickness) // 基板外形を作図(linear_extrudeの向きが期待と逆なのでzflipしている board(); //DXFから基板外形を読み込む // スナップフィットジョイントと左右はみ出し部分の作図 xflip_copy() // X軸に対称にコピー position([-1, -1, -1]) // ケース外形の左-手前-下を原点とする // 左右はみ出し部分は一部角丸の直方体として作図 cuboid([baseSideThickness, baseL, baseH], anchor=[1,-1,-1], rounding=2, edges=[&#34;Z&#34;], except_edges=RIGHT) yflip_copy() // Y軸に対称にコピー position([1, 0, 1]) // 右-中央-奥を原点にする back(10) // ジョイントの前後位置合わせ xrot(90) cyl(r=1, l=10-1, anchor=[0, 1, 0]); // ジョイントをシリンダで作成、アンカーは下面に設定(1mm短くしてうまくハマるようにしている) }</pre> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220502/20220502143047.png" width="528" height="304" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>スナップフィットジョイントと書きましたが、市販品のような矢印状のものでは無く、単にかまぼこのような形の凹凸をはめ込むだけのジョイントです。</p> <p>しかしこれでも十分に固定でき、かなり力を書けないと外れないケースを作ることが出来ました。</p> <p>(説明をコメントになるべく書いてみましたが、なかなかわかりづらいですね。)</p> <h1>BOSL2所感</h1> <p>とにかくアタッチができるのが有用と感じました。</p> <p>直方体を定義すると、その頂点または辺の中点を簡単にアタッチ原点と設定することが出来ます。</p> <p>これにより相対的な立体図形の配置が出来るようになり、OpenSCAD単体で作図していると変数だらけになってしまう問題を解消できます。 (アタッチが出来ないので辺の長さをすべて変数に逃がす必要があった)</p> <p>またxflip, yflip, zflipやup, down, left, rightなど軸を1つに限定した操作も可読性が良くなり良いものだと感じました。</p> <p>cuboidには角丸のオプションがあり、フィレットが苦手なOpenSCADの弱点を少しは緩和させてくれます。 (それでもやはりフィレットは苦手ですが・・)</p> <p>linear_extrudeの引き延ばした先にアタッチできないのが若干惜しい気持ちになりました。</p> <h1>まとめ</h1> <p>今回初めてLibreCADとOpenSCAD、そしてBOSL2を使った作図をしてみました。</p> <p>LibreCADを使うとマウスを使って簡単に直感的な作図が出来ました。</p> <p>立体的な造形はマウスよりコーディングの方が保守性が高いのでOpenSCADが有用だと感じました。</p> <p>そしてBOSL2というOpenSCADのライブラリを使うことで、立体物の造形を比較的直観的に実現できました。</p> <p>今回は試験的にツールを組み合わせただけなので、もっと良い方法があるかもしれません。</p> <p>これより良い方法を思いついた方は是非<a href="https://twitter.com/ina_ani">https://twitter.com/ina_ani</a> に教えてください。</p> inajob ArduinoとCH9328でお手軽自作キーボード hatenablog://entry/13574176438080103831 2022-04-05T22:18:36+09:00 2022-04-05T22:19:11+09:00 CH9328とは UARTを入力として受け取り USB HIDキーボードとして振舞うICのようです。 本来の用途としてはKVMスイッチなどでキーボードのエミュレーションを行うための物のようです。 今回はこのCH9328を搭載したモジュールボードを購入したので少し試食してみました。 自作キーボードとUSBデバイス USB接続式の自作キーボードを設計するときに悩みの種となるのがUSBです。 まずUSBデバイス機能を搭載したマイコン、またはV-USBなどのソフトウェアエミュレーションに対応しているマイコンを用意する必要があります。 USBのプログラミングは煩雑で、メモリやCPUを結構消費します。 そ… <h1>CH9328とは</h1> <p>UARTを入力として受け取り USB HIDキーボードとして振舞うICのようです。</p> <p>本来の用途としては<a class="keyword" href="http://d.hatena.ne.jp/keyword/KVM">KVM</a>スイッチなどでキーボードのエミュレーションを行うための物のようです。</p> <p>今回はこのCH9328を搭載したモジュールボードを購入したので少し試食してみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220405/20220405220253.png" alt="f:id:inajob:20220405220253p:plain" width="803" height="651" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1>自作キーボードとUSBデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a></h1> <p>USB接続式の自作キーボードを設計するときに悩みの種となるのが<strong>USB</strong>です。</p> <p>まず<strong>USBデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>機能を搭載した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>、またはV-USBなどのソフトウェアエミュレーションに対応している<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>を用意する必要</strong>があります。</p> <p>USBのプログラミングは煩雑で、メモリやCPUを結構消費します。</p> <p>そして次の問題が<strong>VID/PID</strong>です。作成したキーボードを個人で使う場合はそこまで問題となりませんが、販売するとなると正式には独自のVIP/PIDを取得しそれを利用するのが通常の流れです。</p> <p>しかし、正規の方法でVIP/PIDを手に入れるためにはUSB-IFに申請し、結構多くのお金を納める必要があります。</p> <p>同人ハードウェアなどの場合そこまでコストはかけられない、という事で、いくつかのベンダーがPIDのサブライセンスを行っているので、その仕組みに乗っかるなどしてPIDを取得している人もいるようです。</p> <p>このあたりの事情は以下の記事が詳しいです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fgpsnmeajp%2Fitems%2F8eb8ecf0541032f6de0e" title="USBのベンダーIDとプロダクトIDの話 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://qiita.com/gpsnmeajp/items/8eb8ecf0541032f6de0e">qiita.com</a></cite></p> <h1>CH9328とUSBのVID/PID</h1> <p>さて、今回扱うCH9328ですが、これはWCH社が販売しているICで、このICにはWHC社のVIDである0x1A86と、このIC固有の値であるPID 0xE026がデフォルト値として設定されています。 (この値は書き換えツールで変更できるようです)</p> <p>この値をそのまま使う場合はWCH社のVID/PIDをそのまま使うことが出来ます(多分ライセンスとしてもこれでもないないはず、、USB Serial ICなどとやっていることは同じ)</p> <h1><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>から使ってみる</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a>にはまさにCH9328を利用するためのライブラリである「CH9328-Keyboard」があります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220405/20220405212019.png" alt="f:id:inajob:20220405212019p:plain" width="749" height="193" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>インストール出来たらHelloWorldのサンプルプログラムを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOに書き込んでさっそく実行してみます。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B008GRTSV6?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51txW1iicVL._SL500_.jpg" class="hatena-asin-detail-image" alt="Arduino Uno Rev3 ATmega328 マイコンボード A000066 白" title="Arduino Uno Rev3 ATmega328 マイコンボード A000066 白"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B008GRTSV6?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Arduino Uno Rev3 ATmega328 マイコンボード A000066 白</a></p><ul class="hatena-asin-detail-meta"><li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a></li></ul><a href="https://www.amazon.co.jp/dp/B008GRTSV6?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOで利用する際の罠</h2> <p>CH9328-Keyboardの内部で SERIAL_TX_ONLY という定数を使っていますが、どうもこれはESP8266などでのみ利用できる定数のようで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOではこのせいで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>が実行できません。</p> <p>インスール下ライブラリのCH9328Keyboard.cppの該当部分を削ることで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>できるようになりました。</p> <pre class="code" data-lang="" data-unlink>変更前 _Serial-&gt;begin(baud, SERIAL_8N1, SERIAL_TX_ONLY); 変更後 _Serial-&gt;begin(baud, SERIAL_8N1); </pre> <h2>サンプルプログラムの実行</h2> <p>CH9328モジュールと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOはVCC,GND, TX, RXをそれぞれ接続します。</p> <p>また動作モードを変更するジャンパのIO1,IO2をHIGHに設定します(このモジュールではジャンパをつけるとHIGHになるようです)</p> <p>電力はCH9328モジュールから<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOに送るので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOはUSB接続する必要はありません。</p> <p>Win+r押下の後 notepad + Enter を押下、その後Helloの文言が打ち込まれるというキー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C8%A5%ED%A1%BC%A5%AF">ストローク</a>のシミュレーションが行われ下記画像のようにメモ帳にメッセージが表示されました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220405/20220405212838.png" alt="f:id:inajob:20220405212838p:plain" width="381" height="140" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2>オリジナルキーボードの作成</h2> <p>ここまでくれば後は簡単です。</p> <p>3キー搭載のマクロパッドを作ってみます。</p> <p>自分のIDにちなんで「i」「n」「a」の3キーの存在するキーボードという事にします。</p> <p>全く洗練されていませんが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>です。</p> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;CH9328Keyboard.h&gt;</span> <span class="synPreProc">#define PINRST </span><span class="synConstant">10</span> <span class="synPreProc">#define BAUDRATE </span><span class="synConstant">9600</span><span class="synPreProc"> </span><span class="synComment">//Default is 9600.</span> <span class="synType">void</span> <span class="synIdentifier">setup</span>() { Keyboard.<span class="synIdentifier">begin</span>(&amp;Serial, PINRST, BAUDRATE); <span class="synIdentifier">delay</span>(<span class="synConstant">1000</span>); Keyboard.<span class="synIdentifier">releaseAll</span>(); <span class="synIdentifier">pinMode</span>(<span class="synConstant">10</span>, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(<span class="synConstant">11</span>, INPUT_PULLUP); <span class="synIdentifier">pinMode</span>(<span class="synConstant">12</span>, INPUT_PULLUP); } <span class="synType">unsigned</span> <span class="synType">int</span> trigger_b1 = <span class="synConstant">0</span>; <span class="synType">unsigned</span> <span class="synType">int</span> trigger_b2 = <span class="synConstant">0</span>; <span class="synType">unsigned</span> <span class="synType">int</span> trigger_b3 = <span class="synConstant">0</span>; <span class="synType">void</span> <span class="synIdentifier">loop</span>() { <span class="synType">int</span> b1 = !<span class="synIdentifier">digitalRead</span>(<span class="synConstant">10</span>); <span class="synType">int</span> b2 = !<span class="synIdentifier">digitalRead</span>(<span class="synConstant">11</span>); <span class="synType">int</span> b3 = !<span class="synIdentifier">digitalRead</span>(<span class="synConstant">12</span>); <span class="synStatement">if</span>(b1){ <span class="synStatement">if</span>(trigger_b1){ Keyboard.<span class="synIdentifier">press</span>(<span class="synConstant">'i'</span>); } trigger_b1 ++; }<span class="synStatement">else</span>{ Keyboard.<span class="synIdentifier">release</span>(<span class="synConstant">'i'</span>); trigger_b1 = <span class="synConstant">0</span>; } <span class="synStatement">if</span>(b2){ <span class="synStatement">if</span>(trigger_b2){ Keyboard.<span class="synIdentifier">press</span>(<span class="synConstant">'n'</span>); } trigger_b2 ++; }<span class="synStatement">else</span>{ Keyboard.<span class="synIdentifier">release</span>(<span class="synConstant">'n'</span>); trigger_b2 = <span class="synConstant">0</span>; } <span class="synStatement">if</span>(b3){ <span class="synStatement">if</span>(trigger_b3){ Keyboard.<span class="synIdentifier">press</span>(<span class="synConstant">'a'</span>); } trigger_b3 ++; }<span class="synStatement">else</span>{ Keyboard.<span class="synIdentifier">release</span>(<span class="synConstant">'a'</span>); trigger_b3 = <span class="synConstant">0</span>; } } </pre> <p>配線は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Arduino">Arduino</a> UNOの10, 11, 12番ピンをタクトスイッチの片方にそれぞれ繋ぎ、タクトスイッチのもう片方はGNDに接続するだけです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220405/20220405220321.png" alt="f:id:inajob:20220405220321p:plain" width="550" height="762" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>全体像はこんな感じです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220405/20220405220610.png" alt="f:id:inajob:20220405220610p:plain" width="626" height="741" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1>CH9328についてもう少し・・</h1> <p>値段やデータシートはLCSCが参考になります。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flcsc.com%2Fproduct-detail%2FUSB-ICs_WCH-Jiangsu-Qin-Heng-CH9328_C82452.html" title="WCH(Jiangsu Qin Heng) | WCH(Jiangsu Qin Heng) CH9328 | USB ICs - LCSC.COM" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://lcsc.com/product-detail/USB-ICs_WCH-Jiangsu-Qin-Heng-CH9328_C82452.html">lcsc.com</a></cite></p> <p>モジュールは600円程しましたが、IC単品だと$1.5程度で買えそうです。AliExpressだともっと安いものも見つかると思います。 データシートは中国語の物しか見つかりませんでした。</p> <p>しかし基本動作はシリアルから来たコードをHIDキーボードのコードに変換するだけなので、中国語が読めなくてもそこまで困ることはなさそうです。加えてCH9328-Keyboardライブラリがあるので、そもそも仕様を意識する必要もあまりありません。</p> <p>AliExpressでCH9328で調べると様々なモジュールが販売されています。</p> <p>私が今回利用したのは以下ですが、ほかにも様々なモジュールが存在します。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fja.aliexpress.com%2Fitem%2F1005003679447698.html" title="490.0¥ |キーボードチップch9328 USBドライバーフリーチップttlシリアルポートからアナログキーボードモジュールキー入力|Instrument Parts &amp; Accessories| - AliExpress" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://ja.aliexpress.com/item/1005003679447698.html">ja.aliexpress.com</a></cite></p> <p>よく似た型番の別のICや、ジャンパの設定が出来ないもの、水晶発振子が搭載されたもの、など様々な変種が存在するので、目的に応じて適切なものを購入してください。</p> <p>(同じCH9328でも内部バージョンの違うものがあるようで、古いものは水晶発振子が外付けで必要のようです)</p> <h1>まとめ</h1> <p>CH9328を使うとUSB HID周りの煩わしい問題をすべて肩代わりしてくれるので、非常に簡単にUSBキーボードを自作できることがわかりました。</p> <p>CH9328と低機能・低価格の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>を組み合わせる事で、部品は増えてしまいますが、多機能<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B3%A5%F3">マイコン</a>1つで作るよりも、安く、わかりやすい自作キーボードを設計することが出来ます。</p> <p>チップの値段も安いので、新たな自作キーボードの材料として検討してみてはいかがでしょう?</p> <p>最後に動作の様子の動画を貼っておきます。</p> <p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これなーんだ? <a href="https://t.co/sb27yW4loj">pic.twitter.com/sb27yW4loj</a></p>&mdash; ina_ani@1歳11ヶ月児のパパ (@ina_ani) <a href="https://twitter.com/ina_ani/status/1511325468666245121?ref_src=twsrc%5Etfw">2022年4月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> inajob 6.5秒で起動する日本語対応Vimマシンを作った hatenablog://entry/13574176438078577302 2022-03-31T22:37:55+09:00 2022-03-31T22:37:55+09:00 これは何? Raspberry Pi は高性能で比較的安く、面白いボードですが、標準のRaspberry Pi OSだと起動時間が遅いのがネックです。 起動時間を早くする方法はいろいろあるのですが、ここではBuildrootを使ってシンプルなイメージを作る事で、高速起動を実現してみました。 シンプルなイメージということで、今回は「日本語入力ができるVim環境」の構築目指すことにしました。 ※と言ってもBuildrootを普通に使っただけでそこまでの最適化は行っていないです。 Moligh doll Raspberry Pi Zero V1.3 カメラレディ1 GHzマイクロプロセッサ512MB… <h1>これは何?</h1> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> は高性能で比較的安く、面白いボードですが、標準の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> OSだと起動時間が遅いのがネックです。</p> <p>起動時間を早くする方法はいろいろあるのですが、ここではBuildrootを使ってシンプルなイメージを作る事で、高速起動を実現してみました。</p> <p>シンプルなイメージということで、今回は<strong>「日本語入力ができる<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>環境」</strong>の構築目指すことにしました。</p> <p>※と言ってもBuildrootを普通に使っただけでそこまでの最適化は行っていないです。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B07P958PSZ?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51s3NBTcWtL._SL500_.jpg" class="hatena-asin-detail-image" alt="Moligh doll Raspberry Pi Zero V1.3 カメラレディ1 GHzマイクロプロセッサ512MB" title="Moligh doll Raspberry Pi Zero V1.3 カメラレディ1 GHzマイクロプロセッサ512MB"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B07P958PSZ?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Moligh doll Raspberry Pi Zero V1.3 カメラレディ1 GHzマイクロプロセッサ512MB</a></p><ul class="hatena-asin-detail-meta"><li>Moligh doll</li></ul><a href="https://www.amazon.co.jp/dp/B07P958PSZ?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div> (今値段を見てびっくり、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>不足の影響ですね、、今は買わないほうがよさそうです・・)</p> <h1>Buildrootによるイメージの作成</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220331/20220331222650.png" alt="f:id:inajob:20220331222650p:plain" width="1189" height="348" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>先人の知恵を借りて<a href="https://buildroot.org/">Buildroot</a>を使ってイメージを作成します。</p> <p>以下の記事の内容が非常に簡潔でそのまま真似しました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fpu_ri%2Fitems%2F75c80e388c79fe0d3f0b" title="Buildroot の使い方 - 基本編 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://qiita.com/pu_ri/items/75c80e388c79fe0d3f0b">qiita.com</a></cite></p> <p>そのまま、と書きましたが実際には<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> PCの上で動くDockerの中で実行しました。</p> <p>コマンドを列挙するとこんな感じです。</p> <pre class="code" data-lang="" data-unlink># dockerでubuntuの環境を作成 $ docker run --rm -it ubuntu bash # apt-get update # apt-get install wget make build-essential gcc g++ bzip2 cpio unzip rsync bc libncurses-dev file # wget https://buildroot.org/downloads/buildroot-2022.02.tar.xz # tar xJvf buildroot-2022.02.tar.xz # cd buildroot-2022.02 # make raspberrypi0_defconfig</pre> <p>ここまでが準備です。</p> <p>必要なパッケージをインストールして、buildroot本体を取得し展開します。</p> <p>makeを使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Zeroの設定を読み込みます。</p> <p>他の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>向けのイメージを作る際は<code>make list-defconfigs</code>を実行してボードを探してみてください。</p> <p>次に細かい設定を行います。胃かを実行すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/CUI">CUI</a>で動くメニューが起動します。</p> <pre class="code" data-lang="" data-unlink># make menuconfig</pre> <p>キーボードを使っていくつか設定を変更します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220331/20220331221730.png" alt="f:id:inajob:20220331221730p:plain" width="997" height="522" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>今回は最低限の日本語入力ができることを目的としているため以下の設定変更を行いました。</p> <ul> <li>Toolchain <ul> <li>C libraryを muslに変更</li> </ul> </li> <li>Target packages <ul> <li>Show packages that are also provided by <a class="keyword" href="http://d.hatena.ne.jp/keyword/busybox">busybox</a> のチェックを入れる</li> <li>Text editors and viewers <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a> にチェックを入れる</li> </ul> </li> <li>Graphic libraries and applications (graphic/text) <ul> <li>fbterm にチェックを入れる</li> </ul> </li> <li>Development tools <ul> <li>git にチェックを入れる(これはあってもなくても良い)</li> </ul> </li> </ul> </li> </ul> <p>このあとmakeを実行するとビルドが始まります(数時間かかります)</p> <pre class="code" data-lang="" data-unlink># make</pre> <p>ビルドが完了すると <code>output/images/sdcard.img</code> が生成されます。</p> <p>以下のようなコマンドでコンテナからイメージファイルをホストマシンに取り出します。</p> <pre class="code" data-lang="" data-unlink>$ docker cp コンテナのID:/root/buildroot-2022.02/output/images/sdcard.img ./</pre> <p>後は適当なツールを使ってこのイメージをSDカードに焼きます。 (自分は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Imagerを使いました)</p> <h1>この状態から日本語入力を実現するためのア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C7%A5%A2">イデア</a></h1> <p>普通に考えると<a class="keyword" href="http://d.hatena.ne.jp/keyword/uim">uim</a>などの日本語変換の仕組みをインストールするのですが、慣れないBuildrootで、これを実現するのはちょっと面倒そうです(やってみると簡単なのかもしれませんが)。</p> <p>ということで、今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>上で動作する<a class="keyword" href="http://d.hatena.ne.jp/keyword/skk">skk</a>.<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>というのを試してみることにしました。</p> <h1>日本語表示・入力のための下準備</h1> <p>ここからの操作は<a class="keyword" href="http://d.hatena.ne.jp/keyword/ext3">ext3</a>をマウントできる仕組みが必要です。自分は今回使うのとは別の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>に外付けSDカードドライブを取り付けてこの作業を実施しました。 (以降~などのパスが出てきますが、これはSDカードを使ってブートした時のパスを表しています、ホストの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a>のパスではありません。)</p> <p>日本語表示はfbterm、日本語入力は<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>上で動作する<a class="keyword" href="http://d.hatena.ne.jp/keyword/SKK">SKK</a>で実現します。</p> <p>日本語表示に必要なttfファイルを<code>~/.fonts</code>に配置します。</p> <p>自分は<a href="http://jikasei.me/font/genshin/">&#x6E90;&#x771F;&#x30B4;&#x30B7;&#x30C3;&#x30AF; (&#x3052;&#x3093;&#x3057;&#x3093;&#x30B4;&#x30B7;&#x30C3;&#x30AF;) | &#x81EA;&#x5BB6;&#x88FD;&#x30D5;&#x30A9;&#x30F3;&#x30C8;&#x5DE5;&#x623F;</a> を使いました。ダウンロードしたのちに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%F9%C9%FD%A5%D5%A5%A9%A5%F3%A5%C8">等幅フォント</a>の「GenShinGothic-Normal.ttf」だけを取り出し上記パスに配置しました。</p> <p>fbtermの設定(~/.fbtermrc)でGen Shin Gothic Normalを指定することで、このフォントが利用できます (利用できるフォント名は fbterm -v を実行すると確認できます。)</p> <p>次に<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>上で動作する<a class="keyword" href="http://d.hatena.ne.jp/keyword/SKK">SKK</a>の設定です。</p> <p>今回は以下を利用します。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fvim-skk%2Fskk.vim" title="GitHub - vim-skk/skk.vim: skk.vim with miscellaneous hacks. patches/forks are welcome. if you are insterested in improving skk.vim, please contact me by twitter, email, and so on." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/vim-skk/skk.vim">github.com</a></cite></p> <p>以下のページを参考にセットアップを実施します。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fjan_pali_1212%2Fitems%2F363a0b78408dcb2ec6d7" title="Vimにskk.vimを導入して快適な日本語入力環境を作る - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://qiita.com/jan_pali_1212/items/363a0b78408dcb2ec6d7">qiita.com</a></cite></p> <p><code>~/.vim</code>以下にgit<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>の<code>plugin</code><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リをそのままコピーするだけです。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/SKK">SKK</a>の辞書も上記記事のまま、<a class="keyword" href="http://d.hatena.ne.jp/keyword/wget">wget</a>で取得しホーム<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ直下に解凍しておきます。</p> <p>今回は上記記事を真似て<code>SKK-JISYO.L</code>を使いました。</p> <p><code>~/.vimrc</code>にも上記記事そのままの設定を書きました</p> <pre class="code" data-lang="" data-unlink>let skk_large_jisyo = &#39;~/SKK-JISYO.L&#39; let skk_auto_save_jisyo = 1</pre> <h1>ブート、日本語入力</h1> <p>さて、ここまで準備出来たら、SDカードをアンマウントし<a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> Zeroに挿入します。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/HDMI">HDMI</a>ケーブルでディスプレイに接続、USB-OTGアダプタを経由してキーボードを接続し、電源USBを接続します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220331/20220331222505.png" alt="f:id:inajob:20220331222505p:plain" width="666" height="888" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>起動すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/HDMI">HDMI</a>ケーブルで接続したモニタにコンソールが表示されます。</p> <p>私の環境では6.5秒程度でログイン待ちコンソールが表示されました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220331/20220331222526.png" alt="f:id:inajob:20220331222526p:plain" width="666" height="888" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ログインコンソールに<code>root</code>と入力するとログインできます。</p> <p>さらに<code>fbterm</code>と入力し日本語が表示できるようにします。</p> <p>そして満を持して<code>vim</code>を実行し、挿入モードに入ってCtrl+Jを押してしばらく待つと<a class="keyword" href="http://d.hatena.ne.jp/keyword/skk">skk</a>.<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>の日本語入力モードに入ります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220331/20220331222545.png" alt="f:id:inajob:20220331222545p:plain" width="1184" height="888" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>ということで、ここまでで 高速起動する日本語入力できる環境を作ることが出来ました。</p> <h1>まとめ</h1> <p>Buildrootを初めて使いましたが、特に工夫しなくても6.5秒で起動するイメージが作れる素晴らしいものでした。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Raspberry%20Pi">Raspberry Pi</a> 3/4など、もっと性能の良いボードを使えばさらに高速化できると思います。</p> <p>まだまだ最適化の余地はありますし、SDカードの種類などでも起動の速度は異なると思います。</p> <p>さらに、<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>だけあれば動作する<a class="keyword" href="http://d.hatena.ne.jp/keyword/SKK">SKK</a>実装を使うことで、簡単に日本語入力環境を作ることが出来ました。</p> <p>自作の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DD%A5%E1%A5%E9">ポメラ</a>的なガジェットを作る際にはこの知見が役立ちそうです。</p> <p>この記事をご覧になっている方で、似たような挑戦をしたことがある方は、ぜひ <a href="https://twitter.com/ina_ani">https://twitter.com/ina_ani</a> に教えてください。</p> inajob エンジニアパパの2歳までのクリエイティブなDIY育児の記録 hatenablog://entry/13574176438077291317 2022-03-28T08:37:10+09:00 2022-03-28T08:37:10+09:00 このブログでもちょこちょこクリエイティブな育児情報を発信してきましたが、それらは割と大掛かりなものでした。 そこで今回は、記事にするほどでもない日々の小粒なDIY事例を紹介しようと思います。 同じようなコンセプトで生後2か月の時に書いた記事はこちら。 inajob.hatenablog.jp うちの娘ももうすぐ2歳となりますが、ここまでに行ってきた小粒なDIY事例を紹介していきます。 3Dプリント失敗作を入れたマラカス あまり遊んでくれず おむつのパッケージの赤ちゃんを切り取っておもちゃ箱に貼り付ける じっと見ていた なぜか某アニメ風の顔をいろいろな育児グッズに描く(妻) 特に娘は反応せず う… <p>このブログでもちょこちょこクリエイティブな育児情報を発信してきましたが、それらは割と大掛かりなものでした。</p> <p> </p> <p>そこで今回は、<strong><span style="color: #0000cc;">記事にするほどでもない日々の小粒な<a class="keyword" href="http://d.hatena.ne.jp/keyword/DIY">DIY</a>事例</span></strong>を紹介しようと思います。</p> <p> </p> <p>同じようなコンセプトで生後2か月の時に書いた記事はこちら。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Finajob.hatenablog.jp%2Fentry%2Fdiy-for-baby" title="エンジニアパパの生後2か月までのクリエイティブなDIY育児の記録 - inajob's blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://inajob.hatenablog.jp/entry/diy-for-baby">inajob.hatenablog.jp</a></cite></p> <p>うちの娘ももうすぐ2歳となりますが、ここまでに行ってきた小粒な<a class="keyword" href="http://d.hatena.ne.jp/keyword/DIY">DIY</a>事例を紹介していきます。</p> <p> </p> <h4>3Dプリント失敗作を入れたマラカス</h4> <p>あまり遊んでくれず</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224149.png" alt="f:id:inajob:20220327224149p:plain" width="275" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>おむつのパッケージの赤ちゃんを切り取っておもちゃ箱に貼り付ける</h4> <p>じっと見ていた</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224233.png" alt="f:id:inajob:20220327224233p:plain" width="279" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>なぜか某アニメ風の顔をいろいろな育児グッズに描く(妻)</h4> <p>特に娘は反応せず</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224307.png" alt="f:id:inajob:20220327224307p:plain" width="288" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224524.png" alt="f:id:inajob:20220327224524p:plain" width="288" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>うんこ棒の反対側を保護するキャップを3Dプリンーーで作る</h4> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220328/20220328083525.png" alt="f:id:inajob:20220328083525p:plain" width="586" height="325" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>良かった写真を額縁に入れて飾る(妻)</h4> <p>家にいてふと目に留まるとなごむ</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224340.png" alt="f:id:inajob:20220327224340p:plain" width="291" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>足置きとしての技術書</h4> <p>足が地に着くほうが落ち着くらしいです。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224413.png" alt="f:id:inajob:20220327224413p:plain" width="290" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>トンネルを自作</h4> <p>結構遊んでくれました。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224616.png" alt="f:id:inajob:20220327224616p:plain" width="288" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>牛乳パックで積み木</h4> <p>これも結構遊んでくれました</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220328/20220328083613.png" alt="f:id:inajob:20220328083613p:plain" width="288" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>コンセントカバーの隙間を<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>を使って埋める</h4> <p>別にこの隙間があっても困ることはないですが、不格好だったので・・</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225604.png" alt="f:id:inajob:20220327225604p:plain" width="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" />→<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225623.png" alt="f:id:inajob:20220327225623p:plain" width="263" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>ニューブロックで親が遊ぶ</h4> <p>親の方が夢中になるパターン</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224715.png" alt="f:id:inajob:20220327224715p:plain" width="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224740.png" alt="f:id:inajob:20220327224740p:plain" width="203" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>気付くと真面目なメモを書き始める落書き大会</h4> <p>娘のために描いてたはずが、突然真面目なア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C7%A5%A2">イデア</a>メモを書き始めたりもします。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224805.png" alt="f:id:inajob:20220327224805p:plain" width="274" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>水で絵が描けるシートが便利</h4> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224827.png" alt="f:id:inajob:20220327224827p:plain" width="282" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>これです。壁とかに落書きされないので安心です。</p> <div class="freezed"> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B00B7T1AWU?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51wHcGwyDWL._SL500_.jpg" class="hatena-asin-detail-image" alt="スイスイおえかき NEW カラフルシート" title="スイスイおえかき NEW カラフルシート" /></a> <div class="hatena-asin-detail-info"> <p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B00B7T1AWU?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">スイスイおえかき NEW カラフルシート</a></p> <ul class="hatena-asin-detail-meta"> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A5%A4%A5%ED%A5%C3%A5%C8%A5%B3%A1%BC%A5%DD%A5%EC%A1%BC%A5%B7%A5%E7%A5%F3">パイロットコーポレーション</a>(PILOT CORPORATION)</li> </ul> <a href="https://www.amazon.co.jp/dp/B00B7T1AWU?tag=inajob-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div> </div> </div> <h4>ドアノブをやたらと開け始めたので対策</h4> <p>ドアノブを外すと、90度回転させて取り付けることが出来ます。こうなると通常のノブより開けるのが難しくなります。(今の所これを開けることはないです</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224850.png" alt="f:id:inajob:20220327224850p:plain" width="298" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>言葉遊びかるたを自作(妻)</h4> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224908.png" alt="f:id:inajob:20220327224908p:plain" width="318" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>緩衝材に顔を描いておもちゃにする</h4> <p>あまり遊んでくれず</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327224939.png" alt="f:id:inajob:20220327224939p:plain" width="313" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>マスキングテープを駆使して娘に年賀状を書いてもらう(妻)</h4> <p>悩みの種の年賀状のデザインを娘の落書きで済ませるという作戦。</p> <p>マスキングテープで白を残した部分のおかげでデザインっぽくなった。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225038.png" alt="f:id:inajob:20220327225038p:plain" width="308" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>引き出しにイラストを描く(妻)</h4> <p>保育園とかでも良く見かけるアレ</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225055.png" alt="f:id:inajob:20220327225055p:plain" width="310" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>ブロックで親が遊ぶ</h4> <p>親の方が熱中するシリーズ</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225119.png" alt="f:id:inajob:20220327225119p:plain" width="263" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225138.png" alt="f:id:inajob:20220327225138p:plain" width="298" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225153.png" alt="f:id:inajob:20220327225153p:plain" width="284" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>一口ゼリーの容器で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%F3%A5%C8%A5%A6%A5%E0%A5%B7">テントウムシ</a>を作る(妻)</h4> <p>これはよく遊んでいた。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%B9%A5%D1">コスパ</a>の良いおもちゃです。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225216.png" alt="f:id:inajob:20220327225216p:plain" width="312" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>縄跳びをぶつ切りにしてポットん落としを作る(妻)</h4> <p>ベビーシッターさんに教えてもらったおもちゃ</p> <p>よく遊んでいる</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225250.png" alt="f:id:inajob:20220327225250p:plain" width="311" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>これを並べて絵のようなものを作る</h4> <p>親の方が遊ぶパターン</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225316.png" alt="f:id:inajob:20220327225316p:plain" width="309" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225334.png" alt="f:id:inajob:20220327225334p:plain" width="308" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225353.png" alt="f:id:inajob:20220327225353p:plain" width="305" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225410.png" alt="f:id:inajob:20220327225410p:plain" width="303" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4>洗面所下の収納をむやみに開かないようにする部品を<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF%A1%BC">3Dプリンター</a>で作る</h4> <p>今の所これで開けられなくなりました。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220327/20220327225457.png" alt="f:id:inajob:20220327225457p:plain" width="373" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h3>まとめ</h3> <p>生後2か月ごろから 2歳くらいの間に作った<a class="keyword" href="http://d.hatena.ne.jp/keyword/DIY">DIY</a>系の事例をざざっと紹介しました。</p> <p>ここまでの所、このように親も楽しみながら育児出来ています。</p> <p> </p> <p>子供への影響とかそういうのもありますが、まずは<strong><span style="color: #0000cc;">親が楽しんで育児をする</span></strong>のが大切だと思っています。</p> <p> </p> <p>引き続きクリエイティブに育児をしていきたいと思います。</p> inajob キッチン水切り棚の導入と3Dプリンターによる不具合修正 hatenablog://entry/13574176438074492671 2022-03-20T12:21:21+09:00 2022-03-20T12:21:21+09:00 キッチン水切り棚 皆さんの家は洗った食器を置く棚、どのようなものを使っていますか? 我が家はもともと、シンプルな水受けの付いた棚だったのですが、子供が生まれたこともあり、皿の数が増え、少し手狭になってきました。 そこで、いわゆる「水切り棚」を購入することにしました。 ここで言う「水切り棚」というのは、キッチンシンクの上に固定できる棚で、棚から落ちた水がそのままシンクに落下するため、水受けが不要となり、かつスペースが節約できるという便利収納家具のことです。 初回購入のミス 比較的大物家具という事で、長さを計ったりして、良さそうなものを注文したのですが、棚の脚間の内径と外形を取り違えたせいで、絶妙… <h1>キッチン水切り棚</h1> <p>皆さんの家は<strong>洗った食器を置く棚</strong>、どのようなものを使っていますか?</p> <p>我が家はもともと、<strong>シンプルな水受けの付いた棚</strong>だったのですが、子供が生まれたこともあり、皿の数が増え、少し手狭になってきました。</p> <p>そこで、<strong>いわゆる「水切り棚」</strong>を購入することにしました。</p> <p>ここで言う<strong>「水切り棚」</strong>というのは、<strong>キッチンシンクの上に固定できる棚</strong>で、棚から落ちた水がそのままシンクに落下するため、水受けが不要となり、かつスペースが節約できるという便利収納家具のことです。</p> <h1>初回購入のミス</h1> <p>比較的大物家具という事で、長さを計ったりして、良さそうなものを注文したのですが、棚の脚間の内径と外形を取り違えたせいで、絶妙に我が家のシンク上に設置できない棚を購入してしましました・・</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B099J5WQLY?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51+RMeiyxwS._SL500_.jpg" class="hatena-asin-detail-image" alt="MEARTEVE水切りラック シンク上 2段 スリム ステンレス 大容量 食器 キッチン収納 箸立て 皿立て まな板立て 台所 水切りかご 一人暮らし 65CM" title="MEARTEVE水切りラック シンク上 2段 スリム ステンレス 大容量 食器 キッチン収納 箸立て 皿立て まな板立て 台所 水切りかご 一人暮らし 65CM"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B099J5WQLY?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">MEARTEVE水切りラック シンク上 2段 スリム ステンレス 大容量 食器 キッチン収納 箸立て 皿立て まな板立て 台所 水切りかご 一人暮らし 65CM</a></p><ul class="hatena-asin-detail-meta"><li>MEARTEVE</li></ul><a href="https://www.amazon.co.jp/dp/B099J5WQLY?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>幅も足らなければ、高さも大きすぎて、シンク上収納と干渉してしまうという残念な結果です。</p> <p>返品なども考えたのですが、ちょうど<strong>工作室の棚</strong>に良いという事に気付いたので、返品せずに活用することにしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121334.png" alt="f:id:inajob:20220320121334p:plain" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>これ、意外と良いですよ。</p> <h1>2度目の正直</h1> <p>初回購入でミスしたので、今度はしっかりと寸法を測って、適合する商品を探しました。</p> <p>要件は・・</p> <ul> <li>シンク幅制限</li> <li>シンク高さ制限</li> <li>できれば2段</li> </ul> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121419.png" alt="f:id:inajob:20220320121419p:plain" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>どうやら我が家の要件だと、海外製の安い水切り棚では対応するサイズが無く、少し高めの日本製のものがよさそうだという事がわかりました。</p> <p>という事で、2度目はこちらを購入。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B086DHVWZQ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41jv31BeLFL._SL500_.jpg" class="hatena-asin-detail-image" alt="川口工器 シンク上 伸縮式 システム 水切りラック 奥行23cm ステンレス製 (2段) 19401" title="川口工器 シンク上 伸縮式 システム 水切りラック 奥行23cm ステンレス製 (2段) 19401"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B086DHVWZQ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">川口工器 シンク上 伸縮式 システム 水切りラック 奥行23cm ステンレス製 (2段) 19401</a></p><ul class="hatena-asin-detail-meta"><li>川口工器(Kawaguchi <a class="keyword" href="http://d.hatena.ne.jp/keyword/Koki">Koki</a>)</li></ul><a href="https://www.amazon.co.jp/dp/B086DHVWZQ?tag=inajob-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <p>この商品は横幅、高さともに可変という事で、我が家の要件にマッチしました。</p> <p>棚部分は、フラットなものとかご状のものをそれぞれ選択できるのですが、フラットなものは端の囲いがなく、食器が落下しそうだったので、かご4つタイプを選択しました。</p> <h1>棚のサイズは良し!しかし・・・</h1> <p>設置してみたところ棚のサイズは問題なく、無事にキッチンに設置することが出来ました。</p> <p>しかし、新たな問題として、かごと皿の相性問題が発覚しました。</p> <p>この棚に付属しているかごの幅が、絶妙に我が家の皿とマッチしません。</p> <p>小さな皿はすり抜けて落ちてしまうし、大きな皿はかごの幅が足りず入りません。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121452.png" alt="f:id:inajob:20220320121452p:plain" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121514.png" alt="f:id:inajob:20220320121514p:plain" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121538.png" alt="f:id:inajob:20220320121538p:plain" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>またしても失敗か・・・</p> <p>と思ったのですが、代替となりそうな棚も見つからないし、何とか工夫して乗り切ることにしました。</p> <h2>Try1 100均の皿置きを重ねる</h2> <p>収納で利用していた皿置きを棚の上に載せてみました。これで一応皿を収納することが出来ました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121605.png" alt="f:id:inajob:20220320121605p:plain" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>しばらくこれで運用していたのですが、皿が高い位置に収納されてしまうため、上の収納と干渉してしまい、出し入れするのが難しいことがわかりました。</p> <h2>Try2 <a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>でシンデレラフィットの皿置きを作る</h2> <p>Try1 は結構いい感じだったのですが、皿置きの幅と棚の幅が合わないために、無駄にスペースを取ってしまっていたのが問題だと考えました。</p> <p>そこで我が家の<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>を活用して、棚のサイズにぴったりの皿置きを作る事にしました。</p> <p>この棚の問題は大きく2つあります</p> <ul> <li>棚の幅が狭いのに、深すぎて、大きな皿が奥まで入らない</li> <li>棚の網の間隔が広すぎて、皿が倒れたり、小さな皿が落下する</li> </ul> <p>これを解決するために、以下の対策を考えました</p> <ul> <li>皿置きに高さを持たせることで負傘を底上げする</li> <li>網の間隔を狭くする、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%A3%CC%D6">横網</a>により落下を防ぐ</li> </ul> <p>ということで、OpenSCADでささっと立体を設計し、、<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で印刷! <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121636.png" alt="f:id:inajob:20220320121636p:plain" width="1002" height="598" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>意外と大きくなってしまったので、形状は単純なのですが印刷に5時間ほどかかる大作になってしまいました・・</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121655.png" alt="f:id:inajob:20220320121655p:plain" width="900" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1>何とか使えるものになった</h1> <p>ということで、使い勝手が微妙だった水切り棚に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>で作った皿置きを組み合わせる事で、何とか使い物になるソリューションが完成しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/i/inajob/20220320/20220320121724.png" alt="f:id:inajob:20220320121724p:plain" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1>まとめ</h1> <p>色々失敗も多かった水切り棚の購入ですが、いろいろと試行錯誤して、それなりに使いやすいものが出来ました。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/3D%A5%D7%A5%EA%A5%F3%A5%BF">3Dプリンタ</a>はこういうちょっとした生活の工夫が出来て便利です。</p> inajob