Top > メモ_KuroBox

玄箱proにGPSを使ったアプリを仕込もうとしています。

目的

位置に応じて音声案内を多国語で行う。 音声はUSB-audioで発声して、FM送信機( http://www.daimonji.org/products/NR-B99-108.html )でそれぞれの言語毎に異なる周波数で送信する。

手順

玄箱をDebian化( http://mycomputer.cqpub.co.jp/pro/ )

  • 最初Fedoraを入れて随分遊んでしまったが、まずは素直に本の言う事を聞くことにした。
  • apt-getかyumかの違いかと思ったが、apt-getの方が心なしか応答は早いような気がする。
  • 参考にしたFedora(8)のuImageにasoundが無かったのでKernel remakeもちょっと恐かった。(漏れがありそうな気がして。。)

サウンド出力

  • ALSAのモジュールを片っ端からapt-getでインストール
  • ALSAのプロジェクトホームページにUSB対応機器があまりなかったので不安だったが、USB-audioというだけで手元のUSB-audioが鳴る事がわかった。Creative X-Fiは音は鳴るけど、まともじゃない。。これは別にドライバが要りそう。
  • Soundははじめ580円の3D-soundってやつを使おうとしたが、FM送信機の変調が浅すぎた。Sound Blaster Play! だと十分な出力が得られて10mは十分コンパクトラジオで受信できた。
  • 4カ国語(日本語、英語、韓国語、中国語)を出力したいので、USB-Hubを介していきなりUSB-audio(580円のやつ)を4つ指したらいきなりKernelがpanicになってしまった。
    • linux 2.6.25.4 だけど余裕ができたら新しいkernelでuImageを作り直してみよう。
  • /proc/asound等をみたらちゃんと4つのサウンドデバイスを認識しているみたい。
    • ただ、alsaplayerでdeviceを指定する方法がまだわからない。
    • おそるおそる2本差しをしてみたらpanicにはならない。とりあえず4カ国語は, 玄箱4つは必要ないかも。できれば1台でやりたいところだが。。。

GPSのデータ取得

  • GPSのUSB-Serial(PL2303のドライバは最初から入ってた)の確認
  • /dev/ttyUSB0 から1行毎に
    $GPGGA,092411.997,3441.3616,N,13529.7422,E,1,08,0.9,81.9,M,37.2,M,,0000*6C
    $GPGSA,A,3,05,27,10,21,09,02,29,28,,,,,1.9,0.9,1.7*3D
    $GPRMC,092411.997,A,3441.3616,N,13529.7422,E,000.0,312.1,120110,,,A*6B
    $GPVTG,312.1,T,,M,000.0,N,000.0,K,A*0C
    $GPGGA,092412.997,3441.3612,N,13529.7426,E,1,08,0.9,82.5,M,37.2,M,,0000*60
    $GPGSA,A,3,05,27,10,21,09,02,29,28,,,,,1.9,0.9,1.7*3D
    $GPRMC,092412.997,A,3441.3612,N,13529.7426,E,000.0,312.1,120110,,,A*68
    $GPVTG,312.1,T,,M,000.0,N,000.0,K,A*0C
    という感じでASCII textで位置情報が得られる。 NMEA(何と読むのかな)フォーマットってやつ。
  • 単純に stty --file=/dev/ttyUSB0 cs8 speed 38400; cat /dev/ttyUSB0 とかやるだけで読み出せる。もちろんminicom, cu等を使ってもOK。
  • どっちみちプログラムを書かなくちゃいけないので、Cで字句の切り出しする気にならないし、音声はalsaplayerまかせのつもりなのでスクリプト言語を使うつもり。
  • Ruby1.9をソースからインストール
    • Gems, Rake まではよかったが、ruby-serailportではまってしまった。1.9だとrubyioまわりでOpenFileがいきなりundefinedになる。
  • ALSAまわりがPythonが多数だったのでPyseriralに変更
    #!/usr/bin/python
    import serial
    ser = serial.Serial('/dev/ttyUSB0',38400,timeout=1)
    while True:
      line = ser.readline()
      print line
    ser.close()
  • これだけでGPS読み出しがOKで、音声出力も出来た。ここまでで道のりの8割かな。
  • このGPSはMacOS-Xでも素直に読める。MacOS-X 10.5.xだとruby1.8.6)
  • 何もしなかったように思うんだが、もしかしたらPL2303のドライバを無意識に入れたかも知れない。
  • lsusbは無いが/Developer/Applications/Utilities/USB ProberでUSBを確認。
  • デバイスファイルは /dev/cu.usbserial
  • NMEAの緯度経度は度*100+分という不思議な単位。つまり少数点以下は分の(1未満の)十進表現になる。秒の概念はない。どうせなら分単位にすればいいのに。
  • ということで10進の度単位で、緯度経度だけrubyで読み出すとだいたいこんな感じ。
    #!/usr/bin/ruby
    require 'rubygems'
    require 'serialport'
     
    def deg60to10(d,m,s)
      d.to_f+m.to_f/60.0+s.to_f/60.0
    end
     
    class GPS
       def initialize(port)
          @sp=SerialPort.new(port, 38400, 8, 1, SerialPort::NONE)
       end
       def analize(cmd,*arg)
         case cmd
         when "GGA"   #Global Positioning System Fixdata
           if(arg[3] == "0")
             return nil
           end
           hour=((arg[0][0..1]).to_i+9)%24
           min =arg[0][2..3]
           sec =arg[0][4..5]
           /(\d\d)(\d\d)(\.\d+)/=~ arg[1]
           lat=deg60to10($1,$2,$3)
           /(\d\d\d)(\d\d)(\.\d+)/=~ arg[3]
           lng=deg60to10($1,$2,$3)
           return lat,lng
    #    when "GLL"   #Geographic Position, Latitude and Longitude
    #    when "GSA"   #GNSS DOP and Active Satellites
    #    when "GSV"   #Satellites in View
    #    when "RMC"   #Recommended Minimum Specific GNSS Data
    #    when "VTG"   #Cource Over Ground and Ground Speed
    #    when "ZDA"   #Time and Date
         end # case
         return nil
       end # def
       def read()
         line=@sp.gets.chomp
         if(/^\$GP([A-Z]{3}),(.+)\*([0-9A-F]{2})$/ =~ line)
           cmd=$1
           arg=$2.split(/,/)
           chk=$3
           return analize(cmd,*arg)
         end
         return nil
       end
       def close()
          @sp.close
       end
    end
    
    g=GPS.new('/dev/tty.usbserial')
    while true
      if(point=g.read())
        p point
      end
    end
    g.close()

付録

  • 余裕をかまして vncを使おうと X11関係を片っ端からapt-getでインストール。
  • afterstepまで入れたが、MacOS-XのChicken of the VNCでは色が出ない。。なんでかな。
  • Windows+Firefox+Java VNC Clientの方がたちはいいな。Javaの方が応答がいいとは。

リロード   新規 下位ページ作成 凍結解除 差分 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Mon, 22 Feb 2010 14:00:58 JST (2830d)