あたりの続きです。

シリアル接続を Bluetooth にして、スマートフォンから接続して測定して結果を表示するようにしています。

Bluetooth モジュールは RN42 を使っています。基板上に載せることもできるようにしたのですが、コントロール側の基板が無駄に大きく、別途作りなおそうかとも思っているので、ひとまずブレッドボードで接続しています。

アプリケーション側

ネイティブで書く気はさらさら起きないため Apache Cordova を使っています。HTML + CSS + JS でアプリを書くやつですがいろんなところで実績があるので割と安心して使えそうです。何度か触ってますが Hello, World までしかやったことがなかったので、Cordova でまともなアプリケーションを作るのは初めてです。

Bluetooth SPP を使いたいので、cordova-plugin-bluetooth-serial を使っています。

全体的なフレームワークとして Polymer を使っています。とはいえレンダリングは canvas なので今のところあんまり Polymer 的機能はつかっていません。

割と普通に書いたら動いたので、それほどハマりどころはありませんでした。

その他

コードはそのうち公開します。

これでとりあえず、

  1. いくつかの設計候補からの設計方針の決定
  2. 実際の回路図起こし (Eagle)
  3. 基板のアートワーク・基板発注 (Eagle, PCB Way)
  4. 手実装
  5. ファームウェアの開発 (mbed)
  6. ソフトウェア開発 (Cordova, Polymer)

までを一通り一つのプロジェクトとして、ほぼ独りでできる見通しになりました。

自分で作ったハードウェアを自分で書いたソフトウェア、特にインターフェイス部分は HTML/CSS/JS という高レイヤーまで一通りできたぞという実感がようやく沸いてきたので嬉しいです。

  1. トップ
  2. tech
  3. 自作アンテナアナライザーのBluetooth化とアプリケーション

Ruby の serialport gemで Bluetooth SPP を使おうとすると Errno::EBUSY がでてうまく通信できず、なんでだろう、となりました。接続先の Bluetooth モジュールは Microchip の RN42です。

結論からいうと sleep するしかなさそうです。

begin
	@port = SerialPort.new(
		"/dev/tty.RNBT-68BF-RNI-SPP",
		115200,
		8,
		1,
		0
	)
rescue Errno::EBUSY
	sleep 1
	retry
end

今回のケース

  1. MCU と RN42 の TX/RX/GND を接続し、RN42 に 3.3V を供給 (接続はこれらのみ)
  2. この状態で Mac から RN42 をペアリングする。
    • /dev/tty.RNBT-68BF-RNI-SPP みたいなファイルができる。
  3. Ruby のプログラムで serialport gem を使って通信する

したがって MCU と RN42 の間にはフローコントロールはありません。

  1. トップ
  2. tech
  3. Ruby の serialport gem で Bluetooth SPP を使おうとすると Errno::EBUSY

なんか一時期 elecrow のサイトがさっぱり見れなかったので、PCB Way というのを使ってみました。

簡単かつ安く高精度なアンテナアナライザーを自作したい | tech - 氾濫原 の基板ができあがったそれです。


ガーバー提出

PCB Way は

  • ファイルを提出
  • レビューをうける
  • 支払い

というフローになっていて、レビューが通らないと支払いができません。

今回ちょっと微妙なケース(外形には2枚の基板に見えるが実際は繋がっていて1枚)のガーバーファイルを提出しましたが、1日以内にメールがきて「ここはどうするのか?」と聞かれました (英語です)。普通に回答して返信したらレビューを通してくれました。

あと支払い終了後に支払い失敗という表示になってあせりましたが、PCB Way上で再度確認するとトランザクションは完了してて、とりあえず問題なさそうでした。

リードタイム


DHL がデフォルト発送業者になっていますが、PCB本体よりも送料が圧倒的に高くなるので Hongkong Post での発送にしました。Hongkong Post だとリードタイム最大30日と書いてあってヒヨりますが、とりあえず急いでいないのと、さすがにそこまでかからないだろうという気持ちがあります。

