迷走の果て・Tiny Objects

迷走する日々の覚え書きです。自分で分かってることは省略してますので、念のため。

アクセス解析

FC2ブログのアクセス解析です。
アクセス解析

ホストの追跡という機能があるので、どこからこのブログを見に来ているのか調べてみました。
この十日間ほどですが、名前を知っているところでは・・・。

International Business Machines Corporation
日本電気株式会社
株式会社島津製作所
株式会社 東芝
パナソニック株式会社
株式会社日立製作所
東北大学
宇都宮大学
北海道大学
沖電気工業株式会社
鶴岡工業高等専門学校
名古屋工業大学
ヤマハ 株式会社
東京工業大学
東京大学
福岡大学
豊橋技術科学大学
浜松ホトニクス 株式会社
オムロン 株式会社
株式会社 ニコン
九州工業大学

順不同、敬称略。

いや、ちょっとびっくりです。
拙いブログにお越しいただきありがとうございます。
スポンサーサイト

九州工業大学Arduono簡易オシロを試す(2)

Arduino簡易オシロのための入力回路、一部定数変更。
ArudinoOsillo3回路図
別のユニバーサル基板に作成、手持ちにないので一部の部品は未実装。
Arduino用ユニバーサル基板上の部品は外すのが面倒なので放置^^;;
ArudinoOsillo3.jpg
30KHzの矩形波を観測した画面、立ち上がりが遅いのはオペアンプの影響か?
ノイズは若干ありますが、ほとんど気にならないレベル。ただ切り替えスイッチの金属部が電気的に浮いているためか、触るとノイズが増えます。
ArudinoOsillo4_input30KHz.jpg

九州工業大学Arduino簡易オシロスコープを試す(1)

九州工業大学情報工学部がArduinoを使った簡易オシロスコープを紹介しています。
簡易といっても等価時間サンプリングやFFTが出来るなどすばらしいものです。
Arduinoがわずかな部品の追加で簡易オシロになるのですが、そのままでは入力電圧が0V~5Vの制限があります。
AC/DC切り替えやゲイン切り替えが欲しいので、入力回路をオペアンプを使って作ってみました。
とりあえず1チャンネルのみです。
ArudinoOsillo_Preamp1.jpg
Arduinoオシロ_フロントエン
最初にお断りしておきますが、これ失敗作です。手持ちの部品だけで作ろうとしたのでこうなりました。
ゲインは10倍、1倍、0.1倍と切り替えられますが、ノイズが大きいのです。
R2廻りがノイズを拾ってるようで、やむなく写真のように銅版でシールドしてノイズを減らしましたが、無視できるほどにはなっていません。
反転増幅回路を使ったのは、手持ちのNJU7032が出力はレール・ツー・レールですが入力レール・ツー・レールではないからです。
非反転増幅回路だとボルテージフォロアにした場合、入力レール・ツー・レールでないとが問題になることがあるからです。
入力抵抗は高くしたいのでR1を1MΩとしました、初段はゲイン1倍、0.1倍の切り替えとしたのでR2も1MΩとなります。
で、このR2がノイズを拾ってしまうことになったわけです。
最初から部品配置に気をつけるなどしていればよかったのかもしれませんが、ろくに考えずに作るとこうなってしまいました。
入力に矩形波を入れるとNJU7032ではスルーレートの関係か出力波形がかなり悪くなります。結局、虎の子(^^;;)のOPA2350に変えてしまいました。波形がよくなりました。

結局、設計しなおしました。といってもまだ作っていませんが。
ArudinoOsillo_Preamp2.jpg
ゲイン切り替えは欲張らずに0.5倍、5倍の二段としました。
入力電圧範囲は±5V、±0.5Vになります。
あとトリガ入力も何とかしないといけません。

PSoC デジタルブロック出力ラインでわかったこと

参考資料
PSoC™ Mixed Signal Array Final Data Sheet Document No. 38-12012 Rev.*D

データシート203ページより引用。

