2012年7月5日木曜日

MacPortsでpython+opencvの環境を作る

MacPortsの環境でPython+OpenCVの環境作りでハマったメモ
pythonでimport cvがうまく行かなかったのが、単純にMacPortsがインストールするOpenCVはmac標準のpythonの環境がセットアップされないのが問題だった。
MacPortsでインストールしたpythonではちゃんと動いた。


$ sudo port install python
$ sudo port install opencv +python27
$ vi ~/.bashrc
〜略〜
alias python=/opt/local/bin/python2.7 ← aliasでごまかす。PATHの方がいいかも



#以下アフィリエイト用の広告です

2012年6月25日月曜日

Retina対応していないアプリをむりくりRetina対応させる方法

いろいろ調べてたらRetina対応していないアプリを自前でRetina対応する方法がありました
といっても文字などが綺麗になるだけで、アイコンなどのリソースを使っている箇所は変わりません。
Eclipseなどのメニューまでしょんぼりだったプログラムには有効な手段かと。

追記

以下の方法でVirtualBoxの設定を変更するとVirtualBoxが起動できなくなります。

未対応アプリ
VirtualBox
Inkscape
Google日本語入力(そもそもどのappをいじればいいのかわからん)

/* 追記ここまで */

やり方


ほげほげ.appなどをFinderで表示し、右クリックで「パッケージの内容を表示」を選択
(今回は例でArduino.appで行います)

info.plistをお好きなテキストエディタで開きます

選択されている行のようにの直前に
<key>NSHighResolutionCapable</key> </true>

を追記。

追記したら、エディタで保存して閉じます。
その後、ほげほげ.appの複製を作成するか、ログアウトしてログインし直すとRetinaに対応してくれます。

情報を見ると「低解像度で開く」のチェックが外れている。


ArduinoでBlinkのサンプルをRetina対応IDEで開いてみた


#以下アフィリエイト用の広告です

2012年6月24日日曜日

Mac Book Pro with RetinaでAndroid開発環境を構築する

MBPRでAndroid開発環境を構築したメモ

環境構築自体は今まで通りで全く問題なし。
Retina特有だと思う問題を以下にメモる

  • EclipseはRetina非対応でメニューもぼやける
  • エミュレータはRetinaの画面上で起動するとウィンドウの1/4でしか表示されない
  • Retinaの画面上で起動したエミュレータではソフトウェアキーボードの位置の認識がおかしい
  • HDMI出力でつないだ外部ディスプレイ側でエミュレータを起動すると今まで通りに起動
  • 外部ディスプレイ側で起動したエミュレータをRetina側に持って行くとエミュレータが異常終了


エミュレータ周りがおかしいので、プレゼンなどでエミュレータをよく使う方はGoogleが対応するまで待ちになりそうです。

#以下アフィリエイト用の広告です

2012年6月23日土曜日

Node.jsでC2DMっぽい何かを作ってみた

Node.jsのsocket.ioを使ってC2DMっぽい何かを作ってみた。

http://iwatan.dip.jp:8001/
(apacheの設定が面倒なのでポート番号直入)

機能としては、chrome to phoneのパクリ
ただ、chrome to phoneと違って1対多が可能
同じキーワードを設定したブラウザに一斉に送信するので、
設定したブラウザが一斉に画面遷移します。


#以下アフィリエイト用の広告です

2012年6月22日金曜日

Mac Book Pro Retinaの対応具合を調べてみた

発表の当日朝一でMac Book Pro Retina版をメモリ16Gにしてポチりました。
先日届いたのでいろいろなアプリのRetina対応状態を調べてみました

対応状況:×:アイコン・文字ともにぼやける(動作は正常) △:一部ぼやける ○:美しい

アプリ名バージョン対応状況備考
EclipseIndigo Service Release 2×ぼやける
Android SDK18.0.0.v201203301601-306762×エミュレータが1/4サイズで表示される
Arduino1.0.1×ぼやける
MPLAB X1.2.0アイコンが一部ぼやけるがほぼ○と言って良い
Evernote3.1.2 (257203)アイコンがぼやける。文字は○
MacVim7.3 (KaoriYa 20120509)アイコンがぼやける。文字は○
DropBoxFinderのアイコンは○、メニューバーのアイコンは×
WindowFlowほぼ○なのだが、デスクトップ番号の表示の文字がぼやける
夜フクロウ2.74 (2.74)アイコンがぼやける
RDC2.1.1×リモートデスクトップの表示もぼやける
chrome21.0.1180.4 devファビコンなどはぼやける。そもそもDevチャンネルじゃないと文字がぼやける
VirtualBox4.1.16×ゲストOSの表示もぼやける
Skype5.8.0.865アイコンがぼやける
Google日本語入力1.5.1109.1入力はできるが、表示位置がおかしい。表示文字はぼやける
Inkscape0.48×文字、アイコンともにぼやける
VLC2.0.1 Twoflower (Intel 64bit)アイコンがぼやける


