① Arduino Pro Mini 3.3V 8MHzモデルのように、3.3V系のマイコンボードを使ってデジタルピンから印加する
下の図のように接続しますが、ここはUSB-シリアル変換モジュール(図中の赤い基板)のVcc出力が3.3Vに落とされていることが前提です(PCのUSB端子からの印加は5Vです)。もしこの端子から5V出ている場合には、Arduino Pro Mini側のVccではなくRAWにつないで下さい。Arduino Pro Miniのボード上で3.3Vに落とされてから入力されます(詳しくは第12回参照)。印加開始して(digitalWriteでHIGHにして)から100msec待ち、電圧を読んだ後にdigitalWrite -> LOWで印加を停止しています。
#define CHANNELNUM 3 // Number of EC-5 connected to Arduino
const int apin[CHANNELNUM]={0, 1, 2}; // Analog pins to read the EC-5 outputs
const int dpin[CHANNELNUM]={2, 3, 4}; // Digital pins to energise EC-5
void setup(void)
{
int cnt1;
/* ----- Setting up serial communication with PC ------ */
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
最近、写真を見せていなかったので、久々に雰囲気を見せます。自宅にEC-5が1つしかなかったので、ここでは1つしかつないでいません。また、私が持っているUSB-シリアル変換モジュールやArduino Pro Miniは、上のFritzing図と比べると6線の端子が逆転(鏡面対称)になっていました。よくシルクを見て接続してください。
ここで、両センサーの応答を見てみます。長期的な比較をする時間がなかったので、10分くらいでできる簡単な比較だけです。Arduino Pro Mini 3.3V 8MHzに両センサーを1つずつ接続し、持ち運びやすいようにバッテリー駆動とし、結果がすぐ見えるようにLCD(第18回参照。ただし、ここでは20文字×4行ではなく16文字×2行を使っているので、I2Cアドレスなどに変更があります)表示としました。先の①~③の方法のうち、ここでは③を使いました(LCDは5Vで印加しないと明るさが足りないので)。第18回をとばしていて、まだLCDのライブラリをインストールしていない人は、それが必要なことに留意してください。
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4);
const int s0 = 3; // Used to control the multiplexer
const int s1 = 4; // Used to control the multiplexer
const int s2 = 5; // Used to control the multiplexer
const int s3 = 6; // Used to control the multiplexer
void setup(void)
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
/* ----- Preparation of multiplexer signal ----- */
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
/* ----- Initialisation of LCD ----- */
lcd.init();
lcd.backlight();
}
void loop(void)
{
float ec5_reading;
float sms_reading;
connectMux(0);
delay(100);
ec5_reading=analogRead(A0)*5000.0/1023;
connectMux(1);
delay(100);
sms_reading=analogRead(A1)*5000.0/1023;
connectMux(2);
lcd.clear();
lcd.setCursor(0, 0);lcd.print(ec5_reading);
lcd.setCursor(0, 1);lcd.print(sms_reading);
lcd.setCursor(4, 0);lcd.print(" mV");
lcd.setCursor(4, 1);lcd.print(" mV");
delay(2000);
}
/* Function to connect to a particular channel by multiplexer (mux) */
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
Serial.println();
}
(参考)
上記のスケッチ中における#if defined XXXというのは、XXXが定義されていれば、その次の行グループをコンパイルするという意味です(これや#defineなどはコンパイル後のコマンドになるというよりもコンパイラへの指示であり、ディレクティブと呼ばれます)。先に書いたように、コメントアウトを外せば、#if definedがtrueになるので、その次の文がコンパイルされ、実行可能になります。
今回は、温度センサーDS18B20を紹介します。データシートによると、「… digital thermometer provides 9-bit to 12-bit」とだけあり、計測原理などについての言及はないようです。おそらくICセンサーかと思われます。(ワンチップ)ICセンサーとは「センシング入門」(オーム社)によると、「トランジスタのベース-エミッタ間電圧が、温度に比例して変化することを利用している・・・大量生産されるために安価であり、小型・高精度で経時変化も少ないのが特長である」だそうです。実際、このセンサーは非常に安く、同じ製品が様々な価格で売られているのですが、Amazonでは例えば2m程度のケーブル付きで、センシング部が金属の防水ケースに入ったものが10本3000円程度で売られています。ケーブルの価格だけでこのくらいするんじゃないかという価格です。DS18B20で検索して下さい。データシートはこちら。
実用例として、積雪深ゲージを示します。寒冷地では融雪による土構造物の不安定化が懸念されることがあり、積雪深は地盤工学的にも興味があるところです。私が思いつく限り、積雪深を測る方法はいくつかありますが(Nishimura et al., 2000)、温度センサーのアレー(例えば10cmごと)を用意しておくというのは中でも利点の多い方法です。温度センサーが雪に埋まると、雪が断熱材となり気温の日変化に対して鈍感になるので、温度の変化に着目すると、どのセンサーまで雪に埋まったかすぐにわかります。インターバルカメラによる直接観察は、レンズに降雪が付着したり、電池寿命に限界があったりしますし、写真から積雪深を読み取る作業が必要です。データが大きく、無線遠隔転送にも向きません。超音波センサーなどによる測距は、上から地表にセンサーを向けるため、そこそこ大がかりなやぐらが必要になりますし、雪の表面が柔らかいと反射をよくピックアップできないこともあります。この温度センサーアレー方式は、積雪深分解能がセンサー間隔で決まるという限界がありますが、これに目をつむれば、なかなか優れたやり方に思えます。オマケとして、雪の温度も測れます(そんないい加減な測り方をしてはいけないとA川先生に怒られそうですが)。塩ビ管に穴をあけてDS18B20を埋め込むやり方なら、Arduinoと電池も含めて5000円くらいで製作できます。ちなみに下の図では、てっぺんにもいろいろ搭載されていますが、これは後の回で説明します。
MAX31856はMAX6675やMAX31855の上位版チップのようですが、あるサイトによれば、性能は各段に違うようです。価格も違いますが、研究用なら間違いなくMAX31856のほうがよいとのこと(MAX31855も使ったことがないのでわかりませんが)。ここではMAX31856の使い方を紹介します。MAX31856を搭載したモジュールはやや高めで、1500~2000円くらいで売っていることが多いです。Adafruit製が「正規品」のようですが、同じ作りのものは例によってたくさん売っています。2極端子台がついてくることが多く、写真中右のようにはんだ付けすると便利です。対応している熱電対の型は、B, E, J, K, N, R, S, Tです。サンプルコードを見ると、ゲインも変えようと思えば変えられるように見えます。
ここで、北海道大学の地盤物性学研究室に導入した自作ロガーを紹介します。この装置は、一定荷重の下、粘土を凍結融解し、圧縮量の累積を計測していくもので、同じ原理の装置で行った研究は論文として公開されています(Nishimura et al., 2020)。ここでは、粘土供試体の上端・下端の温度を熱電対で計測し、荷重・変位をひずみゲージ型センサーで計測し(第19回参照)、LCDに表示するとともにSDカードに記録しています。このブログでいえば、第5、7、18、19、20回を読んでもらえれば作れます。それらを読まなくても、以下の通りつないで(ライブラリを入れたうえで)スケッチを入れればできますが。東京測器社製のハンドヘルドデータロガーを使っていたのですが、表示更新が遅く見づらいのと、ロードセルの分解能が低く、上載圧にして4kPa単位でしか表示できなったため、自作したという経緯があります。私はArduino Pro MiniやNanoといった小型のモデルを好んでいますが、ここでは5V(LCDを明るくするために必要)と3.3Vの出力端子を両方持つUNOをあえて使っています。
/* Function to adjust the digits of minute and second */
void printDigits(int digits)
{
Serial.print(':');
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
参考文献
Nishimura, S., Okajima, S., Joshi, B. R., Higo, Y. and Tokoro, T. (2020) Volumetric behaviour of clays under freeze-thaw cycles. Géotechnique, Under production. DOI: 10.1680/jgeot.20.P.047
void setup(void)
{
/* ----- Setting up serial communication with PC ------ */
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
LCDのコントローラーにはポテンショメーターがついていて、+ドライバーで回すとバックライトの輝度を変えられます。あれ、つかない?と思ったら、単にディスプレイのコントラストが低くて見えていなかっただけ、ということがあるので、回してみてください。また、私の持っているLCDは、3.3V系では薄すぎて見えません。5Vで動かす必要があります。Arduino Pro Mini 3.3Vモデルにも、RAW(3.3Vに下げてから入力する端子)ではなくVcc(与えた電圧をそのままかける端子)に無理やり5V流して(不思議なことに、壊れたことがありません)使わないと、表示が見えません。