旧型のBeagleBone(BBBでない方)でSerialを使おうとして、どうしてもIOからシリアル信号が出ない問題に遭遇した。左の写真が旧BeagleBone(BBW)、簡単な回路が組めるよう、Proto Cape Kitが乗せてある。基板上の配線は、マイコンのピンがケープのパッドに直結されているようであり、信号が出力されないのはマイコン側のIOマルチプレクスあたりがおかしいのでは?と思えた。が、、ネット上の情報でUART1等を有効にする方法はあるものの、自分の環境(BeagleBone + Debian 6.0)では該当するディレクトリ等が見当たらず、自分のOSが古すぎるのでは?と思えて最新版に上げることにした。
OS入りSDを作る方法として、(1)PC環境で専用のツールを使って焼く方法と、(2)Linux環境でddコマンドで/dev/sdXにじか書きする方法がある。今回は後者の方法(古いOSが走っているBeagleBoneのUSBにSDカードリーダをさして/dev/sdXXに対してddコマンドでじか書き)で作ってみた。
SDメモリをさしたSDカードリーダをBeagleBoneのUSBに挿入、dmesgの内容を確認。メッセージ内容から、SDメモリは/dev/sdbと当たりをつけた。
[ 69.400353] usb 1-1: new high speed USB device number 2 using musb-hdrc [ 69.688356] usb 1-1: New USB device found, idVendor=1307, idProduct=0330 [ 69.695478] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 69.703013] usb 1-1: Product: Mass Storage Device [ 69.707964] usb 1-1: Manufacturer: Generic [ 69.712569] usb 1-1: SerialNumber: 00000000000006 [ 69.730860] scsi0 : usb-storage 1-1:1.0 [ 69.783891] usbcore: registered new interface driver uas [ 70.731841] scsi 0:0:0:0: Direct-Access Generic USB CF Reader 0.00 PQ: 0 ANSI: 2 [ 71.509834] scsi 0:0:0:1: Direct-Access Generic USB SD Reader 0.00 PQ: 0 ANSI: 2 [ 71.520412] scsi 0:0:0:2: Direct-Access Generic USB MS Reader 0.00 PQ: 0 ANSI: 2 [ 71.529698] scsi 0:0:0:3: Direct-Access Generic USB SM Reader 0.00 PQ: 0 ANSI: 2 [ 71.547630] sd 0:0:0:0: Attached scsi generic sg0 type 0 [ 71.560778] sd 0:0:0:0: [sda] Attached SCSI removable disk [ 71.574024] sd 0:0:0:1: Attached scsi generic sg1 type 0 [ 71.582533] sd 0:0:0:2: Attached scsi generic sg2 type 0 [ 71.594051] sd 0:0:0:1: [sdb] 15693824 512-byte logical blocks: (8.03 GB/7.48 GiB) [ 71.606348] sd 0:0:0:2: [sdc] Attached SCSI removable disk [ 71.618846] sd 0:0:0:3: Attached scsi generic sg3 type 0 [ 71.628592] sd 0:0:0:1: [sdb] Write Protect is off [ 71.633814] sd 0:0:0:1: [sdb] Mode Sense: 03 00 00 00 [ 71.641372] sd 0:0:0:3: [sdd] Attached SCSI removable disk [ 71.648957] sd 0:0:0:1: [sdb] No Caching mode page present [ 71.654876] sd 0:0:0:1: [sdb] Assuming drive cache: write through [ 71.674647] sd 0:0:0:1: [sdb] No Caching mode page present [ 71.680574] sd 0:0:0:1: [sdb] Assuming drive cache: write through [ 71.692887] sdb: sdb1 [ 71.711977] sd 0:0:0:1: [sdb] No Caching mode page present [ 71.717770] sd 0:0:0:1: [sdb] Assuming drive cache: write through [ 71.724317] sd 0:0:0:1: [sdb] Attached SCSI removable disk
fdiskでも再確認、パーティションにアクセスでき、FAT32、8GBになっているので、これでよし。
root@debone:~# fdisk /dev/sdb WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): p Disk /dev/sdb: 8035 MB, 8035237888 bytes 229 heads, 20 sectors/track, 3426 cylinders Units = cylinders of 4580 * 512 = 2344960 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdb1 2 3427 7842816 b W95 FAT32 Command (m for help):
Debianの最新イメージを、BeagleBoneサイトよりダウンロード、xzコマンドで展開しつつddコマンドでSDに書き込み
wget http://debian.beagleboard.org/images/bone-debian-7.8-lxde-4gb-armhf-2015-03-01-4gb.img.xz xz -dc bone-debian-7.8-lxde-4gb-armhf-2015-03-01-4gb.img.xz || dd of=/dev/sdb
ddコマンドでイメージを書き込むのは非常に時間がかかる。以下コマンド出力、約30分
7577600+0 records in 7577600+0 records out 3879731200 bytes (3.9 GB) copied, 1666.24 s, 2.3 MB/s
書き込めたのか確認
root@debone:~# fdisk /dev/sdb WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): p Disk /dev/sdb: 8035 MB, 8035237888 bytes 248 heads, 62 sectors/track, 1020 cylinders Units = cylinders of 15376 * 512 = 7872512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdb1 * 1 13 98304 e W95 FAT16 (LBA) Partition 1 has different physical/logical beginnings (non-Linux?): phys=(0, 32, 33) logical=(0, 33, 3) Partition 1 has different physical/logical endings: phys=(12, 93, 17) logical=(12, 228, 8) Partition 1 does not end on cylinder boundary. /dev/sdb2 13 493 3689472 83 Linux Partition 2 has different physical/logical beginnings (non-Linux?): phys=(12, 93, 18) logical=(12, 228, 9) Partition 2 has different physical/logical endings: phys=(471, 174, 23) logical=(492, 203, 22) Partition 2 does not end on cylinder boundary.
clinyder boundaryのエラーというか警告がでているけど。。まぁ仕事じゃないし、これでよしとしよう。
勝手にブートするとID/PWDとかIPとか分からなくなるので、マウントして細工しておく。
root@debone:~# mount /dev/sdb2 /mnt/sd2 root@debone:~# cd /mnt/sd2/ root@debone:/mnt/sd2# ls -F bin/ dev/ home/ lost+found/ mnt/ proc/ run/ selinux/ sys/ usr/ boot/ etc/ lib/ media/ opt/ root/ sbin/ srv/ tmp/ var/
file:/mnt/sd2/etc/network/interfaces に eth0を設定(固定IPでつながるように)
iface eth0 inet static address 10.0.128.160 netmask 255.255.255.0 network 10.0.128.0 broadcast 10.0.128.255 gateway 10.0.128.1 dns-nameservers 10.0.128.1
本来はuseraddコマンドでユーザ追加するのだけど、/mnt/sd2/etc配下の自分のアカウントのpasswd,shadowを母艦のBeagleBoneからコピー、mkdir /mnt/sd2/home/hogehogeと、chown NNN:NNN でオーナ変更
これでブート後、普段のIP、ID/PWDで接続できるはずなので、SDを差し替えてブートしてみる*1。
ブートしたけど、ping 10.0.128.160 では応答しない。LEDの光っぷりからOS自体は動いていそうだけど。。やっぱりシリアルコンソールで繋ぐか、BB独自のUSB経由でのメンテナンスをするしかなさそうだ。(あるいは、、OSを旧に戻して、新OSのSDをマウントしてsyslogを見るか。。)
SDを差し替えて、旧OSでブートして、新OSのカードをマウントして syslogを見ると、それなりに仕事をしているようであった。そこで、、print文デバッグのごとく、/etc/rc.localに 以下のようにログ取るようにスクリプトを書いて、SDを交換して再度実行
再度新旧OSを入れ替えてprint文デバッグを確認、メッセージは以下
ifconfig -a >> /var/log/aho
eth0は上がってるけどIPが付いていない。なぜか?? ぐぐって判明、auto eth0を有効にすべし。
eth0 Link encap:Ethernet HWaddr 00:18:31:8f:26:8c
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:40lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
で、OS入れ替えて再起動。。pingの応答があったのでsshでログイン
# The primary network interface
auto eth0
ひとまず、OSが最新版に更新できた。apt-get update; apt-get upgradeでパッケージも最新にしておく。
beaglebone:~$ uname -a
Linux beaglebone 3.8.13-bone70 #1 SMP Fri Jan 23 02:15:42 UTC 2015 armv7l GNU/Linux
beaglebone:~$ cat /etc/issue
Debian GNU/Linux 7 \n \lBeagleBoard.org Debian Image 2015-03-01
Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian
default username:password is [debian:temppwd]
The IP Address for eth0 is: 10.0.128.160
The IP Address for usb0 is: 192.168.7.2
Debian 7だと、/dev/ttyO0 しかない。これはWeb上の情報通り、で、、CAPEを有効化する設定を追加
file:/boot/uEnv.txt
これで再起動、/dev/ttyO1が出来ているのを確認
# Enable UART1
cape_enable=capemgr.enable_partno=BB-UART1
信号が出力されるかを確認。ttyO1(UART1)に文字列を書き出し
オシロで波形確認
while [ 1 ] ; do echo "adsfasfsaf" > /dev/ttyO1 ; done
ボーレートはともかく、UART1から信号が出ているのを確認した。
やっとのことで、シリアル出力ができるようになった。で、、この後は、TxD/RxDを合流させる回路を作って、iCOMの無線機に接続して、icomコマンドで操作すれば、リモートシャック用の操作環境ができるはず。が、、もう日曜日の夕方なので、ここまで。
過去BBを使っていた頃はOSを載せ替えるのも頻繁にやっていた。こんなに手こずるのはやっぱり時間が経って、いろいろ忘れてしまったりスキルが低下したせいだろうか。まぁ普段BBつかってないのでしょうがない。
シリアルはなんとかなりそうなので、今度は音の処理(リモートシャックのため)だということで、USBで接続できるSouldBlaster(creative sb-play)をBBに差してみた。SoundBlsterのLEDが点灯しないので、嫌な予感がしたが、、やっぱりデバイスとして認識されていない。これは、カーネル再のコンパイルが必要なのだろうか。。
root@beaglebone:/var/log# lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub root@beaglebone:/var/log# aplay -L null Discard all samples (playback) or generate zero samples (capture) root@beaglebone:/var/log# cat /proc/asound/cards --- no soundcards ---
dmesgやsyslogみても、SoundBlasterを差しても何もログが出力されず、まずUSBデバイスとして認識がなされていない。
あまり意味ないけど、ALSAのバージョンとかは以下。
root@beaglebone:/var/log# cat /proc/asound/version Advanced Linux Sound Architecture Driver Version k3.8.13-bone70.
SoundBlasterを差したままでBeagleBoneを再起動したら、SoundBlsterのLEDが点灯して、正しく認識された状態になった。
root@beaglebone:~# lsusb Bus 001 Device 002: ID 041e:30d3 Creative Technology, Ltd Sound Blaster Play! Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub root@beaglebone:~# cat /proc/asound/cards 1 [U0x41e0x30d3 ]: USB-Audio - USB Device 0x41e:0x30d3 USB Device 0x41e:0x30d3 at usb-musb-hdrc.1.auto-1, full speed root@beaglebone:~# aplay -L null Discard all samples (playback) or generate zero samples (capture) default:CARD=U0x41e0x30d3 USB Device 0x41e:0x30d3, USB Audio Default Audio Device sysdefault:CARD=U0x41e0x30d3 USB Device 0x41e:0x30d3, USB Audio Default Audio Device front:CARD=U0x41e0x30d3,DEV=0 USB Device 0x41e:0x30d3, USB Audio Front speakers surround40:CARD=U0x41e0x30d3,DEV=0 USB Device 0x41e:0x30d3, USB Audio 4.0 Surround output to Front and Rear speakers surround41:CARD=U0x41e0x30d3,DEV=0 USB Device 0x41e:0x30d3, USB Audio 4.1 Surround output to Front, Rear and Subwoofer speakers surround50:CARD=U0x41e0x30d3,DEV=0 USB Device 0x41e:0x30d3, USB Audio 5.0 Surround output to Front, Center and Rear speakers surround51:CARD=U0x41e0x30d3,DEV=0 USB Device 0x41e:0x30d3, USB Audio 5.1 Surround output to Front, Center, Rear and Subwoofer speakers surround71:CARD=U0x41e0x30d3,DEV=0 USB Device 0x41e:0x30d3, USB Audio 7.1 Surround output to Front, Center, Side, Rear and Woofer speakers iec958:CARD=U0x41e0x30d3,DEV=0 USB Device 0x41e:0x30d3, USB Audio IEC958 (S/PDIF) Digital Audio Output
なぜSoundBlaster(SB)入れっぱなしだと認識されるのか不明。ちなみに、抜いた状態でBeagleBone(BBW)を起動して、SBを挿入すると、一瞬LEDがチカっと光って、BBWの挙動がおかしくなる。電源容量が足りないのか、割り込みが入っておかしくなるのか。。
まぁSBはずっと入れっぱなしで問題ないので、抜き差しはせずに運用することにする。
音声再生テストをやってみた。イヤフォンからピンクノイズが流れてきた。
root@beaglebone:/dev/snd# speaker-test -Dsysdefault:U0x41e0x30d3 -c6 -wav speaker-test 1.0.25 Playback device is sysdefault:U0x41e0x30d3 Stream parameters are 48000Hz, S16_LE, 6 channels Using 16 octaves of pink noise Rate set to 48000Hz (requested 48000Hz) Buffer size range from 2048 to 16384 Period size range from 1024 to 1024 Using max buffer size 16384 Periods = 4 was set period_size = 1024 was set buffer_size = 16384 0 - Front Left 4 - Center 1 - Front Right 3 - Rear Right 2 - Rear Left 5 - LFE Time per period = 17.601251 0 - Front Left 4 - Center 1 - Front Right 3 - Rear Right ... 続く ...
録音をそのまま再生する例
ひとまず、シリアルと音声はなんとかなった。
arecord -D hw:1,0 -f S16_LE | aplay -D plughw:1,0
あとは、アプリレベルで作りこんだり、フリーソフトを整えたら、リモート操作が可能になるはず。。
memo
avconv -f alsa -ac 1 -i hw:1,0 –acodec mp2–ab 128k -f rtp rtp://239.1.1.1:1234
avconv -f alsa -ac 1 -i hw:1,0 -f rtp rtp://10.0.128.201:1234
■ご参考URL
ffmpeg -f oss -i /dev/dsp -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://234.5.5.5:1234
マイクで拾った音をストリーミングする方法
Thread: How To Stream Live Audio from your Mic in Real Time
http://ubuntuforums.org/showthread.php?t=1544946
Stream Live Audio from a Microphone in Near Real Time in Ubuntu
https://prupert.wordpress.com/2010/08/02/stream-live-audio-from-a-microphone-in-near-real-time-in-ubuntu/