555タイマーICと圧電スピーカーでアナログシンセもどきを作ってみる

555タイマーIC(集積回路)を発振回路として使うと、さまざまな周波数の矩形波を作ることができる。 また、圧電スピーカーを使うと、一定の周波数で電圧を変化させることにより音を出すことができる。 ここでは、これらと半固定抵抗を組み合わせ、単純な回路によるアナログシンセサイザーもどきを作ってみる。

部品調達

アナログシンセサイザーの仕組み

シンセサイザーには、大きく分けてアナログ回路を用いるアナログシンセサイザーと、デジタル信号処理を用いるデジタルシンセサイザーがある。 また、音を合成する方法にも、基本波形に周波数フィルタをかける減算合成、複数の基本波形を重ねる加算合成、周波数変調(FM)等の変調方式をもとにした変調合成などがある(参考)。

減算合成によるアナログシンセサイザーの仕組みについては、次のサイトがわかりやすい。

f:id:inaz2:20160908224634p:plain

(上記サイトより引用)

上の図におけるそれぞれの回路の役割を簡単にまとめると次のようになる。

  • VCO (Voltage-controlled Oscillator)
    • 正弦波や矩形波などの基本波形を作る。音色、音程に相当
  • VCF(Voltage-controlled Filter)
    • ローパスフィルタやハイパスフィルタなどの周波数フィルタをかける。音のゆがみに相当
  • VCA(Voltage-controlled Amplifier)
    • 波の振幅を変化させる。音量に相当
  • LFO(Low-frequency Oscillator)
    • 1Hz~20Hz程度の低周波数で上記の電圧を変化させる。ビブラートやワウワウ、トレモロに相当
  • EG(Envelope Generator)
    • キーボードを押した後の音の変化を再現する

一般的なアナログシンセはさまざまな基本波形やフィルタを備えているが、ここではできるだけ単純な回路となるように、

  • VCOは555タイマーICによる矩形波のみ
  • VCFは一次RCローパスフィルタ、一次RCハイパスフィルタの組み合わせ
  • VCAはオペアンプ反転増幅回路
  • LFOは555タイマーICによる矩形波に一次RCローパスフィルタ
  • EG、キーボードなし

のアナログシンセもどきを作ってみることにする。

基本回路図

555タイマーICによる発振回路は次で表される。

f:id:inaz2:20160908234310p:plain

OUTからは矩形波が表れ、その発振周波数は 1/(ln(2)*C*(R1+2*R2)) 、デューティー比は (R1+R2)/(R1+2*R2) である。

1次RCローパスフィルタ、一次RCハイパスフィルタは次で表わされる。

f:id:inaz2:20160908234321p:plain

ローパスフィルタはカットオフ周波数を越える周波数成分を弱める働きをする。 一方、ハイパスフィルタはカットオフ周波数を下回る周波数成分を弱める働きをする。 カットオフ周波数はどちらの場合も 1/(2*pi*R*C) である。

オペアンプ反転増幅回路は次で表される。

f:id:inaz2:20160911173531p:plain

マイナスの電圧の -R2/R1 倍が出力電圧として表れる。 また、R3はプラス側とマイナス側に流れる電流の差(バイアス電流)を打ち消すためのものであり、その抵抗値はR1とR2の並列抵抗の値となる。 なお、オペアンプ非反転増幅回路は1未満の増幅率にできないため、今回の例には適さない。

全体回路図

f:id:inaz2:20160908234341p:plain

上の回路では、半固定抵抗でそれぞれの電圧調整を行う。 また、タクトスイッチでLFOのオンオフを切り替え、これに合わせてLEDが光るようになっている。

上の回路において、LFOのOUT(3番ピン)はローパスフィルタを通してVCOのCTRL(5番ピン)に繋がっており、パルス位置変調により発振周波数を揺らす働きをする。 また、タクトスイッチはLFOのVccに繋がっており、オンにすることでLFOが発振する。

発振回路の周波数やRCフィルタのカットオフ周波数は以下のページで計算できる。

上の回路において、半固定抵抗による変域の理論値は次のようになる。

  • VCO: 140.8Hz~5842Hz
  • VCF LPF: 79.58Hz~無限大
  • VCF HPF: 79.58Hz~無限大
  • VCA: 0~100倍
  • LFO: 1.408Hz~58.42Hz
  • LFO LPF: 15.92Hz

実際にブレッドボード上に作った回路の写真を次に示す。

f:id:inaz2:20160908234819p:plain

鳴らしてみる

9V電池を繋いで鳴らしてみると、次の動画のようになる。

