明るさや色味を一定に保って撮影

問題

カメラで机の上にある対象物を撮影する際、照明が一定であっても、対象物の色によって画面の明るさや色味が変化し、背景の色が変わってしまいます。

例えば下図のように、白い物を撮ると画面が暗くなり、黒い物を撮ると画面が明るくなります。また下図の右の写真では、白い文字であるはずの「ELECOM」の文字がやや赤みを帯びています。

 

原因

原因は、カメラの自動露出(AE)や自動ホワイトバランス(AWB)が、撮影対象物の明るさや色味に応じて設定を変えてしまうことです。

対策

  • 撮影モードを M(マニュアル)にして、シャッタースピードと絞り数値を固定にします。
  • ISO感度を固定にします。
  • ホワイトバランスを固定にします。

解決

下図のように明るさや色味を一定に保つことができました。

 

Raspberry Pi Zero W セットアップメモ (2026年版)

やりたいこと

Raspberry Pi Zero W (初代) にRaspberry Pi OS (GUIあり) をインストールする。
今回はGUIを使う目的があるので、ヘッドレスではなく、ディスプレイとマウス、キーボードを接続する。


(1) microSDカードにOSイメージの書き込み

(1.1) Raspberry Pi Imager のインストール

Raspberry Pi Imagerをダウンロードして、PCにインストールする。

(1.2) microSDカードの用意

今回は16GBのmicroSDカードを使用する。(最低4GB以上、推奨8GB以上)
念のため、SD Card Formatter でフォーマットしておく。

(1.3) OSイメージの書き込み
  • Raspberry Pi Imagerを起動する。
  • Device は Raspberry Pi Zero を選択する。
  • OS は Raspberry Pi OS (32-bit) を選択する。
    (GUIなしの Raspberry Pi OS Lite を選ぶ場合はRaspberry Pi OS (other) から)
  • ストレージ は microSDカード を選択する。
    (マウントされているドライブ名を確認し、絶対に間違えないこと)
  • Hostname は適宜、ホスト名を設定する。
  • Localisation は適宜、Tokyo (Japan) 、Asia/Tokyo、jp などとする。
  • User は適宜、ユーザ名とパスワードを設定する。
  • WiFi はPCで使っているWiFiの設定が自動入力される。必要であれば変更する。
  • Remote access は「SSHを有効化する」をチェックする。
    認証はとりあえず「パスワード認証を使う」にしておく。
  • Raspberry Pi Connect は今回は使わないのでチェックしない。
  • Writing で設定を確認して、「WRITE」で書き込み開始する。
  • Done で「Write compllete!」と表示されたら「FINISH」で終了する。

(2) Raspberry Pi Zero W の起動

(2.1) 機器を接続して起動

  • OSイメージを書き込んだmicorSDカードを挿入する。
  • ミニHDMI端子にディスプレイを接続する。(適宜、変換アダプタを使用する。)
  • 真ん中寄りのUSB端子にUSBハブを接続する。(適宜、変換ケーブルを使用する。)
  • USBハブにキーボードとマウスを接続する。
  • 端っこのUSB端子に給電する。

(2.2) 起動確認と再起動確認

  • するとOSが起動する。初回は時間がかかるが気長に待つ。
  • デスクトップ画面が表示されてもしばらくは反応が悪い。
  • Terminal を開いて、ホスト名、ユーザー名を確認する。
  • ifconfig や ping でネット接続を適宜確認する。(ping google.com など)
  • いったん Shutdown する。(HDMI出力とLEDが消えるまで待つこと!)
  • 主電源をオフし、再びオンする。起動に約5分かかった。遅い。

ぼくの歴代はんだごて


家にあったはんだごて

1996年ごろまで使用。
家にあったメーカー不明の、ニクロムヒーター式のはんだごて。中学生から高校生のころに使ってたが、まだ本格的に電子工作をやってたわけではなかった。

HAKKO DASH N453 (20W)

1997年から2017年までの20年間、メインのはんだごてとして使用。
現行モデルのDASHはなんか安っぽいデザインになってしまったが、これは旧モデルのDASH。近所のホームセンターで購入した。セラミックヒーター式で、ニクロムヒーター式に比べて立ち上がりが速いのに感動した。大学時代に本格的に電子工作を始めて以来、長らく愛用した。
こて先はずっと標準のB型(円錐型)を使ってたが、プリント基板設計をはじめて表面実装部品を扱うようになってからは細めのC型(竹槍型)も使うようになった。こてカバーにはHAKKO 605を使用。


