超音波測距+ Pythonデータ処理+視覚的なリアルタイム画像レンダリング

ここに画像の説明を挿入

この記事では、arduinoを使用して超音波測定距離を駆動し、シリアルポート経由でデータをpythonに送信して、データ処理を実行する方法を紹介します。処理結果を図に示します。

準備

超音波モジュール+ Arduino開発ボード+ DuPontのライン番号+ Python開発環境

アイデア

最初にarduinoの車間距離を使用し、データをシリアルポート経由でPythonコードに送信してデータを処理し、画像に描画してリアルタイムで表示します。

超音波モジュールの紹介

ここに画像の説明を挿入
上の図に示すように、VCCは5V電源を提供し、GNDは接地線、TRIGトリガー制御信号入力、ECHOエコー信号出力、およびその他の4つのインターフェースです。

2.回路接続

配線は比較的簡単で、次の順序で接続するだけです。ここに画像の説明を挿入

3.プログラミング

コードはモジュールの原理に従って記述されており、超音波測距中の操作シーケンスは次のとおりです。ここに画像の説明を挿入

上記のタイミング図は、10uS以上のパルストリガー信号を提供するだけでよいことを示しています。モジュールは8つの40kHzサイクルレベルを送信し、エコーを検出します。検出されたら

エコー信号は、エコー信号を出力する。エコー信号のパルス幅は測定距離に比例します。したがって、送信信号から受信エコー信号までの時間間隔を計算できます。

距離に。式:uS / 58 = cmまたはuS / 148 =インチ、または:距離=高レベル時間*音速(340M / S)/ 2;測定周期は60ms以上にすることをお勧めします

エコー信号への送信信号の影響を防ぎます。

注:
1.このモジュールはライブ接続には適していません。ライブ接続が必要な場合は、最初にモジュールのGND端子を接続してください。そうしないと、モジュールの通常の動作に影響します。

2.距離測定中、測定対象の面積は0.5平方メートル以上であり、平面は可能な限り平坦でなければなりません。そうでないと、測定結果に影響を及ぼします。

次のようにコードを記述します。

/**
*    文件: 超声测距.ino      by 零知实验室([url=http://www.lingzhilab.com]www.lingzhilab.com[/url])
*    -^^- 零知开源,让电子制作变得更简单! -^^-
**/
 
 
#define SR04_TRIG        9
#define SR04_ECHO        10
 
// the setup routine runs once when you press reset:
void setup() {
    // put your setup code here, to run once:
         
        pinMode(SR04_TRIG, OUTPUT);
        pinMode(SR04_ECHO, INPUT);
         
        Serial.begin(9600);
}
 
// the loop routine runs over and over again forever:
void loop() {
    // put your main code here, to run repeatedly:
         
        int distance = getDistance();
         
        Serial.print("distance = ");
        Serial.println(distance);
         
        delay(300);
}

シリアルライブラリのインストール

pip install serialをインストールします。しばらくダウンロードしてインストールしてから実行した後も、同じエラーが表示されます。インターネットを確認し、pip install pyserialをインストールする必要があります。

ここに画像の説明を挿入

上記の方法でインストールできない場合は、ダウンロードしてインストールする必要があります。

ではhttps://pypi.org/project/pyserial/#files、そこにここに画像の説明を挿入

Windowsでこのホイール形式のファイルをダウンロードします。wheelファイルについて
pipをインストールしている場合は、最新バージョンにアップグレードする必要があります。
管理者としてcmdを実行し
、PythonインストールディレクトリのScriptsディレクトリに移動します。

cd C:\Program Files\Python36\Scripts
pip install wheel
pip install 路径\文件名.whl: 
pip install C:\Users\0AQZ0\Downloads\matplotlib-2.1.2-cp27-cp27m-win_amd64.whl

上記の経験は、EmbededDriverのブログhttps://blog.csdn.net/u012308586/article/details/89449004からのものです

matplotlibライブラリのインストール

まず、一般的な方法
1. Win + R cmdを入力してCMDウィンドウに入り、python -m pip install -U pip setuptoolsを実行してアップグレードします。
ここに画像の説明を挿入

2. python -m pip install matplotlibと入力して、自動インストールをここに画像の説明を挿入
実行しますインストールパッケージが自動的にダウンロードされます。3.次の図に示すように、python idleと入力してimport matplotlibを実行します。エラーがない場合は、インストール結果が示されます。ここに画像の説明を挿入
次のコードを入力して結果を実行し、インストールが正常であることを証明します

import matplotlib.pyplot as plt
labels='frogs','hogs','dogs','logs'
sizes=15,20,45,10
colors='yellowgreen','gold','lightskyblue','lightcoral'
explode=0,0.1,0,0
plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct='%1.1f%%',shadow=True,startangle=50)
plt.axis('equal')
plt.show()

ここに画像の説明を挿入

