0

Macのsayコマンドの音程を変更しつつ再生

Macのsayに日本語しゃべらせれるけど、声が1種類しかなくてもっとほしい。

soxについてるplayコマンドを使うと音程変えたりエフェクトいろいろかけたりしながら再生できるので

brew install sox


saypitchコマンドを作った
後ろに数字付けると音程調整できる
saypitch パソコンなくても書画カメラとnexus7で余裕だった -300
saypitch パソコンなくても書画カメラとnexus7で余裕だった 800
男っぽい声とかもだせる。

#!/bin/sh
## brew install sox

TMP=/tmp/saypitch.aiff
if test $2 ; then
PITCH=$2
else
PITCH=0
fi
say $1 -o $TMP && play $TMP pitch $PITCH norm reverb
rm $TMP

読む速度遅くしたり
saypitch "-r 250 パソコンなくても書画カメラとnexus7で余裕だった" -1000


というかsoxはおもしろい。
一緒にrecというコマンドも入って、これを使うとCUIからすぐに録音できる。
今のところこれが一番簡単な録音方法なのではないか

1

Android版ArduinoFirmataを作った

AndroidのJavaの中で

int sensor = arduino.analogRead(1);
arduino.servoWrite(9, 155);
とか書けて便利です。

ここにチュートリアルとか、すぐ試せる無署名のapkとか置いといたのでどうぞ
ArduinoFirmata on Android

ArduinoFirmata on Android


先週ArduinoとAndroidを接続できたので、Firmataプロトコルの移植はRubyでもやった事だしさくっとAndroid版も作ってみた。



Android OS 3.2以上でUSBホスト機能がある端末とStandard FirmataをインストールしたArduinoを、USBホストケーブルで接続する。
Arduino IDE -> [File] -> [Examples] -> [Firmata] -> [StandardFirmata] でインストールできる。
(Firmataを入れたArduinoは、シリアル通信からの命令で動く操り人形モードになります)

Android用ライブラリはjarファイルにしてArduinoFirmata on Androidに置いてある。
Androidプロジェクトのlibsディレクトリに入れれば使える。


Arduino Duemillanove, UNO, Seeduino v2で動作確認した。
USBホストケーブルはこれこれが使えた。


ご意見ご感想はtwitterやgithubのissueやpull requestなどお待ちしております

0

SFCの研究会合同説明会に参加した

増井研の説明をした。 → スライド

なんかすごい増井研入りたいとか言ってる人が何人かいた気がする。

説明会は水曜の18時からだったんだけど、高校生が説明を聞きに来てておどろいた。
中高の制服ではなかったからわざわざこんな遠くまで来てくれたのか。

質疑応答の時間が長かったから、いろいろ何を研究したいかを話を聞いたりした上で「君は筧研も見に行ったほうがいいよ」とか案内したりもした。


SFC CLIP: 自分にとって星5つの研究会を SFC研究会合同説明会開催 (2012年12月07日)

11

AndroidのUSBホスト機能でArduinoとシリアル通信する

超便利なライブラリ作ったのでこっち使うといいです → 橋本商会 » Android版ArduinoFirmataを作った

——-以下本文

なんか意外と簡単にできたし、まったくやってる人の情報が無いので書いておく。


Nexus7+Arduino(Seeduino)+サーボモータ を動かした


AndroidにArduino等のシリアルデバイスを直つなぎできる。
ADKやUSBホストシールドやIOIOと違って、むずかしい回路やプログラムはいらないし、電源もAndroid側から供給もできる。
マイコン側は単純にシリアル通信するだけ。Android側もUSBシリアルポートを探して接続するだけ。


Nexus7にはUSBポートとは別に充電ポートがあるのでそっちで充電させつつ、デバイス制御もできそう

必要な物は3つ

1. USBホスト機能に対応したAndroid端末
2. USBホストケーブル
3. Arduino等のUSBシリアルデバイス


USBホスト機能に対応したAndroid端末

Android 3.1(タブレット用)や4以上の端末はUSBホスト機能がある。
2012年夏ごろからの端末が該当していて、USBホストシールドやADKが必要なくなった。

Galaxy NexusやGalaxy S3以降でAndroid4以上の端末はokのはず。
Googleが各ベンダになるべくUSBホスト機能を持たせるように働きかけているってsonyの人が言ってた。
最近Nexus SにもAndroid4が配信されたけど、チップセットにUSBホストの機能が無いので無理。


USBホストケーブル

ようするに「AndroidにUSBキーボードやマウスを接続できる」と書いてあるケーブルのこと。
これをUSBポートに接続すると、AndroidはUSBホストモードになる。

USBケーブルは普通4ピンだ。VCC、GND、D+、D-ピンの4つ。
USB mini/microから、5ピンになった。IDピンが増えた。
USBホストケーブルを作るには、IDピンとGNDピンをショートさせるだけでいい。


これを買った。ぴったりで良い。


なお自作も可能。S2 » USBホストケーブルとUSBケーブルの違い にくわしく書いてある。
市販のUSB-マイクロUSB変換コネクタを分解して、IDピンを短絡させてる。