#以下アフィリエイト用の広告です

2012年5月22日火曜日

gVimで警告音を消した際のメモ

gVimで警告音を消すオプションを設定する際にちょっちはまったのでメモ
set visualbell
set vb t_vb=
上の設定をvimrcに書くとgVimで音は消えるが画面のフラッシュがオフにできない。
正しくはgvimrcに上記の設定を書く必要がある。

 #以下アフィリエイト用の広告です

2012年5月20日日曜日

さくらのVPS上のJenkinsでArduinoのプログラムをビルド

忘れそうなのでφ(..)メモメモ。

Jenkinsでビルドするにはコマンドでビルドができるようにする必要がある
さくらのVPS上でJenkinsを動かすには以前やったので割愛

ビルドに必要なパッケージを入れる
yum install uisp avr-libc avr-gcc-c++ rxtx avrdude
次にここからMakefileの元と、ツールをダウンロード

wget http://mjo.tc/atelier/2009/02/acli/arduino-mk_0.8.tar.gz
tar zxvf arduino-mk_0.8.tar.gz 
sudo cp arduino-mk-0.8/ard-parse-boards /usr/local/bin

# Arduino.mkをどこか固定の場所に置く
# 自分はスケッチの保存ディレクトリ直下にする
cp arduino-mk-0.8/Arduino.mk /


そしたら、適当にサンプルを作る


cd 
mkdir sample
cd sample
vi sample.ino

コードはこんなので十分

/*******************************************************************************
 *
 * @brief テスト用
 *
 ******************************************************************************/

#define LED_PIN       (2)   //!< @brief LEDの接続ピン
#define DELAY_TIME    (500) //!< @brief PWM待ち時間

/******************************************************************************
 * @brief  setup
 * @param  なし
 * @retval なし
 *****************************************************************************/
void setup()
{
    pinMode(LED_PIN, OUTPUT);
}

/******************************************************************************
 * @brief  loop
 * @param  なし
 * @retval なし
 *****************************************************************************/
void loop()
{
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    delay(500);
}

お次にMakefileを作る
ARDUINO_DIR    = /usr/local/lib/arduino-1.0
ARDMK_DIR      = /usr/local
AVR_TOOLS_PATH = /usr/bin
BOARD_TAG      = uno

AVRDUDE_CONF = $(ARDUINO_DIR)/hardware/tools/avrdude.conf
AVRDUDE_ARD_PROGRAMMER = arduino

MCU            = atmega328p
VARIANT        = standard

include ../Arduino.mk
これでmakeするとYAMLがどーたらこーたらとエラーがでるので、perl-YAML-Libを入れる sudo yum install perl-YAML 入れればmakeが通るようになるはず


#以下アフィリエイト用の広告です

2012年5月18日金曜日

Android ADKの本を出します

2012/5/12にソシム社からAndroid ADKの本を出版します。
東京+神戸のAndroider達でArduinoの入門〜ADK+応用な網羅的な内容を書きました。
自分はブログに書いていることなどなどを書きました。
なかなか貴重な体験です。ご協力いただいたみなさまありがとうございました。

Amazon調べでは日本語で書かれたArduinoでのADK用の専門書としては日本初ではないでしょうかね。
もし、みなさん興味ありましたら買ってください。

Android ADK プログラミング&電子工作バイブル (smart phone programming bible)
Amazonで¥ 3,129です。


俺、この本が売れたら新しいmacを買うんだ!

#以下アフィリエイト用の広告です

2012年5月2日水曜日

[memo]FedoraでArduinoのスケッチをコンパイルする

Ubuntu12.04をインストールしたら不調になったので、Fedoraへ乗り換えた。
そこで、Arduinoの環境を構築した際のメモ


yumでインストールする場合

普通はこのやり方で問題なし
sudo yum install -y arduino


バイナリを公式から落としてきて使う場合

ちょっと込み入った使い方をしたいのでこっちで構築した
sudo yum install -y java
sudo yum install uisp avr-libc avr-gcc-c++ rxtx avrdude
wget http://arduino.googlecode.com/files/arduino-1.0-linux64.tgz
tar zxvf arduino-1.0-linux64.tgz
cd arduino-1.0
./arduino        ←起動確認
rm -R __MACOSX/  ←arduinoチームはmacで開発しているようだ。不要なので削除
./arduino        ←年のため削除しても問題ないか起動確認

