電子工作 ブログトップ
前の10件 | -

AVRマイコンを使って time-lapse(微速度撮影)動画を作る(2) [電子工作]

前回の続きです。

連続100ショットで撮影が中断されるのは相変わらず。
シャッター間隔を3秒にしても改善しませんでした。
暫定策として、100ショットに近づいた時に beep 音を鳴らすことにしました。
100ショット取りきったら、デジカメの電源を手作業で off / on 。
これで、ほぼ切れ目無く動画を取り続けることができます。
根本解決にはもう少し調査が必要です...。

全体図
(100均のボックスに収納。電源スイッチを付けました)
RIMG2181.JPG

回路図
TimeLapse_v2.gif

ソースファイル
(beep音は一定間隔でPB0をHIGH/LOWするだけの単純なもの、直接圧電スピーカーをドライブしています)



AVRマイコンを使って time-lapse(微速度撮影)動画を作成 [電子工作]

036.jpg
Time lapse movieとは、いわゆる微速度撮影された動画です。
一般的な動画は一秒20~30コマ前後で撮影されますが、一秒1コマ等間隔を遅くして撮影し通常速度で再生することで、面白い効果を得ることが出来ます。
一眼デジカメとAVRマイコンを使ってDIYで Time-lapse movieの撮影に挑戦します。

1. リモコンの改造

長年愛用しているNikonのD80を使って撮影を行います。
D80は赤外線および有線のリモコンが使えるので、今回は有線リモコンを改造します。
といっても純正は高いの、Amazonで「NIKON D70S.D80 用MC-DC1互換リモコン」を購入して改造することにします。
RIMG2149.JPG
ドライバーで分解してみると、中は金属のバーが3枚入っていて、スイッチを押すとそれらのバーが接触することで、シャッター半押し(オートフォーカス)と全押し(シャッターを切る)ことが出来ます。

RIMG2150.JPG
テスターで図ってみると、赤と白、黄色と白の電位差が4.6Vありました。どうやら白がコモン・グラウンドのようです。
ケーブルを途中でカットして、赤&黄色と白を直接接触すると、シャッターが切れます。

2. マイコンによる操作
フォトカプラ経由で、上記を自動制御します。
555等のタイマーICももちろん使用可能ですが、汎用性を考えてマイコンを使います。
Arduinoで動作確認を行った後に、最終的に使用したのは8ピンの ATMEL ATTiny13 です。
書き込みには前回(過去記事へのリンク)使用した AVRISPMarkII を使います。
ATTiny2313とほぼピン配列が同じなので、前回ブレッドボードで組んだ書き込み用の回路がそのまま使用できます。

1秒間隔でエミッタ-コレクタ間が導通する簡単なプログラムを書きました。
なお、コンパイルには AVR Studio 5 を使ってみました。WinAVRをインストールしなくてもそのまま使えるので便利です。
ソースコード


3. 回路の作成
操作部を切り離したケーブルを、ユニバーサル基板上に組んだ回路に接続します。
電源は単三乾電池×3個です。
バッテリーホルダーと基板はホットボンドで固定しています。
基板はあらかじめカットしてから回路を組みましたが、ちょうど良い大きさに収まりました。
回路2.jpg

回路図
TimeLapse.gif
部品一覧
No 製品 個数
1 ATMEL AVR ATTiny13 1
2 TLP521フォトカプラ 1
3 10KΩ 1/4Wカーボン抵抗 1
4 220Ω 1/4Wカーボン抵抗 1
5 150Ω 1/4Wカーボン抵抗 2
6 3mm LED (緑) 1
7 0.1μF 積層セラミックコンデンサー 1

回路図中の75Ωの抵抗は手持ちが無かったので150Ω×2で代用しています。

4. 撮影

カメラを三脚で固定した後、リモコン用の端子に今回改造した回路を接続します。

電源を入れて数秒すると見事!シャッターが約1秒間隔で切られてゆきます。
しばらく待ってから電源を落とすと、100枚前後のJPEGが保存されています。


5. ムービー変換

JPEGから動画への変換は ffmpeg で簡単に出来ます。
私はJPEGをPCに転送後に転送後、下記コマンドで MP4 に変換しました。

ffmpeg -s 640x360 -r 20 -b 5000 -sameq -i C:\Users\XXXX\Pictures\timelapse\movie1\%03d.JPG sample.mp4

注意点として、ffmpeg はファイル名が 1 から開始する連番であることを前提にしています。
デジカメのファイル名は普通連番になっていますが、1から開始していない場合はファイル名をリネームをする必要があります。
私はJPEGファイル名をコマンド・プロンプトからDIR /B コマンドでファイル名リストを取得して、表計算ソフトにコピー後に右の列にリネーム後のファイル名を表計算ソフトの機能で連番で作成して、バッチファイルとして保存の後実行して、ファイル名の連番を振りなおしました。

