実験 RS-485 (3) ArduinoでRS-485に対応する その2 熱電対ADAM-4011
前回、電力量モニタKM-N1-FLKを使って、はんだゴテの消費電流の変化をロギングしました。今回は、電圧や温度を測れるモジュールADAM-4011を使います。
●ADAM-4011のおもなスペック
AdvantechのADAM4000シリーズは、熱電対、白金RTDなどの温度センサ、汎用A-Dコンバータ、D-Aコンバータ、リレーなどを搭載したデータ収集モジュールです。絶縁されたRS-485インターフェースをもちます。デフォルトの通信プロトコルは同社独自のアスキ・コードです。一部のモジュールはModbusが利用できますが、ADAM-4011は対応していません。
- 電源電圧;10~30Vdc
- データ転送速度;1200~38.4kbps
- データ・フォーマット;1スタート・ビット、8ビット・データ、1ストップ・ビット、パリティなし
- 対応熱電対; J、K、T、E、R、S、B
- mV入力;±15、±50、±100、±500mV
- Volt入力;±1、±2.5V
- 電流入力;±20mA(125Ωが必要)
- ディジタル入出力;入力1、出力2
●ユーティリティで機能セット
24V電源をつないだADAM-4011とUSB-RS-485ケーブル・コンバータを接続し、ダウンロードしたユーティリティADAM-4000-5000UtilityをWindows10で起動します。
COM14に見えています。
0番からスキャンすると02で見つかりました。
利用する熱電対はK型なのでJ型から変更しました。Data Areaには読み出した温度が随時更新されています。
●ADAM-4011のコマンド
ADAM-4011で利用できるおもなコマンドです。AAはアドレスです。デリミタは0x0dです。
- %AANNTTCCFF 構成の設定
- $AA2 構成内容の問い合わせ
- $AAF ファームウェアのバージョンの問い合わせ
- $AAM モジュール名の問い合わせ
- #AA アナログ・データ入力の読み出し
- #** すべての入力に対してサンプリングの実行(デリミタ不要)
- $AA4 サンプリング・データの読み込み
●接続
●スケッチ
RS-485の通信は、SoftwareSerial(10、11番ピン)を利用しました。0、1番ピンのUARTはコンソールの表示で使われます。半二重の方向切り替えの3、4番ピンは前回と同じです。ただし、Modbusライブラリでは信号の切り替えの面倒を見てくれたのですが、ここでは手動で切り替えます。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
#define MAX485_DE 3
#define MAX485_RE_NEG 2
void preTransmission() {
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission() {
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup() {
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
Serial.begin(9600);
mySerial.begin(9600);
}
void loop() {
preTransmission() ;
mySerial.print("#**");
mySerial.print("#02\r");
postTransmission() ;
for (int i=0; i<9 ; i++) {
if (mySerial.available()>0){
Serial.print( char(mySerial.read() ) );
}
}
Serial.println();
delay(1000);
}
(※)オシロスコープのキャプチャは#02のデリミタとしてCR/LFを送ったときの状態です。
実行結果です。データシート通りのフォーマットで読み取れています。