2015年5月5日火曜日

BeagleBone Black モーター制御

初モーターです。


使用した部品

・タミヤ:ツインモーターギアボックス
・タミヤ:ユニバーサルプレート(2枚セット)
 ⇒ 3階建てにしたので、同じものをもう1つ購入した
・タミヤ:トラック&ホイールセット
・モータードライバ:TA7291P x 2
・エネループ単三4本(モーター用、VS接続)
・電解コンデンサ:10uF(容量はTA7291Pマニュアル通り)
・モーターの両端に0.1uFを追加したほうがいい

回路図

・モーター1個につき、GPIOを2つ、PWMを1つ使用
 ⇒ GPIO(IN)にPWMを使う方法もあるが、PWMの数に制限があるのでVrefにPWMを使う
・図はモーター1個分、同じものをもう1個分必要
・モーター電源は2つのモーター共通でエネループ4本(約4.8V)を使用
・図のUSBシリアル変換はモーターとは関係ない



mjpg-streamer


・BBBの制御は mjpg-streamer を改造して使う
・mjpg-streamer は下記の r182 が最新、だと思う
 ⇒ http://sourceforge.net/projects/mjpg-streamer/

・www 下の stream_simple.html を HTML5化、jQueryMobile を使って改造して使用する
・mjpg-streamer には UI からコマンドを送る仕組みが用意されてるのでそれを使う
・jQueryMobile で使用する部品は、ボタンとチルトパン用のスライダー
・スマホ、タブレットでは onmousedown、onmouseup の代わりに、ontouchstart、ontouchend を使う
・具体的には、output_httpプラグインにモーター、サーボの制御を書く
・ボタンやスライダーを操作したとき、マルチスレッドでコマンドがたくさん送られてくるので排他制御を入れること
 ⇒ スライダーをドラッグするとたくさんのコマンドが送られてきてスムーズに動かない(小刻みに右左に動く)
 ⇒ 排他制御中は、現在の値と設定中の角度へのコマンドは無視するようにすると落ち着いた
・カメラは手持ちの Webcam Pro 9000 をばらして、カメラマウンタにゴムで仮止め
 ⇒ ほんとはカメラモジュールを使いたかったけど、高いし、配線が多くなる。。
 ⇒ RaspberryPi ならカメラモジュールあるけど、PWMを4つ使う(モーターに2つ、サーボに2つ)のに、1ポートしかないのが致命的、SoftPWMもあるらしいけど、10us単位の精度は出ないはず
 ⇒ USB接続のカメラモジュールで安くてHDなものがあれば。。


感想

・モーターは特に苦労もなく、簡単に回る回る
・キャタピラが1番苦労した、、絨毯の上を走行してると、曲がろうとするとすぐにキャタピラが外れる
 ⇒ フローリングしかまともに走らない
・ユニバーサルプレートの下段に、ツインギアボックスとエネループ4本の電池ボックスを載せた
 ⇒ 電池ボックスの穴とプレートの穴が微妙に合わず、プレートの穴をヤスリで削って調整
・モータードライバのブレッドボードが場所を取るので基板化が必要
・残りはUSBハブ(セルフパワー)の電源をモバイル電源から取るようにすれば一通り完成
・その後は、測距、加速度、ジャイロなどのセンサーを載せたり、OpenCVで自律走行させたりの予定



参考にしたサイト

http://nonbirikousaku.blog.fc2.com/blog-category-3.html

2015年5月4日月曜日

BeagleBone Black サーボ制御

初サーボ。



サーボスペック

・Tower Pro製 マイクロサーボ SG90
・SG90サーボ用 ミニ2軸 カメラマウント A838

茶色の線:GND
 ⇒ BBBのGNDを接続
赤色の線:5V(4.8~5V)
 ⇒ BBBの5Vを接続
橙色の線:制御線
 ⇒ BBBのPWMを接続

周期:20ms(50Hz)
H期間:500us~2400us
 ⇒ H期間の時間で0度から180度ぐらいでサーボが動作する

課題

・モーター制御のVref(速度制御)にPWMをモータ毎に1つずつ使う(計2個使用)
・サーボをモーターと同時に使用する場合、さらにPWMが2つ(チルトとパン)必要(計4個使用)
・BBBにはPWMは8チャネル?あるが、独立して周期、デューティが設定できるのは5つ
 ⇒ eCAP0、eCAP2、eHRPWM0、eHRPWM1、eHRPWM2
 ⇒ eHRPWMのAとBは同時に使うと周期を動的には変更できない
 ⇒ 普通に使うと、500us でしか使えない
・このうち、eCAP2とeHRPWM2はシステムを変更しないと使えない(uEnv.txtの変更だけ)
 ⇒ 普通に使えるPWMは3つなので、足りない
・モーター速度制御のVrefに使用するPWMは同じ周期でよい
・チルトとパンで使用するPWMの周期は同じでよい
 ⇒ まずは周期の初期値を変更する方法を探してみる

Device Tree

・デバイスツリーとは?については他のサイト参照。。
・今回使用したファイルは、bone_pwm_P9_16-00A0.dtbo
・デバイスツリーのソースファイルはカーネルをビルドしたツリーの arch/arm/boot/dts にシステム全体のものが入っていて、個別の機能は firmware/capes に入ってる
・bone_pwm_P9_16-00A0.dts を見てみると、fragment@0 にマルチプレクサの設定で、0x06 になっている
 ⇒ モード6(ehrpwm1B_mux1)、出力、プルダウン有効
・fragment@1 に初期値?の設定がある
 ⇒ compatible = "pwm_test"; の行が、カーネルドライバと紐付けされるキーワード