半固定抵抗およびタクトスイッチの操作により、それぞれ期待する効果が得られていることが確認できる。

関連リンク

Raspberry Pi 3でパケットキャプチャ用無線アクセスポイントを作る

Raspberry Pi 3にはWi-Fiモジュール(Broadcom BCM43438)が搭載されているが、このモジュールはクライアントとしてだけではなく、アクセスポイントとして動作させることもできる。 ここでは、Raspberry Pi 3でDHCPサーバ付き無線ルータを作り、アクセスポイントに接続するだけで簡単にパケットキャプチャできるようにしてみる。

環境

Raspberry Pi 3 Model B (Raspbian Jessie Lite)

$ uname -a
Linux raspberrypi 4.4.9-v7+ #884 SMP Fri May 6 17:28:59 BST 2016 armv7l GNU/Linux

$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

無線インタフェースが対応している動作モードの確認

次のコマンドで、無線インタフェースが対応している動作モードを調べることができる。

$ iw list
Wiphy phy0
(snip)
        Supported interface modes:
                 * IBSS
                 * managed
                 * AP
                 * P2P-client
                 * P2P-GO
                 * P2P-device
(snip)

上の結果より、クライアントとして動作するmanagedモードに加え、アクセスポイントとして動作するAPモードをサポートしていることがわかる。

無線インタフェースのIP設定

以降、上流の有線ネットワークを192.168.0.0/24、作成する無線ネットワークを192.168.1.0/24とする。 また、IPv6についてはUnique Local IPv6 Unicast Address(ULA)を用い、IPv4同様別セグメントを作ることにする。 ここでは、そのセグメントをfdXX:XXXX:XXXX:1::/64で表し、Xの部分にはランダムに生成した値が入るものとする(参考)。

まず、無線インタフェースwlan0のIPアドレスを192.168.1.1およびfdXX:XXXX:XXXX:1::1に設定する。

$ sudo vi /etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
iface wlan0 inet6 static
address fdXX:XXXX:XXXX:1::1
netmask 64
#iface wlan0 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

hostapdの設定

次に、hostapdをインストールし、無線アクセスポイントの設定を行う。

$ sudo apt-get install hostapd
$ sudo sh -c "zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz > /etc/hostapd/hostapd.conf"
$ sudo vi /etc/hostapd/hostapd.conf
interface=wlan0
ssid=raspberrypi_nomap
wpa=2
wpa_passphrase=SECRETPASSPHRASE
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

一時的にhostapdを起動し、他の端末から設定したSSIDが見えていることを確認する。

$ sudo hostapd /etc/hostapd/hostapd.conf

SSIDが確認できたら、OS起動時にhostapdが自動起動するように設定する。

$ sudo vi /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"

dnsmasqの設定

無線ネットワークにおけるDHCP/DNSサーバとして、dnsmasqをインストールする。

$ sudo apt-get install dnsmasq

続けて、設定ファイルを編集する。

$ sudo vi /etc/dnsmasq.conf
no-resolv
no-poll
interface=wlan0
enable-ra
dhcp-range=192.168.1.101,192.168.1.200
dhcp-range=::,constructor:wlan0,ra-stateless
server=192.168.0.1

上の設定は、wlan0インタフェースにDHCPv4で192.168.1.101-200を配り、IPv6ではDHCPv6サーバを使用したステートレス自動設定を行う。 また、dnsmasqが参照するDNSサーバについては/etc/resolv.confを参照せず、有線ネットワーク側のDNSサーバ(192.168.0.1)を直接指定している。

パケット転送およびNAPTの設定

IPv4IPv6のそれぞれについてパケット転送を行うように設定する。

$ sudo vi /etc/sysctl.conf
net.ipv4.conf.all.forwarding = 1
net.ipv6.conf.all.forwarding = 1

次に、iptables-persistentをインストールし、無線ネットワークからeth0に転送されるパケットについてNAPT(IPマスカレード)を行うように設定する。

$ sudo apt-get install iptables-persistent
$ sudo vi /etc/iptables/rules.v4
# Generated by iptables-save v1.4.21 on Thu Sep  1 23:52:33 2016
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Sep  1 23:52:33 2016
# Generated by iptables-save v1.4.21 on Thu Sep  1 23:52:33 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Thu Sep  1 23:52:33 2016

$ sudo vi /etc/iptables/rules.v6
# Generated by ip6tables-save v1.4.21 on Mon Sep  5 01:44:20 2016
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s fdXX:XXXX:XXXX:1::/64 -o eth0 -j MASQUERADE
COMMIT
# Completed on Mon Sep  5 01:44:20 2016
# Generated by ip6tables-save v1.4.21 on Wed May 25 21:30:37 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Wed May 25 21:30:37 2016

