臨床工学技士の皆さんとそうでない方こんにちは。
もしCEの為のArduino入門を一読されていない場合は先に目を通し、Arduino初心者になっておいてください。
今回はArduinoを用いて内視鏡手術の際に使用するライトガイドケーブルの劣化具合をチェックする”ライトガイドチェッカー”を作成していきます。
結構簡単にできるのでArduino初心者のCEさんにはぜひ作成していただきたい逸品です。
作成にあたり、Arduinoのスケッチ(プログラム)をダウンロードし同様の回路を組む事で作成する事が可能です。ぜひダウンロードください。
今回はハードウェアとプログラム解説に関して動画を用意していますのでご参考になさってください。
それではいってみましょう。
とりあえず↓のようなものが作れます。
仕組みについて
上記図の通りです。
内視鏡手術手術の際に使用するライトガイドケーブルですが、繰り返し使用していると内部のファイバーが折れて光を100%伝達できなくなります。
ライトガイドの劣化がおこってくると内視鏡手術の際に術野を照らす光が厳弱して暗く見え安全で正確な手術ができなくなってしまいますので、劣化具合をチェックするという寸法です。
原理はライトガイドケーブルの一方にLEDを照射して、もう一方から出てくる光をフォトトランジスタでその光強度を計測します。
んで、光の種類をどうするか?ですが、光には波長があります。
赤は800nm(ナノメートル)程度、緑は500nm(ナノメートル)とか人間には波長によって見え方が違うのです。
光に応じてフォトトランジスタもどの波長に感度があるものを使用するのかが決まります。
今回は人間の目の感度が最も高くなる500nm程度のLEDとフォトトランジスタを用いる事で実際に見える可視光線の伝達状態をチェックするチェッカーを作成していきます。
さらにですが、計測する際にArduinoをPCよりコントロールする仕組みをプログラムする事が目標です。
PCとの接続はUSBで接続し、キーボードのあるボタンをおせばLEDを光らせフォトトランジスタが受ける光強度をA/Dコンバーターで変換、さらに数値を照度に計算してシリアル通信によりパソコンに表示させるという仕組みです。
これで、LEDの光らせかたやフォトトランジスタの扱いか、シリアル通信とシリアル通信で行うコントロールもマスターできます。最高です。
使用材料
- Arduino UNO R3×1
- 緑色LED OSG58A5111A ×1 データシート
- 緑色領域のフォトトランジスタ NJL7502×1 データシート
- 抵抗器 1kΩ×1
- ブレッドボード(あれば便利)
詳細はクリニカルエンジニアリング 2023年9月号を参照
ハードの説明
回路図
回路図は下図の通りです。一般的な回路図より視覚的にわかるように実際の図のような回路図としています。
接続すべき場所の数字や文字を記載していますのでその通りに配線します。
LEDやフォトトランジスタには極性があるので接続間違いに注意しましょう。
LEDは足の長い方がアノードになります。
フォトトランジスタの場合、使用しているNJL7502Lはコレクタのほうの足が長くなっています。(中にはコレクタ側なのに短い場合もあるので注意)
接続は非常に簡単です。ブレッドボードを用いて配線しても良いでしょう。
arduinoでA/D変換について
arduinoUNO R3では10bit(1024段階)で5vの電圧のアナログ量をデジタル値に変換する事ができます。
入力電圧の電圧に応じて0−1023のデジタル値が割り振られ、プログラム中で計算などに使用できるのです。
今回はA0のポートをA/D変換ポートとしています。
今回はフォトトランジスタに入る光強度に応じて変化する電圧として0−5Vが入力されます。
A/D変換値は1段階あたり、5000mV÷1024≒5mVなので、たとえば2.5Vが入力されると2500mV÷5mV=500でA/D変換値は500となります。
このデジタル値からは電圧も計算する事ができますし、光強度なども算出できるようになります。
今回は電圧値から、フォトトランジスタと直列に繋いだ抵抗器の値から電流値を算出し照度を求める仕組みです。
電流値からフォトトランジスタNJL7502のデータシートにのっている電流値と照度のグラフから照度を算出しています。↓
だいたいですが、100LXの時に33μA
1000LXの時に330μAになってますよね。
A/D変換でデジタル値から電流値を計算しているので上の計算式に当てはめて照度を計算するという流れです。
LEDの使い方
LEDは小学生で習った豆電球のように電池をつないで点灯というわけにはいきません。
LEDを光らせるにはルールがあるので、ここで説明しておきます。
ルール1:電流を流す方向が決まっている
代表的な赤色LEDで説明していきます。
LEDには電流を流す方向が決まっています、これを極性があるといいます。
具体的にはLEDの電極の足が長い方(アノード)にプラスの電極を、短い方(カソード)にマイナスの電極を繋ぎます。
ルール2:電流量を調節しなければならない
電源の繋ぎ方(極性)はこれで終わりです、ただ注意点ですが直接電池につなぐとLEDは眩しいくらい光って最後には光らなくなり壊れてしまいます。
これは電流を制限しておらず、過大な電流が流れてしまうからです。
LEDを光らせる為には電流を制限しなければなりません。
その方法は抵抗器をLEDに直列に繋いで電流を制限します。
制限抵抗の決め方
LEDに流す制限抵抗ですが、買ってきたLEDのデータシートに書かれている2つの項目から計算する。
一つは最大定格電流でもう一つが順方向電圧(Vf)という値である。
最大定格電流がたとえば30mAならそれ以上の電流は流せないという事でそれ以下の電流を用いる事になります。
大体のLEDは10mAも流せば十分で、点灯を確認する程度なら5mAも流せは十分です。なんなら、1mAでもOKです。
順方向電圧はVfと書かれている事が多く、制限抵抗を決定する上で重要になります。
下記の式がVfを用いた制限抵抗の算出式になります。
制限抵抗値=(電源電圧➖LED電圧降下)÷流したい電流値
例ですが、赤色LEDのVfを2VとしてArduinoの電源電圧5Vとします。
LEDに流したい電流値を10mA(0.01A)とすると
(5v-2v)÷ 0.01A=300Ωとなります。
ここまで行ってなんですが、私の場合は計算せずにいつも電流制限抵抗は1kΩを使用しています。視認の為の用途であれば全く問題ありません。
フォトトランジスタの使い方
フォトトランジスタは光センサとして使用されるデバイスの一つで、光の強さや光の存在を検出する為に使用される素子になります。
光を受けると、光電流がコレクタからエミッタに向けてmA単位の電流が流れる。よく似たものにフォトダイオードがあるが、光電流がμA程度と低いのが特徴です。
他にもCdsセルという光センサもarduinoではよく使用します。いずれも光の強度によって流れる電流量が変化して、センサと直列に接続した抵抗器の電圧の増減を出力とする使用方法が一般的です。
フォトトランジスタの負荷抵抗の決め方
フォトトランジスタもLED同様に使用にあたり、抵抗器が必要でそれを負荷抵抗といいます。
負荷抵抗の決め方はやはり、買ってきたフォトトランジスタのデータシートに記載された情報から計算します。
まずは光電流(IL)が記載されていればどの程度の電流を流すかがわかります。ILとは最大定格である場合が多いので、それ以下の電流を選択する必要があります。
今回のNJL7502LであればILの半分の5mAを流すとすると↓
5V/0.005A=1000Ω
したがって負荷抵抗は1KΩと設定したました。
データシートにILの記載がなくICといってコレクタ−エミッタ間の平均的な電流値しか書かれていない場合があるが、その場合はIC電流以下になるような負荷抵抗を選べば間違いない。
負荷抵抗の位置による出力電圧の違い
フォトトランジスタやCdsなど光刺激などで電流の流れ具合が変化するセンサにおいて、負荷抵抗の設置位置の違いにより出力波形に違いが生じます。
詳しくは図の通りです。
Arduinoなどでセンサ出力を入力する場合、負荷抵抗をコレクタ側にするか、エミッタ側にするかでプログラムの書き方が変わるので注意ですね。
回路説明(動画)
動画のほうが少しわかりやすいかと思い動画を用意していますのでぜひご覧ください。
プログラムの説明
プログラム解説(動画)
プログラムの解説
プログラムは下記の通りです。
詳細はプログラム中に説明を書きこんでいますのでご参考になさってください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
/* 2023 製作者:高瀬和則 mail:kazurock0926@gmail.com わからないことはなんでもよいのでメールください。 arduinoではじめてのプログラミング ”ライトガイドケーブルチェッカー” arduino UNO R3で制作 操作方法 PCとUSBケーブルで接続 立ち上げた状態では待機モードの状態です。 キーボード操作で”S”押下で計測スタート キーボード操作で”W”押下で待機状態になります キーボード操作で”t”押下で透過率の閾値を設定します。 たとえば、新品にくらべてどの程度透過率が低下しているかはケーブルによって異なるので、 新品の閾値をあらかじめ測定して Lxの上限をあらかじめ入力(新品ケーブルを設置してtで設定)しておく事でケーブル毎に 異なる透過率を算出します。 */ const int analogAD = A0; const int greenled = 7; double lightAd; double lightmv; double lightuA; double lightLx; double touka; double ikichi=0; //setupはarduinoに電源が投入されると一度だけ呼ばれる設定等に使用します。 void setup() { //シリアル通信の設定です。9600は通信スピードです Serial.begin(9600); //A0であるanalogADをインプット(入力)として使う宣言です。 pinMode(analogAD,INPUT); //7pinであるgreenledを出力として設定します。出力とは端子から5Vを出力できる事を意味します。 pinMode(greenled,OUTPUT); //基盤表示用LEDの設定 pinMode(LED_BUILTIN,OUTPUT); Serial.println("ハロー CE!!"); Serial.println("2023 clinical Enginireering"); Serial.println("arduinoではじめてのプログミング"); Serial.println("ライトガイドチェッカー by takase"); delay(2000); } void loop() { //serial受信があったらswitch文へ移行 while (Serial.available() > 0){ switch(Serial.read()){ case 's': syoudo();//照度を計測する関数に移行します break; case 'w'://待機モードに移行します。 taiki(); break; case 't': ikichicale();//閾値を設定します。 syoudo(); break; } } taiki();//taiki()という関数を呼び込ます } //フォトトランジスタに入る光を数値化する関数です。関数とはメインループから読み込むプログラムの塊のようなものです。 //500msづつフォトトラのデータをA/D変換してシリアル送信する //シリアル受信するまでずっとsyoudo()を繰り返す void syoudo(){ //ライトガイドケーブルを透過させる緑色のLEDを点灯させます。 digitalWrite(greenled,HIGH); //シリアル通信を受信しないかぎり下のwhileを繰り返す while(Serial.available()<=0) { lightAd = analogRead(A0); //A/D値から電圧を計算します。分圧の式で5000とは5000mvの事 lightmv = (lightAd/1024)*5000; //電圧から電流値を算出します。mv*1000でμVにして1kΩの抵抗をフォトトランジスタに繋いでいるので、 //1000で割って電流値を計算します。 lightuA = (lightmv*1000)/1000; //データシートから下記の計算方法で簡易的にLxを計算します。 lightLx = lightuA/0.33; //透過率の計算です。 touka = (lightLx/ikichi)*100; /* シリアル通信の書き方の一つです。 下記のようにバラバラに書いてもよいしコメントアウトせずに下に記入している通り、 文字データを足して繋げてもOKです。 Serial.print("mV=:"); Serial.print(lightmv); Serial.print(","); Serial.print("uA=:"); Serial.print(lightuA); Serial.print(","); Serial.print("Lx=:"); Serial.print(lightLx); Serial.print(","); Serial.print("LX%=:"); Serial.println(touka); */ String str = "電圧mV=:"+String(lightmv)+","+"電流uA=:"+String(lightuA)+","+"Lx=:"+String(lightLx)+","+"透過率%=:"+String(touka); Serial.println(str); delay(500); } } //待機モードの関数です void taiki(){ //緑のLEDをオフにして待機モードにします。 digitalWrite(greenled,LOW); //シリアル受信しなければ下のwile文を繰り返す while(Serial.available()<=0) { digitalWrite(LED_BUILTIN,HIGH); delay(1000); digitalWrite(LED_BUILTIN,LOW); delay(1000); Serial.println("待機中"); } } //閾値の設定です。 //センサ部に新品のケーブルをつけて閾値測定するとそのケーブル固有の透過率を100%として記憶します。 //他のケーブルをそのあと計測すると、透過率が100分率で表示され劣化具合がわかりやすくなります。 void ikichicale(){ digitalWrite(greenled,HIGH); ikichi=0; double threshold=0; //5回センサ値を読み取り加算します。 for(int i=0;i<5;i++){ threshold += analogRead(A0); } //5回加算したものを5で割って平均をだします。 threshold= threshold/5; //A/D値から電圧を計算します。分圧の式で5000とは5000mvの事 lightmv = (threshold/1024)*5000; //電圧から電流値を算出します。mv*1000でμVにして1kΩの抵抗をフォトトランジスタに繋いでいるので、 //1000で割って電流値を計算します。 lightuA = (lightmv*1000)/1000; //データシートから下記の計算方法で簡易的にLxを計算します。 ikichi = lightuA/0.33; } |
おわりに
どうだったでしょうか?うまく動きましたか?
もし動かなかったらどうして動かないのかを順をおって確認しましょう。
繰り返しエラーを確認し修正するという繰り返しの行為が非常に重要です。
プログラミングは論理的思考の塊です。
根気よくトライアンドエラーの精神で邁進してください、さすればうまく動いた時の感動と脳汁の出る快楽が得られる事でしょう。