・カーネルソースは、drivers/pwm/pwm_test.c で、読んでみると、pwm_test_probe() で、この初期値を読み込んでいるっぽい
 ⇒ enabled は run のこと、duty はそのままの意味
 ⇒ 正論理or負論理は何やら難しい感じで、
 fragment@1:pwms = <&ehrpwm1 1 500000 1>;
 ドライバ:if (args.args_count >= 3 && (args.args[2] & (1 << 0)) != 0) が真だと負論理っぽい
 ⇒ たぶん、500000 は周期(500us)なので、その後ろの 1 が負論理ということっぽい
 ⇒ 周期の前の 1 は使われてない?
 ⇒ というわけで、pwms = <&ehrpwm1 1 20000000 0>; とすれば、周期20ms、正論理になるはず
・ついでに、PWM出力をデフォルトオフにしておく(enabled を 0 にする)
・dts のコンパイルは dtc で行うが、Ubuntu とかで、apt-get でインストールされる dtc ではなく、BBB専用?の dtc を使用する必要がある(普通の dtc では使えない -@ などのオプションがある)
 ⇒ scripts/dtc/dtc -O dtb -o bone_pwm_P9_16-00A0.dtbo -b 0 -@ bone_pwm_P9_16-00A0.dts
 ⇒ bone_pwm_P9_16-00A0.dtbo が生成される
・変更したdtboを適用する
 ⇒ BBBの/lib/firmwareに上記dtboをコピー
 ⇒ $ sudo su
 ⇒ # echo am33xx_pwm > /sys/devices/bone_capemgr.*/slots
 ⇒ # echo bone_pwm_P9_16 > /sys/devices/bone_capemgr.*/slots
 ⇒ あれ?反映されん。。
 https://jp.linux.com/Linux%20Jp/tutorial/418563-tutorial20140702
 上記サイトを見ると、やっぱり反映されないって書いてる、、
 ⇒ カーネルドライバの変更が必要と書いてる
 http://saadahmad.ca/using-pwm-on-the-beaglebone-black/
 https://randomlinuxhacks.wordpress.com/2014/09/16/changing-pwm-period-on-beaglebone-black/
 ⇒ カーネルドライバのソースをもう少し読む必要あり、カーネル3.18も同じ?
 ⇒ややこしくなってきたので、uEnv.txt を変更して、eCAP2とeHRPWM2を使えるようにしてみる

uEnv.txt

・場所:/boot/uboot/uEnv.txt
・eCAP2とeHRPWM2はシステムで予約されてる、というか、dtbの初期値で他のモードに設定されてて、動的に変更が禁止されてる
・uEnv.txt に HDMI(を含む McASP)を無効にするコードが書かれていてコメントアウトされている
 ⇒ #optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN,BB-BONE-EMMC-2G
 ⇒ 上記のうち、eMMCは無効にせず、HDMIの2つを無効にする
 ⇒ optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
 ⇒ 上記を追加して、再起動すると変更が有効になる、確認方法は、下記を変更前と後で比較すると何が変わったかが分かる
 # cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pins

感想

・200us刻みで動かすと25度ぐらいずつ動く
・カメラのチルトとパンに使うには、動きが速すぎる
 ⇒ 最終的には10us単位で6msのウェイトを入れて動かした



参考にしたサイト

http://denshikousaku.net/control-servos-on-raspberry-pi-part1-rpio



2015年5月1日金曜日

BeagleBone Black

久々のブログ。
最近は、BeagleBone Black でいろいろ遊んでたので、覚書再開。



まずは、スペックと環境。

スペック

Rev C (eMMC 4GB)

ディストリビューション:Ubuntu14.04

http://elinux.org/BeagleBoardUbuntu

・インストール方法は上記サイトそのまま
・今はカーネル3.14のものしか公開されてないみたい
・古いイメージ(カーネル3.8)が欲しいんだけど、入手方法(イメージの作り方?)が不明

カーネルは3.8

http://elinux.org/Building_BBB_Kernel

カーネルイメージの作成方法


クロスコンパイラ取得
$ wget -c https://releases.linaro.org/14.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz
$ tar xf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz
$ export CROSS_COMPILE=/home/kunimune/svn/bbb/download/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-
ソース取得
$ git clone https://github.com/beagleboard/kernel.git
$ cd kernel
バージョンを3.8に
$ git checkout 3.8
パッチ適用
$ ./patch.sh
コンフィグコピー
$ cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconf
ファームウェア取得
$ git clone git://arago-project.org/git/projects/am33x-cm3.git
ファームウェアをコピー
$ cp ../am33x-cm3/bin/am335x-pm-firmware.bin kernel/firmware/
カーネルビルド
$ make ARCH=arm beaglebone_defconfig
$ make ARCH=arm menuconfig
 ⇒ General setup → Local version に "-XXX" を付与
 ⇒ teeコマンドでログを取っていると失敗するので注意
$ make ARCH=arm uImage dtbs
 ⇒ arch/arm/boot の zImage をBBBにコピー、/boot/ubootにコピー
 ⇒ uEnv.txt を編集して、上記 zImage が起動するように書き換える

モジュールビルド
$ make ARCH=arm modules
$ make ARCH=arm INSTALL_MOD_PATH=../modules modules_install
ファームウェアビルド
$ make ARCH=arm firmware
$ make ARCH=arm INSTALL_MOD_PATH=../modules firmware_install
⇒ modulesディレクトリを固めてBBBにコピー、/lib/modulesに上書きコピー


ひとまず、以上です。

2013年5月11日土曜日

