h_nari @ 熊本市のブログ。電子工作、プログラミング、ゲーム、TV、 政治、インターネットなどに日々の思い付きを、 うだうだ~と書いていきたい。
このブログにはコメント欄を設けておりません。 記事への御意見、ご質問はtwitter @h_nari宛に お願い致します。


アーカイブ


アマゾン・ベストセラー

メタ情報
RSS
Login

タグ「電子工作」が付いた記事

CH552互換USB Blaster動作!

前回、CH552使用の互換USB Blasterが動かない、 プログラムが書き込めるが動かない、 ブートローダが書き換えられているのではないか と騒いていたが原因がわかった。 プログラムが書き込め、動作し、Quartus Prime Liteで MAX2に書き込むこともできた。 原因はCH552および互換USB Blasterについての不理解であった。

まず、注文していたCH552Gチップが届いたので 互換USB Blasterのチップと交換してみた。 プログラムは書き込めるが、動作しない。 交換前と全く同じ動作である。

次に、CH552GとUSBコネクタのみの回路で 動作するか実験を行うため必要な部品、 SOP16変換基板, ミニBメスUSBコネクタDIP化キット CH552P DIP化キットをついでに購入。 ブレッドボード上で実験したところ CH552P + USBコネクタで動作、 CH552G + USBコネクタでも動作した。

そこで動作するCH552Gと互換USB BlasterのCH552Gの 各端子の電圧を比較し、 互換USB BlasterのCH552Gの電源が3.3Vであることに 気が付いた。動作する方のCH552Gは5V。 Arduinoの設定で調べると 電源が3.3Vの場合クロックは16MHzに しなければいけないらしい。 クロックを24MHzにしていたため 動作しなかったらしい。 Arduinoで16MHzに設定を変更すると 互換USB Blaster上でLED点滅プログラムが動作した。

CH55x-USB-Blasterのプログラムは クロックが24MHzで5V電源用になっている。 これを16MHzに変更、端子配列も 互換USB Blaster用に変更し書き込むと Quarus Prime Liteに認識され、MAX 2に書き込むことができた。 LEDの論理が逆で常時店頭になっていたためプログラムを修正した。

変更の差分を以下に示す

今回理解していなかったCH55xの知識は

  • CH55xは電源5Vでも3.3Vでも動く。 3.3VでもUSBは動作する
  • 端子のHighレベルの電圧は電源電圧となる。 但し、USBの端子は常時3.3Vだと思われる
  • 電源5Vの時、クロックは最大24MHzだが、3.3V時は最大16MHz
  • CH552互換USB BlasterはHighレベルを3.3Vにするため電源3.3Vで動作している
となる。 CH55xへの理解が深まった。

安く買える互換USB Blasterが使用できるのはありがたい。



CH552版互換USB Blaster

CH552使用の互換USB Blasterが動かない件調査のため AliExpressに注文したものが到着した。 購入したのは CH552 ミニコアボード 199円 × 4個と 互換USB Blaster 225円 × 4個。 1個でよかったのだが1個の価格では 迅速配送が利用できず到着に時間がかかりそうだったので 迅速配送が利用できる最低量を購入した。 ちなみに迅速配送料は 459円と728円。1週間程度で届いた。 互換USB BlasterはCH552使用で前に購入したものと 同じで期待通り。

これらで試してわかったこと

  • CH552 ミニコアボードに CH55x-USB-Blaster のHEXファイルを書き込むと Intel Quartus Prime Lite Editionに認識されるし MAX2ボードに書き込みもできた。
  • 互換USB BlasterのCH552へのプログラム書込みはできるが 動作しない。ブートローダに手が入れられているっぽい。

CH552ミニコアボードでUSB Blaster

CH552 ミニコアボードに CH55x-USB-Blaster のHEXファイルを書き込んだら Intel Quartus Prime Lite EditionにUSB-Blasterとして認識された。 期待を持たせる展開だ。 ドライバーは Intel Quartus Prime Lite Edition同梱のもの。 MAX2ボードのJTAG端子と ブレッドボードとジャンパーピンで 1KΩの抵抗を介し接続。 (TMS - P1.4, TCK - P1.7, TDI - P1.5, TDO - P1.6) 不安定ながらも、なんとか書き込みに成功した。 その後、ミニコアボードと10ピンフラットケーブルコネクタを ユニバーサル基板上に配線し直したところ 安定して書き込みができるようになった。

CH55x-USB-BlasterのコードではコアボードとLEDが接続されている端子が違う。 ソースを修正し書き込んだところ、CPLDにコードをダウンロードする時、LEDが点灯するようになった。 CH55x-USB-Blasterのコンパイル時の注意点。

  • ch554_sdccが必要。 examplesの下に CH55x-USB-Blasterを展開するとmakeできる。 必要な環境整備については ch554_sdccの説明が詳しい。
  • 私は環境整備が楽なLinux上でコンパイルしたのだが、 出来上がった usb_blaster.hexをWindows側の WCHISPTOOLで書き込もうとすると 「不正なHEXファイル」とエラーになる。 改行がLFなのがまずいらしい。CRLFに変換すると書き込める。

CH552互換USB Blasterプログラム書き込めない問題

CH552互換USB Blasterは基板にD+や3V3などの端子が出ているので これらの間を10KΩで接続しUSBケーブルを刺し込むとプログラム書込みモード になり WCHISPTOOLで認識され、プログラムを書き込めたっぽいメッセージが出る。 ところがプログラムが動かない。LED点滅のプログラムが動かない。 USBデバイスとして認識されなくなるので元のプログラムは破壊されたようだ。 LEDが接続されている端子が違うのではないかとか、 必要な初期化がされていないのではないかとか いろいろ調べるがわからない。 ArduinoでLED点滅プログラムを書き、 コアボードで動作を確認後、そのまま互換USB Blasterに 書き込んでも動かない。LEDが点滅しないのは良いとしてCOMポートとしても 認識されので、これはブートローダに手を入れられていると確信した。

CH552はD+端子をプルアップされた状態で電源投入されると ブートローダが動作するが、これは 0x3800番地からのプログラムが 動作しているだけで、しかるべき回路なりプログラムがあれば書き換え可能らしい。 このプログラムを標準のものと置き換え、 単純な暗号化を施されたコード、例えば ビット反転したコードを書き込むようにすれば そのことを知らない人はプログラムの書き換えができなくなる。 知っている人は、簡単なHEXファイル編集プログラムを介するだけで 書込みは可能だ。

そのような改造が互換USB BlasterのCH552Gチップに施されている と推測している。 そうだとすれば、CH552Gチップを市販のものに貼り変えれば ふつうにプログラム書き込み可能になるはず。 CH552Gチップを注文した。

そもそもCH552互換USB Blasterが普通に動作すれば こんなにいろいろ手間をかける必要はないのだが、 動かないから200円ぐらいで売っているという気もする。 CH552版USB Blasterが購入したまま何もせず使えたという人がいたら教えて欲しい。 外見が同じでも中身が全く違う互換USB Blasterが沢山あるから 注意が必要だ。



謹賀新年2024

CH552を使用した中華USB Blasterは、まだ使用できる状態になっていない。 動かない事情を推察するに

  • Win10でデバイスドライバに署名が必要になる
  • Intel(Altera)製のドライバーで従来使用していなかった機能を使う
  • 互換USB Blasterが動かなくなる

Win10環境で使用可能な互換USB Blasterがあれば、この説は崩れるのだがあるのかな? この記事のWin7用ドライバーもインストールしてみたが、 動かなかった。 デバイスマネージャーで見てみると

部分一致またはあいまい一致のためデバイス USB\VID_09FB&PID_6001\FFFFFFFF は移行されませんでした。

とか言われている。

CPLDも急いて開発しなければいけないわけではないし、 CH552も面白そうなので、気長にCH552と付き合ってみようかと思う。 開発環境もわかってきた。 CH552の互換USB Blasterはソースを CH554 sdk for SDCCのexamplesの下に 展開するとコンパイルできることが分かった。 書込みは メーカー提供のツールでできる。 ブームに乗り遅れることと2,3年? AliExpressに CH552ボードも注文してみる。



年末年始用おもちゃ

年末年始の暇つぶし用に購入したものを紹介する。 購入したのは以下の3点。

最近、typescriptでwebのプログラムばかり書いているので 気分転換に電子工作っぽいものを買ってみた。

M5Stamp Dialは M5Stamp S3に 円形LCDやロータリーエンコーダを組合わせた製品で なかなかそそる。 円形LCDは気にはなっていたが 価格が若干高いのと具体的な使い道を 思いつかなかった。 今回、ロータリーエンコーダもついたので 以前作ったものを作り直したらカッコ良さそうと考え購入。

USB type-Cケーブルを刺すだけでデモのプログラムが動くが なかなかカッコ良い。開発環境はplatformioを使用し、 サンプルプログラムがあっさり動いた。 とまどったのは シリアル通信に Serialではなく USBSerialを使わないといけない点ぐらい。

これでWindowsの音量調整する奴とか作れば カッコイイのではとか思いつくが、 調べると 2,500円ぐらいで買えるらしいので コスパでは敵わない。

MAX2 EPM240ボードの購入理由は、 長く使っている部品で、だいぶ前に製造中止になり、 入手が難しく価格も高くなったものがあり、 CPLDを使えば代替品を作れるのではと思ったこと。 CPLDに入る回路の規模感がわからないので、 とりあえず開発ボードで動かしてみようと考え、 CPLDの開発ボードを探すが、安いのはこれしか見つからなかった。 プログラム書込み用にUSB Blaster(互換)ケーブルも購入。

無料の開発環境 Quarus Prime Liteをダウンロードし サンプルの回路をコンパイルしチップに書き込もうとするが 互換USB Blasterが認識されない。 いろいろ調べ、いろんなドライバーをインストールし試すが 認識されない。

USB Blasterの蓋を開け、基板をみると CH552が使用されている。 互換USB Blasterには FT245を使用するもの、PICを使用するもの、 ST32を使用するものなどいろいろあるらしい。

USB Blaster Ch552で調べると、 CH552をUSB Blasterにするプログラムが 公開されているし、 CH552もプログラム書込み可能らしいので その辺を試そう。

とかやっているうちに、 セルダ ティアーズ オブ キングダムを またやりたくなり始めてしまった。 RTAではないが、効率の良い進め方 を探りながらプレイするのが楽しい。 正月はこれで終わってしまうかもしれない。



STM32H723に手を出す

STM32HシリーズはSTM32の高性能シリーズで デュアルコアの物まである。 STM32H723(以下H723と記す)は Cortex-M7のシングルコアで CPUクロックは最大550MHz。 以前よく使っていたSTM32F405は最大168MHzなので 3倍以上ということになる。 性能が必要な処理をマイコンでやらないので 高性能マイコンに興味が無かったのだが USBのhi-speed通信(480Mbps)に手を出し欲しくなった。

USB hi-speedの転送実験は 外付けPHY USB3300 を使用したものはうまくいかず、 PHY内蔵の STM32F723(以下 F723と記す) で成功したが 転送速度は 20Mbpsを超える程度であった。 USB full-speedの12Mbpsは超えているものの 速くは無い。もっと処理速度が欲しい。 性能が上がれば100MbpsのEthernetの転送速度も 上がるかもしれない。

ali-expressでF723チップを探している時 H723モジュールを目にしたのが H723に興味を持ったきっかけである。

現状

手っ取り早く使ってみたいので NUCLE-H723ZGをdigikeyで購入。 STM32CubeMXでひな型プログラムを生成し、 レジスタ定義のヘッダファイル、 リンカースクリプト等々を入手。 テストプログラムをコンパイルし ST-Linkで書き込むがエラー、 STM32CubeProgrammerを使う必要があるらしい。 NUCLEO基板上のLEDでLチカは割と簡単にできた。 次にUSARTを動かそうとするが上手くいかない。 コントロールレジスタのビット配置が変更になっていた。 その後、クロックの設定に苦労する。 なぜか550MHzまで上げられるはずが400MHzまでしか動かない。 何か見落としがあるのだろう。

今後

今後やりたいことは
  • 割込み、DMA等を動かす
  • NUCLE基板上のEthernetとUSB(full-speed 12Mbps)を動かす
  • 基板を起こして外付けPHYでUSB hi-speedを動かす
など。

自作のライブラリ、Makefile環境が使いやすいので ついついそちらを使ってしまうが STM32CubeMXでUSBやEthernetのライブラリが提供されているので これを素直に試してみるのも良いのかもしれない。



Elecrow ESP32 Display 購入

Elecrowが販売している ESP32 displayを買ってみた。 価格は 購入時は$19.90だったが 今は $13.93に値下げされている。 タッチスクリーン付き 2.4インチ320x240のLCDフルカラーディスプレに ESP32を組み合わせた1枚基板。 プログラム書込み兼給電のUSB Type-Cコネクタと micro SDカードソケット、 4ピンのGrove互換ぽいコネクタ3個、 バッテリー用コネクタとスピーカ用コネクタが実装されている。 ちなみにディスプレーサイズの違う製品がシリーズ展開されており 2.4, 2.7, 3.5, 4.3, 5.0, 7.0インチLCDの製品がある。 7.0インチディスプレーの場合、解像度は 800x480で CPUはESP32-S3となっている。

ESP32+LCDディスプレーで、ちょいと何か作ろうという便利そうだし 安いので基板の注文のついでに購入。 似た製品として M5Stackがあるが 当初$20台で安いイメージがあった M5Stackも今は M5Stack BASICで6,800円と あまり安くない。 あとM5Stackは実際に使おうとすると 内蔵リチウム電池がジャマだったりする。 そういうわけで、このESP32 Displayの方が便利な場面もあるのではないか と思う。

あとは、デモでも動かしてみたいところだが、 まだ動かしていない。 スピーカー端子があるので 得意のBluetooth Speakerでも動かそうと思ったのだが コネクタに合うケーブルが無い。 回路図を見るとJSTのPHコネクタ相当みたいなので このケーブルが使えると思うのだが まだ買っていない。 プログラムは 公式Wiki 提供されている。



回転数計購入

まだ FANコントローラをいじっている。 ESP32仕様でLCDもついているタイプの奴。 これはFANからのパルス信号で FANの回転速度がわかるのだが、 1回転が何パルスなのかがわからない。 フォトトランジスタでファンの影を検出し、 回転時の信号の周波数をオシロスコープで計測してやれば良いと 思うのだがブレッドボードで回路を組むのがメンドクサイ。 安い回転数計があれば、この機会に買っても良い。 調べると 1,554円のものがあるので買ってみた。

届いたものは、コンパクトな本体と9Vの角型電池と ケースと反射テープ。コンパクトにまとまっていて好印象。

早速、反射テープを10mm程切り出しFANに貼り計測。 白いFANに反射テープって測定できるのかと危惧したが 計測できた。反射板でなくFANの羽部分で計測すると 9枚羽なので約9倍の値が計測できた。

結果として、1回転当たりパルスが2個出力されているらしい。 FANコントローラの開発はだらだらと続く。



chatGPT続き(電子工作、プログラミング編)

前回に引き続き、chatGPTの試行歴を示す。 プログラミング、電子工作方面の 質問も試みる。


ブログのネタ教えて
何について書きたいかによって異なりますが、以下のようなブログのネタが考えられます。
  1. 自分が興味を持っていることについて書く
    • 自分の趣味や好きな音楽、映画、本などについて書く
    • 旅行や食べ物、ファッションなど、自分が興味を持っている分野について書く
  2. エキスパートが書く記事
    • 自分が得意とする分野について書く(例:料理、ファッション、英語学習など)
    • 自分が専門的に研究している分野について書く
  3. ニュースやトレンドに関する記事
    • 最新のニュースやトレンドについて解説する
    • 自分が思うニュースやトレンドについて意見を述べる
  4. 楽しく学ぶことができる記事
    • クイズやトリビア、雑学など、楽しく学べる記事を書く
    • 読書や映画、ドラマなどを通して学べることについて書く
  5. 自分の体験に基づく記事
    • 旅行や留学、子育て、就職活動、恋愛など、自分が経験したことについて書く
    • 自分が乗り越えた困難や成功体験について書く
これらのネタを参考に、自分が興味を持っていることや得意なこと、経験したことなどを元に、自分なりのアプローチで記事を書いてみると良いでしょう。

なるほど、 ごもっともです。

電子工作のネタ教えて
電子工作のネタは無限にありますが、以下はいくつかのアイデアです。
  1. ロボット
    • ロボットアームを作って、オブジェクトをつかんだり移動させたりする
    • 自律型ロボットを作って、周囲の状況を認識して自動的に移動する
  2. IoT(Internet of Things)
    • センサーを使用して、温度、湿度、照度などの情報を取得し、クラウドにデータを送信するデバイスを作る
    • スマートホームのためのセキュリティシステムを作成する
  3. 音響
    • スピーカーを自作して、音質を高める
    • マイクを使用して、音を聞いてLEDライトを点灯する
  4. マイコン
    • マイコンを使って、LEDやセンサー、LCDディスプレイを制御する
    • マイコンを使用して、スマートフォンアプリと通信する
  5. その他
    • ラジコンカーを改造して、スピードや操作性を向上させる
    • 電子楽器を作成して、音楽を作る
これらのアイデアを元に、自分の興味や得意分野に合わせて、オリジナルの電子工作を作ってみると良いでしょう。また、インターネット上には、様々な電子工作のチュートリアルやキットが公開されているので、それらを参考にするのも良いでしょう。

よくご存知で...

WebRTCを使ったプログラムを勉強したいです。
WebRTCは、リアルタイムのビデオ、音声、データ通信をブラウザ間で可能にするオープンソースのフレームワークです。WebRTCを使ったプログラムを学ぶには、以下のような手順を踏むことができます。
  1. WebRTCの概要を学ぶ
    • WebRTCが何であるか、どのような用途に使われるかを理解する。
    • WebRTCの仕組み、プロトコル、APIについて学ぶ。
  2. WebRTCを使用したビデオチャットアプリケーションの作成
    • WebRTCを使用してビデオ通話を実現するための基本的なプログラミング技術を学ぶ。
    • シンプルなビデオチャットアプリケーションを作成して、WebRTCの基本を学ぶ。
  3. WebRTCを使用したスクリーンシェアリングアプリケーションの作成
    • WebRTCを使用してスクリーンシェアリングを実現するためのプログラミング技術を学ぶ。
    • スクリーンシェアリングアプリケーションを作成して、WebRTCの機能を理解する。
  4. サーバー側の処理を追加する
    • サーバーサイドのプログラムを追加して、WebRTCアプリケーションのセキュリティや信頼性を向上させる。
    • シグナリングサーバー、STUNサーバー、TURNサーバーなどを使用して、WebRTCのさまざまな機能を追加する。
WebRTCを学ぶためには、JavaScript、HTML、CSS、Node.jsなどの技術にも精通していることが望ましいです。また、WebRTCの開発には、WebRTCネイティブAPI、WebRTC.js、SimpleWebRTC、EasyRTCなどのライブラリやフレームワークを使用することができます。それらを使用して、WebRTCの基本から応用までを学ぶことができます。

参考になります。

マイコンでWebRTCの通信をすることは可能ですか?

マイコンでWebRTCの通信を行うことは理論的には可能ですが、いくつかの制約があります。

WebRTCは、Webブラウザ上で動作するJavaScriptアプリケーションで利用されることが一般的です。WebRTCのプロトコルやAPIは、ブラウザ上で実行されるJavaScriptによって制御されます。一方、マイコンは通常、マイコン固有のプログラミング言語(C言語やアセンブリ言語など)で制御されます。

そのため、マイコン上でWebRTCの通信を実現するには、WebRTCのプロトコルやAPIをマイコン用のプログラミング言語で再実装する必要があります。これには、高度なプログラミングスキルと時間がかかる可能性があります。

また、WebRTCの通信には、高速で安定したインターネット接続が必要です。マイコンには、インターネット接続機能が組み込まれている場合がありますが、通常はWebRTCの通信に必要な帯域幅や安定性を提供するには十分ではありません。したがって、マイコンでWebRTCの通信を行うには、適切なインターネット接続環境を構築する必要があります。

総合的に考えると、マイコンでWebRTCの通信を行うことは可能ですが、多くの課題があるため、実現には高度な技術力や時間、コストがかかる可能性があります。

やっぱりそうですか...

STM32F723のHispeed USBのプリント基板の配線にはどのような点に注意すればいいですか?
STM32F723のHigh-Speed USBインタフェースを使用する場合、以下の点に注意する必要があります。
  1. USBのインピーダンスマッチング

    USBは高周波信号を使用するため、インピーダンスマッチングが重要です。USB信号線の長さが短い場合は、マッチング抵抗が必要ないことがありますが、基板上の配線が長い場合には、適切なマッチング抵抗を使用することが必要です。

  2. グランドプレーンの配置

    USBはシグナル線とグランド線の両方を使用するため、グランドプレーンの配置にも注意が必要です。シグナル線とグランド線が近くに配置されるようにすることで、ノイズの影響を最小限に抑えることができます。

  3. 電源フィルタリング

    ノイズを最小限に抑えるために、USB電源線には適切なフィルタリングを適用することが必要です。フィルタリングには、コンデンサやフェライトビーズなどが使用されます。

  4. ESD保護

    USB信号線はESD(静電気放電)の影響を受けやすいため、適切なESD保護回路を備えることが必要です。保護回路には、ESDサプレッサやTVSダイオードなどが使用されます。

これらの点に注意することで、STM32F723のHigh-Speed USBインタフェースを安定して動作させることができます。また、配線や回路設計に不慣れな場合には、専門家に相談することをお勧めします。

これも参考になります。

USB HispeedのESD保護にオススメなチップを具体的な製品名で教えてください。
USB HispeedのESD保護には、以下のようなチップがオススメです。
  1. TI社の TPD2E2U06 または TPD4E2U06

    このチップは、USB 2.0 HispeedインターフェースのESD保護に使用されます。最大耐圧は6Vで、ESD保護能力は30kV以上あります。また、小型で低抵抗なパッケージを採用しているため、高速信号伝送にも適しています。

  2. Nexperia社の PUSB6xxシリーズ

    PUSB6xxシリーズは、USB 2.0/3.2 Gen1/3.2 Gen2インターフェースのESD保護に使用されます。最大耐圧は6Vで、ESD保護能力は12kV以上あります。また、小型で低抵抗なパッケージを採用しているため、高速信号伝送にも適しています。

  3. On Semiconductor社の ESD9X.0シリーズ

    ESD9X.0シリーズは、USB 2.0/3.2 Gen1/3.2 Gen2インターフェースのESD保護に使用されます。最大耐圧は5.5Vで、ESD保護能力は15kV以上あります。また、低静電容量と高速応答を備えており、高速信号伝送にも適しています。

これらのチップは、ESD保護能力や特性、パッケージ形状などが異なるため、使用する環境や要件に応じて適切なものを選択する必要があります。また、回路設計に不慣れな場合には、専門家に相談することをお勧めします。

TPD2E2U06 91円@digikey, 在庫あり、参考になります。 別途調べたら USBLC6-2SC6, 85円@digikey,在庫あり、なども 良いらしいです。 RS chip1stop モノタロウでも売っています。

最後に

chatGPTは本当に何でも答えてくれる。 答えをそのまま信じるのは危険だが、 何でも答えてくれるのはありがたい。