HAKKO PRESTO 984 (20W / 130W)

2007年から2018年ごろまで、サブのはんだごてとして使用。
ストレートタイプの旧モデルのPRESTO。これも近所のホームセンターで購入した。黄色いボタンを押すと一時的に130Wまでブーストできる。また、黒い樹脂製のキャップを取り付けられるのがよかった。
DASHではパワー不足のときに、またDASHと二刀流で部品外しするときなどに使った。


HAKKO FX-888D

2017年からDASHに代わって、メインのはんだごてとして使用。(現役)
アマゾンで購入。ハッコーカラー(青と黄色)が正直あまり好みでないので、かっこいいシルバーのやつにした。
小型のステーションタイプのはんだこてである。後述する温調回路内蔵型のFX-600と実力はそこまで大差ないという噂?もあるが、こちらのほうがこてのグリップが細くて軽いので扱いやすい。ホビー用にしては高価で、業務用にしては非力という微妙な機種だが、半端者の自分にはベストチョイス。ただ、コストダウンのためかボタンが2つしかないので温度設定等の操作が分かりにくい。
こて先はほぼD型 (マイナスドライバー型) だけでこなすようになった。


HAKKO FX-600

2018年ごろからPRESTOに代わって、サブのはんだごてとして使用。(現役)
大阪日本橋のシリコンハウスで購入。FX-888Dに合わせて色はシルバー。こて先もFX-888Dと互換性がある。
温調回路内蔵型のはんだこて。自分の周囲では大人気の機種。FX-888Dは据え置き型なので、外出用にはこちらを使用…のつもりだったが、あまり外ではんだごてを使う機会がない。
Maker Faire Kyoto 2019のとき、イベント限定の先行発売でキャップキットを手に入れ、PRESTOと同じ黒いキャップを装着できるようになった。

WebアプリをPWA化してオフライン対応

やりたいこと

AndroidのChromeでWebアプリをオフラインでも動作させたい。
(WindowsのChromeと違ってストレージにファイルを保存して開くだけでは動かない。)

方針

WebアプリをPWA化してネイティブアプリのようにホーム画面へインストールする。

Webアプリの修正

ここでは、下記のWebアプリを例にとる。

(1) index.html に追記

Web App Manifest として manifest.json を指定する記述などを追記。

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="theme-color" content="#c5cae9">
<link rel="manifest" href="manifest.json">

sw.js をService Workerとして登録する記述を追記。

<script>
  if ("serviceWorker" in navigator) {
    window.addEventListener("load", () => {
      navigator.serviceWorker.register("sw.js").catch((error) => {
        console.error("Service worker registration failed:", error);
      });
    });
  }
</script>
(2) manifest.json を追加
{
  "name": "センスチャンのデモ",
  "short_name": "センスチャン",
  "description": "センスチャンを操作するためのデモアプリ",
  "start_url": "./",
  "scope": "./",
  "display": "standalone",
  "orientation": "landscape",
  "background_color": "#c5cae9",
  "theme_color": "#c5cae9",
  "lang": "ja"
}
(3) sw.js を追加
const CACHE_NAME = "sensechan-demo-v1";
const APP_SHELL = [
  "./",
  "./index.html",
  "./main.js",
  "./gamepad.js",
  "./manifest.json",
  "./background.png",
  "./button_normal.png",
  "./button_active.png",
  "./button_lowkey.png",
  "./GenEiMGothic2-Black.ttf"
];

self.addEventListener("install", (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then((cache) => cache.addAll(APP_SHELL))
      .then(() => self.skipWaiting())
  );
});

self.addEventListener("activate", (event) => {
  event.waitUntil(
    caches.keys()
      .then((cacheNames) => Promise.all(
        cacheNames
          .filter((cacheName) => cacheName !== CACHE_NAME)
          .map((cacheName) => caches.delete(cacheName))
      ))
      .then(() => self.clients.claim())
  );
});

