Quantcast
Channel: mattintosh note
Viewing all 878 articles
Browse latest View live

Raspberry Pi Zero に USB ハブを直結する

$
0
0

USB ハブ一体型 Raspberry Pi Zero を作ってみた。

USBハブ一体型Raspberry Pi Zeroの完成だよ! #raspberrypi #raspberrypizero #rpi

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

先日、会社の先輩に Raspberry Pi Zero を頂いた。生で見るのはこれが初めて。

「色々遊んで成果を見せて欲しい」とのこと。

まずは普通にいつもの Arch Linux ARM が使える状態にする。Zero は 1 Model B と同じなので ARMv6 用の Arch Linux ARM を使用する。microSD はいつも通り作成。これは問題無くクリア。

Model Bと同じなのでとりあえずArch Linux ARMの起動は問題なさげ

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

さて、次はネットワークへの接続だが、そもそも OTG ケーブルやら変換ケーブルを買ってきていない。

事前に調べていた通りの情報が正しければ、Zero の裏面のテストポイントから USB ハブを直結出来るはず。とりあえず安物 USB ハブを買ってきて分解。

USBハブを分解。さて、何をするでしょう?

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

Zero からハブに接続するための線を用意する。

こんな感じで結線

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

Zero と USB ハブを接続する。

で、こうして

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

Wi-Fiアダプタと Bluetoothアダプタを装着して起動。無事認識。

bluetoothもwi-fiもちゃんと認識したよ! #raspberrypizero #raspberrypi #rpi

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

普通の USB キーボードも使えるようになったので wpa_supplicant の設定を進める。ネットワークにも無事接続。

Wi-Fi接続まで完了! ちょっと電力不足感あるけど安物ハブだからだろうか…。

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

Raspberry Pi Zero に普通の USB ハブを直結してみて

ハブに接続したデバイスはすべて認識したのだが、実は大きな問題があった。USB のモードが High Speed だと Wi-Fiアダプタは動くが、Bluetoothアダプタとキーボードなどの Low Speed デバイスが正しく動かない。

Bluetoothは認識しているものの TX timeout が発生するためデバイスを起動できない。運良く起動できたことがあり、Bluetoothスピーカーへの接続を試みたが音が飛び飛びになる。調べてみたところ、Raspberry Piに USB DACを接続した場合に似たようなことが起こるようだ。

これが dwc_otg が問題なのか、買ってきた安物ハブが問題なのかは今のところ不明。

/boot/cmdline.txtに以下の記述を追加して強制的に Low Speed に切り替えたところすべてのデバイスを正しく認識した。

dwc_otg.speed=1

次に、mpv のハードウェアデコーディングの問題。

Arch Linux ARM 公式では未だに --vo=rpiに対応していないので自前でコンパイル。以下の変数をエクスポートしておく。

CFLAGS="-I/opt/vc/include"
LDFLAGS="-L/opt/vc/lib -lbrcmEGL -lbrcmGLESv2"
PKG_CONFIG_PATH=/opt/vc/lib/pkgconfig

で、--vo=rpiが使えるようになったので HD 動画を再生してみたがまともに再生できない。ソフトウェアデコードと同等だろうか。Raspberry Pi 3 なら問題なく再生できるのに。

omxplayer で試してみたところきっちり 1080p@30fps で再生できた。Bluetoothスピーカーを使って再生させる場合は alsa -> pulseaudio で接続する。HDMIと同期が取れていないようなので -zも必要。

$ omxplayer -o alsa -z video.mp4
Video codec omx-h264 width 1920 height 1080 profile 100 fps 30.000000
Error: Unable to open font
Audio codec aac channels 2 samplerate 44100 bitspersample 16
Subtitle count: 0, state: off, index: 1, delay: 0
V:PortSettingsChanged: 1920x1080@30.00 interlace:0 deinterlace:0 anaglyph:0 par:1.00 display:0 layer:0 alpha:255 aspectMode:0

Raspberry Pi Zero & Bluetoothで1080p動画の再生に成功 #raspberrypi #raspberrypizero

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

どうやら mpv は OMXではなく MMAL を使っているっぽいのでハードウェアデコーダーの性能をフルに使えていないらしい?ていうか Raspberry Pi 1 Model B の頃からこのレベルで再生出来ていたのか…。全然有効活用してなかったな。

とりあえず SambaDLNAも使えるようにしてスマホから動画を呼び出せるようにしたけど USB はやっぱり 2.0 で使いたいな…。もう少しまともなハブを買ってみるか…。


YouTubeのプレイリストのURLを解析してプレーヤーにぶち込む

$
0
0

youtube-dl が YouTubeの視聴ページだけではなくプレイリストにも対応しているので mpv ではプレイリストの URL を渡すだけで連続視聴ができていた。

しかし、Raspberry Pi Zero では MMAL を使ったハードウェアデコーディングがまともに動かないことがわかり、omxplayer での再生が必須になった。

omxplayer で YouTubeの動画をダイレクトに再生する

youtube-dl で動画をローカルに落としてしまえば omxplayer でも簡単に再生できるのだが、貧弱な microSD にそこまで負荷をかけたくない。

youtube-dl -g {URL}で取得した URL を omxplayer に渡せば omxplayer でも YouTubeの動画をそのまま再生できるのだが、これには YouTubeの仕様の問題がある。

例えば以下のようにコマンド置換で動画の URL を直接 omxplayer に渡したとする。

$ omxplayer `youtube-dl -g {URL}`

この場合、動画が 1920x1080 以上の解像度を持っていると、ビデオとオーディオの URL が分割されてしまうため、恐らくはビデオしか再生されない。

YouTubeの仕様上、ビデオとオーディオが一体になっているのは 1280x720 までのようなので omxplayer にダイレクトに渡すなら以下のようにするのが正しい。-f bestでフォーマットを「ビデオ + オーディオの最高品質」にすれば URL はひとつになる。ただし、解像度は 1280x720 まで。

$ omxplayer `youtube-dl -f best -g {URL}`

プレイリストの再生

さて、omxplayer に YouTubeの URL を渡して直接再生出来るようになったが、omxplayer は YouTubeのプレイリストの URL は受け取らない。これでは1曲ごとに URL を叩くことになるので非常に面倒。