今後、chatGPT等を活用し、いろんなことに挑戦していきたい。



STLINK-V3MODS

NUCLEO-F439ZIでの実験の続きで USB HiSpeed実験用の基板を製作した。 悩んだのがプログラム書き込み用の端子。 書込みにはSTLINKを使用するので4ピンの端子(SWCLK,SWDIO,GND,Vcc)があれば良い。 これとデバッグ用の FTDI USBシリアル変換ケーブル用の 6ピンの端子をつけるのが、いつものやり方。 しかしNUCLEOでUSBケーブル1本で書込みとシリアル通信ができる 環境を憶えてしまったので 2本もケーブルを抜き差しするのは面倒に感じる。

最近のSTLINKでシリアル通信も使えるないかと調べると STLINK-V3SET ならいけるらしい。 しかし 9,400円もするしサイズが大きいし品切れだ。 いっそ、STLINKを自作すれば望みのものが作れるのではと 調べSTLINK-V3MODSという製品を知る。

STLINK-V3MODS

STLINK-V3MODSはSTMicroelectronicsの製品で NUCLEOのSTLINK部分を小型にまとめたような基板。 開発基板に(ハンダ付けして)組み込んで使用することを 意図しているようだ。 Mouserに在庫があり 価格は1,196円。 安いが貧乏性なので基板に直接ハンダ付けするのには 抵抗がある。 使用しているCPUが STM32F723で 本体基板で使用するCPU(STM32F405)より高級だ。 USB HiSpeedのPHYまで内蔵している....

ということで、必要な信号のみピンヘッダに引き出す 基板を製作し、使い回しの効く自作STLINKにすることにした。 引き出す端子は, SWCLK, SWDIO, Vcc(監視), TX, RX, GND, +5V(給電)の 7本だが市販の ケーブルを使用したいので8ピンにする。

製作

年明け前に部品と基板が届いた。 STLINK-V3MODSは想像よりも小さい。 基板に組み込んで使えそうだ。

ハンダ付けは何の問題もなく完了。 このまま使うのには抵抗を感じるのでケースを作る。 STLINK-V3MODSは3Dモデルのstepファイルが提供されている。 それらを使いケースを設計。 小型のケースは軽くてケーブルに振り回され安定しないので ネオジム磁石を組み込んだ。 STLINK-V3MODS上のLEDと基板に書いた信号名が見えるように穴を空けた。 ケース上部と下部の固定は爪を出してその嵌め合いで行った。 今回はじめての挑戦だ。 何度か修正は必要だったが嵌め合いで固定できた。

プログラム書込みテスト

USB実験基板も部品を実装し プログラムの書込みを試す。 最初、CPUが認識されなかったが STLINK Utitityの更新後、書き込むことができた。

その後、シリアル通信をテストするがうまくいかない。 V3MODSの資料を見直して原因が判明。 使用している端子 T_VCP_TXが入力、T_VCP_RXが出力とある。 つまりTXは送信端子ではなく送信に繋ぐ端子(つまり受信)、 RXは受信端子ではなく受信に繋ぐ端子(つまり送信)ということだった。 この問題はマイコン基板等の端子の表記でよくおこるので、 最近はRXではなくRXO(RXだけど出力)とかTXI(TXだけど入力)などと 表記することがある。RXIやTXOは当然な気がするのでRX,TXで良いような 気がするが、 そうすると出力なのか入力なのかは資料を探さないとわからないことになる。

USB実験基板側の配線をジャンパーを飛ばし修正、シリアル通信が正常に 行えることを確認した。

最後に

次はUSB HiSpeedのプログラム作り、そして実験だ。 ゆっくり頑張ろうと思う。 しかし、STLINK-V3MODSのCPU,STM32F723はHiSpeedのPHY内蔵なのか。 欲しい。AliExpressの2,366円のやつ注文してみようか..



NUCLEO-F439ZI (2)

NUCLEO-F439ZIでの tinyUSB 試行は予想よりも上手く行った。 MSC(Mass Strage Class,いわいるUSBメモリ)は動作し、 独自デバイス(tinyUSBでいうところの vendor_device)も動作した。

やりかたはサンプルプログラムを参考に 必要そうなコードを追加していき、 所在地不明の名前はVScodeの「定義へ移動」、 見つからなければ以下のコマンドで探す。

$ find . -name '*.h' | xargs grep 探す名前

tinyUSBがコンパクトでうまく整理されているおかげで、 特にハマることもなく動作するようになった。

独自デバイスを試すには PC(Windows)側にドライバとアプリが必要だ。 ドライバが面倒でUSBはHIDデバイスばかり使っていたのだが、 汎用ドライバ(libusb)が使用できると知った。 Windowsへのインストールは Zadigでできる。簡単だ。 アプリも pyUSBがあるのでpythonで作れる。

独自デバイスの動作を確認したいが デバイス(NUCLEO)側で何か動いてくれないと面白くない。 LCDで画像などを表示すれば調度良いので LCDの乗ったArduino Shieldを装着。 この記事を書いた時に買ったものだ。

PC側のプログラムで画像を転送しデバイス側のLCDに表示させる プログラムを作成し、データの転送速度を測った。 240x240の画像の転送に0.32秒。あまり速くない。 ( 動画) LCDへの転送がネックかもしれないと疑いコメントアウトしてみたが転送時間は変わらなかった。

データ量は 240 x 240 x 4 [byte/pixel] x 8 [bit/byte] = 1,843,200 [bit]なので、 転送速度は 1,843,200[bit] ÷ 0.32 [秒] = 5.76 [Mbps] となる。 USB full-speedの12Mbpsと比較すると十分速い。 USB Hi-speedの480Mbpsに期待したい。

USB Hi-speedの実験を行うには 先日購入した USB-phyモジュールを接続しなければ ならない。手配線は面倒なので 基板を起こしたい。 実験用にLCDも載せたいので NUCLEO基板と合わせて3階建てになってしまう。 手持ちにSTM32F405が数個あるので、 これで新規基板を作ろうと思う。

NUCLEOの出番が意外と短かった。 またの登場のために保管用Boxを3Dプリントしよう。



NUCLEO-F439ZIを購入

マイコンの開発ボードNUCLEO-F439ZIを購入した。 digikeyで3,614円。 目的はUSBのHi-speed(480Mbps)で動く機器の開発。 stm32のチップは軒並み在庫が無いが 開発ボードならある。 ゆっくり開発して、できた頃には チップの在庫も復活していることを期待している。

届いた基板を見ると足が無い。 基板をそのまま置くとピンヘッダが、 より正確にはジャンパーピンが足になる。 そのまま使うわけにはいかないので3Dプリンタで台を製作した。 できたものに基板を固定しようとすると穴が部品に 近すぎてM3のネジは入らない。 穴径は3.2mmなのでM3用の穴に見えるが 仕方が無いのでM2のネジで固定。

USBケーブルを接続すると基板上のいくつかのLEDが点灯する。 明るい。特にST-Link部のLED(LD4)が眩しすぎる。 電気絶縁用の白いビニールテープを貼るが 1枚では眩しい。4枚ぐらい重ねると許せるぐらいの明るさになった。 しかし、すぐに剥がれそうなので3Dプリンタでキャップを作成。 光透過用にΦ1の穴を開ける。 何回か試して満足できるものになった。

開発環境

NUCLEO-F439ZIの開発環境を探すと 基板が新しいのか、あまりみつからないが NUCLEO-F429ZIであれば見つかる。 Arduinoも stm32duinoで サポートされており、Serial.println()でシリアルポートに メッセージを出力するプログラムは、すぐに動いた。 ちなみにNUCLEO-F439ZIのUSART3はST-Link部経由で PCに接続されている。便利。

私の場合、以前使っていたstm32用の自作ライブラリが たくさんあるので、こちらを使うことにした。 ちなみにコンパイラは Arm GNU Toolchainを使用。 STM32F439固有のレジスタ定義やcrt(c runtime)のアセンブラ等は STM32CubeMXが生成してくれる。

クロック(pll)設定部のコードも生成してくれるのだが 私の嫌いなHAL(Hardware Abstract Library)を使用している。 自前のライブラリで、そのまま行けると思ったが、ちょっとハマった。 NUCLEO-F439ZIではST-Link部から8MHzのクロックがHSEの端子から 供給されるが、このためのHSEの設定を見落としていて PLLRDYにならなかった。 基板にはGPIOで駆動できるLEDが3個(LD1,LD2,LD3)ある。 このレベルのデバッグ時に役に立つ。

クロックの設定ができるとシリアル出力が使えるようになる。 割り込み周りも以前のライブラリが修正無しで使用でき、 シリアルポートからコマンドも動かすことができるようになった。 マイコンボードを使うたびに思うが、開発環境が整い、 慣れた手順でプログラム開発ができるようになった時の征服感というか、 達成感というか、お前を下僕にしてやったぜ感がすごい。

ビルド速度は arduinoよりもplatformioの方が遥かに速いが Makefile単体は更に速い。 ST-Linkの高速書き込みと相まって 理想の高速書き込み環境ができた。

次の目標

次の目標は TinyUSBのexamplesにある msc(USBメモリ)を動かしたい。 TinyUSBはオープンソースのUSBライブラリで いろんな開発環境、Arduinoなどにも 使われている。 NUCLEO F439ZIも Supported Devicesから選んだ。 それがうまく行ったら Hi-speedでの動作を試したい。 そのための USB phyモジュールも1,210円で購入済。 それも上手く行ったら、LCDディスプレーモジュール等を接続し PC側から画像を送信して表示させるような実験をしたい。



プロコン修理4

あすか修理堂の動画を見て プロコン修理に使用した アナログスティックの間違いに気づき 交換したら正常に動くようになったという話。


あすか修理堂の動画を見ていたら 見たことあるような プロコンの故障が写っていた。 アナログ・スティックの部品を間違えると スティックをフルに倒しても switch側でフルに動かないという現象が出るそうだ。 正常に動作するアナログスティックには印のようなものがある。 確認すると前回取り外したものには印があり、 付け替えたものには無い。 アナログスティックを書い直し、修理をやり直すことにした。 今回もアナログスティックを取り外す必要があるので 低融点半田と TP-100用のΦ2.5の替ノズルも購入した。

部品が届いたので修理を行う。 プロコンの分解は前回何回も行ったので 何も見ずにできた。 アナログスティックの取り外しは Φ2.5のTP-100のおかげで問題なくできた。 ただΦ2.5は大き過ぎ、Φ1.5の方が良かったかもしれない。

新しいアナログスティックをハンダ付けし プロコンを組立直し Switchに接続したところ 補正後、正常に使用できた。

プロコンは2017年のSwitch購入の少し後に1台目を購入。 これが数ヶ月で調子悪くなったので 2台めを購入。 その数カ月後に2代目もおかしくなったので 修理を実行 ( その1, その2) 数ヶ月毎に修理・整備が必要なのかと思ったが その後3年は故障せず動作。 意外と寿命が長い。



USBケーブル識別バンド

USBケーブルを沢山持っていると識別に困る。 USB Type-C, micro, miniがパッと見では わからない。 そこで識別バンドを3Dプリンタで 作ってみたところ良い感じなので報告する。

USBコネクタは自分で作る基板では スルーホールのmini-Bと決めている。 M5Stack Seeedの基板を使うと USB type-Cのケーブルが増えた。 Raspberry Pi Picoのせいで USB microのケーブルが増えた。 そういうわけで引き出しには各種USBケーブルが 数本づつ入っていて、使用時に識別に困る。 USBケーブルケースも作ってみたが 文字が見にくいので 2ヘッドの3Dプリンタが欲しいとか思ってしまう。

最近、さらにUSBケーブルが増えてきたので USBケーブルケースを作り足そうと考えたが、 こんなに長さ必要無くね?と思った。 ちなみに100mmある。 これを20mm程度にして 識別はラベルプリンタのテープで良いのではないかと 思いついたので試作したら良い感じに出来上がった。

形状は直径28mmの円に外接する6角形で厚さは0.8mm、 高さは20mm。 このサイズで、だいたいのUSBケーブルを束ねることができる。 はずれない。 細くて短いケーブルで外れて落ちそうなものがあるが 小さいザイズを作るのも面倒なので、 ビニタイでくくりつけた。 P-Touch Cubeで12mm幅の透明白文字テープにラベルを印刷する。 6面分の文字をカットせずに印刷し、まとめて巻きつける。

本当に便利か、しばらく使ってみようと思う。



プロコン修理3

Switch用のゲームコントローラ, プロコンを2台持っているのだが 2台とも調子が悪くなってしまった。 部品を取り寄せアナログスティックの交換したが1台は失敗。 もう1台は、交換せず分解掃除だけで調子が戻った。 以下は、その詳細。

故障の経緯

プロコンを購入したが、数ヶ月で調子が悪くなり2台目を購入。 こちらも数ヶ月で調子悪くなり、交換用のアナログスティックを購入し交換、 もう1台は、分解修理だけで調子が戻ったというのが 4年前の話

この後、分解修理した方を主に使っていたのだが 数ヶ月前に再び調子が悪くなった。 右スティックが触らないのに動いているような入力になる。 スプラトゥーンだと操作しないのに視界が回る感じ。

もう一台のプロコン方に切り替え使っていたが、 左スティック動きがおかしくなる。 スプラトゥーンで前に進もうとして進めない現象が発生する。 スティックを押し込めば現象は消えるが、また再現する。 これではゲームにならないので Switch付属のJoy-Conグリップに Joy Conを装着しスプラトゥーン3をやっていたが ボタンの位置が微妙に違いのとボタンが小さいのが使いにくい。

仕方が無いので部品を取り寄せ交換することにした。

修理

前回の修理時は アスカ修繕堂 から交換用アナログスティックを購入した。 今回調べてみると 秋月電子でも販売しているので こちらから購入してみた。 1個190円と圧倒的に安い。

【2022/11/12追記】 秋月電子のものは使えません。 プロコン修理4参照。

ネットでプロコンの修理方法を調べ、 そのとおり分解し、基板を取り出す。 古いアナログスティックを取り外すため TP-100でハンダを除去を行う。 細いピンは問題なく除去できるが、1.2mmぐらいの太いピンが TP-100の穴に入らず除去できない。 ハンダ吸い取り線も試すが使用した温調ハンダゴテの温度が 低いのか上手く吸い取れない。 ここで温度を上げればよかったのだろうが、 HOT AIR GUNを取り出し 熱風でハンダを溶かし アナログスティックを取り外してしまった。 アナログスティックを交換しプロコンを組み立て Switchを起動してみるとスティックの動きが不十分で 調整もできない。 その後、再分解、はんだ付けの確認等も行ったが動作は改善せず 諦めてしまった。 アナログスティックの抵抗値の違いで 同様の現象が起こることもあるという情報があるので 取り外したものと交換用新品のアナログスティックの抵抗値を確認したところ どちらも10kΩだった。 熱風を長時間かけたので、どこかの部品を飛ばしてしまったのかも しれない。

前回の修理では はんだシュッ太郎で外していた。 アスカ修理堂では、取り外し用に 低融点半田も売っているので こちらもオススメなのだろう。

もう1台のプロコンの修理は慎重に行う。 分解して様子をみたところ、アナログスティック周辺に ほこりのようなものが大量にある。 除去、清掃し組み立て直し 動作確認すると 正常に動作するので アナログスティックの交換は行わないことにした。

プロコンはアナログスティックの交換前に分解清掃を試すのが 正解なのだと思う。

ちなみに、新品のプロコン(並行輸入品)も1個注文中である。 数日中に届く予定なので、修理に失敗したプロコンは廃棄するつもり。

【2022/11/12追記】 修理できました。 プロコン修理4参照。

ゲームコントローラって凄いよね

今回、プロコンの分解・組立を何度も行い プロコンの構造に感心した。 日頃、自作基板のケースを3Dプリンタで作れたと 喜んでいるのが恥ずかしいレベルだ。 操作し易さが求められるので、多くのスイッチを 最適な場所に配置する必要がある。 強度も必要だし、複雑な構造になるわけだ。

米国の原潜の潜望鏡の操作には XBOXのコントローラが使用されているそうだ。



picoprobe製作

Raspberry Pi Picoに手を出し プログラムを開発している。 プログラムはBOOTSELモードで起動し直し USBメモリにファームウェアのファイルをコピーすることで 書き込んでいるが、ここを便利にしたい。 platformioで対応している j-link を試すべく、AliExpressで安いコンパチ品を購入した。 動作させるとjlink用のDLLが必要などと言われ断念。 Raspberry Pi Pico自身を書き込みツールにする picoprobeを製作したところ プログラムの書込み、デバッグ等ができるようになった。

picoprobeの製作方法は Getting started with Paspberry Pi Picoの Appendix Aで詳しく説明されている。 ファームウェアもコンパイル済みのものを Raspberry Pi Documentation - Raspberry Pi Pico and Pico Wのページの Debugging using another Raspberry Pi Picoのところから ダウンロードできる。 使用するソフトウェアのopenocdのpicoprobe対応版の作成方法も Appendix Aに丁寧に説明されていて、 完成すれば例えば以下のようなコマンドでプログラムを書き込むことができる。

$ /c/msys64/usr/bin/openocd.exe -f interface/picoprobe.cfg -f target/rp2040.cfg -c 'program .pio/build/pico/firmware.elf verify reset exit'

サイズが小さい Seeed XIAO RP2040をpicoprobeにできれば小さくて良さそうだと 思ったがGP5が端子に出ていないのでUARTが使用できない。 ダウンロードできるファームウェアでは無理そうだ。

platformioからpicoprobeを使う

platformioのuploadコマンドでpicoprobeを使用するようにしたいが 現状では未だサポートされていない。 調べると pull requestは出ていて、 試すと確かに picoprobeでuploadできるので platformioでサポートされる日は近いのかもしれない。

但し、このpull requestの環境は github.com/earlephilhower/arduino-picoで 使用中の github.com/arduino/ArduinoCore-mbedとは 全然違う。 特にUSB関連のライブラリが全く無いので 今回のプログラムでは使用できない。

仕方が無いので vscodeの task.jsonに以下の 記述を追加し、タスクとしてプログラムの書込みを行っている。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Write Firmware (picoprobe/openocd)",
      "type": "shell",
      "command": "/c/msys64/usr/bin/openocd.exe -f interface/picoprobe.cfg -f target/rp2040.cfg -c 'program .pio/build/pico/firmware.elf verify reset exit'",
      "problemMatcher": []
    }
  ]
}

以下に実行結果を示す。

gdbについて

picoprobeについてネットで検索すると gdbでデバッグするという記事を多く見るが raspberry pi picoのプログラムをgdbでデバッグしている人は多いのだろうか? gdbはUnix上のアプリケーションを開発していた時代に愛用していたが Flashメモリ使用のマイコンの開発では使いたいと思ったことは無い。 とにかく割り込み処理との相性が悪い。 raspberry pi picoのプログラムをgdbで停止させると USB関連処理がタイムアウトし接続しているPC側でエラーが出る。

組込プログラミングではprintfデバッグが最強だと思っている。 欲しいのは超高速のプログラム書込み機能。 ST-Link2が使えるSTM32の開発環境が理想に近い。

最後に

picoprobeは Raspberry Pi Picoに5ピンのピンヘッダを 付けるだけで製作可能である。 platformioに対応し、 もう少しプログラム書込みが速くなれば 皆にお勧めできるが、現状では微妙なところである。

とりあえず、3Dプリンタでケースは作ろうと思う。



Raspberry Pi Picoに手を出す

簡単な装置で試してみたいことがある。 ロータリーエンコーダで数値を設定しUSB(HID)経由で読み出せるぐらいの装置。 マイコンは手持ちの BluePillを使おうと思ったが、 上手く行って製造となっても STM32F103なんて手に入る気がしない。 いやAliExpressで買えるのだが1個1000円も払いたくない。 Raspberry Pi Picoなら 半導体不足と無縁そうなので この機会に手を出してみることにした。

開発環境

開発完了を調べると 公式のSDKは cmakeとか使うらしい。 使い慣れた vscode + platformio で開発したいので 調べると platformioも対応している。 すんなり導入できて、LチカプログラムをBuildし、 uploadはエラーになったが BOOTSELモードでUSBメモリと認識されたPicoに ファイルをコピーしてプログラムを書込み、動作させることができた。

PicoのRUN端子(ピン30)にGNDに接続されたSWをつけるとリセットできるので、 BOOTSELモード遷移時にUSBを抜き差しする必要がなくて便利である。

プログラムのデバッグにはシリアルポートへの出力が欲しい。 picoのArduinoのSerialはUSBのシリアルポートなので プログラム書込む毎に消失して面倒。 GP0をTX, GP1をRXとするシリアルポートがSerial1に定義されている。 それ以外のピンのシリアルポートを使用したい場合は以下のようにすれば良い。

UART my_serial(8, 9);  // TX: GP8, RX:GP9

シリアルポートに使用可能なピンは(GP0,1),(GP4,5),(GP8,9),(GP12,13)の4組。

今後

platformioでuploadに失敗する原因はよくわからないが、 いずれuploadできるようにしたい。 jlinkにも対応しているそうなので AliExpressに安いコンパチ品を注文した。 Raspberry Pi Pico自身を使って 別のPicoに書き込む方法もあるらしい。 こちらも、そのうち試してみたい。

Platformioのpicoのライブラリを見ると USB keyboardやmouseがあるので 何かサポートされているようだ。 USB(HID)が簡単に実装できることを祈る。 descriptorが面倒なのよね。

PicoのCPU(RP2040)は2コアだが platformioでは1コアで動かしている気がする。 性能は求めていないので1コアの方が面倒が無くて良い。 排他制御が割込み禁止だけで済む。 2コアだと mutexとか semaphore 必要?



簡易FANコントローラ基板2

これまでのあらすじ ルータやらゲーム機やら触ると熱くて心配になる機器がいくつかあるので FANで冷やしてやりたい。FANを定格で使用すると音が大きいので 出力を絞って使いたい。 PC用のPWM入力付き4PINファンを使えば入手性も良く値段も安いので 良いのではないか。 PC用FANの4PINコネクタはAliExpressで発見。 ESP32をコントローラにした高性能版(温度センサ、LCD、WiFi機能付き)ができたが、 通常仕様にはVRで風量調整ができれば十分。 オペアンプでPWM信号を発生させる 簡易FANコントローラを ユニバーサル基板上に作成。無事、ルータを冷やすことができた。

ところがケースに収めようとするとユニバーサル基板が大きくて 不格好になってしまう。ケースにコンパクトに収納するため 専用基板を作成、動作確認すると一部のファンで速度調整が できない。調査の結果、オペアンプのLowレベルの1.3V程度で 高すぎるのが原因と判明。オペアンプをRail-To-Railのものに 置き換え、一度は動くが電源耐圧が足りず壊れてしまった。

回路変更

電源は12Vで、これをスイッチでOn/Offしたり、 DCジャックの抜き差しなどすると 倍の24V程度の電圧が一時的に印加される。 もともとのオペアンプ NJM4580は電源耐圧が±18Vの36Vだが、 Rail-to-Railのオペアンプ NJM2746Eは15Vで足りない。 安いRail-to-Railのオペアンプで電源電圧36Vなどというものは 無いらしい。

