2012/11/19

スマートタグ購入

先週末、スマートタグをスイッチサイエンスで購入しました。
デモアプリで一通り遊んだので、サンプルプログラムをダウンロードしてきて遊んでいます。
 



スマートタグの画面は200x96ピクセルで、最終的には同じサイズの白黒画像をNFCを使用して転送しています。テキストも一旦キャンバスに描画して転送するので、フォントの種類やサイズ、位置を自由に変えることができます。サンプルプログラムに転送部分やヘルパー関数があるので、画像を準備できれば自由にスマートタグに表示できそうです。




文字サイズを小さくすればたくさん画面に表示できますが、その分文字が見づらくなります。
フォントサイズ5だと識別できなくなったのでフォントサイズ10にしてみました。このサイズだと20文字 x 9行で最大180文字まで表示できるようです。


20文字 x 9行
 もう少しサンプルプログラムをいじって、週間天気予報の画像を表示できるようにしてみたいと思います。
ではまた。

2012/11/09

Nexus 7 購入

今年は日本でも小さめのタブレット端末が色々と発売されていますね。

Google PlayでNexus7が売っていたので、買ってみました。
発注してから3〜4日で到着。16GBモデルで、送料込みで19,800円。
購入したのは10月だったのでGoogle playに2000円分のチャージがされていました。
それを考えると17,800円で7インチ、クアッドコア、NFC、Android4.1の端末が手に入ったことになります。

さて、NFC付きの端末が手に入ったので、早速NFCで遊びたいところです。
NFCについて@SONY
を見たところ、NFCの機種であればFelica,Mifere,DESFireが読み書きできるとのこと。

ということはスマートタグを買えば中身を書き換えて遊べそうです。

スマートタグ
スマートタグの仕様

  • 書き換え回数:約1万回
  • 2インチ 200 x 96 ドット
  • 重量 27グラム
  • 大きさ 73 x 58 x 8.5mm
  • いろいろな大きさのテキストを表示可能
  • グラフィックも表示可能