というわけで YouTubeのプレイリストに含まれる動画の URL を根こそぎ拾ってくることにした。プレイリストのサンプルは Flying Dog のページから借りる。

www.youtube.com

プレイリストが長いと取得に時間がかかるので、ここでは --playlist-end=10として10個まで拾ってくることにする。

$ youtube-dl --playlist-end=10 -f best -g 'https://www.youtube.com/user/flyingDOGch/videos'

jqを使って JSONから取り出してもいい。ビデオとオーディオが一体になっている URL は entriesのひとつ下の urlに含まれている。

$ youtube-dl --playlist-end=10 -f best 'https://www.youtube.com/user/flyingDOGch/videos' | jq -r '.entries[].url'

あとはこの結果をループに流してしまえばいい。

$ for f in `youtube-dl --playlist-end=10 -f best -g 'https://www.youtube.com/user/flyingDOGch/videos'`; do omxplayer "$f"; done

ランダム再生がいいのなら | sort -Rする。

$ for f in `youtube-dl --playlist-end=10 -f best -g 'https://www.youtube.com/user/flyingDOGch/videos' | sort -R`; do omxplayer "$f"; done

無限ループにするなら whileの中に入れる。

$ while :; do for f in `youtube-dl --playlist-end=10 -f best -g 'https://www.youtube.com/user/flyingDOGch/videos' | sort -R`; do omxplayer "$f"; done; done

毎回プレイリストの URL を拾ってくるのも時間がかかるので普通ならテキストファイルに落として再生かな。

$ for f in `<youtube.m3u`; do omxplayer "$f"; done

プレイリストを毎回ダウンロードするのも一応メリットがあり、ブラウザで YouTubeのプレイリストの編集をしたときに常に最新の物が拾ってこれる。

トレンドチャンネルや映画予告チャンネルなんかを取得するようにしておけば常に最新の情報が手に入る…かも。

プレイリストの取得は時間がかかるので cron で更新するようにしておくようにするかな。

Raspberry Pi の GPIO の意外な?真実

$
0
0

Raspberry Piの GPIO についてちょっと気になったことがあったので色々試してみた。

Raspberry Piの GPIO2 と GPIO3 は物理的にプルアップされているそうだ。これは実物を見れば抵抗につながっているのが確認できる。その他のピンは「プルアップされている」とか「プルダウンされている」とか、よくわからない。

とりあえずうちにある Raspberry Pi 3 のうちの Element14 番で試してみる。

まず最初に /sys/class/gpioの初期状態。

$ ls -l /sys/class/gpio
total 0
--w------- 1 root root 4096 Jan  7 00:01 export
lrwxrwxrwx 1 root root    0 Dec 10 10:11 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 Dec 10 10:11 gpiochip100 -> ../../devices/platform/soc/soc:virtgpio/gpio/gpiochip100
--w------- 1 root root 4096 Jan  7 00:01 unexport

一気に書き込むとエラーになるので sleep 2を入れつつ徐々に有効にする。

$ for f in {4..27}; do echo $f >/sys/class/gpio/export; sleep 2; done

GPIO4 から GPIO27 までが使えるようになった。

$ ls -l /sys/class/gpio
total 0
--w------- 1 root root 4096 Jan  7 00:04 export
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio10 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio10
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio11 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio11
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio12 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio12
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio13 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio13
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio14 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio14
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio15 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio15
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio16 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio16
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio17 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio17
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio18 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio18
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio19 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio19
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio20 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio20
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio21 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio21
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio22 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio22
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio23 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio23
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio24 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio24
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio25 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio25
lrwxrwxrwx 1 root root    0 Jan  7 00:05 gpio26 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio26
lrwxrwxrwx 1 root root    0 Jan  7 00:05 gpio27 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio27
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio4 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio4
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio5 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio5
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio6 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio6
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio7 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio7
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio8 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio8
lrwxrwxrwx 1 root root    0 Jan  7 00:04 gpio9 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpio9
lrwxrwxrwx 1 root root    0 Dec 10 10:11 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 Dec 10 10:11 gpiochip100 -> ../../devices/platform/soc/soc:virtgpio/gpio/gpiochip100
--w------- 1 root root 4096 Jan  7 00:01 unexport

この状態で各ピンのモードと値を取ってみたところ、モードはすべて in。値は一部のピンはプルダウンされていないのか、1になっていた。ちなみに /sys/class/gpio/unexportしてやり直しても directionvalueの値は同じだった。このことを考えると入力として使うのに向いたピンとそうでないピンがあるのだろうか。

$ for f in {4..27}; do printf '%2s %3s %s\n' $f `cat /sys/class/gpio/gpio$f/direction` `cat /sys/class/gpio/gpio$f/value`; done
 4  in 1
 5  in 1
 6  in 1
 7  in 1
 8  in 1
 9  in 0
10  in 0
11  in 0
12  in 0
13  in 0
14  in 0
15  in 1
16  in 0
17  in 0
18  in 0
19  in 0
20  in 0
21  in 0
22  in 0
23  in 0
24  in 0
25  in 0
26  in 0
27  in 0

今度はすべてのピンを outにしてみる。値はすべて 0になった。

$ for f in {4..27}; do echo out >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do printf '%2s %3s %s\n' $f `cat /sys/class/gpio/gpio$f/direction` `cat /sys/class/gpio/gpio$f/value`; done
 4 out 0
 5 out 0
 6 out 0
 7 out 0
 8 out 0
 9 out 0
10 out 0
11 out 0
12 out 0
13 out 0
14 out 0
15 out 0
16 out 0
17 out 0
18 out 0
19 out 0
20 out 0
21 out 0
22 out 0
23 out 0
24 out 0
25 out 0
26 out 0
27 out 0

directionの設定は inoutだと思っていたのだが、ネットを徘徊していたときにちらっと highというワードを見かけたので一旦 inに戻した後、highにしてみたら驚いた。すべて綺麗に 1echo out >/sys/class/gpio/gpioX/directionecho high >/sys/class/gpio/gpioX/directionは別物のようだ。

