从 Python 以输出模式打开 Arduino Pin

Opening Arduino Pin in OUTPUT mode from Python

TLDR:我想用 Python 驱动硬件,并认为我需要 Arduino 来完成这项工作。事实证明,我完全可以在没有 Arduino 的情况下完成工作,所以下面的 post 完全是胡说八道。


我正在寻找与我的第一个 Arduino Uno 板的接口,并希望使用 Python 来完成任务。我想知道是否有人可以帮助我将 Arduino / C 的简单位转换为 Python 来完成任务。任何指针将不胜感激!

这是我正在查看的区块:

#include <Wire.h>

// control pin
int txden = 8;

// data prefix and suffix
byte data_prefix[] = {0x80, 0x83, 0xFF};
byte data_suffix[] = {0x8F};

// 28 bytes
byte all_dark[] = {
  B0000000, B0000000, B0000000, B0000000,
  B0000000, B0000000, B0000000, B0000000,
  B0000000, B0000000, B0000000, B0000000,
  B0000000, B0000000, B0000000, B0000000,
  B0000000, B0000000, B0000000, B0000000,
  B0000000, B0000000, B0000000, B0000000,
  B0000000, B0000000, B0000000, B0000000,                   
};

byte word_to_display[] = {
  B0000000, B0000000, B0101110, B0101010,
  B0111010, B0000000, B0000000, B0100010,
  B0101010, B0111110, B0000000, B0000000,
  B0000010, B0000010, B0111110, B0000000,
  B0000000, B0111110, B0000010, B0111110,
  B0000000, B0000000, B0010110, B0101000,
  B0101000, B0111110, B0000000, B0000000
};

void setup() {
  Serial.begin(9600);  
  pinMode(txden, OUTPUT);
  digitalWrite(txden, HIGH);
  Serial.write(data_prefix, 3);
  Serial.write(all_dark, 28);
  Serial.write(data_suffix, 1);
  delay(3000);
}

void loop() {
  Serial.write(data_prefix, 3);
  Serial.write(word_to_display, 28);
  Serial.write(data_suffix, 1);
  delay(2000);  
}

Arduino IDE 首先解释 setup 函数,然后像游戏引擎(例如 Phaser)一样连续运行 loop 函数。 Serial.write 通过串行端口向外发送二进制数据到我的 flipdot 显示器,然后 flipdots 解释该消息并做出相应的反应。

上面的循环显示在 flipdots 板上:

我的印象是 pyserial 包可能允许我通过相同的 pin 发送相同的字节。据我所知:

import serial

# serial: https://pythonhosted.org/pyserial/pyserial.html#overview

# args: device, bauds, timeout -- baud timeout must be exact
arduino = serial.Serial('COM3', 9600, timeout=.1)

data_prefix = bytearray([0x80, 0x83, 0xFF])

data_suffix = bytearray([0x8F])

all_dark = bytearray([
  0B0000000, 0B0000000, 0B0000000, 0B0000000,
  0B0000000, 0B0000000, 0B0000000, 0B0000000,
  0B0000000, 0B0000000, 0B0000000, 0B0000000,
  0B0000000, 0B0000000, 0B0000000, 0B0000000,
  0B0000000, 0B0000000, 0B0000000, 0B0000000,
  0B0000000, 0B0000000, 0B0000000, 0B0000000,
  0B0000000, 0B0000000, 0B0000000, 0B0000000,
])

word_to_display = bytearray([
  0B0000000, 0B0000000, 0B0101110, 0B0101010,
  0B0111010, 0B0000000, 0B0000000, 0B0100010,
  0B0101010, 0B0111110, 0B0000000, 0B0000000,
  0B0000010, 0B0000010, 0B0111110, 0B0000000,
  0B0000000, 0B0111110, 0B0000010, 0B0111110,
  0B0000000, 0B0000000, 0B0010110, 0B0101000,
  0B0101000, 0B0111110, 0B0000000, 0B0000000,
])

我需要弄清楚如何从 Python 以输出模式打开 Arduino 上的引脚 8。一旦排序完成,我还需要弄清楚如何复制 setup and loop functions and their constituent calls now, including the Serial.write() 方法,该方法将二进制数据写入串行端口以供 flipdot 设备解释。任何指示都会非常有帮助。

I'm under the impression the pyserial package may allow me to send the same bytes through the same pin.

pyserial 可让您通过串行接口发送数据。它与Arduino无关。如果您只想让这个串行数据进入您的显示器,那么根本不需要 Arduino。只需将您的串行线连接到显示器并直接从 PC 发送串行数据。

I also need to figure out how to replicate the setup and loop functions

这很简单。先把你要运行的代码写一遍,然后把你要运行的代码放到一个死循环里,进入死循环。 while(1) 可以很好地创建一个无限循环。 Arduino 上的设置或循环功能没有什么特别之处。它们只是从主函数调用的常规函数​​。 setup 被调用一次,然后 loop 被无限循环调用。

真的不清楚为什么您认为需要让 Arduino 参与进来。如果只是因为您不知道如何将设备连接到 PC,那么 Raspberry Pi 可能是更好的选择,因为它既可以 运行 python 又具有您需要的 GPIO 引脚可以连接东西。第二种选择是在 Arduino 上加载 firmata 并使用 python 中的 pyFirmata 来控制它。您可以 google 这两个术语,有很多关于如何做到这一点的教程。

我认为您对 Arduino 的功能存在一些根本性的误解。也许花一些时间离开这个项目学习一些基础知识,然后 return 一旦你有一些经验并且对所有这些事情的含义有一点理解,这会对你有好处。

更大的问题是为什么要涉及 python?是否有理由需要通过 PC 进行控制?或者只是您不想学习一门新语言?这是两个截然不同的问题,会促使我给你截然不同的回应。如果您需要能够从 PC 控制显示器,那么只需这样做,然后使用您的 Arduino 做其他事情。