self.addEventListener("fetch", (event) => {
  if (event.request.method !== "GET") return;

  event.respondWith(
    caches.match(event.request).then((cachedResponse) => {
      if (cachedResponse) return cachedResponse;

      return fetch(event.request).then((networkResponse) => {
        const response = networkResponse.clone();
        caches.open(CACHE_NAME).then((cache) => cache.put(event.request, response));
        return networkResponse;
      });
    })
  );
});

Webアプリを Android の Chrome で開く

修正したWebアプリをHTTPSで公開し、AndroidのChromeで開く。
その後、Androidがオフラインになっても、キャッシュされたWebアプリが動作する。

ホーム画面にインストールする

Chromeのメニュー(右上の3点リーダー)から 「ホーム画面に追加」 をタップする。
ホーム画面にアイコンが追加され、タップするとネイティブアプリのようにWebアプリが起動する。

おまけ: Windows の Chrome の場合

WindowsのChromeの場合は、Chromeのメニュー(右上の3点リーダー)から「キャスト、保存、共有」→「ページをアプリとしてインストール」をクリックする。

メモ:usbipd-win (WSL2でUSBデバイスを使う)

まずWSLのバージョンを確認

Windows側で下記を実行。

wsl -l -v

下記のように VERSION が 1 なら WSL 1 なので WSL 2 に変更する必要がある。
VERSION が 2 ならこの節は飛ばしてOK。

  NAME      STATE           VERSION
* Ubuntu    Stopped         1

PowerShellを「管理者として実行」し、下記の2つを実行。

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Windowsを再起動し、下記を実行。

wsl --update
wsl --set-default-version 2

ディストリビューション (ここでは Ubuntu) を WSL 2 に変更。

wsl --set-version Ubuntu 2

あらためて下記を実行し、VERSION が 2 になっていることを確認。

wsl -l -v

usbipd-win をインストール

Windows側で下記を実行。

winget install --interactive --exact dorssel.usbipd-win

WSLにデバイスをアタッチ

(1) Windows側のUSBデバイスリストを表示
usbipd list

例えば下記のように表示される。

Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-5    303a:1001  USB シリアル デバイス (COM3), USB JTAG/serial debug unit      Not shared
1-8    04f2:b67d  Integrated Camera                                             Not shared
1-9    06cb:00bd  Synaptics UWP WBDI                                            Not shared
1-10   8087:0026  インテル(R) ワイヤレス Bluetooth(R)                           Not shared
(2) デバイスの共有化とアタッチ

上記の例で、「USB シリアル デバイス (COM3)」をWSL2にアタッチするには、BUSID 1-5 を指定する。

usbipd bind --busid 1-5
usbipd attach --wsl --busid 1-5

これにより、usbipd list の結果が、Not shared → Shared → Attached になる。

(3) WSL側で確認

WSL (ここではUbuntu) 側で、デバイスが接続されていることを確認する。

lsusb

下記のように、アタッチしたデバイスが表示されれば成功。
(この例では2行目。VID:PID が アタッチしたデバイスの 303a:1001 である。)

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 303a:1001 Espressif USB JTAG/serial debug unit
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

仮想COMデバイスの出力をWSL側で表示

(1) COMデバイスを確認

上記のデバイスは仮想COMデバイスである。仮想COMデバイスは、/dev/ttyUSB* または /dev/ttyACM* として認識される。
下記コマンドで確認する。

ls -l /dev/tty*

/dev/ttyUSB* も /dev/ttyACM* も現れない場合、次のコマンドを実行。

lsmod | grep cdc_acm

何も表示されなかったらドライバがロードされてないので次のコマンドを実行。

sudo modprobe cdc_acm

あらためて ls -l /dev/tty* を実行して確認。
上記のデバイスの例では、 /dev/ttyACM0 が現れた。

(2) ターミナルを開く。

下記のコマンドでCOMデバイスとボーレートを指定してターミナルを開く。

sudo screen /dev/ttyACM0 115200

ログ出力が表示されることを確認する。

(3) ターミナルを閉じる

C-a k (Ctrl+aを押した後に k) でターミナルを閉じる。

WSL側からデバイスをデタッチ

上記のデバイスをデタッチしてWindows側に戻すには、Windows側で下記を実行。

usbipd detach --busid 1-5