$ for f in {4..27}; do echo in   >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do echo high >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do printf '%2s %3s %s\n' $f `cat /sys/class/gpio/gpio$f/direction` `cat /sys/class/gpio/gpio$f/value`; done
 4 out 1
 5 out 1
 6 out 1
 7 out 1
 8 out 1
 9 out 1
10 out 1
11 out 1
12 out 1
13 out 1
14 out 1
15 out 1
16 out 1
17 out 1
18 out 1
19 out 1
20 out 1
21 out 1
22 out 1
23 out 1
24 out 1
25 out 1
26 out 1
27 out 1

highがあるなら lowもあるんだろうということでやってみたら今度は outだけど値は 0になった。

$ for f in {4..27}; do echo in   >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do echo low  >/sys/class/gpio/gpio$f/direction; sleep .5; done
$ for f in {4..27}; do printf '%2s %3s %s\n' $f `cat /sys/class/gpio/gpio$f/direction` `cat /sys/class/gpio/gpio$f/value`; done
 4 out 0
 5 out 0
 6 out 0
 7 out 0
 8 out 0
 9 out 0
10 out 0
11 out 0
12 out 0
13 out 0
14 out 0
15 out 0
16 out 0
17 out 0
18 out 0
19 out 0
20 out 0
21 out 0
22 out 0
23 out 0
24 out 0
25 out 0
26 out 0
27 out 0

以前、エアコンの信号を夜に取るのに赤外線受光モジュールの足を15番に繋いだような繋いでないような。ものすごく不安定でまともに信号を読み取れなかったのだが、何か関係しているのだろうか。(この時は充電最適化機能付きの電源を使っているのが問題だったのだが)

とりあえずボタン入力とかは 4/5/6/7/8/15 を避けた方が安定しそうだ。

時間ができたら UK 版と JP 版の Raspberry Pi 3、それから Zero でも調べてみよう。入力で初期値を決めるワードってなんだろうか。あと OS とか Raspberry Piのバージョンでも違うんだろうか。

そういえばよく見たら17番ピンの3.3Vにちゃんと抵抗ついてた。これを目印にすれば3.3Vの取り出しは間違え無さそうだ。

Raspbian + DHCP で DNS サーバの固定

$
0
0

Raspberry Pi Zero で /etc/network/interfacesに以下のように設定した。

iface wlan0 inet manual
    dns-nameservers 8.8.8.8
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

/etc/resolv.confは以下のようになった。

# Generated by resolvconf
nameserver 192.168.1.1
nameserver 8.8.8.8

違う!違うよ!!!

Raspbian だと /etc/dhcpcd.confの設定が優先されるらしい。

man dhcpcd.confには以下のように書いてあった。

Here is an example which configures a static address, routes and dns.
    interface eth0
    static ip_address=192.168.0.10/24
    static routers=192.168.0.1
    static domain_name_servers=192.168.0.1

static domain_name_servers=で固定できそうだ。しかし、serversと言うからには複数設定できると思われるのだが、デリミタが何なのかが書いてない。man -K domain_name_serversで全マニュアルを検索してみたがやっぱり書いてない。

とりあえず当てずっぽうで space にして /etc/dhcpcd.confに書いてみた。。

interface wlan0
static domain_name_servers=8.8.8.8 8.8.4.4

期待通りになった。

# Generated by resolvconf
nameserver 8.8.8.8
nameserver 8.8.4.4

NetworkConfiguration - Debian Wikiに似た書式で書いてあったけど微妙に違う。

Linuxはほんとこの辺統一してほしい…。

Raspbian とか Ubuntu で簡単に root になる

$
0
0

いままで「Ubuntuは初期状態ではパスワードが設定されてないから root には慣れないよ!」みたいなものを何度も見てきたので自分もそう思っていた。

Raspbian で GPIO にアクセスしたいから root になりたいと思ってなんとなくやってみたら簡単にできた。

pi@raspberrypi:~ $ sudo su -

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

root@raspberrypi:~# id
uid=0(root) gid=0(root) groups=0(root)
root@raspberrypi:~# 

Ubuntuでも同様。普通に root でログイン出来るようにしておいたトラブルが起きた時には助かるんだけどね。

dwm の st のフォントを変更する

$
0
0

Raspberry PiX Window Systemを使うときはだいたい dwm なんだけどなんか OS を再インストールする度にフォントが変わっている気がするので直に指定することにした。

と、言っても dwm から st を呼び出すときは Alt + Shift + Enter で、このカスタマイズが多分 config.h を変更することになりそうなので st の実行ファイル自体を細工する。

まず st の実行ファイルをリネームする。

$ sudo mv /usr/bin/st /usr/bin/st.bin

新しく /usr/bin/stを作る。

#!/bin/sh
exec /usr/bin/st.bin -f "Sazanami Gothic:size=10"

あとは実行権限を付与する。

$ sudo chmod +x /usr/bin/st

今月の Raspberry Pi 色々

$
0
0

Raspberry Piをブレッドボードに直接接続

年が開けてから aitendo に買い物に行ってきた。

Raspberry Pi Zero もらったし、ブレットボードに直載せしたいな〜」と。aitendo にはオリジナルの製品でT字の基盤キットが195円で売っている。お店に行くと基盤自体は店頭特価で39円。店を出るときには4枚も買っていた…。

その他、ピンヘッダやピンソケットが必要になる。aitendo のピンヘッダは足が曲がってたりするのであまり質が良くない。

家に帰って早速ハンダ付け。ここでひとつ気づいたことがある。一般的なピンヘッダはブレッドボードに挿しづらいのである。秋月で売っている細ピンヘッダの方がブレッドボードでは扱いやすい。そして秋月で売っているブレッドボードはだいたいバネが堅い。

半田付け中 #raspberrypi #raspberrypizero

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

とりあえず Raspberry Pi Zero 用が出来た。Zero にはL型のピンヘッダを付けたので、基板側はピンソケットにしてある。

で、こうなる #raspberrypi #raspberrypizero

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

秋月にL型の40Pソケットが売っていたのでこちらも付ける。これは Raspberry Pi 2 や Raspberry Pi 3 用。