PSoCのデジタルブロックは4個で一組のグループになっています。
そのデジタルブロック出力ラインとして4本あります。
CY8C27443なら8個のデジタルブロックを持つので出力ラインとしては8本あります。

隣り合う出力ライン同士で16種類の論理演算が出来ます。
PSoC_Digital_Interconnect2.jpg


ちょっとわかりにくいのですが、下の図では出力をCounter24とPWM8とで切り替えています。
PSoC_Digital_Interconnect.jpg

通常はChip Editorで設定しますが、プログラムで変更したいことがあります。これには対応するレジスタを設定します。
演算は16種類あるので設定には4bit必要で出力ラインは4本あるので16bitすなわち設定レジスタは2byteになります。

レジスタ名はRDIxLTy
RDI:Row Digital Interconnectの略
LT:Lookup Tableの略
x:デジタルブロックグループ番号、CY8C27443なら0または1、デジタルブロックを16個もつCY8C29466なら0から3まで。
y:0または1。これは設定レジスタが2byte必要だからです。

デジタルブロック0ならRDI0LT0とRDI0LT1です。
RDI0LT0についてデータシート125ページから引用します。
RDI0LT1については126ページにありますが、同じ内容です。
RDIxLT0.jpg

先の例ではRDI0LT0の上位ニブルを操作すればいいとわかります。
次のようなmainプログラムで動作確認しました。
ポート0_0 にスイッチをつないで出力を切り替えています。
void main(void)
{
    PWM8_1_Start();
    Counter24_1_Start();
    while(1) {
        if ((PRT0DR & 0x01) == 0){  //Port_0_0 で切り替える
            RDI0LT0=(RDI0LT0 & 0x0f) | 0x30;
        }
        else {
            RDI0LT0=(RDI0LT0 & 0x0f) | 0x50;
        }
    }
}

PSoCでレシプロカル式周波数カウンタの実験

先のArduinoによるレシプロカル式周波数カウンタと同じ方法で今度はPSoCでやってみました。

PSoCにはTimerというユーザーモジュールがあります。今回はデジタルブロックを四個連結したTimer32を使いました。
Timer32は32bitのダウンカウンタです。Timerユーザーモジュールにはキャプチャ機能があります。キャプチャ入力の立ち上がりエッジでカウンタレジスタの値をコンペアレジスタに転送します。
外部信号をキャプチャ入力に入れればその立ち上がりエッジ時点のカウント値はコンペアレジスタを読めばわかります。
その値を保存しておき、前回の値との差をとれば周期がわかります。キャプチャ入力で割り込みをかけて実現しました。
ここではTimer32のクロックに1MHzを入れました。PSoCのシステムクロックから分周すればいいのですが、実験の都合上内部クロックしか使えません、内部クロックは水晶発振ではなく安定していないので、手持ちにあったSPG8640BNの1MHz出力をTimer32のクロックとしました。
写真は前回と同じ自作のパルスジェネレータから2Hzを入れた時の表示です。
LCD表示の上が周期、下が周波数です。
Arduinoのmicors()と同じですが、micros()の分解能は4マイクロ秒なのに対し、今回の方法では分解能は1マイクロ秒です。
Timer32のクロックは24MHzまで可能なのでさらに分解能があがります。
ただカウンタのビット数には限界があります、Arudinoのmicors()は約70分でオーバーフローするとありますが、Timer32でも同じです。クロック1MHzなら同じく約70分でアンダーフローします(アンダーフローなのはダウンカウンタだから)
2^32/10^6≒4295秒≒71.6分
周期は正の値ですが、アンダーフロー前後ではマイナスになります、これはソフトで無視すればいいのです。
クロックを24MHzにすると約3分でアンダーフローすることになります。

PSoCでArduinoのmiros()と同等以上のことが実現できることがわかりました。

Arduinoでレシプロカル式周波数カウンタの実験