発注から発送開始までは3日ぐらいでした。詳細なプログレスが表示されるのでなんかすごい感じがします。プログレスのビューにある Finished Time は中国時間のようなので、JST-1 です。

Delivery になってからも実際の Hongkong Post のサイトでトラッキングできるようになるまで3日かかりました。Delivery となっても実際投函しているわけではなく、ある程度溜ったのを一括で投函している?ようです。

Hongkong Post で引受状態になると日本郵政でもトラッキングできるようになります。ただ、国内に入るまでは Hongkong Post のサイトでトラッキングしたほうが詳細情報が見れます。引受状態になってから、実際に自宅にくるまでは4日でした。

ということで、発注から9日ぐらいで届きました。

価格

最大 10cm x 10cm のプラン5枚で本体が $13、送料が$9で、$22でした。

仕上がり

一部、細かいところでソルダーマスクが剥れている部分がありましたが致命的ではありませんでした。シルクの綺麗さも特に問題を感じるようなものではないと思います。

Elecrow と比較して

ぶっちゃけ好みな気はしますが、任意の色のソルダーマスクで10x10cmを作る場合は PCB Way のほうが安そうです。

値段以外だと PCB Way は作業状況がちくいちウェブで見れるのは面白いです。一方で Elecrow は発送時に写真をとって送ってくれるのは嬉しいサービスです。が、いずれにせよPCB本体には特に関係ありません。

サイトのできは PCB Way のほうがモダンで良くできている感じがします。支払いでエラーになったのがアレですが……

  1. トップ
  2. tech
  3. PCB Way を使ってみたよ

DIP だと思ったら 2mm ピッチでブレッドボードで使えなかったので PCB Milling で変換基板を掘りました……

変換する基板も売ってますが不必要に高いので雑に掘りました。

削るところを少なくするためにもベタGND にしたいので単純な変換基板ではなく GND がベタに繋がるようになっています。1pin のマーキングのためどこにも繋がらないViaを設置しました。

回路図はひかず Eagle のボード画面だけをCADとして使っています。

スルーホールができないので変換基板は工夫が必要です。細ピンヘッダを無理やり押しこんで片側によせています。ハンダ付け時にハンダをつけすぎるとブレッドボードに刺さらなくなるため結構気をつかいます。

気付いたとき失敗したなあと思いましたが接続状況がでるLEDがついてるのはとりあえずテストするには便利なのでこれはこれでいいと納得すうことにします。

  1. トップ
  2. tech
  3. 間違えて RN-42 の 2mmピッチ基板のやつを買ってしまった

以下、試さないで書きましたが、試してみたら全くダメでした。OS 10.11 対応とはなんだったのか? マジでムカついてます……

CaptureOnTouch Lite だとうまくいくことが判明。つまり Auto を On にして出てくる画面のソフトならいける。想像するに CaptureOnTouch DR-P208II は修正漏れなんじゃないか?


Q&A検索(よくあるご質問)|キヤノン

Canon ドキュメントスキャナ imageFORMULA DR-P208II - キヤノン

キヤノン

3.0 / 5.0

DR-P208II を使っているんだけど、El Capitan に OS をアップデートをしてからずっと使えない状態だった (固まる。正常にスキャンできない)。

3月15日付けで上記ページが更新されて「対応済み」に変わった。

ダウンロードページを見てみると確かに 3月14日付けで対応版がリリースされているようだ。

まだ試してないけど、ようやくかという感じすぎる。

El Capitan は 2015-06-09 にデベロッパープレビュー、2015-09-30 に正式リリースだが、2016-03-14 に対応されるまで数ヶ月もかかってる。

しかも「動かない」という致命的な不具合でこれだけかかっていて不思議。普通に考えたら、とりあえず動くバージョンをなんとかしてQAに通すと思うんだけど、リリースノート見ると OCR の精度向上とか比較的優先度低いだろというのも一緒に入ってて謎。


