Обнаружение пересечения с нулем при последовательной связи с Arduino на Raspberry Pi

#raspberry-pi3 #python-3.5 #arduino-uno

#raspberry-pi3 #python-3.5 #arduino-uno

Вопрос:

Я новичок в Python, и я настраиваю свой школьный проект так, чтобы он обнаруживал пересечение нуля для запуска импульса PWM, поэтому я использую Arduino и Raspberry Pi 3.

Я пытаюсь прочитать с последовательного порта Arduino, чтобы прочитать его в Raspberry Pi, после чего мне нужно создать условие if с теми данными, которые я получил.

Arduino отправляет с последовательного порта ON и OFF сообщение с этим кодом

 const int inputPin = 2;

int value = 0;

void setup() {
  Serial.begin(9600);
  pinMode(inputPin, INPUT_PULLUP);
}

void loop(){
  value = digitalRead(inputPin);  //digital read of pin

  //sends a message to serial port depending of the value read
  if (value == HIGH) {
      Serial.println("ON");
  }
  else {
      Serial.println("OFF");
  }
  delayMicroseconds(1000);
}
  

При последовательном чтении Arduino он отображается непрерывно

 OFF
ON
ON
ON
OFF
  

Итак, на Python я хочу прочитать эти два значения «ВКЛЮЧЕНО» и «ВЫКЛЮЧЕНО» или хотя бы одно, которое when it takes a OFF value например, на next 1 ms нем turn on PWM pulse .

Что-то вроде:

 if zerocross == OFF:
   pi.hardware_PWM(heat,200,dutycycle)
  

Это мой код на Python для чтения данных с последовательного порта:

 import time

try:
    import serial
    arduino = serial.Serial('/dev/ttyACM0', baudrate=9600, timeout=1.0)

    arduino.setDTR(False)
    time.sleep(1)
    arduino.flushInput()
    arduino.setDTR(True)

except (ImportError, serial.SerialException):

    import io

    class FakeArduino(io.RawIOBase):
        def readline(self):
            time.sleep(0.1)
            return b'sensor = 0toutput = 0rn'

    arduino = FakeArduino()


with arduino:
    while True:
        try:
            line = arduino.readline()
            zerocross = line.decode('ascii', errors='replace')#, end=''
            if zerocross == OFF:
            print ('ok')

        except KeyboardInterrupt:
            print("Exiting")
            break

  

это выход в оболочке python

 Traceback (most recent call last):
  File "/home/pi/Desktop/arduino python raspb.py", line 33, in <module>
    if zerocross == OFF:
NameError: name 'OFF' is not defined
  

Я уже пытался преобразовать последовательные данные в строку, но при попытке напечатать значение я получаю «встроенный метод декодирования». Пожалуйста, если кто-нибудь может показать мне какие-то другие методы, я был бы очень признателен.

Комментарии:

1. Если включение и выключение поступают в виде строк (или приводятся как определенный тип данных), вы не сможете сравнить то, как вы пытаетесь (значение переменной со значением переменной).). Ваша ошибка сообщает вам, что она ищет значение OFF как переменную (которая не определена). Попробуйте ‘ВЫКЛ.’ и ‘ВКЛ.’ (представлены в виде строк) и посмотрите, что произойдет . . .

2. Данные с последовательного порта поступают следующим образом

3. Вы пытались преобразовать это в строку? Попробуйте это без кавычек, вы получите аналогичную ошибку: печать («Выход»), вы не знаете, что не выполняется код, меняющий 0 на строку OFF для печати или 1 на ON для печати на экране. ВКЛЮЧЕНО или выключено, скорее всего, как 0 или 1, если оно проходит через порт (эти значения, вероятно, интерпретируются). Попробуйте использовать в качестве строки «OFF» или «OFF» и дайте мне знать, что произойдет. Вы читаете символы, то есть либо строку, либо массив символов для работы, в зависимости от языка.

4. Данные с последовательного порта поступают в оболочку в виде байта без строки «декодировать»: « b’OFF r n’ b’ONrn’ b’ONrn’ b’ONrn’ b’ONrn’ b’OFFr n’ …. «` Я читал, что считывание с последовательного порта осуществляется в виде байтовых данных, поэтому с помощью line.decode (‘ascii’). Я попытаюсь отправить его в виде двоичных данных, как вы сказали, изменив его из кода arduino. Я проверю это и расскажу вам, что произойдет.

5. r — это возврат каретки, а n — новая строка, обе используются в качестве команд при работе со строковым выводом, b — это байт, который на самом деле является шестнадцатеричным представлением двоичного кода (по-видимому, вы можете использовать их с помощью символов ASCII. Таким образом, по сути, b . . . попробуйте это изменение>> zerocross = line.decode (‘UTF-8’), zerocross теперь должен быть строкой, а затем и это изменение >> если zerocross == «OFF»:, дайте мне знать, как это работает для вас