趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • RasPiに緊急地震速報を報告させてみました

    投稿日 2013年 10月 30日 5個のコメント

    連続稼働に向けてラックに吊り下げたRaspberryPiですが、こいつに緊急地震速報を報告させてみました。

    Pythonのスクリプトとして作ったのですが、処理としては以下のような感じです。表示および音声合成は別スクリプト&別スレッドにすることで、表示処理と音声読上げを同時に起動し、遅れをなるべく少なくするようにしています。

    1.RaspberryPiでEEWBOTを監視し、地震速報を取得する

    Twitterのアカウントでeewbotというbotアカウントを運営している方がいて、実験的に高度利用者向けの緊急地震速報をcsvで配信されています。
    こちらのtweetをストリーミングAPIで受けとります。

    2.受信した内容をデコードします。

    デコードと言っても、都合のいいように表示用と読上げ用のテキストを生成するだけです。

    3.USB接続のLCDに表示させます

    生成したテキストをUSB接続のLCDに表示させます。

    4.スピーカに音声出力します

    RaspberryPiに接続したスピーカに合成音声で出力します。音声合成にはAquesTalk Piを使っています。いわゆる「ゆっくり声」で読み上げます。(笑)
    (注:AquestTalk Piは商用利用では有償なので、真似する人はご注意を)

    いまのところ、RaspberryPiのスピーカ端子にダイソーの100円スピーカ(ケーブルなし)を挿しているので、音量が小さくて静かな状況でないと聞き取れません。なるべくシンプルかつ小さくアンプを仕込む方法を考えています。

    5.動かしてみて

    遠めの地震だと地震速報の読上げ&表示後に揺れがきます。比較的近くだと揺れが先か同時くらいですが。音声だけだと読み取れなくても同じ内容がLCDをみれば表示されているので、読上げ完了を待たなくても内容がわかりますし、聞き取れなくてもやはり内容はわかりますので、結構便利です。

    ちなみに、日本気象協会の地震情報(tenkijp_jishin)もフォローしていて、その内容もそのまま表示&読上げをしています。こちらは緊急地震速報が落ち着いてしばらくしてからTweetされます。

    6.メモ

    以降は自分用のメモです。

    動かすの使った追加パッケージは以下のとおり。

    $ sudo apt-get install python-gd
    $ sudo apt-get install ttf-kochi-gothic-naga10 ttf-kochi-mincho-naga10
    $ sudo pip install pyserial

    「TweetToVoiceLCD.py」を走らせれば動作開始。


  • 気圧計の電池がなくなりました

    投稿日 2013年 10月 30日 コメントはありません

    先に作った気圧計ですが、連続稼働していたら電池がなくなってました。稼働し始めて約9~10日というところですが、もともと何かの電池として使っていたものを持ってきたので、寿命としては怪しいです。
    なので、改めて新しい電池(といっても、ダイソーアルカリ乾電池ですが・・・)を入れてみました。

    さて、どのくらいの寿命となるでしょうか。


  • Raspbianにavahi-daemonをインストール

    投稿日 2013年 10月 29日 1つのコメント

    これまでネットワーク上のRaspberryPiにSSHでリモートログインする場合には、事前にIPアドレスを固定で割り振っておいて、

    $ ssh pi@192.168.1.41

    とかしていました。しかし、これは結構面倒くさいし、スマートじゃない。RasPiの場合はSDカード側にホスト情報が保持されているので、RasPiが複数台あるとIPアドレスがぶつかりそうになります。

    で、簡単に済ます方法が avahi です。調べると、BonjourのOSS版っぽいことが書いてあったり、Zeroconfだぁとか書いてあったりしますが、要は固定IPじゃなくても極めて簡単に名前ベースでsshとかrdpとかが使えるようになります。

    インストールは、

    $ sudo apt-get install avahi-daemon

    です。

    RaspberryPi側のホスト名(/etc/hostname)が「raspberrypi」だとすると、インストール後には「raspberrypi.local」で名前解決できるようになります。そうすると、

    $ ssh pi@raspberrypi.local

    でSSHログインできたり、

    $ sshfs pi@raspberrypi.local:/ /mountpoint

    でsshfsでマウントできたり、

    $ rdesktop -u pi raspberrypi.local

    でリモートデスクトップ接続ができます。また、

    $ avahi-brouse -ar

    でローカルネットワーク上の対応しているサービスの一覧を表示させることができます。

    SDカードにホスト名を書いておけば、DHCP環境ではIPアドレスがぶつかる心配をすることなく複数のRaspberryPiを動作させることができます。

    ※別にRasPiでなくてもBeagleBoneでも同じ手順で対応できます。


  • RaspberryPiで工作

    投稿日 2013年 10月 25日 コメントはありません

    今回はRaspberryPiで工作をしてみました。

    OLYMPUS DIGITAL CAMERA

     

    見ての通り、RS Componentsのケースを木の板にネジ止めして、そこにRaspberryPiをはめ込んだだけです。放熱とLEDが見えるようにするためRSのケースのふたの部分は使わないことにしました。設置場所がないので、写真の通りラックに吊り下げる形での設置にしました。

    電源を供給するACアダプタがそこそこ暖かくなるので今の時点では長期連続運転は心配ですが、より余裕のある高容量のACアダプタに交換した後は連続稼働させようと思っています。


  • PIC18F14K50の他のサンプルを動かしてみる

    投稿日 2013年 10月 22日 コメントはありません

    調子に乗ってPIC18F14K50の他のサンプルを秋月の800円ボードで動かしてみました。

    動作環境はLinuxMint13 + PicKit3です。「MPLAB-X」「MPLAB C18ツールチェーン」「Microchip Library for Applications」はすでにインストールされているものとします。(といっても、ダウンロードして、スーパーユーザー権限でスクリプトを走らせるだけでインストールできますが)

    まず、サンプルプロジェクトを開いて初期設定を行います。ここではUSBキーボードのサンプルプロジェクトを動かしてみます。

    1. MPLAB-Xを起動します
    2. 「File」→「Open Project」で既存のプロジェクトを開きます。
      ダイアログボックスが開くので、ホームディレクトリの下の
      $HOME/microchip_solutions_v2013-06-15/USB/Device – HID – Keyboard/Firmware/MPLAB.X
      を開きます。
    3. プロジェクトが読み込まれますが、この状態では他のチップ用になっていますので、PIC18F14K50では動きません。
    4. 「File」→「Project Properties(Device – HID – Keyboard)」でプロジェクトの設定を行います。
    5. 左下の方にある「Manage Configurations」をクリックします。
    6. 開いたダイアログから「LPC_USB_Development_Kit_PIC18F14K50」を選択して、右側の「Set Active」ボタンをクリックします。
    7. 「LPC_USB_Development_Kit_PIC18F14K50」の右側に「(active)」が移動したら、「OK」をクリックします。
    8. 左側の「Categories」から「Conf: [LPC_USB_Development_Kit_PIC18F14K50]」の下にある「PICkit3」を選択します。
    9. 右半分がPICkit3関連の設定画面に変わります。
    10. 上の方の「Option categories:」から「Power」を選択します。
    11. 「Power target circuit from PICkit3」にチェックを入れて、「Apply」をクリックします。
      こうしないと、秋月の800円ボードに電源供給されないので書き込みができません。
    12. 「OK」をクリックして、ダイアログを抜けます。

    次にビルド&書き込みを行います。

    1. 秋月の800円ボードのUSBコネクタをホストから外します。ICSPの信号線とUSBのD+/D-の信号線は同じ端子なので、USBを抜かないと書き込みできません。つまり、電源も供給されないので、PICkit3から電源供給してやらないとダメなのです。
    2. 次に、一旦PICkit3のUSB端子を外して改めて接続します。外すことでPICkit3からの電源供給を止めてやります。そうしないと、次にボードと接続する際に活線挿抜になってしまいます。運が悪いとボードが壊れるかもしれません。
    3. 秋月の800円ボードのICSP端子をPICkit3に接続します。
    4. IDE上の下向きの緑矢印がついたボタン(マウスカーソルを載せると「Make and Program Device」という表示が出ます)をクリックします。
    5. しばらくまつとコンパイル、書き込み、ベリファイが行われます。
      「Programming/Verify complete」と表示されたら完了です。
    6. PICkit3をボードから引き抜きます。
      この段階でPICkit3側のMiniUSBコネクタも一度引き抜いておいてもいいでしょう。
    7. 適当なエディタを開いて、新しいファイルを作成して、文字入力ができる状態にしておきます。
    8. ボードのUSBコネクタとホストをUSBケーブルで接続します。
    9. エディタに勝手に文字が入力されていきます。
      ここで慌てて他のウインドウを選択するとそちらに入力されていきますので、ご注意を(笑)
      動作を確認したら、USBケーブルを抜きましょう。

    本来は評価ボードにはスイッチがついているので、そのスイッチを押すと文字が入力されるようなのですが、800円ボードにはそんなものはありませんので、勝手にキー入力されていってしまいます。

    何のキーが入力されるかは、keyboard.c の907行目で HID REPORT にキーのコードに相当するusageを設定しています。usageはUSBの仕様書のうち、HID Usage Tableの53頁からの一覧表に乗っていて、4が「A」のキーに相当します。その後の926行目付近ではキーを話した場合のREPORTを送っています。

    この辺を読んでソースを弄っていけば、変なキーボード(CTRL + ALT + DEL専用キーボードとか)も作れるはずです。(^^;


  • LPS331による気圧計の製作

    投稿日 2013年 10月 21日 コメントはありません

    しばらく前に秋月で安価な高精度気圧センサLPS331のモジュールが出ていたので購入してあったのですが、これを電池駆動の気圧センサとして仕立ててみました。

    OLYMPUS DIGITAL CAMERA

    おもなキーパーツは、

    • 気圧センサ:LPS331AP
    • 液晶モジュール:AQM0802A
    • マイコン:PIC16F1823
      何でもよかったのですが、手頃なサイズでI2Cをもっているので採用しました。
    • スイッチングレギュレータ:HT7750A
      47uHのインダクタを使って一旦5Vを生成します。
    • CMOS三端子レギュレータ:S-812C33AY-B-G
      5VからPICマイコンおよびLCDモジュール用の3.3V生成に1個、センサの電源用に1個使っています。消費電流を抑えるため、CMOSのレギュレータとしています。

    といったところです。

    小型軽量かつ長時間駆動を目指すため、単4電池1本からスイッチングレギュレータを使って電源を生成しています。
    当初はHT7733Aを使用し、LCフィルタでノイズを低減して使用していたのですが、どうも動作が安定しないのでノイズが原因かと疑って、一旦5Vにしてから3.3VのCMOSリニアレギュレータで電源を生成しています。(根本原因は他にあったので、結局これがどのくらい影響しているかはわかりません)

    OLYMPUS DIGITAL CAMERA

    センサにはLEDが搭載されていますが、電池での動作時間を伸ばすため、その右上の電流制限抵抗を除去することでLEDへの電流をカットしています。

    OLYMPUS DIGITAL CAMERA

    背面は試行錯誤の繰り返しで汚くなってしまいました。

    ソフトウェアはMPLAB-X+XC8で作成していますが、このLPS331というデバイスは結構くせがあり苦労しました。(XC8にもいろいろ癖があって苦労しました)
    当初は自動モードで勝手に連続変換させて、変換終了時に割り込みにてPICに通知、値を読み取って表示させようとしていました。しかしこちらの記事にあるように連続モードで変換すると、変換の処理自体?が抜けていることがあるのです。そこで、約1秒周期でワンショットの変換コマンドを発行することにしたのですが、それでも表示の変動が起こります。「レジスタは初期値に関わらず全部書き込まないとダメ」など、いろいろWebで見かけた情報を取り込みながら、最終的には約2秒周期での変換とすると変換値の暴れが収まるようですので、約2秒周期での変換&表示としています。それでも時折温度については±1℃程度の範囲で暴れることがあるようですが、妥協しました。

    OLYMPUS DIGITAL CAMERA

    以前作ったArduinoベースの温度・湿度・気圧計との比較です。

    気圧についてはLPS331APの方がごくわずか・・・0.2hPa程度ですが、低めに出る傾向があるようです。
    温度の方はLPS331APの方が0.7℃程度ですが低めに出ています。
    値の安定性については気圧・温度ともにSCP1000の方が明らかに安定しています。

    LPS331のほうはドキュメントもよく読むとおかしな所が結構あって(ドキュメントの)出来がよくありません。ドキュメントの出来が悪いデバイスは概してデバイス自体にもいろいろ問題を抱えている場合が多いように経験しています。

    #原因切り分け用に買い足したLPS331APがあるのだけど、どうしようかな・・・(^^;

    それと消費電流ですが、電池のところで測定すると、センサが動作していないタイミングでは1.8mAくらいで、センサが動作すると4mA程度に上がります。ただ、デジタルテスタで測定しているので、どのくらいが本当のピークなのかはわかりません。センサの動作時間自体は100msにも満たないようなので、平均でも2mA以下くらいなのでしょうか。2mAとすると、単4アルカリ乾電池の容量は700~800mAh程度のようですので、電池1本で350~400時間程度(電圧が下がってくるので、もうちょっと短いか)=約2週間程度の動作時間というところでしょうか。

    現状では消費電流を下げて駆動時間を伸ばすためにPICの動作周波数は内蔵オシレータ使用で125kHzとしてあります。さらに消費電流を下げるために表示更新の待ち時間でのPIC自体のスリープも考えたのですが、内部の31kHzのLFINTOSCでスリープ動作させる方法が見つかりませんでした。どうやら外付けの32kHzのクリスタルで動作させないといけないようで、そこまで部品追加するのは面倒なので止めました。

    ソースも置いておこうかな・・・と思ったのですが、コメントが古い(試行錯誤する前)ので、とりあえずやめておきます。(コメントを整理したら置くかも・・)


  • TwitterをUSB LCDモジュールに表示させてみる

    投稿日 2013年 10月 13日 コメントはありません

    製作したUSB LCDモジュールですが、Twitterのtweetを表示させてみました。

    Streaming API で指定したキーワードが含まれているTweetを表示させてみます。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys, json, tweepy, re, os
    
    # Account
    consumer_key= '        '
    consumer_secret= '        '
    access_token= '        '
    access_token_secret= '        '
    
    class Listener(tweepy.streaming.StreamListener):
        def on_status(self, status):
            message = status.user.name.encode("utf-8") + ":" +  \
                      re.sub(r'\n',r' ',status.text.encode("utf-8"))
            print status.id,":", \
                   status.lang,":", \
                   status.user.screen_name.encode("utf-8"),":", \
                   status.user.name.encode("utf-8"),":", \
                   re.sub(r'\n',r' ',status.text.encode("utf-8"))
            os.system('./usblcd.py "'+message+'"')
            return True
     
        def on_error(self, status):
            print status
      
    if __name__ == '__main__':
        l = Listener()
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
     
        stream = tweepy.Stream(auth, l)
        stream.filter(languages=['ja'],track=['tbs','fujitv','ntv','tvasahi','tvtokyo'])

    今回はキーワードを’tbs’,’fujitv’,’ntv’,’tvasahi’,’tvtokyo’として、テレビ局に関するTweetを拾ってみます。

    sDSC06133

    Pythonスクリプトを動かすとこんな感じで表示されました。

    どんどん表示される感じがわかるように動画ファイルも上げておきます。

     


  • USB LCDモジュールの製作

    投稿日 2013年 10月 12日 コメントはありません

    PIC18F14K50を使ってUSBで接続・制御するグラフィックLCDモジュールを作ってみました。

    OLYMPUS DIGITAL CAMERA

    LCDモジュールは手持ちの秋月の128×64のグラフィック液晶です。

    OLYMPUS DIGITAL CAMERA

    PIC18F14K50では端子が不足するので、74HC273(Dラッチ)を使って制御信号をラッチしてからLCDモジュールのデータ線に信号を与えています。

    OLYMPUS DIGITAL CAMERA

    この74HC273はパーツ箱に眠っていたもので、デートコードは8820でした。つまり1988年の第20週ですから25年以上前の1988年5月下旬頃に製造されたものということになります。無事に動くか少し不安ではありましたが・・・。

    OLYMPUS DIGITAL CAMERA

    裏側はこんな感じでぐちゃぐちゃになってしまいました。本当はLCDは180度回した形で取り付けたかったのですが、このLCD、図面の右側から端子が振ってあって、思いっきり間違えてしまいました。それで急遽LCDの方を回して、コネクタをもう一つつける形にしてしまいました。

    ファームウェアは例によって /dev/ttyACM0 としてUSBシリアルとして認識されるようになっていて、液晶モジュールへの制御信号とデータの繰り返しで垂れ流すとそのままLCDモジュールをPICが制御するようになっています。PC側はPythonで記述してあって、一旦GDライブラリを使ってビットマップ上にTrueType(のビットマップフォント)を展開した後、LCD用のコマンド列を生成するようになっています。LCDにはnaga10フォントで半角24文字×6行の表示ができるようになっています。


  • 今度はBeagleBoneBlack + Arduinoが登場?

    投稿日 2013年 10月 5日 3個のコメント

    またHACK A DAYの記事からですが、インテルアーキテクチャのArduinoに続いて、またArduino関連で新しい話がでてきました。

    どうも、BeagleBone.orgとArduinoのコラボレーション・・・ということらしいのですが、Arduino Treというのが2014年4月に登場するみたいです。

    (写真はArduino.ccからの借用です)

    内容はArduino+BeagleBoneBlackのようで見たまんまみたいです。

    Arduino側はATmega32u4 16MHz、BeagleBone側はAM3359(Cortex-A8) 1GHz+DDR3 512MBとのこと。

    ネットワーク通信と負荷のかかる演算処理はCortex-A8側で、リアルタイム性の要求される制御や現存のArduinoのシールド資産を使った制御はArduino側で、ということでしょうね。

    気になるのはお値段です。Arduinoはハードウェアとしては大した回路ではなく、両面基板でも実現容易な部類なのですが、BeagleBoneBlackの方は(電子工作向けとしては)かなりの高スペックな基板・・・確か6層の微小スルーホール仕様だったと思います。BeagleBoneBlackはサイズを徹底的に切り詰めている感じでしたが、こちらではそれを結構大きなサイズで使うのでお値段も安くなさそうな気がします。

    あとは、BeagleBoneBlackの方は、もうちょっとOSの方がなんとかならないかと・・・(^^;


  • インテルアーキテクチャのArduino登場!!

    投稿日 2013年 10月 4日 コメントはありません

    HACK A DAYのこの記事で知ったのですが、インテルがローマのMaker FaireでArduinoとハードウェア(シールド)およびソフトウェアコンパチブルの開発ボードを発表したようです。その名も「ガリレオ(Galileo)」。

    (画像は Arduino.cc からの借用です)

    本家arduino.ccの記事によると、ボードとしてのハードウェアスペックはこんな感じみたいです。

    • Atomプロセッサよりもさらに小さな(=低コスト、低消費電力)Quarkという400MHzの32bit Pentium相当のCPUコアを搭載。
      Quarkについては9月に行われたIDF(Intel Developper Forum)で発表された組み込み向けのプロセッサの模様(参考記事
    • オンチップの16KBのL1キャッシュ、512KBのSoC内蔵SRAM(いわゆるスクラッチパッドでしょう)
    • Fast Ethernet(10/100M)
    • PCI-Express ミニカードスロット
    • USB2.0 ホストコネクタ
    • USB2.0デバイスコネクタ(Arduinoとしてのプログラミング用)
    • JTAG
    • リセットボタン
    • 8MBのSPIフラッシュメモリ
    • 32GBまでのMicroSDHCコネクタ
    • 11KBのEEPROM

    Arduinoとしては、

    • シールドがそのまま使える(細かくはI2Cのスレーブが使えないとかあるみたいですが)
    • アナログ、デジタル(PWM含む)の端子はそのまま使える模様
    • digital 1ピン、2ピンのシリアル(UART)も使える
    • Arduinoの開発環境からボードとして「Intel Galileo」を選択すると、Arduino IDEの開発環境でそのまま使える
    • スケッチがボード上の不揮発メモリに残っていれば電源ONで動作する(Arduinoも同じですね)
    • 電源は5V入力で、ACアダプタの定格としては3Aを推奨。
      一見大食いですが、3.3V、5Vの各ピンの電流として800mAという記載があるので、その分を含んでいるのでしょう。

    というところで、Arduinoっぽいものを目指しているのではなく、Arduinoとの高い互換性を狙っているように見えます。

    インテルはこのボード(Galileo)を大学向けに5000枚ほどバラ撒くようです。(参考記事

     

    ・・・・で、感想です。

    今ある情報だけではソフトウェアの構成がいまいちわかりませんが、単なるArduinoの領域に400MHzのPentiumはオーバースペック過ぎるように思えます。当然インテルもわかっているでしょうが。ただ、ロボット関連などでは結構な演算性能が求められるはずなので、必要な分野もあるだろう、ということでテストマーケティングに投入する(寄付する)のでしょう。

    そして興味深い(期待したい)のは、今後、どの分野に展開していくかです。

    今時、ネットワークおよびネットワークに関連する機能(http,smtp,ftp,cifs,…)は様々な機器(お遊び含む)で求められるので、それをお気楽お手軽に実現するための基盤としてLinuxをみんな使う(使いたい)わけです。だから安価で環境の整っているRaspberryPiやBeagleBoneに興味を示す人が多いわけです。

    となると、Galileoボードは安価に市販されるのか、Linuxは動作するのか、というところが注目したいところです。Pentium 400MHzクラスであれば、GUIは別にしてLinuxでもBSDでも問題なく載るはずです。そこに膨大なArduinoシールドの資産を使うと、いろんなものが作れる(作る人がいる)のではないか、と思うのは自分だけではないはずです。

    BeagleBoneBlackが49ドル、RaspberryPiが35ドルで販売されていることを考えると、60ドル以下、できれば50ドルを割る価格で販売してくれないかな~、と思うんですが、どうでしょう、インテルさん。70ドル以上ではAndroidとRaspberryPiで爆進するARM版Linux・・・このままではいずれ(すでに?)組込み分野で席巻することになるでしょう・・・の勢いは止められないと思いますので。

    いずれにせよ、今後に注目です。