Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ソナー近接センサーによるプロトタイピング

この例では、ワイヤレス ネットワークに接続された ThingSpeak™ ボードを使用して Arduino® でプロトタイプを作成する方法を説明します。ThingSpeak Communication Library を使用してチャネル データの読み取りと書き込みを行います。この例では、調整可能なしきい値を ThingSpeak から読み取り、近接検出器を作成します。ハードウェアは、ソナー センサー付きの Arduino MKR100 と、オブジェクトが存在することを示すインジケーター LED で構成されています。

センサー プロジェクトのプロトタイピングでは、温度センサーなどのキャリブレーション パラメーターを微調整するために、コードのリフラッシュが複数回必要になる場合があります。ハードウェアの調整は、複雑さが増し信頼性が低下するため、プロジェクトの展開時に扱うことは難しい場合があります。代わりに、キャリブレーション パラメーターを ThingSpeak から読み取って、パラメーターをリアルタイムで変更することができます。ThingSpeak に保存されている調整パラメーターを調整すると、リアルタイムで測定の質を向上させることができます。

サポートされるハードウェア

  • Arduino MKR1000

  • ワイヤレス ネットワークまたはイーサネット接続を伴う Arduino Uno、Mega、Due、Leonardo

  • Particle Photon (コードと回路の調整を伴う)

この例では、ソナー センサーがステープラーを監視し、測定値をチャネルにポストします。ソナー センサーは、音のパルスを送信し、パルスが物体から返ってくるまでにかかる時間を測定することによって機能します。システムは、ThingSpeak から読み取った距離のしきい値を使用し、そのしきい値と測定された距離とを比較します。LED がオンの場合は、ステープラーが存在することを示します。

この例を完了すると、チャネルに近接データと設定が表示されます。ThingSpeak のチャネル ビューには、以下が表示されます。

  • しきい値は 15 cm に設定されている

  • 平均ごとに 10 回の測定が実施されている

  • キャリブレーション パラメーターの読み取りを強制するために読み取りフラグが設定されている

  • データは、誰かが午前 11 時にステープラーを "借り" て、後ほど新しい位置に返したことを示している

前提条件

  1. ThingSpeak チャネルを作成します。最初のフィールドにデータを格納し、デバイス設定を後続のフィールドに格納できます。デバイスの設定には、距離のしきい値、平均を求めるときの測定数、およびデバイスがループごとに設定を更新するかどうかを制御するフラグがあります。

  2. [Channel Settings] ビューで、Field 1、2、3、および 4 を有効にします。それぞれのフィールドには、内容を表すタイトルを指定することもできます。

    ブラウザーがチャネル内のエントリ数を返します。チャネルの作成直後は、3 つの必須のキャリブレーション フィールドを入力すると、1、2、および 3 が表示されます。次のイメージは、最初のフィールドでデータを収集し、Field 2、3、4 にキャリブレーション パラメーターを格納するように構成された 1 つのチャネルを示しています。

  3. [Channel Settings] ビューで、[API Keys] タブ (イメージ内の丸印) に適切な Read API キーと Write API キーが表示されていることを確認します。

  4. ブラウザー ウィンドウを使用してキャリブレーション フィールドに入力します。[API Keys] タブからテキストをコピーするか、またはこのテキストを Write API キーで変更できます。それぞれの URL をブラウザーのアドレス バーに直接入力し、テキストを太字に変更します。

    1. 物体を検出するしきい値を設定します。最初は 50 cm に設定することをお勧めします。

      https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field2=THRESHOLD
      

    2. 平均を求めるための測定数を設定します。

      https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field3=NUMTOAVERAGE
      

    3. デバイスが新しい設定を定期的にチェックするように、制御フラグを設定します。

      https://api.thingspeak.com/update?api_key=YOUR WRITE API KEY&field4=1

必要なハードウェア

  • イーサネットかワイヤレス ネットワーク接続を伴う Arduino MKR1000、または他の Arduino

  • HC-SR04 ソナー センサー

  • ジャンパー ワイヤー (4、5 本以上)

  • LED

  • 小型の抵抗器 (100 Ω ~ 1 kΩ)

  • USB ケーブル