今のところ使う予定ないけどとりあえずレギュラーサイズ用も作っておいた #raspberrypi

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

二台並べてみる。

並べてみました #raspberrypi #raspberrypi3 #raspberrypizero

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

さて、早速 GPIO を使おうと思ったが、基盤に何もプリントされていないのでどこが何番ピンなのかわからない。テスターで調べてみたら上下というか左右というか色々ひっくり返っているらしく、頭の中でちょっと面倒くさいことをしなくてはいけない。値段の安い理由はこれか…。初心者だとちょっと難しいかもしれない。※秋月で300円で売っているような基盤の場合は GPIO 通りの配線になっている。

とりあえずどれがどのピンかわかったので先日作成した YouTubeボタンを作りなおす。

LEDつけたのでYouTubeのロードが分かりやすくなった #raspberrypi #raspberrypizero

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

動画で撮ってみた。再生には OMX Player を使っているけど、YouTubeの動画をそのまま再生しようとすると実は色々と細工をする必要があるのでスムーズに再生出来るようにちょっと工夫した。

YouTube Button Demo 2 #raspberrypi #raspberrypizero #YouTube

Makoto Yoshidaさん(@mattintosh4)が投稿した動画 -

Raspberry Piの電源は GPIO から拾える!?

どっかでそんなの見たな〜、と思い、秋月で microUSB の DIP化キットを買ったのでやってみたところ普通に起動した。このタイプのブレッドボードだと細ピンヘッダは緩いので今は普通に接続している。

Power supplying from breadboard. #raspberrypi #raspberrypizero

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

Raspberry Pi Zero からアナログビデオ出力

Zero の映像出力にピンヘッダを付けたのでせっかくだからと専用 RCAケーブルを作ってみた。秋月で売っている小型のアナログ液晶ディスプレイはオス・メスどちらも使えるので Raspberry Pi A と同じメスにしてみた。

最近の成果 #raspberrypi #raspberrypizero

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

ちょっと一息、イヤホン修理

1年前くらいに修理したイヤホンケーブルが断線してきたので修理。QIコネクタでもイケるかと思って試してみたけど D-Sub ピンじゃないとやっぱりだめらしい。前回よりも良い仕上がりで満足。

イヤフォン断線したので修理 #ultimateears #maudio #superfi #ie10

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

Zero のブレッドボード面積を2倍にして USB タイマー充電機能をつける

T字基盤を使うとブレッドボードが狭いのでひとつ大きいサイズを秋月で買ってきた。

Bluetoothスピーカーには OMAKER の M4 を使っているんだけど、過充電防止回路(?)が付いていないらしく、10時間以上の順電はしてはいけないんだそうだ。電池の持ちがいいので普段ほとんど充電しないんだけど、最近は YouTubeボタンを使うようになったので週に2度くらい充電するようになってきた。

電圧をチェックして自動で充電オフにする回路にしてもいいんだけど、とりあえずどれくらい電力を使っているのかということと、Zero で充電ができるかを調べるためにトランジスタと GPIO で時間制限付き充電回路を作った。トランジスタはコレクタ電流 1A 以上のものを秋月でいくつか仕入れてきた。2SD2012、TTC015B、2SD468 あたりを選んできたけど、ブレッドボードには TO-92 型の 2SD468 が使いやすい(写真は無理矢理差し込んだ 2SD2012 が付いている)。完全に電池を使いきった状態だと 400mA くらい消費するようだ。

来週は USB ハブの接続に使っている線をポリエステル銅線に変更する予定。秋月で細品ヘッダも買ってこないと。

パイプで繋いだコマンドの出力をバッファ無しで受け取りたい

$
0
0

先日、Raspberry Piで温度を測定するプログラムを書いたので温度をモニタリングしながらファイルに保存していこうと思ったら画面に何も出てこなかった。すっかり忘れてたけどバッファがあるんだった。

$ python2 temp.py | tee temp.csv

昔は grep --line-bufferedみたいなの使ってた気がするけど、他にも無いのかと調べてみたらコマンドのバッファを変更できる stdbufっていうちゃんとあった。

$ man -s 1 -k buffer
dmesg (1)            - print or control the kernel ring buffer
stdbuf (1)           - Run COMMAND, with modified buffering operations for its standard streams.
$ stdbuf --help
Usage: stdbuf OPTION... COMMAND
Run COMMAND, with modified buffering operations for its standard streams.

Mandatory arguments to long options are mandatory for short options too.
  -i, --input=MODE   adjust standard input stream buffering
  -o, --output=MODE  adjust standard output stream buffering
  -e, --error=MODE   adjust standard error stream buffering
      --help     display this help and exit
      --version  output version information and exit

If MODE is 'L' the corresponding stream will be line buffered.
This option is invalid with standard input.

If MODE is '0' the corresponding stream will be unbuffered.

Otherwise MODE is a number which may be followed by one of the following:
KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.
In this case the corresponding stream will be fully buffered with the buffer
size set to MODE bytes.

NOTE: If COMMAND adjusts the buffering of its standard streams ('tee' does
for example) then that will override corresponding changes by 'stdbuf'.
Also some filters (like 'dd' and 'cat' etc.) don't use streams for I/O,
and are thus unaffected by 'stdbuf' settings.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report stdbuf translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/stdbuf>
or available locally via: info '(coreutils) stdbuf invocation'