あっさり出来てしまいました。拍子抜けしています。
自作パルスジェネレータから2Hzをいれてます。
表示上位が周期で単位はマイクロ秒ですので0.500024秒、表示下位が周波数です。
Arudino_ReciprocalFreqCount.jpg


スケッチです、割り込みを使っています。
割り込み0(ピン2)に信号を入れましたが、LCDシールドのピン配置とバッティングするのでLCDシールドの配線を一部変更しました。
まぁとりあえず動いたというだけで、実際使うにはあれこれ考慮しないといけないのでしょうが、それにしても簡単に動いてしまった。
今のところ1周期の時間を測ってその逆数を計算して周波数を求めています。
高い周波数では周期が短いので有効数字が少なくなりますが、たとえば100周期分測るなど工夫次第で何とかなりそうです。


#include <LiquidCrystal.h>

// 接続ピンをして指定してライブラリを初期化
LiquidCrystal lcd(8, 3, 4, 5, 6, 7);

long previousMillis = 0;
volatile unsigned long duration=0;
volatile unsigned int pulsecount=0;
volatile unsigned long prevMicros=0;

void setup()
{
  lcd.begin(16, 2);
  attachInterrupt(0, periodIrq, RISING);
}

void loop()
{
   lcd.setCursor(0, 0);
   lcd.print(duration,DEC);
   lcd.print("uS ");
   lcd.setCursor(0, 1);
   lcd.print(1e6/duration,2);
   lcd.print("Hz ");
  delay(100);
}

void periodIrq() // interrupt handler
{
  unsigned long currentMicros = micros();
  duration = currentMicros - prevMicros;
  prevMicros = currentMicros;
}

脈拍を測るための実験(5)リンクあれこれ

今回の実験で参考にしたり内容に興味を持ったサイトのリンクです。

秋月パルス
Arduino互換機対応 心拍センサシールド
・これは上記の秋月パルスとほぼ同じ回路。ともにkoress projectさんの作。

心拍センサー(Arduino で心拍計をつくる その0)
・このサイトでも述べられているように、ネット上での自作記事はkoress projectさんの回路がベースになっていることが多いのですが、
脈拍計が完成 電脳伝説 VintageChips
電脳伝説さんでは上記の回路について二点ほど疑問を呈しています。
私は別の点で疑問を持ちました。
(1)入力オフセット電圧が最大で7mVのLM358で1000倍の増幅度を持たせて大丈夫なのかと思いました。
標準値は2mVだから問題になることはないのでしょうが、設計する上では気になる点です。
(2)LM358の入力バイアス電流は45nAです。
Koressさんの回路ではLM358の+入力の抵抗値は100Kなので4.5mVのオフセット電圧になります。
-入力の抵抗値は1Kなので0.045mVです。この差を1000倍するのですから出力の飽和が心配です。
でも実際は動いてるんですよね、ここら辺はもうちょっと調べてみないと・・・。


追記・訂正(2015/02/08)
秋月電子のLM358の商品ページから入手できるデータシートではLM358の入力バイアス電流は45nAとなっていますが、TIのデータシートによると20nA(typ)となっています。
実際、LM358の+入力を測ってみると2.5mVでしたので、2.5mV/100KΩ=25nAとなります。
データシートによって倍ほど違いがあるとは・・・、これはメーカーの作りの違いでしょうか。

【トランジスタ技術2006年01月号】 投稿記事『心電計の製作』
トラ技の投稿記事を読めるとは思いませんでした。この記事は単なる脈拍計ではなく心電計について述べられています。
心臓の働きについて詳しく述べられていますし、学ぶところが多いです。
回路に関してはICL7621というローパワーオペアンプで計測アンプを作りDCサーボをかけてあります。
今ならワンチップの計測アンプが入手できるので回路はシンプルになるでしょうね。

脈拍を測る実験(4)回路を若干変更する。

