MaxSonar EZ1 超音波距離センサーと Arduino Diecimilaを使用した小さなプロジェクトに取り組んでいます。
MaxSonar プレイグラウンド コードを使用して、区切り記号と共に 0.5 秒ごとにシリアルにインチ数を Arduino に書き込みます。シリアル データを監視すると、出力は次のようになります。
5.13.15.12.123.39.345...
Python 側では、シリアル値を持つ JSON オブジェクトを返す /distance ルートを持つ基本的な Flask アプリがあります。
from flask import Flask
from flask import render_template
import serial
import json
import random
app = Flask(__name__,
static_folder="public",
template_folder="templates")
port = "/dev/tty.usbserial-A6004amR"
ser = serial.Serial(port,9600)
@app.route("/")
def index():
return render_template('index.html')
@app.route("/distance")
def distance():
distance = read_distance_from_serial()
return json.dumps({'distance': distance})
def read_distance_from_serial():
x = ser.read();
a = '';
while x is not '.':
a += x;
x = ser.read()
print(a)
return a
# return random.randint(1, 100)
if __name__ == "__main__":
app.debug = True
app.run()
index.html は、0.5 秒ごとに /distance をポーリングして新しい読み取り値を取得する JS を含む基本的なサイトです。この値を使用すると、ソナーからの距離に応じて変化する興味深い UI を構築できるはずです。
$(document).ready(function() {
window.GO = function() {
this.frequency = 500; // .5 seconds
this.init = function() {
window.setInterval(this.update_distance, 500);
}
this.update_distance = function() {
$.get('/distance', function(response) {
var d = response.distance;
$('#container').animate({"width": d + "%"});
}, 'json')
}
}
go = new GO();
go.init();
});
質問
私が直面している問題は、Python がシリアルから読み取るときに値が存在するという保証がないことです。多くの場合、ポーリングすると、空の値または部分的な値のいずれかが取得されますが、それ以外の場合は適切です。
シリアルデータを一貫してポーリングし、Arduinoシリアル出力から最後の適切な読み取り値を受け取ることができるように、技術を変更するにはどうすればよいですか?