すっきり(´ー`)

$ stdbuf -i0 -o0 -e0 python2 temp.py | tee temp.csv

Raspberry Piの画面解像度を再起動せずに変更する

$
0
0

いつも /boot/config.txtframebuffer_widthとか framebuffer_heightを書いて再起動していたけど fbsetコマンドですぐに変更できた…orz

$ sudo fbset -g128072012807224
Linux Frame Buffer Device Configuration Version 2.1 (23/06/1999)
(C) Copyright 1995-1999 by Geert Uytterhoeven


Usage: fbset [options] [mode]

Valid options:
  General options:
    -h, --help         : display this usage information
    --test             : don't change, just test whether the mode is valid
    -s, --show         : display video mode settings
    -i, --info         : display all frame buffer information
    -v, --verbose      : verbose mode
    -V, --version      : print version information
    -x, --xfree86      : XFree86 compatibility mode
    -a, --all          : change all virtual consoles on this device
  Frame buffer special device nodes:
    -fb <device>       : processed frame buffer device
                         (default is /dev/fb0)
  Video mode database:
    -db <file>         : video mode database file
                         (default is /etc/fb.modes)
  Display geometry:
    -xres <value>      : horizontal resolution (in pixels)
    -yres <value>      : vertical resolution (in pixels)
    -vxres <value>     : virtual horizontal resolution (in pixels)
    -vyres <value>     : virtual vertical resolution (in pixels)
    -depth <value>     : display depth (in bits per pixel)
    -nonstd <value>    : select nonstandard video mode
    -g, --geometry ... : set all geometry parameters at once
    -match             : set virtual vertical resolution by virtual resolution
  Display timings:
    -pixclock <value>  : pixel clock (in picoseconds)
    -left <value>      : left margin (in pixels)
    -right <value>     : right margin (in pixels)
    -upper <value>     : upper margin (in pixel lines)
    -lower <value>     : lower margin (in pixel lines)
    -hslen <value>     : horizontal sync length (in pixels)
    -vslen <value>     : vertical sync length (in pixel lines)
    -t, --timings ...  : set all timing parameters at once
  Display flags:
    -accel <value>     : hardware text acceleration enable (false or true)
    -hsync <value>     : horizontal sync polarity (low or high)
    -vsync <value>     : vertical sync polarity (low or high)
    -csync <value>     : composite sync polarity (low or high)
    -gsync <value>     : synch on green (false or true)
    -extsync <value>   : external sync enable (false or true)
    -bcast <value>     : broadcast enable (false or true)
    -laced <value>     : interlace enable (false or true)
    -double <value>    : doublescan enable (false or true)
    -rgba <r,g,b,a>    : recommended length of color entries
    -grayscale <value> : grayscale enable (false or true)
  Display positioning:
    -move <direction>  : move the visible part (left, right, up or down)
    -step <value>      : step increment (in pixels or pixel lines)
                         (default is 8 horizontal, 2 vertical)

シェルスクリプトで最後の改行を取り除きたい

$
0
0

前に AWKを使ってやったことがあったような気がしたけど headだけで出来るんだよな…。AWKでやったことの方が印象が強くてこっちを忘れてしまう。

head -c-1 file

あぁでも Unixhead-cオプションが無くてそれで AWKを使ったような気がする。でもよく考えたら wcで長さ調べて ddで読んでもいいのか。

前ほどシェルは使わなくなったなぁ…。

🍎 Nihonshu アップデート情報 2017年04月16日 🍷

$
0
0

久しぶりに。

ソースコードが結構変わっていてパッチが当たらなかったのでいくつか修正。細かいところはあまりチェックしてないです。

テスト用のゲームを何処に閉まったか忘れたので手近にあった吉里吉里Z製のノベルゲームを起動してみましたが、普通に動くっぽいです。(前に吉里吉里Zが動かなくてWineオワタみたいな話をどっかで見た気がしたけど)

次の更新は夏コミの時期(の予定)です。

Raspberry Pi で HDMI 出力を初期化する

$
0
0

mpvを複数同時に起動したら [vo/rpi] Could not get DISPMANX objects.のメッセージと共に画面が固まった。OS を再起動すれば直るんだろうけど面倒なので tvserviceやら fbsetのヘルプを見てみると再起動できそうなオプションがあった。

$ tvservice --preferred

で、直りましたとさ。tvserviceで済んでしまったので fbsetは試してないけど、もしかしたらそっちでも直るかも。

mattintosh.hatenablog.com

土壌湿度センサーを自作した話

$
0
0

秋月電子で買った DFRoboto 製の Arduino用土壌湿度センサーを Raspberry Pi Zero で2ヶ月ほど使ってました。

楽しい #RaspberryPi #土壌センサー

Makoto Yoshidaさん(@mattintosh4)がシェアした投稿 -

最近、ヘデラの方が水をやっているのに ADC で測定している電圧がなかなか上がらず…。土との接触が悪いのかと思い、センサーを掘り出してみたら見事に金メッキが剥げていました。

土は湿ってるのに土壌湿度センサーの電圧が上がらんなぁと思ったら電極溶けてるやんけ!

Makoto Yoshidaさん(@mattintosh4)がシェアした投稿 -

土壌の質のせいなのかよくわかりませんが、500円でこんなもんか…という感じ。買い直してもまた2、3ヶ月で同じ状態になっても困るので別の手段を考えることに。

この土壌湿度センサー、公開されている回路図を見るとトランジスタと抵抗しか使っていないっぽい。

ということは作れるのか…?

と、思い、トランジスタと100Ω抵抗を使ってセンサーと同じ回路を作成してジャンパーピンを土にプスっと挿してみた。

………

………………あ、反応するんだw

というわけで別に「土壌湿度センサー」という製品に拘る必要はなく、トランジスタと抵抗と適当な金属板か棒があればいいようで。

とりあえず秋葉原の電気街で一般的なバナナプラグを買ってきて土にプスっと。コンセントプラグがネタとして面白いかなと思ったけど、ねじ山切ってある金属棒にニチフの丸端子を固定してもいいかな。

ヘッダピンでもできたけど感度悪かったからバナナプラグぶち込んだよ!わーい! #RaspberryPi

Makoto Yoshidaさん(@mattintosh4)がシェアした投稿 -

ヘデラの方はバナナプラグ、ベンジャミンの方は金メッキが剥げていないので市販の土壌湿度センサー。どちらも問題なく稼働中。

自作(?)土壌湿度センサー問題なく稼働中 #RaspberryPi

Makoto Yoshidaさん(@mattintosh4)がシェアした投稿 -

バナナプラグだと長さが短いので柔らかい土だと接触不良を起こすかも。そのうちもう少し長めの棒に変える予定。

バナナプラグが一番高くて2個で100円くらいだったけど、有り物で作ればトランジスタと抵抗代くらいで済むので数十円で作ることができる。土の抵抗が大きくなったらLEDが点灯するみたいな回路なら簡単に作れるね。

DFRoboto さん、製品改良してくれないかなー。

MediaWikiで致命的例外Symfony\Component\Process\Exception\ProcessTimedOutExceptionが発生する

$
0
0

MediaWikiMySQLを使っているんだけど、最近よく下記のエラーが発生するようになった。

[a7a5567fcc6f7e711b3cfddf] 2017-05-13 17:21:38: 種別「Symfony\Component\Process\Exception\ProcessTimedOutException」の致命的例外

ProcessTimeOutとあるように、何かしらが時間切れになっているようだが、恐らく MySQLなんだろうなぁ…。とりあえず MySQLのデータベース最適化を実行してみる。

$ mysqlcheck -u root -proot --all-databases --optimize

これでもまだ直らないので MediaWikiのモジュールをチェック。エラー内容の文字列を検索すると mediawiki/vendor/symfony/process/Process.phpが見つかった。中身を見てみると44行目にタイムアウトの設定らしきものがあった。

43     // Timeout Precision in seconds.
44     const TIMEOUT_PRECISION = 0.2;

とりあえず 0.28.0ぐらいに変更して様子見。

Hyper-V 上の Ubuntu で Time has been changed が止まらない

$
0
0

会社の仮想環境で Ubuntuを使っているのだけど、いつからか

  • bmon の表示が「止まったと思ったら一気に流れだした」
  • htop や glances が途中で止まる

と言ったことが起こるようになってしまった。

で、gnuplotで timestamp を使ってグラフを作ると何故か逆走するポイントがあったりしたので、watch date してみたら時間が一時的に20分先に進んでしまうという症状を発見した。

hwclock や timedatectl で見てみると、ハードウェアクロックがおかしいようで、20分先に進んだり20分前に戻ったりしている。酷い時は当日の 00:00:00 まで戻る。

f:id:mattintosh4:20170521000608p:plain

systemd-timesyncd は有効になっているし、ntpdate で時間を調整しても症状は改善せず。

一旦、ntp 関連をすべて切ってみるとハードウェアクロックが20分進んだ状態でシステムクロックも安定しだした。その状態で ntpdate、hwclock してもまたすぐ20分進んでしまう。

Hyper-Vを稼働しているマシンで Time synchronization を有効にしている場合、Linuxの場合は起動時に影響があるようだが、起動後は NTP による制御になる。

と、ずっと思っていたのだが、journalctl を見てみると5秒おきに Time has been changed が出る。NTP も切っているのに何故だ???

色々探してみてようやく答えを見つけた。

I have a lot of "Time has been changed" in the journal of my linux boxes

どうもゲストマシンに Hyper-V用のモジュールを入れていると勝手に時間をハードウェアクロックに合わせようとしてしまうらしい。

Time Synchronization のデバイスIDは決まっているようなので unbind すれば同期が止まる。

echo 2dd1ce17-079e-403c-b352-a1921ee207ee > /sys/bus/vmbus/drivers/hv_util/unbind

Time Synchronization は hv_vmbus に含まれていそうだけど下手に抜いて止まると厄介なので上のコマンドを rc.local にでも書いておくか…。

$ lsmod | grep hv
hv_netvsc              40960  0
hv_utils               28672  0
hv_storvsc             20480  2
scsi_transport_fc      61440  1 hv_storvsc
hv_vmbus               90112  6 hyperv_keyboard,hv_netvsc,hid_hyperv,hv_utils,hyperv_fb,hv_storvsc

とりあえず ntp をインストール。Ubuntuデフォルトだと Ubuntuの NTP サーバを使うようになっているので他のサーバに変更。

$ sudo apt-get install ntp
$ sudo -e /etc/ntp.conf
server ntp.nict.jp
server time1.google.com iburst
server time2.google.com iburst
server time3.google.com iburst
server time4.google.com iburst

systemd-timesyncd はオフにして ntp だけにしとく。

$ sudo systemctl stop systemd-timesyncd
$ ^stop^disable
$ sudo systemctl start ntp
$ ^start^enable

ようやく安定。

$ watch timedatectl
      Local time: Sun 2017-05-21 00:36:26 JST
  Universal time: Sat 2017-05-20 15:36:26 UTC
        RTC time: Sat 2017-05-20 15:36:26
       Time zone: Japan (JST, +0900)
 Network time on: no
NTP synchronized: yes
 RTC in local TZ: no

仮想マシンは仕組み上、システム時間とハードウェアクロックがどんどんずれていくものなので定期的にハードウェアクロックの調整が必要のようだが、今回はちょっと違った問題だったので直すのに手間取った…。


シェルスクリプトで2進数や16進数を変換

$
0
0

最近、A/Dコンバーターを使うので2進数を扱うことが多くなってきた。Pythonなんかだと 0b0xといった書式や bin()hex()といった関数があるが、シェルスクリプトの場合はどうするのか?マニュアルを見るとこんな風に書いてある。

Constants with a leading 0 are interpreted as octal numbers.
A leading 0x or 0X denotes hexadecimal.
Otherwise, numbers take the form [base#]n, where the optional base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base.
If base# is omitted, then base 10 is used.
When specifying n, the digits greater< than 9 are represented by the lowercase letters, the uppercase letters, @, and _, in that order.
If base is less than or equal to 36, lowercase and uppercase letters may be used interchangeably to represent numbers between 10 and 35.

0xは使ったことがあったけど、[base#]nという書き方で基数が指定できるようだ。(ver3時代からあったっけ???)

$ echo $((2#0)) $((2#1)) $((2#1111)) $((2#11111111))
0 1 15 255

ビットシフトや AND/OR とかもオッケー。

$ echo $((2#101)) $((2#101 << 2)) $((2#101 << 4)) $((2#101 << 8))
5 20 80 1280
$ echo $((2#10101010)) $((2#10101010 & 2#1111)) $((2#10101010 | 2#1111))
170 10 175

変数も使える。

$ var=1111
$ echo $((2#${var}))
15

16進数や8進数もおんなじ感じだね。

$ echo $((0xff)) $((16#ff))
255 255
$ echo $((077)) $((8#77))
63 63

2進数や16進数からの変換は上記の方法でできるけど、2進数への変換はどうするのか?

とりあえず bcや配列を使う方法があるけど、bash標準の機能で出来るかどうかはいまのところわからない。

$ echo "obase=2;8" | bc
1000
$ echo "obase=2;1;2;4;8;16" | bc
1
10
100
1000
10000

配列の場合は 0から始まるのでそのまま指定すればいいが、setを使う場合は 1から始まるのでその分を足してあげる必要がある。いずれも関数にしておけば簡単に使えそうだ。

$ set -x
$ d2b=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
+ d2b=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
$ echo ${d2b[8]}
+ echo 00001000
00001000

$ set -- {0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}
+ set -- 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000 00010001 00010010 00010011 00010100 00010101 00010110 00010111 00011000 00011001 00011010 00011011 00011100 00011101 00011110 00011111 00100000 00100001 00100010 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101010 00101011 00101100 00101101 00101110 00101111 00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00111010 00111011 00111100 00111101 00111110 00111111 01000000 01000001 01000010 01000011 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 01001100 01001101 01001110 01001111 01010000 01010001 01010010 01010011 01010100 01010101 01010110 01010111 01011000 01011001 01011010 01011011 01011100 01011101 01011110 01011111 01100000 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111 01110000 01110001 01110010 01110011 01110100 01110101 01110110 01110111 01111000 01111001 01111010 01111011 01111100 01111101 01111110 01111111 10000000 10000001 10000010 10000011 10000100 10000101 10000110 10000111 10001000 10001001 10001010 10001011 10001100 10001101 10001110 10001111 10010000 10010001 10010010 10010011 10010100 10010101 10010110 10010111 10011000 10011001 10011010 10011011 10011100 10011101 10011110 10011111 10100000 10100001 10100010 10100011 10100100 10100101 10100110 10100111 10101000 10101001 10101010 10101011 10101100 10101101 10101110 10101111 10110000 10110001 10110010 10110011 10110100 10110101 10110110 10110111 10111000 10111001 10111010 10111011 10111100 10111101 10111110 10111111 11000000 11000001 11000010 11000011 11000100 11000101 11000110 11000111 11001000 11001001 11001010 11001011 11001100 11001101 11001110 11001111 11010000 11010001 11010010 11010011 11010100 11010101 11010110 11010111 11011000 11011001 11011010 11011011 11011100 11011101 11011110 11011111 11100000 11100001 11100010 11100011 11100100 11100101 11100110 11100111 11101000 11101001 11101010 11101011 11101100 11101101 11101110 11101111 11110000 11110001 11110010 11110011 11110100 11110101 11110110 11110111 11111000 11111001 11111010 11111011 11111100 11111101 11111110 11111111
$ eval echo \${$((8 + 1))}
+ eval echo '${9}'
++ echo 00001000
00001000
$ eval echo \${$((255 + 1))}
+ eval echo '${256}'
++ echo 11111111
11111111

ESP8266/ESP-WROOM-02/ESPrのメモ

$
0
0

秋月電子ESP-WROOM-02DIP化キットを買って色々試してる。千石で売ってるスイッチサイエンスの ESPr-Developer とはちょっと扱いが違うので迷った。

素の ESP8266 はいくかの端子をプルアップ、プルダウンすることによってモードを切り替えるようになっているので単に電源と TX/RX を繋いだだけでは使えない。その辺はまた時間が出来てから詳しく書く予定。とりあえず 3.3V 500mA のレギュレータは買っておいた方が良い。

とりあえずウェブサーバを起動するところまでは出来たけど不明な点が多い。

わーい、ESP8266でウェブサーバ作れたぞー💪(´∀`)👍 #ESPr #ESP8266 #ESPWROOM02 #Arduino