(個人で手に入るのは上記のモデルのみですが、2.7インチのものや、外部給電で100万回書き換えできるものも展示会で発表されているようです payment navi


というわけでスマートタグの使い道を考えてみました。
業務用途はアイオイシステムの方が考えていると思うので、家庭用で。

日”タッチ”カレンダー
 日めくりカレンダーの電子ペーパー版。1日1回書き換え。会社の机とかに置いておいて、出勤したらスマホをタッチ。カレンダーと今日のTODOが表示される。家庭用だと”今日の格言”とか”ミル姉の一口メモ”を表示するのも面白いかも。

かざしてお神籤
 気合を入れてかざすと今年の(or 今日の)運勢が表示されます。アプリ側で制御して1日1回しか引けないようにします。

週間天気予報
 かざすと1週間の天気予報が表示されます。天気が気になる時に毎回PCやスマホを見なくてもOK。

今日の割引クーポン
 スーパーなどのクーポンアプリで、「お寿司2割引き」「弁当50円引き」などを選んでタッチすると割引クーポンのバーコードかQRコードと説明が表示されます。あとはこれをレジに持って行ってPOSリーダーでピッとやってもらえばOK。


こんな感じのができるかどうかはわかりませんが、ひとまずスマートタグを買って色々といじってみようかと思います。

ではまた。












2012/07/27

BeagleBoneタンク バスパワー不足?

Webカメラの画像送信サーバーと、キャタピラ操作サーバーを作ったので実際にタンクにBeagleBone、モータードライバー、USB電源を載せて動かしてみました。

電源、BeagleBone,モータドライバ

最初はカメラの画像も取得できたのですが、コマンドを送信してキャタピラを動かし始めるとカメラの画像が取得出来なくなり、無線LANも途切れてしまいました。

BeagleBoneにはUSBポートが1つしかないため、バスパワー駆動のUSB HUBを経由して接続しましたが、それがよくないのかもしれません。ネットで調べてみると、HUBに無線LANアダプタを挿すと動作しないことがよくあるようです。

試しにHUBを使わず、無線LANアダプターだけを挿したら問題なく通信出来ました。やはり電力が足りてないようです。





改良すべき点

  • バスパワー駆動HUBだと電力が足りないっぽい。セルフパワーのHUBにしてみる
  • BeagleBoneを出力2Aのポートにつないでいるが、2Aをやめて0.5Aのポートにつなぎ替え、2AのポートはセルフパワーHUBの電源とする。
  • セルフパワーHUBの電源コネクタをUSB電源対応に改造する。
  • 無線LAN経由だと命令の遅延が発生するので、コマンドに移動量(10センチ進むとか45度右に回転とか)を組み込む必要がある。今の状態では無線LANが途切れたらずーっと走り続けてしまうため。


”よちよち歩き”状態のBeagleBoneタンク。
重心が高いのでちょっとした段差も危ない感じです。




もう少し本体&コードを改良してから、ソースコードをGitHubのほうにアップしたいと思います。

ではまた。

2012/07/22

python-opencv tutorial(5)

python-opencvチュートリアル(5)

今回は文字列の書き込みとマウスイベントの処理です。

GitHubリポジトリ
https://github.com/kyatou/python-opencv_tutorial

文字列の書き込み
'''
python-opencv tutorial
Annotate message to image.
Usage:
  09_annotate.py imagename
'''

import cv2
import sys

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s imagefilename' % argvs[0]
    quit()
 
imagefilename = argvs[1]
try:
     img=cv2.imread(imagefilename, 1)
except:
     print 'faild to load %s' % imagefilename
     quit()


#putText(...)
#    putText(img, text, org, fontFace, fontScale, color[, thickness[, linetype[, bottomLeftOrigin]]]) -> None

msg='HELLO,OpenCV!'
location=(0,30)

fontface=cv2.FONT_HERSHEY_PLAIN
fontscale=1.0
color=(255,190,0) #sky blue
cv2.putText(img,msg,location,fontface,fontscale,color)


#big size
fontscale=2.0
location=(0,img.shape[0]/2)
thickness=2
cv2.putText(img,msg,location,fontface,fontscale,color,thickness)

cv2.imshow('Annotated Image',img)
cv2.waitKey(0)
cv2.destroyAllWindows() 
                    


文字列の書き込み


マウスイベントの処理

'''
python-opencv tutorial
Example of mouse callback
draw a circle or rectangle to clicked point.

Usage:
  10_mouse_callback.py imagename
'''

import cv2
import sys

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s imagefilename' % argvs[0]
    quit()
 
imagefilename = argvs[1]
try:
     img=cv2.imread(imagefilename, 1)
except:
     print 'faild to load %s' % imagefilename
     quit()

usage='left click to draw a circle.\nright click to draw a rectangle.\n'
usage=usage+'press any key to exit.'
print(usage)



windowName="mouse"
cv2.namedWindow(windowName)
  
def onMouse(event, x, y, flags, param):
     """
        Mouse event callback function.
        left click -> draw circle
        right click -> draw rectangle
     """ 
     if event == cv2.EVENT_MOUSEMOVE:return 
 
     if event == cv2.EVENT_LBUTTONDOWN:
         center=(x,y) 
         radius=10
         color=(255,255,0)
         cv2.circle(img,center,radius,color)
     
     if event == cv2.EVENT_RBUTTONDOWN:
         rect_start=(x-10,y-10)
         rect_end=(x+10,y+10)
         color=(100,255,100)
         cv2.rectangle(img,rect_start,rect_end,color)

     cv2.imshow(windowName,img)


#setMouseCallback(...)
#    setMouseCallback(windowName, onMouse [, param]) -> None
cv2.setMouseCallback(windowName,onMouse)

cv2.imshow(windowName,img)
cv2.waitKey(0)
cv2.destroyAllWindows() 

マウスイベントの処理

ではまた。

2012/07/21

BeagleBoneタンク モータ制御

BeagleBoneタンクのモーター制御を行うために、モータードライバを使用するのですが、モータードライバごとに前進・後退・停止の3通りの信号を入力しなければなりません。
BeagleBoneは約60本のGPIOピンを持っているので、モータードライバごとに2本のGPIOピンを使用して制御信号を送ります。



GPIOピンを使用するには、
  • ピンのモードを変更する(omap_mux)
  • ピンをexportする
  • 入出力の方向を決める
  • 出力・入力を行う
という手順をピンごとに行う必要があります。
毎回手順を実行するのは面倒なため、GPIO操作用のクラスを作りました。
ソースコードはGithubに保存してあります。


I use motor driver IC (TOSHIBA TA7291P) to control the BeagleBone tank.
Motor driver needs two control signal. Because beaglebone has many GPIO pins, I use it to control each motor driver.

To use GPIO pin on Ubuntu , we have to do below step per each pin.
  • change omap_mux
  • export pin
  • decide signal direction
  • input/output signal
It is time-consuming steps to do by hand, so I made  a GPIO helper class.


Github:



GPIOが手軽に操作できるようになったので、beagleboneクラスを使用してBeagleBoneTankDriverクラスを作りました。
ひとまず前進、後退、左回転、右回転を実装しています。今のところ与えた命令を何秒も実行する形になっているので、タイマーをつけて一定時間経過後は停止するように変えたほうが良いかもしれません。









あとは移動コマンドを送受信するコードを作れば、ひとまず動く形になると思います。
ではまた。

2012/07/20

Webカメラの画像をpythonのsocketを使って転送する

BeagleBoneタンクに欠かせない装備はWebカメラです。Webカメラの映像をコマンドセンター(自分の部屋)にて確認し、状況に応じた適切な命令をタンクに送ることがでるようになります。

タンクとコマンドセンター間は無線LANで繋ぐので、ソケットを使って画像を転送する必要があります。Cでソケットプログラムを書くのは面倒ですが、pythonにはラッパークラスがあって比較的簡単にソケットプログラミングができます。

Webカメラで取得した画像の送信フローは以下のとおりです。
タンクはコマンドセンターから画像要求が来た場合に、Webカメラで取得した画像をJPEGに圧縮して送り返します。コマンドセンターでは受信した画像をデコードし、画面に表示します。受信しているデータはJPEGなので、そのままJPEGファイルとしてディスクに書き込むことも可能です。


SocketServerモジュールのサンプルコードを元に、BeagleBoneタンクで画像を取得し、コマンドセンターに転送するプログラムを作りました。例外処理等はしてませんが、一応動いています。タンク側はCtrl+cの強制終了でしか終わらないので行儀良いプログラムではありません。そのうち改良しようと思います。


はじめはOpenCV2.4から実装されているcv2.imencodeとcv2.imdecodeを使っていたのですが、BeagleBone側はOpenCV2.3だという事に気づき、エンコードにcv2.cv.EncodeImageを使用しています。OpenCV2.3のcv2.imencodeはSegmentation faultが出たので使うのをやめました。

まだ有線LANでしか実験していませんが、QVGAサイズの画像を1秒間に5枚程度は送受信できています。無線に変えても2〜3枚は送受信できるかな・・・?


BeagleBoneタンク側:
"""
 webcamera server
  for opencv 2.3
"""

import SocketServer
import cv2.cv as cv
import numpy
import socket
import sys

#for OpenCV2.3 python interface

class TCPHandler(SocketServer.BaseRequestHandler):
    capture=''

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print "%s connected:" % self.client_address[0]
        frame=cv.QueryFrame(capture)

        jpegstring=cv.EncodeImage('.jpeg',frame).tostring()
        print len(jpegstring)
        self.request.send(jpegstring)


if __name__ == "__main__":
    HOST, PORT = '192.168.111.40', 12345

    #init camera
    cameraid=0
    capture=cv.CreateCameraCapture(0)
    cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_WIDTH,320)
    cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_HEIGHT,240)
    if not capture:
        print "Could not open camera"
        exit()
  
    server = SocketServer.TCPServer((HOST, PORT), TCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.capture=capture
    server.serve_forever()


コマンドセンター側
'''
  Image receiver
  for OpenCV 2.4 python interface
'''

import socket
import sys
import numpy
import cv2

# for opencv 2.4.2

HOST, PORT = "192.168.111.40", 12345

# Receive data from the server and shut down
quitflag=False
recvlen=1

def getImageFromServer():
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.connect((HOST,PORT)) 
    sock.send('HELLO\n')
    recvlen=100
    buffer='' 
    while recvlen>0:
        receivedstr=sock.recv(1024*8)
        recvlen=len(receivedstr)
        buffer +=receivedstr

    print '%d bytes received' %len(buffer)
    narray=numpy.fromstring(buffer,dtype='uint8')
    decimg=cv2.imdecode(narray,1)
    sock.close()
    return decimg

while 1:
    img=getImageFromServer()
    cv2.imshow('Capture',img)
    key=cv2.waitKey(100)
    if(int(key)>27): break
    img=''


※IPアドレスとポートは適当に読み替えてください。



次はソケットで操縦コマンドを送受信してGPIOを制御する部分を作ろうと思います。
ではまた。

2012/07/18

BeagleBoneタンク ソフトウェア設計

ハードウェアはだいたい揃ってるので、ソフトウェアの設計にかかります。

今回メインで使う言語は練習もかねてpythonにしました。

今回のシステムのざっくりとした設計は以下の通りです。
BeagleBoneとPC間は無線LANで接続します。TCP/IPが使えれば何でもOKです。
データ転送ですが、FTPのように制御コマンドとデータを別々のソケットで扱うことにしました。pythonにはserversocketというライブラリがあるようなので、Cとかでソケットを扱うよりかは簡単に作業できると思います。

制御コマンドは前進、後退、左旋回、右旋回、ストップの5つぐらいにして、必要に応じて追加していきたいと思います。BeagleBone側で制御コマンドを受信したら、GPIOを操作してモータードライバの出力方向を切り替える予定です。ただ、GPIOの出力が3.3V、モータードライバの最低入力電圧(HIGH)が3.5Vとなっているので、電圧レベル変換の回路をつける必要はありそうです。

ひとまずpythonのサーバソケット・クライアントソケットのプログラムと、GPIOで前進・後退のプログラムを作って、モータードライバではなくLEDをつないでテストしてみたいと思います。

ではまた。

python-opencv tutorial(4)

python-opencvチュートリアル その4


GitHubリポジトリ
https://github.com/kyatou/python-opencv_tutorial


今日はROIの設定と、画像のエンコード・デコードです。

画像全体に処理を行うと時間がかかるので、特定の領域(ROI)を作成してROIだけに処理を行うと処理時間の短縮が可能になります。


'''
python-opencv tutorial
Create image ROI(Region of Interest)
Usage:
    07_image_roi.py imagename
'''

#import opencv library
import cv2
import sys
import numpy

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s imagefilename' % argvs[0]
    quit()
 
imagefilename = argvs[1]
try:
    img=cv2.imread(imagefilename, 1)
except:
    print 'faild to load %s' % imagefilename
    quit()

imgshape=img.shape
roiWidth=imgshape[1]/4
roiHeight=imgshape[0]/4
sx=imgshape[1]/2-roiWidth
sy=imgshape[0]/2-roiHeight
ex=imgshape[1]/2+roiWidth
ey=imgshape[0]/2+roiHeight

#extract roi as array
roi=img[sy:ey,sx:ex]

#invert roi area
img[sy:ey,sx:ex]=cv2.bitwise_not(roi)

cv2.imshow('roi image',img)
cv2.waitKey(0)
cv2.destroyAllWindows() 
                




画像のエンコード・デコードは、OpenCVの画像形式のものを他のアプリケーションでも読める形式(jpeg,pngなど)に 変換したり、その逆を行う作業です。ファイルに保存する場合はimwriteを使いますが、メモリ上に格納したい時はimencodeを使用します。例えばWebカメラ画像をキャプチャして、ネットワーク経由で他のPCに転送して表示したかったりするときにエンコード・デコードがあると便利です。

'''
python-opencv tutorial
Encode and decode image data.
Usage:
  08_image_encode_decode.py imagename 
'''

#import opencv library
import cv2
import sys
import numpy

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s imagefilename' % argvs[0]
    quit()
 
imagefilename = argvs[1]
try:
     img=cv2.imread(imagefilename, 1)
except:
     print 'faild to load %s' % imagefilename
     quit()


#encode to jpeg format
#encode param image quality 0 to 100. default:95
#if you want to shrink data size, choose low image quality.
encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),90]
result,encimg=cv2.imencode('.jpg',img,encode_param)
if False==result:
    print 'could not encode image!'
    quit()

