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

Posted

技术标签:

【中文标题】无法通过 USB 向 Arduino 发送/接收数字来控制电机【英文标题】:Cannot send/receive number through USB to Arduino to control a motor 【发布时间】:2018-04-05 16:54:24 【问题描述】:

我有一个使用 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 什么也没收到):

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

【问题讨论】:

没有错误信息? 也许尝试将味精保存为字符串并打印出来看看你实际得到了什么?如果 parseFloat 找到除 float 以外的任何内容,则默认为零 @Hackerman :是的,没有错误信息 @TheEngineer 我确实尝试将其更改为字符串,我的 arduino 代码更改为:char CurrentData;字符串接收=""; int ref_speed; while(Serial.available()>0) CurrentData= Serial.read(); if (CurrentData=='.') ref_speed=receive.toInt();接收=""; else if (CurrentData!=0) 接收 += (char)CurrentData; Serial.println(ref_speed);之后在我的 python 控制台中,我得到了结果: b'25\r\n' b'0.00\r\n' b0.00\r\n' b'25\r\n' 任何解决方案? 【参考方案1】:
    之前有没有进行过沟通? 仔细检查您的连接(交换了 TX 和 RX,忘记了 GND) 尝试使用串行终端(我认为 pyserial 包含一个演示)手动发送数据。 您的 Python 脚本可能正在超时。 您的 Python 脚本可能发送了太多 Serial.parseFloat() 不喜欢的零或控制字符(如果它不喜欢某些东西,它就会停止)。 Alternativley,刚开始使用实际上不尝试解析数字以查看是否有任何数据通过的回显程序:试试this。

【讨论】:

以上是关于无法通过 USB 向 Arduino 发送/接收数字来控制电机的主要内容,如果未能解决你的问题,请参考以下文章

Arduino和Python之间的串行通信发送/接收数据

arduino接收16进制数据?

arduino接收不了16进制数据?

arduino串口接收的问题

arduino怎样向串口发送中文字符

通过 USB 从 Python 到 Arduino 的通信