参考



ぼくの愛用したスマホ&タブレットたち

今まで愛用してきた歴代スマートフォン、タブレットの供養のために記す。

初代メイン機:シャープ LYNX SH-10B

2010年8月購入 (2010年型) / Android 1.6 / 5.0インチ 960×480 px

はじめてのスマートフォンはシャープの LYNX SH-10B。クラムシェル型で物理キーボード付きという特異な形状で、「メガネケース」と通称されたAU IS01の兄弟機、というかドコモ版。まだスマートフォンというものが出て来たばかりのころで、タッチ操作に慣れてないこともあり、物理キーボードがどうしても欲しかった。これを耳にあてて通話する姿は奇異に見られたし実際不便だったので、ウィルコムD4用のハンドセットをペアリングさせて使った。

回線はドコモの通話回線のみの契約で、データはWiFiで利用という運用をしていた。2011年12月からはWiMAXモバイルルータ(NEC AtermWM3500R) を併用したが田舎では電波が入りにくかった。

LYNX SH-10Bはスマートフォン黎明期ならではの面白い機種だったが、Android 1.6からアップデートされることなく、ほどなく陳腐化していった。2012年3月に退役して開発機として余生を過ごした。

写真:左からFOMA SH705iII、ウィルコムD4用ハンドセット、LYNX SH-10B
※ FOMA SH705iII は最後に使ったガラケー (2008年モデル)

開発機たち (2010年~2012年)

このころAndroidアプリやiOSアプリの開発に手を出しはじめ、実験・開発用にいろいろな機種を入手した。

サムスン GALAXY580

2010年型 / Android 2.1 / 3.0インチ 400×240px
国内では販売されていない海外仕様の機種。

写真:LYNX SH-10B と GALAXY580

iPod touch 第4世代 8GBモデル

2010年型 / iOS 4.1 / 3.5インチ 960×640px
iOSアプリ開発にも手を出そうと2011年夏ごろ購入。


LG L-04C

2011年型 / Android 2.2.2 / 3.2インチ 480×320px
ドコモ仕様の機種。スライド式の物理キーボードというスタイル。


Xperia Pro

2011年型 / Android 2.3.4 / 3.7インチ 854×480px
国内では販売されていない海外仕様の機種。これもスライド式の物理キーボードというスタイル。


2代目メイン機: サムスン Galaxy Nexus

2012年3月購入 (2011年型) / Android 4.0 / 4.65インチ 1280×720px

Android 4.0になり、ほぼ今に続くAndroid機のベースが整ったかんじ。スマートフォン黎明期が終わり、キーボード付きとか変わり種デザインの機種はだいたい淘汰された。自分もこの頃にはタッチ操作に慣れてきてもう物理キーボードなくていいかと思うようになった。

Nexusの名を冠する機種ながら2012年春ごろには3万円くらいで投げ売りされており、当時の開発者はみんなこれを持ってた印象がある。自分も7年以上にわたって愛用した。出た当時は大柄なのが不評だったが、後のスマートフォンと比べるとまだぜんぜん小さかった。

あいかわらず、通話回線のみの契約で、WiMAXモバイルルータを併用する運用だったが、2014年7月からは後述するNexus7でデータ回線を利用する2台持ち運用になった。2019年9月に故障により退役。

写真: Galaxy Nexus

写真:上段左から LYNX SH-10B、iPod touch、下段左から GALAXY580 、L-04C、Galaxy Nexus

サブ機のタブレットと開発機たち (2012年~2018年)

タブレットをサブ機として運用するようになった。

ASUS Nexus7 8GB / WiFiモデル

2012年型 / Android 4.1 / 7インチ 1280×800px
2012年10月購入。Nexusの名を冠するタブレットながら、16GBモデルは19,800円と安く手に入ったので、これも当時みんな持ってた印象がある。しかし2014年4月に起動しなくなり退役。

ASUS Nexus7 16GB / LTEモデル

2013年型 / Android 4.3→6.0 / 7インチ 1920×1200px
2014年7月購入。データ専用回線 (OCN モバイル ONE) のSIMとセットで購入し、33,740円だった。通話専用回線のGalaxy Nexusと2台持ちの運用になった。