#decode from jpeg format
decimg=cv2.imdecode(encimg,1)

cv2.imshow('Source Image',img)
cv2.imshow('Decoded image',decimg)
cv2.waitKey(0)
cv2.destroyAllWindows() 


ではまた。

2012/07/16

BeagleBoneタンク作成開始

半年ぐらい前にBeagleBoard-xmとArduinoを使って、無線タンクをつくろうとしましたが、途中で面倒になってしまったので放置してました。



BeagleBoneが手に入ったので、これでBeagleBoneタンクを作ってみようと思います。

材料
  • BeagleBone (ubuntu12.04)
  • Webカメラ(ロジクール C210)
  • 無線LANアダプタ(I-Oデータ WN-G150U)
  • USB電源(日立マクセル MLPC-4000)
  • タンク工作基本セット
  • ユニバーサルプレートセット
  • ユニバーサルアームセット

Webカメラは安くて小さいやつ、ということでC210を選びました。
モニタに固定するためのアームのような部分があるのですが、そこをラジオペンチなどで取り外すとユニバーサルアームセットにある軸受パーツがちょうどいい感じで挟まることがわかりました。結束バンドとかで固定しようと思っていたのですが、思わぬ収穫です。


 電源のほうですが、マクセルのmobile Voltageというのを選びました。USBポートの出力電流が最大2.1Aとなっていたからです。また、本体が薄いのもポイントでした。
 

無線LANのアダプタはI-O DATAの前にPCIのGW-USValue-EZを試していたのですが、PCIのはダメでした。このアダプタはWifi機器をつなぐ機能も付いているのですが、その辺がよくないのかもしれません。純粋な無線LAN子機のものを選んだほうが良さそうです。

BeagleBoneにmjpg-streamerをインストールして、無線LAN経由でWebカメラの画像が見えるところまで確認出来ました。
あとはBeagleBoneのGPIOとモータードライバをつなげればWebカメラ付きラジコンができそうな感じです。


2012/07/15

python-opencvチュートリアル(3)

python-opencvチュートリアルその3


GitHubにリポジトリを作ってみました
https://github.com/kyatou/python-opencv_tutorial



今日はガウシアンピラミッドの作成とWebカメラからの画像取り込みです。

ガウシアンピラミッド
800x800ピクセルの画像を作成し、半分のサイズ、4分の1のサイズのものを作成します。

'''
python-opencv tutorial
Make gaussian pyramid
Usage:
 05_GaussianPyramid.py
'''

#import opencv library
import cv2
import numpy

imgwidth=800
imgheight=800
img_original= numpy.zeros((imgheight,imgwidth,1),numpy.uint8)

#draw some circle
for i in range(1,6):
 cv2.circle(img_original,(20*2**i,20*2**i),i*10,(255,255,255),2)

#pyrDown(...)
#   pyrDown(src[, dst[, dstsize[, borderType]]]) -> dst

#make half size and quater size
img_half=cv2.pyrDown(img_original)
img_quat=cv2.pyrDown(img_half)

cv2.imshow('original',img_original)
cv2.imshow('Half size',img_half)
cv2.imshow('Quater size',img_quat)

cv2.waitKey()
cv2.destroyAllWindows() 



Webカメラからの画像取り込み

'''
python-opencv tutorial
Get image from web camera
Usage:
 06_webcamera.py
'''

#import opencv library
import cv2


#VideoCapture(...)
#      VideoCapture() -> 
#  or  VideoCapture(filename) -> 
#  or  VideoCapture(device) -> 

#get capture object
cameraid=0
capture=cv2.VideoCapture(cameraid)

isopen=capture.isOpened()
if(False==isopen):
    #retry to open camera
    capture.open(cameraid)
    isopen=capture.isOpened()
    if(False==isopen):
        #could not open camera...
        print 'Could not open camera.' 
 exit()

#get camera attribute
imwidth=capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
imheight=capture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)
print 'img width %d height %d ' % (imwidth,imheight)

print 'press ESC or q to quit'

#capture image and display to monitor
while True:
    ret,frame=capture.read()
    if not ret:
        print 'Could not capture frame.'
        exit()

    cv2.imshow('Captured Frame',frame)
    inputkey=cv2.waitKey(100)
    c=chr(inputkey & 255)
    if c in ['q',chr(27)]:
 break

#release capture
if(capture.isOpened()):
    capture.release()

cv2.destroyAllWindows() 






ではまた。

2012/07/12

python-opencvチュートリアル(2)

python-opencvのチュートリアル その2。
今日はトラックバーの付け方とガウシアンフィルタの掛け方です。

OpenCV 2.4.2で動作確認しています。

トラックバー


"""python-opencv tutorial
Create trackbar control.

Usage:
        03_trackbar.py
"""

#import opencv library
import cv2
import numpy

#Trackbar callback function
def onTrackbarChange(trackbarValue):
    imgshape=fullcolorimage.shape
    fimg=numpy.zeros(imgshape,numpy.uint8)
    colorval=trackbarValue*10
    diff=trackbarValue*10
    xcenter=imgshape[1]/2
    ycenter=imgshape[0]/2
    color=(colorval,colorval,colorval)
    cv2.rectangle(fimg, (xcenter-diff, ycenter-diff), (xcenter+diff, ycenter+diff), color, -1)
    cv2.imshow(windowName, fimg)