上記の方法の由来:Piggymanはpeek-a-boo ブログが好きです最も簡単なmatplotlibインストールチュートリアル
II。特別な方法
私はexeファイルを使用してmatplotlibをインストールすることをお勧めします。ですから、exeインストールをお勧めします。以下の参考資料に、matplotlibのexeインストールファイルのリストを記載します。対応するバージョンのダウンロードを見つけることができます。インストールプロセスは
次のとおりです。1。最初に、適切なバージョンをダウンロードしました
ここに画像の説明を挿入
2.それを開いて、インストールインターフェイスが表示されたら、[次へ]をクリックします
ここに画像の説明を挿入

3.ここで、pythonインストールディレクトリを入力して、[次へ]をクリックしますここに画像の説明を挿入
。4.インストールプロセスのスクリーンショットここに画像の説明を挿入
5.インストールが完了しました。エラーがないかどうかを確認してください。エラーがない場合、インストールは成功しています。
ここに画像の説明を挿入
エラー参照:

エラーが発生した場合:ImportError:matplotlibにはdateutilが必要です。この記事を読むことができます:http://jingyan.baidu.com/article/aa6a2c14d5aa7f0d4c19c4e2.html

エラーが発生した場合:ImportError:matplotlibは
pyparsingを必要とします。この記事を読むことができます:http ://jingyan.baidu.com/article/e4d08ffdd3b9690fd2f60de2.html

上記のエクスペリエンスは、Baiduエクスペリエンスから得られます:Pythonチュートリアル:[55] matplotlibインストールダウンロード方法https://jingyan.baidu.com/article/154b46315523b428ca8f41e2.html

Pythonがシリアルデータコードを読み取る

import serial
 
ser=serial.Serial("COM3",115200,timeout=0.5)	#打开串口
 
while (1):
	ch=ser.read()
	str1=ch.decode("iso-8859-15")	#bytes转str
 
	if(str1):	#判断数据是否为空,很重要
		l=ord(str1)		#str转int,方便数据计算和处理
		print("%x" % l)	
 
	pass

Python画像描画のプログラムコード

import matplotlib.pyplot as plt

ax = []                    # 定义一个 x 轴的空列表用来接收动态的数据
ay = []                    # 定义一个 y 轴的空列表用来接收动态的数据
plt.ion()                  # 开启一个画图的窗口
i=1
while i<1000:
	#print(b)
	if b == "":
		b = 0
		#print(b)
	else:
		b = float(b)
		#print(b)

		ax.append(i)           # 添加 i 到 x 轴的数据中
		i=i+1
		ay.append(b)        # 添加 i 的平方到 y 轴的数据中
		plt.clf()             		 # 清除之前画的图
		plt.plot(ax,ay)        # 画出当前 ax 列表和 ay 列表中的值的图形
		plt.pause(0.1)         # 暂停一秒
		plt.ioff()             # 关闭画图的窗口



描かれた画像は以下の通りここに画像の説明を挿入

全体的なコード

arduinoコード:

int TrgPin = A0;
int EcoPin = A1;
float dist;
void setup()
{   
  Serial.begin(9600);
  //设置TrgPin为输出状态
  pinMode(TrgPin, OUTPUT);
  // 设置EcoPin为输入状态
  pinMode(EcoPin, INPUT);
}
void loop()
{
  digitalWrite(TrgPin, LOW);
  delayMicroseconds(8);
  digitalWrite(TrgPin, HIGH);
  // 维持10毫秒高电平用来产生一个脉冲
  delayMicroseconds(10);
  digitalWrite(TrgPin, LOW);
  // 读取脉冲的宽度并换算成距离
  dist = pulseIn(EcoPin, HIGH) / 58.00;
  Serial.print("Distance:");
  Serial.print(dist);
  Serial.println("cm");
  delay(300);
}

Pythonコード:

import matplotlib.pyplot as plt
import serial

serialPort = "COM4"  # 串口
baudRate = 9600  # 波特率
ser = serial.Serial(serialPort, baudRate, timeout=0.1)
#print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))


ax = []                    # 定义一个 x 轴的空列表用来接收动态的数据
ay = []                    # 定义一个 y 轴的空列表用来接收动态的数据
plt.ion()                  # 开启一个画图的窗口
i=1

while i<1000:
	str1 = ser.readline()
	str1 = str(str1)
	b = str1.lstrip("b'")
	b = b.lstrip("Distance:")
	b = b.rstrip("'")
	b = b.replace('\\n', '').replace('\\r', '')
	b = b.lstrip()
	b = b.replace('cm', '')
	b = b.lstrip()
	#print(b)
	if b == "":
		b = 0
		#print(b)
	else:
		b = float(b)
		#print(b)

		ax.append(i)           # 添加 i 到 x 轴的数据中
		i=i+1
		ay.append(b)        # 添加 i 的平方到 y 轴的数据中
		plt.clf()             		 # 清除之前画的图
		plt.plot(ax,ay)        # 画出当前 ax 列表和 ay 列表中的值的图形
		plt.pause(0.1)         # 暂停一秒
		plt.ioff()             # 关闭画图的窗口

while 1:
	print("处理完毕!")

上記はこの記事の内容全体です。詳細については、私に従ってくださいここに画像の説明を挿入

153の元の記事を公開 248のような 330,000以上の 訪問

おすすめ

転載: blog.csdn.net/qq_45172832/article/details/105378322