Python не собирает данные из Arduino правильно (нужна помощь синхронизации) - PullRequest
0 голосов
/ 04 апреля 2019

Мне нужна помощь, чтобы мои выходные данные Arduinos синхронизировались с Python.Я использую аналоговый выход arduinos, подключенный к некоторым фотодиодам, чтобы отслеживать светодиод, проверяя напряжение на каждом фотодиоде, а затем выводя его на питон для обработки.В настоящее время мой код выглядит следующим образом:

//Arduino
float A0vo = 0;  // variable to store the value coming from the sensor
float A1vo = 0;  // variable to store the value coming from the sensor
float A2vo = 0;  // variable to store the value coming from the sensor
float A3vo = 0;  // variable to store the value coming from the sensor
float A4vo = 0;  // variable to store the value coming from the sensor
float A5vo = 0;  // variable to store the value coming from the sensor
float A6vo = 0;  // variable to store the value coming from the sensor
float A7vo = 0;  // variable to store the value coming from the sensor
float A8vo = 0;  // variable to store the value coming from the sensor
float A9vo = 0;  // variable to store the value coming from the sensor
float A10vo = 0;  // variable to store the value coming from the sensor
float A11vo = 0;  // variable to store the value coming from the sensor
float A12vo = 0;  // variable to store the value coming from the sensor
float A13vo = 0;  // variable to store the value coming from the sensor
float A14vo = 0;  // variable to store the value coming from the sensor
float A15vo = 0;  // variable to store the value coming from the sensor
float VT = 0; // variale to store the total value of the voltages from the sensors
float POS = 0; // variable to store the position coeficient of the LED
float FP = 0; // variable to store the final position of the LED
float ZP = 0.52; // change for zero position
float cal[16] = {-24, -21, -18, -15, -12, -9, -6, -3, 0, 3, 6, 9, 12, 15, 18, 21}; //calibration array to corresponding photodiodes position in cm

void setup() {
  Serial.begin(19200); // set baud rate
}

void loop() {
  // read the value from the sensor:
  A0vo = analogRead(A0); // extract voltage at given photodiode
  A1vo = analogRead(A1); // extract voltage at given photodiode
  A2vo = analogRead(A2); // extract voltage at given photodiode
  A3vo = analogRead(A3); // extract voltage at given photodiode
  A4vo = analogRead(A4); // extract voltage at given photodiode
  A5vo = analogRead(A5); // extract voltage at given photodiode
  A6vo = analogRead(A6); // extract voltage at given photodiode
  A7vo = analogRead(A7); // extract voltage at given photodiode
  A8vo = analogRead(A8); // extract voltage at given photodiode
  A9vo = analogRead(A9); // extract voltage at given photodiode
  A10vo = analogRead(A10); // extract voltage at given photodiode
  A11vo = analogRead(A11); // extract voltage at given photodiode
  A12vo = analogRead(A12); // extract voltage at given photodiode
  A13vo = analogRead(A13); // extract voltage at given photodiode
  A14vo = analogRead(A14); // extract voltage at given photodiode
  A15vo = analogRead(A15); // extract voltage at given photodiode
  VT = (A0vo + A1vo + A3vo + A4vo + A5vo + A6vo + A7vo + A8vo + A9vo + A10vo + A11vo + A12vo + A13vo + A14vo + A15vo); // populate total voltage variable
  POS = (A0vo*cal[0] + A1vo*cal[1] + A2vo*cal[2] + A3vo*cal[3] + A4vo*cal[4] + A5vo*cal[5] + A6vo*cal[6] + A7vo*cal[7] + A8vo*cal[8] + A9vo*cal[9] + A10vo*cal[10] + A11vo*cal[11] + A12vo*cal[12] + A13vo*cal[13] + A14vo*cal[14] + A15vo*cal[15]); // populate position coefficent variable
  FP = (POS/VT); // calculate final position
//

  Serial.println(FP+ZP);
delay(10); // set loop delay 1000=1sec for aquistion
}

и

#Python

import serial
import time
import numpy as np
import sys

ser = serial.Serial('COM3', 19200, timeout=0) #config serial port to read


outpl = []
outp = []
outp2 = []
outp3 = []
outp4 = []

TI = 10 #time for data collection to continue for in seconds

t_start = time.time()
t_end = time.time() + TI
while time.time() < t_end:
    try:
        outp = ser.read(3) #reads serial port
        outp2 = np.array([float(i) for i in((outp.decode('utf-8'))).split(',')]) #decodes and prints data
        outp4 = ','.join(str(e) for e in outp2) #converts to pastable format 
        outpl.append(outp2) #
        print(outp4)
        print((int(((time.time()-t_start)/((time.time()+TI)-t_start))*200)), end="\r") #loading in %
        time.sleep(0.01)
    except ValueError: #checks for errors
        pass

print('DONE!')
ser.close() #close serial

Он отлично работает, когда я беру 10 или менее точек данных в секунду, но мне нужно примерно 100 точек в секунду!

Пример последовательного монитора Arduinos:

-5.06
-4.75
-4.35
-3.93
-3.56
-3.15
-2.84
-2.49
-2.17
-1.91
-1.55
-1.21
-0.98
-0.65
-0.42
-0.19
0.09
0.41
0.72
1.08
1.51
1.91
2.30
2.67
3.17
3.60
4.17
4.85
5.44

Пример вывода Pythons:

0.0
0.4
7.0
0.0
0.42
10.0
35.0
0.0
0.2
9.0
0.0
0.24
10.0
15.0
0.0
0.0
7.0
0.0
95.0
0.0
0.74
9.5
3.0
0.0
26.0
0.0
0.04
8.8
0.0
0.0
49.0
0.0
0.22
7.9
2.0
0.0
66.0

Я предполагаю, что мне нужно как-то синхронизировать их обоих, но яЯ не уверен, как это сделать вообще!Любая помощь приветствуется, так как я довольно новичок в подобных вещах.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

С этой строкой outp = ser.read(3) #reads serial port вы читаете 3 байта данных для каждого цикла. Вы уверены, что данные, которые вы отправляете с arduino, не более того?

Может быть, попробовать с ser.readline(), который будет гарантировать, что вы вместо этого читаете завершенную строку?

Надеюсь, это поможет,

0 голосов
/ 04 апреля 2019

Какой Arduino вы используете? Большинство из них имеют частоту процессора 16 МГц, но ESP32 и некоторые другие могут работать на частоте ~ 100-200 МГц. Если вам нужно сэмплировать 16 выводов со скоростью 100 точек в секунду, это может привести к максимальной загрузке процессора. Вы можете проверить, разделив показания между двумя разными Arduinos и увидев, какую максимальную частоту дискретизации вы можете достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...