動かないハードウェアは、場所をとるという所有コストを払っている分の損を生み出している。

Re:Re:(初回生産限定盤)(DVD付) - ASIAN KUNG-FU GENERATION

ASIAN KUNG-FU GENERATION

5.0 / 5.0

「ASIAN KUNG-FU GENERATION New Single Re:Re:」ってCMが流れていて「おれはリバイバルしちまったか…」とみんな思ったんじゃないか。

全然ニューじゃないだろと思ったんですが、どうやらソルファ版のとは違っていて、アレンジ違い (ライブ版?) を再録しているようです。僕だけがいない街のOP聞いても昔の曲そのまんまだと思っていたので、再録と聞いてびっくり。

ソルファ - ASIAN KUNG-FU GENERATION

ASIAN KUNG-FU GENERATION

5.0 / 5.0

ソルファは2004年。もう12年前ってびっくりするなあ。2004年に生まれた子供はもう中学生になるって考えたら相当やばい感じがする。

前回はある程度うまくいきそうというところまでやりました。7MHz 帯のグラフが波うっているのが気になったので詳しく原因を探して解決しました。

いくつかのバンドで測定してみると、7MHz よりも上の周波数では該当する現象が起きないないし起きにくいことに気付きました。そこで 7MHz で固定発振させて出力波形を見てみると、なんとクリッピングしていました……

RFアンプの設計能力がなさすぎて完全にネックになっています。帰還抵抗だけ修正して増幅率を抑えてみました。

おそらく歪みが残っているとは思いますが見た目的には綺麗になっています。

出力が変わっていますがプログラム上では自動的に入力電力で正規化しているので回路の修正以外はいりません。

修正後の 7MHz のグラフ


まだちょっと変ですが大幅に改善されました。既製品と比べ R 成分が大きく観測されている現象もあったのですがそれもなくなっています。

他のバンドのグラフ

ついでに他バンドのグラフをはっておきます。7Mhz 以外は非常に綺麗にグラフが描けます

14MHz

18MHz



21MHz

28MHz


50MHz

抵抗負荷でのグラフ

以下は50Ωダミーロードを測ってみたグラフです。BNC SMA 変換コネクタ経由で、SMA 1W のダミーロードを繋いでいます。非常に綺麗にでます。 が、なぜか抵抗値が高くでています…

75Ωのカーボン抵抗をBNCコネクタに直接つっこんだグラフです。

同じく100Ωカーボン抵抗です。

さらに 150Ωカーボン抵抗。どうもインピーダンスがずれすぎるとだいぶおかしくなります。反射の影響でしょうか?

水晶発振子

目的外ですが水晶発振子の共振特性も見てみました。いずれも水晶単体をBNCコネクタに直接つっこんで見ています。思ったより綺麗にグラフにでました。

12MHz 水晶


20MHz 水晶

コンデンサ

0.1uF セラミック

0.01uF セラミック

47pF セラミック

インダクタ

円筒型の 10uH インダクタ

メモ

綺麗にグラフが書けないことがある。歪んでいるかなにかしてそう

  1. トップ
  2. tech
  3. 簡単かつ安く高精度なアンテナアナライザーを自作したい (2)

いろいろ回路の説明を見たりしていたのは自分で作ってみたかったからです。既製品を1つ持っていますが、海外製なので壊れたときに不安です。自分で作れれば既製品に頼る必要がひとまずなくなるので安心できますし、自分にニーズに応じてニッチな機能を足しやすくなります。

設計というほどではないですが、手軽に作れそうでベストな回路で作ってみることにしました。