クラウド AWS EC2 Zabbix グラフ文字化け対処

  [Zabbix]
    ・グラフの日本語が文字化けを対処
      
      - 日本語フォントのインストール
       $ sudo aptitude install otf-ipafont
       > Unpacking otf-ipafont-gothic (from .../otf-ipafont-gothic_00302-10_all.deb) ...
       > Selecting previously deselected package otf-ipafont-mincho.
       > Unpacking otf-ipafont-mincho (from .../otf-ipafont-mincho_00302-10_all.deb) ...
       > Selecting previously deselected package otf-ipafont.
       > Unpacking otf-ipafont (from .../otf-ipafont_00302-10_all.deb) ...
       > Setting up otf-ipafont-gothic (00302-10) ...
       > update-alternatives: using /usr/share/fonts/opentype/ipafont/ipag.ttf to provide /usr/share/fonts/truetype/ttf-japanese-gothic.ttf (ttf-japanese-gothic.ttf) in auto mode.
       > Setting up otf-ipafont-mincho (00302-10) ...
       > update-alternatives: using /usr/share/fonts/opentype/ipafont/ipam.ttf to provide /usr/share/fonts/truetype/ttf-japanese-mincho.ttf (ttf-japanese-mincho.ttf) in auto mode.
       > Setting up otf-ipafont (00302-10) ...
       > [master a7bc0e5] committing changes in /etc after apt run
       >  Author: ubuntu <ubuntu@ip-172-31-27-207.localdomain>
       >  2 files changed, 2 insertions(+), 0 deletions(-)
       >  create mode 120000 alternatives/ttf-japanese-gothic.ttf
       >  create mode 120000 alternatives/ttf-japanese-mincho.ttf
        ⇒もともと日本語フォントはあったぽい
         > /usr/share/fonts/opentype/ipafont/ipag.ttf  ※ゴシック?
         > /usr/share/fonts/opentype/ipafont/ipagp.ttf ※ゴシックプロポーショナル?
         > /usr/share/fonts/opentype/ipafont/ipam.ttf  ※明朝?
         > /usr/share/fonts/opentype/ipafont/ipamp.ttf ※明朝プロポーショナル?
        ⇒今回インストールされたのは、
         > /usr/share/fonts/truetype/ttf-japanese-gothic.ttf -> /etc/alternatives/ttf-japanese-gothic.ttf
         > /usr/share/fonts/truetype/ttf-japanese-mincho.ttf -> /etc/alternatives/ttf-japanese-mincho.ttf
      
      - zabbixのフォルダにリンクを貼る
       $ sudo ln -s /usr/share/fonts/truetype/ttf-japanese-gothic.ttf /usr/share/zabbix/fonts/
      
      - zabbixがグラフに使用するフォントを変更
       $ sudo nano /usr/share/zabbix/include/defines.inc.php
       (変更前) > define('ZBX_GRAPH_FONT_NAME', 'DejaVuSans')
       (変更後) > define('ZBX_GRAPH_FONT_NAME', 'ipag');
      
        ⇒日本語が表示された!

2013年5月6日月曜日

クラウド AWS EC2 環境構築

[Elastic IP]
  ・固定のグローバルIPアドレスを確保してくれるサービスであるElastic IPを使用する
   ※Elastic IPのサービスはインスタンスに紐付けている限り無料、逆に言えば、固定IP確保だけを行って紐付けしないと料金が発生
  
  ・左のタブの"Elastic IPs"をクリック、"Allocate New Address"をクリック、確認画面が出るので"Yes, Allocate"をクリックで確保される
    ⇒"54.249.106.XXX"
   "Associate Address"をクリック、稼働中のインスタンスを選択(i-6c6fb56e)、"Private IP Address"を選択して、
   "Allow Reassociation"にチェックを入れて、"Yes, Allocate"をクリック
    ⇒"ec2-54-249-106-115.ap-northeast-1.compute.amazonaws.com"
   ※"Associate Address"をクリックの手順はインスタンスの再起動ごとに必要になる操作であることに注意

[root環境構築]
  ・rootユーザのパスワードを設定する
   $ sudo passwd
   > Enter new UNIX password:
   > Retype new UNIX password:
   > passwd: password updated successfully
  
  ・rootでログインする
   $ su -
   > Password:

[WinSCP環境構築]
  ・ダウンロードした秘密鍵(XXX.pem)をPuTTY形式に変換する
    - スタートメニューからPuTTYgenを起動
    - Conversions → Import keyをクリックして、XXX.pemを開く
    - Key passphrase、Confirm passphraseにパスワードを入力
    - Save private keyをクリック
  
  ・rootユーザでログインできるようにする
   $ sudo less /etc/ssh/sshd_config
   > Subsystem sftp /usr/lib/openssh/sftp-server
   
   $ sudo visudo
   (変更前) > %admin ALL=(ALL) ALL
   (変更後) > %admin ALL=(ALL) NOPASSWD:ALL
    ⇒sudoでパスワードを聞かれないようにする(WinSCPのログインでsudoするとパスワードを聞かれるが入力できないため)
   
   (追加) > Defaults:%admin !requiretty
    ⇒ttyでログインしたユーザにsudoさせる設定
   
   WinSCPの設定
    - 環境→SFTP→SFTPサーバに"sudo /usr/lib/openssh/sftp-server"を設定
     ⇒root権限でログインできた