対策は当初、電源を78L05等で5V程度に下げ、Rail-to-Railの オペアンプでPWM信号を発生、これで 2N7002等のFETを駆動し FANのPWM端子に接続することを考えたが、 最終段をFETにするのであれば Rail-To-Railのオペアンプである 必要はない、となれば電源電圧も下げる必要は無い、ということで NJM4580のPWM発生回路の出力に2N7002をつなげるだけになった。

FETの動作

長いこと電子工作で遊んできたが FETやトランジスタの動作の理解は適当だ。 On/Offだけの動作で使うことが多いので、それで済んでいる。 アナログ的な動作が必要な時はオペアンプを使う。

トランジスタはベース・エミッタ間がダイオードで 0.6Vを超えたら電流が流れる。 この電流のhFE倍(50~400とか)の電流が コレクタ・エミッタ間に流れる。

FETはゲート・ソース間に VGS(th)以上の 電圧をかけるとドレイン・ソース間に電流が流れる。 ゲート・ソース間の静電容量が意外と大きいので 駆動時には注意。10000pFとかあったりする。 2N7002は小型なので最大50pF。 (参考:MOSFET 電気的特性(動的特性)について Ciss/Crss/Coss )

VGS(TH)

データシートによると 2N7002のVGS(th)は1.0~2.5V。 オペアンプNJM4580の出力はLowレベルでも1.3V程度あるので 直結では2N7002がOffにならない可能性がある。 Hiレベルは12V近くあるので 1/2~1/3程度に分圧し入力してやればよさそうだ。

出来上がった回路図を示す。

基板製作

回路をユニバーサル基板で試すこともなく発注してしまう。 試作が面倒だし、基板製作が早く(1週間ぐらい)て安い(2,500円ぐらい)。 気軽に注文したせいかミスしてしまった。 DCジャックの穴を長穴でないパッケージのまま注文してしまった。 長穴のパターンではDRCでエラーが出すぎてチェックできないので、 チェック終了後に長穴のパッケージに変更するということをしているのだが、 それを忘れていた。基板CADはEAGLEを使用しているが、DRCでエラーが出ない 長穴というのは未だできないのだろうか?

DCジャックは幸い 長穴でないものがあり なんとか差し込むことができる。 こちらのDCジャックを常用にすれば 基板の長穴問題は無くなるので良いのかもしれない。 組み立て後、動作を確認できた。

ケース問題

3Dプリンタでケースを作ってみたが収まりが良くない。 VRの軸を基板の長手方向に合わせたのが間違いだったのかもしれない。 こういうこともあろうかとVRとDCジャックは基板にコネクタ経由で 接続することも可能。 スイッチ付きパネル用VR を購入し組み立ててみた。 これ用のケースは未設計だが、そのうち作ってみよう。



簡易FANコントローラ基板

小型化のため 簡易FANコントローラの 基板を製作した。 組み立てて動作を確認するが風量をコントロールできない。 以前試した 120mmFANは、ある程度コントロールできるが不安定。 新たに購入した 3個で1,480円のFANは全く反応しない。 常に全速力だ。

原因調査

最初PWMの周波数が範囲を外れているのではないかと考えた。 製作したコントローラのPWMは 18.8Khz。 ネットで調べると 25KHzという情報もある。 以前作ったESP32を使ったFANコントローラをPWMの 周波数を変更できるように改造し試したところ 5KHzでも50KHzでも問題なく風量をコントロールできる。

次にPWMのLowレベルの電圧が高すぎるのではないかと疑う。 普通のオペアンプ NJM4580CG を使用しているためLowレベルがGNDまで 下がりきらない。 1.3V程度ぐらいある。 回路図を以下に示す。

PWMの出力波形を以下に示す。

ブレッドボード上でトランジスタで回路を組み、 Lowレベルを下げたところ風量をコントロールできるようになった。 となれば解決方法は簡単だ。オペアンプをRail-to-Railの ものに交換してやれば良い。 幸い NJM2746Eが手持ちにあったので換装。 これで、ばっちり風量をコントロールできるようになった。

オペアンプ壊れる

これでメデタシメデタシ、PWMの出力波形をオシロでみようかと 思ったところ、オペアンプが熱い。火傷しそうなほど熱い。 風量のコントロールもできない。壊れてしまった。

原因を調べるべく NJM2746Eの電源の最大定格を見ると15V。 電源は12Vだが、DCジャックの抜き差しや、スイッチでのOn/Off で倍の電圧は出ると思ったほうが良い。 交換前のNJM4580CGは±18Vなので 36Vまでは耐えられる。 オシロで電源SWを入れたときの電源電圧を観測した波形を示す。 最大26Vぐらい印加されている。

対策

Rail-to-Railで電源耐圧30Vぐらいあるオペアンプがあれば 良いのだが、Rail-to-Railは低電圧用の技術だから そんなものは一般的でない。NJM2746Eの15Vは まだ高い方で 5.5Vなどというものも多い。 Rail-to-Railで±12Vという AD8397ARDZもあるが 単価530円で使いたくない。

みんな大好き NE555でPWM回路を組む案も検討するが 電源耐圧18Vぐらいで足りない。

レギュレータで電源を5V程度に落とし PWM信号を作り、 オペアンプの先に 2N7002Kでも つけてFANにつなげることにしよう。 レギュレータなら 78L05でも 耐圧30Vぐらいあるから大丈夫だ。

最後に

外部からくる電源に直接、普通のICをつなぐと やばいというのは知っているつもりだったが 見落としてしまった。注意しよう。



M5Stackのfake BtnA press

M5StackのLCDと3個のスイッチを使ったユーザインターフェイスを持つ プログラムを作成した。 デバッグ後、期待した動作をするようになったが 放置していると画面表示が変化している。 ButtonA(左端)を押されたような動作である。 数分に1度程度発生する。 プログラムを見直すが原因がわからない。 他のM5Stackで試すと同じ現象が発生する。

いろいろ調べるとButtonAの信号 ESP32のGPIO39に ノイズが発生しているようである。 プログラムでは M5.BtnA.wasPressed()でボタンの状態を見ている。 この関数にはdebounce(チャタリング キャンセル)の機能があるのだが 十分ではなく、たまにノイズのパルスをボタン押下と誤認識している ということらしい。

まず、本当にGPIO39にノイズが乗っているのか確認する プログラムを作成した。 以下に示す。

#include 
#include 
int pin = 39;  // ButtonA:GPIO39
// int pin = 38;  // ButtonB:GPIO38
// int pin = 37;  // ButtonC:GPIO37
void setup() {
  M5.begin();
  Serial.println("Start");
  pinMode(pin, INPUT_PULLUP);
  WiFi.mode(WIFI_STA);
  // WiFi.setSleep(false);   // 回避策!!
  WiFi.begin("your_ssid_name", "your_ssid_password");//これが無いとノイズ無し
}
int v0 = HIGH;
uint32_t tFall;
void loop() {
  int v = digitalRead(pin);
  if (v != v0) {
    if (v == LOW)
      tFall = micros();
    else
      Serial.printf("pulse %lu uSec\n", micros() - tFall);
    v0 = v;
  }
}

実行結果は以下のようになる。

pulse 1 uSec
pulse 1 uSec
pulse 1 uSec
pulse 1 uSec
pulse 2 uSec
pulse 1 uSec
pulse 1 uSec
pulse 1 uSec
...

実験の結果、複数のM5Stackでスイッチを操作しない状態で パルスが検出された。 パルス幅は1または2uSecと表示された。 但し、調べたM5Stackは古い個体なので 最近のもので改良されている可能性はある。

WiFiを使用するとパルスが出るようで、 WiFi.begin()の行をコメントアウトすると パルスはでなくなった。 また、中央と右ボタンの入力GPIO38と37では WiFi使用中であってもパルスは出なかった。

対策

M5Stackライブラリの Button.cppを使用せず、 自前のプログラムでdebounceを行ったところ ノイズでボタン操作を誤認識する現象はでなくなった。

今、調べて気が付いたが M5StackライブラリのIssue#52として上がっている。

以下の設定を追加すると回避できるらしい。

  WiFi.setSleep(false);
試すとパルスは発生しなくなった。



PWM信号発生回路の直線性

以前製作した 簡易FANコントローラは 静かに稼働している。 ただ、未だケースを作成できていない。 設計したもののサイズが大きくなり作成していない。 サイズ確認用のパネルに固定した状態で使用を続けている。

PWMを絞りきってもFANの回転が止まらなかったので 電源SWもつけているのが敗因かもしれないと SW付きVRを購入したがユニバーサル基板に刺さらないことが判明。 そこで基板を起こしてコンパクトなコントローラにすることにしたが 気になることが出てきた。PWM回路の直線性は大丈夫だろうか?

発振波形の式

PWM信号発生回路を以下に示す。

オペアンプ1個の矩形波発振回路のコンデンサの電圧を VRの電圧と比較してPWMの信号を発生させている。

コンデンサc1(1000pF)は R4(33kΩ)を介して電源電圧$V$(12V)への充電と 0Vへの放電を繰り返す。 切り替わりの電圧は$\frac{1}{3}V$の4Vと $\frac{2}{3}V$の8V。

$\frac{1}{3}V$からの立ち上がりの波形は、 経過時間を$t_1$とすると出力電圧$v$は \begin{equation} \label{v1} v = V(1 - \frac{2}{3}e^{-\frac{t_1}{T}}) \tag{1} \end{equation} ここで $V$は電源電圧、$T$は時定数で \[ T = rc \] $\frac{2}{3}V$からの立ち下がりは、 立ち下がりからの経過時間を$t_2$とすると \begin{equation} \label{v2} v = \frac{2}{3}Ve^{-\frac{t_2}{T}} \tag{2} \end{equation} 波形の周期を$T_p$とすると $t_1 = \frac{T_p}{2}$で $v = \frac{2}{3}V$となるので 式\eqref{v1}に代入すると \begin{eqnarray*} \frac{2}{3}V & = & V(1-\frac{2}{3}e^{-\frac{T_p}{2T}}) \\ e^{-\frac{T_p}{2T}} & = & \frac{1}{2}\\ \frac{-T_p}{2T} & = & \ln(\frac{1}{2})\\ \end{eqnarray*} \begin{equation} \label{tp} T_p = 2\ln 2 \; T \simeq 1.386 T \tag{3} \end{equation} これらの式から波形を計算すると 以下の図の波形が得られる。

PWM回路の直線性

発振回路の出力とVRの電圧をコンパレータで比較してPWM信号を出力する。 VRの電圧に対するPWMのパルス幅の変化、直線性を調べたい。 VRの電圧を$v_c$として 発振回路の出力電圧が$v_c$よりも大きくなる時間$T_h$を求めたい。 式\ref{v1}を $t_1$について解くと \begin{equation} \label{t1} t_1 = -T\ln( \frac{3}{2}(1-\frac{v}{V})) \tag{4} \end{equation} 式\ref{v2}を$t_2$について解くと \begin{equation} \label{t2} t_2 = -T\ln(\frac{3}{2} \cdot \frac{v}{V}) \tag{5} \end{equation} $v > v_c$となる時間 $T_h$は \begin{eqnarray*} T_h & = & \frac{T_p}{2} - t_1 + t_2 = &\frac{T_p}{2} + T \ln(\frac{3}{2}(1-\frac{v}{V})) - T\ln( \frac{3}{2}\cdot\frac{v}{V}) \\ \end{eqnarray*} 周期$T_p$中の$v > v_c$となる期間の割合$P$は \begin{eqnarray*} P & = & \frac{T_h}{T_p} & = & \frac{1}{2} + \frac{T}{T_p}(\ln(\frac{3}{2}(1-\frac{v}{V})) - \ln( \frac{3}{2}\cdot\frac{v}{V}) ) \\ \end{eqnarray*} 式\ref{tp}を代入すると \begin{equation} \label{p} P = \frac{1}{2} + \frac{1}{2\ln 2}(\ln(\frac{3}{2}(1-\frac{v}{V})) - \ln( \frac{3}{2}\cdot\frac{v}{V}) ) \tag{6} \end{equation} となる。

この式で$V$=12V, $v$を4~8Vの範囲で計算した結果のグラフを下に示す。

赤い点が計算結果で、直線は (4V,100%)と(8V,0%)を結んだもので、 点がほとんど直線状に載っていることがわかる。

直線性誤差だけグラフ化すると次のようになる

最大でも 0.8% 程度に収まっていることがわかる。 計測用ならともかく、制御用としては十分すぎる直線性である。

最後に

これまでの回路で直線性に問題ないことがわかったので 安心して簡易FANコントローラの基板を起こすことができる。

今回は式を手できれいに書く自信がなかったので LaTeXで書きながら考えた。 そして mathplotlibでグラフ化し確認した。 mathplotlibはgnuplotをpython化したようなライブラリで gnuplotに慣れたものとしては大変使いやすい。 LaTeXの数式をwebに表示するために MathJax を使用した。 数式をきれいに表示できると やる気が出る。



簡易FANコントローラ

先日、 また、ネットワークが途絶。 調べるとルータが返事をしない。 ルータの電源再投入で復旧。 いつものことだがルータ表面が 心配になるくらい熱いので 以前作成したFANコントローラを引っ張り出し 12cmのPC用ファンで送風、冷却した。 これで問題は解決したのでFANコントローラのケースや ファンを安定して置けるような支えを 3Dプリンタで作ろうとも思うが何か引っかかる。 ファンは風量を絞り動かしたままにするので CPUは必要ない。温度も測っていないし 意味のある表示もしていない。 LCDディスプレーも要らない。 無用に大きいのだ。 そこで最小限の機能のFANコントローラ、 風量の調整だけのものを 作りたくなった。

仕様&回路

仕様を検討する。 手持ちの部品で簡単に作りたい。 NE555は無いがオペアンプはある。 オペアンプ&PWMで検索し 良さそうな回路を発見。 定数等を調整し次の回路となった。

回路は矩形波の発振回路と コンパレータでPWMの波形を出力だけの 簡単なもの。 PC用のファンのPWMの規定はわからないが、 ファン用のモータドライバ DRV11873のPWMの仕様では 7~100KHzとなっているので、 この範囲の中心あたりの周波数にした。

製作

ブレッドボードで試作することも考えたが ユニバーサル基板にハンダ付けした方が楽なので いきなり作る。 基板は 秋月電子のEタイプを使用。 小さい基板が充実していて助かる。 jw_cadでユニバーサル基板の絵を書き、 拡大し印刷したものに部品と配線を書込み配置を検討。 ケースに組み込むことを考え、VRや電源コネクタは 基板には固定せず、コネクタ経由で接続する。 ほとんどの配線をスズメッキ線(ハンダメッキ線)で行い、 抵抗は 1.6 x 1.0mm のチップ抵抗を使用した。

動作確認時、若干の修正はあったが無事完成、 動作させることができた。

最後に

ルータを始め、インターネット関係の機器は熱い。 動作保証されているとは思うが触ると心配になる。 使用説明書をよく読むと、放熱のため前後左右には一定の空間をあけ、 風通しの良い場所設置してください、などと書かれているかもしれない。 不安なのでファンで送風してやりたい。 ゲーム機も熱くて不安になる。 そもそも前のFANコントローラを作ったのは Nintendo Switchの発熱による不調や、 PS4でデス・ストランディングをやっている時に 画面が消える問題が理由だった。

こういう環境でPC用ファンは入手性も良いし、安いし、 音も静かで便利だ。今後、活用できる場面は増えてくると思う。 そこで問題になるのがPCファン用の4ピンのコネクタだ。 私は AliExpressで購入した。 50個で500円ぐらいだった。 私は、これで一生買う必要は無いが、 欲しい人は秋月電子に 取り扱い要望 を出せば良いと思う。 出せば結構簡単に通りそうな気がする。

次はケースだ。 ファンも倒れにくいよう上手く固定してやりたい。



ステッピング・モータドライバ

秋月電子から部品が届いたので 安いステッピング・モータ用のドライバを作る。 ポイントは I2C I/Oエキスパンダ MCP23017を使用する点。 16bitのポートをI2C経由でコントロールできる。 このうち8bitを2個のステッピングモータに使用し、 残りの8bitは将来、リミットスイッチ等の入力に 使用する算段。ドライバには 8chの TD62083を使用する。

回路図を示す。

秋月電子の Dタイプのユニバーサル基板に 部品を配置し固定。スズメッキ線(半田メッキ線)で配線する。 Groveの4本ケーブルでステッピング・モータの電源も 済ませたいので大きめのコンデンサをつける。

ESP32 Devkitでテストプログラムを作る。 MCP23017用に Adaruitのライブラリがあるが、 bit単位の操作ばかりでbyte単位の操作が できないので Wireライブラリを直接使用することにする。 MCP23017は1byteの書き込みで 出力8bitを変化させることができるので ステッピングモータの操作には都合が良い。 なんやかんやでライブラリが完成。 githubで公開した。

動作させると最高速度の秒速90度(15RPM)で 2個のステッピングモータを動作させても i2cへの書き込み周期は1mS程度。 USBの電源電流も 未回転時 164mA, 15RPM回転時 377mAで モーター分は200mA程度。 USB給電でも充分動かせる。

次は、メカを作って動かしてみよう。



安いステッピング・モータを試す

AliExpressでも見かける 安いステッピングモータ 28BYJ-48と ULN2003のドライバ基板のセットを アマゾンから買ってみた。 2セットで599円。 速度とパワーの感じを見たい。

ESP32 Devkitに接続し、 適当なプログラムで実験する。 結果、最大90度/秒程度とわかったあと 秋月電子のページに書いてあることに気がついた。 1/64のギア内蔵なのでパワーは結構ある。 5V駆動だしXHコンパチっぽいコネクタがついていて 使い。

欠点は端子を4つも使ってしまうことだが MCP23017でI2C経由で接続、 ドライバも7回路の ULN2003ではなく 8回路の TBD62083を使えば ちょうど2個ドライブできる。 余った8bitをリミットスイッチなどに 使えばいい感じ。 基板を作ろうと思うが MCP23017のSSOPパッケージが手に入りづらい。 とりあえず AliExpressに注文するが いつ届くかわからないので ユニバーサル基板にDIPのICで作る。



電源装置購入

実験用電源装置 Kiprim DC310S(30V10A)を購入した。 タイムセールの15%OFFで 11,883円。 購入のキッカケは 長船さんのtweetを見たこと。 電源・電流のグラフ表示付き電源が欲しい、作ろうか、 でもCVCC電源面倒だなとか思っていた。 使っていた 電源AD-8724Dが壊れて 自作電源装置を引っ張り出して使っているところだった。 絶対必要というわけではないので購入保留していたところ タイムセールのお知らせのメールが来たので 購入してしまった次第。

まだ本格使用には至っていないが 触ってみた感じは悪くない。 ただ、付属ソフトはお薦めしない。 怪しいサイト(DropBox?)からダウンロードした ソフトをインストールするのは怖いし、 我慢してインストールしても、 画面を一度1024x768にしないと操作できない 謎仕様だし、使い物になる気がしないので 早々にアンインストールしてしまった。 表示される電圧や電流の桁数が多いが、 この値段で、そんなに高精度に制御できるはずがない ので、その辺は、まったく期待していない。

出力電圧、電流の設定とは別に 最大電圧、電流の設定ができる。 これの意味がわからなかったのだが、 パネルの操作で電圧電流等を変化させている時、 操作を間違えても、これ以上は上がらない、流れないという 保護機能らしい。 電源ではなく実験用の電圧源、電流源等で使用する場合には 便利だ。

設定は4つ保存できて、 「memory」ボタンで表示できるのだが、 設定を呼び出す方法がわからなかった。 回転ノブで設定を切り替えられるので、 ここを押せば呼び出せそうだが、 何故か選択された設定の電圧変更モードに 入ってしまう。しばらく試して長押しで 設定を呼び出せることに気がついた。

あと、On/Offボタンで出力の接続・非接続を 切り替えられるのは便利だ。 これが無いと、一旦配線を外し、電源投入。 電圧等を確認後、配線を繋ぐことになる。 ただ、電源投入後すぐ出力というモードにも できるらしく、そのアピールのためか、 電源投入時にOn/Offボタンが 一瞬光るのが気になる。

DC310Sには 両端に バナナ・プラグとワニグチがついた 赤黒のケーブル2本が付属する。なかなか便利ではあるが、 私は電源用にはバナナ・プラグ/ 2.1mm標準DCプラグのケーブルを自作して使っている。 さらに、この先につける 中継用DCジャック付きのケーブルを必要に応じて 作っているうち、たくさん出来てしまった。 電源ケーブルは使用頻度が高いし、抜き差しも多いので、 効率化の効果は大きい。

現在持っている電源装置は3台。

AD-8724Dは、使用中に出力電圧が下がる現象が発生。 つまみで電圧を上げてやると、 電圧が5Vくらいから30V近くに急に上昇するようになった。 おそらく電解コンデンサの容量抜けで、 交換してやれば直るのではないかと思うのだが、結構面倒。 自作の電源装置を引っ張り出して使っているうち、 今回のD310Sを購入してしまった。

自作の電源装置は随分昔に作ったもの。 おそらく20世紀だと思う。 当初、12V0.6Aぐらいの トランスに秋月の可変安定化電源と 電圧計と電流計をケースに入れたもの。 非力だが、自分用には十分だった。 一度、AC100Vとの接触事故を起こし 壊れたので、トランスを 24V2Aぐらいの スイッチング電源に入れ替えた。

ケースが立派だが、 昔、別目的で 博多の カホパーツセンターで購入したもの。 金属ケースで5千円程した。 結局、使わす余ったので電源のケースに使用したもの。 ちゃんとしたケースに収めると 自作の電源でもかなりの値段になる。 そういう意味で安く電源やら オシロやら買える時代になってありがたい。



FANコントローラ作成中

PCファン用4Pコネクタを手に入れたので、 これを使った機器を作ろうと思う。 機能としては温度計測と、それに伴うFANの制御。 温度とFANの状況の報告など。 となるとCPUはESP32、 LCDは沢山もっている2.4インチLCDモジュール・タッチスクリーン付きとした。

ESP32は、当初 ESP32-WROOM32モジュールを直接使用するつもりだったが、 設計を進めるうち、意外と基板のスペースに余裕がないことに気が付き、 ESP32 Devkitを使用するとUSBシリアル、ファーム書き込み、電源レギュレータ等を 省けるし、使い回しも可能なので、こちらを使うことにし、基板を注文。 秋月にも部品を注文するが(コロナのせいで?)発送が滞っているらしく 基板と同時に到着した。

基板を組み立てると色々と設計ミスが判明。 大きなところではLCDモジュールのコネクタを180度間違えた。 でもまぁ機能の確認はできるので、 この基板でソフトの開発を行うことにする。

ソフトの環境はVSCode + PlatformIO。 使い方に慣れて最近は、こればかり使用している。 特にgitのログが見易い。

まずはLCDを使えるようにしようと、 どのライブラリを使うか考え、 自作の Humblesoft_ILI9341 を使用することにする。 Adafruit_ILI9341と比べると、 fontxの漢字が使用可能、部分スクロール機能、 高速化などが違うのだが、 今回は漢字は必須ではないし部分スクロールも使わない、 高速化も5年前の話なので今となっては速いかどうかわからないが、 自作のものの方が使いやすい、たまには更新したなどの理由で こちらにした。 使用するSPIを指定する機能などを追加して 表示できるようになった。

