« October 2008 | Main | December 2008 »
AVR ATtiny45/85を使ったGainer互換機、pepperを作って遊んでみた。
morecat lab.さんでは、このほかATmega88Pを使ったginger、ATmega644Pを使ったsugarなどのGainer互換機を作られているが、その小ささに惚れ、Pepper-MIDIというインターフェースを接続すると学研の付録シンセ、SX-150をMIDI化できるということもあって、pepperを選択した。
とりあえず部品のレイアウトは公式のプリント基板と同じにして、ジャンパを飛ばしまくってつじつまを合わせてみた。
▲所定のサイズの基板で作らないと価値半減なので、ユニバーサル基板からの切り出しをがんばった。
▲手のひらでコロコロともてあそべるサイズ。
▲USBに直結可能。通常この手のものに必要な、12MHzのクリスタルさえ省略した作りになっている。
▲CdSを接続してみた。pepperが小さいので、USBケーブルの先に、センサなどを直結できる感覚。
▲学研の付録シンセ、SX-150を接続するインターフェース、Pepper-MIDI。
▲Pepper-MIDIを介してSX-150を接続。
pepperはGainerとして機能するので、pepperをProcessingで使うには、Gainer用のライブラリをProcessingにインストールすればいい。 Gainerの公式ページには、Mac OS Xでは「/Applications/Processing/libraries/serial/macosx_setup.command」を実行しろ、という説明があるが、これは古い手順で、そのようなファイルは無い。
現在は、「/Applications/Processing/Contents/Resources/Java/Libraries/serial/library/RXTXcomm.jar」を、「/Applications/Processing/Contents/Resources/Java/Libraries/gainer/library/RXTXcomm.jar」へコピー、というのが正しい手順となる。
pepperのピン配列は以下の通り。
+5V ai0 ao1 ao0 ai1 GND
アナログ入力二つがアナログ出力二つを囲むような形になっている。 また、Processingからpepperの各ポートへのアクセスは、以下のようなコードでできる。
//出力 //2番目の引数は0〜255の整数 //ao0 gainer.analogOutput(0, 0); //ao1 gainer.analogOutput(1, 255); //入力 int res0, res1; gainer.peekAnalogInput(); //ai0 res0 = gainer.analogInput[0]; //ai1 res1 = gainer.analogInput[1];
※「gainer.peekAnalogInput()」を実行しないと、値が取得できないので注意。
デフォルトのCONFIGURATION_1にはデジタルI/Oが無いので、四つあるポートはすべてアナログ系の関数でアクセスする。
Continue reading "[AVR][Gainer]小型Gainer互換機pepperを作って遊んでみた" »
AVR業界ではおなじみsenshuさんがメンテナンスされている、AVRライターのHIDaspxが素晴らしい感じなので、作ってみることにした。
特徴は、
こちらのkumanさんの2台目の回路図を手本に、力弱くユニバーサル基板で。
部品のレイアウトはアドホックな感じで進めていったんだけど、案外うまく収まった。
考えなしに縦置きにしたけど、これはどう考えても横置きした方が楽だったような。
まずはVMware Fusion上のWindows XPから使ってみた。
速い! しかも、AT90S2313、AT90S1200などのレガシーデバイスでも問題無く読み書きできる。
Mac OS Xでは、HIDaspxの源流となったHIDaspを作られた、瓶詰堂さんが配布されている「hidspx for MacOS X」を使ってみたところ、何だか遅いみたい? でも使えてはいる。
これがWindows上での速さぐらいになってくれると助かるなあ。
↑左のやつは以前作ったMorosanさんの、PICを使ったAVRライター。こちらはRS-232Cだけれども、STK500互換として機能し、AVR Studioから書き込める素晴らしいもの。PICライターしか持っていなかった時代に、これを使って初めてAVRに書き込んだときの感動ったら無かった。
iPhone 3GにiPhone 3G対応でない電源をつなぐと、給電を認識してくれない。
手持ちの乾電池式USB電源も例外に漏れず、iPhone 3Gからはソッポを向かれていた。
ここでiPhone 3G対応品を買うのもいいけれど、こちらの情報「iphone-usb-charger.jpg」を元に手持ちの乾電池式USB電源を改造してみた。
170kΩの抵抗を+5VとD+、GNDとD-の間に付け、D+、D-間をショートするようある。
(内容は無保証です。試す場合は自己責任においてお願いします)
170kΩの抵抗は無いので、160kΩと10kΩを直列につないでやってみた。
これでiPhone 3Gへ充電可能になった!! 汎用性はあるけれども、結構重いのでそうそう使わんだろうなあ。やはり電池2本タイプの方がいいか。
外出時、重装備にしてもいいかもな、という気候になってきたので、iPhone 3GにSTAX SR-001MK2をつないでみることにした。
折角つなぐのであれば、内蔵のヘッドホンアンプはバイパスしたい。
そのためにDock ConnectorからLine-Outを引き出してみると、何と音が出ない。
同じことを1G iPod touchにしてみると、こちらでは音が出る。
例によって、Dock Connectorへ接続した機器の判定をして挙動を決めているらしい。面倒なことだ。
OKIIZOさんのエントリ[iPhone]iPhone3Gのdockコネクタのピンアサインによると、この問題は、海外でiPhoneをカーステレオに接続する際の問題として議論されているようだ。
ワークアラウンドとして提示されているものを検討してみる。
11番のSerial GNDをGNDに落とすとLine-Outから音が出るようになるという話なので、早速試してみると、これでひとまずはOKだった。
ただし、それだけだと接続した際、スリープから復帰した際に警告のダイアログが出てしまうので、回避方法がいろいろと模索/提示されている。
「11番と21番の間に1kΩの抵抗を入れる」というものを試してみたがダメだった。諸説紛々としているということは、まだはっきりとした回避方法は見つかっていないようだ。
kakoさんの試みによると、この警告のダイアログはSerial GNDに0.6Vほどの電圧をかけると消えるらしい。
これもやってみた。手持ちの150kΩと47kΩで分圧。電圧0.75V程度、これをSerial GNDに入力してみる。
iPhone 3Gでも警告のダイアログを消す効能は確かめられたものの、Line-Outから音が出てくれない。これでは意味が無い。
潔く諦め、今は11番をGNDに落とすのみで妥協することにした。情報が出てきたら、また試すことにしよう。
この件はnoviさんがiPhone 3G発売直後にやってたんだなー。
いちいちダイアログが出るのがウザいけれども、一応は使えるので、これでしばらくいってみよう。
しかし、STAXは本当に素晴らしい。
自分はSTAX SR-001MK2しか持っていないので、これでSTAXを語るべからず、と言われそうだけれども、この歪率の低い、透明度の高い音はダイナミック型では味わえない。
これでドライバが要らず、小さくてヘッドバンドが要らず、メシを食ったり唾を飲み込んだときに耳でバキバキ言わず、遮音性が高いといいんだけどね。(それは無理)
iPhoneのシリアルポートを使った工作が面白いので、今度は「自走式iPhone」を作ってみた。
ベースは、TAMIYAの楽しい工作シリーズNo.68「壁づたいねずみ工作基本セット」。 CPUボード&開発環境にArduino(ボードはArduino Diecimila)を利用。
ArduinoのProtoShield上にモータードライバのTA7291P (PDF)を二つ設置、これでモーターを制御。 TA7291P×2の入力ピン計4本に、ArduinoのPWM出力ができるピン、5, 6, 9, 10を接続。 自走式iPhoneの重量に耐えるため、AA×4本を直列につないだ電源でモーターを駆動。
そのほか、Arduinoの電源となる009P電池、そこから安定化した5Vを作るレギュレータ回路なども載ってぶら下がっている。
Arduinoのソフトウェアは、シリアル通信を監視して、コマンド文字が来たらそれに応答、という簡単なもの。 コマンド文字に応じて、TA7291Pの所定のピンをHレベルにする。 PWM制御できるポートを使っているので、一応0〜255までの256段階でモーターのスピードを調整できるが、トルクが無いのでなかなか調整が難しい。
#define FORWARD 1
#define BACKWARD 2
#define STOP 3
#define RIGHT 4
#define LEFT 5
int rightForward = 10;
int rightBackward = 9;
int leftForward = 6;
int leftBackward = 5;
int incomingByte = 0;
int spd = 100;
int currentVector = STOP;
void setup() {
pinMode(rightForward, OUTPUT);
pinMode(rightBackward, OUTPUT);
pinMode(leftForward, OUTPUT);
pinMode(leftBackward, OUTPUT);
Serial.begin(9600);
Serial.println("start");
}
void loop() {
if(Serial.available() > 0)
{
incomingByte = Serial.read();
Serial.println(incomingByte);
switch (incomingByte) {
case 120:
goBackward(spd);
break;
case 119:
if (spd > 0)
{
spd -= 10;
}
updateSpeed();
//Serial.println(spd);
break;
case 115:
turnLeft(spd);
break;
case 113:
if (spd <= 250)
{
spd += 10;
}
updateSpeed();
//Serial.println(spd);
break;
case 101:
goForward(spd);
break;
case 100:
turnRight(spd);
break;
case 97:
stop();
break;
}
}
}
void updateSpeed()
{
switch (currentVector)
{
case LEFT:
turnLeft(spd);
break;
case RIGHT:
turnRight(spd);
break;
case STOP:
stop();
break;
case BACKWARD:
goBackward(spd);
break;
case FORWARD:
goForward(spd);
break;
}
}
void goForward(int spd)
{
stop();
analogWrite(leftForward, spd);
analogWrite(rightForward, spd);
currentVector = FORWARD;
}
void goBackward(int spd)
{
stop();
analogWrite(leftBackward, spd);
analogWrite(rightBackward, spd);
currentVector = BACKWARD;
}
void turnRight(int spd)
{
stop();
analogWrite(leftBackward, spd);
analogWrite(rightForward, spd);
currentVector = RIGHT;
}
void turnLeft(int spd)
{
stop();
analogWrite(leftForward, spd);
analogWrite(rightBackward, spd);
currentVector = LEFT;
}
void stop()
{
analogWrite(rightForward, 0);
analogWrite(rightBackward, 0);
analogWrite(leftForward, 0);
analogWrite(leftBackward, 0);
currentVector = STOP;
}
iPhone上で動かすソフトウェアは、適当なポートでListenし、送られてきた文字をシリアルポートにフォワードするというもの。 この働きで、iPhoneが無線モジュールとして機能することになる。これはRubyで書いた。
#!/usr/bin/env ruby
require "socket"
require "serialport"
class Arduino
def initialize(serialport = "/dev/tty.iap", serverport = 12345)
if (not File.exist?(serialport))
raise "ERROR: Specified device does not exist."
end
@sp = SerialPort.new(serialport, 9600, 8, 1, SerialPort::NONE)
@gs = TCPServer.open(serverport)
while true
@socks = [@gs]
@addr = @gs.addr
@addr.shift
printf("server is on %s\n", @addr.join(":"))
run()
end
end
def run()
while true
nsock = select(@socks)
next if nsock == nil
for s in nsock[0]
if s == @gs
@socks.push(s.accept)
print(s, " is accepted\n")
else
if s.eof?
print(s, " is gone\n")
s.close
@socks.delete(s)
else
str = s.gets
if str.chomp == "end"
s.close
return
end
@sp.puts(str)
end
end
end
end
end
end
arduino = Arduino.new("/dev/tty.iap", 12345)
クライアントは特に書いてないので、telnetから操作した。
$ telnet 192.168.0.5 12345
なかなか面白い遊びであった。
Continue reading "[iPhone][AVR][Jailbreak]自走式iPhoneを作ってみた" »
iPhoneにキーボードを接続する試みの続き。
前回エントリ: [iPhone][Jailbreak]iPhoneにキーボードをつないでみた
とりあえず、Rubyでソフトウェアのモックを作ってみることに。
キーボードからタイプした文字を標準出力に出せるようにしてみた。
使っているのはVisor用のキーボード、P-Key。
接続方法は以下の通り。
このキーボード、全部のキーで押し下げ時と押し上げ時に固有のキーコードを送ってくるので、全部のキーがModifierになりえる。
「d」を押しながら「e」で「define」、「d」を押しながら「l」で「declare」みたいなことも可能かと。
キーコードは以下の通り。
Recent Comments