imgwidth=640
imgheight=480
fullcolorimage = numpy.zeros((imgheight,imgwidth,3),numpy.uint8)

windowName="TrackbarSample"
cv2.namedWindow(windowName)
onTrackbarChange(0)

#createTrackbar(...)
#    createTrackbar(trackbarName, windowName, value, count, onChange) -> None
cv2.createTrackbar( 'Trackbarname', windowName, 0, 25, onTrackbarChange )

cv2.waitKey()
cv2.destroyAllWindows()




ガウシアンフィルタの例

"""
python-opencv tutorial
Gaussian filter sample script.
Usage:
        04_smooth.py imagename
"""

#import opencv library
import cv2
import sys
import numpy

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s filename' % argvs[0]
    quit()


imagefilename = argvs[1]
try:
        img=cv2.imread(imagefilename, 1)
except:
        print 'faild to load %s' % imagefilename
        quit()

#GaussianBlur(...)
#    GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
# ksize must pair of odd. (5,5),(7,7),(9,9)...
bluredimg=cv2.GaussianBlur(img,(11,11),0)

cv2.imshow('Gaussian',bluredimg)
cv2.imshow('Source',img)

cv2.waitKey(0)
cv2.destroyAllWindows()


以前はcvSmoothの引数でCV_GAUSSIAN的なものを指定していたのですが、ガウシアンが独立した関数になったようですね。

チュートリアルが貯まってきたらgitHubかどこかにあげようかな〜と思います。
ではまた。

2012/07/10

Pro Git 日本語版PDFの生成

ソースコード管理システムのGitのドキュメントとして、Scott Chacon氏のPro Gitという書籍があります。この書籍は紙と電子データの2通りあり、原稿データはgitにアップされています。原本は英語ですが、日本語など他の言語にも翻訳されています。

この本はPDF形式やMobi形式に変換できるようなので、変換してみました。

git clone git://github.com/progit/progit.git
sudo apt-get install rake
sudo apt-get install texlive texlive-latex-extra texlive-xetex pandoc
sudo apt-get install ttf-vlgothic
./makepdfs ja

これでPDFファイルができました。次にmobiファイルも作ります。

sudo apt-get install calibre
./makeebooks ja

