2014年4月28日月曜日

BeagleBoneBlackにRTC

2014.05.26 追記
/etc/network/is-up.d/ntpupdate
にネットワーク接続時のntpdateの呼び出しがある。
サーバーは
/etc/default/ntpdate
に指定してある。

最後に、
exec /sbin/hwclock -w
exec /sbin/hwclock -w -f /dev/rtc1
をついかしてみた


2014.5.22 追記
VL1220や、ML1220など二次電池を使うこともあり。これらの充電回路は比較的簡単なのでいいかも。

〜〜〜〜〜〜〜

ほとんどここ<http://morecatlab.akiba.coocan.jp/lab/index.php/2014/01/beaglebone-black-2/>のパクリでRTCを載せた。

CR2032は何気にデカイので、1年くらいで電池が切れるのは止むなしとしてCR1220にする。

CR2032 220mAh
CR1220 35mAh

i2c-toolsをインストール
# apt-get install i2c-tools

接続確認
# i2cdetect -y -r 1

設定
# mkdir /usr/share/rtc_ds1307
# cat > usr/share/rtc_ds1307/clock_init.sh
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
  1. hwclock -s -f /dev/rtc1
  2. hwclock -w
  3. [ctrl+d]

  4. ubuntuなので、
  5. /etc/init.d/rtc_ds1307
  6. を作って
# update-rc.d rtc_ds1307 defaults

これで再起動したら、rtc有効になる

ついでに
# update-rc.d -f xxxx remove
でXを無効化。

宿題
定期的にNTPで合わせる方法は?

2014/05/11 追記
[clock_init.sh]
  1. hwclock --/dev/rtc1
  2. ntpupdate ntp.nict.jp # added
  3. hwclock -w
として、
追加した行をcronに登録すればいいかな。
(未確認)

BeagleBoneBlackでWebカメラ2

改めてmjpg-streamerを調べてみるとUVCがmjpegに対応していればそのまま流してくれそうだということが分かった。

svnをapt-get installして、ソースを落としてmakeした。

フレームレートのオプションは効かないようだ。

VGAだと3割以上CPUを持ってゆかれる。
QVGAだと2割くらい。

QVGAでstreamにすると遅延もほとんど無く上手く動いている。

2014年4月14日月曜日

BeagleBoneBlackでモーター制御2

GPIOの設定はrc.localに記述。

制御用プロセスはUDPで待ち受けして、1バイト毎のコマンドで動作するものとする。あと、安全のために三秒コマンドが来なければ停止。
応答は現状態。
-:現状態
0:停止
1:前進
2:後進
3:右旋回
4:左旋回
a:低速前進
b:低速後進
c:低速右旋回
d:低速左旋回

GPIOとramdisk、PWMの初期設定はrc.localでやっている

制御用プロセスのソースコード
(そのうちアップ)

テスト用プログラム
標準入力からコマンドを受けてUDPで送信して、受信内容を表示する
/**
 * test program  for motor_ctrl
 *
 */

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main()
{
  int sock;
  struct sockaddr_in addr;

  sock = socket(AF_INET, SOCK_DGRAM, 0);

  addr.sin_family = AF_INET;
  addr.sin_port = htons(10400);
  addr.sin_addr.s_addr = inet_addr("127.0.0.1");

  char pBuf[8];
  char pRecv[8];
  while(EOF != scanf("%s", pBuf))
    {
      memset(pRecv, 0, sizeof(pRecv));

      // send command
      sendto(sock, pBuf, (int)strlen(pBuf),
    0, (struct sockaddr *)&addr, sizeof(addr));

      // receve response
      recv(sock, pBuf, sizeof(pBuf), 0);
      printf("receive: %s\n", pBuf);
    }

  close(sock);

  return 0;
}

$ cat | ./send_motor_ctrl と使う


Marvericksでeclipse

eclipseはそのままではmarvericksでは動かない
<http://park1.wakwak.com/~ima/macosx_eclipse0002.html>
をみて、jre6を入れた。(会社だと許されないなぁ。。。。)

入れたら動いた。

2014年4月5日土曜日

BeagleBoneBlackでWebカメラ

広角のUSBカメラを購入

iBUFFALO マイク内蔵200万画素WEBカメラ 120°広角ガラスレンズ搭載モデル BSW20KM11BK


2014.4.14 下記でいろいろやったが、結局、
httpd側:
 1. request 受信
 2. flagファイルにシーケンス番号書き込み
 3. udpでファイル保存通知待ち
 4. response送信
capture側:
 1. usbからキャプチャするたびにflagファイルを確認して、更新されていたらファイル保存
 2. udpでファイル保存を通知
とした。
これでファイルの破壊や、ハングがなくなった。

ただし、無線LANもUSBを使っているので画像はVGAではなくQVGAとした。
これでなんとか3fpsくらいで更新している。

    2014.4.16 追記
     # cpufreq-set --min 1G
     とするとVGAでも動いた
      (それまでは300MHzだった。負荷が断続的なのでCPU速度が切り変わらなかった?)

