Назад и далее проблема связи с Python и Arduino - PullRequest
0 голосов
/ 19 марта 2019

Я разрабатываю код, который должен принимать данные от датчика нагрузки и на основе этих данных должен управлять двигателем. Если тензодатчик считывает определенное значение, двигатель должен вращаться в одном направлении, если он читает другое значение, он должен двигаться в другом направлении. Прямо сейчас, если я приложу нагрузку к датчику, двигатель пойдет в одном направлении, а когда нагрузка будет снята, двигатель не пойдет в другую сторону. Вместо этого он продолжает идти в неправильном направлении. У меня также есть Python сохранить данные из ячейки загрузки в CSV-файл и из-за этого я заметил, что значение ячейки загрузки остается на большое число, как 117 ньютонов, даже когда сила от ячейки нагрузки снята. До установления связи между arduino и python выход датчика был включен. Я немного прочитал о дуплексном режиме и подумал, может быть, во лжи моя проблема. Любая помощь в том, почему мое значение Python Force сейчас неверно, было бы здорово.

Я пробовал другой формат для создания моего кода Arduino. Arduino Code 2 работает, лучше, я могу заставить двигатель реагировать на входы на тензодатчике, однако, когда я печатаю данные, поступающие в python, он немного облажается. Это не влияет на мой мотор на удивление, хотя. Я намерен сохранить эти входящие данные для будущего использования и надеялся, что они могут быть очищены. Например, предположим, что у меня есть 5 ньютонов силы, там он будет отображать 5 ньютонов в течение нескольких секунд, затем он увеличится до случайного числа для пары экземпляров, а затем вернется к норме.

Python

import serial
import csv
import time
from time import localtime, strftime
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,timeout=1)
time.sleep(2)


start_time=time.time()

Force = []
Actuator_Signal=[]

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(',')
            Force = round(float(dataarray[0]),3)
            print (Force)

            if Force < 50:
                Arduino.write(b'u')
                print ('up')

            else: 
                Arduino.write(b'd')
                print('down')


        except (KeyboardInterrupt, SystemExit,IndexError,ValueError):
            pass

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

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;
int python_direction = 0;
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() {
  if (Serial.available()>0){
    python_direction = Serial.read();
    Serial.print (python_direction);
    Serial.print (",");
  }
  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 (python_direction == 'u'){
    motor.setSpeed(255);  // Run forward at full speed.

  }
  if (python_direction == 0){
    motor.setSpeed(0);  // Stop motor.

  }
  if (python_direction == 'd'){
    motor.setSpeed(-255);  // Run backward at full speed.


  }




  Serial.println(newtons);
}

Arduino 2

#include <HX711_ADC.h> // HX711 Library
#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;
int python_direction = 0;
float interval = 12000;
float pretime= 0;
float curtime = 0;

HX711_ADC LoadCell(11, 12);

float force;  
float calforce;
float newtons;

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.0); // user set calibration factor (float)


}

void loop() {
  LoadCell.update();

  forceRead();
  actuatorControl();


}void forceRead()
{
  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;
  Serial.println(newtons);


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

void actuatorControl(){

  if (Serial.available()>0){
    python_direction = Serial.read();
    Serial.print (python_direction);
    Serial.print (",");
  }
  if (python_direction == 'd'){
    motor.setSpeed(255);  // Run forward at full speed.

  }
  if (python_direction == 0){
    motor.setSpeed(0);  // Stop motor.

  }
  if (python_direction == 'u'){
    motor.setSpeed(-255);  // Run backward at full speed.


  }
}
...