普通に起動すると以下のエラーが出た。どうやら/var/lockにロックファイルが作れていないようだ。(スーパーユーザーで起動していないから無理な話なのだが。。。)
./arduino 
Experimental:  JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL

やはり、sudoで起動するとエラーは出なかった。

sudo ./arduino 
[sudo] password for naoki: 
Experimental:  JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7


で、ユーザーで起動した場合と、スーパーユーザーで起動した場合の違いとしては、
シリアルでArduinoを認識できるかどうかだけのようだった。
ビルドするだけであればユーザー権限で起動しても問題はなさそうだった。
とりあえず、自分の用途ではビルドさえ出来れば問題無いので、このままにしておく。


#以下アフィリエイト用の広告です

2012年4月25日水曜日

CentOSにJenkinsを入れる その1

さくらのVPSを借りたのでJenkinsやらなんやらを入れて遊ぼうと思ったので環境構築をしててハマったのでまとめる

環境

以下の環境で作業

  • CentOS 6.2 x86_64
  • メモリ 1G
  • ディスク 100G

Jenkinsのインストール

yumで突っ込めるようにさくっとやる
公式を参考に

$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
そんで、
$ sudo yum -y install jenkins

ポートを開放する必要があるからiptablesの設定を編集
$ sudo vi /etc/sysconfig/iptables


設定内容はこんな感じ
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [82:13644]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT 
-A FORWARD -j RH-Firewall-1-INPUT 
-A RH-Firewall-1-INPUT -i lo -j ACCEPT 
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT 
-A RH-Firewall-1-INPUT -p esp -j ACCEPT 
-A RH-Firewall-1-INPUT -p ah -j ACCEPT 
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8009 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20022 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20021 -j ACCEPT 
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20025 -j ACCEPT 
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited 
COMMIT

で、jenkinsの起動
$ sudo service jenkins start
Starting Jenkins                                           [  OK  ]


はい。この[  OK  ]に騙されていました。
プロセスを確認してみるとjenkinsが動いとりません。
$ sudo ps -x


なんでかなぁと思い、みやびーに聞いた所、直接jenkinsを起動してみろとのこと。
$ cd /usr/lib/jenkins
$ java -jar jenkins.war
Running from: jenkins.war
webroot: $user.home/.jenkins
2012/04/25 23:36:19 winstone.Logger logInternal
INFO: Beginning extraction from war file
2012/04/25 23:36:22 hudson.WebAppMain contextInitialized
SEVERE: Failed to initialize Jenkins
java.lang.ExceptionInInitializerError
   at java.lang.Class.initializeClass(libgcj.so.10)
   at hudson.WebAppMain.installLogger(WebAppMain.java:256)
   at hudson.WebAppMain.contextInitialized(WebAppMain.java:107)
   at winstone.WebAppConfiguration.(WebAppConfiguration.java:875)
   at winstone.HostConfiguration.initWebApp(HostConfiguration.java:129)
   at winstone.HostConfiguration.(HostConfiguration.java:71)
   at winstone.HostGroup.initHost(HostGroup.java:87)
   at winstone.HostGroup.(HostGroup.java:47)
   at winstone.Launcher.(Launcher.java:177)
   at winstone.Launcher.main(Launcher.java:384)
   at java.lang.reflect.Method.invoke(libgcj.so.10)
   at Main._main(Main.java:273)
   at Main.main(Main.java:98)
Caused by: java.lang.NullPointerException
   at com.thoughtworks.xstream.core.JVM.isOpenJDK(JVM.java:72)
   at com.thoughtworks.xstream.core.JVM.canUseSun14ReflectionProvider(JVM.java:198)
   at com.thoughtworks.xstream.core.JVM.bestReflectionProvider(JVM.java:175)
   at com.thoughtworks.xstream.XStream.(XStream.java:431)
   at com.thoughtworks.xstream.XStream.(XStream.java:385)
   at com.thoughtworks.xstream.XStream.(XStream.java:323)
   at hudson.util.XStream2.(XStream2.java:75)
   at jenkins.model.Jenkins.(Jenkins.java:3677)
   at java.lang.Class.initializeClass(libgcj.so.10)
   ...12 more
