« October 2008 | Main | December 2008 »

2008.11.30

[AVR]ハローキティのAVRライター新発売!!

ハローキティのAVRライター新発売!!

Hellokittyavrwriter1

Hellokittyavrwriter2_2

Hellokittyavrwriter3_2

|

2008.11.17

[AVR][Gainer]小型Gainer互換機pepperを作って遊んでみた

AVR ATtiny45/85を使ったGainer互換機、pepperを作って遊んでみた。

morecat lab.さんでは、このほかATmega88Pを使ったginger、ATmega644Pを使ったsugarなどのGainer互換機を作られているが、その小ささに惚れ、Pepper-MIDIというインターフェースを接続すると学研の付録シンセ、SX-150をMIDI化できるということもあって、pepperを選択した。

とりあえず部品のレイアウトは公式のプリント基板と同じにして、ジャンパを飛ばしまくってつじつまを合わせてみた。

Pepper1

▲所定のサイズの基板で作らないと価値半減なので、ユニバーサル基板からの切り出しをがんばった。

Pepper2

▲手のひらでコロコロともてあそべるサイズ。

Pepper3

▲USBに直結可能。通常この手のものに必要な、12MHzのクリスタルさえ省略した作りになっている。

Pepper4

▲CdSを接続してみた。pepperが小さいので、USBケーブルの先に、センサなどを直結できる感覚。

Pepper5

▲学研の付録シンセ、SX-150を接続するインターフェース、Pepper-MIDI。

Pepper6_2

▲Pepper-MIDIを介してSX-150を接続。

Processingからのアクセス(Mac OS X)

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が無いので、四つあるポートはすべてアナログ系の関数でアクセスする。

|

2008.11.14

[iPhone][Jailbreak]シリアルポート実験用のDock Connectorできた

シリアルポート実験用のDock Connectorできた。
思いのほかいい感じになった。

Iphoneserialconnector1

▲このパーツがカギ。
紙フェノールの基板を精密ニッパーでバキバキ削って6穴のサイズにして、丸ピンのソケットを半田付け。

Iphoneserialconnector2

▲丸ピンのソケットの足が当たる部分にピンバイス等で穴を空ける。

Iphoneserialconnector3

▲UEW線で配線。ホットボンドが充填されているのは、ガワ無しで使っていたときの名残。

Iphoneserialconnector4

▲金属フレームに接触してしまうので、シールで絶縁した。

Iphoneserialconnector5

▲完成!

Iphoneserialconnector6

▲ブレッドボーダーズ御用達の(?)Dock Connectorになった。後でピン配列のメモを貼っておこう。

|

2008.11.12

[AVR]AVRライターHIDaspxを作ってみた

AVR業界ではおなじみsenshuさんがメンテナンスされている、AVRライターのHIDaspxが素晴らしい感じなので、作ってみることにした。

Hidaspx1_2

特徴は、

  • ドライバが要らない(HID = Human Interface Deviceとして認識する)
  • ATtiny2313(秋月で100円)一つでできる
  • 直接USB接続ができる
  • FT232RなどのUSB-Serialコンバータが要らない
  • Mac OS Xでも使える
  • GIPOモードが付いている(USB-IO的な、あるいはFT232RのBit Bangモード的な)

Hidaspx2

こちらのkumanさんの2台目の回路図を手本に、力弱くユニバーサル基板で。
部品のレイアウトはアドホックな感じで進めていったんだけど、案外うまく収まった。
考えなしに縦置きにしたけど、これはどう考えても横置きした方が楽だったような。

Hidaspx3

まずはVMware Fusion上のWindows XPから使ってみた。
速い! しかも、AT90S2313、AT90S1200などのレガシーデバイスでも問題無く読み書きできる。

Mac OS Xでは、HIDaspxの源流となったHIDaspを作られた、瓶詰堂さんが配布されている「hidspx for MacOS X」を使ってみたところ、何だか遅いみたい? でも使えてはいる。
これがWindows上での速さぐらいになってくれると助かるなあ。

Hidaspx4

↑左のやつは以前作ったMorosanさんの、PICを使ったAVRライター。こちらはRS-232Cだけれども、STK500互換として機能し、AVR Studioから書き込める素晴らしいもの。PICライターしか持っていなかった時代に、これを使って初めてAVRに書き込んだときの感動ったら無かった。

|

2008.11.10

[iPhone]iPhone 3G非対応乾電池式USB電源でiPhoneに給電してみる

iPhone 3GにiPhone 3G対応でない電源をつなぐと、給電を認識してくれない。
手持ちの乾電池式USB電源も例外に漏れず、iPhone 3Gからはソッポを向かれていた。

ここでiPhone 3G対応品を買うのもいいけれど、こちらの情報「iphone-usb-charger.jpg」を元に手持ちの乾電池式USB電源を改造してみた。

170kΩの抵抗を+5VとD+、GNDとD-の間に付け、D+、D-間をショートするようある。

(内容は無保証です。試す場合は自己責任においてお願いします)