[ubuntu上でパケットキャプチャ]
  ・Interfaceのリレーサーバのパケットを除外する
   # ping interface.silentsystem.jp
   > 54.248.35.221
   ※Temp  :OID 1.3.6.1.4.1.37510.0.1、コミュニティ public54017、更新間隔 120秒
   ※Humidity:OID 1.3.6.1.4.1.37510.0.2、コミュニティ public54017、更新間隔  30秒
  
  ・tcpdumpでパケットをキャプチャする
   ※SNMPポート(161番)のみ:port 161
   ※名前解決をしない:-n
   ※Interfaceのリレーサーバを除外:not host 54.248.35.221
   # tcpdump -n port 161 and not host 54.248.35.221
   > 20:36:04.389879 IP 49.105.23.9.30161 > 172.31.27.207.161:  SetRequest(49)  .1.3.6.1.4.1.37510.0.1=249 .1.3.6.1.4.1.37510.0.0.0=1234
   > 0x0000:  4500 005c 238a 0000 6c11 1aa7 3169 1709  E..\#...l...1i..
    ⇒ 3169 1709はSRC IPアドレス
   > 0x0010:  ac1f 1bcf 75d1 00a1 0048 334a 303e 0201  ....u....H3J0>..
    ⇒ ac1f 1bcfはDST IPアドレス、75d1はSRC PORT 00a1はDST PORT、0048はパケット長、334aはチェックサム、それ以降はデータ
    ⇒ 303e:データ列+長さ3E(62)
      020100:SNMPバージョンV1 ※00は次行
   > 0x0020:  0004 0670 7562 6c69 63a3 3102 0201 0d02  ...public.1.....
    ⇒ 04 0670 7562 6c69 63:文字列+public
      a3 31:Set Request+長さ31(49)
      02 0201 0d:連番+010d
   > 0x0030:  0100 0201 0030 2530 1006 0a2b 0601 0401  .....0%0...+....
    ⇒ 02 0100:エラーコード+00
      0201 00:エラーインデックス+00
      30 25:データ列+長さ25(37)
      30 10:データ列+長さ10(16)
      06 0a:OID+長さ0a(10)
      2b 0601 0401 82a5 0600 01:1.3.6.1.4.1.37510.0.1
   > 0x0040:  82a5 0600 0102 0200 f930 1106 0b2b 0601  .........0...+..
    ⇒ 02 0200 f9:温度データ+00f9(249)
      30 11:データ列+長さ11(17)
      06 0b:OID+長さ0b(11)
      2b 0601 0401 82a5 0600 0000:1.3.6.1.4.1.37510.0.0.0
   > 0x0050:  0401 82a5 0600 0000 0202 04d2            ............
    ⇒ 0202 04d2:デバイスID 04d2(1234)

[ubuntu上でSNMPサーバのコンパイルから起動まで]
  ・スクリプトの内容:killserver
   # less killserver
   > #kill -9 `ps -fe|grep snmpserver|egrep -v grep|awk '{print $2}'`
   > pkill snmpserver
    ⇒pkillコマンド:指定したプロセスをkillする
  
  ・スクリプトの内容:serverstart
   # less serverstart
   > #!/bin/sh
   > /root/snmpserver $1 $2 $3 $4 $5 $6 &
  
  ・SNMPサーバプログラムのアップロード(コピペ)
   # cat > snmpserver_dk.c
    ⇒snmpserver.cの内容をコピーして貼り付け、完了したらCtrl+Dで終了(snmpserver_dk.cが生成される)
  
  ・SNMPサーバプログラムのコンパイル
   # gcc -o snmpserver_dk snmpserver_dk.c
    ⇒snmpserver_dkが生成される
  
  ・既存のSNMPサーバプログラムの停止
   # pkill snmpserver
  
  ・SNMPサーバプログラムの起動
   # snmpserver_dk &

2013年5月5日日曜日

クラウド AWS EC2 アカウント取得からサーバ起動まで

1年間無料で使えるクラウドサーバのアカウント取得からサーバ起動までの手順を書きます。
クラウドサーバにはAmazonのサービスを使います。

まずは、Interface2013年2月号を参考に、Interfaceが準備してくれている仮想マシンイメージをコピーして、動作を確認してみます。



札幌のどこかにセンシング装置を設置されているらしく、その装置から札幌の気温と湿度をInterfaceのリレーサーバに自動で送信しているそうです。

今回稼動させたサーバには最初からZabbixが動作していて、そのZabbixからSNMPでInterfaceのリレーサーバにデータを取得しにいってます。下図はそのZabbixのキャプチャです。




[用語]
  ・AWS(Amazon Web Service):EC2を含む多くのサービスを統合したもの
  
  ・EC2(Elastic Compute Cloud):Amazonが提供するクラウドサービス
  
  ・Elastic IP:固定されたグローバルIPを確保してくれるサービス
  
  ・Elastic:快活な、融通の利く
  
  ・Dashboard:必要最低限の機能を整理して配置したもの
  
  ・AMI(Amazon Machine Image):仮想マシンイメージ
  
  ・AZ(Availability Zone):データセンター

[無料の範囲]
  ・AWSに新規サインアップした場合のみ
  
  ・AWSにサインアップしてから12ヶ月無料
  
  ・AWSの各サービスについてそれぞれ無料範囲が決められている
  
  ・AWS EC2 Linuxの無料範囲:1ヶ月あたり750時間、750/24=31.25日、つまり常に無料
    ⇒ただし1インスタンスにつき上記時間がかかるため、2インスタンスを稼動していると15日ちょっとしか無料にならない
  
  ・AWS EC2 Microsoft Windows Serverの無料範囲:Linuxと同様、1ヶ月あたり750時間(つまり常に無料)
  
  ※注意:停止しているインスタンスに対してElastic IP(グローバルIP)を割り当てると1時間につき$0.01(約1円)課金される
  
  ※注意:IPアドレスの割り当てしなおしを月に100回を超えると$0.10(約10円)課金される

[サインアップ(アカウント取得)]
  ・日本のAmazonのアカウントがあっても新たにアカウント取得が必要(米国アカウントがあれば不要らしい)
  
  ・メールアドレスを入力して、"I am a new user."を選択して、"Sign in using secure server"をクリック
  
  ・"My name is"に名前を入力、
   "My e-mail address is"、"Type it again"にメールアドレスを入力、
   "Enter a new password"、"Type it again"にパスワードを入力、
   "Continue"をクリック
  
  ・"氏名*"に名前を入力、"国*"にJapanを選択、
   "住所1*"に住所を入力、
   "市区町村*"に市を入力、"都道府県*"に県名を入力、
   "郵便番号"に郵便番号を入力、"電話番号*"に電話番号を入力
   "セキュリティチェック"に画像の英字を入力、"AWSカスタマー利用規約"にチェックを入れて、
   "アカウントを作成して続行"をクリック
  
  ・クレジットカード情報を入力
  
  ・電話による身元確認
   "国コード"に"Japan(+81)"を選択して、"確認用に自分に電話をする"をクリック
   電話がかかってくるので、"画面に表示された暗証番号4桁"を"電話機"に入力、
   "続ける"をクリック
  
  ・完了:登録したメールアドレスにアカウント作成完了の通知が届く

