The Negligible Lab

Astray in the forest of electrical and electronic circuits. Adrift in the gap between time and frequency domains. 独立独歩を是とする。

Raspberry Piで地震計を作る ④ 十字配線基板・HAT化編

はじめに

晩秋から年末へと時が移ろいつつありますが,いかがお過ごしでしょうか? 今朝は筆者の住む街でも氷点下を記録しました。寒くなって参りましたね。今回も残念ながらぱわみのある記事ではありませんが,お付き合い下さい。

さて,前々々回*1,前々回,前回を通じて,Raspberry Piを用いたマイ地震計を作りました。これは,図1のようにブレッドボード上にモーションセンサMPU6050とOLEDディスプレイを置いたプロトタイプであったため,今回はこれを基板,すなわちRaspberry Piの“HAT”にします*2

f:id:s-inoue2010:20211119172634j:plain:w480
図1: ブレッドボードを使ったマイ地震計プロトタイプ

早速ですが,図2に完成イメージを示します。

f:id:s-inoue2010:20211129185914j:plain:w480
図2: 十字配線ユニバーサル基板を使ったマイ地震計HAT

モーションセンサMPU6050とOLEDディスプレイの各モジュールは後で取り外せるように,1列ピンソケットを介して実装しました。また,前回までのプロトタイプにはなかったタクトスイッチを2個追加しました。いずれ,このタクトスイッチで画面を切り替えて波形を表示するなど,工夫していきたいと思います。

なお,本ブログでは過去に,Raspberry Pi Zero WHのためのスマートリモコンHATを作りました。

negligible.hatenablog.com

このときにはRaspberry Pi Zero用のユニバーサル基板を使ったのですが,筆者のような不器用な人間が作業するので,ハンダ面の配線が極めて醜悪になってしまうという問題がありました。すずメッキ線ではなく部品の足を使おうという貧乏根性も影響しているかもしれません。かと言って,KiCADなどを使ってプリント基板を設計し,中国の基板メーカーに発注するにしても,1個しか作らないので勿体ないという気持ちがあります(同人ハードとしてBOOTHで販売すればいいのかもしれませんね)。そこで,今回は秋月電子通商で販売されている「十字配線ユニバーサル基板」を使ってみることにします。

akizukidenshi.com

目次

基板設計

十字配線ユニバーサル基板とは

図3に十字配線ユニバーサル基板での回路形成方法を示します。十字配線ユニバーサル基板には,普通のユニバーサル基板と同様に,2.54 mm間隔で格子状にランドが並んでいます。しかし,初期状態ではすべての隣り合うランドが銅箔で繋がっています(今回は片面のみこのように繋がっている基板を使いました)。例えば図3の水色とピンクのような2つの信号を引き回したい場合,銅箔の必要な部分のみを配線として残し,不要な部分をカッター等で断ち切ります。図3の黒い実線の部分をカッターで断ち切るわけです。本記事ではこの黒い実線を「カットパターン」または単に「パターン」と呼ぶことにします。

f:id:s-inoue2010:20211130154423p:plain
図3: 十字配線ユニバーサル基板での回路形成方法

これをうまく使えば,従来のユニバーサル基板における,すずメッキ線や部品の足をハンダで継ぎ足しながら配線を構成するというやり方を変えることができます。ハンダ付けは実装する部品の足だけになるはずです*3

カットパターンを引く

Raspberry PiのGPIOピン

Raspberry Piの40ピンのピンヘッダには5 V,3.3 V,GNDの各電源ピンと,GPIO0 ~ 27が引き出されています。マイ地震計で使用しているGPIOは表1の通りです。各信号はRaspberry Piの2列ピンヘッダの片側のみから取るようにしています。

表1: マイ地震計で使用しているRaspberry PiのGPIOピン

