Arduinoからシリアル通信でElasticsearchにデータ送信してみた[その3-Ruby編]
[今回の設計図]
[データの経路]
Arduino(今回はArduino Pro Mini)に接続した6軸ジャイロセンサ(MPU6050)からI2Cで値(今回はRoll, Pitch, Yaw, 温度)を読み込む
Arduinoからパソコン(僕の場合iMac)にシリアル通信でデータを送る
パソコン側のRubyプログラムでシリアル通信を読み込む
同じくRubyプログラムでElasticsearchにデータを書き込む
KibanaでElasticsearchのデータを可視化する
[Rubyプログラム]
[Arduinoからシリアル通信でデータを受け取る]
プログラムを書く前に,今回シリアル通信に必要なgemをインストールする.
gem install serialport
そして今回書いたコードはこちら
require 'serialport' port = '/dev/cu.usbserial-A104US0D' sp = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE) loop.do $sensor_val = sp.readline.chomp print $sensor_val end sp.close
port番号は環境によって違うので自分の環境で確認. spの中の9600の部分はシリアルポートのボーレートなのでArduino側の設定と合わせること. $sensor_valの最後のchompは,そのままreadlineするとついてくる改行コードを取り除くためのコード.
これを動かすとArduinoからのデータがターミナルに表示される.
[RubyからElasticsearchにデータ送信する]
プログラムを書く前に,今回Elasticsearch操作に必要なgemをインストールする.
gem install elasticsearch
そして今回書いたコードがこちら.
require 'elasticsearch' client = Elasticsearch::Client.new({ log: true, hosts: { host: 'localhost' } }) client.cluster.health client.create({ index: 'mpu6050', type: 'mpu6050', id: 1, body: { temp: 21.80, date: Time.now.utc.iso8601 } })
hostは環境によって違うので自分の環境で確認.
今回は同じiMac上で動くElasticsearchなのでlocalhost.
index,typeはテキトーに指定.今回h今回はMPU6050というセンサからデータ取得するのでそのままmpu6050.
tempはサンプルで21.80℃にしてみた.
dateのTime.now.utc.iso8601はElasticsearchのタイムスタンプに合わせるために書いたもの.Elasticsearchのデータフォーマットでいうdate_optional_timeというのになる.
[ArduinoからElasticsearchまでプログラムを繋げる]
上2つのコードを合体させて,ArduinoからElasticsearchまでデータ送信するプログラムにする.
何も考えずにくっつけるだけ.
# coding: utf-8 require 'serialport' require 'elasticsearch' # Arduinoで設定したポート port = '/dev/cu.usbserial-A104US0D' sp = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE) # Elasticsearchで設定したポート client = Elasticsearch::Client.new({ log: true, hosts: { host: 'localhost' } }) client.cluster.health $count = 0 loop do $count += 1 $sensor_val = sp.readline.chomp # ElasticSearch client.create({ index: 'mpu6050', type: 'mpu6050', id: $count, body: { temp: $sensor_val, date: Time.now.utc.iso8601 } }) end sp.close
これを動かすと,ArduinoからElasticsearchにデータが送信される.
つづく

