このNexus7はBLEにも対応しており、自分もこの頃いちばん意欲的にAndroidアプリの開発をやっていた。2017年5月に起動しなくなり退役。

写真: Nexus7 と自作のWiFiラジコン基板

iPod touch 第6世代 16GBモデル

2015年型 / iOS 8 / 4インチ 1136×640px
2016年4月購入。BLEにも対応しており、iOSアプリ開発に活用。

写真: Galaxy Nexus と iPod touch

ASUS ZenPad 8.0 LTEモデル

2015年型 / Android 6.0 / 8インチ 1280×800px
2017年6月購入。故障したNexus7に代わってデータ回線用サブ機として運用。

Nexus7よりやや大きい8インチで、デザインもシンプルなNexus7のほうが好みだった。また、バックライトがたびたび点かなくなるトラブルに見舞われ、2017年12月にはバックアップ用にモバイルルータ(Huawei GL06P)を持ってSIMカード差し替えで対応する運用に。2018年12月には後述するFireタブレットとP20 liteにバトンタッチして退役。

Fire HD 8 第8世代

2018年型 / Fire OS 7 / 8インチ 1280×800px
2018年12月購入。6,980円と非常に安かった。たびたび不調になるZenPadに代わり、後述するP20 liteと本機を購入した。データ回線用途にはP20 liteを、タブレット用途には本機を用い、通話回線用のGalaxy Nexusと合わせて3台持ちの運用となった。しかしやがてタブレットを使う機会が減って使わなくなっていった。2023年に2週間入院したときには久しぶりに大活躍した。

写真: ZenPad 8.0 と Fire HD 8

ファーウェイ Nexus 6P (2015年型 / Android 6.0 / 5.7インチ 2560×1440px)

2019年夏ごろ開発用に中古で購入。しかしバッテリーのコンディションがあまり良くなく、また大型でずっしり重いのが好みでなかった。すでにアプリ開発の熱が冷めつつあったことから、あまり活用できずに終わった。

写真:左から Nexus 6P、P20 lite、Galaxy Nexus

3代目メイン機: ファーウェイ P20 lite

2018年12月購入 (2018年型) / Android 8.0 / 5.84インチ 2280×1080px

高コスパで当時人気の機種だった。SIMフリー機が26,690円で手に入った。もうこの頃にはAndroidアプリ開発の熱も冷めており、安くてそこそこ使える機種ならなんでもいいやと思うようになっていた。ただ、カメラがやけに輪郭強調するのは不満だった。

たびたび不調になるZenPadに代わってデータ回線用に投入。当初はデータ回線(OCN / 4G)のみのP20 liteと、通話回線(ドコモ / 3G)のみのGalaxy Nexusを併用する運用だった。しかし、2019年09月、7年以上にわたって愛用し続けたGalaxy Nexusがついに故障したため、回線をドコモの4Gに一本化。P20 lite 一台持ちの運用になった。

5年近く愛用したが、バッテリー充電が不安定になってきたため退役。

写真: Galaxy Nexus と P20 lite

4代目メイン機 (現役): ソニー Xperia Ace III

2023年10月購入 (2022年型) / Android 12 / 5.5インチ 1496×720px

2023年10月購入。P20 liteに代わる機種として、安くてそこそこ使える機種を探したが、スマートフォンはどんどん大型化していた。自分は片手で楽に扱えて胸ポケットに入るサイズのものがほしかったので、この機種を選んだ。解像度はP20 lite より低く、Galaxy Nexusと大差ないが、特に問題に感じたことは無い。

回線はドコモの5Gで、P20 liteに代わってこれ一台での運用となって今に至る

写真: P20 lite と Xperia Ace III

所感

こうしてみると、2012年ごろまでのスマートフォン黎明期は、面白い機種を収集するだけでも楽しかった。Galaxy Nexus や Nexus 7 のころにはふつうに使えるデバイスになり、自分もアプリ開発に取り組んだりして充実していた。そして2018年ごろまでには目新しさはなくなってホットな話題ではなくなったように思う。

メモ:InkscapeでPDFを編集

問題

InkscapeでPDFを開こうとすると「応答なし」になってフリーズする。

解決

オンラインツールでまずPDFをSVGに変換する。

SVGをInkscapeで開いて編集する。そしてPDFで保存する。