GPIO信号接続するデバイス
GPIO2/dev/i2c-1 SDAU1: MPU6050
GPIO3/dev/i2c-1 SCL
GPIO5/dev/i2c-11 SDAU2: OLEDディスプレイ
GPIO6/dev/i2c-11 SCL
GPIO9ディジタル入力・プルアップSW1: タクトスイッチ
GPIO10ディジタル入力・プルアップSW2: タクトスイッチ

前回の追記で述べたように,加速度のサンプリングの定周期性を維持するため,モーションセンサMPU6050とOLEDディスプレイを異なるI2Cバスに接続します。Raspberry Pi 3 Model A+のSoC (BCM2837)がもともと持っているI2CバスはGPIO2 (SDA),GPIO3 (SCL)であり,ここにMPU6050を接続します。一方,OLEDディスプレイはGPIO5 (SDA)とGPIO6 (SCL)に接続します(40ピンのピンヘッダにおいてGPIO2,3と同じ側から信号を引き出すためにGPIO5,6を選びました)。Linuxカーネルは,任意のGPIOピンをソフトウェア的にI2Cバスとして使用する機能を持っていますので,これを利用してGPIO5,6を新しいI2Cバスとしました。ただし,GPIO5,6をI2Cバス(/dev/i2c-11)として使用するためには,/boot/config.txtに下記の1行を追加する必要があります。

dtoverlay=i2c-gpio,i2c_gpio_sda=5,i2c_gpio_scl=6,i2c_gpio_delay_us=1

Raspberry Piのピンアサインについては,下記ウェブサイトが参考になると思います。

pinout.xyz

部品配置と配線を決める

使用するGPIOピンと各モジュールの間の配線がなるべくシンプルとなること, 2つのタクトスイッチを追加すること,信号や3.3 V電源として使用しないランドはベタGNDとすること,などを考慮しました。結果,図4のように設計しました。十字配線ユニバーサル基板の設計ツールが見つからなかったので,DynamicDrawを用いました。

f:id:s-inoue2010:20211130141717p:plain
図4: 十字配線ユニバーサル基板の設計

dynamicdraw.com

カットパターンを黒い実線で描いております。3.3 V電源(赤色)とGND(緑色)はなるべく広いパターンとし,I2CのSDA(青色)とSCK(水色)はまっすぐ引ける位置に各モジュールを配置しています。5 V(黄色)は使用しないので,他のランドから切り離します。2つのタクトスイッチにはGPIO9,10から配線を引き回します(タクトスイッチのためのGNDが島になってしまいました)。

基板製作

サインペンでの下書き

図4(当然ですがBottom View)に基づいて,実際に基板のパターンをカットしていきます。

f:id:s-inoue2010:20211130144126j:plain:w480
図5: サインペンでカットパターンを記入する

まず,図5のように,設計したカットパターンをサインペンで記入しておきます。原理上はこれを実施しなくてももちろんまったく問題ないのですが,無数のランドが広がるユニバーサル基板を人間が目にした際,何処をカットすべきなのか容易に誤ってしまいます。実際,サインペンでの書き込みの際にも何度か間違えたところに線を引いてしまいました。設計図と見比べながら,適宜修正しつつ,間違いないように書き込んでおきます。

Pカッターでカットパターンを切る

パターンを書き込み終わったら,図6のように実際にカットパターンを切っていきます。基板をセロハンテープでカッターマットに固定した状態で,OLFA社のPカッターを使いました*4。Pカッターは「切る」というよりも「溝を掘る」「削り取る」といった働きをするため,ユニバーサル基板上の不要な銅箔を含めた0.5 ~ 1mmほどの材料全体を削り取って絶縁を確保するという目的で,適していると考えます。ただし,この十字配線ユニバーサル基板のメーカーさんか販売者である秋月電子通商さんにて,推奨する加工方法を例示してくれると大変助かりますね。

f:id:s-inoue2010:20211130144318j:plain:w480
図6: カットパターンを切っていく

f:id:s-inoue2010:20211130150332j:plain:w480
図7: パターンをカットした基板