mobiファイルができましたが、画像が入っていません。
makeebooksファイルの画像パスを変換している部分の正規表現を

 content.gsub!(/Insert\s+(.*)(\.png)\s*\n?\s*#{figure_title}?\s+(.*)/, '![\3](figures/\1-tn\2 "\3")')
から
 content.gsub!(/Insert\s+(.*)(\.png)\s*\n?\s?(.*)\s?/, '![\3](figures/\1-tn\2 "\3")')
に書き換えました。

これでもう一度作成すると、画像入りのmobiファイルができました。
日本語対応版のkindleにmobiを入れて表示させたところ、無事読めるようになりました。図表番号は入っていませんが、まぁ良しとしましょう。



今回作ったPDFファイルとMobiファイルは、別館に置いてあります。
紙の方がよい方は、Amazonなどで購入できます。

ではまた。

2012/07/09

python-opencvチュートリアル

OpenCV2.4.2のサンプルコードを眺めていると、pythonのサンプルコードが増えていることに気がつきました。エッジ検出や顔検出のサンプルコードを動かして見たところ、サクサク動いたのでスクリプトだから遅くなるという訳ではないようです。

python2のフォルダにあったサンプルで、エラーが出なかったコードの一覧は以下のとおり。

browse.py  4096x4096の画像を縮小したものの一部にカーソルを当てると、その部分が拡大される。マウスイベントのサンプル?
calibrate.py カメラのキャリブレーション
color_histogram.py 色ごとのヒストグラム。
contours.py 輪郭検出
digits.py SVNを使った手書き文字認識。認識できなかったものを赤く表示?
digits_video.py Webカメラで撮影した画像から文字認識。処理の速さと認識率にびっくり
edge.py webカメラ画像の輪郭検出
feature_homography.py 2つの画像間の特徴点を比較して、ホモグラフィ行列を計算する。特徴点を検出している割にはかなり速い
fitline.py 複数のフィッティング手法を切り替えてラインフィッティング
gaussian_mix.py ランダムな点列をグループ化
kmeans.py k-meanによるクラスタリング。よくわかりません
lappyr.py ラプラシアンピラミッドによる画像フィルタ。どういう効果があるのかは分かりません
lk_homography.py オプティカルフローによる追跡
motempl.py 動体検知
mser.py 領域分割。 自動塗り絵とかに使えそう
opt_flow.py オプティカルフロー
turing.py 同じものを敷き詰めてもつなぎ目が分からないランダムな画像を生成
video.py スペースを押したらWebカメラの画像のキャプチャを保存する
video_dmtx.py Matrixコードを読み込む
video_threaded.py マルチスレッドによる動画処理



BeagleBoneのGPIO制御もpythonでやることにしたので、練習がてらpython-opencvのチュートリアルを作ってみることにしました。BeagleBoneにWebカメラをつないで、サーボを使って追尾システムとか作れるぐらいになれればいいな~と思っています。



チュートリアル00 画像の読み込み
'''
python-opencv tutorial
Load image file from disk.
Usage:
 00_loadImage.py imagefile
'''

#import opencv library
import cv2
import sys

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s filename' % argvs[0]
    quit()

imagefilename = argvs[1]
try:
    img=cv2.imread(imagefilename, 1)
except:
    print 'faild to load %s' % imagefilename
    quit()

#show image
windowName= 'LoadImage'
cv2.imshow(windowName, img)
print 'Press any key to exit.'

cv2.waitKey(0)

チュートリアル01 リサイズと色変換
'''
python-opencv tutorial
Resize image to half size and
convert to gray scale image.
Usage:
    01_resize_and_convertColor.py imagefile
'''

#import opencv library
import cv2
import sys

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s filename' % argvs[0]
    quit() 

imagefilename = argvs[1]
try:
    img=cv2.imread(imagefilename, 1)
except:
    print 'faild to load %s' % imagefilename
    quit()

#define small image size
imgsize=img.shape

#imgsize = (height,width,depth)

simg_width=imgsize[1]/2
simg_height=imgsize[0]/2

#half size image and grayscaled image
simg=cv2.resize(img,(simg_width,simg_height))
gimg=cv2.cvtColor(simg,cv2.COLOR_BGR2GRAY)

cv2.imshow('Half size',simg)
cv2.imshow('Grayscaled',gimg)

print 'Press any key to exit.'
cv2.waitKey(0)



ではまた。

2012/07/07

Ubuntu12.04にOpenCV2.4.2をインストール

Ubuntu11.10から12.04にアップグレードインストールしたのですが、「コンピュータにエラーが見つかりました」というメッセージが起動時に出るようになりました。毎回出るのが鬱陶しくなってきたので、Ubuntuの領域を削除し最初からインストールすることにしました。


インストールした直後のUbuntuには当然OpenCVはインストールされていないので、下記サイトを参考に、OpenCV2.4.2をインストールしました。

Linux で OpenCV バージョン 2.4.2 のダウンロードとビルドとインストールとテスト実行

まずはOpenCV2.4.2のソースコードをダウンロードしてきて解凍しておきます。
あとは必要なライブラリのインストール。600MB程度あるので結構時間がかかりました。

sudo apt-get -yV install build-essential
sudo apt-get -yV build-dep opencv 
sudo apt-get -yV install libjpeg-dev
sudo apt-get -yV install libopenjpeg-dev
sudo apt-get -yV install jasper
sudo apt-get -yV install libjasper-dev libjasper-runtime
sudo apt-get -yV install libpng12-dev
sudo apt-get -yV install libpng++-dev libpng3
sudo apt-get -yV install libpnglite-dev libpngwriter0-dev libpngwriter0c2
sudo apt-get -yV install libtiff-dev libtiff-tools pngtools
sudo apt-get -yV install zlib1g-dev zlib1g-dbg
sudo apt-get -yV install v4l2ucp
sudo apt-get -yV install python
sudo apt-get -yV install autoconf
sudo apt-get -yV install libtbb2 libtbb-dev
sudo apt-get -yV install libeigen2-dev
sudo apt-get -yV install cmake
sudo apt-get -yV install openexr
sudo apt-get -yV install gstreamer-plugins-*
sudo apt-get -yV install freeglut3-dev
sudo apt-get -yV install libglui-dev
sudo apt-get -yV install libavc1394-dev libdc1394-22-dev libdc1394-utils
sudo apt-get -yV install libxine-dev
sudo apt-get -yV install libxvidcore-dev
sudo apt-get -yV install libva-dev
sudo apt-get -yV install libssl-dev
sudo apt-get -yV install libv4l-dev
sudo apt-get -yV install libvo-aacenc-dev
sudo apt-get -yV install libvo-amrwbenc-dev
sudo apt-get -yV install libvorbis-dev
sudo apt-get -yV install libvpx-dev

GUIでMakefileを作りたいのでGUIもインストール
sudo apt-get install cmake-gui

CMake-GUIでOpenCVのソースディレクトリとビルド用のディレクトリを指定し、Configureを押します。その後必要なライブラリやオプションを指定し(PCのグラボはATIなのでGPU関係はインストールしないことにしました)、Generateを押してmakefileを作ります。
ビルド用ディレクトリで以下のコマンドを実行します。

make -j6
sudo make install

makeの-jオプションは、同時実行するジョブの上限を指定します。
CPUのコア数と同じにするとCPUをフルに使ってビルドしてくれます。私の環境ではビルド中、6コアのCPUがほぼ100%の使用率で、完了まで10分程度でした。

さて、きちんとインストールされているか確かめるために何かサンプルを動かしてみることにします。
サンプル選びのためにsamples/cppフォルダを見てみると、ビデオカードっぽいものの基板の写真がありました。grepで検索してみると、

grep board.jpg *.cpp
houghcircles.cpp:    const char* filename = argc >= 2 ? argv[1] : "board.jpg";

houghcircles.cppがこの画像ファイルを使っているようなので、これをビルドしてみます。

まずはコンパイルだけ
gcc -c houghcircles.cpp

OK。次はそれっぽいライブラリとともにリンクします。
gcc houghcircles.cpp -o hough.o -lopencv_calib3d -lopencv_core -lopencv_highgui -lopencv_imgproc

実行ファイルができたので動かしてみます。
./hough.o


誤検出はありますが、電解コンデンサが検出されています。
問題なく動作しているようですね。


ではまた。

2012/06/26

ほぼ防水LEDライトの作成


「高輝度/パワーLED活用テクニック」という本の中で、「高輝度LEDで作る集魚灯」という記事がありました。

書籍の紹介@YS DESIGN STUDIO

水中に沈めるものなので、当然防水のLEDライトになります。私は魚釣りはしないのですが、防水LEDライトに興味があったので楽しく読ませてもらいました。

防水LEDライトの作り方ですが、大まかに言うと
  1. 透明なアクリルパイプなど、水圧に負けない頑丈で透明な外殻にすること
  2. 電源は外部供給が望ましい(場合に応じた電源が選べる)
の2点が重要とのこと。

その他に、大量のLEDを効率的に点灯するには、LEDをいくつか直列でつなぎ、LEDストリングを作るのが常套手段ということもわかりました。LEDストリングの輝度を均一化させるために、カレントミラー回路を使用するとよい、という情報も得ました。


私も似たような物を作ってみたくなったので、さっそく作ることに。

作る物のイメージ
  • 生活防水ぐらいのLEDライト
  • 交通整理の人とか駐車場整理の人が振っている棒の白色LEDバージョン
  • 点滅しなくていい
  • 電源は外部から供給
  • 夜の散歩とかキャンプにいったときに使える感じにする
  • 4~5時間連続稼働できればOK。 電池が切れたら別のに交換する
  • 指向性が高いLEDライトはもう作ったので、広範囲でそこそこの明るさのものが欲しい


部品の選定基準
LED:角型白色LED。どちらかというと暖色系の方がよい。
電源:電池の電圧から20V程度の電圧を作れるもの。入手性がよく、簡単に使えるもの。


今回選んだ部品
昇圧回路:昇圧型DC-DCコンバータ5~25V可変出力電力モジュールキット(秋月) 500円
LED: OSM57LZ161D 10個入り 2パック(@400x2  800円)
定電流ダイオード:手持ちの 15mAのもの 2本(E-153 @50)
アクリルパイプ:外形25mm程度、厚み2mm程度 長さ300mm程度の適当なもの。 私は会社でゴミになる透明なアクリルパイプを1本もらってきて適当な長さに切って作りました。
基板用トグルスイッチ 1個。電源のON/OFF用


昇圧&点灯テスト
DC-DCコンバータモジュールは最大出力電圧が25Vですが、キリがよい24Vに調節しました。調節用の可変抵抗は動かないようにホットボンドで固めました。今回はLEDを7つ直列にし、定電流ダイオードでLEDストリングの電流を調節することにしました。LEDの数は実際に点灯させて調節しました。

概要図
記事ではカレントミラー回路を使用していましたが、LEDストリング間で電流が多少バラついても気にしないのと、定電流ダイオードも高い部品ではなくなってきているので、LEDストリングごとに定電流ダイオードをつける方式にしました。

ブレッドボードでテストした段階では、全体の消費電力はLED14個+CRD2個で24V 28mAとなり、 約0.67W、電池の方からは5.2V 150mA となっていたので約0.78Wとなっていました。
電池は1.2V 1900mAh  x4本なので、5~6時間は連続稼働するんじゃないかな~と思います。


電源ケーブル
今回のLEDライトは電源を外部にしたので、電源ユニットとLEDライトを結ぶ電源ケーブルが必要です。また、電源ケーブルはそこそこ荒く扱われても断線しないものが必要となります。
そのため、今回はねじられても踏まれても曲げられても健気に頑張るLANケーブルを利用することにしました。

LANケーブルはその辺にあるのを使うとして、ケーブルの受け口も必要になります。秋月電子でLANポート金具とDIP変換基板があったのでそれを使ってLANケーブルで給電できるようにしておきました。本来は信号線を2対使って給電するのがPoEの規格になっているのですが、今回はオレオレ給電なので外側の2本を24VとGNDとして使っています。


本体の防水加工
LEDと定電流ダイオードはユニバーサル基板を細長く切ったものにはんだづけしたので、アクリルパイプに入れて防水加工する必要があります。片側は適当な大きさのキャップの内側にホットボンドを山盛りにし、熱いうちにふたをしました。もう片方は電源ケーブルを出す必要があるので、電源ケーブルの終端に折り紙をぐるぐる巻きにして押し込むようにケーブルを収めてから、余った部分にホットボンドを盛りました。お風呂に沈めてはいないのですが、多分防水になっていることでしょう。


電源部分の加工
毎回悩む電池ケース部分。今回も100円均一で売ってるポリプロピレンのタッパーにしました。
LANポート金具の部分が外に出るようにカッターで切って、あとはみんな大好きホットボンドでひたすら盛りました。


 
自家用ならではの見た目度外視工作



出来上がり

行き当たりばったりで作った”ほぼ”防水LEDライト。
ケーブルの長さが1mぐらいしかありませんが、LANの延長コネクタをはさめば数十メートルは延長できます。アクリルパイプの外側を粗めの紙ヤスリでヤスリがけしたので、そこそこいい感じに光が拡散するようになりました。



本体部分の大きさは約30センチ。

点灯中の様子。電球色なので柔らかい感じに


今のところキャンプにいく予定はありませんが、夜の散歩でフィールドテストを重ねようと思います。


ではまた。


2012/05/18

BeagleBone Pin Guide Rev.2

前回、BeagleBoneの下に敷くものを作りましたが、いまいち使いにくかったので
Arduinoのように拡張ヘッダのすぐ横に名前がわかるようなものを作りました。

PDFデータとソースファイルは別館の方に保存してあります。

 Printable pin guide Rev.2  Download


印刷してはがきなどに貼ります。


こんな感じで切り出します。
枠もはさみで切っちゃってください


載せます

完成!!

2012/05/16

Python勉強中

BeagleBoneというキーワードでいろいろとググってると、pythonを使ってGPIOを制御したりPWM制御を行っている記事が見つかりました。

pythonは触ったことは無いのですが、この際なのでpythonもすこしかじってみることにしました。

ひとまず公式サイトのドキュメントを読んで、GPIOを制御するサンプルコードを写経しながら遊んでいます。pythonの対話モードによるテスト実行が便利だな〜と感じてます。

pythonでもCでも同じですが、マルチプレクサの設定や、gpioのexport/unexportを毎回するのは面倒になってきたので、BeagleBone用の便利なライブラリが無いか検索中です。

ではまた。

2012/05/13

UART通信を行う

BeagleBoneでUARTを行うために色々調べてみました。
BeagleBoneのURATポートが/dev/tty?にマッピングされているのがわからないため、
dmesgコマンドを使ってどのポートかを調査しました。


0.161328] omap_uart.1: ttyO1 at MMIO 0x48022000 (irq = 73) is a OMAP UART1
[    0.161641] omap_uart.2: ttyO2 at MMIO 0x48024000 (irq = 74) is a OMAP UART2
[    0.161924] omap_uart.3: ttyO3 at MMIO 0x481a6000 (irq = 44) is a OMAP UART3
[    0.162205] omap_uart.4: ttyO4 at MMIO 0x481a8000 (irq = 45) is a OMAP UART4
[    0.162494] omap_uart.5: ttyO5 at MMIO 0x481aa000 (irq = 46) is a OMAP UART5