回路図と接続

  1. Vcc を MKR-1000 上の 5 V に接続します。

  2. センサーのグラウンドを Arduino のグラウンドと接続します。

  3. Trig ピンを Arduino のピン 8 に接続します。

  4. 'Echo' ピンを Arduino のピン 12 に接続します。

  5. 抵抗器を Arduino のピン 5 に接続し、その抵抗器をインジケーター LED に接続します。LED の陽極をグラウンドに接続します。

Arduino のプログラミング

  1. 最新の Arduino IDE をダウンロードします。

  2. ThingSpeak Library for Arduino and ESP8266 をライブラリ マネージャーに追加します。

    [スケッチ][ライブラリをインクルード][ライブラリを管理] を選択します。[ThingSpeak] を選択してスケッチに追加します。

  3. ライブラリ マネージャーで WiFi101 ライブラリを追加します。

    メモ

    インストールするライブラリが Version 0.13 であることを確認してください。Version 0.14 にはバグがあり、ポストに失敗する原因となります。

    [スケッチ][ライブラリをインクルード][ライブラリを管理] を選択します。[WiFi101] を選択してスケッチに追加します。

  4. アプリケーションを作成します。

    Arduino IDE で新しいウィンドウを開き、ファイルを保存します。ここに提供されたコードを追加します。ワイヤレス ネットワーク情報、チャネル ID、および API キーを必ず調整してください。

  5. プログラムを正常にアップロードすると、シリアル モニターを使用して出力を監視できるようになります。対象が ThingSpeak に設定されたしきい値よりも近い距離にある場合は、デバイスがチャネルに距離をポストします。平均をとる測定の数をいくつか試して、測定される変動がどう変化するかを確認してください。パラメーターを設定したら、読み取りフラグの値を 1 から 0 に変更できます。デバイスがこのフラグを 0 として読み取ると、パラメーターについての ThingSpeak のチェックが停止し、電力と帯域幅の節約になります。

     コピーと貼り付け用の完全なコード

    1. まず、ライブラリをインクルードし、制御ピンを初期化します。

      #include <ThingSpeak.h>
      #include<WiFi101.h>
      
      #define triggerPin 8
      #define echoPin 12
      #define LEDpin 6
    2. 変数の定義と初期化を行います。ワイヤレス ネットワーク情報、チャネル ID、および API キーを必ず調整してください。チャネル ID は、チャネルのメイン ページの最上部に表示されています。

      // Network information
      const char* ssid = "SSID";
      const char* password = "xxxxxxxxxx";
      
      // thingSpeak information
      char* writeAPIKey = "XXXXXXXXXXXXXXXX";
      char* readAPIKey = "YYYYYYYYYYYYYYYY"; 
      const int channelID = 000000; 
      const unsigned int firstReadFieldNumber = 2;
      const unsigned int secondReadFieldNumber = 3; 
      const unsigned int switchField = 4; // Field number (1-8) to use to change status of device.  Determines if data is read from ThingSpeak.
      
      // Other constants
      const unsigned long postingInterval = 60L * 1000L;   // Post data every 60 seconds
      
      // Global variables
      unsigned long lastConnectionTime = 0;
      long lastUpdateTime = 0;
      float distanceThreshold = 0;
      bool getInfo = 1;  // Set this to zero if you dont want to read data from ThingSpeak anymore (i.e. calibration complete)
      int points = 7; 
      WiFiClient client;   
    3. 入力と出力のピンを初期化し、setup ルーチンでキャリブレーション パラメーターの最初の読み取りを行います。

      void setup() {
        
        Serial.begin (9600); 
        pinMode(triggerPin, OUTPUT); 
        pinMode(LEDpin, OUTPUT);
        pinMode(echoPin, INPUT);
        connectWifi();
        Serial.println("Start");
      
        // Get the initial parameters from ThingSpeak.
        distanceThreshold = readTSData(channelID,firstReadFieldNumber,readAPIKey); 
        points = readTSData(channelID,secondReadFieldNumber,readAPIKey);   
      }
    4. メイン ループの実行のたびに、複数の測定が行われます。データがしばらくの間 ThingSpeak に書き込まれていない場合は、データを出力チャネルに書き込みます。また、読み取りフラグが最後に true として読み取られた場合は、サイクルごとにキャリブレーション データとフラグを確認します。

      void loop() {
        
        float  distance=0;
      
        // Make sure there is an internet connection.
        if(WiFi.status() != WL_CONNECTED){
          
          connectWifi();  
          }
      
           for (uint16_t loops = 0; loops < points; loops++){
            distance += getDistance(triggerPin,echoPin);  //make a measurement, store the sum of all measurements
            delay(5);  
           }
           
           distance = distance/points;
           
          if (distance < distanceThreshold){
            digitalWrite(LEDpin,HIGH);
            }
          
           else{
            
            digitalWrite(LEDpin,LOW); 
            }
            
           
           Serial.println("Ave: "+ String(distance)+ " cm");
            
          if (millis() - lastUpdateTime >=  postingInterval) {  
            
            lastUpdateTime = millis();
            
                 if (!(getInfo==0)){
                  
                  distanceThreshold = readTSData(channelID,firstReadFieldNumber,readAPIKey);
                  points = readTSData(channelID,secondReadFieldNumber,readAPIKey);
                  getInfo = (bool)readTSData(channelID,switchField,readAPIKey);
                  }
                  
             if (distance < distanceThreshold){
              
            // Write data to ThingSpeak channel.
             writeTSData(channelID, 1, distance, writeAPIKey);
             }
             
            }
            
          delay(500);    // Provide some delay between measurements.
          
      }
      
    5. これらの関数を使用して、ThingSpeak に対しデータの読み取りと書き込みを行います。

      int writeTSData(long TSChannel,unsigned int TSField,float data,char* ReadAPIKey){
        int  writeSuccess = ThingSpeak.writeField(TSChannel, TSField, data, writeAPIKey); //write the data to the channel
        return writeSuccess;
      }
      
      // Use this function if you want multiple fields simultaneously.
      /*
      int writeTDData(long TSChannel,unsigned int TSField1,float data1,unsigned int TSField2,data2,char* ReadAPIKey){
        ThingSpeak.setField(TSField1,data1);
        ThingSpeak.setField(TSField1,data2);
         
        writeSuccess = ThingSpeak.writeFields(TSChannel, writeAPIKey);
        return writeSuccess;
      }
      */
       
      float readTSData(long TSChannel,unsigned int TSField,char* ReadAPIKey){
        
        float data = 0;
        
        data = ThingSpeak.readFloatField(TSChannel,TSField,ReadAPIKey);
        Serial.println(" Data read from ThingSpeak "+String(data));
        return data;
      }
    6. getDistance を使用して、センサーから 1 つの測定値を取得します。

      float getDistance(int tPin,int ePin){
        
        long duration, distance;
          
        digitalWrite(tPin, LOW);  // Reset the trigger pin.
        delayMicroseconds(2); 
        digitalWrite(tPin, HIGH);  // Start a measurement.
        delayMicroseconds(10); // 
        digitalWrite(tPin, LOW);   // Complete the pulse.
        duration = pulseIn(ePin, HIGH);  // Wait for a reflection pulse.
        distance = (duration/2) / 29.1;     // Calculate the appropriate distance using the estimated speed of sound.
      
        // This section is useful when debugging the sensor.
      /*
        if (distance >= 200 || distance <= 0){
          Serial.println("Out of range");
        }
        else {
         Serial.print(distance);
         Serial.println(" cm");
        }
        */
        return distance;
      }
    7. 関数 connectWiFi を使用して、デバイスをワイヤレス ネットワークに接続します。

      int connectWifi(){
           
          while (WiFi.status() != WL_CONNECTED) {
             WiFi.begin(ssid, password);
             delay(2500);
             Serial.println("Connecting to WiFi");
          }
          
          Serial.println("Connected");
          ThingSpeak.begin(client);
        }

参考

| | |