昔のArduinoと今後のArduino

Arduino UNO以降は、AVRマイコン内蔵のUSBシリアル機能を使うようになっている。
Arduino Duemillanove以前は、FTDI社のFT232というUSBシリアル変換ドライバICを使っている。
それぞれ違うデバイスドライバが必要だけど、両方対応できるようにAndroidアプリを実装可能。

このGoogle製ライブラリを使えばいい。勝手にデバイス判別してくれる。
ボーレートの設定とかも扱いやすい関数が揃ってて便利。
usb-serial-for-android – Android USB serial and Arduino device host support library. – Google Project Hosting

これを使わなくてもandroid.hardware.usb.UsbDeviceクラスを使えば自分で実装できるが、ソース見てみればわかるけどげんなりする処理が多いのでusb-serial-for-android.jarを使うのが良いと思います。

AndroidでArduinoとシリアル通信する


usb-serial-for-androidのDownloadsメニューからusb-serial-for-android-v010.jarをダウンロードして、Androidアプリのlibsディレクトリに入れる


AndroidManifest.xml のinternt-filterの中に追加
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />


さらにintent-filterと同列にmeta-dataを作る
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />


device_filter.xml を取得する。FTDIチップやArduinoのUSBベンダIDが書いてある。
wget http://usb-serial-for-android.googlecode.com/git/UsbSerialExamples/res/xml/device_filter.xml
mkdir res/xml
mv device_filter.xml res/xml/


接続する。
アクティビティ内で
import java.io.*;
import android.hardware.usb.*;
import com.hoho.android.usbserial.driver.*;

public void onCreate(Bundle savedInstanceState) {
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbSerialDriver usb = UsbSerialProber.acquire(manager);
if (usb != null) {
try{
usb.open();
usb.setBaudRate(9600);
start_read_thread(); // シリアル通信を読むスレッドを起動
}
catch(IOException e){
e.printStackTrace();
}
}
}


Arduino → Android
シリアル通信で受信したデータを読む。ArduinoでSerial.println(“文字列”)したデータがAndroid側で読める。
public void start_read_thread(){
new Thread(new Runnable(){
public void run(){
try{
while(true){
byte buf[] = new byte[256];
int num = usb.read(buf, buf.length);
if(num > 0) Log.v("arduino", new String(buf, 0, num)); // Arduinoから受信した値をlogcat出力
Thread.sleep(10);
}
}
catch(IOException e){
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}


adb logcat | grep arduino
して見てみましょう。受信できているはず。


Android → Arduino
AndroidからArduinoに文字列「o」や「x」送信する。
while(true){
usb.write("o".getBytes("UTF-8"),1);
Thread.sleep(1000);
usb.write("x".getBytes("UTF-8"),1);
Thread.sleep(1000);
}


接続を閉じる。
try{
usb.close();
}
catch(IOException e){
e.printStackTrace();
}


Arduinoにはこんなのを書いておくと、シリアル通信でoとxが来たらLEDを点灯消灯させたりサーボモータを回したりできる。
char led_pin = 13;
char serial_recv;

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

void loop(){
Serial.println(analogRead(0)); // アナログセンサの値をAndroidに送る
while(Serial.available() > 0){
serial_recv = Serial.read(); // シリアル通信を受信
switch(serial_recv){
case 'o':
digitalWrite(led_pin, true); // 基板上のLEDを点灯
analogWrite(11, 200); // サーボ回す
break;
case 'x':
digitalWrite(led_pin, false); // 消灯
analogWrite(11, 20); // サーボ回す
break;
}
Serial.println(serial_recv);
}
delay(10);
}


WiFiでAndroidアプリ開発

ArduinoをAndroidに接続しているとUSBケーブルがさせない。MacからWiFi経由でAndroidにプログラムを書くといい。
Nexus7が同じ無線LAN内の192.168.1.121にあるとする。
設定→タブレット情報→端末の状態 にIPアドレスが書いてある。
AndroidをMacにUSB接続してから
adb tcpip 5555
adb connect 192.168.1.121:5555
adb logcat
USBケーブルを抜く。

あとはもう、adb installもEclipseからのDebug Runも、logcatもWiFiでできるようになってる。


元に戻すには、USBケーブルを接続して
adb usb
これで戻る。


その他の作例

こういうのを作ってる人がいて、参考になった

Android USB Host + Arduino: How to communicate without rooting your Android Tablet or Phone | Using Android in Industrial Automation
android.hardware.usb.UsbDeviceを使ってArduino UNOとシリアル通信している

Android Host – Arduino間シリアル通信の実現 – アトリエのどか
FTDIドライバを使ってArduino Duemillanove以前とシリアル通信してる

0

SFCの研究会合同説明会

今週、12/5(水)に研究会合同説明会があります
増井研も参加します

SFC全ての研究会がまとめて説明してくれるイベントで、18:30からオメガ館で開始です
20時までやってる。


1分プレゼン用のスライドを作った。