構成

  • 発振器は AD9851 (DDS) のモジュール
  • 検波は AD8307 (ログアンプ)
  • 検出器はブリッジ
  • 計測ポイントは3つ
    • リファレンス電圧 (入力電圧の半分)
    • 負荷電圧 (アンテナの入力電圧)
    • 平衡電圧 (リファレンス電圧と負荷電圧の差

測れる原理はアンテナアナライザの回路 - ブリッジの三つの電位差を測るタイプ | tech - 氾濫原で確認しました。

実際の回路

センサー部

AD8307 は1つにします。というのも、AD8307 を複数使う場合、それぞれの特性があってないことを考慮する必要があって面倒だからです。キャリブレーションレスにしたいと思うと1つにするというのは必要要件です。

測定ポイントの切り替えはRFスイッチでやることにします。これには MASWSS0115 (digikey: 1465-1373-1-ND) を使いました。選定理由は

  • MASWSS0115 は単価約70円と安い
  • 電源電圧 2.3V〜5V
  • DC〜3GHz
  • アイソレーションが22dB @ 3GHz (データーシートのグラフを見ると、HF帯ではもっとある)

アイソレーションが低めなのが気になりましたがHF帯でしか使わないので大丈夫そうです。電源はスイッチ入力と共用です。

これを2つ使って、AD8307 の入力前に信号を切り替えます。

DDS+バッファ

このバッファ回路は再考の必要があります。やりたいことはただのバッファです。

MCU

MCU は LPC1114 を使っています。しかしやってることは

  • DDSの制御
  • ADC
  • シリアル通信

だけです。計算処理を入れるとROMにおさまらないので、コンピュータ側で計算します。この構成だとAVRのほうがリファレンス電圧を任意に設定できるのでアドバンテージがあります。Arduino ベースで作りなおしてもいいぐらいです。

書きこみが楽にできるようにピンヘッダを立ててあります。

使えるか

こんな感じで測定できています。なぜか波うっています。ADCの±1エラーもありそうですが、インピーダンスミスマッチでどこかで反射が起きているのかもしれません。外来ノイズ (アンテナなので普通に受信状態にある) も関係ありそうな気がします。よくわかりません。

VSWR の測定 (測定値2つの単純な割り算) では波うってないので、そんなに気にすることもないかもしれません。

既製品で測定した結果のリアクタンスを絶対値になおしたグラフが以下です。そこそこ一致しているように見えます。波うっているのさえなんとかなれば普通に信用にたる測定器がつくれそうです。

いくつかあった問題

RF バッファ

ほぼ唯一の半導体が絡むアナログ回路であるRFバッファ回路でかなり苦労しました。実際組んでみるとまともに出力がでず、かなり苦労しました。上記回路図中のバッファ回路は一応動いたレベルの定数です。どうしても正しくシミュレーションないし設計通りの計算ができず、試行錯誤しました。

  • トランジスタが思いがけず1つ壊れていた
    • ここに気付くまでだいぶ…
  • AD9851 モジュールのフィルタを通ってない出力を使っていた
    • 電流出力なので出力インタピーダンスがシミュレーションと全くあわなかった
    • フィルタ済みの出力にリワーク
  • 定数がおかしかった
    • よくわからないが試行錯誤してしまった

こんな回路もまともに組めないのか、という感じでつらい感じでした。

あとトランジスタの選定を失敗しました。無駄にfTが高いものを使っているのと、Ic が低く、SSM というパッケージだと他のものと互換性が低いので換えにくいです。

RFスイッチ

試していると、片方のRFスイッチで、信号がGND側に通りぬけて、出力レベルが下がっていることがわかりました。

RFスイッチの故障を疑ったりもしましたが、結局電源の接続がちゃんとできていなかったことが原因でした。かなり小さいICなのでなかなか気付きませんでした。

オープンドレインを出力につかっていた

基板のアートワークを作るときに、ピン配置を配線しやすいように変えたのですが、これがもとでうっかりオープンドレインピンを使うようにしてしまいました。当然動かずしばらく悩みました。リワークで対応しました。

まとめ

まだアプリケーションとしては途中ですが、ひとまず動きそうだぞというところまではできました。

測定結果が波うっているのは未解決です。また、RFバッファも微妙なのでもうちょっとマシにするか、素直にバッファICにしてしまいたいです。

  1. トップ
  2. tech
  3. 簡単かつ安く高精度なアンテナアナライザーを自作したい

例によって ebay で300円ぐらいものです。絶対的な解像度はともかく TFT カラー液晶がこの値段だと 16x2 の LCD とかが情報量的にはゴミに思えてきます。(ライブラリサイズとかの兼ね合いもあってそのまま置き換えられるわけではないですが)

購入したものは ST7735 を使っているので、Adafruit-ST7735-Library でだいたい動く雰囲気なのです。以下の2つのライブラリを使える状態にしておく必要があります。

しかし、このモジュールが想定している仕様とは異なる仕様のモジュールのようで、微調整が必要でした。ただし Adafruit-ST7735-Library はクラス構造を private にしているので、残念ながらライブラリ側を無修正のままではどうしようもありませんでした。

最低限の修正に留めるようと、以下のように private を protected にしました。

diff --git a/Adafruit_ST7735.h b/Adafruit_ST7735.h
index 0598720..3b1aa97 100755
--- a/Adafruit_ST7735.h
+++ b/Adafruit_ST7735.h
@@ -152,7 +152,7 @@ class Adafruit_ST7735 : public Adafruit_GFX {
   void     dummyclock(void);
   */
 
- private:
+ protected:
   uint8_t  tabcolor;
 
   void     spiwrite(uint8_t),

実際に使う前に public 継承して初期化処理を奪っています。実際のコードでは冒頭の gif のように millis() を連続して表示させています。

#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h> /* must modify private to protected */
#include <SPI.h>

class TFTST7735 : public Adafruit_ST7735 {
public:
	TFTST7735(int8_t CS, int8_t RS, int8_t RST = -1) :
		Adafruit_ST7735(CS, RS, RST)
	{
	}

	void init() {
		initR(-1);

		_height = 128;
		rowstart = 32;
		colstart = 0;
	}
};

#define TFT_CS     10
#define TFT_RST    9
#define TFT_A0     8

TFTST7735 tft = TFTST7735(TFT_CS, TFT_A0, TFT_RST);

void setup (void) {
	tft.init();
	tft.fillScreen(ST7735_BLACK);
}

void loop() {
	tft.setTextWrap(false);

	// font size is 5x7
	tft.setCursor(5, 5);
	tft.setTextColor(ST7735_RED);
	tft.setTextSize(1);
	tft.fillRect(5, 5, 128, 7, ST7735_BLACK);
	tft.println(millis());

	tft.setCursor(5, 20);
	tft.setTextColor(ST7735_WHITE);
	tft.setTextSize(2);
	tft.fillRect(5, 20, 128, 7*2, ST7735_BLACK);
	tft.println(millis());
	delay(24);
}

所感

128x128 は MCU で扱う解像度としてはかなり広く感じます。文字を dot by dot で表示させると 16x2 などの LCD モジュールと比べてかなり情報量が増えます。カラーなのでさらに情報量が増えます。

描画速度も 16x2 の LCD などよりは早いです。ただしバッファが1つなのであまり書き換えが早いとチラついてしまいます。

デメリットとしては制御コードが複雑になる (フットプリントが増える) ことだと思います。上記のコードはかなりシンプルに見えますがプログラムで23.3%、データで7.7%使っています。ライブラリ側の工夫でもうすこし縮められそうな気はしますが、テキスト表示するならフォントは持たざるを得ないので、16x2 と比べると確実にコード量が増えます。

  1. トップ
  2. tech
  3. ST7735 128x128 TFT カラー液晶モジュール

だいたい300円ぐらいのものです。MAX7219 というLEDドライバを使っていて、SPI で表示を変えられます。(正確には 7219 は SPI 対応とは書いてないのですが、CS の扱いが違うだけ? なのか、ほぼSPIと同じインターフェイスです。よくわかりません)

SPI を使ったことがなかったので一応自分で書いてみました。BCD のデコーダが入っており、数字ぐらいの表示なら自分でLEDとのマッピングを持つ必要はありません。

モードがいくつかあって

  • 全桁自分で制御 (7セグメント+ドットに対応するビットを自分で入れる)
  • 最下位桁だけBCDで残りは自分で制御
  • 上位4桁は自分で制御して、下位4桁はBCD
  • 全桁BCD

と選べます。7セグでアルファベット表示したい、みたいな場合は全桁自分でやる必要があります (マッピングすなわちフォント情報を持つ)

コード

書いたコードでは、全桁BCDでやるようにしてみました。マッピング持つのが面倒なのと、実質自分が使おうと思う用途だと数字以外表示しなそうだな、という気がしています (7セグでアルファベット表示させるのは視認性が悪いので好きじゃない)

SPI 通信はビット数のキリがいいのでハードウェアを使ってやっています。MAX7219 は 10MHz の SPI らしいのでそのようにしてみました。チップセレクトだけコンストラクタに渡すようにしています。

#include <Arduino.h>
#include <SPI.h>

#include <string.h>
class MAX7219 {
	uint8_t CS;

public:
	enum class ADDRESS : uint8_t {
		NOOP = 0b0000,
		DIGIT0 = 1,
		DIGIT1 = 2,
		DIGIT2 = 3,
		DIGIT3 = 4,
		DIGIT4 = 5,
		DIGIT5 = 6,
		DIGIT6 = 7,
		DIGIT7 = 8,
		DECODE_MODE = 0b1001,
		INTENSITY = 0b1010,
		SCAN_LIMIT = 0b1011,
		SHUTDOWN = 0b1100,
		DISPLAY_TEST = 0b1111,
	};

	enum class SHUTDOWN_MODE : uint8_t {
		SHUTDOWN = 0b0,
		NORMAL = 0b1,
	};

	enum class DECODE_MODE : uint8_t {
		NO_DECODE_FOR_DIGITS_7_0 = 0b00000000,
		CODE_B_DECODE_FOR_DIGIT_0_NO_DECODE_FOR_DIGITS_7_1 = 0b00000001,
		CODE_B_DECODE_FOR_DIGIT_3_0_NO_DECODE_FOR_DIGITS_7_4 = 0b00001111,
		CODE_B_DECODE_FOR_DIGIT_7_0 = 0b11111111,
	};

	MAX7219(uint8_t _cs) :
		CS(_cs)
	{
		pinMode(CS, OUTPUT);
	}

	void write(ADDRESS address, uint8_t data) {
		SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0));
		digitalWrite(CS, LOW);
		SPI.transfer(static_cast<uint8_t>(address));
		SPI.transfer(data);
		digitalWrite(CS, HIGH);
		SPI.endTransaction();
	}
	void begin() {
		SPI.begin();

		setDecodeMode(DECODE_MODE::CODE_B_DECODE_FOR_DIGIT_7_0);
		setScanLimit(7);
		setShutdown(false);

		setIntensity(8);

		for (int i = 0; i < 8; i++) {
			write(static_cast<ADDRESS>(i + 1), 1);
		}
	}

	void setDecodeMode(DECODE_MODE mode) {
		write(ADDRESS::DECODE_MODE, static_cast<uint8_t>(mode));
	}

	void setScanLimit(uint8_t limit) {
		write(ADDRESS::SCAN_LIMIT, limit);
	}

	void setIntensity(uint8_t intensity) {
		write(ADDRESS::INTENSITY, intensity);
	}

	void setShutdown(bool shutdown) {
		write(ADDRESS::SHUTDOWN, static_cast<uint8_t>(shutdown ? SHUTDOWN_MODE::SHUTDOWN : SHUTDOWN_MODE::NORMAL));
	}

	void print(const char* buf) {
		size_t len = strlen(buf);
		uint8_t digit = 0, dp = 0;
		for (size_t i = 0; i < len && digit < 8; i++) {
			const char c = buf[len - i - 1];
			if (c == '.') {
				dp = 1<<7;
				continue;
			} 

			uint8_t b;
			if (c == '-') {
				b = 0b1010;
			} else
			if (c == ' ') {
				b = 0b1111;
			} else
			if ('0' <= c && c <= '9') {
				b = static_cast<uint8_t>(c - '0');
			} else {
				continue;
			}

			write(static_cast<ADDRESS>(digit + 1), b | dp);
			dp = 0;
			digit++;
		}

		for (; digit < 8; digit++) {
			write(static_cast<ADDRESS>(digit + 1), 0b1111);
		}
	}
};