さて次はファンや温度センサーを動かしたいのだが タッチスクリーンでファンを制御できるようにしようか、 ライブラリは昔、作ったよね、どこだっけ? いきなりタッチスクリーン操作は面倒なので 最初はシリアルモニターからコマンドを入力して操作する CLI(Command Line Interface)の方が楽よね。 Arduino用のCLIライブラリも昔、作ったよね。 どこだ? gitにも置いていない。

既存のものを探してみると"arduino cli"で検索すると Arduino CLIというArduinoのCLIでの開発環境のページばかり 表示される。 "arduino cli library"で SimpleCLIを知るが、 あまり使い易そうではない。 はやり自作が一番ということで CLI_Libraryという名前で 改めて作成した。 使用例は、こんな感じ。

#include <Arduino.h>
#include <cli.h>
CLI cli;
bool cmd_sum(CLI *cli, const char *arg) {
  const char *p = arg;
  int sum = 0, iVal;
  while (get_int(p, &iVal, &p)) sum += iVal;
  return cli->printf("sum = %d\n", sum);
}
bool cmd_factorize(CLI *cli, const char *arg) {
  int n, i, c = 0;
  if (!get_int(arg, &n, NULL))
    return cli->error("integer argment required");
  if (n < 2) return cli->error("bad interger %d, must be >1", n);
  cli->printf("%d =", n);
  for (i = 2; i <= n; i++) {
    while (n % i == 0) {
      cli->printf(" %s%d", c++ ? "* ": "", i);
      n /= i;
    }
  }
  return cli->printf("\n");
}
void setup(void) {
  Serial.begin(115200);
  cli.init(&Serial);
  cli.cmd("sum", "Calculate the sum of the arguments", cmd_sum);
  cli.cmd("f", "factorize the argument", cmd_factorize);
}
void loop(void) {
  cli.update();
}

結構、気に入っているがどうだろう。 ほぼ、自分専用のライブラリであっても githubに置いておいたほうが使い易い。



軽トラのラジコン購入

最近、工作ネタが枯渇気味なので、 移動ロボットでも作って遊ぼうかと考えた。 室内を走り回り、偵察などをしてくれるロボット。 簡単には完成しないだろうから長く楽しめる。

まずは走る土台が欲しい。 イチから作るのは面倒なので 適当なものに手を加えて使いたい。 走破性が欲しいので、 タミヤの4輪駆動車基本セットバギー工作基本セット を使うことを考えるが、 かなり改造が必要だし、結構高い。

4千円ぐらい出せばラジコンが買えるのではないかと 調べるといろいろある。 軽トラのラジコンが面白そうなので購入。 価格は 6,009円。 届いたものを見るとカッコいいし、 当然だが普通に走る。 荷台があるので機器の積載にも便利。

将来は、自動で走って色々情報を集めてもらいたいが、 まずはraspberry piにROS2を載せ、 カメラをつけて走らせたい。

raspbery pi用電源として ダイソーのモバイルバッテリーを購入したが 安さにつられて 500円のやつを買ってしまった。 こちらは 4000mAH だが1Aとある。 Raspberry Piには容量不足かもしれない。 1000円のやつだと10,000mAH ,2.1Aなので こちらも買ってみたい。



PC用FANのコネクタ

身の回りに熱さが気になるものが多いので PC用のFANを使ってなんか作りたい。 ルーターとかゲーム機とか 触ると熱くてやばいのではないかと思ってしまう。 FANは簡単に買えるがコネクタが問題だ。

探すと千石電商に FAN用電源ピンヘッダ( 2P, 3P, 4P )というのがある。 3Pと4Pを購入してみると 3Pは良いのだが、4Pは合わない。 PC用FANのコネクタは特殊形状なのだ。 千石の4Pの奴はMolexのナントカコネクタの4Pの標準のやつで PC用FANには合わない。

PC用FANのコネクタは2ピンでも3ピンでも4ピンでも動くようにできている。 2ピンだと電源供給だけで100%の強さで動くし、 3ピンだと回転速度検出用のパルス出力が追加され、 4ピンだと速度調整用のPWM入力が追加される。 コネクタの形状は3ピンのものに4ピン目が追加されたようなものに なっている。 FANのコネクタのピン配置は このページがわかりやすい。

仕方が無いので、3ピンで作ろうかと実験し、 電源電圧を変化させて回転数も落とせるように なったのだが、低速域の制御性がものたりない。 電源電圧が下がってしまうので低速域で不安定に なるのは仕方ない。

FANにはPWM入力があるのに...と悔しくなり、 再度4PINコネクタを探すことにする。 ふと思いついてAliExpressで探すとあっさり見つかった。

高品質黒プラスチックシェル 2.54 ミリメートル 2510 3PIN 4PIN 3 ピン 4 ピン (3 + 1) コネクタ scoket PC PC コンピュータ ATX 2540 ファン電源|Computer Cables & Connectors| - AliExpress

50個で$5, 1個10円くらい。送料無料で 1ヶ月ほどで届いた。

最近、部品を探して、AliExpressにならあるというケースが増えてきた。 AliExpressには今後も注目だ。 AliExpressから小口、高速、安価で送れる 配送方法が早くできて欲しい。



テスト治具製作

少量生産の基板の絶縁ディジタル入力とAD入力をテストする 必要があるのだが、いちいち実験用電源等を引っ張り出して 回路を構成するのも面倒だ。 適当なテスト治具が欲しい。 中華製でよくみる電圧計と電流計が一緒になってる 奴を使えば良さげなものが作れそうな気がする。 秋月電子だと 100V1Aの奴とか。

ケースは当然3Dプリンタで作る。 Fusion360は30%OFFのセールで 3年116,270円のライセンスを購入してしまった。 結局、Fusion360の使いやすさはやめられない。

秋月から届いた部品を並べ 配置を検討する。 軸を基板と平行に取り付けられる 半固定抵抗と ロータリースイッチが 使いやすい。 適当なサイズの基板が無かったので 手持ちのものを折って使う。 基板カッターも欲しいと思うが 使う機会があるのかと思うと なかなか買えない。

基板に部品を固定し、 基板形状をFusion360上に作成する。 基板の100mil(2.54mm)ピッチを基準に 座標を出し、各部品のデータシートで 形状を確認することで簡単に形状を作成できた。 このデータを元にパネルを試作し確認する。 このサイズのパネルであれば30分ぐらいで プリントできる。 設計ミスが2箇所あり3回目のプリントで 満足するものができた。

ケース下部を作成し、パネルとの結合部も 作っててケースのデータが完成。 結合は今回もネジ。 将来は嵌め合いで固定できるように なりたいが、まだ経験、試行錯誤が 足りない。

組み上げると穴位置もばっちりだったので、 基板の配線を行い完成させる。 回路としては電源電圧を 10kΩの半固定抵抗で分圧し、 100Ωの抵抗を介して出力、 出力の電圧と電流を計測表示している。 ロータリーSWはテスト時に コネクタ差し替えの回数を減らすために 使用している。 ろくに電流を流せない根性なし回路だが 今回の基板テストには十分。 とりあえず、今ある基板のテストは順調に完了できた。

電流と電圧の両方を見れると安心だ。 可変電源キットと組み合わせて 実験用電源を自作するのに良さそうだ。



パーツのフジオカ

パーツのフジオカは熊本市の 味噌天神交差点近くにある 電子パーツ屋。 先日、店の前を通った時、 閉まっているようで、ん?と思ったが 調べたら 2019年4月に自己破産していた。

高校の物理部の部費で部品が買える店 だったので、よく利用させてもらった。 1年生の年度末、今日中に部費を使い切らないと 没収されるといわれ、フジオカに行き 1日で3万円超の買い物をしたのが良い思い出。 その後、学校帰りによく寄るようになる。

フジオカには当時めずらしかった TK-80BSがあり 触らせてもらったり 借りて文化祭の展示などにも使わせてもらった。 その後、PC-9801の販売で儲かったそうで 平屋の店が4階建てのビルになった。

転職で熊本に戻っり、またフジオカに寄るようになる。 展示品の殆どは昔と変わらないと何時も思っていた。 これはフジオカに限ったことではなく秋葉原でも 多くのパーツ屋の展示品は何十年も変わっていない感じがする。

フジオカは昭和34年(1959)創業だそうだから 2019年閉店で60年もったことになる。 一般企業としては立派な寿命だと思う。 戦後、ラジオ自作ブームというのがあったそうだ。 製品のラジオが高価で、バーツを自分で集めると ずいぶん安く作れたらしい。 そのころ秋葉原にパーツ屋の露天商が出たし、 全国にパーツ屋があったそうだ。 熊本にも銀座通りにマツフジという大型電気店(現マツフジ会館)があり そこの4階あたりにパーツを売るフロアがあった。 小学生の頃、そこでロッドアンテナやらバリコンやらを みつけ興奮していたのを覚えている。

その後、ラジオブームは去り、オーディオブームや アマチュア無線等はあるにせよ低調になって行き、 インターネット通販の時代になって地方パーツショップは 生き残れなくなったのだろう。 今はさらに、海外通販 RS,Digikey, AliExpressなどまである。 マルツも福井のパーツショップだったのが 生き残りをかけてインターネット通販に打って出たというところか。



PCBのETEST

仕事で中国の業者に40枚の基板製造、組立を注文した。 到着後、検査したところ1枚不良がある。 詳しく調べると原因はプリント基板の不良。 ある信号線が隣のGNDベタパターンと細いひげのような パターンでショートしていた。

すぐに業者に報告。 補償等を求めるわけではないが、 舐められたくないので 見つけた不良はすぐに報告する。 しかし今後も使っていきたいので表現は柔らかくした。 こんな感じ。

40枚中1枚不良があった。 基板のETEST(電気テスト?)をすれば 見つかるはずの不良だった。 中国で基板を作ると しばしばETESTをすれば見つかるはずの 不良品に遭遇する。 そういう場合、日本人は何も言わないが 憶えている。100% ETESTを するようになれば、きっと 評判になるよ。

相手側からは陳謝と不良の写真の 要求があったので、送ったところ 最終的に以下の返事が来た。

テストマネージャーによると、デバイスがエラーを報告した際に、テスト担当者がこのボードを無視したためにテストに合格してしまったのではないかとのことです。 そのため、今後このような問題が発生しないように、ここ数日で関係者全員に研修と説明を行いました。

PCB基板を製造すると、ある程度の割合で ETESTで落ちるはずの不良基板に遭遇する。 断線なら、まだ楽だが、 ショートの場合、原因調査にかなり手間がかかし、 回路が壊れる可能性もある。 開発中の回路だと更にわけがわからなくなる。 パターンカットを繰り返しても ショート箇所がわからなかったこともある。 内層でショートしているとしか思えない。 両面基板なのに。

100% ETESTを実施しますというオプションが あれば10$ぐらい払っても良いんだが、 建前では全て無料でETESTをやってくれることに なっているので、そんなオプションは無い。 昔は基板の各端子にETESTのあとのような 傷がみられたが、最近はほとんどみられない。 テストの性能が向上し傷が残らなくなったのだろうか?

考えを変えた。 今後は、ETESTをしてないだろうというような 不良基板に遭遇したら積極的にtwitterで晒して行く。 そうすれば、中国メーカーもETESTをちゃんと実行するなり、 確実に実行する有料オプションの設定なりしてくれるだろう。

基板のETESTを知らない人のために動画を貼っておく。 Eurocircuitというメーカーの動画。 日本語自動翻訳の字幕も可能。



ESP32でJTAG

esp32のシステムを開発している。 プログラム書き込みは通常のシリアル経由でだが、 jtagで書き込めれば速いのではと思いついた。 ESP32 JTAGで検索すると 使えるようなので、基板を改版する際 JTAG端子(GPIO12-15とEN)用のピンヘッダを 追加した。

出来上がった基板にJTAGでのプログラム書き込みを 試すが上手く行かない。使用したJTAGアダプタは Olimex ARM-USB-OCD。 platformioを使っているので、platformio.iniに

upload_protocol = olimex-arm-usb-ocd

書けばjtagで書き込んでくれる。 表示されるエラーには

Error: JTAG scan chain interrogation failed: all zeroes
などとあり、全然動いていない感じ。 いろいろ調べるがわからないので、 JTAGアダプタとしてFT-232Hを使用してやってみると、 違うエラーが出る。

Error: IR capture error at bit 105, saw "0x4210842...

なんか、こっちはjtagが動いているし、惜しい(?)感じが する。しかし調べても原因がわからない。

実験対象をを自作の基板から ESP32-DevKitC(のコンパチ品?)に、 書き込むプログラムも単純なものに切り替え、 試行した結果 OLIMEX ARM-USB-OCDでプログラム書き込みができた。

問題の原因は2つ。1つはJTAGの接続間違いで、 もう1つはプログラムがJTAG機能を殺していたこと。 接続は このページ の表のとおりにしたら上手く行った。 失敗した時は ENをPin3(nRST)ではなくPin15(RESET)に 接続していた。 JTAGを殺す機能はESP32のeFuseにある。 このeFuseにはMACアドレスなども保存されている。 ESP32のフラッシュをクリアすると jtagで書き込めるが、 自分のプログラムを書き込んだ後だと jtagで書き込めなくなる。 プログラムで WiFiManagerライブラリを 使用しているので、このあたりが怪しいと 思っているが確認はしていない。 FT-232で上手く行かない原因はわからない。

jtagでの書き込みができるようになったが速くない。 シリアル経由よりも遅い気がする。 プログラムの書き込みとverifyを なんの必要があるのかわからないが 4回繰り返している。 調整すれば多少速くできるのかも しれないが、期待とは程遠い。

期待したのはSTM32にST-Link2で書き込んだ時の 一瞬で書き込みが終わる感じ。 残念だがjtagでの書き込みは諦め シリアル経由での書き込みで我慢する。

そう言えば ESP32 JTAGで検索しても、 JTAGでデバッグするという話ばかりで、 書き込むという話は無かった気がする。



プローブホルダー製作

隣の机の下に置いているPCの上に置いておくと 収まりが良いことに気がついて オシロスコープが出しっぱなしになった。 プローブは適当にオシロスコープに掛かるように 置くのだが収まりが悪い。 そこでプローブのホルダーを作ろうという話になるのだが 問題がある。ホルダーは机の端に固定することになるのだが、 端が斜めになっているため クランプの上アゴ部分に長さと強度が必要で 3Dプリンタで作りにくいのだ。

というわけで収まりが悪いのを我慢しつつオシロを使っていたのだが 解決方法を思いついた。 上アゴ部分に市販のL字金具を使えば長さと強度は問題ない。 締め付け方法も思いついたので ハンズマンで金具を購入し製作を開始した。

最初、支点を固定しない物を作ったが支点が滑ってしまったので 支点もネジで固定するタイプのものに変更。 これでバッチリ固定できた。 この固定方式は、なかなかのアイデアだと思うのだがどうだろう。

ネジでの固定ではナットを使っているが、 ナットを固定できると組立がやりやすい。 最初は狭めのサイズの穴にナットを ハンダゴテで加熱しながら押し込んでいたが、 作り変えたやつではハンダゴテを当てられない位置が あったので固定を諦め大きめのサイズの穴にしたが プリントするとキツキツのサイズでネジを締めて 圧入することになった。結果的には固定できてよかった。

こういう加熱固定用、圧入用、楽に入るが回転はしないなどの 条件にあったナット用穴のサイズを記録していないので 毎度悩むことになる。ちゃんと実験して記録しておこう。 ちなみにネジ等のサイズは ネジ屋さんの通販ページの表を ダウンロードし自分用の資料として使用している。 便利なのでお勧めする。

ホルダーの固定の問題が解決したので プローブを掛けるためのプレートを設計する。 プローブの先端も外した時、置き場所にこまるので それ用の穴もある。プローブと一緒に使う 小物、 ジャンパーケーブルなどを掛ける突起も ジャンパ・ワイヤ・ホルダを参考に作成。

出来上がりは良い感じだとおもうのだがどうだろう。 金具は150mmのものを使ったが100mmのものでよかった。

データは Thingiverseで公開している。


Arduino で XIAOプログラミング

HDDサンダーで 回転数をXIAOで読み取るまでできた。 その際に取得できた ArduinoでXIAOのプログラム、 ライブラリでは解決できず、 自分でチップのレジスタを操作するような プログラムを書くために 必要な知識をいくつか紹介する。


ソースの在り処

seeeduino XIAOのarduionoのソースは web上では https://github.com/Seeed-Studio/ArduinoCore-samd にある。割と見やすいので、よく利用する。 ただし tools以下のファイルは無い。 PC上では、arduinoのboardマネージャで導入した場合, C:\Users\ユーザ名\AppData\Local\Arduino15\packages\Seeeduino ディレクトリ以下に配置される。

Exploreで開けるのも面倒な場所なので C:\Users\ユーザ名\AppData\Local\Arduino15\packages フォルダを exploreで「クイックアクセスにピン留め」しておくと 各種CPUのarduinoのソースに簡単にアクセスでき 便利になる。

ついでに cygwinのchereコマンドで context menuに「Cygwin here」を追加しておくと、 cygwinを開き

$ find . -type f | xargs grep SOME_TEXT
$ find . -name '*.h' | xargs grep SOME_TEXT

などとして、任意の文字列の出現箇所を調べられるので便利。

プログラミングの雰囲気を掴む

チップのレジスタを操作するようなプログラムを いきなり書くのは敷居が高いので、 まずは簡単な機能のソースを見て 雰囲気を掴もう。

GPIOの操作の仕方は digitalWrite()のソースを見る。 wiring_digital.c にある。 PWMの使い方は wiring_analog.c のanalogWrite()を見る。

プログラムを詳しく読む

雰囲気だけではプログラムは書けないので、 真面目に XIAOで扱われているマイコン、 ATSAMD21G18に取り組もう。 データシートにざっと目を通す。

マイコンの各ブロックの制御レジスタは 型定義が

C:\Users\ユーザ名\AppData\Local\Arduino15\packages\Seeeduino\tools\CMSIS-Atmel\1.2.1\CMSIS-Atmel\CMSIS\Device\ATMEL\samd21\include\component
にブロックごとに有る。

実態の定義は以下に有る。

C:\Users\ユーザ名\AppData\Local\Arduino15\packages\Seeeduino\tools\CMSIS-Atmel\1.2.1\CMSIS-Atmel\CMSIS\Device\ATMEL\samd21\include\samd21g18a.h

これらを参照しながら読むとプログラムの詳細な動きが 理解できる。

PWMの周期を変更

前回の報告で述べた通り、 HDDモータを制御するPWM信号の周波数は DRV11873の仕様で 7~100kHzの範囲内である 必要がある。 Seeeduino XIAOの analogWrite()のPWMの周波数は 実測で730Hzぐらいなので 仕様に合わない。

これを修正すべく wiring_analog.c を読んだところ以下のことが判明した。

  • カウンタは16bitモードで動作
  • 48MHzのクロックを216=65536で分周し、 48,000,000Hz ÷ 65536 = 732.421875 Hzが出力されている。
  • カウントの最大値 0xffff を設定している箇所がある。

カウントの設定値を4800に変更することで、 PWMの周波数を 48MHz ÷ 4800 = 10KHz にすることができた。

信号の周期を計測

BLDCモータドライバDRV11873は モータ駆動の1サイクルに同期した パルスがFG端子から出力される。 この何サイクルかがモータの1回転に 対応するので、この信号の周期を計測することで モータの回転数を取得することができる。 ATSAMD21G18のカウンタでFG信号の周期を 計測したので、その方法を説明する。

カウンタで信号の周期を計測するための 構成を図に示す。 外部ポートPA4から入力された信号を EIC(外部割込)に接続しイベントを発生させ、 EVSYS(イベントシステム)でタイマーに接続し 周期を計測する。タイマーはTC4とTC5を合わせて 32bitタイマーとして計測する。 クロックはシステムクロックの48Mhzを使用するので 最大 232[count]÷ 48M[count/秒] = 89.47[秒]周期まで計測可能 となる。

特徴的なのがEVSYS(イベントシステム)モジュール。 これは各周辺ブロック間で信号をやり取りするバスで

  • 12チャンネル
  • イベント・ジェネレータ74個
  • イベント・ユーザ29個
となっている。 他のマイコン、例えばSTM32だと タイマーやADやDAなどの制御レジスタに これを1にすると入力がTimer-nのX信号が 接続されます、というようなbitがいろいろある。 謎のブロック間ネットワークである。 EVSYSはそれを一般化しているわけで 好意がもてる。 しかし、残念なことに制御レジスタのアドレス空間を ケチっているので使いにくい。

EICの使い方は WInterrupt.cにある attachInterrupt()のソースを見ると 大体わかる。

EVSYSは使い方が分かりづらい。 arduinoでは全く使われていない。 ハマったのは以下の2点。

  • クロックを供給する必要がある
  • レジスタを部分アクセスすると失敗する

クロックの供給というのは、コードで言うと以下の部分。

PM->APBCMASK.bit.EVSYS_ = 1;

STM32とかでプログラムしていると当たり前の部分だが、 Arduinoのソースを読んでいてもあまり出てこないので 気が付かなかった。 調べると wiring.cで結構初期化されている。

Datasheetの 11章 Peripherals Configuration Summaryが参考になった。

レジスタを部分アクセスすると失敗する というのは次の部分。 まず、正常に動かないコード。

EVSYS->USER.bit.CHANNEL = 2;
EVSYS->USER.bit.USER  = 0x13;

正常に動くコード。

EVSYS->USER.reg = EVSYS_USER_USER(0x13) | EVSYS_USER_CHANNEL(2);

このコードはイベント・チャンネル1 (CHANNEL-1の値)の出力を TC(USER 0x13)に接続しているが、 上側のコードではDMAC CH0(USER 0x00)にも接続されてしまい、 DMAC側でイベントを受け入れる設定になっていないので エラーとなり、イベント・チャンネル1が動かなる模様。 正常に動くコードにたどり着くまで、かなり時間がかかった。

割込処理

これでタイマーに信号の周期が記録されるようになるが、 プログラムの処理上、周期計測後に割込を発生させる。 割込の処理も WInterrupt.cが参考になる。

タイマーのレジスタで割込を有効化し、 以下のコードでNVIC(割り込みコントローラを設定する)

IRQn_Type v = TC4_IRQn;
NVIC_DisableIRQ(v);
NVIC_ClearPendingIRQ(v);
NVIC_SetPriority(v, 0);
NVIC_EnableIRQ(v);

cortex_handlers.c にデフォルトの割込ハンドラが定義されている。 TC4関連だけ抜き出すと以下のようになる。

/* Default empty handler */
void Dummy_Handler(void)
{
#if defined DEBUG
  __BKPT(3);
#endif
  for (;;) { }
}
...
void TC4_Handler ( void ) __attribute__ ((weak, alias "Dummy_Handler")));
...

デフォルトのTC4割込ハンドラは Dummpy_Handlerという無限ループのハンドラが設定されている。 weak属性が付いているので、 TC4_Handlerという 関数を定義すれば呼び出される。

void TC4_Handler(void){
  uint8_t flags = TCx->COUNT32.INTFLAG.reg;
  if (flags & TC_INTFLAG_MC0) {
    ... 割込処理 ...
  }
  // 割込フラグクリア
  TCx->COUNT32.INTFLAG.reg = 0xff;
}

VSCodeのエラーを消す

VSCodeでArduinoのソースを編集していると intellisenseで大量のエラーが表示される。 今までは無視してきたのだが、 今回 エラーを消すべく設定を調べてみた。