今のままではLM358の最大出力電圧が低いので若干回路を変更しました。
まずはLEDの電流制限抵抗を大きくしてLEDに流れる電流を減らしました。これによりLM358の負荷が軽くなり最大で3.1V程度だったのが3.5V程度にまでになりました。
さらにシリコンダイオードを追加、順方向電圧降下分だけArduino入力ポートの電圧を上げようという目論見です。
抵抗によるプルアップが必要ですが、Arduinoの内部プルアップ抵抗を使って省略しました。
pinMode(pin , INPUT_PULLUP)
これにより入力ポートの電圧は約1V~約4Vまで変化するようになりました。
もうちょっと丁寧に作る方法も考えましたが、これが一番簡単です。
それよりフォトリフレクタに指を安定して置く方法を考えないと・・・。
秋月パルス20150207

以前作ったLCDシールドを使って表示させてみました。
秋月パルスLCDシールド

続きを読む »

脈拍を測るための実験(3)millis()を使うと簡単に出来てしまった。

Arduinoにはmillis()という関数があるのを知りました。

Arduinoボードがプログラムの実行を開始した時から現在までの時間をミリ秒単位で返します。


これを使うと入力信号の周期を簡単に測る事が出来ます。pulseIn()を使う場合のように分周する必要がありません。フィリップフロップや私のやったPSoCも不要です。
先の回路のLM358の出力をArduinoにつないでやればいいのです。
スケッチです。ソフトで入力の立ち上がり、立下りを検出しています。
割り込みを使う手もありますが、今回はやめておきました。



unsigned long duration=0;
unsigned long previousMillis=0;
unsigned long currentMillis;

void setup()
{
  Serial.begin(19200);
  pinMode(8,INPUT);
}

void loop()
{
  while(digitalRead(8)==LOW) {
    ; 
  } // wait until input goes HIGH

  currentMillis=millis();
  duration = currentMillis - previousMillis;
  previousMillis = currentMillis;
  Serial.println(60000/duration);
  while(digitalRead(8)==HIGH) {
    ; 
  } // wait until input goes LOW
}


数値がばらつくので平均化などの処理は必要でしょう。

millis()ではなくmicros()を使えばレシプロカル式周波数カウンタが出来そうです。
まぁ、今やってることがまさにレシプロカル式なんですが。

あと、ArduinoのというよりATMega328の入力ポートですが、シュミットトリガ入力なのはいいんですが、Hレベルには0.6Vcc以上必要です。Vcc=5Vなので3V以上です。
LM358の出力は最大でも3.1V程度なのでちょっと余裕がないようで、指の置き加減で値がおおきく変化することがあります。
何らかの対策が必要です。

それにしても簡単に出来たので、拍子抜けしました。^^;;

脈拍を測るための実験(2)

実験回路の基板、および回路図です。
回路図でジャンパーピンから左が秋月パルスを参考にして作った回路です。ただしフォトトランジスタからの出力の取り出し方を変えてあります、オリジナルではコレクタからですが、この回路ではエミッタからとりだしています。
このほうが感度が高かったのですが、ちゃんとしたデータを残していないので、あるいは測定間違いかもしれません。
ジャンパーピンから右の回路に付いては後述します。
秋月パルスRPR220_2
心拍センサーwithPSoC
前回の実験で脈拍を測る目処が立ちましたが、いちいちグラフ化して読み取るわけにはいきません。
1分間の心拍数を測ればいいので、これはゲートタイム1分のの周波数カウンタを用意すればいいので簡単ですが、そんなに待っていられません。
ネットであれこれ調べると、看護士さんは基本どおり1分測ったり、30秒測って2倍、あるいは15秒で4倍することもあるようです。
きれいなおねいさんが脈を取ってくれるなら1分でも短いんですが、無機質のセンサーに指を乗せるのなら話は別です。(^^;;)
周期を測って逆数をとることにしました、前回グラフから脈拍を読み取ったのと同じ方法です。
ここではArduinoのpulseIn()関数を使うことにしました。
この関数は入力のHIGHまたはLOWの時間をマイクロ秒単位で測れます。
ただし今回必要なのは周期であって、パルス幅ではありません。これはフィリップフロップで2分周すれば済みます。74HC73や74HC74などが使えます。
その前にLM358の出力を整形する必要があります。上記のHCシリーズは入力の立ち上がりや立下り時間が遅いと誤動作を起こす恐れがあるからです。500nS以下が推奨動作条件となっています。
こういう場合は74HC14などのシュミットトリガを使うのが普通ですが、馴染みのPSoCを使ってみました。
PSoCの入力はシュミットトリガですし、デジタルブロックを使えば分周回路などは簡単です。
ここで使ったCY8C24123はデジタルブロックを4個内蔵していますので、先の回路図にあるように1周期、2周期、4周期、8周期分それぞれHレベルになる信号を出すことが出来ます。
1周期分の時間は毎回安定しているかどうかわかりません、人間の心臓は水晶発振回路じゃないんですから。
数周期の時間を測定することによりばらつきが抑えられるかもしれないと考えたわけです。