[接続、起動]
  ・まずは、サービス一覧が表示されるAWSの設定画面(AWS Management Console)にいく
   "右上のアカウント/コンソール"をクリックして"AWS Management Console"をクリック
  
  ・次にインスタンスの生成画面にいく
   "EC2 Dashboard"を選択して、右上にあるリージョンを"Tokyo"を選択して、
   "Launch Instance"をクリック
   "Classic Wizard"を選択して、"Continue"をクリック
  
  ・Interface 2013年2月号のサンプルを使用してインスタンスを選択する
   "Community AMIs"を選択して、"Viewing"を"All Images"を選択して、"Interface"で検索、
   "ami-a6e058a7"の"Select"をクリック
  
  ・インスタンスを生成する
   "Number of Instances"に"1"を入力し、"Instance Type"に"T1 Micro(t1.micro, 613MiB)"を選択し、
   "Subnet"に"No Preference (default subnet in any AZ)"(Tokyoには2つのアベイラビリティゾーンが存在、今回は非選択)を選択し、
   "Continue"をクリック
   ※T1 Micro:CPUユニットはUp to 2 ECUs、コア数は1Core、メモリは613MiB
  
  ・詳細設定はせずに"Continue"をクリック
  
  ・ストレージの設定もせずに"Continue"をクリック
  
  ・インスタンスに名前をつける
   "Key(Name)"に任意の名前(mai saba)を入力して、"Continue"をクリック
  
  ・キーペアの作成
   InterfaceではSSHでアクセスしないのでキーペアを作成しないとあるが、念のためキーペアを生成
   キーに"InterfaceSample"を入力して、"Create & Download your Key Pair"をクリック
  
  ・生成
   "Launch"をクリック、"Close"をクリック
  
  ・生成したインスタンスを確認
   左のチェックボックスにチェック(選択)を入れると、下に選択したインスタンスの状態が表示される
   
   ec2-54-249-39-113.ap-northeast-1.compute.amazonaws.com → 変動するアドレス、固定は"ec2-54-249-106-XXX.ap-northeast-1.compute.amazonaws.com"
  
  ・ファイアウォールの設定
   左のタブの"Security Groups"をクリックして、チェックボックスにチェック(選択)を入れる
   "Inbound"をクリック、"Create a new rule"で"HTTP"を選択して、"Add Rule"をクリック、"Apply Rule Changes"をクリック
    ⇒"SSH"も追加

[動作確認] 
  ・Apache2の接続確認
   "ec2-54-249-39-113.ap-northeast-1.compute.amazonaws.com"をブラウザに入力、"It works!"と表示されればApacheが動作してる
  
  ・Zabbixの動作確認
   トップのURLの末尾に"/zabbix/"を付けてアクセスする、
   IDに"admin"、パスワードに"zabbix"でログインして、
   "監視データ"タブの"ダッシュボード"をクリック
   "Sample Data Server:Temp & Humidity in Sapporo"をクリックするとグラフが表示される
   ※インスタンスを生成してから毎分で取得したデータのグラフとなるため、ある程度時間が経過してから見るとよい
  
  ・SSHの動作確認
   TeraTermを起動して、ユーザ名に"ubuntu"、パスワードにキーの値を入力して、
   "RSA/DSA鍵を使う"にチェックを入れて、"秘密鍵"にダウンロードした"XXX.pem"ファイルを指定して"OK"をクリック
    ⇒ログインできた

2012年12月16日日曜日

Raspberry Pi インターネット接続編(無線LAN or LANクロスケーブル)

LANケーブル(クロス) と、無線LANアダプタ PLANEX:GW-USValue-EZ が届きました。

下の写真のようにシンプルな構成で動作できました。