2012/04/25 23:36:22 winstone.Logger logInternal
SEVERE: Error during context startup for webapp webapp
java.lang.ExceptionInInitializerError
   at java.lang.Class.initializeClass(libgcj.so.10)
   at hudson.WebAppMain.installLogger(WebAppMain.java:256)
   at hudson.WebAppMain.contextInitialized(WebAppMain.java:107)
   at winstone.WebAppConfiguration.(WebAppConfiguration.java:875)
   at winstone.HostConfiguration.initWebApp(HostConfiguration.java:129)
   at winstone.HostConfiguration.(HostConfiguration.java:71)
   at winstone.HostGroup.initHost(HostGroup.java:87)
   at winstone.HostGroup.(HostGroup.java:47)
   at winstone.Launcher.(Launcher.java:177)
   at winstone.Launcher.main(Launcher.java:384)
   at java.lang.reflect.Method.invoke(libgcj.so.10)
   at Main._main(Main.java:273)
   at Main.main(Main.java:98)
Caused by: java.lang.NullPointerException
   at com.thoughtworks.xstream.core.JVM.isOpenJDK(JVM.java:72)
   at com.thoughtworks.xstream.core.JVM.canUseSun14ReflectionProvider(JVM.java:198)
   at com.thoughtworks.xstream.core.JVM.bestReflectionProvider(JVM.java:175)
   at com.thoughtworks.xstream.XStream.(XStream.java:431)
   at com.thoughtworks.xstream.XStream.(XStream.java:385)
   at com.thoughtworks.xstream.XStream.(XStream.java:323)
   at hudson.util.XStream2.(XStream2.java:75)
   at jenkins.model.Jenkins.(Jenkins.java:3677)
   at java.lang.Class.initializeClass(libgcj.so.10)
   ...12 more
2012/04/25 23:36:22 winstone.Logger logInternal
INFO: HTTP Listener started: port=8080
2012/04/25 23:36:22 winstone.Logger logInternal
INFO: AJP13 Listener started: port=8009
2012/04/25 23:36:22 winstone.Logger logInternal
SEVERE: Error during servlet context shutdown
java.lang.NoClassDefFoundError: jenkins.model.Jenkins
   at java.lang.Class.initializeClass(libgcj.so.10)
   at hudson.WebAppMain.contextDestroyed(WebAppMain.java:339)
   at winstone.WebAppConfiguration.destroy(WebAppConfiguration.java:1149)
   at winstone.HostConfiguration.destroyWebApp(HostConfiguration.java:148)
   at winstone.HostConfiguration.destroy(HostConfiguration.java:156)
   at winstone.HostGroup.destroy(HostGroup.java:77)
   at winstone.Launcher.shutdown(Launcher.java:337)
   at winstone.Launcher.(Launcher.java:199)
   at winstone.Launcher.main(Launcher.java:384)
   at java.lang.reflect.Method.invoke(libgcj.so.10)
   at Main._main(Main.java:273)
   at Main.main(Main.java:98)
2012/04/25 23:36:22 winstone.Logger logInternal
INFO: Winstone shutdown successfully
2012/04/25 23:36:22 winstone.Logger logInternal
SEVERE: Container startup failed
java.io.IOException: Failed to start a listener: winstone.ssl.HttpsListener
   at winstone.Launcher.spawnListener(Launcher.java:229)
   at winstone.Launcher.(Launcher.java:185)
   at winstone.Launcher.main(Launcher.java:384)
   at java.lang.reflect.Method.invoke(libgcj.so.10)
   at Main._main(Main.java:273)
   at Main.main(Main.java:98)
Caused by: java.lang.NoClassDefFoundError: winstone.ssl.HttpsListener
   at java.lang.Class.initializeClass(libgcj.so.10)
   at java.lang.Class.forName(libgcj.so.10)
   at winstone.Launcher.spawnListener(Launcher.java:213)
   ...5 more
Caused by: java.lang.ClassNotFoundException: sun.security.util.DerValue not found in java.net.URLClassLoader{urls=[file:/tmp/winstoneplgbf6jar], parent=gnu.gcj.runtime.SystemClassLoader{urls=[file:jenkins.war], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}}
   at java.net.URLClassLoader.findClass(libgcj.so.10)
   at java.lang.ClassLoader.loadClass(libgcj.so.10)
   at java.lang.ClassLoader.loadClass(libgcj.so.10)
   at java.lang.Class.initializeClass(libgcj.so.10)
   ...7 more


わっさーとエラーが出てきました。どうやらjenkins自体のインストールがうまくいってない?
ここから問題を解決していきたいと思います。

#追記
コメントで指摘をもらったようにOpenJDKをインストールすると無事起動できるようになった。