続きを読む »

脈拍を測るための実験(1)

Facebookのあるグループにおいて、アマゾンで買える心拍センサーが話題に取り上げられました。
実はその少し前に入手していたので、実験してみました。
アマゾンの商品説明にはArduinoのスケッチがあるので、深く考えずに接続し、走らせて見たがダメ。
そのままでは出力レベルが低すぎます。

そこで秋月パルスを参考にして増幅回路を追加しました。LEDとフォトトランジスタは元の基板から外し、下の写真のように取り付けました。
アマゾン心拍センサー

指を乗せると基板上のLEDが点滅し、脈拍が検出できましたが、どうにも不安定です。指の置き方で出力が簡単に変わってしまいます。
結局、先の秋月パルスで使っていたフォトリフレクタRPR-220に変更しました。この方が指が置きやすく、出力が安定します。
秋月パルスRPR220


続きを読む »

 | HOME | 

文字サイズの変更

プロフィール

edy

最新記事一覧(サムネイル画像付き)

BME280モジュールを使った温度・湿度・気圧計(2)DSO Shellを使って動作電流を測る Apr 23, 2017
BME280モジュールを使った温度・湿度・気圧計 Apr 23, 2017
DSO Shell(2)電源 Apr 16, 2017
小学一年生5月号付録 ドラえもん こえピアノ Apr 14, 2017
DSO Shell(1) Apr 13, 2017
非接触温度センサMLX90614を試す(6)プラケースに入れる Apr 03, 2017
アナログフィルタ Mar 28, 2017
非接触温度センサMLX90614を試す(5)Arduino pro miniを使ってみる Mar 19, 2017
非接触温度センサMLX90614を試す(4)耳内温を測ってみる。 Mar 12, 2017
非接触温度センサMLX90614を試す(3) Mar 11, 2017

全記事表示リンク

全ての記事を表示する

ブログリンク

リンク

このブログをリンクに追加する

月別アーカイブ

04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  12  11  10  09  07  05  04  03  04  03  01  12  11  10  08  07  06  05  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  02  01  12  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  10  09  08  07  06  05  04  03  02  01 

カテゴリ

プログラミング (0)
freescale (1)
AVR (3)
テルミン (16)
緊急警報放送 (3)
78K (1)
PSoC (295)
地上デジタル放送 (2)
電子工作 (390)
HX711 (2)
ACS712 (6)
数学 (6)
パソコン (12)
PLC (14)
未分類 (39)
ブログ関係 (20)
スカイプ (37)
ロボット (1)
LTSpice (8)
OCXO (0)
arduino (28)
maxima (1)
フランクリン発振回路 (3)
GPS (3)
DTMF (1)
Linux (1)
KOMAINO (7)

タグリスト

最近のコメント

最近のトラックバック

メールフォーム

名前:
メール:
件名:
本文:

検索フォーム

アクセス

RSSリンクの表示

フリーエリア

FC2Ad

まとめ

Template by たけやん