どこに電源をつなぐ?

Arduinoは電池で動かせます。Arduino UNOに給電するには、いろいろな方法があります。

・USB端子を使って、5Vちょうどを供給する(このブログのここまでは、PCのUSB端子から5Vちょうどを供給していました)

・DCジャックに7-12V(許容値は6-20V)を与える

・Vin – GND間に7-12V(許容値は6-20V)を与える

 

家庭用コンセントがある場所なら、携帯の充電器を使ってUSB端子に5.0Vちょうどを与えるのが便利かもしれません。電池を使うなら、4~6本直列つなぎにしてVin – GNDにつなぐことになります。あるいは、車のバッテリー(鉛バッテリー:12V)も使えます。

 

モバイルバッテリーの是非

ここで誰もが(?)考えるのが、「携帯のモバイルバッテリーが使える」ということです。スマホを何回も充電できる10,000mAhを超える容量の製品もあり、これなら長時間駆動できるように思えます。しかし、これには注意が必要です。モバイルバッテリーは、スマホの過充電を防ぐため、電流がある程度以下になると自動的に給電を停止する装置が組み込まれています。およそ、50mAくらいで切られることが多いようです。これ以下の電流で動作する装置をモバイルバッテリーにつなぐと、最初の10秒ほどは動いても、すぐに止まります。給電が切られてしまうからです。Arduino UNOは、省電力の工夫(スリープモードなど)をしないと50mA以上で動くことが多いので、なんとか動くかもしれません。しかし、これでも10,000mAh/50mAと考えると、200時間(=8日)しか動作せず、フィールド観測には不向きです。このブログシリーズでは、最終的にスリープを使って断続的に記録するシステムをつくります。このように、モバイルバッテリーは、使えないことはないですが、大きな欠点があります。

 

上記の問題を解決するために、電子工作向けにCheero Canvasという、過充電防止回路のないIoT向けモバイルバッテリーが売っています。コレ↓。

 

 

管理人が(数年前に)調べたところでは、この製品くらいしか過充電防止回路のないものはありません。ただ、3,200mAhと容量が限られています。2,500mAh程度のハイエンドのニッケル水素充電池(エネループプロ・充電式エボルタプロなど)とあまり変わりがありません。

 

別の選択肢として、18650などリチウムイオン電池そのものを使うという手があります。これはモバイルバッテリーの素ともいうべき製品で、いろいろな形のモバイルバッテリーも、実は、中にはこういった電池や、あるいはリチウムポリマー電池が入っているだけです。リチウムイオン電池は基本的に3.7Vで、18650の場合、例えば3400mAhなどの容量があるので、1本でニッケル水素充電池(1.3V, 2,000-2,500mAh程度)の3倍程度のエネルギーを持っています。18650などのリチウムイオン電池は素人向けではありません。Amazonでいろいろ売っていますが、普通の店舗では売っていません。専用の充電器が必要ですし、リチウムイオン電池は下手をすると爆発するうえ、過放電などで大きく損傷します。

 

以上に鑑み、とりあえずのおすすめはハイエンドニッケル水素充電池(エネループプロ・充電式エボルタプロなどの黒いやつ)です。扱いやすいし、怖さがありません。価格もお手頃です。電子工作に挫折しても、日常生活で使えます。

 

 

電池ケースも買っておきましょう。Arduino UNO向けに6本直列ケースと、あとで使うかもしれないのでArduino Pro Mini 3.3V用に4本直列ケースも買っておきましょう。安いものなので大人買いしましょう。後の回では、鉛バッテリーと太陽光パネルを併用して恒久的なシステムを作製します。

 

 

 

電池ケースには、以下のようにジャンパーワイヤ―をつなげておくと便利です(写真の撮り方が悪くて申し訳ない:先っぽが、ジャンパーワイヤ―のオスになっていて、ブレッドボードに挿せます)。はんだ付けして熱収縮チューブで保護しておくのが理想ですが、接触さえしていればとりあえずよいです。

 

 