MAX7219 leds(10);

void setup() {
	leds.begin();
	leds.print("-1234.567");
	delay(3000);
}

void loop() {
	leds.print(String((float)micros() / 1000).c_str());
	delay(29);
}
  1. トップ
  2. tech
  3. MAX7219 8桁 7セグメント LED モジュール / Arduino

切削を2回ぐらい失敗したあと、そこそこ良さそうなのができたので、実装してみました (まだ途中ですが)。右側でブリッジしているような部分がありますがこれは設計上の意図的なもので、右側はほぼ完璧です。

マクロで撮るとスケール感がわかりにくいので右側に SOIC のパッケージのものも入れています。ほぼ同じサイズで約2倍のピンが並びます。

残念ながらプレッシャーフットなどがないのでワークのZ軸に傾きがあり、これがどうしても消せませんでした。左側は低くて、右側は高い (といっても0.1mm〜0.2mm程度の傾き) という状態です。ほとんど基板に触れない状態から切削を開始して、ダメそうなら 0.02mm ずつZを下げていきました。これ以上下げるとTSSOPの部分のパッドが消滅しそうなのでやめました。

左側は手作業でショート部分を削ったのでだいぶ汚ないです。

一応 TSSOP も実装できそうです。しかし、このサイズ (30mmx23mm程度) でも傾きがこれほど問題になるので、もっと大きな基板では現状のセッティングではまず無理そうです。プレッシャーフットを自作するか、あるいは基板を固定しているジュラコンを精密に水平出しをすればいけるのかあるいは設定を詰めればいけるのか、よくわかりません。プレッシャーフットも万能ではないのでなんともいえなそうです。