なお、「Raspberry PiでIPv6 PPPoE対応ルータを作る」で説明した方法でRaspberry PiをPPPoEルータにしている場合は、IPv6のNAPTインタフェースをeth0からppp0に変える必要がある。

最後にRaspberry Piを再起動し、wlan0に指定したIPアドレスが割り当てられていること、hostapd/dnsmasqが起動していることを確認する。

$ sudo reboot
$ ip addr
(snip)
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet 169.254.120.61/16 brd 169.254.255.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fdXX:XXXX:XXXX:1::1/64 scope global
       valid_lft forever preferred_lft forever
(snip)

$ systemctl status hostapd
● hostapd.service - LSB: Advanced IEEE 802.11 management daemon
   Loaded: loaded (/etc/init.d/hostapd)
   Active: active (running) since Mon 2016-09-05 03:18:44 JST; 4min 45s ago
  Process: 1319 ExecStart=/etc/init.d/hostapd start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/hostapd.service
           └─1534 /usr/sbin/hostapd -B -P /run/hostapd.pid /etc/hostapd/hostapd.conf

$ systemctl status dnsmasq
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled)
  Drop-In: /run/systemd/generator/dnsmasq.service.d
           └─50-dnsmasq-$named.conf, 50-insserv.conf-$named.conf
   Active: active (running) since Mon 2016-09-05 03:18:07 JST; 5min ago
  Process: 712 ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf (code=exited, status=0/SUCCESS)
  Process: 642 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=0/SUCCESS)
  Process: 553 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)
 Main PID: 711 (dnsmasq)
   CGroup: /system.slice/dnsmasq.service
           └─711 /usr/sbin/dnsmasq -x /var/run/dnsmasq/dnsmasq.pid -u dnsmasq -r /var/run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19...

無線アクセスポイントを通る通信をパケットキャプチャしてみる

パケットキャプチャを行うために、tcpdumpをインストールする。

$ sudo apt-get install tcpdump

wlan0インタフェースに対してtcpdumpを実行し、Android端末から無線アクセスポイントに接続してみる。

$ sudo tcpdump -i wlan0 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
03:34:55.912458 ba:27:eb:XX:XX:XX > b8:27:eb:XX:XX:XX, ethertype Unknown (0x886c), length 74:
        0x0000:  8001 0068 0000 1018 0001 0002 0000 0000  ...h............
        0x0010:  0004 0000 0000 0000 0000 0000 0000 0000  ................
        0x0020:  0000 90b6 86c3 2241 776c 3000 0000 0000  ......"Awl0.....
        0x0030:  0000 0000 0000 0000 0000 0000            ............