ちなみにですが・・・Arduino UNOはニッケル水素充電池4本でも動くことが多いです。1.3×4=5.2Vしかなく(充電直後は5.6Vくらいになります)、6-20Vを満たしていないのですが、実際には動くことが多いです。

 

以下のようにすれば、スタンドアローン型の最低限のロガーの出来上がりです。

 

 

参考までに、いろいろな電池を並べてみた写真↓。左から、太陽光パネル付きモバイルバッテリー、リチウムイオン電池18650、エボルタプロ、エネループプロ。電子工作をしていると、電池に愛着がわいてきます。

 

 

 

SDカードに書き込む

まずSDカードシールド(シールドとは、いろいろ部品の載った基盤と思ってもらえばよいです。「モジュール」とほぼ同じ意味で使っていますが、Arduinoにピッタリはまるように形作られた基盤のものをシールドと呼ぶことが多いようです)を買って下さい。いろいろ売っていますが、管理人は下記の3種類を使っています。

 

①シールドその1

マイクロSDカードが挿せます。5V入力専門です。Arduino UNOは5Vで動くので問題ありませんし、3.3V出力端子もあります。Arduino Pro Mini 3.3V 8MHzで使うときは、3.3V系なので、そのままでは使えません。少しいじると(5V -> 3.3V電圧レギュレータをバイパスする)使えるとは思いますが。これに気付かず、秋田の堤防でサクション計測を行ったときは数週間無駄にしました。

 

 

②シールドその2

マイクロSDカードが挿せます。3.3V向け。一番小型で、最近のお気に入りです。

 

 

③シールドその3

フルサイズSDカードが挿せます(マイクロSDを買ったときによくついてくるアダプタにはめれば、マイクロSDカードも使えます)。5V・3.3Vそれぞれ向けの端子があり、どちらでもいけます。個人的な意見ですが、こいつはなぜかよく壊れる気がします。

 

 

なお、SDカードは64GB以上だとSDXC規格になります。SDXCは使えないようでした。32GB以下のものを用意してください。また、SDHC規格でも、相性とでもいうのか、16GBや32GBだと機能しない場合もあります。8GBくらいのSDカードを用意するとよいです。

 

SDカードシールドとArduinoは6本の線でつなぎます。以下のようにつないでください。ここでは②のシールドでいきましょう。

 

(Arduino側)―(SDカードシールド側)

   13                CLK (SCK)

   12                MISO

   11                MOSI

   10                CS

   3.3V             3.3V (5Vのシールドに対しては「5V」という出力端子がArduinoにあります。3.3Vのすぐ隣り)

   GND             GND

 

ここで、Arduinoのピン10~13は、A0~A5とは異なり「A」とついていません。これらはデジタルピンで、汎用入出力GPIO(General-Purpose Input Output)とも呼ばれます。Aとついているアナログピンとは異なり、入力された電圧がHighかLowかしか判断できません。また、逆にHigh(5V)かLow(0V)を出力することもできます。これを通じて、周辺機器(ここではSDカード)と信号を交換し、データのやり取りするのです。

 

参考1:Arduino UNOではなくArduino MEGAを使用する場合

SPI通信用(後述)のデジタルピンが異なります。

UNO: 10 (CS)、11 (MOSI)、12 (MISO)、13 (CLK)

MEGA: 50 (MISO)、51 (MOSI)、52 (CKS)、53 (CS)

 

前回から電池はピンA0につないだままとして、その電圧値を記録しましょう。写真は②のシールド(3.3V)の例、図は③のシールド(5V)を使った例です。

 

 

 

 

 

 

 

ここまでハードの準備ができたら、以下のコードを書き込んで下さい。このコードでは、ファイルはAppendモード(書き足し)となるので、過去のデータは自分で消さない限り永遠に消えません。

 

#include <SPI.h> 
#include <SD.h>

const int chipSelect = 10; // Arduino UNOでは10、Arduino MEGAでは53

void setup(void)
{
    /* ----- Setting up serial communication with PC ------ */
    /* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    //何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる    
    }

    /* ----- Initialisation of SD card ------ */
    Serial.print("Initializing SD card...");
     //see if the card is present and can be initialized:
    if (!SD.begin(chipSelect)) {
       Serial.println("Card failed, or not present");
       // don't do anything more:
      return;
    }
    Serial.println("card initialized.");
}