Iphonebatterychargerschema

170kΩの抵抗は無いので、160kΩと10kΩを直列につないでやってみた。

Iphone3gbatterycase1

Iphone3gbatterycase2

これでiPhone 3Gへ充電可能になった!! 汎用性はあるけれども、結構重いのでそうそう使わんだろうなあ。やはり電池2本タイプの方がいいか。

Iphone3gbatterycase5

Iphone3gbatterycase6

|

2008.11.09

[iPhone]iPhone 3Gにヘッドホンアンプをつないでみた

外出時、重装備にしてもいいかもな、という気候になってきたので、iPhone 3GにSTAX SR-001MK2をつないでみることにした。

Iphone3glineout4_2

折角つなぐのであれば、内蔵のヘッドホンアンプはバイパスしたい。
そのためにDock ConnectorからLine-Outを引き出してみると、何と音が出ない。

Iphone3glineout1

同じことを1G iPod touchにしてみると、こちらでは音が出る。

例によって、Dock Connectorへ接続した機器の判定をして挙動を決めているらしい。面倒なことだ。

OKIIZOさんのエントリ[iPhone]iPhone3Gのdockコネクタのピンアサインによると、この問題は、海外でiPhoneをカーステレオに接続する際の問題として議論されているようだ。

ワークアラウンドとして提示されているものを検討してみる。
11番のSerial GNDをGNDに落とすとLine-Outから音が出るようになるという話なので、早速試してみると、これでひとまずはOKだった。

Iphone3glineout2

ただし、それだけだと接続した際、スリープから復帰した際に警告のダイアログが出てしまうので、回避方法がいろいろと模索/提示されている。
「11番と21番の間に1kΩの抵抗を入れる」というものを試してみたがダメだった。諸説紛々としているということは、まだはっきりとした回避方法は見つかっていないようだ。

Iphone3glineout5

kakoさんの試みによると、この警告のダイアログはSerial GNDに0.6Vほどの電圧をかけると消えるらしい。
これもやってみた。手持ちの150kΩと47kΩで分圧。電圧0.75V程度、これをSerial GNDに入力してみる。
iPhone 3Gでも警告のダイアログを消す効能は確かめられたものの、Line-Outから音が出てくれない。これでは意味が無い。

潔く諦め、今は11番をGNDに落とすのみで妥協することにした。情報が出てきたら、また試すことにしよう。

Iphone3glineout3

この件はnoviさんがiPhone 3G発売直後にやってたんだなー。

STAXの素晴らしさ

いちいちダイアログが出るのがウザいけれども、一応は使えるので、これでしばらくいってみよう。

しかし、STAXは本当に素晴らしい。
自分はSTAX SR-001MK2しか持っていないので、これでSTAXを語るべからず、と言われそうだけれども、この歪率の低い、透明度の高い音はダイナミック型では味わえない。

これでドライバが要らず、小さくてヘッドバンドが要らず、メシを食ったり唾を飲み込んだときに耳でバキバキ言わず、遮音性が高いといいんだけどね。(それは無理)

|

2008.11.04

[iPhone][AVR][Jailbreak]自走式iPhoneを作ってみた

iPhoneのシリアルポートを使った工作が面白いので、今度は「自走式iPhone」を作ってみた。

Selfpropellediphone01

ハードウェア

ベースは、TAMIYAの楽しい工作シリーズNo.68「壁づたいねずみ工作基本セット」。 CPUボード&開発環境にArduino(ボードはArduino Diecimila)を利用。

Selfpropellediphone02

ArduinoのProtoShield上にモータードライバのTA7291P (PDF)を二つ設置、これでモーターを制御。 TA7291P×2の入力ピン計4本に、ArduinoのPWM出力ができるピン、5, 6, 9, 10を接続。 自走式iPhoneの重量に耐えるため、AA×4本を直列につないだ電源でモーターを駆動。

Selfpropellediphone03

そのほか、Arduinoの電源となる009P電池、そこから安定化した5Vを作るレギュレータ回路なども載ってぶら下がっている。

Selfpropellediphone04

Selfpropellediphone05

ソフトウェア

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

なかなか面白い遊びであった。

|

2008.11.01

[iPhone][Jailbreak]iPhoneにつないだキーボードから文字を入力してみた

iPhoneにキーボードを接続する試みの続き。

前回エントリ: [iPhone][Jailbreak]iPhoneにキーボードをつないでみた

とりあえず、Rubyでソフトウェアのモックを作ってみることに。
キーボードからタイプした文字を標準出力に出せるようにしてみた。

使っているのはVisor用のキーボード、P-Key。
接続方法は以下の通り。

Pkeyconnection

このキーボード、全部のキーで押し下げ時と押し上げ時に固有のキーコードを送ってくるので、全部のキーがModifierになりえる。
「d」を押しながら「e」で「define」、「d」を押しながら「l」で「declare」みたいなことも可能かと。

キーコードは以下の通り。

Pkeykeycode

|

« October 2008 | Main | December 2008 »