また、無線LANでもセキュリティを有効にしているとパフォーマンスが落ちる。
(Ad-HocモードでiPhoneと直につなげた場合は、10fps近くでる)

ubuntu@ubuntu-armhf:~$ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
Index       : 0
Type        : Video Capture
Pixel Format: 'YUYV'
Name        : YUV 4:2:2 (YUYV)

Index       : 1
Type        : Video Capture
Pixel Format: 'MJPG' (compressed)
Name        : MJPEG

ubuntu@ubuntu-armhf:~$ lsusb
Bus 001 Device 004: ID 0789:0170 Logitec Corp. LAN-W300AN/U2 Wireless LAN Adapter
Bus 001 Device 003: ID 0458:708c KYE Systems Corp. (Mouse Systems) 
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ubuntu@ubuntu-armhf:~$ v4l2-ctl --all       
Driver Info (not using libv4l2):
Driver name   : uvcvideo
Card type     : USB_Camera
Bus info      : usb-musb-hdrc.1.auto-1.2
Driver version: 3.8.13
Capabilities  : 0x84000001
Video Capture
Streaming
Device Capabilities
Device Caps   : 0x04000001
Video Capture
Streaming
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
Width/Height  : 640/480
Pixel Format  : 'YUYV'
Field         : None
Bytes per Line: 1280
Size Image    : 614400
Colorspace    : SRGB
Crop Capability Video Capture:
Bounds      : Left 0, Top 0, Width 640, Height 480
Default     : Left 0, Top 0, Width 640, Height 480
Pixel Aspect: 1/1
Streaming Parameters Video Capture:
Capabilities     : timeperframe
Frames per second: 30.000 (30/1)
Read buffers     : 0
                     brightness (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast (int)    : min=0 max=95 step=1 default=32 value=32
                     saturation (int)    : min=0 max=100 step=1 default=55 value=55
                            hue (int)    : min=-2000 max=2000 step=1 default=0 value=0
 white_balance_temperature_auto (bool)   : default=1 value=1
                          gamma (int)    : min=100 max=300 step=1 default=165 value=165
           power_line_frequency (menu)   : min=0 max=2 default=1 value=1
      white_balance_temperature (int)    : min=2800 max=6500 step=10 default=4600 value=4600 flags=inactive
                      sharpness (int)    : min=1 max=7 step=1 default=2 value=2
         backlight_compensation (int)    : min=0 max=1 step=1 default=0 value=0
                  exposure_auto (menu)   : min=0 max=3 default=3 value=3
              exposure_absolute (int)    : min=50 max=10000 step=1 default=166 value=166 flags=inactive

opencvで取り込むとQVGA YUYVで2fpsが限度な感じ。

<http://derekmolloy.ie/udp-video-streaming-beaglebone-black/>

あたりを参考にすると、mjpegを使うのが良さそう。

上記のリンク先のcapture.cを修正して
mjpeg VGAで取り込んでファイルに保存させた。
webサーバー側はCGIでもいいが簡単に済ませたかっので
<http://www.geekpage.jp/programming/linux-network/http-server.php>
を参考になんちゃってサーバーを立てた。

で、以下のhtmlをlighttpdから見えるところに置いて
キャプチャープログラムとなんちゃってWebサーバーを起動。

============
<html>
<head>
<script type="text/javascript">
function loadImage()
{
    var date = new Date();
    var name = "http://192.168.111.2:8088/cap.jpg?id=" + date.toString() + " " + date.getMilliseconds().toString();
    document.getElementById("name").innerHTML = name;
    document.getElementById("camera").src = name;
//alert(name);
}
function load()
{
    loadImage();
    var img = document.getElementById("camera");
    img.onload = function(){
        setTimeout("loadImage()", 100);
    };
    img.onerror = function(){
        setTimeout("loadImage()", 1000);
    }
};
</script>
</head>
<body onload="load();">
<script type="text/javascript">
//setInterval("loadImage()", 500);
</script>
<div><img  src="http://192.168.111.2:8088/cap.jpg" id="camera" /></div>
<div id="name"></div>
</body>
</html>
============

ブラウザでページを開くと4fpsくらいで表示されました。

javascriptでのwaitの100msecを短くすれば早くなりましたが、ハングしたりで不安定になったので100msecとしました。

jpegをudpで垂れ流すようにして受信プログラムを作ればいいのですがブラウザでで表示したいのでパス。

websocketは使えるのかな?

あと、mjpeg-steamerとか使えそうですが試していません。
<http://sourceforge.net/projects/mjpg-streamer/>
<http://www.acmesystems.it/video_streaming>

なんちゃってWebサーバーで
multipart/x-mixed-replace;boundary=<boundary-name> 
<http://en.m.wikipedia.org/wiki/Motion_JPEG#M-JPEG_over_HTTP>
を試したが、レスポンス、安定性、iOSでの表示ともにいまいちだった。

Bus 001 Device 001:  1d6b:0002 Linux Foundation