void loop(void)
{
    int ainput; //読み取ったbit数:intは整数
    float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数

    /* データの読み取り */
    ainput=analogRead(A0); //ピンA0から電圧をbitとして読む
    vinput=5000.0*ainput/1024; //上記を電圧mVに変換
    //ここで5000.0でなく5000とすると、整数としてvinputにキャストされてしまう)
    //粗い値になったり、おかしな値になったりする

    /* PCのシリアルモニタに表示 */
    Serial.print(ainput);
    Serial.println(" bit"); //" bit"と表示、printではなくprintlnとすることで改行する
    Serial.print(vinput);
    Serial.println(" mV"); //" mV"と表示、printではなくprintlnとすることで改行する

    /* SDカードに書き込み */
    File dataFile = SD.open("datalog.csv", FILE_WRITE);
    if (dataFile)
    {
      dataFile.print(ainput);
      dataFile.println(" bit"); //" bit"と表示、printではなくprintlnとすることで改行する
      dataFile.print(vinput);
      dataFile.println(" mV"); //" mV"と表示、printではなくprintlnとすることで改行する
    }    
    dataFile.close();
    
    delay(2000); //2000ミリ秒=2秒の停止
}

 

Arduinoへのコードの転送が済んだ時点から動作は開始しますが、シリアルモニタを開くとリセットされ、最初からまた始まります。シリアルモニタに以下のような画面が見えると思います。

 

ここでSDカードを抜いて(Arduinoを止めないで抜いても基本的には壊れることはありません・・・たぶん。よっぽどタイミング悪いときに外さない限り)、PCに挿すと、電圧値がテキストファイルとして残っていることがわかります。

 

 

ちなみに、SDカードの読み書きは、カードが認識されず手こずることが多いです。もしSDカードが認識されずうまくうかないときは:

・SDカードがSDXC規格でないかもう一度確認してください。SDHC規格でも、8GB以下のものを試してみてください。

・FAT32でフォーマットしてみてください。Windows PCでSDカードのドライブを右クリックして「フォーマット」からFAT32を選べます。

・接続を確認してください。

 

参考2:SDカードとマイクロSDカード

SDカードとマイクロSDカードはどちらがよいか?単に形が違うだけですが、後者はアダプタにはめることで前者になるので、同じくらいの値段なら後者を選ぶとよいと思います。しかし・・・フィールドで細かい作業していると、指から滑ってカードを草むらに落とすことがたまにあります。マイクロSDは、小さすぎて落とすとまず見つかりません。せめて、同じくらいの価格なら派手な色のものを選ぶとよいでしょう(SanDiskの灰色と赤とか目立ちますね)。

 

参考3:SPI通信とI2C通信

SDカードとマイコンは、SPI通信と呼ばれるプロトコルでデータ通信をします。SPIはI2Cとならんで、マイコンでよく使われる周辺装置との通信方法です。モトローラ社が開発したとのことです。SPIは、CS(Chip Select)という端子を周辺機器(この例ではSDカード)ごとに一つ使って通信先を区別するようです。いうならば、糸電話を5つもって、それぞれの先を5人に渡して、「お前!」「次、お前!」と一人ずつ呼ぶようなものです。個々に呼び出し線があるので、周辺機器にそれぞれ固有の名前は要りません。自分が呼ばれているとわかります。逆に、I2C(アイスクエアシーと読む:フィリップス社が開発)は、周辺装置にそれぞれ固有のアドレスがあるので、「田中!」「山田!」と呼べるようなものであり、すべて芋づる式に共通線で接続できます。その代わり、同じ固有のアドレスを持った周辺措置を2台以上つなげません。地盤工学で使うようなものとしては、SPI通信のモジュールとしてはSDカードシールド以外には熱電対アンプなどがあります。他はI2Cのほうが多いような気がします。では同じI2C装置を複数台使うときはどうすればよいのか?それには、I2Cマルチプレクサーというスイッチング装置があります。後の回で紹介したいと思います。

 

