如何将int从Python发送到Arduino,以便将其用作neopixel函数setPixelcolor()的参数?

时间:2019-05-26 18:48:05

标签: python arduino

我正在尝试使用PySerial从Python向Arduino发送一个整数,使用.write([data])与Python一起发送,而Serial.read()Serial.readString()在Arduino上接收,然后{{ 1}}和.setPixelColor()点亮矩阵上的LED,其位置对应于arduino发送的.show()(我正在使用Duinofun Neopixel Shield)。

但是它似乎无法正常工作,并且由于端口繁忙,我正在发送数据时无法使用串行监视器。

我尝试自己使用int输入数字,然后将字符串转换为int,最后放入显示LED的函数中。

这样做可以正常工作,但是当我发送一些数据时,所有先前点亮的LED突然熄灭,这仅是据我所知由Arduino板复位引起的。

这是python代码,它只是发送用户选择的int

Serial.readString()

这是Arduino程序的一部分,用于读取传入的数据。

import serial

a = int(input('Enter pixel position : '))
ser = serial.Serial("COM16", 9600)

ser.write([a])

当我发送一些数据时,所有LED都熄灭,除了第一个LED位置与Adafruit_NeoPixel pixels = Adafruit_NeoPixel(40, 6, NEO_GRB + NEO_KHZ800); void setup() { // put your setup code here, to run once: pixels.begin(); Serial.begin(9600); } void loop() { String a = Serial.readString(); int b = a.toInt(); pixels.setPixelColor(b, 30,30,30); pixels.show(); Serial.println(a); delay(1000); } 函数中使用的0对应。

问题是,LED应该点亮到Python发送的相应int(例如,第五个LED点亮int为4)。

2 个答案:

答案 0 :(得分:1)

如果使用可点子安装的软件包pySerialTransfer,则可以真正轻松,可靠地在Ardinos和Python之间进行通信。该程序包是非阻塞的,易于使用,支持可变长度的数据包,可自动分析数据包,并使用CRC-8进行数据包损坏检测。

这是一个示例Python脚本: 从pySerialTransfer导入pySerialTransfer作为txfer

if __name__ == '__main__':
    try:
        link = txfer.SerialTransfer('COM13')

        link.txBuff[0] = 'h'
        link.txBuff[1] = 'i'
        link.txBuff[2] = '\n'

        link.send(3)

        while not link.available():
            if link.status < 0:
                print('ERROR: {}'.format(link.status))

        print('Response received:')

        response = ''
        for index in range(link.bytesRead):
            response += chr(link.rxBuff[index])

        print(response)
        link.close()

    except KeyboardInterrupt:
        link.close()

请注意,Arduino将需要使用库SerialTransfer.h。您可以使用Arduino IDE的库管理器安装SerialTransfer.h。

这是一个示例Arduino草图:

#include "SerialTransfer.h"

SerialTransfer myTransfer;

void setup()
{
  Serial.begin(115200);
  Serial1.begin(115200);
  myTransfer.begin(Serial1);
}

void loop()
{
  myTransfer.txBuff[0] = 'h';
  myTransfer.txBuff[1] = 'i';
  myTransfer.txBuff[2] = '\n';

  myTransfer.sendData(3);
  delay(100);

  if(myTransfer.available())
  {
    Serial.println("New Data");
    for(byte i = 0; i < myTransfer.bytesRead; i++)
      Serial.write(myTransfer.rxBuff[i]);
    Serial.println();
  }
  else if(myTransfer.status < 0)
  {
    Serial.print("ERROR: ");
    Serial.println(myTransfer.status);
  }
}

最后,请注意,您可以使用这些库的组合来传输整数,浮点数,字符等!

答案 1 :(得分:0)

您无需从Python脚本发送int。只需发送一个字符串,然后在Arduino上将其转换回int。另外,如果接收到的值有效,则可以仅在Arduino代码上验证该数字。 Arduino代码的另一个问题是您没有检查串行端口的可用性,该可用性将通过Serial.readString()返回一个空字符串。

下面显示了一种简单的方法,但是您可以将其扩展到其他像素。

Python脚本:

import serial


ser = serial.Serial("COM16", 9600)
while True:
    input_value = input('Enter pixel position: ')
    ser.write(input_value.encode())

Arduino代码:

#define MIN_PIXEL_RANGE 0
#define MAX_PIXEL_RANGE 100

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(40, 6, NEO_GRB + NEO_KHZ800);

void setup()
{
    // put your setup code here, to run once:
    pixels.begin();
    Serial.begin(9600);
}

void loop()
{
    if (Serial.available())
    {
        String a = Serial.readString();
        Serial.print("Received Value: ");
        Serial.println(a);
        int b = a.toInt();
        if ((b >= MIN_PIXEL_RANGE) && (b <= MAX_PIXEL_RANGE))
        {
            pixels.setPixelColor(b, 30, 30, 30);
            pixels.show();
            delay(1000);
        }
    }
}