あとは

Using the Serial and Analog Pins にあるように、omap_muxの設定を変更します。

cd /sys/kernel/debug/omap_mux/
echo 20 > uart1_rxd
echo 0 > uart1_txd
echo 21 > uart2_rxd
echo 1 > uart2_txd

muxの設定が完了したら、minicomなどのターミナルソフトで接続すればOKです。
試しにuart1_txtとurart2_rxd、uart2_txdとuart1_rxdをつなげて、minicomで互いに通信できたので問題なく動くようです。

ではまた。

2012/05/12

BeagleBone 配線ガイド

BeagleBoneには、92個の拡張ピンがありますが、リファレンスガイドのピン番号を確認し、ピンの場所を1つずつ数えながらジャンパワイヤを挿す、という作業に苦労します。

少しは効率よくジャンパワイヤを挿すために、ガイド用の用紙を作りました。
BeagleBoneを用紙の上に置くと、上下にピンの名前と番号が見えるようにしてあります。
一応細い線も引いたので、挿し間違えも減ると思います。

ガイド用紙。硬い紙に印刷するとよさそう


BeagleBoneを置いたところ。

用紙はPDFにして別館の方においておきました。
BeagleBone PIN_Guide


"""""""""""""""""""""""""""
   NEW!
BeagleBone Pin Guide rev.2
"""""""""""""""""""""""""""
ではまた。




A/D変換のテスト

BeagleBoneには、8つの12bit A/D変換がついています。
最大入力電圧は1.8Vとなっています。

今回は温度センサ LM35DZをつなげて、温度測定してみることにしました。

LM35DZは、0℃から100℃まで計測できる温度センサで、出力は10mV/℃となっています。
動作電圧は4V~20Vなので、今回はSYS_5Vから電源を供給しています。
LM35DZの出力を、AIN0(P9の39ピン)に接続し、温度測定を行いました。






時刻もNTPで補正できるので、簡易温度ロガーとしてすぐに使えそうな感じです。


今回のソースコードは以下の通りです。
/*
 *Beagle Bone
 *Sample code for analog input.
 */

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//LM35D
float VoltageToTemp(float voltage)
{
    //LM35D 10.0mV/Celsius
    return voltage*1000/10;
}

void printCurrentTime()
{
    //
    time_t t;
    struct tm *s_time;
    char str[100];
    (void) time(&t);
    s_time=localtime(&t);

    fprintf(stdout,"%4d-%02d-%02d %02d:%02d:%02d",1900+s_time->tm_year,s_time->tm_mon+1,s_time->tm_mday,
                    s_time->tm_hour,s_time->tm_min,s_time->tm_sec);

}

//Convert digitalvalue to voltage.
float digitalValueToVoltage(int digValue)
{
    int analogResolution=4096;//    12bit A/D converter in BeagleBone
    float voltage=0;
    float maxInputVoltage= 1.8f;
    float rate=(float)(maxInputVoltage/analogResolution);
    return (float)(rate*digValue);
}

int main()
{
    int filedescriptor=open("/sys/devices/platform/tsc/ain1", O_RDONLY);
    fprintf(stdout,"start templuture monitoring\n");

    char buffer[128];
    while(1)
    {
        int readcount=read(filedescriptor,buffer,sizeof(buffer));
        if(-1!=readcount)
        {
            buffer[readcount]=NULL;
            lseek(filedescriptor,0,0);//reset seek position
            int digitalValue=atoi(buffer);
            float voltage=digitalValueToVoltage(digitalValue);
            float templuture=VoltageToTemp(voltage);
            printCurrentTime();
            fprintf(stdout," ReadValue:%d\tVoltage:%2.3fV\tTemplture:%2.1f\n",digitalValue,voltage,templuture);
        }
        else
        {
            fprintf(stdout,"could not read from ain2\n");
            return -1;
        }
        sleep(1);
    }
    close(filedescriptor);
    return 0;
}