多くの教本では、ここからArduinoの各種ピンの機能の説明などから入り、「Lチカ(ボードについているLEDをチカチカ点滅させること)」から始めます。しかし、これは興味があれば、教本を読んでください。我々は、さっそく電圧を測定します。ピンの機能等については逐次説明していきます。

 

まず1チャネル読んでみる

基本的にはセンサーの出力値を読むのが目標なので、入力電圧は直流(DC)です。Arduino UNOには6つのアナログピン(A0-A5)があります。グラウンド(GND)を基準として、図のように例えば電池を接続すると、その電圧がA0を通して読めます。

 

 

 

 

 

Arduino UNOの場合、読めるのは5Vまでです。当然、これを大きく超えるとぶっ壊れます。アナログ入力分解能は10bit(2^10=1,024段階)なので、だいたい0.005Vの分解能ということになります。0-1000kPaのレンジを0-5Vで出力する圧力センサーの場合、分解能は1kPaということになり、正直イマイチです。より高い分解能で電圧を読むには外部モジュールが必要で、後の回で紹介します。

  

図にある「fritzing」というのは、Arduinoなどの電子工作の作図を助けるソフトで、ロゴが勝手に入るだけなので気にしないでください。また、写真では電池を2つつないでいますが、これも気にしないでください。電池1個のケースが見つからなかっただけです(持っていたはずだけど・・・)。

 

次のコードをArduinoに送り、シリアルモニタを開いてください。

 

