2013年4月16日

フレキシブル太陽電池 TX3-25

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

少し前にSwitch ScienceでSunModというテレビなどのリモコンを太陽電池式に改造するキットが販売開始されたのですが、これに使われている(と思われる)太陽電池を偶然共立エレショップで見つけて買ってしまった訳です。


ご覧の通り非常にフレキシブルで薄いので、円筒形の物の表面に貼り付けたりするのも問題なさそう。(日の当たり具合とかは取りあえず無視して)


さっそく両極にリード線を付けてチェック。日中の屋内でも1.7Vくらいの出力が得られる。


少し曇った日の正午過ぎに西向きの窓の網戸越しに置いて1.9Vくらい。
ちなみに定格は「開放電圧/短絡電流:4.1V/40mA 操作電圧/電流:3V/25mA」だそうで、日光のガシガシ当たるところでは普通に3V出るっぽい。

追記:直射日光を当てると4V出ました。

SunModの様に直列接続のニッケル水素電池2本に並列に接続する形で蓄電して、何かに電源供給するという使い方が良さそうですが、実際に充電できる&どのくらい充電できるのかは謎...
#そのうち検証してみるつもり

2013年3月31日

ミニブレッドボードで遊ぶ (温湿度計)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

秋月電子にて1個150円(2個以上買うと1個あたり150円)で売ってあるミニブレッドボードBB-601
これにどれだけ詰め込めるかという遊びを思いついたので、早速何か簡単なものを作ってみました。

ATmega328P-PU、温度センサ(LM61CIZ)、湿度センサ(HIH4030)、極小キャラクタ液晶、セラロック(16MHz)、抵抗(10kΩ)、コンデンサ(0.1µF)という構成。
#流石に電源まで詰めるのは無理


この状態でUSARTとSPIは空いているので、更に拡張や連携も可能だったり。
温度・湿度センサもデジタル(I2CやSPI)接続の物を利用すれば、もう少し他の物を接続できる。


LCD裏はこんな感じ。
買ってきてすぐは1mmピッチのFFCが付いていますが、何だかんだで扱いにくいので、細めで少し硬いビニル絶縁電線に付け替えました。(自立可能)

このサイズで何か面白いものが出来れば掲載しようと思っているものの、如何せんネタが無いのである(~_~;)

追記:サイズ比較にiPhone4Sの上に載せて1枚。


2013年3月22日

ArduinoISPでUSBasp-Bをアップデート

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

aitendoでUSBasp-Bを買ったものの、Arduino IDEからバージョン古いと怒られる&書き込み速度が遅いのでバージョンアップを試みた時のメモ。

ArduinoISPでUSBasp-Bをアップデートする試みは既にこちらなどで挑戦されているようですが、今のところ成功したという記事は見かけなかったのでチャレンジしてみることに。

1. ArduinoにArduinoISPを焼く
ファイル→スケッチの例→ArduinoISPを選択し、あとは普通にいつもの通り書き込む。

2. Auto Resetの無効化
ArduinoのAuto Resetを無効化するために、ArduinoのRESETとGND間にコンデンサを入れる。(0.1µFとか1µFでOK)
ちなみに、110Ω程度の抵抗をRESET-GND間に入れるというduemilanoveで使える技はUNOでは使えませんでした。

3. ArduinoとUSBasp-Bを接続
USBasp-BのJP3とJP4(3つのジャンパのうち真ん中以外の2つ)をONにしてファームウェア書き換えモードにする。
ArduinoとUSBasp-Bの接続はストレート(ArduinoのMOSIはUSBasp-BのMOSIに、MISOはMISOに接続)
ここで、USBasp-BのRESETはArduinoの10番pinに接続する。
ちなみに、この記事の一番上の写真は間違った接続をしていて、正解はこんな感じ。


ArduinoのICSPコネクタ5番pinはRESET(Arduinoの1番pin)に繋がっているため、USBasp-B側のRESETが(Auto Reset無効化の影響で)うまく効かず、