図7にパターンをカットした基板を示します。左下の矢印で示した箇所は,図4の設計図,図5のサインペンの記入とも異なり,Pカッターが滑ってしまったために長めにカットしてしまいました。そのため,本来はベタGNDとして繋がるべき箇所が分かれてしまいました。動作に支障はないのですが,失敗例として載せておきます。

不導通の確認

十字配線ユニバーサル基板では,カットしたパターンが本当に電気的にカットされているのか,確認が重要です。筆者はHIOKIのハンディテスタを所有していたはずですが,なぜか現在行方不明になっております。テスタがなければ自分で作ればいいじゃない!? そこで,先日購入したSeeeduino Xiaoとその拡張ボードを使って,導通チェッカを作りました*5

f:id:s-inoue2010:20211130155800j:plain:w480
図7: Seeeduino Xiaoを用いた導通チェッカ

拡張ボードにブザーが付いているので,視覚・聴覚から導通・不導通が分かります。これを用いて,カットパターンによって分けられた隣り合う区画が導通していないか確認しました。Pカッターでカットしたつもりでも,銅箔が細く伸びて繋がっていたりします。場合によってはゴリゴリと削って,すべての絶縁を確認しました。

こんな調子なので,信号回路には使えると思いますが,何かもう一工夫しないとAC 100 Vを扱うようなパワー回路にはちょっと怖くて使えないと思います。

部品の実装

ついに部品を実装します。と言っても,モーションセンサMPU6050もOLEDディスプレイもモジュールなので,基板にハンダ付けするのは1列ピンソケットになります。Raspberry Pi用のピンソケットには,連結ピンソケット(ラズパイ用スタッキングコネクタ)を使いました。

f:id:s-inoue2010:20211130162139j:plain:w480
図8: ピンヘッダ・ソケットとタクトスイッチを実装(部品面)

f:id:s-inoue2010:20211130162224j:plain:w480
図9: ピンヘッダ・ソケットとタクトスイッチを実装(ハンダ面)

1列ピンソケットには秋月電子通商で販売されている「分割ピンソケット」を使いました。

akizukidenshi.com

これまでのピンソケットは所望のピン数に分割するのが非常に難しく,また,切り離した端面も酷い有様になってしまうことが多かったのですが,これを使うと美しく分割できます。

完成と動作確認

図10に各モジュールを取り付けたHATを示します。タクトスイッチが奥まったところに行ってしまい,すこし操作しづらいですが,まぁ,自分用なので良しとします💦

f:id:s-inoue2010:20211130164112j:plain:w480
図10: MPU6050とOLEDディスプレイを取り付けたHAT

これをRaspberry Pi 3 Model A+に取り付けた状態が前掲の図2となります。

いよいよ火入れです。Raspberry Piに取り付けると,MPU6050モジュール上の緑LEDが点灯しました。また,前回作成したPythonプログラムを実行すると,OLEDディスプレイも正常に表示し,問題なく動作することを確認できました。

まとめ

以上,十字配線ユニバーサル基板を使ったマイ地震計のHAT化について,十字配線ユニバーサル基板の使い方や,カットパターンの断ち切り方を交えながら書いて参りました。

普通のユニバーサル基板と比較すると,ハンダ付けを要する箇所が格段に減りますので,(不器用な人間にとっては)精神衛生的にもプラスになります。できあがった基板のハンダ面も,どうにか人様にお見せできるレベルとなったように思います。

この十字配線ユニバーサル基板は秋月電子通商の他ではあまり販売されておらず,ちょっと入手性に不安がありますね…。また,普通のユニバーサル基板と間違えて十字配線を使ってしまって困ったという方のツイートを見かけたりもしますので,そのうち「厄介者」として廃止されないかと心配しています…💧

とは言え,ハンダ付けするよりはPカッターで切る方が断然簡単なので,筆者としては,今後,基板を作る際にはこれを第一候補として使っていこうと思っています。もちろんKiCADやDesignSpark PCBなどを用いたプリント基板の設計と外注にも挑戦したいですね。

付録1: Seeeduino Xiaoによる導通チェッカ

