Отправка данных из Python в Arduino через последовательный порт - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь заставить Arduino запускать реле, если на последовательном порту читается символ "s".Эти символы "s" отправляются python на основе изображения, считываемого с экрана.

Моя проблема в том, что arduino не может читать с последовательного порта, поскольку он никогда не выполняет условие if.Я предполагаю, что между ними есть какая-то тупиковая ситуация (вот почему я помещаю ardu.close () в функцию foo)

Это мой код arduino:

char serial;
#define RELAY1  7                        
void setup()

{    


Serial.begin(9600);
  pinMode(RELAY1, OUTPUT);       

}

  void loop()

{


if(Serial.available() > 0){
    serial = Serial.read();
    //Serial.print(serial);
    if(serial=='s'){
      digitalWrite(RELAY1,0);           
   Serial.println("Light ON");
   delay(2000);                                      

   digitalWrite(RELAY1,1);          
   Serial.println("Light OFF");
   delay(2000);
      }
      } 
}

Этомой код Python:

import time
import serial
#from serial import serial
import cv2
import mss
import numpy
import pytesseract

def foo():
    print("sent")
    ardu= serial.Serial('COM6',9600, timeout=.1)
    time.sleep(1)
    ardu.write('s'.encode())
    time.sleep(1)
    ardu.close()


foo()

1 Ответ

0 голосов
/ 07 октября 2018

Для связи с платой Arduino с компьютера Windows необходимо установить PySerial .См. Инструкции по установке PySerial на вашем компьютере: Веб-сайт PySerial

И убедитесь, что вы установили правильный драйвер последовательного порта для вашей платы.Это должно быть установлено с вашей платой программного обеспечения.Но, если вам нужно сделать это вручную, вот две ссылки, которые могут быть полезны: Инструкции для драйвера Sparkfun и Инструкции для драйвера Arduino

Затем убедитесь, чтовы используете правильный ком-порт.Запустите вашу arduino IDE, загрузите вашу программу в arduino, а затем в меню Tool (в IDE) установите com-порт и запустите последовательный монитор.Затем на последовательном мониторе введите 's' и убедитесь, что вы видите свет и сообщения о выключении.

Вот ваши коды arduino и python, сведенные к минимальному набору инструкций для демонстрации вашего примера.плюс оператор println () (в коде arduino) для отображения полученных символов в шестнадцатеричном виде.Это утверждение отладки поможет вам разобраться с переводами строки и т. Д. При разработке кода.

Коды, перечисленные здесь, работают на моей плате и на машине Linux после изменения номера контакта для реле и устройства.название для порта.Функция close () закомментирована только для того, чтобы показать вам, что она работает без этой строки.

На arduino:

#include <stdlib.h>

char serial;
#define RELAY1  7                       
void setup()
{    
  Serial.begin(9600);
  pinMode(RELAY1, OUTPUT);       
}

void loop()
{
  if(Serial.available() > 0)
  {
      serial = Serial.read();
      Serial.println( serial, HEX);
      if (serial=='s')
      {
        digitalWrite(RELAY1,0);           
        Serial.println("Light ON");
        delay(2000);                                      
        digitalWrite(RELAY1,1);          
        Serial.println("Light OFF");
        delay(2000);
      }
   } 
}

Код Python:

import time
import serial

def foo():
    print("sent")
    ardu= serial.Serial('/dev/ttyACM0',9600, timeout=.1)
    time.sleep(1)
    ardu.write('s'.encode())
    time.sleep(1)
    #ardu.close()


foo()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...