いろいろ試行錯誤があったので、メモ。
あと出来てないのは、
スマホのテザリングを使って無線LANアダプタでインターネット接続。

  [LANクロスケーブル接続]
    ・スマホのテザリングを使ってインターネット接続
     インターネット - スマホ(テザリング) - ノートPC(WinXP) - LANクロスケーブル - Raspberry Pi
    
    ・固定IP設定
     $ sudo nano /etc/network/interfaces
     
     変更前
     > iface eth0 inet dhcp
     
     変更後
     > iface eth0 inet static
     > address 192.168.0.24
     > netmask 255.255.255.0
     > gateway 192.168.0.1
     > dns-nameservers 192.168.0.1
    
    ・設定反映
     $ sudo /etc/init.d/networking reload
      ⇒SSH接続OK
    
    ・WinXP側の設定
      - "ネットワーク接続"でテザリングの"ワイヤレスネットワーク接続"のプロパティで"詳細設定"
      - インターネット接続の共有で"ローカルエリア接続"を選択
      - "ネットワーク接続"で"ローカルエリア接続"のIP設定を以下のようにする
       > Ethernet adapter ローカル エリア接続:
       >
       >         Connection-specific DNS Suffix  . :
       >         Description . . . . . . . . . . . : Realtek RTL8139/810x Family Fast Ethernet NIC
       >         Physical Address. . . . . . . . . : XX-XX-XX-XX-XX-XX
       >         Dhcp Enabled. . . . . . . . . . . : No
       >         IP Address. . . . . . . . . . . . : 192.168.0.1
       >         Subnet Mask . . . . . . . . . . . : 255.255.255.0
       >         Default Gateway . . . . . . . . . :
    
    ・例としてetckeeperをインストールするまでの手順
      - SSHでRaspberryPiに接続
      - インストール
       $ sudo apt-get update
       $ sudo apt-get install etckeeper
       ※最初からgitが有効になっていて初期コミットも行われた
        /etc/network/interfaces だけは変更済み、バックアップは ~/backup_etc/interfaces に置いてある
  
  [無線LAN]
    ☆PLANEX:GW-USValue-EZ
    
    ・家のルーターで無線LANインターネット接続
     インターネット - ルーター(WHR-AMG54) - 無線LANアダプタ(GW-USValue-EZ) - Raspberry Pi
    
    ・ドライバがロードされているか確認する
     $ lsusb
     > Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
     > Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
     > Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
     > Bus 001 Device 004: ID 2019:ed17 PLANEX GW-USValue-EZ 802.11n Wireless Adapter [Realtek RTL8188CUS]
    
    ・ネットワークを確認
     $ ifconfig
     > eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
     >           UP 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)
     >
     > lo        Link encap:Local Loopback
     >           inet addr:127.0.0.1  Mask:255.0.0.0
     >           UP LOOPBACK RUNNING  MTU:16436  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)
     >
     > wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
     >           UP 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)
    
    ・アクセスポイントを検索
     $ sudo iwlist wlan0 scanning
      ⇒ESSID:"XXXXXXXXX"発見
    
    ・普通に/etc/network/interfacesに設定を書く場合
      - エディタ起動
       $ sudo nano /etc/network/interfaces
       > allow-hotplug wlan0
       > auto wlan0
       > iface wlan0 inet dhcp
       >         wpa-ssid "XXXXXXXX"
       >         wpa-psk "XXXXXXXX"
       >         dns-nameservers 192.168.0.1
      
      - インタフェース再起動
       $ sudo ifup wlan0
      
      - 確認(家のルータの場合)
       $ sudo ifconfig
       > wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
       >           inet addr:192.168.0.17  Bcast:192.168.0.255  Mask:255.255.255.0
       >           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
       >           RX packets:183 errors:0 dropped:189 overruns:0 frame:0
       >           TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
       >           collisions:0 txqueuelen:1000
       >           RX bytes:27701 (27.0 KiB)  TX bytes:7081 (6.9 KiB)
        ⇒認識してインターネット接続もOK!
         SSH接続もOK!
         再起動して再SSH接続もOK!(やっとシリアル外せる。。)

2012年12月13日木曜日

Raspberry Pi シリアル接続編

いちいちHDMIで50インチテレビに繋ぐのも面倒なので、以下のものを注文。

    ・LANケーブル(クロス)
      - ☆LOAS LTC-6FR01W カテゴリ6クロス(ホワイト) 1m (417円)
    
    ・無線LANアダプタ
      - ☆PLANEX:GW-USValue-EZ (1,104円 11n/g/b対応、150Mbps)
    
    準備物合計額:13,985円 + 417円 + 1,104円 = 15,506円

届くまでは、シリアルで接続しておきましょ。




TeraTerm (115200bps)で接続した状態で電源オン。

ブートログが表示されたあと、ログイン待ちで、ID:pi、PASS:raspberry でログインOK。



普通に何でもできます。raspi-config もOK。

しかし、ネットワークが無いと何もインストールできん。。

ハブ出すのが面倒なので、無線LANアダプタ届くまではシリアルにしとこ。。

冬はコタツから出られませんね。。

Android インストールしたいなぁ。

2012年12月3日月曜日

Android USB(ホスト)シリアル to SH-2A

前回の
 AndroidのBluetooth → Bluetoothモジュール → UART → SH-2A → キャラクタLCD
のBluetoothのところを、

AndroidのUSBホスト機能を使ったUSBシリアルで、
 AndroidのUSB(ホスト)シリアル → USBシリアル変換モジュール(FTDI) → UART → SH-2A → キャラクタLCD
もできました。

◆家で使ってる無線マウスをUSBホストケーブルでスマホ(Android)に接続
 ※スマホで写真を撮ってるのでスマホは外してます(当たり前)
 ※MicroUSBの先にスマホを接続します



◆スマホ(Android)のUSBホスト機能を使って、マウスが使えました
  ⇒ スクロール機能も使えて、なかなか使える感じでした



◆スマホ(Android)にUSBホストケーブル経由でUSBシリアル変換モジュールを接続したときのキャプチャです(アプリのManifestでUSB接続を許可する必要があります)



◆BluetoothChatアプリにUSB(ホスト)シリアルのRead/Write機能を追加してSH-2AにASCIIコードを送ったところ
 ※こちらも同じくスマホで撮ってるのでスマホは外してます(当たり前)
 ※MicroUSBの先にスマホを接続します





Androidアプリの作り方は、以下な感じです。
BluetoothChatアプリにFTDriver(ライブラリ)をインポートしました。
あとはFTDriverに付属のサンプルアプリの一部を切り貼りでBluetoothChatアプリにポーティング。

かなり適当に実装しましたが、案外簡単に動きました。
Androidのすごいところは、適当に実装しても、それなりに動いてしまうところですね。。

では、動作確認も出来たことだし、まじめにJavaのクラス設計でもマタリしますか。。


Android Bluetooth to SH-2A

SH-2AにBluetoothモジュールを接続(UART)して、
受け取ったASCIIコードをキャラクタLCDに出力してみました。


◆AndroidのBluetoothChat(サンプルアプリ)の改造版



◆受け取ったSH-2A、Bluetoothモジュール、キャラクタLCD



キャラクタLCDは、RX62Nでは8bitモードで使ってたんだけど、
今回、半田付けが面倒ということで、4bitモードにしてみました。
初期化あたりが少し違ってて、意外と手間取りました。。

Android BluetoothChatアプリから文字列を打ってSendボタンを打つと、
Bluetooth経由でSH-2AのUARTで受信して、それを1行ずつキャラクタLCDに表示しているだけです。

これで、スマホからBluetooth経由でコマンド打てば、マイコンを操作できます。