表計算ソフトの例
キャプチャ.GIF

完成したムービー




6. TODO

自動撮影を続けると100枚程度で、撮影が停止してしまいました。デジカメ側の液晶を見ると定間隔で反応が出ているので、おそらくデジカメ側のバッファーメモリがいっぱいになってしまったのでしょう。撮影間隔を2秒等に増やすことで改善できるかもしれません。
また電源や撮影の off/on スイッチは付けたいと思います。
回路を収める良いボックスが見つかったら検討することにします。



Arduino 0022 [電子工作]

logo_blog_arduino.png
昨年のクリスマスイブに出たようですが、まだ試していません。
SD Card Library は環境が無いので今のところ興味はありませんが、地味ながら String.toInt() の追加など、少し嬉しいです。
ライブラリ関係で苦労したので "Building the user sketch before the core or libraries," も良いかもしれません。

http://arduino.cc/en/Main/Software
http://arduino.cc/en/Main/ReleaseNotes

タグ:Arduino

赤外線温度センサーMLX90614とArduinoを接続する [電子工作]

RIMG1904.JPG
Strawberry Linuxで赤外線温度センサーMLX90614を購入しました。
こいつとArduinoと接続してみます。

製品の特徴
MLX90614は放射温度センサーです。外気温ではなく、物体から放射される赤外線により温度を測定します。(サーモグラフィも同じ原理)
購入したのはMLX90614BAAというモデルでデータシートによれば次のような特徴があります。

商品ページより
■MLX90614は非接触で温度を観測できる赤外線温度センサです。
■しかも内部に17ビットのADコンバータを内蔵しているため、アナログ回路を必要とせず高精度・高分解能で計測できます。
■インターフェースはPWMとSMBus(≒I2C)が選べます。SBBusの場合最小分解能は0.02℃です。
■3V品

◆仕様
 ・Factory calibrated in wide temperature range:
-40 to +85°C for sensor temperature
-70 to +380°C for object temperature

データシートにSupply Voltage(VDD)は2.6V~3.6Vとあるので、Arduinoの3.3Vの出力を利用してドライブすることが出来ます。
インターフェースはSMBus(i2Cとほぼ同じ規格)を使用します。

レベルシフトについて

i2Cはクロックはマスターから供給しますが、データは一本の信号線を使い双方向でやり取りを行うので、電圧レベルの異なる場合でも確実にお互いのHIGH-LOWの変化を認識する必要があります。このような場合の回路については、エレキジャックのブログでレベル変換用のICを使うやり方が紹介されています。
私は今回gomisaiさんのブログにあった、バイポーラトランジスタを使用するレベルシフト回路を試して見ました。
詳しくはこちらを見て頂きたいのですが、50KHz 程度であれば私の環境では問題無く動作しました。

SMBusをArdionoで使用する

MLX90614とArduinoの接続については、本家のPlaygroundで紹介されているMartin Nawrathさんのソースで動作を確認しました。
本家のフォーラムのこの記事に書かれている通り、SMBusはi2Cとほぼ互換にも関わらずMLX90614は標準のWireライブラリでは動作しないようです。
記事にロジアナでの調査結果が載っていますが、要約するとマスターからSENDコマンドに続いてSTOP bit → START bitが発行されているため、Repeated Start Condition待ちのセンサーはエラーと見なして正しく値を返さないようです。
エレキジャックNo.8&No.9を読む限り、センサー側の仕様はi2Cの規格に沿っているようにしか思えないのですが、結果はNGのようです。
そのためMartinさんの例にならい AVR汎用の外部ライブラリ i2cmaster.h を使用することにします。

インストールの手順は下記の通りです。
  1. AVR-GCC Source Examplesのページにアクセス
  2. AVR-GCC librariesのi2cmaster.zipをダウンロード
  3. Arduinoの導入フォルダ\ibrariesの下にi2cmasterというフォルダを作成
  4. ZIPファイルより、i2cmaster.hとtwimaster.cを上記フォルダにコピーする
  5. twimaster.cをtwimaster.cppにリネーム
  6. twimaster.cppの17行目と21行目をそれぞれの環境に合わせて変更
    15  + /* define CPU frequency in Mhz here if not defined in Makefile */
    16  + #ifndef F_CPU
    17  + #define F_CPU 4000000UL
    18  + #endif
    19  + 
    20  + /* I2C clock in Hz */
    21  + #define SCL_CLOCK  100000L
    22  + 
    


私のArduinoは16MHz稼働なので、F_CPUは 16000000UL (unsigned long で16M)に、SCL_CLOCKは安全をみて50000L (50KHz)にしました。

完成