Makoto Yoshidaさん(@mattintosh4)がシェアした投稿 -

ESP8266WebServer.hを別で呼ぶ必要があるのかどうかは不明。(あとで調べる)

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

SSIDとパスワードの定義の仕方は人によって様々。

//#define SSID "SSID"
//#define PASSWORD "PASSWORD"
//const char* ssid = "SSID";
//const char* password = "PASSWORD";
//const char ssid[] = "SSID";
//const char password[] = "PASSWORD";

サーバの起動方法。あとで調べる。

ESP8266WebServer server(80);
//WiFiServer server(80);
//WiFiClient client;

IP アドレスを固定する場合は WiFi.configに各値を渡す。

IPAddress arduino_ip (192, 168,   1, 199);
IPAddress gateway_ip (192, 168,   1,   1);
IPAddress dns_ip     (  8,   8,   8,   8);
IPAddress subnet_mask(255, 255, 255,   0);

void setup() {
  Serial.begin(115200);
  Serial.print(ssid);
  WiFi.config(arduino_ip, gateway_ip, subnet_mask);
  WiFi.begin(ssid, password);
}

うーん、調べる時間が足りない。

PIXEL for PC を VirtualBox 用にディスク拡張して使ってみる

$
0
0

x86用に Raspbian ビルドしてみようかな〜」と思ったらもうとっくに出てたでござる…orz

