Raspberry PiとAndroidでUSBテザリング

USBケーブル1本あればRaspberry PiとAndroid端末を接続することにより簡単にテザリングをすることができます。
Raspberry Piを触ってみたいが固定のネット環境がないという場合でもテザリング契約のあるAndroid端末さえあればPiで遊ぶことができます。(但しインストール済のSDカードは必要ですが)

環境

raspberry pi 3 ディスクトップ raspbian jessie

$ uname -a
Linux pi3 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux

Android端末 EP171AC Android 7.0
大手キャリアのテザリングは基本有料のようですね。当サイトではDMMのSIMを使っているので特に制限はありません。
データプランは1GBですが普段はDMMのアプリで低速にしているので月初はいつも2GBになっています。当サイトの感覚では大きな画像のないホームページやメールでは特に問題ないと感じています。


それではディスクトップのPi3とスマホをUSBケーブルで接続してみましょう。
設定 — もっと見る — テザリングとポータブルアクセスポイント
USBテザリングをON
通知欄にUSBマークが現れます。

Pi3からifconfigを実行してみます。

$ ifconfig
-----snip------
usb0      Link encap:イーサネット  ハードウェアアドレス e6:b7:52:e8:56:06 
          inetアドレス:192.168.42.122 ブロードキャスト:192.168.42.255  マスク:255.255.255.0
-----snip------

usb0が生えていますね。
以前はPi側にも設定が必要のようでしたが現バージョンでは特に設定の必要は無いようです。
Pi3はまだWi-Fiが有効になっているので一旦解除します。(root)

# ifconfig wlan0 down


Wi-Fiアイコンから有線アイコンに変わりました。

スマホもWi-FiをOFFにしておきます。

ブラウザから確認くん、スマホからアクセスしていますね。

Piのアドレスは192.168.42.XXになっています。テザリングを入り切りするごとにXXは変わります。
これはandroid端末から払いだされているものと思います。

android端末のアドレスを調べてみました。
nmapのインストール

# apt install nmap

$ nmap -sP 192.168.42.0/24