Seeeduino Xiaoで作った導通チェッカのプログラムを書いておきます。Seeeduino Xiao(図11)は小さなマイコンボードであり*6秋月電子通商では580円で購入できます(ピンヘッダ取り付け済みでは750円)。Arduino IDEが使えるので,M5Stack,ESP32などと同じような感覚でプログラミングできます。筆者はこれを拡張ボードと共に衝動買いし,今は温湿度センサDHT20を繋げて悦に入っています😅

f:id:s-inoue2010:20211130170657j:plain:w480
図11: Seeeduino Xiao

前述のように,HIOKIのハンディテスタが見つからないのですが,十字配線ユニバーサル基板では不導通の確認がクリティカルなので,このXiaoを使って導通チェッカを作りました。これは単に内部プルアップされているピン(GPIO10)がGNDに落ちたら導通と見なし,OLEDディスプレイに「Conducting!」と表示しつつPWMでブザーを鳴らすという仕組みです。

/*
   xiao_conduction_tester.ino
   Beep when a pin conducts to ground
   (c) 2021 @RR_Inyo
   Released under the MIT lisence
   https://opensource.org/licenses/mit-license.php
 */
 
#include <Wire.h>
#include <U8x8lib.h>

const int BUZZ = 3;
const int PROBE = 10;

// Define OLED display handler 
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);

void setup() {
  // Set built-in LED
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  
  // Set buzzer pin
  pinMode(BUZZ, OUTPUT);
  analogWrite(BUZZ, 0);

  // Set probe
  pinMode(PROBE, INPUT_PULLUP);

  // Initialize OLED display
  u8x8.begin();
  u8x8.setFlipMode(1);
  u8x8.setFont(u8x8_font_8x13B_1x2_f);
}

void loop() {
  // Read probe
  int p = digitalRead(PROBE);

  if (p == LOW) {
    // Make sound from buzzer
    analogWrite(BUZZ, 127);

    // Turn on LED
    digitalWrite(LED_BUILTIN, LOW);

    // Show status on OLED
    u8x8.setCursor(0, 0);
    u8x8.print("Conducting!    ");
  }
  else {
    // Stop sound from buzzer
    analogWrite(BUZZ, 0);

    // Turn off LED    
    digitalWrite(LED_BUILTIN, HIGH);

    // Show status on OLED
    u8x8.setCursor(0, 0);
    u8x8.print("Not conducting.");
  }
  
  // A little bit of delay
  delay(20);
}

付録2: 実際の地震の観測結果その2

2021年12月2日(木)午前1時58分頃,茨城県南部を震央(深さ60 km)とするマグニチュード5.0の地震がありました。気象庁によれば,筆者の住む街では震度3を記録しています*7

この地震についても運良くマイ地震計にて捉えることができました。結果を図12に示します。マイ地震計での検知時刻は1:59:02でした。また,計測震度は2.7(震度3)でした。

f:id:s-inoue2010:20211202162457p:plain
図12: 実際の地震の観測例その2(2021年12月2日01時58分頃の地震

う~む…。体感では初期微動が十数秒はあったはずですが,記録できておりませんね…。モーションセンサにノイズに埋もれていると思われます。また,プリトリガ,つまり,地震を検知する前の数秒間のデータも保存するように工夫が必要ですね。

*1:RADWIMPS感💦

*2:HAT = hardware attached on topの略ですが,Arduinoのshield(盾)を意識してHAT(帽子)と名付けられたのではないかと推測しています。

*3:とは言え複雑な回路ではジャンパ線は排除できないと思います。

*4:他に,普通のカッターナイフやルーターを使う方法があるようです。

*5:深圳はすっかりイノベーションの代名詞になりましたね…。日本のエレクトロニクスからは元気がなくなって久しいです…。

*6:中国語でXiao = 小ということでしょう。流行りのNanoとかPicoみたいなものでしょうか。

*7:https://www.data.jma.go.jp/multi/quake/quake_detail.html?eventID=20211202020317&lang=jp