やはり気楽にやれる範囲は SOIC ぐらいだと思います。実装の点でも SOIC まではルーペなしで実装可能ですが、TSSOP ぐらいからルーペ確認が必須になってきます。

主要ピン幅

  • DIP : 2.54mm
  • SOIC: 1.27mm
  • TSSOP: 0.65mm
  • MSOP: 0.5mm

先端 0.1mm、60度のVカッターだと0.1mm の深さで幅 0.215mm。

ソルダーマスク

このように PCB Milling で普通に作るとソルダーマスクがないので、ハンダブリッジをとても起こしやすい状態になります。

いくつか作って実装してみてわかりましたが、表面実装品ではソルダーマスクがなくても案外ブリッジしません。一方でリード品をハンダづけすると高確率でブリッジします。

これはおそらく使用するハンダの量の違いだと思います。また、リード品だとリードが邪魔で正確にコテ先をあてにくいのも一因としてありそうです。

TSSOPでもパッドがしっかり成形できていれば、ハンダ付け自体にはそれほど困難に感じません。ただしフラックスは必須です。

「リード部品のほうがハンダ付けしやすい」という刷り込みを持っていたので、意外な発見でした。

  1. トップ
  2. tech
  3. PCB Milling で TSSOP

/**
zun-doko-kiyoshi in ARM Linux EABI
 */