#以下アフィリエイト用の広告です

2011年12月6日火曜日

【追記あり】DotsduinoをAndroidから操作してみた



Make: Tokyo Meeting 07に3日行ってきました。
そこで、以前からお世話になってるブログ(なんでも作っちゃう、かも。)の方が出展しており、 DotsduinotというArduino互換のオリジナル製品を売っていたので買っちゃいました。
それで、折角なのでAndroidからDotsduinoを制御できるようにしてみました。
正確に言うと、シリアル通信で、命令をDotsduinoが受け取り表示するといった流れなので、 そのままPCからも制御できちゃいます。

【追記】
動画をアップロードしました


  • Dotsduino側のソース

#include 

Dots myDots = Dots();

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  myDots.begin();
}


void loop()
{ 
  int msg[4] = {0};
  int i    = 0;
  int flag = 0;
  
  // 3バイトを超えてバッファされないと処理しないようにする
  if (Serial.available() > 3) {
    i = 0;
    
    while(i < 4) {
      msg[i] = Serial.read();
      if (msg[i] < 0) {
        break;
      }
      i++;
    }

    // 念のためのデータチェック用
    if (msg[0] == '@') {
      myDots.write(msg[1], msg[2], msg[3]);
    }
  }
}

とりあえずこれだけで、PCからでも"@111"や"@250"といった形のデータを送れば付けたり消したり出来ます。
ただ、msg[1]〜msg[3]は数値である必要があるのでASCIIコードで送ると、49とか50といったデータが送られてくるので、次のように変更するといいかもしれません。
      myDots.write(msg[1] - '0', msg[2] - '0', msg[3] - '0');
ただ、これはPCからASCIIコードで送る場合の処置です
数値として送る場合には不要です。

Android側のソースは後日綺麗にしたらGithub上に上げておきます。
https://github.com/iwata-n



#以下アフィリエイト用の広告です

2011年11月27日日曜日

さくっとfoursquareとGoogleカレンダーを同期する方法

TwitterでfoursquareとGoogleカレンダーを同期すると引きこもってた日がいっぱつでわかるとツイートしたらやたらRTされたんでやり方をメモ


  1. おもむろにfoursquareにログインします
  2. https://ja.foursquare.com/feeds/にアクセスします
  3. https://feeds.foursquare.com/history/○○.icsをコピー
  4. Googleカレンダーを開きます
  5. 左のメニューから「他のカレンダー」で小さい三角を押します
  6. 「URLで追加」にさっきコピーしたicsのURLを貼り付け
  7. (゚д゚)ウマー

これで自分の履歴がさくっと確認できます。
kmlをコピってGoogleマップでインポートすれば地図上で確認できるようになります


#以下アフィリエイト用の広告です

2011年11月6日日曜日

AndroidのUSB Host APIを使ってチョロQを動かす




前回前々回に紹介したAndroidのUSBホストAPI。
これを使っていつものごとく日本が世界の誇るタカラトミー社製のチョロQ ハイブリッド を遠隔操作しました。
今回はそれのまとめ記事です。
ソースはGithub上でライブラリ化したものとサンプルソースで公開してます。

使用方法は、これまでに紹介したとおりAndroid 3.1以上が必要です。
自分はOptimus Padでのみテストしてますが、おそらく他のタブレットでもいけると信じてます。

ライブラリの方はまだ詰めが甘いのでUSBのパーミッション取得用のBroadcastReceiverを正しく開放できていない状態です。
また、シリアル通信のボーレートの計算方法がいまいちわかっていないので今の所9600で固定値になっています。
APIにはsetBaudrate()は実装しているのですが、中身は見てもらってもわかるとおり空っぽです。

ライブラリの使い方はgithub上のUSB_Lib_sampleがわかりやすいかと思ってます。
UsbSerialManagerを使ってUSBシリアル通信ができるデバイスの一覧をgetList()を使って取得します。
取得してデバイスの一番最初のデバイスの使用許可を要求します。
要求すると、要求ダイアログがでます。



    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
        manager = new UsbSerialManager(this);
        if (serial == null) {
            List list = manager.getList();
            if (list.size() > 0) {
                Log.d(TAG, "Device count=" + String.valueOf(list.size()));
                UsbDevice dev = list.get(0);
                manager.requestPermission(dev, listener);
            } else {
                Log.e(TAG, "USB Serial Device not found");
            }
        } else {
            Log.e(TAG, "USB Serial Device has already got instance.");
        }
    }