avrdude: stk500_recv(): programmer is not responding

を吐く原因となります。

4. 書き込み
USBaspのウェブサイトから最新版のファームウェアをダウンロード、展開し、ターミナルから下記コマンドで書き込み。

avrdude -P/dev/tty.usbmodemfd121 -b 19200 -c avrisp -p m8 -U flash:w:usbasp.atmega8.2011-05-28.hex:i

「/dev/tty.usbmodemfd121」は各自の環境に合わせて変更してください。
「usbasp.atmega8.2011-05-28.hex」も最新バージョンが出たらそれに合わせて適宜。

うまく書き込めたら下記の様な結果が返ってくると思います。
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.06s

avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "usbasp.atmega8.2011-05-28.hex"
avrdude: writing flash (4700 bytes):

Writing | ################################################## | 100% 5.73s

avrdude: 4700 bytes of flash written
avrdude: verifying flash memory against usbasp.atmega8.2011-05-28.hex:
avrdude: load data flash data from input file usbasp.atmega8.2011-05-28.hex:
avrdude: input file usbasp.atmega8.2011-05-28.hex contains 4700 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 5.41s

avrdude: verifying ...
avrdude: 4700 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

最後にヒューズビット(hfuse)を書き換える。

avrdude -P/dev/tty.usbmodemfd121 -b 19200 -c avrisp -p m8  -U hfuse:w:0xC9:m

これも、うまくいけば下記の様な結果が返ってくる。
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.07s

avrdude: Device signature = 0x1e9307
avrdude: reading input file "0xC9"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.07s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xC9:
avrdude: load data hfuse data from input file 0xC9:
avrdude: input file 0xC9 contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

以上でバージョンアップ終わり。

Auto Resetの影響を受ける可能性を思いつくまで30分、ICSPの5番pinがRESETに接続されているのを思い出すまで30分...
0x14歳にして脳が衰退し始めていることを思い知らされた1時間でしたorz

2013年2月11日

iPodをArduinoでコントロール

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

コントロールと言っても音楽やメディア(YouTube、ストリーミング等)の再生停止、送り戻し、音量の調節くらいですが、今更ながらDockコネクタ経由でやってみたり。
#時代はLightningとか言わない
一応、iOSデバイス(iPhone/iPad)も制御できますが、あくまでもメディア(音楽・動画)のコントロールのみなのでタイトルを「iPod」としました。

使用したのはArduino Pro mini 3.3V、スイッチ、抵抗(1kΩ*3、1MΩ*1)、Dockコネクタのbreakoutボードの4つ。
5V系を使う場合はTXからの出力を抵抗分圧等で3.3VにレベルシフトしてあげればOK。
(ただし、Arduinoへの電源供給は別途しなければならない)