void setup(void)
{
    /* ----- Setting up serial communication with PC ------ */
    /* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    //何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる    
    }
}

void loop(void)
{
    int ainput; //読み取ったbit数:intは整数
    float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数

    ainput=analogRead(A0); //ピンA0から電圧をbitとして読む
    vinput=5000.0*ainput/1024; //上記を電圧mVに変換
    //ここで5000.0でなく5000とすると、整数としてvinputにキャストされてしまう)
    //粗い値になったり、おかしな値になったりする
    
    Serial.print(ainput);
    Serial.println(" bit"); //" bit"と表示、printではなくprintlnとすることで改行する
    
    Serial.print(vinput);
    Serial.println(" mV"); //" mV"と表示、printではなくprintlnとすることで改行する
    
    delay(2000); //2000ミリ秒=2秒の停止
}

 

このように見えます。

 

 

複数チャネル読んでみる

他につなぐものがなければ、ピンA0-A5を全部使って、最大6チャネル分の電圧を読むことができます。後述のマルチブレクサーを使えればスイッチングでさらに拡張できます。ここでは3つ繋いだ例です。このようにたくさん接続していくと、GNDピンが足りなくなることに気付きます。ここでブレッドボードを使います。ブレッドボードは、内側で穴が下図のように電気的につながっていて、分岐が簡単にできます。

 

 

ですので、GNDを全てこのようにつなげてしまいます。

 

 

コードは配列(apins[])を使ってスマートにしましょう。

 

const int apins[3]={A0, A1, A2}; //配列でA0-A2を定義

void setup(void)
{
    /* ----- Setting up serial communication with PC ------ */
    /* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    //何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる    
    }
}

void loop(void)
{
    int cnt1;
    int ainput; //読み取ったbit数:intは整数
    float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数

    for(cnt1=0;cnt1<3;cnt1++)
    {
      ainput=analogRead(apins[cnt1]); //ピンA0-A2から順次、電圧をbitとして読む
      vinput=5000.0*ainput/1024; //上記を電圧mVに変換
      Serial.print("Ch"); Serial.print(cnt1);Serial.print(": "); //チャネル番号を表示
      Serial.print(ainput); //ピンA0から電圧をbitとして読み、表示
      Serial.println(" bit"); //" bit"と表示、printではなくprintlnとすることで改行する
      
      Serial.print("Ch"); Serial.print(cnt1);Serial.print(": "); //チャネル番号を表示
      Serial.print(vinput); //ピンA0から電圧をbitとして読み、電圧に変換して表示
      Serial.println(" V"); //" V"と表示、printではなくprintlnとすることで改行する
    }
    
    Serial.println(""); //結果を見やすいように、ループごとに1行空けましょう
    
    delay(2000); //2000ミリ秒=2秒の停止
}

 

これを走らせると・・・

 

 

この例ではA1, A2に電池をつないでいないのでCh1とCh2には不定値(適当に暴れる値)が出ていますが、電池をつなげばきちんと測れます。

 

これで、10bitという比較的低分解能ながらも、Arduinoで電圧を読むことができました。記録さえできれば(次回、SDカードへの書き込み方を勉強します)、最低限のロガーになります。

 

参考:

ほとんどの種類のArduinoのADCは10bitですが、ARM Cortexプロセッサを搭載したArduino Dueや、Espressif社のESP32というより高機能なマイコンボードは12bitのADCを持っています。ただし、後の回で学ぶように、16bitで読めるモジュールが安く手に入るので、12bit欲しさにこれらを買う必要はありません。

 

 Arduino IDE

 Arduinoを使った開発にはPCが必要です。これを読んでいる「普通の人」は、Windows 10のPCあるいはMacで仕事をしているものと思いますので、Arduino IDEをインストールしてください。現在Ver. 1.8.10のようです。管理人はまだ1.6.12ですが・・・

https://www.arduino.cc/en/main/software

 

Arduinoの接続

 ArduinoをUSBケーブルでPCにつないでください。

 

 

電源はUSBから供給されます(DC 5V)。ArduinoのメインプロセッサであるAtMega328とPCがUSBで通信するために、Arduino UNOには別途、シリアル-USB変換チップが載っています。おそらくケーブルで繋いだだけで、ドライバは勝手にインストールされると思います。数秒たって認識が完了したら、

 

・「ツール」->「ボード」からArduino UNOを選ぶ

 

・「ツール」->「シリアルポート」からCOM X(XはPCが勝手に決める番号)を選ぶ

 

これで接続完了です。なお、Arduino UNO以外を使う場合、この「ボード」から選び直せばよいだけです。

 

注意:

・違うタイプのArduinoを選択した後など、もう一度上記が必要です。スケッチ(プログラムコードのこと)を送ろうとしたらエラーが出る場合、このようなうっかりミスであることが多いです。

・つないでもCOM Xとして現れない場合、一度外してもう一度試してみるなどしてみる。ちなみに、本当にボードがイカれた場合(うっかり電源を+/-間違えてショートさせたなど)は、当然のことながら認識されなくなります。不可逆的に壊さなくても、Arduino端子におかしなものを接続していたりすると認識されないこともあります。

 

 さて、最初はこのようなコードが現れていると思います。

 

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

 

C言語では、「関数」と呼ばれる一連の命令群を組み合わせてプログラムが進んでいきます。通常のC言語ではmain関数という、中心になる命令群があるのですが、Arduinoではsetup()とloop()の二つが基本となります。これらの名前に続けて{}で囲まれた部分が、それぞれの関数の中身になります。最初からコメントが英語で入っているように、Arduinoは立ち上がる、あるいはリセットされると、まずsetup()を1度だけ実行し、その後、無限にloop()を繰り返し実行し続けます。setup()には各種設定などを書き、loop()にはArduinoにさせたい仕事そのもの(たとえば、電圧を読んで記録する、など)になることが多いです。

 

ここで、以下のコードを入力してください。各文の意味はコード中にコメントとして書いてあります。

 

void setup(void)
{
    /* ----- Setting up serial communication with PC ------ */
    /* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    //何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる    
    }
}

void loop(void)
{
    int cnt1; //cnt1という変数を整数(integer)として宣言
    
    Serial.println("Start of every routine");
    
    for(cnt1=0;cnt1<16;cnt1++) //cnt1を0から15まで計16回繰り返す反復構文
    {
      Serial.print("hoge");
    }
    
    Serial.println("!");

    delay(2000); //2000ミリ秒=2秒の停止
}

 

いくつか注意点:

・printとprintlnの違い:後者は最後に改行が入る。

・前にも書きましたが、C/C++では文末にはセミコロン「;」を忘れず

・C言語ではスペースや改行は無視されます。文の途中で改行しても(ふつうしませんが)大丈夫です。

 

ここまでできたら、Arduino IDEウィンドウの左上のほうにある右向き矢印アイコン(「マイコンボードに書き込む」)をクリックしてください。まずコードのコンパイルが始まり、その次にPCとArduinoの通信が始まります。完了のメッセージがでたら、「ツール」->「シリアルモニタ」を開いてください。以下の図のように、2秒に一回、hogehogehoge…がArduinoからPCに送られます。

 

 

これは、プログラムがPC上で実行されているのではなく、ArduinoがPCにテキストを送っているのです。ですので、プログラムファイルがないPCに持っていって接続しても、シリアルモニタを開けばこのようにhogehogehogeと出ます。

 

最終的にロガーを作る際には、ArduinoをPCから切り離して、ArduinoからSDカードに直接書き込むことになるわけですが、いちいちSDカードを抜いてPCに挿して出力を確認、を繰り返さないで開発を進めるために、SDカードに書き込む内容と同じものをこのシリアルモニタにも出力するようなプログラムを書いていきます。ちなみに「シリアルポートに接続できないときは、このループにトラップされる」というループがありますが、PCから切り離してもここで止まることはありません。シリアルポートはArduino上のチップにあります。なお、正規品のArduinoと互換品のArduinoではシリアル-USBチップが異なることがありますが、通常のWindows10 PC環境ならどちらも相違なく自動で認識されると思います。

 

Arduinoとは

 この講座で中心になる物品は「Arduino」と呼ばれるマイコンボードです。マイコンとはMicro-controllerのことで、小さなコンピュータと思えばよいです(注1)。いわゆるPCと違うのは、OSがない(ここがLinux系OSが入っているRaspberry Pi:ラズベリーパイと異なる)一方で、GPIO(General-Purpose Input-Output:汎用出入力)やアナログ入力端子がたくさんあることです。これにより、センサーなど周辺装置とのやりとりが非常に簡単になります。例えば、圧力センサーを持っていても、そのままWindows PCに挿すわけにはいきませんが、Arduinoには直接つなげます。このArduinoに、自作したプログラムを書き込めば、例えば「何秒に一回、電圧を読め」「電圧がある程度以上になったら、この装置を動かせ」など自由に動かすことができます。

 

購入ガイド

 ではまず、Arduinoを買って下さい。Arduinoにはいろいろな種類があります。管理人の最終的なおススメは、Arduino Pro Mini 3.3V 8MHz(小型で省電力)ですが、最初は皆、Arduino Uno R3から入ります。最終的にPro Miniに移ったとしても、ちょっと試作品をつくるときに便利ですから、持っていて損はありません。Made in Italyの正規品は3,000円強しますが、Arduinoは設計がオープンであり、互換品が多く売られています(互換品であって、パ〇モンではありません)。安いものは500円くらいです。私も、2つで1000円くらいのものを買っています。Amazonで「Arduino Uno」と打てば、このようなものがたくさん出てきます。

 

 

一応、本家の製品も。

 

 

どれでもいいので買って下さい。価格が大きく違いますが、基本的にどれも同じです。なお、安いものは中国から簡易包装で直送されることが多いので、ピンが曲がっていたり、ときどき不都合もあるそうです。しかし管理人はこれまで5年間、主なトラブルとはほぼ無縁で来ています。ただ、一度だけ、10個セットのはずが、1個だけ別の部品が入っていたことがあります。こういったことに目くじらを立てる人は正規品を買ったほうがいいでしょう。仮に届いたもののうち70%が壊れていても、まだ正規品より安いのですから。しらすを買ったらパックの中に小さなタコやらイカやらが入っているようなものですので、微笑んで大目に見ましょう。安いですが、たいていの場合、PCとの接続に必要なUSBケーブル(Type A)も同梱されています。(おそらく)どの出品を買っても動作性能は変わらないと思いますが、管理人はHi LetGoという出品元のものをよく買っています。安い一方で、場合によっては届くまでに数週間かかるため、少しでも必要かな?と思うものは複数個、大人買いしておくのがよいです。

 

 Arduinoだけあっても、できることはほとんどありません。基本的な物資として、配線(ジャンパーワイヤ―)とブレッドボードを買って下さい。これらがあると、はんだ付けなしでプロトタイプ(試作品)が作れます。ブレッドボードという穴だらけの板にプスプスとケーブルを挿すと電気的に接続できるというものです。試作品ができたら、ブレッドボードから外して、ユニバーサル基盤等にはんだ付けをして最終版とします。

 

 

 

 なお、以下のような学習セットを買うのもよいです。ただ、このようなセットだとジャンパーワイヤーがまず足りません。ジャンパーワイヤ―は別途買っておくとよいです。オス-オス、オス-メス、メス―オス、メス―メス全ての組み合わせでそれぞれ40本ずつくらいあったほうがよいと思います。

 

 

 上記の他、当然ですが、テスターやニッパーなど、基本的な道具は持っているものとします。この他、必要となるモジュール等は逐次紹介していきます。

 

買ったからには、やらないわけにいかない!なお、上記の通り、Arduinoにはいろいろな種類があります。

見るだけでも楽しいですよ。Arduinoの公式HPはこちら:

https://store.arduino.cc/usa/

 

(注1):Arduino Unoには、AtMega328というプロセッサが使われています。プロセッサ(チップ)そのものは小指の先くらいしかない基盤実装用なので、これで工作をするのは難しく、これに種々の部品(抵抗、コンデンサ、電源装置、などなど)をつけて扱いやすくしたものがArduinoです。また、C++(に類似の言語)でけ書いたプログラムが実行されるよう、ファームウェア・ブートローダ(プログラムを読み込むためのプログラム)が既に入っています。Arduinoそのものについては、山ほど本があるのでそれらを参照してください。なんだかわからなくても言われた通りにすれば進めるブログを目指しています。一度興味を持ったら、Arduinoとは何か、などは自然と情報が入ってくると思います。

 

このブログでは、主に地盤工学のコミュニティ(私の知人と、指導する学生が数名?)を対象に、主にArduinoを使った電子工作で、土質実験室、あるいは原位置観測で役に立つ装置(主にデータロガー)を極めて安価に自作する方法を紹介していきます

 

管理人は、地盤工学の研究のため、2015年ごろからArduinoを使って実験室や原位置観測に必要なデータ取得装置や制御装置を自作しています。電子工作の特別な知識があるわけではないのですが(トランジスタって何?というレベル)、今の世の中は、必要なものを買ってググり、そして粘ればたいていのものが作れるようになっています。しかし、「やってみたいけど、できたらいいけど、やっぱ難しそう」と言う人も多いです。その理由の一つに、「とっつきづらさ」があります。懇切な入門書やウェブサイトはあるのですが、「ゲームをつくってみよう」「植物への自動水やり装置をつくろう」といった例から入ることが多く、「ゲームはいいから、俺は研究に使えるデータロガーを作りたいんだ!」といったニーズを持つ人には、回り道に感じられます。そこで、地盤工学のために(他にも使えるかもしれませんが)役に立つ装置に向って一直線の講座をこのブログで開くことにしました。地盤工学会誌などでこのような講座を開くこともできるかもしれませんが、学会の出版物では具体的な製品の名前を出し、これを買え、とは書けません。しかし、それでは読む人にとってはあまり役に立ちません。このブログは対象者が非常に限られるわけですが、自身の備忘録も兼ねて、プライベート感を隠さず淡々と進めていきます(査読のない文書を書くというのはよいですね)。

 

管理人は、まず原位置観測データを記録するデータロガーを作りたくてArduinoを使った電子工作を始めました。率直に言って、データを取得して記録するだけなら、勉強を始めて数日で習得可能です。問題は、フィールドに放置して、ケアフリーで半年なり1年なり動作を続ける省電力でロバストなシステムをつくることです。これにはそれなりの試行錯誤がありました。今でもよくセンサーの動作が止まることはよくありますが、まあこれは少なくとも工作のせいではない、というところまでは達しました。こういった経験からの私見も交えて執筆していきます。

 

本講座では、まずデータロガーの作成から始めましょう。これができれば、十分な知識がついて、何を参照しながら何ができるのか自然とわかっていくと思います。管理人は、最近はデータの記録だけではなく、電空変換器を用いて、試験装置の載荷制御モジュールもArduinoで作っています。このようにユーザーとのインターフェイスが必要な応用には、PCを用いて、PCとセンサーをつなぐ仲介役としてArduinoなどのマイコンを用いると便利です。こういった例もいずれ紹介できればと思います。

 

以下は、ここまで作って原位置に設置した装置の一例です。このようなものを数時間で作れるようになります。箱やバッテリーなどを除けば、回路そのものは数千円しかかかっていません

 

例1:秋田県での堤防調査:太陽光パネルで給電し、12点に埋設したテンシオメーターの値を毎時計測・記録。

大気圧や気温・地温も同時に記録。2017年より稼働。

 

 

 

例2:同じく秋田県のとある水路にて水位計測中。Sigfoxを使い、札幌のオフィスにてデータを遠隔取得。

加速度センサーにより、傾斜などの異常も検知。

 

 

 

例3:北海道の高速道路切土法面の積雪深を計測。これ一つで、3つの異なる原理で計測しています。

 

 

 

なお、装置の設計等については、「動くのだからこれでよい」という次元の考え方です。おかしな配線・非効率的なコードもあるかもしれません。何か気付く点があれば教えて頂ければ幸いです。

 

 以下が掲載予定です。なお、以下は今後、修正されていくことがあります(ブログが続いていくに従って後から変更されるというのは、ジョージ=オーウェルの小説「1984」に出てくる役人の演説みたいですが)。

 

 

第1部 基礎編:室外(原位置)データロガーをつくろう

 

第1回 はじめに ~ この講座で何がつくれる?室内・室外データロガー、三軸制御装置・・・

第2回 Arduino、その他を買う

第3回 ArduinoのセットアップとPCとの通信

第4回 電圧を読む(その1:ArduinoのADC機能を使う)

第5回 SDカードに記録する:SDカードシールド

第6回 できたものをPCなしで動かすには:給電のイロハ

第7回 時刻を記録する:RTCモジュール

第8回 電圧をより高い分解能で計測する:ADCモジュール

第9回 電圧を出力する:DACモジュール

第10回 多チャンネル化する:マルチプレクサーモジュール

第11回 スイッチの開閉をする:リレーの駆動

第12回 省電力化・長期稼働に向けて:① Arduino Pro Miniの導入と、消費電力

第13回 省電力化・長期稼働に向けて:② スリープとRTCによる復帰

第14回 省電力化・長期稼働に向けて:③ 電源管理モジュール(自作+TPL5110)

第15回 省電力化・長期稼働に向けて:④ 太陽光パネル+チャージコントローラー

第16回 実装に向けて:① ユニバーサル基板

第17回 実装に向けて:② ロガーボックスは奥が深い

第18回:LCD(液晶ディスプレイ)による情報表示

 

第2部 発展編:いろいろなセンサーやモジュールを扱う

 

第19回 ひずみゲージ型センサーからのデータ取得

第20回 温度計測① 熱電対

第21回 温度計測② 温度センサーDS18B20

第22回 温度計測③ 環境センサーBME280/BMP280

第23回 距離計測 赤外線ToFセンサー・超音波センサー

第24回 土壌水分計

25回 水圧計測:SMC PSE570

第26回 水圧計測:TE Connectivity MS5837-30BA

第27回 I2Cマルチプレクサ

第28回 3軸加速度センサーADXL345

第29回 UARTシリアル通信①:Arduino同士の通信

第30回 UARTシリアル通信②:ArduinoとWindows PCの通信

第31回 様々なマイコンボードを使う

第32回 データを転送する①:ESP32によるWiFi通信とAmbientの利用

第33回 データを転送する②:Sigfox (LPWA)

第34回 【番外編】PCを無人操作する裏ワザ:Arduino Micro

 

第3部   実線編(作品例)

 

(思いつくがままに過去の作品をレシピとともに紹介していきます)