要求が承認されるとコールバックが呼ばれるので、あとは、UsbDeviceからUsbSerialを生成して、オープンしてあげます。
この辺はちょっと苦肉の策を使っています。
    /** USBシリアル通信デバイスを使用するパーミッションを取得した際のコールバックリスナー */
    UsbSerialManager.OnGetPermissionListener listener = new UsbSerialManager.OnGetPermissionListener() {
        @Override
        public void onGetPermission(UsbSerial device) {
            Log.d(TAG, "onGetPermission");
            UsbDevice dev = device.getDevice();
            Log.d(TAG, "DeviceName=" + dev.getDeviceName());
            Log.d(TAG, "id=" + String.valueOf(dev.getDeviceId()));
            serial = device;

            try {
                serial.open();
            } catch (IOException e) {
                e.printStackTrace();
            }
            threadStart();
        }
    };

オープンすれば、あとはread()、write()で読み書きができます。
本当はストリームで実装しようと思ったのですが、ちょっとオーバーヘッドが大きかったので、手抜きしました。

今後はボーレートの計算とか調べようかと思います。

#以下アフィリエイト用の広告です

2011年11月5日土曜日

Arduino IDEのフォントを変える


ちょっとArduinoの開発環境のフォントがアンチエイリアスなしでギザギザして見難かったし、Ubuntuだと豆腐現象(日本語が文字化けして□に見える)に悩まされていたのでフォントを変えました。

その際の手順をまとめておきます。

Arduinoを立ち上げてFile > Preferenceを選ぶ


そうするとここでフォントサイズは変更できます。でもフォントを変えることができないので、画面内の「/home/<ユーザー名>/.arduino/preference.txt」をクリックする。
そうすると詳細設定を行えるテキストファイルの場所が開きます。

そうしたら、preference.txtはArduino IDEが起動していると編集しても、終了時に上書きされてしまうので、Arduino IDEを終了しておく。

Arduino IDEを終了したら、preference.txtを開きます。
開いたら、editor.fontとeditor.antialiasを以下のように編集します。
<フォント名>は使用したいフォント名を選びます。


editor.font=<フォント名>,plain,16
editor.antialias=true



編集したら保存してArduino IEDを再度立ち上げればOK

記事の先頭にある画像のように日本語も大丈夫です。


#以下アフィリエイト用の広告です

2011年11月2日水曜日

【使い方編】AndroidのUSBホストを使ってArduinoとシリアル通信 その2

前回ここで紹介されているAndroidとArduinoをUSB Host APIを使ってシリアル通信させるソースの動作テストをしました。

今回はメーリングリストでリクエストがあったので、それの使い方編をやろうかと思います。

紹介しているサイトを拙い英語力で読んでいると
http://www.intra2net.com/en/developer/libftdi/
ここで、libftdiのソースやバイナリがあり、
FTDIのドライバの動作について詳しくしりたいならソース読めって感じだった。

あと、rootedな端末であれば
http://android.serverbox.ch/?p=285
ここにドライバをカーネルに入れる方法が書かれてた。


それでは本題。

必要なもの
・Android 3.1以上のタブレット(自分はOptimus Padを使った)
・マイクロUSBからホストAへ変換するコネクタ
自分はOptimusPadに付いてきたものを使用
また、動作確認はしてないですが、Amazonでも売ってる様子
ELECOM Micro-USB(Aメス-MicroA)アダプタ 延長 0.15m ブラック MPA-EMA015BK
USB2.0ホストケーブル Micro-USB(Aメス-MicroB)アダプタ
・FTDI製のUSBシリアル変換チップを使った製品
動作確認したもの
・Arduino Duemilanove
Arduino pro mini 3.3VFT232RL搭載小型USB-シリアルアダプタ
動かないもの
・Arduino Uno
※Arduino UnoはUSBシリアル変換のチップがFTDIのものから変更されているのでそのままでは動きません

ソースのダウンロード
USBシリアル通信の方法はまず紹介しているサイト
Download the Android source
からソースをダウンロードしてきます。

適当に解凍して、Eclipseにプロジェクトをインポート。

FTDI_USBActivity.javaがソースで、こいつがほぼすべて。
private static final String VID_PIDを必要があれば書き換える。
でもおそらくFTDI製のチップであればそのままでも動くはず。

デバイスのVID、PIDの確認
念の為にPCにデバイスを接続して確認してみる。

自分のUbuntu 11.10ではコマンドで、
$ usb-devices
と打てば接続されているUSBデバイスの詳細情報一覧が取得できたので、

