Main Content

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

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

この例では、Wi-Fi 接続された Arduino® ボードを使用してThingSpeak™でプロトタイプを作成する方法を示します。

ThingSpeak Communication Library を使用してチャネルデータを読み書きします。この例では、調整可能なしきい値がThingSpeakから読み取られて、近接検出器が作成されます。このハードウェアは、ソナー センサーと物体の存在を示す表示 LED を備えた Arduino MKR100 で構成されています。

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

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

  • Arduino MKR1000

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

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

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

PrototypingWithSonarProximitySensorTSExample_01.png

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

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

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

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

  • データによると、誰かが午前11時にホッチキスを「借り」、後で新しい位置に返却した

必要なハードウェア

  • Arduino MKR1000 またはイーサネットまたはワイヤレス ネットワーク接続を備えたその他の Arduino

  • HC-SR04 ソナーセンサー

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

  • LED

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

  • USB ケーブル

チャネル設定

1) Collect Data in a New Channelに示すように、 ThingSpeakチャネルを作成します。最初のフィールドにデータを保存し、後続のフィールドにデバイス設定を保存します。デバイス設定には、距離のしきい値、平均する測定値の数、デバイスが各ループの設定を更新するかどうかを制御するフラグが含まれます。

2) 「チャネル設定」ビューのフィールド 1、2、3、および 4 を有効にします。フィールドを区別するには、各フィールドにわかりやすい名前を付けます。次のイメージは、最初のフィールドでデータを収集し、Field 2、3、4 にキャリブレーション パラメーターを格納するように構成された 1 つのチャネルを示しています。

3) 「チャネル設定」ビューの「API キー」「」タブから適切な読み取りおよび書き込み API キーをメモします (画像の丸で囲んだ部分)。

4) ブラウザ ウィンドウを使用して調整フィールドに値を入力します。「API キー」タブからテキストをコピーするか、書き込み API キーを使用してこのテキストを変更できます。各 URL をブラウザのアドレス バーに直接入力し、書き込み API キーをチャネルの書き込み API キーに変更します。

a.物体を検出するためのしきい値を設定します (50 cm が適切な開始点です)。

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

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

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

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

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

ブラウザーがチャネル内のエントリ数を返します。チャネルの作成直後は、3 つの必須のキャリブレーション フィールドを入力すると、1、2、および 3 が表示されます。

回路図と接続

1) MKR-1000 の VCC を 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をライブラリ マネージャーに追加します。[Sketch > Include Library > Manage Librariesを選択します。ThingSpeakを選択してスケッチに追加します。

3) WiFi101ライブラリをライブラリ マネージャーに追加します。メモ:« »ライブラリのバージョン 0.13 を必ずインストールしてください。Version 0.14 にはバグがあり、ポストに失敗する原因となります。[Sketch > Include Library > Manage Librariesを選択します。WiFi101を選択してスケッチに追加します。

4) アプリケーションを作成します。Arduino IDE で新しいウィンドウを開き、ファイルを保存します。「コード」セクションに提供されているコードを追加します。無線ネットワーク情報、チャネルID、APIキーは必ず編集してください。

5) プログラムが正常にアップロードされたら、シリアル モニターを使用して出力を監視できます。設定されたしきい値より近い距離に物体が存在する場合、デバイスはその距離をチャネルに通知します。平均をとる測定の数をいくつか試して、測定される変動がどう変化するかを確認してください。パラメーターを設定すると、読み取りフラグの値を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 long 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 don’t 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を使用して、センサーから単一の測定値を取得します。

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);
  }