.section .text
.global _start

.macro sys_write
        mov r7, $0x04
        svc $0x00
.endm

.macro rand_init
        /* using all high resiters for rand: r8-r12 */
        /* set seed from time */
        ldr r0, =time
        /* sys_time */
        mov r7, $0x0d
        svc $0x00
        ldr r0, =time
        ldr r8, [r0]
        /* load constant for rand */
        ldr r9, =1103515245
        ldr r10, =12345
        ldr r11, =2147483647
.endm

.macro rand
        /* random update r8 */
        mov r12, r8
        mla r8, r12, r9, r10
        and r8, r8, r11
.endm


_start:
        rand_init
        /* r6 is current zun count */
        mov r6, $0

loop:
        rand
        /* check bit / eq = zun, ne = doko */
        tst r8, $0x80
        adreq r1, zun
        moveq r2, #zun_len
        addeq r6, $1
        adrne r1, doko
        movne r2, #doko_len
        mov r0, $0x01
        sys_write
        bne check_kiyoshi
        b loop

check_kiyoshi:
        /* now this is doko state and check zun count */
        cmp r6, $5
        /* zun count is greater than 5 */
        bge call_kiyoshi
        /* failed to call kiyoshi and reset state */
        mov r6, $0
        b loop

call_kiyoshi:
        /* now this is kiyoshi state */
        adr r1, kiyoshi
        mov r2, #kiyoshi_len
        mov r0, $0x01
        sys_write
        mov r0, $0x00
        /* sys_exit */
        mov r7, $0x01
        svc $0x00