## デバイスを接続していない状態
$ usb-devices > usb_none.txt
## デバイスを接続した状態
$ usb-devices > usb_connect.txt
$ diff usb_none.txt usb_connect.txt

を行って差分を見て新しく接続されたデバイスを見つけて
Driver=ftdi_sio
になっているものを探した。

そうすると

< T:  Bus=02 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 12 Spd=12  MxCh= 0
< D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
< P:  Vendor=0403 ProdID=6001 Rev=06.00
< S:  Manufacturer=FTDI
< S:  Product=FT232R USB UART
< S:  SerialNumber=A700eYen
< C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=90mA
< I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
こんなのが見つかったので、VIDはVendor、PIDはProdIDが一致してたので問題ない。

もし、これでDriverはftdi_sioなんだけどVendorとProdIDが違う製品であれば
FTDI_USBActivity.javaのVID_PIDを変更する必要があります。

アプリの実行
インポートしたプロジェクトを実行

[2011-10-31 23:53:26 - FTDI_USB] ------------------------------
[2011-10-31 23:53:26 - FTDI_USB] Android Launch!
[2011-10-31 23:53:26 - FTDI_USB] adb is running normally.
[2011-10-31 23:53:26 - FTDI_USB] No Launcher activity found!
[2011-10-31 23:53:26 - FTDI_USB] The launch will only sync the application package on the device!
[2011-10-31 23:53:26 - FTDI_USB] Performing sync
[2011-10-31 23:53:26 - FTDI_USB] Automatic Target Mode: using device '192.168.11.3:8000'
[2011-10-31 23:53:26 - FTDI_USB] Uploading FTDI_USB.apk onto device '192.168.11.3:8000'
[2011-10-31 23:53:27 - FTDI_USB] Installing FTDI_USB.apk...
[2011-10-31 23:53:31 - FTDI_USB] Success!
[2011-10-31 23:53:31 - FTDI_USB] /FTDI_USB/bin/FTDI_USB.apk installed on device
[2011-10-31 23:53:31 - FTDI_USB] Done!

実行すると普通のアプリと違いDone!となりそのまま起動しません。
なのでアプリ一覧から起動します。
ちなみにUSBポートはシリアル通信用のデバイスとつないでしまってDDMSからログが見れなくなるので、無線LAN経由でADBが使用できるようにしておくとデバッグが便利です。
やり方としてはPCとAndroidをつないだ状態で
adb tcpip <ポート番号>
と実行し、PCからAndroidを接続を切った状態で(繋がってても問題は無い)
adb connect :<ポート番号>
と実行すればつながるはず。2.X系だとrootedじゃないとダメかも。

なにもAndroidタブレットにつないでいない状態だとlogcatに

11-02 21:34:49.952: D/FTDI_USB(11875): >==< no more devices found >==<

と出力される。
ただ、自分の環境だと変換ケーブルが悪いのかよく認識しなかった。
抜き差ししたりするとたまに治る。

うまいこと認識すると次の画面が出るのでOKを押す


ここで注意!
OpenAccessoryでは接続した瞬間にブロードキャストのIntentが飛んでブロードキャストレシーバーがそれを捕まえることでアプリが自動で立ち上がる仕組みができてましたが、なぜかこのアプリはそれが動きません。Optimus Padが悪いのかサンプルが悪いのかまだ詳しく追っていないのでよくわかりません。
なので、接続する際は次の手順がうまく行きます
USBデバイスを接続 → アプリ起動
この順番を守らないと上記の画面が出てきてくれません。


アプリは1秒間隔で0〜15までを順にカウントアップしています。
なので、今回はテスト用にArduinoに次のようなスケッチを書き込みました。

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  int buf;
  
  if (Serial.available()) {
    buf = Serial.read();
    if (buf % 2 == 1) {
      digitalWrite(13, HIGH);
    } else {
      digitalWrite(13, LOW);
    }
  }
 
}

単純に受信したデータを2で割り、あまりが1だったら基盤に実装されているLEDをつけるだけです。
なので、1秒間隔でオンオフを繰り返すようになっています。



こんな感じで比較的簡単に準備は出来ました。
今後はこのサンプルソースを改良してライブラリをちゃちゃっと作っちゃおうかと思います。


#以下アフィリエイト用の広告です

2011年11月1日火曜日

ブログタイトルを変えてみた

前々からブログタイトルを変えたかったので、
ちょっと思い切って変えてみました。

「傘に骨はあるけど、お肉はどこにあるの?」
これが、自分が親に子供の頃に聞いた質問だそうです。
全く覚えてないですがこういう発想を自分は出来るんだってのを
忘れないためにもブログのタイトルにしてみました。

