メインコンテンツ

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

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

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

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

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

サポート対象のハードウェア

  • アルドゥイーノMKR1000

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

  • Particle Photon (コードと回路図の調整あり)

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

PrototypingWithSonarProximitySensorTSExample_01.png

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

  • 閾値は15cmに設定されています

  • 各平均につき10回の測定が行われます

  • 読み取りフラグが設定され、キャリブレーションパラメーターの読み取りを強制します

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

必要なハードウェア

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

  • HC-SR04ソナーセンサー

  • ジャンパー線(少なくとも4本)

  • LED

  • 小さな抵抗器(100Ω~1kΩ)

  • USBケーブル

チャネル設定

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

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

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

4) ブラウザ ウィンドウを使用してキャリブレーション フィールドに入力します。API キータブからテキストをコピーするか、このテキストをご自分の書き込み API キーで変更できます。各 URL をブラウザのアドレス バーに直接入力し、YOUR WRITE API KEY を自分のチャネルの書き込み 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) ライブラリ マネージャーに Arduino および ESP8266 用の ThingSpeak ライブラリ を追加します。Sketch > Include Library > Manage Libraries を選択します。ThingSpeak を選択してスケッチに追加します。

3) ライブラリ マネージャーに WiFi101 ライブラリを追加します。メモ: ライブラリのバージョン 0.13 を必ずインストールしてください。バージョン 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);
  }