zun:
        .string "ズン\n"
zun_len = . - zun
        .align 2

doko:
        .string "ドコ\n"
doko_len = . - doko
        .align 2

kiyoshi:
        .string "キヨシ\n"
kiyoshi_len = . - kiyoshi
        .align 2


.section .data
time: .word 0

cross compile

 arm-linux-gnueabi-as ./sketch.s -o sketch.o && arm-linux-gnueabi-ld -o sketch -e _start sketch.o && qemu-arm-static ./sketch
  1. トップ
  2. tech
  3. arm-linux-eabi でのアセンブリ ズンドコ

ほんとにイライラすることばかりが起きる。なんでこんなめにあうのか。本当の意味がわからない。

いくら自分から面白いことを探そうとしても、ひたすらに不幸が追いかけてくる。嫌なことは自動的に毎日起き続けるのに、面白いことは追いかけても逃げていく。


とにかくこの毎日嫌なことばかりが起きるのをなんとかしたい。

自分の中からはただただやりたいことが沸いてくる。大半の嫌なことは他人に起因していて、

  • 嫌なことを言われる
  • 嫌なことを言われると予期される
  • 嫌なことをやらされる

となる。しかし他人に起因することは自分にどうすることもできない。無力。原因が解決しないので、運用でカバーとするしかないが、運用力がない。

もっと果てしないスルー力があれば解決するかもしれない。どのようにしてそれを手に入れればいいかはわからない。他人の重要性をもっともっと下げていきたい。お前らとかどうでもいいと思えるようになりたい。他人の評価を全て無視したい。

とにかくなんとかしてストレス解消したい。最近とことん些細なことでイライラする。

精神的余裕がないのに、追い討ちをかけるような事態しか起きない。ひどいめにあうということしかない。インターネットのほうがまだ安全ではないか。

自分は自分のルールで生きており、つまりこのルールは道徳ないし宗教なので、他人にどうこう言われるようなものではない。ただ生きてるわけでもなく、自分のルールに従って生きている限り、それをどうこう言われる筋合いは全くない。

事情を知らない人間はクソなことを言ってくる。お前の事情なんてこちらとしても存じあげない。コミュニケーションをしないやつに、コミュニケーション能力が低いと罵られる意味はなんだ。