#以下アフィリエイト用の広告です

2011年10月31日月曜日

AndroidのUSBホストを使ってArduinoとシリアル通信

Androidの会のメーリングリストを見ていると気になる投稿があったので、早速試してみた。



Android USBを用いてシリアル通信を行う方法

https://groups.google.com/forum/?hl=ja#!topic/android-group-japan/eox6wGtMOSY

投稿の中で紹介されていたサイト
http://android.serverbox.ch/?p=370

上記のサイトを読む感じだとハニコムのUSB Host APIを使ってFTDIのチップと通信してるみたい。
とりあえずデスマが近いのでさくっとした動作確認だけしました。

追記
アプリ側は紹介されているサイトのままなので、シリアルからカウントアップした値を常に出し続ける。Arduino側は受信したデータを2で割ってあまりが1ならLEDをオンにするスケッチを書き込んだ。



Android
Optimus Pad(L-06C) 3.1

Arduino
・Arduino Duemilanove
・Arduino Pro Mini 328 3.3V 8MHz + FT232RL搭載小型USB-シリアルアダプタ 3.3V

Arduino UNOはUSB-シリアル変換のチップがFTDI製のものからATmega8U2
に変わっているのでそのままでは認識しない様子。
この辺ももしかしたらどこかに仕様が落ちてるかも。


#以下アフィリエイト用の広告です


2011年10月8日土曜日

Thunderbirdの送信メールの自動改行を無くす方法

自分の備忘録


メニューから
「ツール」→「オプション」



「詳細」で、「一般」のタブを選ぶ。

「高度な設定」の「設定エディタ」を選ぶ。



「about:config」は内部の定数などを編集するので間違えると深刻な問題を引き起こすので、
最新の注意を払って変更する。


「フィルタ」に「mailnews.wraplength」を入力し検索する。

出てきた設定名「mailnews.wraplength」を右クリックし、「値を変更」を選ぶ



入力ボックスを「0」としてOKを押す。

「about:config」を閉じて、「オプション」でOKを押すと設定が反映される。



#以下アフィリエイト用の広告です

2011年10月2日日曜日

Channel APIを使ってブラウザ経由でlogcatを見る


TLやらデ部やらで@tomorrowkeyさんがWebSocket使ってブラウザでLogcat見れるようなのを、
作ったってのを見て二番煎じしてみました。


サイト
https://iwata-n.appspot.com/logcat
上のURLをお好きなブラウザから見ればOK。
ただし、Androidで使っているアカウントと同じGoogleアカウントでログインしている必要があります。

ubuntu11.04 + chrome
mac 10.6 + chrome
Android 3.1 + ブラウザ
で動作確認しました。


アプリ
RemoteLogcat(マーケットへのリンク)
残念ながらGoogleアカウントを使っているのでIS01は動作対象外にしてしまいました。
誰か1.6で端末に設定されているGoogleアカウントのとり方教えてください。


使い方
使い方は簡単で、

  1. PC等でサイトにアクセスして、Androidと同じGoogleアカウントでログイン
  2. Androidでアプリを起動
  3. アプリにサイトでログインしたGoogleアカウントを設定する
  4. サービスのチェックを入れてサービスを起動する
  5. サイトが(゚д゚)ウマー

取りあえずで公開してみました。
反応を見てつくり込むか決めようかと思います。



参考
 Android1.6でも動く「オレオレC2DM」の実装
明日の鍵


#以下アフィリエイト用の広告です

2011年9月6日火曜日

Ubuntu11.04にArduinoの開発環境を作る

ちょっとデスクトップの環境をWin7からUbuntuに変更したのでその際のメモがわり。

Winやmacと同じようにArduinoを公式から環境を落としてきたらコンパイルができなかった。
おそらくコンパイラの設定を特にしていない状態だからまずいようだ。
なので、
 sudo apt-get install arduino
 sudo apt-get install arduino-core
と実行したが、これだとランチャーにショートカットをおいても起動できなかった。
なので、Ubuntuソフトウェアセンターからダウンロードしてくると、
コンパイルもできるし、ランチャーにショートカットをおいても起動できた。
ただ、微妙にアイコンが標準と違う気がするけど、気にしない。


追記
ライブラリとかを置くフォルダは
/usr/share/arduino
の下にある。

さらに追記
なぜか標準のリポジトリからダウンロードできるIDE(22)でUnoが使えない。
しかたがないので、ダウンロードして解凍したのを使う

#以下アフィリエイト用の広告です