ではまた。



2012/05/11

LinuxとBeagleBoneのGPIOの関係


BeagleBoneのGPIOは、

  1. exportを使ってGPIOにアクセスできるようにし
  2. gpioN/value に値を書き込んだり読み込んで入出力を行い
  3. 使わなくなったらunexportする

という手順で使えるのですが、そもそもどうしてこうなってるの?と疑問に思ったので調べてみました。

オリジナル:GPIO Interfaces@kernel.org

GPIO Interfaces 勝手に翻訳
(よくわからないとこは飛ばしています)

GPIO:General Purpose Input/Outputは、ソフトウェアで柔軟に制御できるデジタル信号です。これらは様々な種類のチップにより提供され、カスタムハードウェアを開発するLinux開発者によく知られています。GPIOピンはそれぞれピンまたはBGAパッケージ上のボールに接続されています。基盤の回路図を確認すると、GPIOがどのピンに接続されているかを確認することができます。セットアップコードがドライバにその接続情報を渡すので、ドライバはGPIOに対してデータを書き込むことができます。

System-On-Chip(SOC)プロセッサは、GPIOに大きく頼っています。いくつかのケースでは、非専用ピンはGPIOとして設定することができます。そして、SOCプロセッサは数ダースものGPIO対応ピンを持ちます。

FPGAのようなロジックデバイスは簡単にGPIOピンを提供することができます。パ
ワーマネージャやオーディオコーデックなどの多機能チップ は、SOCのGPIOピン
不足を補うために少しのGPIOピンを持っています。また、I2CやSPIバスを使用し
てSOCに接続する、GPIOエ キスパンダなどもあります。大抵のPCのサウスブリッ
ジ(入出力コントローラがある側)には、数ダースのGPIOピンを持ちます。(BIOS
の ファームウェアがそれを認識している場合のみ)

GPIOの機能はシステムによって変わってきますが、共通の機能は以下の通りです。
- 1または0の値を出力できます。
- 1または0の値を読み取ることができます。いくつかのチップは出力モードになっているピンの値を読み取ることができます。また、GPIOコントローラはデグリッチ/デバウンスロジックを持ち、ソフトウェアで制御できる場合もあります。
- 入力ではIRQ信号が使える場合があります。IRQは待機中システムのウェイクアップイベントなどに使用できます。
- GPIOピンは大抵の場合、入力/出力を切り替えることができますが、製品によってはどちらか一方のみしか利用できないものもあります。
- ほとんどのGPIOはスピンロックを保持したままアクセスできます。

GPIO conventions
Identifying GPIOs
パス。 GPIOは正の整数で識別されるとのこと。負の部分はエラーコード用に使うようです。

Using GPIOs
パス。gpio_direction_inputとgpio_direction_outputを使って入出力を切り替えることができるようです。

Spinlock-Safe GPIO access
パス。マルチスレッドでなければ、IRQハンドラなどの中では安全にGPIOをメモ
リの読み取り/書き込み命令を使用してアクセスできるようで す。

GPIO access that may sleep
Claiming and Releasing GPIOs
GPIOs mapped to IRQs
Emulating Open Drain Signals
What do these conventions omit?
GPIO implementor's framework (OPTIONAL)
Controller Drivers: gpio_chip
Platform Support
Board Support
全部パス。


以下の項目が一番疑問に思ってたところの解答っぽいです。
Paths in Sysfs
以下の3種類のエントリーが /sys/class/gpio 内にあります。

  • GPIOをユーザ空間でコントロールするためのインターフェース
  • GPIOs自身
  • GPIOコントローラ ("gpio_chip")としてインスタンス化されます

これらは"device"などの標準シンボリックリンクに加えられます。

コントロールインターフェースは書き込み専用です。
/sys/class/gpio/

  • "export"...ユーザ空間はカーネルに対し、GPIOをエクスポートするよう問い合わせます。例: "echo 19 > export "は"gpio19"ノードを作成します。これはカーネルコードでなくても可能です。
  • "unexport"...exportと反対の作用を持ちます。例: "echo 19 > unexport " は"gpio19"ノードを削除します。

GPIOシグナルは /sys/class/gpio/gpio42/ のようにパスを持ちます。また、以
下のような読み取り・書き込み可能な属性を持ちます。
/sys/class/gpio/gpioN/

  • "direction" .. "in"または"out"のいずれかとなります。大抵の場合、directionは書き込み可能です。カーネルがGPIOのdirection変更をサ ポートしていなかったり、ユーザ空間に許可していない場合は、directionは表示されません。


  • "value" .. 0(low)か1(high)の値を持ちます。GPIOが出力に設定されている場合は、この値は書き込みできます。0でない値は"high"として扱われ ます。
  • "edge" .. "none","rising","falling","both"の値を持ちます。これらの値を書き込むことで、信号のエッジ形状を選択することができます。このファイルは、GPIOピンが割り込み要求可能な場合に表示されます。
  • "active_low" .. 0(false) か1(true)の値を持ちます。0以外の値を書き込むと、読み込み・書き込みの属性値が反転します。

GPIOコントローラは/sys/class/gpio/gpiochip42/のようなパスを持ち、以下の
読み取り専用属性を持ちます。
/sys/class/gpio/gpiochipN/

  • "base" .. Nと同じで、このチップで管理されるGPIOピンの最初を表します。
  • "label" .. 診断用に提供されます。(常に一意であるとは限りません)
  • "ngpio" .. 何本GPIOピンが管理されているかを示します。 (N to N + ngpio - 1)

Exporting from Kernel code
パス。

以上、GPIOについての調査でした。

2012/05/10

BeagleBone 到着

到着を待っていたBeagleBoneが夕方に届きました。

わくわくしながら箱を開けると、なぜかBeagleBoneの箱が1個しか入っていません。2個頼んだのですが。。在庫は400近くあったので在庫が無くて送れなかった、という訳でもなさそうです。
代金も2個分請求されているので、送品ミスでしょうか。ひとまずDigikeyのカスタマーセンターに「2個頼んだけど1個しかきてないよ〜」と連絡しておきました。

1箱しかない。。。

とりあえず1つは届いているので、早速開封。
内容物はBeagleBoneとUSBケーブル、SDカードアダプターとマイクロSDカードです。



Arduino, BeagleBone, BeableBoardの大きさを比較してみました。


サイズはArduinoより一回り大きい程度で、Arduinoと同じようにピンソケットが2.54mmピッチなのでブレッドボードを接続しての実験もしやすそうです。

今週末はBeagleBoneの練習として、GPIOの使い方やA/D変換、シリアル通信の実験をしてみる予定です。

ではまた。

2012/05/09

自作USBライト

秋月電子でチップLEDやハイパワーLEDを買ったので、USBライトを作りました。
USBのコネクタは不要なUSBケーブルを分解して使っています。

1つ目、USBメモリーのようなコンパクトさを目指してチップLEDを実装したタイプ。実装後はホットボンドで固めているので見た目はあまりよくありません。Make:こんなに美しい自家製デバイス見たことない の様に、レジンを使うともっと綺麗にできるかもしれません。
LEDはNFSW036CTを使用しました。側面にハンダ面が無いタイプだったので、SMDユニバーサル基板に付けれませんでした。 
LED3個と1個。そこそこ明るい
1個タイプ点灯時