03:34:55.924089 90:b6:86:XX:XX:XX > ff:ff:ff:ff:ff:ff Null Unnumbered, xid, Flags [Response], length 6: 01 00
03:34:55.925734 ba:27:eb:XX:XX:XX > b8:27:eb:XX:XX:XX, ethertype Unknown (0x886c), length 229:
        0x0000:  8001 0103 0000 1018 0001 0002 0000 0000  ................
        0x0010:  0008 0000 0000 0000 0000 0000 0000 0000  ................
        0x0020:  009b 90b6 86c3 2241 776c 3000 0000 0000  ......"Awl0.....
        0x0030:  0000 0000 0000 0000 0000 0011 7261 7370  ............rasp
        0x0040:  6265 7272 7970 695f 6e6f 6d61 7001 0882  berrypi_nomap...
        0x0050:  848b 9624 3048 6c32 040c 1218 6021 0202  ...$0Hl2....`!..
        0x0060:  1224 0201 0d30 1401 0000 0fac 0401 0000  .$...0..........
        0x0070:  0fac 0401 0000 0fac 0280 002d 1a2d 0017  ...........-.-..
        0x0080:  ff00 0000 0000 0000 0000 0000 0000 0000  ................
        0x0090:  0000 0000 0000 007f 0800 0008 8001 4000  ..............@.
        0x00a0:  40dd 1e00 904c 332d 0017 ff00 0000 0000  @....L3-........
        0x00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
        0x00c0:  00dd 0900 1018 0200 0010 0000 dd07 0050  ...............P
        0x00d0:  f202 0001 0000 00                        .......
03:34:55.930534 EAPOL key (3) v2, len 95
03:34:55.970042 EAPOL key (3) v1, len 117
03:34:55.971198 EAPOL key (3) v2, len 151
03:34:55.983969 EAPOL key (3) v1, len 95
03:34:56.051210 IP6 :: > ff02::1:XXXX:XXXX: ICMP6, neighbor solicitation, who has fe80::XXXX:XXXX:XXXX:XXXX, length 24
03:34:56.056070 IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28
03:34:56.412020 IP6 fe80::XXXX:XXXX:XXXX:XXXX > ff02::2: ICMP6, router solicitation, length 16
03:34:56.412693 IP6 fe80::XXXX:XXXX:XXXX:XXXX > fe80::XXXX:XXXX:XXXX:XXXX: ICMP6, router advertisement, length 64
03:34:56.426102 IP6 :: > ff02::1:XXXX:XXXX: ICMP6, neighbor solicitation, who has fdXX:XXXX:XXXX:1:XXXX:XXXX:XXXX:XXXX, length 24
03:34:56.437585 IP6 :: > ff02::1:XXXX:XXXX: ICMP6, neighbor solicitation, who has fdXX:XXXX:XXXX:1:XXXX:XXXX:XXXX:XXXX, length 24
03:34:56.437758 IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 2 group record(s), length 48
03:34:56.462079 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 90:b6:86:c3:22:41, length 314
03:34:56.622910 IP 192.168.1.1.67 > 192.168.1.170.68: BOOTP/DHCP, Reply, length 300
03:34:56.719521 ARP, Request who-has 192.168.1.1 tell 192.168.1.170, length 28
03:34:56.719557 ARP, Reply 192.168.1.1 is-at b8:27:eb:XX:XX:XX, length 28
03:34:57.049105 IP6 fe80::XXXX:XXXX:XXXX:XXXX > ff02::2: ICMP6, router solicitation, length 16
03:34:57.049738 IP6 fe80::XXXX:XXXX:XXXX:XXXX > fe80::XXXX:XXXX:XXXX:XXXX: ICMP6, router advertisement, length 64
03:34:59.664530 IP6 fe80::XXXX:XXXX:XXXX:XXXX > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28
03:35:01.419914 IP6 fe80::XXXX:XXXX:XXXX:XXXX > fe80::XXXX:XXXX:XXXX:XXXX: ICMP6, neighbor solicitation, who has fe80::XXXX:XXXX:XXXX:XXXX, length 32
03:35:01.549158 IP 192.168.1.170.35684 > 192.168.1.1.53: 43557+ A? connectivitycheck.android.com. (47)
03:35:01.549334 IP 192.168.1.170.43378 > 192.168.1.1.53: 12979+ A? connectivitycheck.android.com. (47)
03:35:01.549422 IP6 fe80::XXXX:XXXX:XXXX:XXXX > fe80::XXXX:XXXX:XXXX:XXXX: ICMP6, neighbor advertisement, tgt is fe80::XXXX:XXXX:XXXX:XXXX, length 32
03:35:01.558617 IP 192.168.1.1.53 > 192.168.1.170.43378: 12979 1/0/0 A 216.58.221.174 (63)
03:35:01.559263 IP 192.168.1.1.53 > 192.168.1.170.35684: 43557 1/0/0 A 216.58.221.206 (63)
03:35:01.575683 IP 192.168.1.170.51055 > 192.168.1.1.53: 36811+ AAAA? ipv4only.arpa. (31)
03:35:01.575771 IP 192.168.1.1.53 > 192.168.1.170.51055: 36811 0/0/0 (31)
03:35:01.577961 IP 192.168.1.170.40382 > 192.168.1.1.53: 53548+ A? ipv4only.arpa. (31)
03:35:01.578023 IP 192.168.1.1.53 > 192.168.1.170.40382: 53548 2/0/0 A 192.0.0.171, A 192.0.0.170 (63)
03:35:01.700229 IP 192.168.1.170.41658 > 192.168.1.1.53: 56266+ AAAA? north-america.pool.ntp.org. (44)
03:35:01.722678 IP 192.168.1.1.53 > 192.168.1.170.41658: 56266 0/1/0 (99)
03:35:01.727875 IP 192.168.1.170.55498 > 192.168.1.1.53: 51322+ A? north-america.pool.ntp.org. (44)
03:35:01.749989 IP 192.168.1.1.53 > 192.168.1.170.55498: 51322 4/0/0 A 38.229.71.1, A 206.108.0.132, A 104.156.99.226, A 69.167.160.102 (108)
03:35:01.751144 IP 192.168.1.170.33118 > 216.58.221.206.80: Flags [S], seq 2110605975, win 65535, options [mss 1460,sackOK,TS val 4294940628 ecr 0,nop,wscale 7], length 0
03:35:01.755148 IP 192.168.1.170.33459 > 38.229.71.1.123: NTPv3, Client, length 48
03:35:01.764984 IP 216.58.221.206.80 > 192.168.1.170.33118: Flags [S.], seq 2111217721, ack 2110605976, win 42540, options [mss 1414,sackOK,TS val 1370227089 ecr 4294940628,nop,wscale 7], length 0
03:35:01.767118 IP 192.168.1.170.33118 > 216.58.221.206.80: Flags [.], ack 1, win 685, options [nop,nop,TS val 4294940630 ecr 1370227089], length 0
03:35:01.770321 IP 192.168.1.170.33118 > 216.58.221.206.80: Flags [P.], seq 1:430, ack 1, win 685, options [nop,nop,TS val 4294940630 ecr 1370227089], length 429
03:35:01.783798 IP 216.58.221.206.80 > 192.168.1.170.33118: Flags [.], ack 430, win 341, options [nop,nop,TS val 1370227108 ecr 4294940630], length 0
03:35:01.783914 IP 216.58.221.206.80 > 192.168.1.170.33118: Flags [P.], seq 1:103, ack 430, win 341, options [nop,nop,TS val 1370227108 ecr 4294940630], length 102
03:35:01.784154 IP 216.58.221.206.80 > 192.168.1.170.33118: Flags [F.], seq 103, ack 430, win 341, options [nop,nop,TS val 1370227108 ecr 4294940630], length 0
03:35:01.786455 IP 192.168.1.170.33118 > 216.58.221.206.80: Flags [.], ack 103, win 685, options [nop,nop,TS val 4294940632 ecr 1370227108], length 0
03:35:01.786945 IP 192.168.1.170.33118 > 216.58.221.206.80: Flags [F.], seq 430, ack 104, win 685, options [nop,nop,TS val 4294940632 ecr 1370227108], length 0
03:35:01.800821 IP 216.58.221.206.80 > 192.168.1.170.33118: Flags [.], ack 431, win 341, options [nop,nop,TS val 1370227125 ecr 4294940632], length 0
(snip)
03:35:31.574015 IP 192.168.1.170.64782 > 192.168.1.1.53: 53427+ AAAA? inaz2.hatenablog.com. (38)
03:35:31.583433 IP 192.168.1.1.53 > 192.168.1.170.64782: 53427 0/1/0 (122)
(snip)
03:35:31.610380 IP 192.168.1.170.42707 > 192.168.1.1.53: 43177+ A? inaz2.hatenablog.com. (38)
(snip)
03:35:31.684565 IP 192.168.1.1.53 > 192.168.1.170.42707: 43177 1/0/0 A 52.197.171.58 (54)
(snip)

上の結果から、接続したAndroid端末の通信をキャプチャできていることが確認できる。

注意事項

作成したアクセスポイントは、適切なパスフレーズを設定し、自身の利用においてのみ使用すること。 無断で第三者の通信を取得した場合、不正アクセス禁止法等に抵触するおそれがある。

関連リンク

整流回路とオペアンプ増幅回路でWi-Fi電波を可視化してみる

次のページを参考に簡易電界強度計を作り、Wi-Fi 2.4GHzの電波強度をLEDで可視化してみる。

部品調達

回路図

上のページで利用しているショットキーバリアダイオード1SS108は生産終了品になっているので、代わりに1N60を用い、次のような回路を作る。

f:id:inaz2:20160828020826p:plain

上の回路は、アンテナに生じる交流電圧を倍電圧整流回路(左半分、動作イメージ)で直流にし、オペアンプによる非反転増幅回路(右半分、動作イメージ)で電圧を増幅する。 ここで、非反転増幅回路における増幅率は 1 + 1MΩ/1kΩ = 1001倍 である。 また、二つの回路の間にある抵抗は、オペアンプのプラス側とマイナス側に流れる電流の差(バイアス電流)を打ち消すためのものであり、その抵抗値は1kΩと1MΩの並列抵抗の値(約1kΩ)となる。

アンテナには、2.4GHz(波長12.49cm)で共振する、次のような半波長ダイポールアンテナを用いる。 ここでは、すずメッキ線を切って作ったが、針金やジャンパワイヤで作ってもよい。

f:id:inaz2:20160826003812p:plain

また、LM358ANには二つのオペアンプが入っており、ピン配置は次のようになっている(データシートより引用)。

f:id:inaz2:20160823174836g:plain

実際にブレッドボード上に作った回路の写真を次に示す。

f:id:inaz2:20160826003824p:plain

Wi-Fi電波を可視化してみる

2.4GHz通信を有効にした無線ブロードバンドルータに近づけてみると、次の動画のようになる。

同じく2.4GHz帯の電波を利用する電子レンジに近づけてみると、次の動画のように、より強くLEDが光ることがわかる。

関連リンク

非安定マルチバイブレータ回路でLEDを点滅させてみる

電子工作の練習として、簡単な回路を作ってみる。

部品調達

必要な部品がセットになった商品があるので、これを利用する。 また、この商品はスズメッキ線を切って繋ぐようになっているが、いちいちワイヤを切るのも面倒なのでジャンパワイヤセットを用意した。 ニッパーやピンセットは100円均一のもので十分である。

回路図

このセットの回路図は次のようになっている(取扱説明書より引用)。

f:id:inaz2:20160822205104p:plain

LEDの点灯時間の理論値は ln(2) * R * C = ln(2) * 47kΩ * 47uF = 1.53 sec となる。

次のページで、回路シミュレータによる動作のイメージを見ることができる。

LEDを点滅させてみる

ブレッドボード上に回路を組み立て、電池に繋いでみると、次の動画のようになる。

片方のLEDを3Vで動作する電子ブザーPB04-SE12HPRに変えてみると、次の動画のようになる。

関連リンク

GNU RadioでFMラジオ受信機を作ってみる

「Raspberry PiとUSBチューナー(RTL2832U+R820T)でFMラジオを受信してみる」では、市販のUSBチューナーを使ってFMラジオを受信してみた。 ここでは、SDR(Software-defined Radio)ツールであるGNU Radioを使ってFMラジオ受信機を作ってみる。

環境

Windows 10 Pro 64 bit版、Intel® Core™ i5-4200U Processor (3M Cache, up to 2.60 GHz)

>systeminfo
OS 名:                  Microsoft Windows 10 Pro
OS バージョン:          10.0.10586 N/A ビルド 10586
OS ビルドの種類:        Multiprocessor Free
システムの種類:         x64-based PC
プロセッサ:             1 プロセッサインストール済みです。
                        [01]: Intel64 Family 6 Model 69 Stepping 1 GenuineIntel ~1596 Mhz

GNU Radioのインストール

GNU Radioは、用意された変調・復調や周波数フィルタを行うブロックを組み合わせることで、柔軟にデジタル信号処理を行うことができるソフトウェアである。 ここでは、Windows上にGNU Radioをインストールし、RTL2832U+R820Tで受信した信号をTCP経由で受け取り処理することを考える。

まず、64 bit Windows版のダウンロードページから「Windows Installer」をダウンロードする。 ここでは利用するCore i5-4200UプロセッサがHaswellアーキテクチャであることから、「64-bit HASWELL+ (AVX2) CPU」版をダウンロードした。

インストーラを起動し既定の設定でインストールを行うと、スタートメニューの「すべてのアプリ」に「GNU Radio」フォルダが作成される。 この中の「GNURadio Companion」を実行すると、次のスクリーンショットのようなGUIアプリケーションが起動する。

f:id:inaz2:20160806003215p:plain

FMラジオ受信機を作成する

右のメニューからブロックを選択し、FMラジオ受信機を作成すると次のようになる。

f:id:inaz2:20160806003228p:plain

GNU Radioで作成したダイアグラムは拡張子grcのXMLファイルとして保存できる。 上のgrcファイルを次に示す。

この受信機の構成を簡単に説明すると次のようになる。

  1. RTL-SDR Source: TCP経由でI/Q信号を受信する(受信周波数80.0 MHz、サンプリングレート1200000 samples/sec、RF Gain 40 db)
  2. Low Pass Filter: ダウンサンプリングの前にナイキスト周波数を越える高周波をカットする(カットオフ周波数100 KHz、トランジション幅10 KHz)
  3. Rational Resampler: ダウンサンプリングを行う(サンプリングレート200 KHz)
  4. WBFM Receive: Wideband FMの復調を行い、48 KHzのPCM音声に変換(直交レート192 KHz、音声デシメーション1/4)
  5. FM Deemphasis: デエンファシスを行う(時定数50μs)
  6. Multiply Const: 音量調整を行う(5倍)
  7. Audio Sink: 音声を出力する(サンプリングレート48 KHz)

なお、スクリーンショットの左側にあるいくつかのパラメータは変数として定義している。 また、各ブロックについている端点の色はデータ型を表し、水色は複素数、オレンジ色は浮動小数点数を意味する。

Run→Execute(F6キー)を選択すると、次のスクリーンショットのようなウィンドウが表示され、FMラジオ(TOKYO FM 80.0 MHz)の音声が流れることが確認できる。

f:id:inaz2:20160806003245p:plain

関連リンク

大手サービスの行動履歴データの扱いについてまとめてみる

GoogleFacebookなどのWebサービスAdWords、DoubleClickなどの広告ネットワークは、ユーザのアクセス履歴や訪問サイト・検索ワード等を収集し、サービスのパーソナライズや広告表示に利用していることが知られている。 ここでは、そのような行動履歴データの取り扱いポリシーとサービスへの適用可否の設定方法についてまとめてみる。

Google

Googleが収集しているデータについては次に説明がある。

アカウントに関連付けられたデータの一部は次から確認できる。

サービスへの適用可否については、次のページから設定できる。

また、GoogleYouTubeGoogle AnalyticsAdWords、AdMob、DoubleClickと互いにデータを共有しており、収集されたデータは広告表示に適用される。 広告表示への適用可否については、次のページから設定できる。

Facebook

Facebookが収集しているデータについては次に説明がある。

アカウントに関連付けられた広告属性は次のページから確認できる。

広告表示への適用可否については、次のページから設定できる。

Twitter

Twitterが収集しているデータについては次に説明がある。

アカウントに関連付けられたデータの一部は次から確認できる。

サービスへの適用可否については、次のページから設定できる。

Amazon.co.jp

Amazonが収集しているデータについては次に説明がある。

アカウントに関連付けられた閲覧履歴は次から確認できる。

広告表示への適用可否については、次のページから設定できる。

補足

行動履歴データの収集と利用はサービスや広告配信の品質向上に活用されている一方、プライバシー侵害への懸念もあり、各社がプライバシーポリシーを表明し運用している現状にある。 また、このようなデータ収集はログインしていない際にも行われている可能性が極めて高く、ログイン後のアカウント情報と結び付けられる危険性がある。 広告サービスを提供する企業のうち、Network Advertising Initiativeに加盟している企業については、次のページから広告における行動履歴データの利用をオプトアウトすることができるが、「オプトアウトを表明した」という記録が行われることに注意が必要である。

ユーザ側での対策としては、ブラウザにおけるプライベートブラウジングモードの利用、サードパーティーCookieの拒否、NoScriptによるクロスオリジンリソースの制限、AdBlockや/etc/hostsによるドメインブラックリストの利用が考えられる。 ただし、このような対策を行った上でも、IPアドレスとアクセス時刻の組の収集によりある程度の個人特定が可能である。 また、近年ではBrowser Fingerprintと呼ばれる環境情報の収集により、高い精度で個人特定が可能であることが報告されている。

関連リンク

Raspberry PiとUSBチューナー(RTL2832U+R820T)でFMラジオを受信してみる

Raspberry Piに市販のUSBチューナーを接続して、FMラジオを受信してみる。 また、受信している電波の周波数スペクトルを表示してみる。

環境

Raspberry Pi 3 (Raspbian Jessie Lite)

$ uname -a
Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux

$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

USBチューナーを用意する

ここでは、USBチューナーとしてRTL2832U+R820Tを利用する。 このチューナーで受信できる周波数レンジは24-1766MHzである。

Raspberry PiのUSBポートに接続し、デバイスが認識されていることを確認する。

$ lsusb
Bus 001 Device 008: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T

RTL-SDRのインストール

RTL2832Uに対応したSDR(Software-defined Radio)ツールであるRTL-SDRをインストールする。

$ sudo apt-get install rtl-sdr

テストコマンドを実行するとカーネルドライバと競合している旨のエラーが表示されるので、該当するカーネルモジュールをブラックリストに指定し再起動する。

$ sudo rtl_test
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM

Kernel driver is active, or device is claimed by second instance of librtlsdr.
In the first case, please either detach or blacklist the kernel module
(dvb_usb_rtl28xxu), or enable automatic detaching at compile time.

usb_claim_interface error -6
Failed to open rtlsdr device #0.
$ sudo vi /etc/modprobe.d/rtlsdr-blacklist.conf
blacklist dvb_usb_rtl28xxu

$ sudo reboot

改めてテストコマンドを実行すると、正常に動作していることを確認できる。

$ sudo rtl_test
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...
^CSignal caught, exiting!

User cancel, exiting...
Samples per million lost (minimum): 0

FMラジオを受信してみる

RTL-SDRにはFM復調を行うrtl_fmコマンドが同梱されている。 例としてTOKYO FM(80.0 MHz)を復調すると、次のようなバイト列が得られる。

$ rtl_fm -f 80.0M -M wbfm -s 200000 -r 48000 - | od -tx1z | head
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 80316000 Hz.
Oversampling input by: 6x.
Oversampling output by: 1x.
Buffer size: 6.83ms
Sampling at 1200000 S/s.
Output at 200000 Hz.
0000000 72 03 07 0c 5d 0a f2 05 ff fe c2 00 47 09 21 05  >r...].......G.!.<
0000020 17 ff 61 03 fb 03 9a 00 5a f5 18 fd fd fe c2 04  >..a.....Z.......<
0000040 12 ff 58 f7 cc f4 36 fd 80 ff be f9 63 fc 9e fb  >..X...6.....c...<
0000060 45 f5 d4 f8 0d fe f2 fc bd f8 21 f7 ae f0 84 f9  >E.........!.....<
0000100 4b f7 82 f5 21 f8 65 ff af 02 37 fe 77 f7 b5 f0  >K...!.e...7.w...<
0000120 e4 f2 04 ee 15 ec f8 f3 74 f1 c2 f7 4a f5 25 ef  >........t...J.%.<
0000140 af ed 94 f5 f6 f2 ed ef 80 f0 12 eb ce e4 31 ea  >..............1.<
0000160 b3 ea fd eb fc ec ed f3 e5 f2 91 f1 2f f1 b9 ef  >............/...<
0000200 33 f1 21 ec 89 e9 97 ec aa f3 b0 f4 d0 f2 2f f5  >3.!.........../.<
0000220 c2 f3 92 fa ff f6 a3 f9 3a fd cd ff ce 00 c9 ff  >........:.......<
Signal caught, exiting!

User cancel, exiting...

rtl_fmコマンドのオプションの意味は次の通り。

  • -f 80.0M: 受信周波数を80.0 MHzに合わせる
  • -M wbfm: 復調モードとしてWideband FMを指定
  • -s 200000: サンプリングレートを200 KHzに指定
  • -r 48000: リサンプリングレートを48 KHzに指定

得られたバイト列を次のようにaplayコマンドに渡すと、ALSAバイスからFMラジオの音声が流れる。

$ rtl_fm -f 80.0M -M wbfm -s 200000 -r 48000 - | aplay -r 48k -f S16_LE

aplayコマンドのオプションの意味は次の通り。

  • -r 48k: サンプリングレートを48 KHzとして再生
  • -f S16_LE: 入力バイト列をリトルエンディアンの16ビット符号付き整数として扱う

WAV形式で録音する場合は、avconvをインストールして次のようにすればよい。

$ sudo apt-get install libav-tools

$ rtl_fm -f 80.0M -M wbfm -s 200000 -r 48000 - | avconv -ar 48k -f s16le -t 10 -i - test.wav

$ aplay test.wav

上ではtest.wavに10秒間録音した後、再生している。

SDR#で周波数スペクトルを表示してみる

SDR#Windows用のSDRツールであり、GUIでスペクトルアナライザの表示や音声の復調・ノイズ除去を行うことができる。 ここでは、Raspberry Piで受信した電波をTCPを介してWindows端末のSDR#に転送してみる。

まず、rtl_tcpコマンドを使いTCPの1234ポートでサーバを起動する。

$ rtl_tcp -a 0.0.0.0
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Tuned to 100000000 Hz.
listening...
Use the device argument 'rtl_tcp=0.0.0.0:1234' in OsmoSDR (gr-osmosdr) source
to receive samples in GRC and control rtl_tcp parameters (frequency, gain, ...).

Windows端末にて、ダウンロードページから「SDR Software Package」をダウンロード・展開し、SDRSharp.exeを起動する。 続けて、次のように設定を行う。

  • Sourceペインで「RTL-SDR (TCP)」を選択
  • 設定ボタンを押し、Raspberry PiIPアドレスを指定
  • 再生ボタンを押す
  • 再度設定ボタンを押し、RF Gainを中央まで上げる
  • RadioペインからWFMを選択し、受信したい周波数に合わせる

設定ダイアログは、設定後次のスクリーンショットのようになる。

f:id:inaz2:20160728191654p:plain

80.0 MHzを受信した際のスクリーンショットを次に示す。

f:id:inaz2:20160728191514p:plain

スペクトルアナライザにて80.0 MHz周辺に山があること、同時にWindows端末上でFMラジオの音声が流れることが確認できる。

関連リンク