intellisenseの設定は プロジェクトのフォルダーの .vscode/c_cpp_properties.json を用意すれば良いのだが、 自分で最初から書くのは大変なので VSCodeにArduino拡張を利用する。 拡張機能タブでArduinoを検索すると 3つぐらい見つかるので、その中の Microsoft製のものをインストールする。

インストール後、コマンドパレットで Arduino:initializeを実行。 Boardで Seeduino XIAOを選択すると .vscode/c_cpp_properties.json が生成されるが、 まだ膨大にエラーが表示される。

修正が必要なのは defines と includePath。 definesの参考になるのが Seeeduino Arduinoの boards.txtファイル。 これに

seeed_XIAO_m0.build.extra_flags= -DARDUINO_SAMD_ZERO -D__SAMD21__ -D__SAMD21G18A__ -DARM_MATH_CM0PLUS -DSEEED_XIAO_M0 {build.usb_flags}
という行がある。 あと、足りないincludePathを追加し 以下の設定でエラーが無くなった。

{
    "env": {
        "users": "C:/Users/ユーザ名",
        "ulib": "${users}/Documents/Arduino/libraries",
        "seeeduinoDir": "${users}/AppData/Local/Arduino15/packages/Seeeduino",
        "samd": "${seeeduinoDir}/hardware/samd/1.7.6"
    },
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${ulib}/Adafruit_SSD1306",
                "${ulib}/Adafruit_GFX_Library",
                "${samd}/cores/arduino",
                "${samd}/libraries/SPI",
                "${samd}/libraries/WIRE",
                "${samd}/libraries/Adafruit_ZeroDMA",
                "${samd}/libraries/TimerTCC0",
                "${samd}/variants/XIAO_m0",
                "${samd}/**",
                "${seeeduinoDir}/tools/**"
            ],
            "forcedInclude": [
                "${samd}/cores/arduino/Arduino.h"
            ],
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "${seeeduinoDir}/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "defines": [
                "ARDUINO=10813",
                "ARDUINO_SAMD_ZERO",
                "__SAMD21__",
                "__SAMD21G18A__",
                "ARM_MATH_CM0_PLUS",
                "SEEED_XIAO_M0"
            ]
        }
    ],
    "version": 4
}

includePathで、 ** でサブディレクトリとして 指定してあるのに個別のディレクトリを指定している 部分がある。これは個別指定の方を削除すると エラーになってしまうので仕方なく入れている。

intelliSenseModeとcompilerpathも デフォルトから変えている。 これはデフォルトのままだと pinMode()が未定義というようなエラーが 出るためで、原因はわからない。 intellisenseは謎が多い。

次は

HDDの出力をPWMで制御し、 回転数も検出できるようになった。 次は、フィードバックをかけて 定速制御を行えばいいのだが、 フィードバック・ゲインをどう決めるかが問題。

いつもなら、実験しながら適当に決めてしまうのだが、 ちゃんと特性を計測し、極配置とかで設計してやるのも 面白いかもとか思っている。 どうなることか。



Seeeduino XIAO考

HDDサンダーをマイコンで定速制御してやろうと 基板を製作、プログラムを作っている。 マイコンは先日購入した Seeeduino XIAOを使用しているのだが、 気が付いた点が幾つかあるので 紹介する。

  • ユーザプログラムが暴走するとプログラムが書き込めなくなる。
  • プログラムを書き込むとリセットされるので、PCにUSBが 外されましたとか接続されましたとか表示されうるさい。
  • CPUはMicrochip(Atmel)の SAMD21G18。CPUはARM Cortex-M0+ だが、周辺I/Oの癖が強い。アドレス空間をケチっていて8bit CPUっぽい。

プログラムの書き込みはUSB経由で行うが、USBの機能は CPUが提供、ArduinoのフレームワークからUSBの処理ルーチンが 呼び出されるので、ユーザプログラム中でプログラムが止まる (無限ループに入るとか)するとUSBが止まり、プログラムが 書き込めなくなる。この対策としてXIAOには基板にリセット端子が あり、 チョンチョンと2回ショートしてやると、ユーザプログラム が呼び出されない書き込み専用モードでたちあがり プログラムの書き込みが可能になる。 このモードの検出のためだと思われるが、 電源投入後、ユーザプログラムが起動するまで2秒程度待たされる。 組み込み機器を作る場合、この待ち時間はチョット嫌だ。

HDDモータの出力をPWMで制御するのだが、 analogWrite()だとPWMの周波数が 735Hzで DRV11873の仕様(7~100kHz)に合わないので 変更する必要があり、SAMD21の Datasheetを調べた。 なんとか目的は達成することができたが、 SAMD21の制御レジスタが狭苦しい。 制御レジスタの値で内部レジスタを選択し 値を書き込む感じ? 内部レジスタに書き込めるけど読み出せないとか。 内部レジスタを表に出して、直接読み書きさせてくれよと思う。

ということで、 開発中のボードは仕方ないが 次からは別のCPUにしようかと思っている。

Seeeduino XIAOの良い点も上げる。

  • 安い。 秋月で580円
  • 小さい。 20x17.5mm。
  • 基板端面もメッキされているので、基板に直接はんだ付け可能。
  • Arduinoで開発できる

Arduinoで開発できると、 開発環境がすぐに手に入るし、 ライブラリ、サンプルプログラムも大量に入手できる。 プログラムの公開もしやすい。

XIAOの良い点もカバーできる代わりのものが無いかと AliExpressを物色したところ STM32F103C8T6ボードを発見。 200円ぐらい。 STM32F103なので Cortex-M3でFlash32K/RAM10K。 Arduinoは Arduino_STM32 が使えるようだ。 基板がXIAOより大きいという問題があるが、 基板に組み込みたければ直接チップを 乗せれば良い。LQFP48ピンなのでハンダ付けも楽。 チップもAliExpressなら 100円/個ぐらいで買える。

ちなみにdigikeyだと 500円/個ぐらいする。 STmicroのCPUは中国で安い。 あまり安いので中国製コンパチチップ GD32F103のリマーク偽造品ではないかと疑うが、 GD32F103の方が 若干高い

ということで、次はSTM32F103にしよう。 しかし、作った装置を手軽にPCにつないで遊びたい時には WiFi/HTTPで通信できるESP32が便利。 ESP32 devkitと共に注文しておこう。



Hantek 2D42購入

Hantekのハンディ・オシロ 2D42をAliExpressで 先月注文し、約1ヶ月後の今日届いた。

購入した理由は、ネットで購入した人の話を見かけ、 手持ちのオシロ(RIGOL MSO1074)だと 大きくて置き場の確保や出すのが億劫なことが多い... 信号が出てるかちょっと確認したいだけ、 なんてことが多いので ハンディ・オシロ便利かも... AliExpressなら1万円ちょっとか... 直ぐに必要なわけでもないから待てるし... 定額給付金も使ってないし... などと考えたから。 RIGOL MSO1074にしても 更に、その前のCRT式のオシロに比べると 遥かに小さいのだが、机周りには いろんなものが散らばっているので スペースが無いのだ。

購入したのは Hantek 2D42帯域40MHz, シグナルジェネレータ付きのやつで 12,701円 到着まで1ヶ月もかかるのは リチウム・イオン電池内蔵のためという 説をネットで見たが真偽はわからない。 アマゾンだと 2万円ぐらいだから 待てるのであれば待つ価値はありそう。

充電用のUSB電源アダプタが付属しているが ACプラグがEUROタイプ。 注文を間違えたのかもしれないと 確認したがUSAタイプの選択肢は無し。 商品写真にEUROタイプのプラグしか 内容だ。 5V2AのUSB電源で 充電用のやつが使えるので問題はない。

使用説明書は Hantekの商品ページ でダウンロードできる。 英文版で41ページしかないが そのうち読んでみよう。 使用説明書以外にも ファームウェア、FPGAのデータ、ソフトウェアが ダウンロード可能。 ソフトウェアを試すと、 本体の操作をPC側から行えるようだ。 ただ、データ転送が遅く、 1秒に1回データを取ってくるような動作をする。 データの印刷やセーブもできるので 便利な場面もあるかもしれない。 実機のボタンで操作するより PC上でマウスで操作したほうが楽かもしれない。

今後、使って行って 使い心地など調べて行きたい。



いろいろ購入

ブログのネタが落ちてこないかと待っているうちに 1週間経ってしまった。 なんか中国方面で停滞している模様。 仕方がないので秋月から届いた部品を紹介する。

その1。 金メッキされたテスター棒。 持っているテスターは MASTECH MAS830L。 秋月電子で1000円のやつ。 導通チェックで使用することが多い。 随分前に購入したものなので、 テスター棒の先端をゴリゴリして 酸化膜(?)を剥がしてやらないと 導通してくれない。 そんな作業も面倒なので購入した次第。 購入したのは初めではないが、 使用した記憶があまりない。 なんでだろう?

その2。 Seeeduino XIAO。 ARM Cortex-M0マイコン。Flash 256K, RAM 32K。 作るものの制御用にマイコンが必要なのだが 何を使おうと考えた時に、Arduinoが使える, USBでプログラム書き込み、小さい、安い などの点でXIAOを使うことにした。

その3。 128x64ドットモノクロOLED I2C接続。 表示が細かさ、明瞭度の高さで このディスプレイが気に入っている。 SPI接続のものは売るほど持っているが、 XIAOで使うと1ピンでも少ないほうが良いので I2C接続タイプを購入。

その4。 CDS LEDマトリックス・モジュールに RSSを24時間表示させているが 夜中、かなり眩しい。 対策をせねばと思っていたが、 照度センサでLEDの光量を調整するという記事を ネットでみかけ、同じことをしようとセンサーとしてCDSを購入。

ということで秋月電子で購入した部品を紹介した。 記事を書いているうち、 滞っていた部品の一部が到着。 届いたは リニア・ベアリング。 内径 3mm, 6mm, 8mm のもの。 シャフトはミスミで買う予定。



HDDサンダー試作1号

注文した50mm径のサンドペーパーが届いたので、 HDDのモータを使ったサンダー製作を進める。

先日、実験に使ったHDDのモータはフレームと一体型で 小型のサンダーを作るのには使えないので、 廃棄HDDをもう1台分解。分離型のHDDモータを入手できた。 マジックテープと接着剤はダイソーで購入。


ケースの形状は 元ネタ を参考に、モータや基板、DCジャックが収まるように Fusion360で設計。 ケース各部の結合をどうするか悩んだが、 今回は埋め込みナットは使わず スペーサを使用することにした。 埋め込みナットだとケース内部に 柱を建てる必要がある。 スペーサだと、その柱の代わりになる。 ケースの外側からみえるネジが増えるのが 何だが、それを気にしなければ良い方法だと思う。 特に今回は試作1発めだったのでスペーサで楽ができるのは有り難い。

Fusion360で設計時、使用する部品のモデルがあると 考えやすいので最近は積極的にモデルを作るようにしている。 今回はHDDモータ、モータドライバ基板のモデルを作成。 DCジャックは円筒形で代用した。基板のモデルの作成で、 写真を取り込みを行ってみた。 寸法を合わせて、穴や主な形状(VR、コネクタ)を作成したが 作業が楽。写真が入手できる場合はアリな気がする。

各部品、わたしの3Dプリンタには割と大きい(10cmぐらい)し、 反ってもらいたくなかったので1つづつ印刷した。 私のプリンタ(qidi X-Smart)の印刷可能領域は 140x140x140mmだが 端の20mmぐらいはヒートベッドの効果が低く反る可能性が高い ことがわかってきた。つまり反らないのは100x100mmぐらいまで。 なかなか狭い。 Ender3-V2 (印刷範囲 220x220x250)を買う理由が増えてきた。

組立は順調に進み、完了。動かすとそれなりに動いた。 アルミやPLAを削ってみる。 めちゃくちゃ削れるわけではないが、 それなりに削れる。 ものを押し付けると回転は落ちる。 最大出力だと力強いが、高速回転はちょっと怖い。

やはりマイコンで定速制御をかけてやると 楽しいのではないかという気がする。 実用品か?と考えるとちょっと疑問。 廃棄物で割と簡単に作れる 実用にもなるかもしれないもの...と言ったところか。



HDDのモータを回す

前に買ったブラシレス・モータ・ドライバ基板で HDDのモータを回した。

基板を買ったのは この記事を書いた時なので9ヶ月前。 当時アマゾンから759円購入。今はアマゾンだと2,256円で お届けが1ヶ月後(中国発送?)。 AliExpressだと今でも 300円ぐらいで買える。 当時はバラす適当なHDDが無いと思い込み動かしていなかったのだが 最近、未廃棄の古いHDDを大量に発見。

基板の接続を調べる。 基板裏にも書いてあるのだが AliExpressの商品写真に わかりやすいものがあった。 HDDをばらすと、モーターの端子は4つ。 センターもあるようだ。 テスターで抵抗を測りセンターを識別し、 その他の3本に配線をつなげ、 電源を入れるとHDDのモータは音もなく回りだした。 VRをヒネると停止状態から最高速度まで変化する。

この先は、 元ネタの動画のように ディスク・サンダーを作りたい。 とりあえず 直径50mmのマジック付きサンドペーパーを注文する。

基板の中身を調べる。 16pinと8pinの2つのICが乗っている。 16pinの方は Tiの DRV11873らしい。 これは ブラシレスDCモータのドライバーでFAN用。 速度調整の入力がPWMになってる。 8pinの方はNE555で、そのPWMの信号を生成している模様。

DRV11873はdigikeyやmouserで200円台で買えるので NE555ではなくマイコンで制御し、回転数の表示なども すれば面白いのではないかと思うが、回すモータは HDDのモータしかないし、回してもディスク・サンダー位しか 用途を思いつかない。



自作Flipping Station

SMDマウンタ(Pick & Place)に興味があり、 調べているうち半自動SMDマウンタを知る。 試作や少量の製造では半自動の方が便利らしい。 そこで使われている Flipping Stationの 動作が面白いので作ってみることにした。 SMDをひっくり返す機械だ。

実際に使おうとして作っているわけではない。 動作が面白いから作って見るだけ。 メカものの製作の練習。


3Dプリンタで静物(非メカもの)で実用品を作るのは簡単。 というか普通、実用品しか作らない。 実用品以外はテストプリントぐらい。 でも、それだけだと3Dプリンタの用途が限られるので メカものにも手を出したい。 しかしメカものの実用品はハードルが高い。 本当に実用になるものを作り上げるには 膨大な時間を投入する必要がある。 実用にならなければ作る意味は無いとか 言っていると、いつまでも作れそうにないので、 練習から始めることにした。

最初、マイクロサーボSG-90(の模造品?)で作ったのだが、 $2/個で買った模造品のせいか動作がスムーズではない。 回転角度も180度欲しいのだが、少し足りない。 静止状態でも若干動いてしまうのでサーボは諦め 以前秋月で販売していたCOPALのギア付きステッピングモータ SPG20-1331を使用することにした。 原点検出には パナソニックのAV620264を使用。 コネクタ付きケーブルも買えるのが良い感じ。

設計はステッピングモータとマイクロスイッチのモデル作成から始める。 ステッピングモータは データシートを見て図面を入力。 マイクロスイッチはメーカーのサイトから 図面のDXFファイルをダウンロードできたので、 これをFusion360のスケッチに読み込み、 適当な領域を選び押し出すとモデルができた。 各部の外観を適当に設定してやるとそれっぽい。 あとは、これらを適当に配置。間を埋めるように 部品を作成し設計は完了した。 今回作成したのは試作品。 全体の大まかな動きが確認することが目的なので、 実験のしやすさを重視している。

3Dプリンタでの印刷では、いろいろとトラブルに見舞われた。 主な現象はフィラメントの詰まり。数回ヘッドを分解することになり、 ヘッドの構造には詳しくなった。原因は、使っているフィラメントが ABSだと思ってたのだが実はPLAで設定温度が高すぎたこと。 ノズルより上のフィラメントを送り出すステッピングモータのあたりまで フィラメントが柔らかくなり詰まってしまいフィラメントを送り出せなく なっていた模様。

ABSのフィラメントが無いから買い足したものを使ったので、 当然ABSだと思っていたら、実は間違ってPLAを注文していた。 Amazonで購入したのだが、ABSフィラメントで検索して 注文したつもりなのに、表示される関連商品にまどわされて PLAを注文していたようだ。

プリント完了後、部品を組立てアルミフレームに固定する。 なんでも固定できるアルミフレームは試作に便利だ。 全体を固定できると実験もやりやすい。 制御に使っているボードはPIC32MX220を使用した自作ボード。 A4988ステッピングモータ・ドライバー・モジュールが乗っている。

次は全体を1パッケージに、まとめて完成させる予定。 今はチップを乗せる部分を導電性スポンジを使用しているが、 これだと 1.6x0.8mmのチップ部品などでは埋もれてしまったり 飛んで行ってしまったりする。この部分はゴムシート に変更する。 本当に実作業に使用するのであれば、ゴムシートと フィラメントは導電性のものにすると良いのかもしれない。



日々のデータとgrafana

から室温の計測に興味があって、 なんやかんやと計測してきた。 現在は15個の温度(室内13,屋外2)を計測し、 grafanaでグラフ化している。 grafanaは汎用のグラフ化ツール。 汎用ってどうよ、と思っていたが すぐにグラフ化できるのは便利だ。


グラフの説明をする。

居室の温度が9個ある。 180cmの棒に4個のセンサーが固定したもの が2本で8個、 あと netamoの室内モジュールがあるので9個となる。 この8つの室温センサーの値は、通常は余り差が出ないが、エアコンをつけると如実に差が出る。 この部屋の温度が常時高めなのは パソコンのせいだと思われる。

この冬、低温で3Dプリンタの調子が悪くなった時、 3Dプリンタ周りに温度センサーを4個設置。通常は人がいない部屋なので、温度低め。 3Dプリンタを動作させると、内部の温度が少し上昇する。

屋外の温度センサーは2つあって、 1つは netatmoの屋外モジュールで、 もう一つはESP32を使用した自作センサー。 netatmoには温度以外に湿度、気圧、CO2濃度の センサーもついているので、これらの値も表示している。データは、netamoのサーバ(netatom.com)から pythonのプログラムで取得している。

自作ESP32温度センサーは、 タカチの防水ボックスSPCMに 電池駆動のESP32基板を入れ、 防水のケーブルグランド経由で DS-18B20防水型温度センサー を引き出したもの。 単3電池2本で動作する。

防水性は完璧で気に入ったのだが、 実際に動作させると電池の寿命が1ヶ月も無い。 TPS61291昇圧コンバータの使用を止め、 電池の直接駆動に切り替えるが、 あまり変化は無く。 WiFi接続を止め、Bluetooth接続に 切り替えたら、3ヶ月程度持つようになったので、 そのまま運用している。 温度と一緒に電池電圧の変化も記録している。 グラフを以下に示す。

netatmo屋外モジュールは単4電池4本使用だが、 なかなか寿命が長い。1年以上持つのではなかろうか。 省電力運用には、まだまだ修行が必要そうだ。

とりあえずデータをdatabaseに放り込んでおけば grafanaでグラフ表示できるので、なかなか便利だ。 グラフ表示の機能を改善したいところもある。 grafanaの改造で対応できるのか、 自分で独自に作ったほうが楽なのか、 悩んでいる。



FT232Hボード動かす

FT232HボードでI2C接続を試す。 ドライバー、ライブラリー等を Adafruitのページの説明に従い インストール。 SSD1336使用のOLEDに表示できる。 1000回繰り返してもエラーは出ない。 安定している。


プログラムを以下に示す。

import os
os.environ['BLINKA_FT232H'] = '1'
import time
from random import randrange
import adafruit_ssd1306
import busio
from board import SCL, SDA
i2c = busio.I2C(SCL, SDA)
t0 = time.time()
w,h = 128,64
oled = adafruit_ssd1306.SSD1306_I2C(w, h, i2c)
oled.fill(0)
for i in range(1000):
    x0 = randrange(w)
    y0 = randrange(h)
    x1 = randrange(w)
    y1 = randrange(h)
    oled.line(x0, y0, x1, y1, 1)
    t1 = time.time()
    oled.show()
    t2 = time.time()
    print("%4d %.0fms" % (i, 1000*(t2-t1)))

しかし、表示が遅い。 計測するとが128x64dotの 画面更新に 250mSぐらいかかっている。 FT232Hは Hispeed (480Mbps)接続。 4KのFifoを持ち、 MPSSE(Multi-Protocol Synchronous Serial Engine)という専用ハードウェアを搭載しているので、 I2Cの 400Kbpsなんて楽勝だろうと思っていたのだが そうではなかったようだ。

I2Cの波形をオシロスコープで確認する。 確かに 400Kbpsで通信しているが、 バイトが連続しない。 300us毎に1byte通信している感じ。

MPSSEについて調べると、 I2CやSPI,JTAGのプロトコルを 直接扱えるのかと思っていたが そうではなく、データをコマンドとして 解釈実行することで、さまざまなシリアル 通信を行えるというハードウェアらしい。 I2Cで1byte送信するにも数byteのコマンド+データを 送る必要があるようだ。

それでも,もっとI2Cを高速化できるのでは ないかという思いはあるのだが、 I2Cは、速度を追求するようなプロトコルではないし、 自分の用途的にも速度はいらないので、 動作が安定しているこの FT232Hを使って行こうかと思う。

調べていてわかったのだが、 このボードはI2Cのclock stretchingには対応していない。 FT232H自体は対応可能なのだが、それには追加の配線が 必要で、このボードでは行われていない。 自分としてはclock strechingは必要ないので問題ない。



FT232Hボードなど届く

土曜日に注文したFT232Hボードなどが届いた。 購入したのは以下のもの。


秋月の奴の方が実験しやすいのではないか、などと 書いていたが、sparkfunの奴だと実際に使う場面でも コンパクトで、そのまま使えそうなのでこっちにした。 Qwiicケーブル関連も色々購入することになった。

実験を始める前に、基板を固定する台を3Dプリンタで製作した。 当然、磁石付き。将来、ケースに作り変える予定。

USB Type-C変換アダプタ経由で接続すると コネクタに負荷がかかりそうで不安だ。 USBケーブルを支えるような仕組みも考えたい。



USB-I2C基板 (ソフトウェア編)

USB-I2C基板はpythonから使いたい。 pythonでI2C経由で機器を操作する プログラムを作りたい。 MCP2221 Pythonで検索すると いろいろ情報が見つかる。


PyMCP2221Aを試す

PyMCP2221Aというライブラリを試す。 MCP2221Aの機能(ADC,DAC,GPIO,CLK,I2C)を全て サポートしているようだ。

I2C接続のセンサーを試すと、簡単に値の読み取りなど できるようになった。もう少し派手なデモも欲しいので、 I2C接続のOLEDディスプレイ(128x64モノクロ)も試すが、 うまくいかない。 調べると PyMCP2221Aは 60byteまでの書き込みにしか対応していないことが判明。 そこで 60byte超のデータにも対応できるよう改造してみるが うまくいかない。

Circuit Python Libraryを試す

Adafruitも MCP2221AのUSB-I2Cボードを出しているので、 それ用のPythonライブラリを試してみる。 すると描画はできるが、繰り返すとエラーになる。 試したプログラムを以下に示す。