回路図はこちらになります。R1及びR2は間違いです。ゼロΩと読替えて下さい。(いずれ差替えします)
MXL90614_test1.gif

部品一覧
No 製品 個数 記号
1 1KΩ 1/4W 炭素皮膜抵抗 4 R3,R4.R5.R6
2 330Ω 1/4W 炭素皮膜抵抗 2 R7,R8
3 2SC1815 NPNバイポーラトランジスター 2 Q1,Q2
4 0.1μF 積層セラミックコンデンサー 1 C1
5 その他(ユニバーサル基板,ソケット等)必要に応じて準備    

手持ちの部品で間に合わせた関係で若干gomisaiさんの記事と係数が異なりますが、いまのところ問題無いようです。


また、画面表示用に簡単なProcessingスケッチを作成して、リアルタイムでセンサーの検知した温度を表示させるようにしてみました。
WS000028.JPG
データシートによるとセンサーの有効範囲は約60度ということなので、マグカップ程度の大きさのものを測定する場合は10cm程度に近づけないと、正しい値が測定出来ません。
今後はもう少しピンポイントでの計測を出来るようにするのが課題です。(電子工作というより工作向けの課題ですが)





タグ:Arduino mlx90614 I2C

Arduino 0021 [電子工作]

logo_blog_arduino.png
更新はやいですね。
本家ダウンロードページ
0021はLinuxへの対応+UnoでのAnalogWrite()のバグ対応がメインのようです。
スイッチサイエンスでもUnoが購入できるようになりましたが、他の店も含めて、常に 価格が3,200 なのはなぜなんでしょうか....。
タグ:Arduino

Arduino 0020 [電子工作]

もう 0020 が出ました。
当然ながら Uno と Mega 2560のサポートが中心のようです。
現行機種使いにとっても、optibootのおかげで1.5KB程度がスケッチのために開放されたのがうれしいニュースです。
まずWinとMac版がリリースされました。Linuxも間もなく!

本家リリースノート
タグ:Arduino

Arduino Uno & New Mega(動画) [電子工作]

紹介ムービーがあったのので載せておきます。


ATMega328Pベースのようですね。やはり目玉はUSB周りでしょうか。

タグ:Arduino uno

新しいArduino、その名は "Uno" [電子工作]

Arduino_uno.JPG
本家BLOGに新しいArduinoの記事がポストされていました。
その名は、、、、、、"Arduino Uno"。

ロゴは新デザインとなり、USBも古いFTDIチップセットからAtmel ATmega8U2ベースになり、上級ユーザー向けにカスタマイズも可能となった模様です。
またMegaシリーズにも新製品が投入されるようです。(Arduino Mega2560)
詳しいことはこれからまた明らかになるでしょう。個人的には価格を下げてもらえると、いっそうありがたいなぁ。

<リンク>
http://arduino.cc/blog/2010/09/24/dinner-is-ready/
タグ:Arduino uno

Arduino 0019 リリースノート [電子工作]