本当はスマホで文字列打ってるところと、キャラクタLCDに表示されるところを動画に撮ろうと
思ったんだけど、スマホ使ってるから撮れず。。。(当たり前)

2012年11月28日水曜日

Android Bluetooth テスト

スマホ(Android)からBluetooth経由でマイコンを制御したくなり、
Bluetoothモジュールを購入しました。

USBシリアル変換のようなお手軽な値段のものは少なくて、
モチベーションが下がりつつあると、、、格安モジュールがヒットしました!

SzParts.com SBT1-T-S 1950円(送料350円)


早速、USBシリアル変換モジュールをかまして、PCと接続。
仮想COMポートとして認識させて、スマホ(Android)からスキャンデバイス!

検出できました~。






次はスマホとTeraTermと通信テスト。

検出できたデバイス(BTCOM-SPPB)を選択すると、
パスワードを求められるので、初期パスワードを入力。
接続OK!

BTCOM-SPPBはスレーブですが、SPPの定義ではサーバとなるみたい。
通電すると、他デバイスから検出可能な状態で待機していて、
マスター(SPPではクライイアント)から接続されると通信可能状態になるらしい。
定義が逆の感じでややこしい。。
というわけで、スマホから入力した文字がPCにBluetoothで転送できました!


さて、接続して文字の転送をしたLogCatのログを追いかけよう。。

◆UUIDをSPPに変更前(接続失敗)

E/BluetoothChat(676): - ON PAUSE -                          // DeviceList画面に遷移
D/DeviceListActivity(676): doDiscovery()                    // デバイススキャン(サーバが存在するかをサーチ)
D/BluetoothChat(676): onActivityResult -1                   // Main画面に戻る(引数にMACアドレス)
D/BluetoothChatService(676): connect to: XX:XX:XX:XX:XX:XX  // BluetoothChatService#connect()呼び出し、ConnectThreadスレッド起動
D/BluetoothChatService(676): setState() 0 -> 2              // STATE_CONNECTINGに遷移
E/BluetoothChat(676): + ON RESUME +                         // Main画面に戻るとON RESUME
I/BluetoothChatService(676): BEGIN mConnectThread SocketType:Secure // ConnectThreadスレッド開始
I/BluetoothChat(676): MESSAGE_STATE_CHANGE: 2               // ActionBarにConnectingを表示
D/BluetoothChatService(676): start                          // おそらく、connectionFailed()が実行されている
D/BluetoothChatService(676): setState() 2 -> 1              // STATE_LISTENに遷移
I/BluetoothChat(676): MESSAGE_STATE_CHANGE: 1               // ActionBarにNotConnectedを表示
D/BluetoothChatService(676): Socket Type: SecureBEGIN mAcceptThreadThread[Thread-9961,5,main] // AcceptThreadスレッド(Secure)起動
D/BluetoothChatService(676): Socket Type: InsecureBEGIN mAcceptThreadThread[Thread-9962,5,main] // AcceptThreadスレッド(Insecure)起動
E/BluetoothChat(676): - ON PAUSE -                          // DeviceList画面に遷移(以降、繰り返し)



◆UUIDをSPPに変更後(接続成功)

E/BluetoothChat(3823): - ON PAUSE -                         // DeviceList画面に遷移
D/DeviceListActivity(3823): doDiscovery()                   // デバイススキャン(サーバが存在するかをサーチ)
D/BluetoothChat(3823): onActivityResult -1                  // Main画面に戻る(引数にMACアドレス)
D/BluetoothChatService(3823): connect to: XX:XX:XX:XX:XX:XX // BluetoothChatService#connect()呼び出し、ConnectThreadスレッド起動
D/BluetoothChatService(3823): setState() 0 -> 2             // STATE_CONNECTINGに遷移
I/BluetoothChatService(3823): BEGIN mConnectThread SocketType:Secure // ConnectThreadスレッド開始
E/BluetoothChat(3823): + ON RESUME +                        // Main画面に戻るとON RESUME
I/BluetoothChat(3823): MESSAGE_STATE_CHANGE: 2              // ActionBarにConnectingを表示
E/BluetoothChat(3823): - ON PAUSE -                         // パスワード入力画面表示?
E/BluetoothChat(3823): + ON RESUME +                        // Main画面に戻るとON RESUME
D/BluetoothChatService(3823): connected, Socket Type:Secure // 接続成功
D/BluetoothChatService(3823): create ConnectedThread: Secure // ConnectedThreadスレッド起動
I/BluetoothChatService(3823): BEGIN mConnectedThread        // ConnectedThreadスレッド開始、readブロックコール
D/BluetoothChatService(3823): setState() 2 -> 3             // STATE_CONNECTEDに遷移
I/BluetoothChat(3823): MESSAGE_STATE_CHANGE: 3              // ActionBarにConnectedとDevice名を表示、チャットクリア
                                                            // (以降、READ/WRITEでチャット可能)



ふぅ。。サンプルのBluetoothChatの動きは把握できたかな。。寝よ。。

2012年11月24日土曜日

Raspberry Pi 到着編

2012/11/21 到着!





3週間ぐらい、かかりました。

とりあえず、2012-10-28-wheezy-raspbian.zip をmicroSDカードに、
Win32DiskImager.exe を使って焼きこみ、Raspbian 起動しました!

pIO という microSDカードアダプタ も購入したので、出っ張りなくスッキリ。
あと、スマホ用モバイル電源で無事動作しました。
これでモバイルで遊べます。

ほとんど順調でしたが、一点、reboot した後、bluetoothキーボードが
認識しないようです。。

お家の50インチプラズマテレビVIERAしかHDMIがないのですが、
イチイチ接続するのが面倒なので、ほとんどはSSH経由の使い方になりそうです。

オーバークロックの設定を忘れてました。。あったかな?

2012年10月31日水曜日

Raspberry Pi 準備編

[購入]
  ・RSオンライン:届くまでに時間かかるらしい
  ・ModMyPi:ケース付きだがすぐに届くらしい