とりあえず、再生停止、曲送り、曲戻しの3ボタンを用意。
Dockコネクタとの接続はこちら(http://pinouts.ru/CellularPhones-A-N/iPhone_connector_pinout.shtml)を参考に、ArduinoのTXをDockコネクタの13ピン、VCCを18ピン、GNDを11ピンに。
Dockコネクタの21ピン(Accessory Indicator)は1MΩ経由でGNDに接続しました。(500kΩでも問題なし)

iPod(iPhone/iPad含む)のシリアル通信に関しては既に調べ尽くされているので、その情報を参考にしました。
https://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2007/awr8_asl45/awr8_asl45/index.html
http://web.student.tuwien.ac.at/~e0026607/ipod_remote/ipod_ap.html

シリアル通信には複数のモードがあり、最も簡単な制御モード(iPodへの一方行通信)がmode2、曲名やアルバム名なども取得できる制御モード(iPodとの双方向通信)がmode4となっている模様。
接続直後はmode0となっているので、そこにmode2への切り替えコードを叩いてあげるとmode2の制御コマンドを受け付けるようになってくれます。
と言うわけで、プログラムは上記ページを参考にしながら以下の様な感じで。
#include <Bounce.h>

#define BUTTON1_PIN 3
#define BUTTON2_PIN 4
#define BUTTON3_PIN 5

boolean state[3];

Bounce button1 = Bounce( BUTTON1_PIN,20 );
Bounce button2 = Bounce( BUTTON2_PIN,20 );
Bounce button3 = Bounce( BUTTON3_PIN,20 );

byte mode2[] =      {
  0xFF, 0x55, 0x03, 0x00, 0x01, 0x02, 0xFA};
byte playStop[] =   {
  0xFF, 0x55, 0x03, 0x02, 0x00, 0x01, 0xFA};
byte prevTrack[] =   {
  0xFF, 0x55, 0x03, 0x02, 0x00, 0x10, 0xEB};
byte nextTrack[] =   {
  0xFF, 0x55, 0x03, 0x02, 0x00, 0x08, 0xF3};
byte buttonReleased[] = {
  0xFF, 0x55, 0x03, 0x02, 0x00, 0x00, 0xFB};

void setup() {
  pinMode(BUTTON1_PIN, INPUT);
  pinMode(BUTTON2_PIN, INPUT);
  pinMode(BUTTON3_PIN, INPUT);
  Serial.begin(19200);
  for (int i = 0; i < 7; i++) {
    Serial.write(mode2[i]);
  }
}

void loop() {
  button1.update();
  if ((button1.read() == HIGH)&&(state[0] == 0)) {
    for (int i = 0; i < 7; i++) {
      Serial.write(playStop[i]);
    }
    state[0] = 1;
  }
  if ((button1.read() == LOW)&&(state[0] == 1)) {
    for (int i = 0; i < 7; i++) {
      Serial.write(buttonReleased[i]);
    }
    state[0] = 0;
  }
  button2.update();
  if ((button2.read() == HIGH)&&(state[1] == 0)) {
    for (int i = 0; i < 7; i++) {
      Serial.write(prevTrack[i]);
    }
    state[1] = 1;
  }
  if ((button2.read() == LOW)&&(state[1] == 1)) {
    for (int i = 0; i < 7; i++) {
      Serial.write(buttonReleased[i]);
    }
    state[1] = 0;
  }
  button3.update();
  if ((button3.read() == HIGH)&&(state[2] == 0)) {
    for (int i = 0; i < 7; i++) {
      Serial.write(nextTrack[i]);
    }
    state[2] = 1;
  }
  if ((button3.read() == LOW)&&(state[2] == 1)) {
    for (int i = 0; i < 7; i++) {
      Serial.write(buttonReleased[i]);
    }
    state[2] = 0;
  }
}
Bounceライブラリを使うとなんか冗長的な感じになってしまうのがアレですが、とりあえず仕組みは理解できたので今回はこれで良しとします。

これで何を作りたいのかと言うと、iOSデバイス上での音楽再生を停止させるスリープタイマーの外部インターフェース版。
普通はiOSデバイス単体でスリープタイマーを設定出来るようになっていますが、そういう設定が面倒くさい人(父)の為に、ボタンを「物理的に」何回か押せば簡単にタイマーが設定出来る装置を作ろうかと。

色々と資料を見ているとmode4も面白そうなので、次はmode4で取得した情報をLCDに表示させたりしてみようと思っているところ。

2013年1月24日

Arduino DUEが届いた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

供給が追いつかず、どこも品切れ状態が続いているArduino DUE、やっと購入でき、本日届きました。
右の写真は、奥から順にArduino UNO、Arduino MEGA 2560、Arduino DUEの3兄弟(?)

DUEを購入するついでにWireless Proto Shieldも購入。


新しいShieldは、パターンを追ってみるとICSP、VCC&GNDピンの両方から電源を引いてる様なので変な3段重ねをしなくてもよさそう。