python和arduino通过串口通信,只接收z

2024-04-24 15:20:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试通过我的笔记本电脑与我的arduino使用USB串行端口进行通信。我使用的是python3.6,带有串行包。我的Python代码的简化版本是:

import serial
import time
with serial.Serial(port="COM3", baudrate=9600) as ser:
    time.sleep(2)
    while True:
        x, y, angle = detectAndDisplay(frame, face_cascade, eyes_cascade)
        if x is not None:
            ser.write((str(x * 100 // 177) + "/n").encode())
            ser.write((str(y * 100 // 133) + "/n").encode())
        if cv.waitKey(10) == 27:
            break

其中函数detectAndDisplay()返回三个int值。值x和y的比例在0和180之间。我想将值x,y发送到arduino,它有以下简化代码:

#include <PID_v1.h>
#include <Servo.h>
Servo Servo_1; 
Servo Servo_2;
double Setpoint_1 = 90;
double Input_1;
double Output_1;

double Setpoint_2 = 90;
double Input_2;
double Output_2;

double Kp_1 = 0.022;
double Ki_1 = 0.012;
double Kd_1 = 0;

double Kp_2 = 0.032;
double Ki_2 = 0.022;
double Kd_2 = 0;

PID PID1(&Input_1, &Output_1, &Setpoint_1, Kp_1, Ki_1, Kd_1, DIRECT);
PID PID2(&Input_2, &Output_2, &Setpoint_2, Kp_2, Ki_2, Kd_2, DIRECT);

int serialCount = 0;
int serialInArray[2];
int posX = 90;
int posY = 90;
int errorX;
int errorY;

void setup() {
    Serial.begin(9600);
    Servo_1.attach(32);
    Servo_2.attach(34);
    PID1.SetMode(AUTOMATIC);
    PID1.SetSampleTime(1);
    PID1.SetOutputLimits(-35, 35);

    PID2.SetMode(AUTOMATIC);
    PID2.SetSampleTime(1);
    PID2.SetOutputLimits(-35, 35);
    Servo_1.write(90);
    Servo_2.write(90);
}

void loop() {
    while(Serial.available() == 0);
    serialInArray[serialCount] = (Serial.read());
    serialCount++;
    if (serialCount > 1){
        Input_1 = serialInArray[1];
        Input_2 = serialInArray[0];
        PID1.Compute();
        PID2.Compute();
        posX = posX + Output_2;
        posY = posY + Output_1;
        Servo_1.write(posX);
        Servo_2.write(posY);
        serialCount = 0;
    }
}

这里我将使用posX和posY的值作为伺服电机的输入。但是,我注意到arduino上接收到了输入,因为它在python脚本启动后就开始做一些事情。然而,一旦收到输入,伺服电机就开始转向零。此行为与我发送的值无关。我错过了什么或者我做错了什么?你知道吗


Tags: inputoutputserialwriteintdoubleservokp