Arduino 0019 が出ました。
週末に楽しみが増えちゃいましたね。そろそろと言っている 1.0 はいつ出るのでしょうか。
以下リリースノートの抄訳です。
http://arduino.cc/en/Main/ReleaseNotes

  • コア機能/ライブラリ
    • イーサネットライブラリの改良(新しいSPIライブラリを使用のため、既存のコードは先頭に #include を追加する必要があります。
    • アナログインプットピンへのエイリアス(A0、A1、etc)が追加されました。
    • Stringクラスが追加されました。
    • shiftIn()関数が追加されました。
    • Firmataが新しくMegaとPIN情報の取得をサポートしました。
    • delay()がより正確になりました。
    • tone()終了後に(同じアナログPINで)PWMが使用可能になりました。
    • Serial.peek() メソッドが追加されました。
    • SerialオブジェクトにStreamをベースにしたクラスが追加されました。 (available()、write()、print()、println()などをPrintクラスから実行可能になります)
    • digitalWrite()やpinMode()中の割り込みが無効になります。
    • Arduino MegaでINTERNALのアナログリファレンスがINTERNAL1V1とINTERNAL2V56に変更されました。
  • 環境
    • Boardメニューに Arduino Fio が追加されました。
    • BoardメニューにArduino Pro と Pro Mini (5V / 16 MHz)が追加されました。
    • Processing 1.1 とコードの同期が行われ、多くの変更が取り込まれました。
    • avr-gcc と avr-g++ からの、エラーなどのメッセージの変換が修正されました。
    • FTDI接続のLinuxで自動リセットのため、アップロード時にRTSをセットするようにしました。
    • シリアルモニターでスクロールの制御が出来るようになりました。
    • シリアルモニターで終端文字の選択が出来るようになりました。
    • タブ表示で拡張子以外が同じファイルの表示に関する不具合が解消されました。
    • サードパーティー製の機器がプログラマーとして選択出来るようになりました。
  • サンプル
    • 参照を容易にするため整理と番号付けが行われました。


タグ:Arduino

Arduinoで秋月の気圧センサーを使う(4) : 7セグメントLED(アノードコモン)の表示 [電子工作]

scp1000 schematic前回でPCへのデータ取り込みが出来るようになったので、ハード側でのデータ表示方法を再度検討します。
LCDでの表示は既に行っていますが、やはり視認性は7セグメントLEDの方が良いと思います。
そこで今回はArduinoに7セグメントLEDを接続して現在の気圧を表示させて見ます。
手元には2桁表示のアノードコモン7セグメントディスプレイが2つあったので、それを利用します。

(1) 回路について
部品の構成は下図の通りです。
7SEGS_ANODE_COM.JPG
図の通り、DIGIT1/2の各桁を独立して操作することが可能ですが、Arduinoに直結する場合は(8+1)x4の36ポートが必要となり、ArduinoMegaでも無いと実装不可能なので、A~G(今回はDPは省略)をそれぞれまとめてシフトレジスタと接続し、アノードを高速でスイッチングさせる、ダイナミック点灯で表示させることで、ポートを節約します。

アノードに直接Arduinoのデジタルポートを接続しても電流不足になる可能性があるので、トランジスタ経由で各桁をドライブしています。
アノードコモンなので、PNPトランジスタ2SA1015を各桁用に4個使います。トランジスタのベースに抵抗(作例では1KΩ)を介して接続したArduinoのデジタルポートがLOWとなると、トランジスタがONとなり、コレクタ側に電流が流れます。
ベース-エミッタ間に10KΩの抵抗を入れていますが、省略しても今回の製作では問題は出ないと思います。

シフトレジスタは安価な74HC164×1を使用します。ArduinoからはDATAとCLOCKの2線だけで最大8線のOFF/ONを制御出来ます。
74HC164は出力ラッチが無いので、データセットの際にチラツキが発生しますが、7セグの表示程度れあれば、気になるレベルではないので問題ありません。

(2) ダイナミック点灯

人間の目にチラツキが見えないためには、一秒間に30回以上画面を切り替える必要があります。
4桁の7セグを使う場合は、単純計算で 30×4 で一秒間に 120 回以上の切替が必要です。
ミリセカンドにすると約8msecで、余裕を見て 4msec 程度の間隔で各セグメントを切替をすればよい計算となります。
ただし、タイミングを取るためにdelay()を使ってしまうと、他の処理と並列に処理をするのが難しくなるため、loop()の回数をカウントして切り替えています。
4 msec は Hz にすると 250 Hz となります。 ATMega168 が 16MHz なので、loop の中でのマシン語レベルの命令が 1 ステップの場合には、16,000,000 / 250 でloopが64,000回実行されたら、切替を行えば良い計算となります。
loopの回数をカウンタで数えて、閾値を超えた場合に切替を行います。
ただし実際の閾値はloopの中の命令数によって、大きく変わりますので、テストを繰り返して最適な値を設定する必要があります。

(3) スケッチについて

Arduinoのスケッチでは、次の処理をおこないます。
(1) 7セグの1桁分の表示パターンをシフトレジスタに送る。シフトレジスタはカソード側に接続されているので、LOWにしたビットに対応するセグメントが点灯。
(2) 1桁分の7セグLEDを点灯させるために、その桁用のPNPトランジスタのベースをLOWにする。
(3) (1)-(2)を指定のタイミングで各桁毎に順次行う。
shiftOut()というシフトレジスタを制御する便利な命令がArduinoで用意されているので使うことにします。
サンプルスケッチの場合、loop() が300回程度で切替を行わないと、目に見えてチラツキが残る表示となりました。

(4) その他の機能

上記以外に今回紹介するソースは機能がいくつか追加されています。細かい説明は省略しますが、ソースを追えばそれほど難しいことはやっていないので、理解出来ると思います。
  • Metroライブラリを使用したタイマー処理
    • 4秒毎にLEDの表示を切替(気温⇔気圧)
    • 2分毎に気温・気圧を測定
    • 30分毎に測定したデータを Serial に送信
  • 30分毎の測定データ(気圧のみ)をEEPROMに保存
  • setup()実行時にEEPROM内の測定データを一括でSerialに送信

<回路図>
7SEGTEST.jpg
R9~R14は330Ωとしました。 また図中で書き忘れましたが、74HC164のQA~QHと7セグも抵抗(330Ω)を介して接続されています。 よく考えたら74HC164×4個あれば、ダイナミック点灯は不要でしたね。


<ソースファイル>

<関連リンク>


前の10件 | - 電子工作 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。