import os
os.environ['BLINKA_MCP2221'] = '1'
from board import SCL, SDA
import busio
import adafruit_ssd1306
from random import randint
i2c = busio.I2C(SCL, SDA)
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
oled.fill(0)
for i in range(1000):
    print(i)
    x0 = randint(0,128)
    y0 = randint(0,64)
    x1 = randint(0,128)
    y1 = randint(0,64)
    oled.line(x0,y0,x1,y1,1)
    oled.show()

実行結果も下に示す。

$ C:/Users/nari/AppData/Local/Programs/Python/Python36-32/python.exe c:/01proj/v385_USB_I2C/python/blinka_test.py
0
1
 ... 中略 ...
86
87
Traceback (most recent call last):
  File "c:/01proj/v385_USB_I2C/python/blinka_test.py", line 19, in 
    oled.show()
  File "C:\Users\nari\AppData\Local\Programs\Python\Python36-32\lib\site-packages\adafruit_ssd1306.py", line 185, in show
    self.write_framebuf()
  File "C:\Users\nari\AppData\Local\Programs\Python\Python36-32\lib\site-packages\adafruit_ssd1306.py", line 232, in write_framebuf
    self.i2c_device.write(self.buffer)
  File "C:\Users\nari\AppData\Local\Programs\Python\Python36-32\lib\site-packages\adafruit_bus_device\i2c_device.py", line 104, in write
    self.i2c.writeto(self.device_address, buf, start=start, end=end, stop=stop)
  File "C:\Users\nari\AppData\Local\Programs\Python\Python36-32\lib\site-packages\busio.py", line 94, in writeto
    address, memoryview(buffer)[start:end], stop=stop
  File "C:\Users\nari\AppData\Local\Programs\Python\Python36-32\lib\site-packages\adafruit_blinka\microcontroller\mcp2221\i2c.py", line 19, in writeto
    self._mcp2221.i2c_writeto(address, buffer, start=start, end=end)
  File "C:\Users\nari\AppData\Local\Programs\Python\Python36-32\lib\site-packages\adafruit_blinka\microcontroller\mcp2221\mcp2221.py", line 298, in i2c_writeto
    self._i2c_write(0x90, address, buffer, start, end)
  File "C:\Users\nari\AppData\Local\Programs\Python\Python36-32\lib\site-packages\adafruit_blinka\microcontroller\mcp2221\mcp2221.py", line 202, in _i2c_write
    raise RuntimeError("Unrecoverable I2C state failure")
RuntimeError: Unrecoverable I2C state failure
$

その他の試み

MicroChip社提供の MCP2111A用DLLを Pythonから使ってみようとするが、 うまくいかず、 Linux用DriverをRaspberry Piで試すが OLEDへの表示はできない。

現象としては、MCP2221Aへ書き込み(USBパケットの送出)を 繰り返していると、コマンドが受け入れられませんでした という状態になり、リトライを繰り返すうち、 復旧不可能な状態になってしまう感じ。

結論

MCP2221のI2Cは、短いパケットであれば 使えているようであるが、 (現状のソフトウェアでは?) 長いデータの書き込み などを安定して行えないようである。

自分の用途では、短いデータのやりとりで 充分な気もするが、動作のわけのわからない 感じが気持ち悪いし USB-I2Cの転送速度の遅さも気に入らないので MCP2221Aの使用は諦めることにする。

次は FT232Hを試そうかと思う。 これだと I2Cに加えてSPIも使用可能。 Adafruitの奴はカッコいいのだが、 カッコ良すぎて実験用にピンヘッダをハンダ付け するのもためらわれてしまう。 秋月の奴だと気軽に実験できそう。



USB-I2C基板 (組立編)

4月22日(水)に注文した基板は 4月30日(木)に到着した。 8日で届いたことになる。 配送記録によると土曜日には中国から発送されたので、 通関および国内配送に時間がかかっている模様。 中国サイドでの処理は、むしろ通常より速いかもしれない。

部品は少ないし、ICはSOP(1.27mmピッチ)なので 簡単に 組立後、USBケーブルを接続するが反応が無い。 Windows機に接続しているので、 ピロリロリンの音を期待するが鳴らない。 デバイス・マネージャーを開き、 USBケーブルを抜き差しするが変化がない。

こんな簡単な回路なのに間違うはずはない。 部品か基板の製造不良を疑い 2枚めの基板にMCP2221AとUSBコネクタのみ 実装し USBケーブルを接続するが 現象変わらず。

改めて、回路を見直したところ、ミスを発見。 MCP2221Aの11番ピンVUSBを USBコネクタのVbusに 接続していた。 どうも、このピンはIC内部の電源(3.3V)で、 高品質なセラミック・コンデンサでバイパスしろ と書いてある。 Microchip製のbreakout boardの 回路図では 0.47uFのコンデンサ経由でGNDに接続されている。 名前がまぎわらしいんだよ。 ちなみに電源端子は別にあり、電源範囲は 3~5V。

パターン・カットで基板を修正しようと検討したが 11番ピンの下をガッチリ 5Vの配線が通っている。 パターンカットだと面倒だと判明したので 方針を変更。 11番ピンを浮かし、5Vとの間に 1610サイズ1uFの チップコンデンサを実装し、回路修正を行ったところ、 無事、PCにCOMポートとして認識されることになった。

この先は、自分でプログラムを作る必要がある ... と思っていたが、念の為 「MCP2221A python」で検索 すると、いろいろあるようだ。

私のMCP2221A基板の特徴は4つ

  • GROVEコネクタ装備
  • I2C信号がピンヘッダにも出てる
  • I2C動作LED
  • GROVE Wrapper対応

GROVEコネクタ

GROVEは、 seeed社が提案する 4本線でマイコンとセンサー等の周辺回路を 接続する規格。 2本の電源ラインと2本の信号線からなる。 seeedはGROVEコネクタが搭載された マイコンボードやセンサーなどの基板をたくさん販売 している。 信号線の使い方はI2Cに限らないが、 I2Cのものが多い。

昔、自分の製作物のi2cのコネクタの規格を統一したいと 考え、適当な4ピン有極の入手製の良いコネクタを探した時、 Groveコネクタの存在を知り、使用するようになった。 Groveだとケーブルも各種安価で手に入るのも良い。

同様のものとして SparkFun の Qwiic があるが、 こちらはJSTのSHコネクタ(1mmピッチ)を 使っていて、小さすぎるし高そうで 食指が動かない。

I2C信号のピンヘッダ

GROVEコネクタが実装されていない基板への接続に 使用するかと思いきや、 GROVE-QIコネクタなどというケーブルがあるので必要ない。 このピンヘッダの目的は、オシロスコープでの観測用。

I2C動作のLED

MCP2221AのGP3にLEDを接続すると、 I2Cの通信時に点灯してくれる。 なかなか良いではないか。

GROVE Wrapper対応

Grove Wrapperは センサー等の小さい基板を固定する プラスチック製品で seeedが販売している。 固定方法はレゴブロック、ネジ等。 私はネジで磁石を固定し使用している。

私は、Grove Wrapperを知った時から 大変気に入って、大いに宣伝しているのだが、 まったく広がらない。 そもそも国内では売ってるところが無い。 共立エレショップは 在庫無しの入荷時期未定だし、 マルツは、納期お問い合わせ下さい。 ということで弊社で 販売を始めた。

小型基板は悲しい。 特に電池を内蔵せず、外部電源が必要だと悲しい。 接続するケーブルのほうが重いので、 ケーブルに引きずり落とされてしまう。 居場所が安定しない。

そこでGrove Wrapper+ネオジム磁石に に装着すると、バッチリ固定される。 USBケーブルなんて楽勝。 オシロのプローブを2本ぶら下げても平気である。 使わない時は適当なところに貼り付けておけば良いので 保管にも便利。

ということで、今回のUSB-I2C基板は Grove Wrapperに取り付けられる形状にしてある。 将来、3Dプリンタで専用ケースを作るつもりだったが、 Grove Wrapperで充分かもしれない。 専用ケースを作るとしても磁石は必須だ。

磁石は皿穴付きネオジム磁石。 国内製も買えるが、AliExpressで 安く買うこともできる。 ただし、Aliのやつは割れやすい印象がある。 今回も、近くにおいた磁石同士がくっ付いただけで 割れてしまった。製品として売るものには使えないが、 自分で使う分には問題ない。

Grove Wrapperが電子工作界に普及することを祈念し、 私がノギスで実測し作成した図面と、今回の基板の外形図を 公開する。 自己責任で御使用下さい。



ひさびさに基板注文

ひさしぶりに基板をElecrowに注文した。 春節後、つまり新型コロナ蔓延後、初めてだ。

作ったのは USB - I2Cのアダプタ。 Microchip社のMCP2221AにUSBコネクタとI2Cのコネクタを 付けただけ。 USB-I2Cアダプタは市販のものも2千円未満であるし、 MCP2221Aの評価ボードも2千円台で売っている。 なのに自分で作りたいのは、直接 GROVEのケーブルが生えている アダプタが欲しいからだろうか、それとも基板を作りたいだけだろうか。

MCP2221AはDIP品も売っているので、 ユニバーサル基板で試作することも可能。 しかし、そんな気は全く起きない。 やはり基板を作りたいだけかもしれない。

さて、基板はどれくらいで届くだろうか。 Elecrowの自分の最短記録は5日。 2週間ぐらいで届くか?



LED版RssDispも更新

昨日更新した OLED版のRSS表示プログラムの調子は良いが、 LED版の方は調子が悪い。 調子が悪くて、しばらく消していたのだが、 RSS表示はともかく、時計が見易く慣れてしまっていたので LED表示も復活させたい。 というわけでLED版も更新することにした。 ソースを調べるとLED版はOLED版のソースを流用したものだったので、 変更箇所が同じで、簡単に更新できた。

これでhttpsのRSSが読み込めるようになったので、 読み込み先も更新するのだが、 なんかYahoo!ニュース - RSSにあるものから適当に選べば十分ではないか、 という気がしてきた。そうすれば、このサイトのfingerprintだけ あれば十分なので更新も年1回すれば済む。

ということで、 このページから、ネットやTVであまり見かけなさそうな ニュースソースを意識しながら、海外ニュース(BBC,CNN)とか、 ローカルニュース(熊本日日新聞)とか、お笑いナタリーとかを選ぶ。

しかし このページは、何のために存在しているのだろうか? RSSでニュースを読む人のために存在しているの? よくわからない。

更新したプログラムを githubにアップロードした。 これは LCDマトリックスコントローラ用の Arduino Library, Humblesoft_LedMatの サンプルプログラムの一つで esp8266(ESP-WROOM-02)上で動作する。 この コントローラ LEDマトリックス・モジュール 5V1Aの電源 があれば動作させることができる。



RssDispを更新

OLEDの寿命で取り上げた RSSを表示するプログラム: RssDispの表示が 調子悪くなってしまった。 原因の1つは、httpでRSSを提供するサイトが減ってしまったことで、 もう一つは Make:の RSSの反応が遅くなってしまったことらしい。 リクエストを出して10秒ぐらい返事が帰ってこない。

OLEDに表示されたRSSを真剣に読んでいるわけではないが、 正常に表示されないと気持ち悪いので プログラムを修正することにした。

改良点は、以下の通り。

  • httpsサイトへの対応
  • サイトごとのRSS最大表示数の設定
  • その他、表示が不自然なところを減らす

esp8266 Arduinoだと、 httpsサイトへのアクセスも可能だが、 サイトの指紋/fingerprintも指定してやらなければならない。 このfingerprintはchrome等でアクセスし証明書を表示させれば わかるのだが、証明書が変わるたび更新しないといけない。 ということで、これまでhttpsへの対応は行っていなかった。

以前は、httpで提供されているRSSも多かったのだが、 殆どのサイトでhttpsでしかRSSが提供されなくなってきた。 Yahoo ニュースのRSS も httpsでしか提供されない。

ということで、とりあえず fingerprintで httpsへの 接続を行うことにした。

サイトごとの最大表示記事数は、 Make:のRSSが50記事あり、 かなり古い記事まで含んでいるので、その対策。

その他の表示の改良は、RSSの取得に時間がかかる場合、 表示が止まっていたのを、それなりの表示が継続するするよう 改造した。

今回の改良で、以前のように 多くのサイトのRSSを表示できるようになり満足している。 次は LEDに表示している奴 にも同様の改良を施したい。 その次に、fingerprintを使わない httpsへの接続の実験か。



OLEDの寿命

ディスプレイの下で HSES-NODE-OLEDで 常時 RSSを表示させている。 読んでいるわけではないが、 何かしら情報が表示されていると 嬉しい気がするので動かしている。

表示は128x64dotの単色(白)なのだが、 最近、一部のdotの明度が明らかに下がっている。 よく調べると、表示が動いていない、 常時点灯の部分が暗くなっている。

この表示を始めたのは3年ぐらい前なので、 OLEDの寿命は3年程度ということになる。 字が流れる部分などでは、全く暗くなっていないので、 表示の仕方を工夫すれば10年ぐらい使えるものは作れそうだ。

HSES-NODE-OLEDの場合、OLEDモジュールは交換可能で、 300円ぐらいのものなので、モジュールタイプのものを使用する という手もある。

動いている様子。

3年前の動画。



スポンジを使わないハンダ付け

ハンダゴテを置くコテ台には、 スポンジが付属するものが多い。 水に湿して、コテ先を拭き 余分なハンダの除去などに使用する。

私も電子工作を始めて以来、ずっとスポンジを使用していたのだが、 何年か前に止めた。 きっかけは、 スポンジでコテ先を拭く際、引っ掛かりを 感じるようになったこと。 温調式ハンダごてを使うようになり コテ先の温度が低くなり、 残ったハンダが凝固してしまうせいだろう。

元々、スポンジにたっぷり水を含ませ、 コテ先で盛大に蒸発させるのが好きだったので、 水分が多すぎるのが問題なのかもしれない。 でも、そんなことしてて平気だったということは、 温調式でないハンダゴテはどんだけ温度が高いのか、という話でもある。 そういえば、以前は熱収縮チューブもハンダゴテで処理できていたが、 温調式だとなかなか縮まない。

では、替りにどうしているかというと 「もじゃもじゃ」こと 真鍮製のワイヤー式コテ先クリーナーと メモ帳できれいにしている。

もじゃもじゃ、だけではどうしても コテ先に若干ハンダが残ってしまう。 そこで、コテ先の平らな部分をメモ帳に擦りつけて きれいにしている。 コテ先に 円錐斜めカットタイプ を使用しているからできることかもしれない。 これでハンダは全く残らない。 もじゃもじゃを使わず、メモ帳で拭くだけだと 側面にハンダが残ってしまう。 もじゃもじゃは必須。

メモ帳を使用している理由は、 適当な厚みがあり使いやすい、 汚れたら1枚つづ廃棄できる、 コンパクトで場所を取らない、 不要なものが大体その辺に転がっている、 などである。

たまにスポンジでコテ先を拭くと、 キレイだな、と思うので メモ帳方式は、キレイさでは負けるかもしれない。 しかし、はんだ付け作業の前後に水を扱わないで済むという メリットは大きい。 お勧めする。



温度センサーDS18B20ホルダー

既に書いたことだが、 寒くなって3Dプリンタの調子が悪い。 ABSだと反ってプリントできないのでPLAで印刷している。 しかしABSも使いたいので対策を検討する。 保温とかヒーター設置とか考えられるが、 まずは温度を測定したい。 3Dプリンタ内部、上部、外部等の温度を計測し、 データをWiFiで飛ばしてグラフ化したい。


温度センサーは、Amazon等で安く売っている ステンレス管入り防水DS18B20を使用する。5個で1050円。 マイコンは手持ちの関係で OLED付きESP-WROOM-02(ESP8266)マイコン HSES-NODE-OLED。 で、ステンレス管入りのDS18B20を見ているうち、 ホルダーを作ったら便利だし、カッコいいのではないかと 思いつき、作ったらやっぱりカッコよかったという話。

今回のホルダーはサポートなしで印刷。 穴は若干の対策を施し問題なし。 PLAだとサポートの取り外しに苦労していたので、 サポート無しでプリントできるのはありがたい。 作り直しは1回。隙間の大きさを見誤った。 拘束が(たぶん)適切に入っているので 寸法の修正だけで修正できた。

スチール製のケースに入った3Dプリンタ周りに取り付けるため、 ホルダーには皿穴付きネオジム磁石が取り付けてある。 マイコンを固定する Grove Wrapperにも 磁石が取り付けてある。

プログラムはds18B20で温度を計測できるところまで作ったところで、 未完成。プログラムの進みが遅い理由を挙げると

  • 何度も作ったことがあるプログラムなので、新味が無く、面倒
  • platformIOを初めて使った。いろいろ引っかかる。

Arduinoのプログラミング環境として platformIOの名前は前から聞いていたが 食わず嫌いで全く調べていなかった。 で、なんか VSCodeで使える。 pythonで書かれているとか聞いて 試してみたら、コンパイルはMakefile並に早い。 プログラムの書き込みもできるし、シリアル端末も使える。 そこまでは良いのだが、VScodeのc++環境(intelliSense?)の 設定がよくわからない。 ソースファイルを開けませんとかエラーが出る。

c_cpp_properties.jsonの設定が必要だということが判明し、 さらに PlatformIOのPROJECT TASKSのRebuild IntelliSense Indexで このファイルを設定してくれることがわかった。 いいかげん、ちゃんとプログラムを完成させ温度を計測しよう。

このホルダーを作った後に HSES-NODE-OLED + HSTS-ATD7410 x 4個の構成でも 温度計測できることに気がついた。 こちらの構成だとGrove Wrapperで全部固定できるので、 新たにホルダーを作る必要はなかった。



チタン・ピンセット購入

居酒屋ガレージ日記の くっついたらイヤっ! 着磁した安物ピンセットを読んで、 自分のピンセットの磁化のことを思い出す。 主に使っているのは エンジニアの 鉄腕ピンセットことPT-17。 ステンレス製で非磁性に優れているそうだが、 チタン製なら完全非磁性なのだそうだ。

チップ部品ハンダ付けの際、 ピンセットにくっつくと 効率が悪いし、すごくイライラする。 くっつく原因は2つで、磁化とフラックス。 消磁器にかけ、フラックス洗浄剤で洗うと 付かないなるが、わりとすぐに再び付き始める。

磁化の問題だけでも無くなれば、結構楽になるかもしれない と考えて エンジニアのPTN-02を アマゾンで購入。2,690円。 他のピンセットと見分けやすいよう、 先細タイプを選択。 目に優しいと書いてあったが本当だろうか。

本当に使いやすいのか、耐久性は大丈夫か?などの話は 使用経験を積んだ後、書いてみたい。



ジャンパ・ワイヤ・ホルダ

ジャンパ・ワイヤは基板等の実験時の結線に便利なので よく使う。 Thingiverseに Dupont Cable Organizer Customizable というジャンパ・ワイヤを整理・保管する 容器のデータがあり、 面白そうなのでプリントアウトしていた。 ジャンパ・ワイヤを使う際、色を選ぶことが多いので 整理してあると便利そうだ。

そのままでは 手持ちのジャンパワイヤにサイズが合わなかったので、 サイズを調整し色々プリントしていたのだが、 そのものを置く適当な場所がなく、 納まりが悪いので 使わずじまいになっていた。

先週、3Dプリンタを移動した際に 小型のパーツケース(HOZAN B-103)を 机の横に移動したので、こいつに入らないかと 試すと、サイズ感が丁度いい。

パーツケースの仕切りをいれるスリットで 間隔調整ができるように設計をし直し、 さらにジャンパワイヤの種類・色を明示できる ラベルを貼るパネルを追加したり、 して完成。 パーツケースのスリットに微妙なテーパーがついていることに 気が付かず試作回数が増えた。

手持ちのジャンパ・ワイヤを入れてみる。 長さが揃っていないといけないので、 ジャンパ・ワイヤを選ぶ。 今回は、 スイッチ・サイエンスで売ってあるQIコネクタが付いた 長さ155mmの奴に合わせている。 各スロットに4本挿入可能。 パーツケースの高さには余裕があるので、設計しなおせば 倍ぐらいまでは増やせそう。

データは Thingiverseで公開



実体顕微鏡用LEDライトホルダー

ハンダ付け用に実体顕微鏡を持っている。 HOZANのL-50。 買ったのは2002年頃だから17年ぐらい前。 安くは無かった(数万?)が、 ハンダ付けのたびに使っているので 元はとっくに取れた。

普通に使うと、視野が暗いので、 照明が欲しい。 昔作ったことがあるのだが、 今は LEDクリップライトを 適当に配置して照らしている。 毎度毎度セットするのも 面倒なので、3Dプリンタで 専用照明を作る。

電源を繋ぐは面倒。 電池式にしたいが、何本も 使いたくない。1本からの昇圧タイプにしたい。 秋月の1.5V電池☆白色LED投光キット を使うと楽そう。購入し組み立て。 現物の顕微鏡にあてて、配置を検討すると 鏡胴の奥にぶら下げると良さそうに見える。 そのためのフックを3Dプリンタで作成する。

出来上がったものを組み立て、 組み合わせてみると、計測抜けで 干渉する部分もあるが、取り付けは可能。 完成ということにする。 1灯式だし、これで良いかわからないが、 しばらく使ってみて、具合が悪かったら、 また作り直すとしよう。



自動釣り機用マウスのケースを製作

自動釣り機用マウス、右ボタン押しっ放しマウスが 問題なく使えることがわかったので、3Dプリンタで ケースを製作する。

基板各所の寸法を計測し、 鍋CADで図面に落とす。 鍋CAD上で基板を覆うような形で、 ケースの形状、寸法を決め、 DXFファイルでFusion360に移す。 Fusion360で形状の追加、調整を行いデータ完成。

1回目のプリント中、フィラメントを使い切る。 他にも間違いがわかったので、赤いABSのフィラメントに 切り替えて印刷。 フタのサポートが付いた側の面が 汚いので、フタだけサポートが内側になるよう 印刷し直し、M2のナットをハンダごてで埋め込んで完成。

形が変なのは、モジュールをピンヘッダで取り付けたたのと スイッチ・LEDの配置をちゃんと考えていなかったせい。 全体を小さく作り直したい気持ちもある。

ダイソーの直径13mmのネオジム磁石を埋め込んだので、 邪魔にならない位置に常時置いておける。予想以上に 便利だ。

Adafruitのケースの作り方の動画とか見て 今は普通に3Dプリンタでケースを作る時代なのだと 実感する。

急に基板の3Dデータを出力できる基板CADに 魅力を感じ始める。 KiCAD ? DesignSpark PCB? 使い慣れたEAGLEから移るのツライのよねぇ。



マインクラフト自動釣り機用マウス製作

要は右ボタンを押しっぱなしに出来るUSB マウスを 作成した。 Arduino Leonard互換モジュール ProMicro(なんと560円)を 使用したので、とても簡単にできた。

詳しくは Qiitaの記事を書いたのでそちらを見てください。

モジュールをピンヘッダー/ピンソケット経由で ユニバーサル基板に固定したので、 基板の背が高くなってしまった。 丸ピンIC連結ソケット使えば良かったと反省。



HDDのモータでディスク・グラインダー製作

AdaruitのBlog HDDのモータで ディスク・グラインダーを作るという 記事というか動画がある。 同様の試みがニコ動に昔あったが、 そちらではHDDの基板に通電してモータを 回していた。

