无法通过USB向Arduino发送/接收号码来控制电机

时间:2018-04-05 16:54:25

标签: python arduino raspberry-pi3 pyserial

我有一个项目使用pyserial将数字发送给Arduino。此数字是RPM(每分钟一轮)。 Arduino将收到这个号码来控制电机(在这里我使用PID控制器)然后将收到的号码Arduino发送回Python控制台。问题是,我试图向Arduino发送浮点数,但它什么也没收到。这是问题所在:

#include <TimerOne.h>
#include <Encoder.h>
#define A 2 //Encoder pins
#define B 3
Encoder encoder(2,3);
//Config pins for motor control:
int pinAIN1 = 9; //Direction
int pinAIN2 = 8; //Direction
int pinPWMA = 5; //Speed
int pinSTBY = 4; //Stanby
float receive;
float tsamp = 0.01;
float xung = 0;
float last_xung = 0;
float current_speed = 0;
float ref_speed ; //The reference speed
float error = 0;
float last_error = 0;
float PID,last_PID;
float Kp =0.15 , Ki =0, Kd = 0.01;

void dotocdo()
{
  if ( ref_speed >= 0)
   {
   digitalWrite(pinAIN1, 1);
   digitalWrite(pinAIN2, 0);
   analogWrite(pinPWMA, PID);
   }

   if ( ref_speed < 0)
   {
     digitalWrite(pinAIN1, 0);
     digitalWrite(pinAIN2, 1);
     analogWrite(pinPWMA, abs(PID));
   }
  float P;
  static float I,D;
  current_speed = 60*(xung-last_xung)/(tsamp*374*4);
  last_xung = xung; 
  Serial.println(current_speed);

  error=abs(ref_speed)-abs(current_speed);
  P = Kp*error;
  D = Kd*(error - last_error)/tsamp;
  I = Ki*error*tsamp; 
  PID = last_PID + P + I + D;
  last_error = error;
  last_PID = PID;
  if (PID >= 255) {PID = 255;}
  if (PID <= -255) {PID = -255;}
}
void setup() {

  Serial.begin(115200);
  pinMode(pinPWMA, OUTPUT);
  pinMode(pinAIN1, OUTPUT);
  pinMode(pinAIN2, OUTPUT);
  pinMode(pinSTBY, OUTPUT);
  pinMode(A, INPUT);
  pinMode(B, INPUT);
  digitalWrite(pinSTBY, 1);
  Timer1.initialize(10000);
  Timer1.attachInterrupt(dotocdo);
}

void loop()
{

    if (Serial.available())
    {
     receive= Serial.parseFloat();
     ref_speed=receive;
     Serial.println(receive);
    }
   xung=encoder.read();

}

这是Raspberry上的Python代码:

import time
import socket
import sys
import serial
import struct

UNO_1 = serial.Serial('/dev/ttyUSB0', 115200)

while (1):
    n=float(25)
    UNO_1.write(bytes(b'%f'%n))
    receive=UNO_1.readline()
    print(receive)

这是错误(Arduino什么也没收到):

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

  1. 之前是否有任何沟通工作?
  2. 仔细检查您的连接(交换TX和RX,忘记GND)
  3. 尝试使用串行终端(我认为pyserial包含了一个演示)来手动发送数据。
  4. 你的Python脚本可能只是超时。
  5. 您的Python脚本可能会发送过多的零或{{}}}不喜欢的控制字符(如果它不喜欢的话会停止)。
  6. Alternativley,刚刚开始使用echo程序,它们实际上并没有尝试解析数字以查看是否有任何数据通过:try Serial.parseFloat()