Pyserial получает противоречивые данные от Arduino - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь написать код для датчика, который будет прочитан arduino, а затем отправить эти данные на python, чтобы распечатать и сохранить их для последующего анализа. Проблема в том, что когда я смотрю на серийный монитор Arduino, это последовательный поток цифр. Это то, что я хочу, однако, когда он попадает в python, он иногда умножает это число на 100. Это происходит примерно через каждые 4 строки данных. У меня возникают проблемы, когда я пытаюсь выяснить, почему это происходит, основываясь на написанном мной коде и кодах, которые я использовал в качестве руководства.

Arduino

#include <HX711_ADC.h>
#include "CytronMotorDriver.h"


// Configure the motor driver.
CytronMD motor(PWM_DIR, 3, 2);  // PWM = Pin 3, DIR = Pin 2.

int up = HIGH;
int down = LOW;
int dstate = up;
float interval = 12000;
float pretime= 0;
float curtime = 0; 


// LOAD CELL
//HX711 constructor (dout pin, sck pin)
HX711_ADC LoadCell(11, 12);
float force;  
float calforce;
float newtons;


// The setup routine runs once when you press reset.
void setup() {
 Serial.begin(9600);
 LoadCell.begin();
 LoadCell.start(2000); // tare preciscion can be improved by adding a few seconds of stabilising time
 LoadCell.setCalFactor(100); // user set calibration factor (float)
}

// The loop routine runs over and over again forever.
void loop() {

  LoadCell.update();
  force = LoadCell.getData();
  force = (force/285); // Force in (N) // 285 is conversion factor
  calforce = (-1.0389*force)+0.0181, // This is in lbs
  newtons = 4.45*calforce;



  //receive from serial terminal for tare
  if (Serial.available() > 0) {
  char inByte = Serial.read();
  if (inByte == 't') LoadCell.tareNoDelay();
  }

unsigned long curtime = millis();

  if (dstate == up && (curtime - pretime >= interval)) {
    motor.setSpeed(255);  // Run forward at full speed.
    pretime = curtime; 
    dstate = down;


  }

  if (dstate == down && (curtime - pretime >= interval)) {
    motor.setSpeed(-255);  // Run backward at full speed.
    pretime = curtime;
    dstate = up;

  }


  Serial.println(newtons);
}

Выход Arduino 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08

Python

import serial
import csv
import time
from time import localtime, strftime
#import numpy as np
import warnings
import serial.tools.list_ports


__author__ = 'Matt Munn'
arduino_ports = [
    p.device
    for p in serial.tools.list_ports.comports()
    if 'Arduino' in p.description
]
if not arduino_ports:
    raise IOError("No Arduino found - is it plugged in? If so, restart computer.")
if len(arduino_ports) > 1:
    warnings.warn('Multiple Arduinos found - using the first')

Arduino = serial.Serial(arduino_ports[0],9600)

Arduino.flush()
Arduino.reset_input_buffer()

start_time=time.time()

Force = []

outputFileName = "Cycle_Pull_Test_#.csv"
outputFileName = outputFileName.replace("#", strftime("%Y-%m-%d_%H %M %S", localtime()))

with open(outputFileName, 'w',newline='') as outfile:

    outfileWrite = csv.writer(outfile)

    while True:
        while (Arduino.inWaiting()==0):
            pass
        try:
            data = Arduino.readline()
            dataarray = data.decode().rstrip().split(',')
            Arduino.reset_input_buffer()
            Force = round(float(dataarray[0]),3)
            print (Force)
        except (KeyboardInterrupt, SystemExit,IndexError,ValueError):
            pass

        outfileWrite.writerow([Force,"N"])

Выход Python 0,08 8,0 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08 0,08 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08 8,0 0,08

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

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