今回の奴では市販品のモータドライバを使用し、 回転数の調整も可能だ。 HDDのモータドライバなんて売っているのか、と 衝撃をうけ、 Thingiverseのページ にあるリンクを辿ると、 AliExpress で$2.2ぐらいから売っている。 すぐに使う予定は無いが、とりあえず注文した。

念の為、調べたら、すでに アマゾンでも売っていた。 759円ぐらいから。



XHコネクタ抜き

JSTのXHコネクタは2.5mmピッチで よく使われるコネクタだが、好きではない。 理由は嵌合が固くて外しづらいから。 昔、製品に使って、テストのために抜き差しするだけで 苦労した記憶がある。

今回、業務でテストのためXHコネクタを頻繁に 抜き差しする必要が発生。4ピンなので、 あまり固くはないが、それでも、ついつい ケーブル部を掴んで外しがちで、ケーブルが 抜けそうだ。

ヤバイので3Dプリンタで XHコネクタ抜きを作成することにした。 JSTのサイトからXHコネクタの3Dデータを ダウンロード。 Fusion360で読み込み、それに合わせて 形状データを作成、プリントアウトすると 一発で使えるものができた。

はめ込んで、軽くひねるだけで外せる。ケーブルには一切負担がかからない。 いろんなピン数に対応できる 汎用品を作るのは難しいが、 これなら、必要になった都度、 プリントして使っても良さそうだ。



ステッピング・モータいじり

このところステッピング・モータをいじっている。 ドライバー作ったり、動かしてみたり。 3Dプリンタでメカ物を作ったときの 動力源として使用したい。

ステッピング・モータ自体は、 秋月で売っている コパルのギア付きモータが 良さそうなのだが、ドライバが悩ましい。 以前作った Grbl基板もあるのだが、 動作を試すのにGcodeを書くというのも荷が重い。

新たに作ろうかと調べ始めると、 A4988を使った中華製ドライバーモジュールが 非常に安価に入手できることを知る。 アマゾンでも 5個で930円。 8~35Vで1相あたり最大2Aまで流せる。 3Dプリンタとかでも使われているようだ。 AliExpressだと 1個 $0.65。 オリジナルは PololuのA4988 Stepping Motor Driver Carrierのようだ。 スイッチサイエンスで 1,393円。 こんなものが安価に入手できるなんて良い時代だ。

アマゾンから購入し、 USBIOを使ってPC上のPythonプログラムで試してみたり していたのだが、USB経由なので2mS単位でしか 信号を変化させられないためか、 動作がぎこちない気がする。 プログラムが間違っていたのかもしれない。

その後、PIC32MX220でコントローラを製作し、 ステッピングモータを なんとか期待通りに動かすことができた。 しかし、PIC32MX220だと端子が足りない。 ステッピングモータ3個ぐらいは接続したいし、 リミットスイッチ等も接続したい。 ということで、 stm32f205あたりを使って基板を起こそうかと検討中。 3Dプリンタまで、なかなかたどり着きそうにない。

AliExpressでステッピングモータを物色すると、 リードスクリュー付きの小型のものが安価に売っている。 2個で $0.62 モータとリードスクリューだけのものだと安く、 スライダー付きのものだと結構高くなる。 3Dプリンタで移動ステージ作れたら面白そう、 1が月も待ちたくないのでアマゾンで購入。 2個で489円。 スライダーを作ってみたい。

ということで、 3Dプリンタを使いたいがために ステッピングモータで いろいろやっている。 3Dプリンタで、実際に使うフック等の 生活ネタを作成するのも 実利もあるし楽しいのだが、 どうしてもネタが限られる。 面白いメカモノを作るために 動力源を確保しようとしているわけだ。



NYA-01のケース

ふと思い立って 簡易型電流プローブNYA-01購入。 006P積層電池との一体型でカッコいいが 保管に難がある。 あと、電源スイッチのOn/Offが分かりづらい。

ということで、3Dプリンタでケースを製作した。


設計時考慮したのは、以下の3点。

  • 保管時の基板・端子保護のため、フタが必要。
  • 測定時はフタは外せる。
  • スイッチと端子の説明をつけたいので、 基板周りにスペースが欲しい。

試行錯誤の結果、こんな形に出来上がった。

写真

データは Thingiverseで公開中。 fusion360のデータも付けてます。

実用に耐えるものができたと思う。 で、実際に使ったかというと、 まだ使っていない。

ケース作りたいから買ったのではないかという疑惑が残る。



オシロのキャリングケース

RIGOLの1000Zシリーズの商品ページを眺めていて、 アクセサリーにキャリングケースがあることを発見。 BAG-DS1000、 13,000円。 プローブ等付属品および本体の保管に悩んでいた 私には丁度いい。

AliExpressで調べると $75 + 送料$11.77。 若干、型番が違うような気もするが、気にせず注文。

届いたので、プローブ、その他の付属品を入れてみると、 ちゃんと収まった。 よかった、よかった。



RIGOL MSO1074Z購入

AliExpress で RIGOL MOSO1074Zを購入、 本日、届いた。

ものは、 帯域70MHz, 4ch + 16chのロジアナ。 送料込みで AliExpressの一番安いところに 注文したので、若干不安だったが、 ちゃんと届きたし、動作もした。 送料無料の $699。今日のレートだと 76,300円ぐらい。

今まで使っていたのは、 Agilent 54641D, 帯域350MHzのアナログ2ch+ ロジアナ16chのMSO。

2002年に、100万円ぐらいするのを 6年リースで導入。 6年経ったら、リース料が 2万円/年ぐらいに 下がったが、それを10年ぐらい払ってしまった。 ものは良いのだが、今後も2万円/年を払い続けるのは、 どうよ、と思い始め、リース会社に買い取ったら幾らか 聞いたら、2年分といわれたので、返却し、 新たに購入することにした。

帯域も 350MHzまではいらないが、 ロジアナ機能は欲しい、ということで いろいろ検討後、 RIGOLがよさそうだという ことになった。

奥行きが薄かったり、USBメモリで画面コピーを 取れたりするのが嬉しい。 AligientはCRTで奥行きが厚いし、 画面コピーは3.5インチフロッピー渡し!! あと、今度は、4chあるので、 ロジアナの登場シーンは減りそうな気がする。

右に、内容物の写真を示す。 マニュアルは中国語と英語。 電源ケーブルは、中国用?

プローブその他の付属品をいれるための、 ポーチを買わなくては行けない。 Aligientは、ポーチが付属し、 オシロに背負う形になってたのよね、 そこは良かった。

最後に、USBメモリで取った、画面コピーを貼る。



衝動買い! ADALM2000

twitterを見ていて、秋月電子から ADALM2000を購入。 何ができるのか、まだ理解していない。 GWにでも、試してみよう。


ザイコストア

アルプスのタクトスイッチが欲しくて 電即納にアクセスし ザイコストアに移管したことを知る。

ザイコストアという部品屋は、 今回初めて知ったが、 なんか digikey/Mouser風の画面。

部品の入手先が増えるのは良いことだ。 頑張ってほしい。

で、タクトスイッチは RS に注文。 RSは、以前よりは使いやすくなったし、 送料が無料なのが良い。 最近、よく使っている。



Raspberry Pi用OLED ライブラリを作った

最終的に作ったライブラリは こちら

ラズパイ・ファン基板で OLEDを取り付け易くしたのだけれど、 i2c接続なので表示速度はどうなのだろうというのが気になっていた。

というのは、i2cは転送速度が速くない。 ラズパイのデフォルトでは100kbps。 OLEDは 128x64 dot なので、128x64 = 8kbit。 これを100kbpsで転送すると、転送時間は 8kbit ÷ 100kbps = 0.08sec 連続表示させると 毎秒 1 ÷ 0.08 = 12.5 フレーム表示できることになる。 スムーズな動画表示には少し遅い。転送以外の処理の時間も必要。

実際のところはどうなのだろうと測ってみることにした。

テストプログラム

使用したライブラリは Adafruit_Python_SSD1306。 グラフィック・ライブラリ Pillowのimageのデータを、そのまま表示できる 使い易いライブラリだ。 以下のプログラムを動かしてみた。

import Adafruit_SSD1306,time
from PIL import Image,ImageDraw,ImageFont
disp = Adafruit_SSD1306.SSD1306_128_64(rst=None,i2c_address=0x3C)
disp.begin()
image = Image.new('1',(disp.width,disp.height))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype(
    font='/usr/share/fonts/truetype/freefont/FreeMono.ttf',
    size=50)
t0 = time.time()
draw.text((0, 0), 'Test', font=font, fill=1)
t1 = time.time()
disp.image(image)
t2 = time.time()
disp.display()
t3 = time.time()
print('draw text : %f' % (t1-t0))
print("disp image: %f" % (t2-t1))
print("display   : %f" % (t3-t2))

実行結果は次のようになった。

pi@raspberrypi$ python speed_test.py
draw text : 0.001905
disp image: 0.033468
display   : 0.116709
pi@raspberrypi$

データ転送に 0.116秒かかっているが、計算の 0.08秒とは さほど違わない。次に /boot/config.txtに以下の行を追加後 rebootし、 i2cを400kbpsにして試してみる。

dtparam=i2c_baudrate=400000

実行結果

pi@raspberrypi$ python speed_test.py
draw text : 0.002004
disp image: 0.033668
display   : 0.036361
pi@raspberrypi$

データ転送は期待通り約4倍高速化されたが、 disp imageの 0.033秒が大きい。 これはPillowのImageのデータをOLEDのバッファの フォーマットに変換する処理で、ソースを見ると Pythonで1bitづつ処理している。 この処理に時間が掛るとデータ転送を 早くしても、表示はあまり速くならない。

ライブラリ作成

ということで、 ラズパイ i2c接続OLED用に Pythonのライブラリを作ってしまった。 githubで公開している。

i2cの操作は直接 /dev/i2c-1とかをオープンして行っている。 ここの資料を見ながらプログラムしたら、 特に問題もなく出来た。

テストプログラムで確認

新しいテストプログラムで処理時間を調る。 テストプログラムを新しいライブラリ用に若干修正した。

import time
from PIL import Image,ImageDraw,ImageFont
from RaspiOled import oled
oled.begin()
image = Image.new('1',oled.size)
draw = ImageDraw.Draw(image)
font = ImageFont.truetype(
    font='/usr/share/fonts/truetype/freefont/FreeMono.ttf',
    size=50)
t0 = time.time()
draw.text((0, 0), 'Test', font=font, fill=1)
t1 = time.time()
oled.image(image)
t2 = time.time()
oled.vsync()
t3 = time.time()
print('draw text : %f' % (t1-t0))
print("disp image: %f" % (t2-t1))
print("sync      : %f" % (t3-t2))

実行結果は次のようになった。 ちなみにi2sの速度は400kbps

pi@raspberrypi$ python3 speed_test2.py
draw text : 0.001897
disp image: 0.000538
sync      : 0.023852
pi@raspberrypi$

OLEDバッファへの書き込み(disp image)は0.0005秒になり、 データ転送も 0.023秒と高速化された。

で、やっぱり Bad Apple

ここまでやると、当然やるのはBad Apple。 Bad Appleの動画をffmpegでフレームごとに bmpのファイルに変換し、 画像表示プログラム( image.py)で 再生している。今回は音もwavファイルに変換したものを ラズパイのaplayコマンドで同時に再生している。 ちなみに 画像表示プログラムとaplayを同時に走らせると、 画像が遅れるので、sleepコマンドで1.6秒後にaplayを起動している。

RssDisp

動画 BadAppleを再生できるのは良いのだが、まだなんか不満。 Oledでグリグリヌメヌメ表示できることを示したい。 HSES-NODE-OLEDで動かした RssDispを動かしたい。

で、実装したのだが、予想外に手間がかかった。 文字のスクロール表示は、当初Pillow側でやろうかと思って いたのだが、あまり効率よくできそうな気がせず、 ライブラリに表示イメージをずらす機能を追加。 更にテキストをスクロール表示させるクラスも ライブラリに追加。 これでやっと RSSの表示プログラム rssDisp.pyが完成した。

HSES-NODE-OLED版とほぼ同じ動作が実現できた。 こちらの方が https サイトにも対応しているので、 表示できるRSSサイトが多い。 ESP8266/Arduinoでも httpsサイトへのアクセスはできるのだが、fingerprintを 入力する必要があり、面倒なので使っていない。

でもまぁ、HSES-NODE-OLEDの方が表示しっぱなしでも 惜しくないので良いかもしれない。 HSES-NODE-OLEDは スイッチサイエンスで発売中



M5STiCK購入するも...

twitterでM5STickの存在を知り、 AliExpressに注文していたところ 昨日届いた。

いつ触れるかなとか思っていると、 TELECマークが無いという噂を聞く。 ケースをあけ、確認すると 確かに ESP-WROOM-32にTELECマークが無い。

TELECマークが無いESP-WROOM-32が存在するとは 知らなかった。ガビーン。



ESP32 revision 1で書き込みエラー

久しぶりに作ったESP32のボードに arduinoでプログラムを書き込もうとしたら 失敗。 esptoolでエラーになっている。

前に書き込めたボードで試すと書き込める。 設定のミスではなさそう。 ボードの設計ミスか!?と焦るが、 ログをよく見ると、flashのサイズの取得で 失敗しているし、ESP32がリビジョン1。 書き込めたボードはリビジョン0。

arduino-esp32のバージョンを確認すると 結構変わっている。 esptoolのバージョンも 2.1から2.5に。

arduino-esp32のバージョンを上げたら 無事に書き込めた。
めでたしめでたし。



ラズベリーパイ ファン基板発売

予想通り資料作成に手間取り遅くなったが、 やっと ラスベリーパイ・ファン基板をやっと発売することができた。

昔、Raspberry Pi2で某装置の実験中、 動作させたまま放置したら、 異常な高熱になりシステム・ダウン。 再起動で復活したものの、熱ストレスで ネットワーク周りのはんだ付けが外れでもしたようで、 ネットワーク接続が不安定になり、結局 Raspberry Pi2は廃棄した。

このことがトラウマとなり、Raspberry Piには ファン必須と思っているのだがどうだろう。 最近のやつだと、高温になるとCPUクロックを下げる らしいけど、それで済むのかな?

わたしが壊した時は、ネットワークも動かしぱなしの プログラムで、ネット周りの発熱も凄かったのだけど 対応できるのかな?

それもこれも、このファン基板でファンを付けてしまえば 問題なし。 ファンのOn/Off回路もつけれる。 これをつけるとシャットダウン後 ファンが止まるのが気持ちいい。

あとRTCやOLEDも付く。 資料だけでも見てやってください。

ファンはPWMで、ある程度 強弱を調整できる。 CPUの温度もプログラムで取得できるわけだから、 いずれ放熱効果の実験をしたい。

あとOLEDは、とりあえず、Adafruitのpythonライブラリ で試しただけだが、スクロールのデモとかみると 表示が遅い。I2Cだから仕方がないのかもしれないが、 高速化ができないか、試してみたい。



aitendoのDCジャック

aitendoで売っている DCジャック。 説明には基板用とあり、 データシートにもPCB layoutが記述されている。

しかし、これはスゴク古いタイプのDCジャックの形状で、 パネル取り付け用のように思えるのだが違うのだろうか。

昔のDCジャックは、この形状で穴加工に苦労した記憶がある。 秋月で売っているような 2.1mm標準DCジャック パネル取付用が 出でて苦労する必要はなくなった。

それに基板用というには、端子の形状がおかしいし、 2.4mm径の穴の用途が説明できない。

中国のメーカーが形で基板用と勘違いし、 製造販売しているのだろうか。

でもまぁ、基板で使えないわけではないし、 ちょうど基板に垂直に刺せるDCジャックが 欲しかったので購入。



RasPi FAN基板

Elecrowでプリント基板を作成。 先週の月曜日注文して、昨日の火曜日届いた。 1週間+1日掛かったことになる。

配送はOCSだが、台風で関空が冠水したせい影響から まだ復旧していないようだ。 前回は沖縄で通関→関空で国内配送業者だったが、 今回は東京で通関+国内配送業者への引き渡しだったようだ。 1,2日程度余計に時間が掛かっている感じ。

作った基板は Raspberry-Piに25mm角のファンを取り付ける ためのボード。 今は FAN付きの安価なアクリルケースもあるが、 ケースがジャマになる場合もある。

空いているスペースに、 便利かもしれない回路をいろいろ載せてみた。

  • シリアルコンソール接続用コネクタ
  • RTC(リアルタイムクロック)
  • I2C接続OLED
  • 押しボタンSW×4
  • FAN ON/OFF回路
  • I2C用Groveコネクタ

使わなければ実装しなければ良いのだ。 若干のフリー配線領域もあるので 2.54mmピッチのコネクタであれば 取り付け可能かもしれない。

今後、動作の確認、資料の準備などの後、 ハンブルソフト WebShopにて 基板のみで販売する予定。

乞うご期待。



VS Codeでstm32のプログラミング

windows上のemacsでIMEを上手くコントロールできないため、 VisualStudio Code(以下VS Codeと記す)の環境整備を頑張った所、 かなり使えるようになってきた。 これで移行できるかもしれない。

Windows上の上のemacsといえば、 昔はmeadowとか使って不満は無かったのだが、 更新されなくなり、 gnupack の emacs だとIMEパッチが当たっていて 良いのだが、 makeコマンドが無い? 導入方法がわからないため、 導入が楽なcygwinのemasを使用し、 日本語はだましだまし使っていた。

今回、stm32のプログラムを開発するに当たって、 日本語のメモをたくさん書いていきたいと考えたため emacsに我慢できなくなり、vscodeの 環境構築にトライしてみた。 electronのプログラムで VS Codeに慣れてきたというのもある。

makeの実行

まず、vscodeからmakeコマンドの起動。 タスクの構成で、 tasks.jsonファイルを 以下のように設定することで何とかなった。

    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "make",
            "type": "shell",
            "command": "/c/MinGW/msys/1.0/bin/make.exe write ",
            "options": {
                "cwd": "${workspaceFolder}/src"
            },
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "new",
                "showReuseMessage": true
            },
            "problemMatcher": {
                "owner": "gcc",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}/src"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(.*):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "endLine": 2,
                    "endColumn": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}

problemMatcherも定義しているので、 コンパイル時のエラーも「問題」パネルを 開けば、クリック一発で問題箇所を開くことができる。

emacsのnext-errorコマンドみたいに、 1コマンドで「問題」パネルを開き、最初の問題を選択してくれると 嬉しいのだが、そのようなコマンドを未だ発見できていない。

プログラムの自動フォーマット

keybinds.jsonで ctrl+I を押した時 editor.action.formatが呼び出され インデントの修正等、自動で行われるようにしているのだが、 Cのプログラムを編集しているときctrl+Iを押しても、 Cのフォーマッタが無いというようなエラーが表示されるだけで、 フォーマットされない。

そこで、 拡張機能 Microsoft C/C++ for VS Codeを導入。 無事、フォーマットされるようになった。

includePathの設定

しかし、使っていると includePathの設定がされていない、 というメッセージが出るようになる。 面倒で無視していたのだが、 C/C++拡張機能のお蔭で、高度な機能(intelliSenseとか 定義に移動とか)使えるようなので、 真面目に設定してみた所、 設定ファイルc_cpp_properties.jsonは 次のようになった。

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "C:\\cygwin64\\usr\\include",
                "C:\\cygwin64\\usr\\include\\w32api",
                "C:\\gnu_tools_arm_embedded\\6-2017-q2-update\\arm-none-eabi\\include",
                "C:\\gnu_tools_arm_embedded\\6-2017-q2-update\\lib\\gcc\\arm-none-eabi\\6.3.1\\include",
                "${workspaceFolder}\\src"
            ],
            "defines": ["__CYGWIN__"],
            "intelliSenseMode": "clang-x64",
            "compilerPath": "/c/gnu_tools_arm_embedded/6-2017-q2-update/bin/arm-none-eabi-gcc.exe",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

これで、だいたい、使えるようになったのだが、まだ問題がある。 なんか includePathに定義していないPath C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\includeが含まれているようなのである。 stdint.hで「定義へ移動」とすると、このフォルダーのstdint.hが 表示されてしまう。これはどうしたら良いのだろうか。



AliExpressから普通の部品を購入

AliExpressから普通の部品を購入してしまう。 ものは 14pin(7x2)のL型ピンソケット このモジュールを使うときに欲しくなる。 国内のショップでも探したが見つからない。 分割ピンソケットのL型のやつとか出してくれないかな。

20個で$6.66、今のレートで738円として 1個37円ぐらい。 めちゃくちゃ安くはないが、送料無料がありがたい。 2週間で届いた。

他にも DC Jack USB miniB コネクタを買ったことがある。



電光掲示板プログラムを公開

HSES-LMC1の秋月電子での発売に合わせて、 電光掲示板プログラムを GitHubで公開した。

これは、HSES-LMC1を一般(?)の電光掲示板として動作 させるためのプログラム。

表示内容をSDカードに記憶し、読み出しながら表示する。 Web経由で表示内容の編集ができる。 (使用可能なブラウザは chrome のみ)

インストール方法・使い方は GitHubのWikiに書いたので 一度、見てみて欲しい。

表示できるメッセージは、

  • スタティック・テキスト: 文字列を内蔵Fontで描画、動きなし
  • スクロール・テキスト:文字列をスクロール表示
  • 画像(静止、スクロールとも)
  • 動画(未リリース)

などがあるが、使い方を説明しているのは、上2つまで。 画像はリリースしているが、説明が未だ。 動画は、完成しているが、変換プログラム(FFmpeg)の 説明を検討中で未リリース。

あと、メッセージをzipファイルでアップロード/ダウンロード する機能もある。

今はブラウザ・Javscriptの各種ライブラリが凄いので、 Webインターフェースをつけると、高機能なUIを 簡単に作れてしまう。



HSES-LMC1 秋月電子で販売開始

WiFi LEDコントローラ HSES-LMC1の販売が 秋月電子で開始された。 で、それは良いのだが、秋月電子では 32x16 RGB LEDマトリックス モジュールの販売が終了している。64x32のモジュールも扱う予定 らしいが、何か手間取っているようだ。

64x32のLEDモジュールは、最近、アマゾンで3,500円ぐらいで 売っている人がいる。 Lパラで買えば, P4が8,320円 P3が9,200円。 AliExpressに行けば$20未満で買えるのだが、 HSES-LMC1で動作保証しているのは、 弊社のものだけ。 アマゾンで 6,480円

AliExpressや他のものも、恐らく動くとは思うが、 動作保証はできない。理由は、試せないし、 種類が多いし、なんかすぐ変わるから。

うちで仕入れたLEDモジュールも、信号配置が違っていた。 RGBがGBRにずれている感じ。驚いたが、他の人が開発した ソフトを調べたら、そのような違いに対応できる機能が 入っていたので、よくあることなのだろう。 うちでもソフトで対応した。

あと、HSES-LMC1は、信号レベルが3.3V。 私は、これで動作しないLEDモジュールに 未だ出会ったことはないが、 他の人のLEDモジュールの記事を見ると、 5Vでないと動かないモジュールもある、と書いてあるので そうなのかもしれない。



Nintendo Switch Proコントローラ修理 2

購入してあった 交換用部品でSwitch Proコントローラを修理してみた。

