趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。※サイト移転しました(tomono.eleho.net ⇒ tomono.tokyo)
RSS icon
  • 照度計を基板にまとめてみました

    投稿日 2011年 5月 30日 コメントはありません

    しばらく前のS9706を使った照度センサを基板にまとめてみました。

    結局、ケースは作らず、裸の基板のままで裏面にナット2段を挟んでもう1枚基板をつけて背面だけ保護することにしました。

    センサは先の記事に加えて、S9705カラーセンサ(クロック同期シリアル出力)、手持ちのPH102フォトトランジスタを抵抗負荷で受けてA/D変換した物を追加して表示しています。

    LCDは2行の小型のものに変更しています。1行目の左半分にS9706で取得した照度(lx)とその棒グラフ、1行目の右半分にPH102で取得した照度(lx)とその棒グラフ、2行めの1キャラクタ目に電池の電圧、その後にS9705で取得したRGBのそれぞれの照度(lx)を表示しています。電源は単4電池2本からHT7750Aで5Vを生成しています。

    CPUは当初ATmega88としていたのですが、センサの数が増えるに従ってROM容量が収まらなくなり、ATmega168に変更しました。ソフトウェアはタイマ割り込みを使いたかったのでArduinoではなくAVR-GCCで作りました。表示にはChaNさんのキャラクタLCD制御モジュールを4bitモード時に下位側のポートを使うように改造して使わせていただきました。

    作ってみてわかったのですが、理論値からはオーダーレベルでは合うものの、表示がバラバラになってしまいます。分光感度特性も異なる3種類のセンサなので、ある程度は当たり前のような気もしますが、これでは目安程度にしかなりません。やはり基準となる測定器がないとつらいですね。


  • 照度計として動かしてみる

    投稿日 2011年 5月 17日 コメントはありません

    引き続き、秋月で売っている浜松ホトニクスのS9705という照度センサを使った照度計の製作です。

    HT7750Aの負荷を下げるべく、省電力関係を調べて実装しました。

    基本的には、Timer2でパワーセーブモードからの復帰が可能なので、Timer2の割込みで周期的に起こすことにして、通常はパワーセーブモード(スリープモード)に落としておくことにしました。これで5Vの消費電流は約15~16mAまで下がりました。本当はATmega88ではなくてATmega88Pを使えばいいのでしょうが、それでは手持ちの部品が減らないのでここまでにします。

    また、Timer0とTimer1を使って、センサ出力の周波数をカウントする仕掛けを作りました。

    で、適当にソフトウェアを作って動かしてみたのが上の写真です。左の数字が照度(ただし、この表示は飽和してます)、右がそのバーグラフです。

    ソフトウェアを作るためにデータシートをあらためて眺めていて気がついたのですが、このセンサは1000lx程度までしか測定できません。で、この写真を取るために照明をあてたら飽和してしまいました。もともとはこの写真撮影用の光源に使っているクリップライトのランプを電球型蛍光灯からLEDランプに変えたら結構明るかったので、どのくらい差があるのか調べてみたかった、ということが発端で照度計を作り始めたので、ちょっとがっかりです。

    そんな状態なので、単独の基板にするか、さらに、ケースに入れるかどうか迷ってます。ケースに入れるとなると、今回は光センサがありますので、透明なケースを使うとしても外に出してやらなければなりません。また、スイッチもどうやって外に出すかが課題です。ケースの加工って面倒くさいですからね。できれば、小型ボール盤、卓上フライス、卓上旋盤とそれを設置する場所が欲しいところです。(場所が一番課題ですね・・・)


  • ATmega88でLCDを動かす

    投稿日 2011年 5月 16日 コメントはありません

    秋月で売っている浜松ホトニクスのS9705という照度センサを使って、LED電球の明るさを測ってみたいと思っています。

    このセンサは照度を周波数にリニアに変換して出力しますので、受け側では単純に周波数を測定して定数をかけてやれば照度計のできあがりです。

    Arduinoでは周波数の測定はちょっと面倒そうなので、今回は手持ちのATmega88をそのまま使うことにしました。表示系はLCDを使いますが、照度しか表示しないので1行のLCDを使います。また、基本的には持ち歩いて使うことになりますので、電池駆動でなければなりません。電池は9Vではなく、単3/単4を1本にしたいと思いましたので、HT7750Aによる昇圧回路を組んであります。で、実験してみたところ、1本では昇圧してLCDを駆動できる5Vで20~30mAの電流を流すのは難しいようでしたので2本を前提にしています。

    で、バラックでLCDのテストをするところまで組んでみたところ、こんな感じになりました。

    LCDの表示にはChanさんが公開されているキャラクタLCD制御モジュールおよび組み込み用printfモジュールを使わせてもらうことにしました。この状態ですと、5Vの消費電流は内蔵8MHzオシレータ使用時で25mA程度でした。


  • USB加速度計(KXM52版)

    投稿日 2011年 5月 4日 コメントはありません

    結局、KXP84は突然のノイズ(?)が入って使い物にならなかったので、KXM52-1050で改めてUSB接続のArduinoベースの加速度計を作りました。

    今回はLCDがないのでより小さな基板とケースに入れています。ATMEGA328Pと加速度センサの電源はUSBシリアル変換モジュールからの3.3V出力を使っています。

    写真に写っている一部の抵抗を除いて抵抗・コンデンサ・LEDはチップ部品を使って実装しています。ケースは100円ショップで売っていたポリプロピレンのカードケースを加工して納めました。

    ・・・が、このケースを固定する場所がなかったりします。どうしようかな・・。


  • KXP84+SCP1000

    投稿日 2011年 5月 3日 コメントはありません

    KXP84-2050は一応動くようになったのですが、稀におかしなデータを吐くので困っています。

    連続でXYZの各データを読みつづけると、静止状態にも関わらず突然X方向に大きくずれた値を出力します。しかもYZは何事もなかったかの様に動作しつづけますし、その後X方向も元の値に戻ってしまいます。SPIでのデータ転送時のビット抜けかとも思いましたが、YZには影響がなかったり、ビット抜けパターンには合致しなかったりするので、ビット抜けではないようです。パスコンは写真の通り秋月モジュールなので0.1uFと4.7uFのセラミックコンデンサ(目視ではわかりませんけど)がついていますので、そうそう問題ではないはずです。

    時々誤動作する加速度センサでは困りますので、KXM52-1050の方に切り替えようかと思っています。

    一方、SCP1000の方ですが、こちらは上手くいっています。

    5/1の深夜から5/2の午前中にかけての室内の温度変化です。窓を少し開けて寝ましたので、明け方に温度が下がっているのがわかります。

    同様に気圧の変化です。約2サンプル/秒のものを強引にgnuplotでグラフ化しましたが、適切にサンプリングするようにすれば面白そうです。


  • SCP1000とKXP84を同時に動かす

    投稿日 2011年 5月 2日 コメントはありません

    タイトルの通りです。

    CSを別々にして両方のデバイスをSPIにぶら下げただけです。

    ただ、加速度計の方は周期的にデータを取りたいので一捻りしています。Arduinoで無理やりタイマ割り込みを設定し、割り込み処理ルーチン内でSPIにアクセスにいった上に浮動小数点演算までやるという無茶なことをしています。当然、SCP1000のSPIアクセスや非割り込み処理部分での浮動小数点演算と干渉しますので、SCP1000にアクセスに行くときや浮動小数点演算を行う箇所では割り込みを禁止しています。

    以下に主要部分を記載します。

    反則技だと思いますが、やっぱり割り込みは使いたいですからね。
    そうそう、干渉しそうな場所は cli()で割り込みを禁止し、必要がなくなったら sei()で割り込みを許可してやる必要があります。


  • A/D内蔵KXP84-2050を試す

    投稿日 2011年 5月 1日 コメントはありません

    SCP1000のExampleをベースにSPIの動作確認ができたところで、A/D内蔵の加速度センサKXP84-2050を接続してみました。KXP84-2050は3.3V動作ですので、接続するArduinoも3.3Vタイプでなければなりません。3.3Vタイプは液晶モジュールとの共存が難しいので頭が痛いところですが・・・。

    それはさておき、Arduinoとの端子接続は以下の通りです。

    • モジュールの1ピン(VDD):ArduinoのVcc(3.3V)
    • モジュールの2ピン(GND):ArduinoのGND
    • モジュールの3ピン(MOT):オープン
    • モジュールの4ピン(FF):オープン
    • モジュールの5ピン(SCL/SCLK):Arduinoの13ピン
    • モジュールの6ピン(IO_VDD):ArduinoのVcc(3.3V)
    • モジュールの7ピン(SDA/SDO):Arduinoの12ピン
    • モジュールの8ピン(RESET):ArduinoのRESET
    • モジュールの9ピン(ADDR0/SDI):Arduinoの11ピン
    • モジュールの10ピン(CS):Arduinoの7ピン

    で、SCP1000のExampleをベースにスケッチを作成したところ、あっさり動作しました。

    参考になるかわかりませんがアップロードしておきます。→KXP84_2050.zip


  • 気圧センサSCP1000を試す

    投稿日 2011年 4月 30日 コメントはありません

    秋月で売っている気圧センサモジュールのSCP1000モジュールを試してみました。

    センサ単体では扱いにくいのですが、モジュールでは8pinDIPにまとめられています。これを3.3V版のArduinoにつないでみました。

    Arduino 0022 にはExampleの「SPI」のグループの中に「BarometricPressureSensor」としてSCP1000を制御するサンプルが含まれています。そのソースの始めの方にSCP1000の端子との接続方法が記載されていますので、その通りにつなぎます。ただし、ここに記載されているのはSCP1000のピン番号ですから、モジュールと接続するときは注意が必要です。モジュールの各端子と、Arduinoの接続方法は以下の通りです。

    1. TRIG信号。無接続。
    2. DRDY信号。ArduinoのDigital Pin 6に接続する。
    3. SCK信号。ArduinoのDigital Pin 13に接続する。
    4. GND。
    5. MOSI信号。ArduinoのDigital Pin 11に接続する。
    6. MISO信号。ArduinoのDigital Pin 12に接続する。
    7. CSB信号。ArduinoのDigital Pin 7に接続する。
    8. VCC。ArduinoのVCCに接続する。このセンサは3.3Vまでしか印加できないので、要注意!

    これで、サンプル「BarometricPressureSensor」をコンパイル・ダウンロードし、シリアルモニタでモニタすれば表示されるはずですが・・・・このサンプルはバグがあります。

    自分が修正した箇所(loop()の中です)を示します。

    //combine the two parts into one 19-bit number:
    long pressure = (((long)pressure_data_high << 16) | pressure_data_low)/4;
    float hPa = (float)pressure/100.0;

    // display the temperature:
    Serial.print(“\tPressure [hPa]=”);
    Serial.println(hPa);

    サンプルでは上記の箇所の2行目で(long)のキャストが抜けているために、正しく表示してくれません。ここを修正すれば、パスカル(Pa)単位で値が表示されます。(他に、SPIのレジスタアクセス部分にデバッグ用の表示があるので、それをコメントアウトしないと表示が鬱陶しいです)
    さらに自分はヘクトパスカルで表示したかったので、計算後にfloatの変数を定義して値を100で割って、それを表示するように変更しています。

    天気の変化に合わせて気圧が変化するのが目に見えるようになるのは面白いです。


  • 脈拍検出をPSoCで再現

    投稿日 2011年 4月 26日 2個のコメント

    一昨日のOPAMP(LMC662A)による回路をそのままPSoCで再現してみました。

    使用デバイスはまず制約の少ない条件で楽にインプリメントしたかったので、CY8C29466-24PXIを使っています。センサはGP2S05のままです。

    PSoCらしくローパスフィルタ/ハイパスフィルタ部分もPSoC内に入れたかったのですが、周波数が低すぎて単純に実装するのではうまく取りこめないようです。そのため、CRのフィルタはそのままにしてあります。そして、最後のゲインを稼ぐ部分のみ48倍設定としてあります。

    増幅した後の信号を端子に出力して、その波形を観測してみました。

    動作としては検出はできています。ただ、フォトリフレクタへの指の当て方でだいぶ変わってしまいます。また、インバータ式蛍光灯や外部ノイズに弱いようで、なんらかの対策は必要な感じです。


  • 脈拍検出のテスト

    投稿日 2011年 4月 24日 コメントはありません

    以前書いたようにPSoCで脈拍検出にトライしてみたいと思い、まずこちらの「電気電子工作の部屋」さんの「電池ボックス電子工作(その15)」を参考(っつーかそのままに)に、まずはOPAMPを使ってブレッドボードで組み立ててみました。ただし、検出可否を見てみるのが狙いなので、音を発生する回路は追加していません。

    回路は「電池ボックス電子工作(その15)」そのままです。OPAMPは手持ちのものから単電源動作可能である程度動作電圧範囲の広いLMC662Aを使いました。センサとなるフォトリフレクタには秋月電子で遥か昔に購入したものを使いました。

    動作確認結果は・・・なかなか厳しいですね。センサへの指のあて具合でかなり変わります。

    次にセンサを秋月でちょっと前に売っていたGP2S05に変えてみましたが、そのままではまったく動作しません。フォトトランジスタ側の負荷抵抗を22kΩから100kΩに変更すると容易に検出するようになりました。もとのセンサでも負荷抵抗を変えればもっと容易に検出できたのかもしれません。

    それでも、指を動かしたりすると、表示が乱れます。

    基本的にはセンサの出力をローパスフィルタ/ハイパスフィルタを通して受けた後、1000倍に増幅してトランジスタを駆動しています。鼓動の周波数成分は0.5Hz(30bpm)~4Hz(240bpm)といったところでしょうから、これを指を動かしたりしたら誤検出するのはしかたないところです。