www.raspberrypi.org

最近は新しい USB ライターで Ethcer なんてのも出てるんですね。Win32 なんちゃらよりよっぽど良さそう。(Windowsじゃないからどうでもいいんだけど)

f:id:mattintosh4:20170610121520p:plain

さて、公式で配布されている 2016-12-13-pixel-x86-jessie.iso は読み取り専用と思いきや書き込み領域も用意されているとのこと。素晴らしい。領域拡張して VirtualBox用にしちゃおう。

$ vboxmanage convertfromraw 2016-12-13-pixel-x86-jessie.iso \
                            2016-12-13-pixel-x86-jessie.vdi

ISO から VDI に変換したものはマスターとして残しておいて、カスタマイズ用のものを複製。UUID が被るので internalcommands sethduuidで UUID を変更、modifyhdmodifymedium)で 8GB に拡張。ファイルシステムの拡張はパーティションのサイズに合わせて Raspbian が勝手にやってくれるようだ。

$ cp 2016-12-13-pixel-x86-jessie.vdi \
     2017-06-10-pixel-x86-jessie.vdi
$ vboxmanage internalcommands sethduuid 2016-06-10-pixel-x86-jessie.vdi
$ vboxmanage modifyhd 2016-12-13-pixel-x86-jessie.vdi --resize 8000