2つ目、角形LED OSW57LZ161Dを使用したタイプ。去年の夏に作成。角形タイプはユニバーサル基板にきっちり付くので、砲弾型に比べ光軸を平行に保ちやすいです。

最新作、3WのパワーLED OSM5XME3C1Sを使用したタイプ。集光レンズも付けて明るさ&指向性を重視しています。熱対策として小さめのヒートシンクをくっつけてあります。

USB電源に取り付け
点灯中。かなり明るい。直視注意

パナソニックのUSB電源の容量が大きいタイプが出る様なのでホームページに確認しにいったら、5月末に発売するモデルからLEDライトアタッチメントが標準で付くとのこと。電気屋さんに並んだらどんな形になっているかを確認してみたいと思います。

ではまた。

Beagle Boneを発注


去年の11月ぐらいに、Beagle Boneが発売されて、日本で発売されるのを待っていましたが、Digikeyで日本からでも買えるようになっていました。
1台あたり約8,000円で、BeagleBoardの半額程度でした。

2台注文して今は配送待ちです。(5/6 発注 ->5/9成田到着。速いなぁ)

ただ待っているのも何なので、予習としてリファレンスマニュアルを読んでおくことにしました。


BeagleBone リファレンスマニュアル
自分が使いそうなところだけ勝手に翻訳

オリジナル:http://beagleboard.org/static/BONESRM_latest.pdf

シリアルポート
 BeagleBoneには4+1つのシリアルポートがあります。
UART1,2,4にはTx,Rx,RTS,CTSがあり、UART5はTx,Rxのみです。
(UART0はUSBポート経由,Tx,Rx,RTS,CTSあり)

A/D変換
 7つのA/D変換が付いています。(1秒に10万回サンプリング可能)
ただし、最大入力電圧は1.8Vなので、抵抗分圧やレベルシフタを使って1.8V以上の入力が無いようにしてください。VDD_ADCは1.8Vの電圧がかかっていますが、リファレンス電圧としてのみ使用してください。電源として使用しないでください。

GPIO
最大66本のGPIOピンが利用できます。3.3Vの入出力が可能です。
4つあるGPIOバンクのうち、それぞれ2ピンずつ割り込みピンとして利用できます。

TIMERS
 4本のタイマーピンが利用できます。

PWM
 最大8本のPWMピンが利用できます。
 ECAP PWMが2ピン利用できます(よくわからず)

5V DC電源
 Beagle Boneを動かすために、5VのACアダプタが利用できます。2.1mmセンタープラスのコネクタです。電圧の高いACアダプタ(7Vや12Vなど)をつないだときに備え、NCP349というチップが入っています。高い電圧がかかっている場合は、メインボードに電源が入らないようになっています。5VDCラインは拡張ヘッダにも接続されています。これは、拡張ヘッダに拡張ボードをつけた際、電源を供給できるようにするためのものです。

USB電源
Beagle BoneはUSB電源での駆動も可能です。通常、USBのポートは500mAまで電流を供給できます。USB電源で駆動している場合は、VDD_5Vには5Vが供給されないので注意してください。SYS_5Vには5Vが供給されています。

電源の選択
5VDCとUSBが両方選択されていた場合は、TPS65217Bが自動的に電源の選択を行います。I2Cインターフェースを使用して、供給源をソフトウェアから変更することもできます。

消費電力
だいたいの電力消費量は以下の通りです。
消費電流(mA@5V)
モード USB DC DC+USB
Reset 180 60 190
uBoot 363 230 340
KernelBoot 502 350 470
KernelIdling 305 170 290

USBが接続されているときは、FT2232とHUBの電源が入るため、消費電流が増加します。USBが接続されていないときは、これらのデバイスは待機状態となります。USB接続時に120mAほど消費電流が増えるのはこのためです。消費電流量は、SDカードにアクセスしたり、LEDにアクセスすると変動します。

電源ライン
 VDD_1V8
 VDD_1V8は1.8Vが出力されます。VDD_1V8は最大1200mA供給できます。VDD_1V8はプロセッサとDDR2メモリーにのみ接続されています。

 VDD_MPU
 VDD_MPUは1.1Vが出力されます。この電圧はソフトウェアにより最大1.25Vまで変更することができます。VDD_MPUはプロセッサのみに接続されます。

VDD_CORE
 VDD_MPUとほぼ同じ。

VDD_3V3A
 VDD_3V3Aは2つある3.3Vラインのうちの1つです。このラインには225mAまで供給することができます。このレールはプロセッサやSDカードスロットに接続されています。

VDD_3V3B
 VDD_3V3BはLAN8710,EEPROM,USBHUB,FT2232に接続されています。

VRTC
 VRTCには1.8Vが出力されます。最大100mA供給できます。プロセッサに接続されます。


ユーザLED
 4つのユーザLEDがGPIOピンに接続されています。
LED GPIO
User0 GPIO1_21
User1 GPIO1_22
User2 GPIO1_23
User3 GPIO1_24

10/100 イーサネット
(省略)

USBホスト
USBホストポートが1つあります。このポートは最大500mAまで供給することができます(十分な容量の電源に接続している場合)


その他:C/C++でBeagle Boneの入出力を制御する方法のチュートリアル(英語)


Beagle BoneはArduinoよりのBeable Boardです。
ファンレス省エネサーバとして使ったり、カメラ付きラジコンの基板として使ったりと、色々遊べそうな感じです。

ではまた。

2012/03/13

MacBookAir用 HDMIケーブル

自分の部屋は寒いのでリビングでソフトの開発をしているのですが、リビングで使用しているMacBookAir(11-inch, Mid 2011)は解像度が1366x768しか無く、EclipseなどのIDEを表示するにはちょっと狭いです。
そこで、AmazonでThunderboltからHDMIに変換するアダプタを購入しました。
購入したケーブルは ランサーリンク MHC-18CB です。
家にあるI-O DATAのHDMI対応モニタにつないだところ、問題なくセカンドディスプレイとして使用できました。数年前のREGZAもセカンドモニタとして使えたので、HDMI対応のモニタならばほぼ問題なく使用できるような気がします。
スリープ後はMac側の電源ボタンを2〜3回押したり、ふたを開けたり閉めたりしないとモニタが点灯しないという現象が発生していますが、使用に支障が出るほどではないので気にしていません。

これで快適な開発ライフが送れそうです。

ではまた。

2012/03/07

ブギーボード検出アプリを作る(3)

ブギーボードに書いたデータを画像として保存するため、ブギーボード検出アプリをAndroid向けに開発しています。
OpenCVのバージョン2.3でAndroidが正式サポートされてはいるのですが、ビルド手順が面倒なので今回はOpenCV1.1を使用しています。特殊な関数は使用していないため、OpenCV1.1で十分です。

とりあえずはカメラプレビューの画像を使用して、ブギーボードの中を検出して画面に表示する部分までを作成しました。あとは画像を保存する部分と、検出時のパラメータを変更できるようにすればアプリとして使えそうです。処理時間もだいたい1フレームあたり400ms程度なので、速度面も問題無いと思います。

ひとまずAndroidでブギーボード検出ができました


ではまた。