Starting Nmap 6.47 ( http://nmap.org ) at 2017-08-04 19:06 JST
Nmap scan report for 192.168.42.28
Host is up (0.00078s latency).
Nmap scan report for 192.168.42.129
Host is up (0.0013s latency).
Nmap done: 256 IP addresses (2 hosts up) scanned in 3.24 seconds

android端末のアドレスは192.168.42.129ですね。 これは端末を再起動しても変わりませんでした。

Pi3のWi-Fiを戻すには# ifconfig wlan0 up でWi-Fiは有効になるのですが環境によっては再起動する必要があります。

Pi Zeroで実験

ディスプレー、キーボードの無い環境でUSBテザリングを実行、操作可能かテストしてみました。
Zeroにはraspbian jessie-liteをインストールしています。
Wi-Fiドングルを挿し込みます。
テザリングはPi3同様可能としても操作はandroid端末からするしかありません。

Pi Zeroに固定アドレスを設定する。
/etc/dhcpcd.confに追記
アドレスは192.168.42.XX/24をゲートウェイにはandroid端末のアドレスを設定

interface wlan0
static ip_address=192.168.42.1/24
static routers=192.168.42.129
static domain_name_servers=192.168.42.129

android端末にはターミナルソフトをインストールします。
アプリはTerminusをインストール、HostにZeroを登録します。

android端末のWi-FiはOFFにします。
USBテザリングをON
Terminusから接続
うまく接続出来ました。

コマンドラインからグローバルIPを確認するには
$ curl ifconfig.io を実行すると良いようです。
スマホのグローバルIPが返ってきました。

dhcpcd.confに設定しておけば普段ネットに接続していない環境でもWi-Fiドングルを挿し込みUSBテザリングから接続できるのでメンテナンス等に応用できると思います。

また今回はjessie-liteをインストールしていますがjessieをインストールしてアプリ(VNCなど)からXにもアクセスできそうです。(スマホからなので実用性は厳しいと思いますが)

USBテザリングは接続先のPiとandroid端末の1対1の関係になりますがPi ZeroにさらにWi-Fiドングルを追加、hostapdをインストール、設定すればローカルのアクセスポイントや臨時のルーターとして応用できると思います。(当サイトとしては面倒なのでやめときますが)


Zero-Wに2017-07-05-raspbian-jessie-liteをインストールしました。
PI Zero-Wの内蔵Wi-Fiでも全く同じ設定で試してみましたが同様に接続できますね。

但しTerminusからの接続は新たにZero-WのHostを登録する必要があります。

Raspberry Pi Zero (W) USB-HUB+RTC(DS1302)

市販の小型USBハブもありますがPi Zeroにとっては煩雑になりやすく使い勝手が悪いですね。

今回は前回の拡張基板と市販のUSBハブを利用してPi ZERO(W)の専用USB-HUBを作成してみました。
(作成といっても市販のハブをそのまま利用、加工するだけですが)

セリアの100均ハブ仕様

手持ちの100均ハブで作成してみました。

USB端子を4個並べたのですが右側2個がくっついてしまいました。通常のUSBケーブルは問題なく挿せるのですが少し幅のあるドングルやカードリーダーは干渉してしまいます。


リセット端子も活かしたのでGPIO37,39はジャンパー線などで接続しています。

Yahooストア¥170ハブ仕様

こちらはYahooストア(dasyn)で購入したハブ(送料¥120)です。

こっちはUSBカードリーダーを直接取り付けてみました。
中華製激安品(¥90)ですが取り敢えず問題なく認識、動作しています。


マイクロSDカードリーダーはこんな構造になっています。
取り付けは両面テープで固定、端子部はカットして直接ハンダ付けしています。


ハブ基板は外した端子のグランド側などを利用してピンを立て前後2箇所、ハンダ付けで止めています。
基板も少しカットしています。


さて肝心のハブです。こんなシールが貼ってありますがテストしてみるとハブとして4ポートとも機能していました。
チップはFE1.1Sという中華チップが載っています。

最大のネックは既存のUSB端子を取り外すことですが鉛フリーはんだは簡単に吸い取って端子を外すというわけにはいきません。
ここは大胆に(無理やり)かつ繊細に(ぶっ壊さないように)作業をします。
ここでは逆にハンダを盛ってやって熱を通り易くします。


当サイトで使用した道具です。ハンダゴテは60Wを使用しました。
万力にしっかり固定してハンダゴテで熱を加え左右少しづつドライバーでこじって引き抜いていきます。縦型のUSBは殻だけ同様に外せば端子のみ基板に残ってあとから外せます。
なお当サイトとしては万一破壊に至っても責任は持てません。(自己責任でね


なんとか破壊は免れました。
電源ラインは基板側で共通にできるのでどこか1箇所接続、あとは信号ラインを結線します。
クリスタルはRTCを組んだのでIC側に付け替えています。


カードリーダーを挿しても余裕ができました。

RTC(DS1302)の組み込み

スペースが少しあったのでDS1302を押し込んでみました。が、ここでまたハマってしまいました。

仮組みの段階ではRTCの動作を確認してからハブやら取り回しをして組み上げているのですが最後に動かしてみると動作しません。ICを入れ替えてもやはりダメですね。回路としては単純なので電圧や導通を確認しても間違いは無さそうです。現象もいろいろで最低IC内部の時計が動いていればrtc-piを実行するたびに秒数の変化があるのですがそれも動くものと動かないものがあります。
結局RTCの電源にパスコンを挿入、ハブ側のアースライン(GPIO39)とRTCのアースライン(GPIO9)に分けて正常に動く石が出てきました。それでもやはり動かない石や時刻の書き込みができない石があります。
ここで正常に動いた石は以降時刻補正や時も正常に刻んでいます。
あくまで推測の域を出ませんがこの石はノイズに弱い(Piのノイズが大きい?)のではないかと思っています。

DS1302に関しては先にモジュールとして組んだものを含めると3個は現在も正常に動いているので初期の目標は達成したということでこれでヨシということにします。PiにとってDS1302は鬼門かもしれません。
またRTCも別基板として組んでおけば必要な時に取り付けることも可能と思います。


簡単な実験や確認はこんな感じで。

USB回りもかなりスッキリしました。

Pi Zero (W) 拡張基板の作成

Pi Zero(W)はGPIO端子にピンが建っておらず自分で取り付けるようになっています。

そこでオス(ピンヘッダ)にするかメス(ピンソケット)にするかは少々迷うところです。

ブレッドボードの使用を想定するとメスが使いやすいと思います。

従来のPiの資産を利用するとなるとオスのほうがいいかなと思います。

どちらにも対応できるよう多少手間と部品が必要になりますが拡張ボードを作成してみました。

部品はコストを最小限に抑えるため汎用の40pinシングルのピンヘッダ、ソケットを基板は7cmx5cmの両面基板を使用します。

当サイトでは従来のPiに合わせてオス(ピンヘッダ)を取り付けています。

Pi Zero(W)はアルミ板ベースに取り付けてみました。
取り付け穴は2.6mmボルトを使用するようになっていますが3.2mmのドリルで揉んで3mmボルトで固定しています。


部品は多少納期がかかりますがAmazonで40pinピンヘッダ、ソケットSET10pcs(¥170)基板10pcs(¥360)程度で購入できます。

まずは真ん中のソケットから取り付けます。


ハンダ付けしたら隣のランドとハンダブリッジをします。

30W位のコテで少し冷やしながら手早くハンダをもります。
うまく載らない時は一旦冷ましてからトライしましょう。


反対側のさらに隣にピンヘッダ(またはソケット)を取り付けます。

間にあるハンダブリッジの部分は以降極力使用しないことにします。
万一ブリッジが離れてしまうと修正が困難になります。


こちらも同様にハンダブリッジをします。
ここは先に比べるとブリッジが載りやすくなっていると思います。(但しやはり手早くね)
これで表裏つながりました。何かハンダで接続する際はこちら側を使用します。


Zeroに取り付けてみました。
奥側のピンを使用する時はジャンパー線で接続することにします。
この基板自体は自作の回路か何かに使用します。特にGPIOを使用しなくてもPiと合体して使う目的でであれば何でもいいと思います。
さらにもう1枚今回の例では表裏メスメスで基板を作成すればGPIOはオスからメスに変換されることになります。
縦方向には増やすことができるので目的別に基板を作成することも可能と思います。

作り方、使い方はアイデア次第といったところでしょうか。

次回、この基板を使ってUSB-HUBを作成してみます。

Pi Zero W を購入してみた

発売延期をしていたPi Zero Wですがやっと国内販売を開始しましたがやはりというかやっぱり買えそうにありませんね。

先週の木曜日ですが国内販売のニュースを見た際にZeroの経緯もあり抑えとしてpimoroniに注文してみました。

もう少し時間がかかると思っていたのですが本日到着していました。

英国からのエアメール。実質6日間できています。

プチプチの入った封筒の簡単な包装ですがZeroも薄いので大丈夫でした。

価格も為替相場で変動がありますが今回は2015円と国内(KSY)より僅かに安い!


こうやってZeroと比べてみるとBCM2835の搭載位置が違いますね。

Pi Zero のカードで簡単に起動テストをしてみました。
/etc/dhcpcd.confにはwlan0に固定IPを割り当てています。

interface wlan0
static ip_address=192.168.0.11/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

内蔵のWifiはZeroのカードそのままで動きますね。
外付けのドングルを使用すると外付けが優先して内蔵はwlan1となるようです。

以下、今回購入した簡単な流れです。(大雑把ですが)
購入方法もわかりやすくクレジットカードも使えます。

国内でもまだチャンスはありますが今回どうしても買えなかったという場合は一考の余地はあると思います。

pimoroni

赤(Raspberry Pi 3)にフォーカスを当てRaspberry Pi Zero Wを選択


In Stock 在庫あり カートに入れる

一番上に戻ってカートをクリック

Pi単体の複数注文、zero及びzero-wの同時注文は不可のようです。


ほかの商品もどうだときますがここは一番下のボタンをクリック


よければCheckout now をクリック

次の画面で名前、住所を入力します。
当方はローマ字で入れておきました。
電話は+81 ○○ ○○○ ○○○○


送料は一番安いやつを


クレジット情報を入力

以上で完了です。

Raspberry Pi ZERO RTC(DS1302) 時刻を保持する

今回はDS1302でRTCを設定してみたいと思います。

DS1302モジュールはArudino用としてかなり安価に出回っているようです。
多くのサイトはArudino用モジュールで解説しており素のICを使用する際、端子表記が異なるためわかりにくい(間違えやすい)原因になっているものと思います。(当サイトも当初接続を間違えてしまいました(・・;)

その中で制御プログラム、解説もわかりやすかったのはこちらのサイト
Using a DS1302 Real Time Clock module on Raspberry PI
DS1302 データシート

環境
Raspberry Pi ZERO jessie-lite

pi@zero:~ $ uname -a
Linux zero 4.9.28+ #998 Mon May 15 16:50:35 BST 2017 armv6l GNU/Linux


当サイトで購入した時はICのみ10個で¥194でした。

8ピンDIPタイプなので工作がしやすく1枚の自作基板にほかの回路と一緒に組むにはいい素材と思います。


回路は非常に単純で基本IC以外はクリスタル(32.768KHz)と電池のみになります。(別途電池ソケットやピンヘッダ等必要ですが)

# パスコンを追加しました。


クリスタルは古いマザボから、電池は賞味期限のとうに切れたリチウム電池(3.6V)を再利用。
電池自体はまだまだ元気なので廃品利用します。
コイン電池でも動作は確認しています。

プログラム
上記のサイトからrtc-pi-20140727.zipを適当なディレクトリにダウンロードして展開、コンパイルします。

$ unzip rtc-pi-20140727.zip
Archive:  rtc-pi-20140727.zip
  inflating: rtc-pi.c
$ cc rtc-pi.c -o rtc-pi

rtc-piができるので/usr/sbinにコピーします。

$ sudo cp rtc-pi /usr/sbin

モジュールに現在の時刻を書き込みます。

$ sudo rtc-pi YYYYMMDDhhmmss
Set UNIX timestamp to RTC: 1234567890

モジュールから時刻を読みだしてシステムクロックにセットします。

$ sudo rtc-pi

簡単ですね。Pi1B(Rev2)以降であれば特にソースプログラムは変更無しで動作するものと思います。

起動設定
ntpとfake-hwclockを停止します。

# systemctl stop ntp
# systemctl disable ntp
# systemctl stop fake-hwclock
# systemctl disable fake-hwclock

起動は/etc/rc.localに設定します。rtc-piのみでは
# systemctl status rc.local -l
Warning: Unit file changed on disk, ‘systemctl daemon-reload’ recommended.
こんなメッセージが出てるのでsystemctl daemon-reloadも記載しておきます。

/usr/sbin/rtc-pi
systemctl daemon-reload

exit 0

ここで# poweroffしてPiの電源コードも抜いて数分置いてから再投入します。

起動確認

$ timedatectl
RTC timeはi2c経由ではないため取得できません。

またfake-hwclockもわかりやすくするため停止していますがds1302の場合はenableでも問題ないように思います。

現在時刻がセットされてるでしょうか。
% date
1970年 1月 1日 木曜日 09:01:04 JST
Piの初期値 ハード、ソフト、起動設定など見直してみましょう。

% date
2000年 1月 31日 月曜日 02:01:40 JST
DS1302の初期値 DS1302から読み込みはできているがDS1302に書き込みの際失敗している。
Pin11(CE)とPin13(SCLK)の接続が逆になっているかも。
ICが壊れているかも。

また$ sudo rtc-piを実行した際下記のエラーがでる。
Read UNIX timestamp from RTC: -1
Unable to change the system time. Did you run the program as an administrator?
The operation returned the error message “Invalid argument”
Pin11-SCLK,Pin13-CEの接続ミスで且つI/Oをプルアップしているとこのエラーが発生します。
当サイトの失敗がこれでした。
Pin11とPin13の接続ミスは単に凡ミスですが他サイトの記述にはI/Oを10k抵抗でプルアップするような情報があります。当サイトの環境では特にプルアップなしでも問題は無いようです。
このエラーはネットを探索するとちらほら散見されるので間違いやすい何かがあるのか、またほかにもこのエラーが発生する何かがあるのかもしれません。

時刻補正
参考サイトにあるbashスクリプトは時折ネットに接続できる環境がありntpで取得した時刻をshutdown時にDS1302モジュールに書き込むようになっていますが現在のjessieではsystemdになっているため簡単にこの手法は使えません。

時計を見ながら手動で補正

$ sudo rtc-pi 20170703190000
Set UNIX timestamp to RTC: 1499076000

ネットに接続して補正

# apt install ntpdate
# ntpdate -v ntp.nict.jp
3 Jul 19:06:00 ntpdate[1595]: ntpdate 4.2.6p5@1.2349-o Mon Jul 25 22:35:35 UTC 2016 (1)
 3 Jul 19:06:08 ntpdate[1595]: adjust time server 133.243.238.244 offset -0.000792 sec
# rtc-pi `date +"%Y%m%d%H%M%S"`
Set UNIX timestamp to RTC: 1499076410

精度はあきらかにDS3121のほうが超高精度を謳ってるだけあって良いようです。
DS1302はクリスタルの精度次第と思いますが当サイトでは1日に10秒近く誤差が生じます。

Top