[準備物]
  ・Raspberry Pi本体
    - 2012/10/27(土):ModMyPiにて、4,677円(34.98ポンド)
      ⇒キャンセル
    - 2012/10/29(月)
      ・Raspberry Pi and ModMyPi Case (512MB RAM):29.99ポンド
       ※Case Top Colour:White、Case Bottom Colour:White
      ・pIO - Raspberry Pi microSD Card Adaptor:6.24ポンド
      ・送料:4.99ポンド
      ☆合計:41.22ポンド(5,503円)
  
  ・ACアダプタ:MicroUSB(スマホ用で代替可能?)、最大出力700mA推奨
    - スマホ用単三電池4本用アダプタにエネループを入れて動作した報告あり
    - スマホ用モバイル電源
     (Panasonic USBモバイル電源パック リチウムイオン 5,400mAh 黒 QE-QL201-K)
     で7.5時間動作報告あり
    ☆Panasonic 無接点対応USBモバイル電源 QE-PL202(3,487円)
  
  ・SDカード(Webで確認済みのもの):16GB(Class10)
    ☆microSDHCカード 8GB Class10 TS8GUSDC10 Transcend アダプタ無し(680円)
    ☆microSDHCカード 8GB Class10 TS8GUSDHC10 Transcend アダプタ付き(780円)
  
  ・USBキーボード&マウス:一体型を検討中
    - ELECOM:トラックボール付きワイヤレスキーボード
     2.4GHz ブラック TK-FDP021BK(3,436円)
      ⇒単4x2、Fnキーでチルト機能あり
       (フリーソフト WheelBell で、速度調整と左右スクロールが可能)
    ☆LOGICOOL ワイヤレスタッチキーボード unifying対応 K400(2,945円)
      ⇒単3x2
       (LOGICOOLのほうが押しにくそうだが壊れにくそう、あと単3)
   
  ・USBメモリ
    ☆8GB USB2.0 JetFlash530 TS8GJF530 Transcend(590円)
  
  準備物合計額:13,985円
  
[スペック(Model B)]
  ・プロセッサ:Broadcom BCM2835
   (ARM11(ARM1176JZF-S)/700MHzコア、FPU、GPU搭載)
  ・グラフィック:OpenGL ES 2.0、OpenVG 1080p30 H.264エンコーダ/デコーダ
  ・メモリ:256MB → 512MB(rev2)
  ・ストレージ:SDカード
  ・映像出力:HDMI(最大1920x1200)、コンポジットビデオ(RCA)
  ・オーディオ出力:HDMI、3.5mmステレオ
  ・USB×2
  ・Ethernet(RJ45):10/100BaseTイーサネット
  ・大きさ:86×54mm
  ・消費電力:3.5W
  ・OS:Debian、Fedora、Arch Linux
    
  ※Model Bは35ドル版と呼ばれ、Model AはRJ45省略、USB1ポートのみで25ドルの予定
  ※OSはDebianベースでRaspberry Pi用に最適化されたwheezyがリリースされている

[最初の起動]
  ・公式サイトからOSイメージをダウンロード
    - http://www.raspberrypi.org/downloads
    - SHA-1値を求める
     $ shasum XXX
   
  ・イメージ書込みツール
    - 公式サイトより:Win32DiskImager
  
[オーバークロック]
  ・簡単に1GHzにクロックアップできるらしい(2012-09-18-wheezy-raspbian以降)
  
  ・Raspi-configでオーバークロックを選択した場合にでも、
   Shiftキーを押しながら起動すると低クロックで起動する

2012年9月2日日曜日

ジョギング 11回目(2012/09/02)

万博前の上り坂はシンドイなぁ。。
7.5kmぐらい。徒歩込みで、9.7km。

2012年8月18日土曜日

ZigBee SH-2A XBee APIモード

SH-2AからUARTでXBeeをAPIモードでコントロールする。

UARTなので、電源、GND、TxD(toDIN)、RxD(toDOUT)の4本で接続。

X-CTUで予めAPIモードに設定しておく。





 
-----------------------------------------------------------------------
2012/08/18

APIモードで、以下のようなことが可能。
  • シリアル(UART)で接続しているXBee(以下、ローカルXBeeとする)の情報(64bitアドレス、16bitアドレス、ポート情報など)を取得、情報の変更、設定の書込みができる
  • シリアルで接続しているXBeeと同じネットワーク(同じPAN ID)に参加している他のXBee(以下、リモートXBeeとする)のローカルXBeeと同じ情報を取得、情報の変更、設定の書込みができる
  • リモートXBeeのポート(デジタル入力、デジタル出力、アナログ入力)を制御できる
  • ローカルXBeeと同じネットワークに参加している他のリモートXBeeの情報が取得できるが、リモートXBeeの位置情報(親の16bitアドレス取得可能、16bitアドレスから位置情報を抽出できる?)も取得可能?
  • データ(バイナリ?)の送受信が可能

以下、まだよく分かってないところ
  • APIモードで、"WR"や"FR"など非同期で時間のかかるAPIの終了を知るにはどうしたらいいか?
  • APIモードで、"FR"は長い時間待っても、モデムステータスが返ってくる、仕様?

2012年8月5日日曜日

ジョギング 8回目(2012/08/05)

今日は違う道から万博に向かった。

歩き始めたところの活動量計は、37分、4.7km
GoogleMapでは通れないところを通ったので計測不可。。。
大回りで6.0km、ズレは21.7%、14%のズレとすると、5.5km。

2012年7月29日日曜日

ジョギング 7回目(2012/07/29)

今日はヒサビサに万博一周コースに行ってきました。
万博までが遠い。。

歩き始めたところで活動量計を見ると、30分、4.2km
Googleマップで見ると、4.9km、ズレは14.3%
前回のズレも13.5%なので、ダイタイ一定してるかな。。