VNCで繋いでいるかのような感覚。ストレージが違うので実機より快適。最近、Zabbix をちょっと弄っているので APT で入れてみたけど 2.x 系だった。

f:id:mattintosh4:20170610122940p:plain

apt-get upgradeしたあとで 2GB くらい使う。そこから色々入れると 8GB だとちょっと足りないかもしれないけど VDI なのであとで拡張すればよい。

f:id:mattintosh4:20170610123044p:plain

会社の新人に使わせてみようと思ってるので日本語化。デフォルトはキーボードが英語配列なので日本語配列に切り替えて作業。

$ setxkbmap jp
$ sudo sed -i'' '/ja_JP.UTF-8/s/#//' /etc/locale.gen
$ sudo locale-gen
$ sudo localctl set-local LANG=ja_JP.UTF-8
$ sudo ln -fs /usr/share/zoneinfo/Japan /etc/localtime
$ sudo apt-get install fcitx-mozc --install-recommends

この ISO を物理 HDD に書き込めば Raspbian で起動するんだよなぁ。古い PC で遊んでみるかな。

これはお布施で Raspberry Zero をもう一台購入だな。

Raspberry Pi でシリアル通信

$
0
0

ESPr 開発用に購入した USB シリアル変換モジュールを使って Raspberry Pi 3 と接続してみる。


つくばエクスプレス柏の葉キャンパス」駅前にあるコワーキングスペース「KOIL」さんに来ているのだけど、Raspberry Pi用のディスプレイを持ってこなかったので何もできない状態。

せっかくなのでシリアル通信を試してみることにした。使うのは秋月電子で売ってる超小型 USB シリアル変換モジュール「AE-FT234X」。

akizukidenshi.com

AE-FT234X と Raspberry Pi 3 をこんな感じで接続する。Raspberry Piの電源供給を PC から行ってる場合は GND なしでもいけるような…?

AE-FT234XRaspberry Pi 3
TXRX(GPIO 15)
RXTX(GPIO 14)
GNDGND(空いてるところならどこでも。GPIO 14 の隣あたりが楽)



予め Raspberry Pi 3 の /boot/config.txtenable_uart=1を追加しておく。

enable_uart=1

母艦に AE-FT234X を接続すると /dev/ttyUSB0が現れる。sudo不要で使えるよう dialoutグループにユーザを追加する。

$ sudo usermod -aG dialout $USER

一旦ログアウトして再ログイン。

sttyコマンドで /dev/ttyUSB0を調べると設定が出てくる。これで Baudrate が 115200 であることがわかる。

$ stty < /dev/ttyUSB0
speed 115200 baud; line = 0;
min = 100; time = 2;
-icrnl -imaxbel
-opost -onlcr
-isig -icanon -echo

シリアル接続が可能なコマンドは screenminicombusybox microcomなどがある。いずれも接続したあと、一回 Enter を押す必要がある。

f:id:mattintosh4:20170625153216p:plain

■ screen

終了する場合は ^a, k

$ screen /dev/ttyUSB0 115200

■ minicom

終了する場合は ^a, z

$ minicom -b 115200 -o -D /dev/ttyUSB0

busybox microcom

終了する場合は ^x

$ busybox microcom -s 115200 /dev/ttyUSB0

AE-FT234X にL字のピンソケットとかを装着すれば GPIO に直挿しできるようになるかもしれない。1つくらい持っておいても困らないかな。

Raspberry Pi Zero を OTG で繋いでセットアップ

$
0
0

Raspberry Pi Zero を USB で繋いでディスプレイやキーボード無しでうんちゃらかんちゃらとかやったことなかったので。Bonjourというか avahi-daemonは使わない。

microSD/dev/sdbにあるものとする。とりあえず Raspbian のイメージを microSDに書き込んだところから。

boot パーティションのマウント。

$ sudo mount /dev/sdb1 /mnt

OTG を有効にする。なんかネットを見て回ると「rootwaitの後ろに modules-load=dwc2,g_etherを入れる」とあるけど、別に最後でもいいんだよねこれ。

$ sudo sed -i'' 's/$/ modules-load=dwc2,g_ether/' /mnt/cmdline.txt

dtoverlay=dwc2を追加する。

$ sudo tee -a /mnt/config.txt <<!

dtoverlay=dwc2
!

boot パーティションをアンマウント。

$ sudo umount /mnt

次に root パーティション

$ sudo mount /dev/sdb2 /mnt

最近だと IP アドレスの固定には /etc/dhcpcd.confを使っているのでそっちに追記。Raspberry Pi Zero の IP アドレスを 10.0.0.2/24にする。 母艦の PC を 10.0.0.1にする。

$ sudo tee -a /mnt/etc/dhcpcd.conf <<!

interface usb0
static ip_address=10.0.0.2/24
static routers=10.0.0.1
static domain_name_servers=8.8.8.8 8.8.4.4
!

あと、最近になってから(?)sshdが自動で起動しないようになっているので systemctl enable sshを手動でやる。

$ sudo ln -s /lib/systemd/system/ssh.service /mnt/etc/systemd/system/multi-user.target.wants/ssh.service

パーティションをアンマウントして microSDを取り外す。

$ sudo umount /mnt
$ sudo eject /dev/sdb

次に母艦の方。

インターフェイス名は使っている OS によって違うと思う。

IP アドレスを追加する。Raspberry Pi Zero を再起動する度にインターフェイスが消えるので udev に設定しておいた方が良さそう。

$ sudo ip a add 10.0.0.1/24 dev enp0s29u1u2

ルーティングとパケット転送の設定。

$ sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
$ sudo sysctl -w net.ipv4.ip_forward=1

で、母艦から SSHで接続すればよい。

$ ssh pi@10.0.0.2

母艦の PulseAudio で再生するようにしておけば母艦の負荷を上げずに YouTubeの BGM なんかを再生しておける。

$ PULSE_SERVER=10.0.0.1 mpv --no-video 'https://www.youtube.com/watch?v=lt_c5RK4Cyg'
Viewing all 878 articles
Browse latest View live