動画 任天堂Switch プロコントローラーのスティック修理方法 - YouTube を見つつ作業をするが、 動画では 低融点ハンダ を使ってスティックの交換を行っている。

低融点半田の在庫、 サンハヤト表面実装部品取外しキットの在庫が無いし、 有っても高価なので、 はんだシュッ太郎で試してみる。

ひととおり半田を吸い取ってみると、 スティックがぐらつく。 半田が残っているピンは2箇所のようだ。 そのピンを温めつつスティックを引っ張り 取り外しに成功。修理用部品に取り替える。

もとどおりに組み立て、修理は完了した。


修理したのが4月半ばで、 その後3週間ほど使用しているが、 問題なく使用できている。

部品を交換せず、分解&ブロー した方と交互に使用しているのだが、 こちらも、まだ、問題なく使用できている。

交換しない方も、意外と長く使用できている。 どれくらいまでしようできるか、 今後も試していく予定。



中国製USBシリアルICに手を出す

中国製 USBシリアルICに手を出した。 理由は、もちろん価格。 FTDI製だと1個 2~400円ぐらいするが、 中国製 CH340とかだと1桁安い。

CH340を実際に使ってみると意外なことがいろいろあったので報告する。

結構オリジナル。 FTDIのコンパチ品かと思っていたのだが、 実際に調べてみるとFTDIとは全然ちがう。 入出力は5V一択だし、 送受信でLEDを光らせる機能もない。なんか、自分たちがUSBシリアルアダプタを作るのに 必要なものを作ったように見える。

R232という入力ピンがあり、 適当に処理していたら、 なんとTX/RXの信号レベルを反転させるピンではまった。 どうも RS232用の簡易レベルコンバータ (トランジスタ1個でつくるようなやつ) を使用するためにあるらしい。

データシートが中国語の奴しかみつからない。 メーカーのホームページで探しても、中国語のものばかり。 CH340Cを使用したのだが、 aitendoのCH340Tのページにある 英文データシートを参考にした。

ドライバーは、Windows10には含まれているようで、 接続するだけで使用できた。

中国製ということで抵抗はあったが、安いは正義。 今後、どんどん使っていくことになると思う。



Elecrow 速い!

Elecrow速し。 先週の月曜に注文した基板が土曜日に届いた。 5日で届いたことになる。

P-banでも5営業日だから、それよりも速い。 発送に安くて速い OCS が使えることが大きいと思う。 FusionPCBとかでOCSが使えるようにならないのが不思議だ。



Raspberry Piで動画をLEDに音付きで再生

hzeller/rpi-rgb-led-matrix付属の 動画再生プログラム video-viewerを改造し、 動画ファイルを音つきで再生できるようになった。 前にも書いたが フレームの遅れが蓄積されない ように改造した。 変更点は、pull-requestを投げたいが、 まだ、ちょっと汚いのが悩みどころ。

音の再生は別プログラム(aplay)で 行っている。これも将来的には組込みたい。

いつもの MMD Bad Apple!! Now in 3D with more Color を再生したのが下の動画。

プログラムの改造は簡単だったが、 動作の確認のためRaspberry-Piから 音を出すのに手間取った。

まず hzeller/rpi-rgb-led-matrixを動かすには /boot/config.txtで dtparam=audio=off しなければいけないので、 Raspberry Piのaudio出力は使用できなし、 HDMIへの音声出力も使えなくなる。

USB-speakerやbluetoothへの出力は可能なので、 まず手持ちのbluetoothスピーカで試すと、 音は出たが、厳しい条件の動画(60fpsのやつとか)を 再生させると音が出なくなり、復旧できなくて あきらめた。

USBスピーカを購入し試すと、音は出るが 最大音量で、音量調節が効かない。スピーカ側に ボリュームやミュートのスイッチはあるのだが、 どうもソフトウェアでコントロールするタイプのようで、 Windowsでは機能したがRaspberry Piでは動かない。 amixerコマンドで音量調節を試みるが、 あまり音量が変化しなかったり、無音になったりと 極端でうまく音量調節できない。 無音になる寸前の数値で、ある程度音量調整できたので、 そこで動画を撮影した。 アナログのボリュームつまみがついたUSBスピーカが欲しい。



ESP32開発ボードでEthernet実験

ESP32のEthernet (有線internet接続)には、 当初から期待していて、 AliExpressに売っている LAN8720 PHYモジュールを買ってみて試したが 上手く行かなかった。

原因は、ESP32のEthenetモジュールを使用するのに、 50MHzのPHYのクロックを GPIO0に入力する必要があること。 ご存知の通り GPIO0は、起動時にHighにしたり、 Lowにしたりすることで 通常起動モードと ファームウェア書換モードの切り替えに 使用する。 つまり起動時に50MHzのクロックを 止める機能が必要になる。 実際、Olimexの ESP32-GATEWAYボード の回路では、そのようになっている。

その時はLAN8720 PHYモジュールの使用を諦め、 ESP-GATEWAYボードで実験を行い、 lwIPが動くことなど確認していた。

今回、ESP32でEthernetを使えるボードを 自分で作ろうと思い、調べ直すと ESP32 arduinoに ETH_LAN8720_internal_clockとか言う サンプルプログラムがある。 GPIO17からPHY用の50MHzを出力できるらしい。 これならLAN8720 PHYモジュールを改造して実験できるかも しれないと試したら出来たので報告する。

まず、LAN8720モジュールのクロックを止める必要がある。 パターンカットでいけるかと思ったが、パターンが見えない。 回路図を見て、 R12,R14から追っていけばわかりそうだが、 部品名が書いてないのでどれがR12,14だかわからない。

あきらめて発振器を取り外すことにする。 はんだごて2本あれば行けそうだが、 何故か1本しか無い。 仕方が無いので SMD Rework Stationを引っ張り出して、取り外した。 Rework Stationは、半田ごての方はFX-888を購入したので 使わなくなったが、 Hot Airの方はよく使う。便利だ。

スケッチの例「ETH_LAN8720_internal_clock」を呼出し、 コンパイルする。何故か ETH_CLK_MODEの定義が ETH.hと重複し、コンパイルエラーとなるので、 setup()で呼び出している ETH.beginの引数で 直接ETH_CLOCK_GPIO17_OUTを指定。

その後、試行錯誤のあと、回路などを修正し、 無事 Ethernet経由でインターネットから情報を取得できた。 最終的な回路、というか LAN8720 PHYモジュールとESP32の 接続は次のようになった。

MDCとMDIOに接続しているIOは変更可能、他は変更不可。 IO25とIO26が使用されているのでDACが使えないのが残念。

LAN8720はAliExpresで買えば$2程度。 発振器を外すだけで ESP32のEthernetの実験ができるのは、 悪くないと思うのだが、どうだろう。



Raspberry Pi Zero WH 動作テスト

miniHDMI変換アダプタとUSB-microB OTGケーブル が届いたので、 Raspberry Pi Zero WHを動作させてみる。

Zeroは基板は極小だが、ケーブルを刺すと そうでもなくなる。 ケーブルを ケーブル・オーガナイザで固定してやると良い感じである。

Raspbianをダウンロード、 microSDカードに書込み 立ち上げたら、特に問題もなく起動。 キーボード、WiFiの設定を行い、 普通に使えるようになった。

その後、 hzeller/rpi-rgb-led-matrixをインストールし、 LEDマトリックスモジュールへの表示を試す。

表示はできるが、負荷が重い感じ。 動画の再生を行うと、はっきりと遅い。 やはり コア4個のRasberry Pi 3と比べると、 コア1個のZeroだと、余裕が無い感じだ。 表示も、多少、ちらつきが感じられる。



Raspberry Pi Zero WH届く

秋月電子に注文した Raspberry Pi Zero WH(ケース付き)が届いた。 始めて実物を目にし、小ささに驚く。 このサイズでLinuxが動き、この価格なのだから 面倒くさいとか言ってられないのかもしれない。

動かしてみようとして 初めて miniHDMI変換アダプタとUSB-microB OTGケーブル が必要なことに気がつく。 スイッチサイエンスの Raspberry Pi Zero W ケースキット を書い直そうかとも思ったが、 余分な基板を持っていても碌なことがないので、 アマゾンに miniHDMI変換アダプタとUSB-microB OTGケーブル を注文した。合わせて1,100円ぐらい。 スイッチサイエンスのを買っておくんだった。

ケース付きを買った理由は、ケース無しが売っていない、 在庫が無いから。抱き合わせ販売か?とも思うが、 在庫があるだけありがたいのかも。

ケースは思ったよりかっこよいが、 実際に使う時は、ケーブル刺しまくりになるので、 固定能力は無いに等しい。 ケースというより基板カバーと読んだほうが 実態を表すように思う。



Raspberry Pi + LEDモジュール用基板 動作確認

hzeller/rpi-rgb-led-matrix を動かすための、 Raspberry Pi 用 LEDモジュール基板を組み立て、動作を確認した。 問題は特に発生せず、スムーズにLEDに表示できるようになった。

感想としては、よく出来ている。 Raspberry Pi 3 model Bで試した。 表示させているとCPU使用率80%とかになるのだが、 あまり重い感じはしない。表示もきれいだ。

各種フォーマット、各種サイズの動画を、そのまま 表示できるのも便利。 Raspberry-Piに慣れている人には お勧めだ。

以下、もうちょっと細かい所感などを書く。

プログラムの仕組は、まだ理解していない。 サウンド出力ハードウェアを使用しているそうで、 同時に音を出力することは出来ないらしい。

LEDとRaspberry Piの電源を完全に分離したのは良かった。 おなじ5Vの電源を2つ用意するのは面倒だが、 LED側電源が容量不足で電圧低下が起こっても、 RasPi側には影響ないのは安心だ。 動画では 64x64dot, 1/16スキャン、 LEDの消費電流は20mAなので、 全点灯時は 64 x 64 x 3 / 16 x 20 [mA] = 15.36[A]の電流が 流れる。これだとACアダプタでは間に合わない。配線も大変だ。

動画では2.5Aの実験用電源を使用しているが、電流超過で しばしば電圧が下がって、表示が赤っぽくなっているのがわかる。 電圧が下がると赤っぽくなるのは、赤色LEDのVfが2V程度で 青色、緑色の4V程度と比べると低いため、電圧が下がると 赤色のみ明るく光るため。

今回のプログラムは、思ったほど消費電流が多くない。 LEDをフルに光らせることができていないのかもしれない。

hzeller/rpi-rgb-led-matrix は、相当、良く出来ていると思うのだが 不満な点もある

オプションが面倒。 LEDの構成に関する長いオプションを毎回入力する 必要があるのが不満。 ドットファイルでオプションを指定できるように して欲しい。

video-viewerのフレームレートがデタラメ。 音が出力できないので、必要性を感じていない のだと思うが、動画再生のフレームレートの 処理が手抜きだ。プログラムを見たら、 各フレームの処理後に 1/fps秒のディレイを 入れているだけ。フレームの処理時間分だけ ずれていく。

Qiitaに書いた 同期処理 の 方法でやれば、簡単にフレームレートを 合わせることができるはずなので、試してみたい。

実際に使おうとすると、raspberry-piは面倒。 実験している分には面白いが、 機器に組み込んで実際に使おうとすると raspberry-piは面倒だと思ってしまう。 理由は fsprotectの組込みと ファイルシステム(SDcard)のバックアップが 面倒だから。

fsprotectというのは、SDcardのファイルシステムを ReadOnlyで運用し、それにRAM-Diskを被せ、 通常の読み書きできるファイルシステムに見せかける システム。 電源を落とせば、変更された内容は すべて消えるかわりに、いつ電源を落としても問題ない。 これ無しにRaspberry-Piを連続運転させると shutdownせずに電源を落としたときに SDCardの内容が壊れる可能性があるし、 そうでなくても (swap等で)書き込み過ぎでSDCardが壊れると言われている。

fsprotect自体はapt-getで導入可能だが、 kernelにaufsを組み込む必要があり、 自分でソースをダウンロードし、パッチを当て カーネルを作り直さないといけない。 先人たちの情報がいろいろあるとはいえ、 なかなか面倒。 これをdistributionで面倒見てほしいと 常々思っている。

あと、いろいろやっているうち、SDCardが壊れる可能性は 高いので、バックアップの必要がある。SDCardのイメージ毎 保存しておけば良いのだが、4Gとか8Gとかのファイルを 残すのに、効率の悪さを感じる。といっても、コマンド一発だし、 ちょっとした動画のファイル程度の大きさなので、 単に慣れの問題かもしれない。

次は、Raspberry-Pi Zeroでも動くか試してみたい。 プログラムの仕組も理解したい。 ESP32CompositeVideoの仕組も調べてないし、 宿題がたまる一方だ。



ESP32CompositeVideoを試す

HackadayのSoftware Defined Television on an ESP32という記事を読んだ。 ESP32のI2S+DA出力でvideo信号を出力するプログラムだ。 回路は簡単。GPIO25とGNDをピデオ入力のピンジャックに つなぐだけ。プログラムはArduinoのsketchで、 gitHubからダウンロード できる。

プログラムを書き込むと本当に表示された。 びっくりだ。 思ってたのより凝ったデモなのに関心する。

詳しい話は、まだ調べていない。 表示可能なドット数とか階調とか、あとでちゃんと調べたい。

ビデオ出力: PIC16のPongのプログラム以来、 マイコンでビデオ出力ができるようになったが、 今回の衝撃的な点は、付加回路が全く必要ないこと。 DAC出力だから可能なのはわかるが驚いた。

I2S+DMA: ESP32のI2S+DMAは、いろいろ応用が利いて、 なかなかのアイデアだと思う。 I2Sだけでなく、AD,DAでも使えるし、パラレルでも 使えてOV7670(カメラ)のデータを読んだり、 LCDにデータを出力したりもできる。 他のマイコンでも真似して欲しい。

ビデオ出力(2): でもあまり、ビデオ出力に魅力を感じない。 ビデオの出力装置(TV,モニタ)は結構大きいし、 すでに十分魅力的な機器(パソコン、TV,ゲーム機)が 接続されている。中途半端な性能なものをつなぐ気に なれない。低価格なマイコンには、小型で安価なLCDやOLEDが バランスが良いように思う。

USBホスト機能がESP32に必要ではないか? 私は凄く欲しい。 USBホストがあり、キーボードやマウスを接続できれば、 ESP32を昔のパソコンみたいに使える。 SPI経由でUSBホストICを繋ぐのは、ちょっとやだ。

デモ内容に興味: ESP32CompositeVideoは、デモプログラムで ポリゴンで構成された立体物(ビーナス像、骸骨、ドラゴン、ロゴ) を回転させながら表示させているのだが、 ESP32で、こんなことができるのだと感心。 勉強して、ESP32+LCDなどに表示させてみたい。



ESP32_bt_speaker 更新

ESP32をBluetoothスピーカーにするプログラム ESP32_bt_speakerを更新した。

作成後、esp-idfが、かなり更新されたので、 いろいろと問題があるだろうなとは思っていたのだが、 手を付けずにいたのだが、 githubにissueついたので、 対応することにした。

最新の esp-idf環境でESP32_bt_speakerをコンパイルしてみるとエラーが沢山発生。 ひとつづつ対応するのも大変なんで、元となったサンプルプログラム bluetooth/a2dp_sinkから再び作り直すつもりで、a2dp_sinkを コンパイルしてみると、I2Sと内蔵DACへの出力機能が 追加されていることが判明した。

これが動くのであれば私のESP32_bt_speakerは、お役御免。 今後、私が面倒を見なくても良くなる、と思って プログラムをESP32開発ボードに書き込むも 音が出る様子は無い。

わたしのプログラムと見比べながら、修正と試行を繰り返し、 音が出るようになった。I2S出力側は、実験できないので わからないが、内蔵DAC出力側は、テストされていないような 感じがする。

修正は pull requestを出して esp-idf側に反映してもらいたい ところだが、やり方がよくわからないので、 とりあえず ESP32_bt_speaker側を更新しておいた。

変更点を以下に示すので、これを見て a2dp_sinkの ソースを変更してもらっても良いと思う。

diff --git a/examples/bluetooth/a2dp_sink/main/bt_app_av.c b/examples/bluetooth/a2dp_sink/main/bt_app_av.c
index 289c1f16..4958e3d9 100644
--- a/examples/bluetooth/a2dp_sink/main/bt_app_av.c
+++ b/examples/bluetooth/a2dp_sink/main/bt_app_av.c
@@ -53,7 +53,27 @@ void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
 void bt_app_a2d_data_cb(const uint8_t *data, uint32_t len)
 {
-    i2s_write_bytes(0, (const char *)data, len, portMAX_DELAY);
+    TickType_t delay = 50 / portTICK_PERIOD_MS;
+    if(len % 8){
+      ESP_LOGE(BT_AV_TAG,"unexpected data len:%u",len);
+      return;
+    }
+
+    for(int i=0; i<len; i+= 4){
+      uint16_t d[2];
+
+      d[0] = data[i+0]|(data[i+1] << 8);
+      d[0] ^= (1 << 11);
+      d[0] <<= 4;
+      d[1] = data[i+2]|(data[i+3] << 8);
+      d[1] ^= (1 << 11);
+      d[1] <<= 4;
+
+      int n = i2s_push_sample(0, (const char *)d, delay);
+      if(n < 0)
+	ESP_LOGE(BT_AV_TAG, "i2s_write_bytes error:%d",n);
+    }
+
     if (++m_pkt_cnt % 100 == 0) {
         ESP_LOGI(BT_AV_TAG, "Audio packet count %u", m_pkt_cnt);
     }
diff --git a/examples/bluetooth/a2dp_sink/main/main.c b/examples/bluetooth/a2dp_sink/main/main.c
index a6093386..30ee28a2 100644
--- a/examples/bluetooth/a2dp_sink/main/main.c
+++ b/examples/bluetooth/a2dp_sink/main/main.c
@@ -54,14 +54,14 @@ void app_main()
     i2s_config_t i2s_config = {
 #ifdef CONFIG_A2DP_SINK_OUTPUT_INTERNAL_DAC
-        .mode = I2S_MODE_DAC_BUILT_IN,
+        .mode = I2S_MODE_DAC_BUILT_IN | I2S_MODE_MASTER | I2S_MODE_TX,
 #else
         .mode = I2S_MODE_MASTER | I2S_MODE_TX,                                  // Only TX
 #endif
         .sample_rate = 44100,
         .bits_per_sample = 16,
         .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,                           //2-channels
-        .communication_format = I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
+        .communication_format = I2S_COMM_FORMAT_I2S_MSB,
         .dma_buf_count = 6,
         .dma_buf_len = 60,                                                      //
         .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1                                //Interrupt level 1

このプログラムには、まだ問題が残されている。 1つは音量を上げた時、音割れする問題で、 もう一つは 通信を中断させた場合DMAバッファに 音データが残り、鳴り続けてしまう問題である。

音割れの方は、DACが8bit, Bluetooth上のデータも12bitなので、 ボリュームを上げていけば音割れするのは仕方ないような 気もするが、 iPhone単体や、他のbluetoothスピーカーで試すと ボリュームを上げても音割れしない。

データ操作のバグも疑い、いろいろ試すがわからない。 仕様なのではないかという気もするのだが、 どうなのだろう。

切断後、音が鳴る問題は、音の出力先を切り替えるなどすると、 発生させることができる。通信の切断の検出はできるので、 ここでDMAバッファをクリアする処理を書いてみたのだが うまくいかなかった。やりかたがまずかったのかもしれない。

Bluetoothについての知識が乏しいので、 ちゃんと対策しようとすると、 なかなか苦しい。



ケーブル・オーガナイザー購入

アマゾンのタイムセールのお勧めか何かのメールで、 ケーブル・オーガナイザーを見かけ、購入した。

これは、 昔、欲しいと思ったケーブル・ドロップの同等品。 遠からず、ダイソーで発売されるだろうと思っていたが、 結局、ダイソーで見たことはない。 ケーブルドロップは、1本固定できて約$10。 ケーブル・オーガナイザーは5本固定できて666円なので 安いといえば安い。


現物が届いて、両面テープで固定するタイプであることに気付いた。 あまり机に両面テープで固定したりしたくない。 しばらく考えて、手持ちのネオジム磁石を2個両面テープ貼り付け、 これで固定することにする。良い感じだ。

結局、これで何のケーブルを固定するかというと、 オシロスコープのプローブのケーブルを固定することになりそうだ。




Raspberry Pi + LEDモジュール用基板

中国のPCBメーカーが春節の休みに入る中、基板が作りたくなったので、まだ間に合いそうなfusionPCBに注文したら間に合った。昨日届いた。作ったのは、Raspberry-PiをLEDモジュールに接続するボード。

以前 Adafruit RGB Matrix HAT + RTC for Rasberry Piを試したことがある。 その時は、 RasPi側の負荷が重すぎて実用にならない結論だった。 先日 Raspberry PiとRGBマトリクスで電光掲示板作ってアニメ流したったという記事を読み、 元プロジェクトのサイト Controlling up to three chains of 32x32 or 16x32 RGB LED displays using Raspberry Pi GPIO を読むと結構良さそうに思える。 実際に試すために基板を作成した。

元プロジェクトの方でも、 アダプター基板を提供 しているが、私から見ると結構 不満な点がある。

そこで、LEDの電源用端子、RasPi用FAN、外部に接続される信号に 抵抗を追加するなどした基板を設計、発注した。 果たして、春節が終わるまでに、実験は行なわれるだろうか。



ESP32 + OV7670 がうまく動かない

以前 Jpegカメラをesp8266につないて動かしてみたりしたのだが、 Jpegカメラが AliExpressでも $15程と案外高く、魅力的な商品に なりそうもないのでボツとなった。

ふと思いついてVGAカメラ OV7670モジュールの価格を調べてみると安い。 AliExpressで$2.5。 8bitパラレル出力だが ESP32のI2Sにはcameraモードというのが あるので繋がりそうな気がする。

先人たちの足跡を検索してみると IDF環境でOV7725を接続した例や、 Arduino環境でOV7670を接続した例が見つかる。

とりあえずブレッドボードで後者を試してみる。

回路図は、こんな感じ (前述の記事の回路図です)。

LCDは接続しないので、プログラムを適当に修正しESP32に書込み試してみるが、ブラウザに画像が表示されない。 いろいろ試すとジャンパー・ケーブル(ブレッドボード上の配線)を 動かすと、表示されることがある。 ジャンパー・ケーブルがWiFiの通信を邪魔していると考え、ユニバーサル基板上でUEWケーブルを使って配線し直す。

プログラムを動かすと、多少は改善されたが、表示されないことが多い。Wiresharkで見ると、パケットが欠落している感じ。電源の容量不足を疑い、5Vのラインや3.3Vのラインを強化してみたところ、改善は見られるが、基板の位置、角度によって通信できたり出来なかったりする感じ。

i2sのプログラムとWiFiの通信が干渉している可能性はないか検討してみる。i2sを動かさなければ問題ない。 WiFiで通信する時だけOV7670に供給する20MHzのクロックを止めてみると、OV7670から読み出される画像は変。当然だろう。

Errataも調べるが、該当しそうな項目はない。

この辺で万策尽きた感じがする。 原因は何だろう? 電源容量、ノイズ的な問題? ESP32側の問題? わからない。

つながる時は、大変スムーズにブラウザに画像が表示されるので 諦めるもの惜しい。 中華PCBメーカの休みが明けたら、基板設計して注文してみようかな。