Как отправить значение из Arduino в Python, а затем использовать это значение

Я занимаюсь созданием робота, который дистанционно управляется с помощью Python для отправки управляющих сообщений через Интернет через простой графический интерфейс.

Часть моего кода работает довольно хорошо, графический интерфейс и системы управления, но я застрял. Я пытаюсь использовать датчик параллакса для получения информации о расстоянии до объектов от Arduino Mega, и отправьте это значение в мой сценарий управления Python для отображения в удаленном графическом интерфейсе.

Основная проблема, с которой я столкнулся, заключается в том, как интегрировать код Python, который будет использовать уже установленный COM-порт с Arduino и отправить сообщение, чтобы сообщить Arduino о опросе датчика пинга, а затем отправить в программу Python, которая получит значение, а затем позвольте мне вставить это значение в мой графический интерфейс.

У меня уже есть этот код для управления Arduino, и он работает с моим простым графическим интерфейсом.

import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)

from PythonCard import model

class MainWindow(model.Background):
    def on_SpdBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
    def on_FBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('F')
       ser.write(chr(spd))
    def on_BBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('B')
       ser.write(chr(spd))
    def on_LBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('L')
       ser.write(chr(spd))
    def on_RBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('R')
       ser.write(chr(spd))
    def on_SBtn_mouseClick(self, event):
       spd = self.components.SpdSpin.value
       ser.write('@')
       ser.write('S')
       ser.write('0')
    def on_PngDisBtn_mouseClick(self, event):
       ser.write('~')
       ser.write('P1')
       ser.write('p2')

app = model.Application(MainWindow)
app.MainLoop()

Что я действительно хотел бы сделать, так это улучшить приведенный выше код и добавить кнопку, чтобы щелкнуть, чтобы сообщить Python отправить сообщение на Arduino, чтобы проверить датчик пинга и вернуть значение. Я очень хорошо разбираюсь в коде Arduino, но я только начал играть с Python в последние две недели.


person grinan barrett    schedule 25.05.2011    source источник


Ответы (3)


По сути, вы просто отправляете подходящую команду на Arduino, как вы уже делаете, но затем ждете, пока Arduino отправит что-то обратно; конец python может выглядеть примерно так

ser.write('foo')
retval = ser.readline() # read a complete line (\r\n or \n terminated), 
    #or you could use read(n) where n is the number of bytes you want (default=1)
ping_data = retval.strip() # strip out the newline, if you read an entire line

конечно, это даст вам строку, вы, вероятно, захотите преобразовать ее в int или float, чтобы использовать ее в вычислениях позже (используйте int(ping_data) или float(ping_data) для строк или struct.unpack в случае, если это последовательность байтов, которую сначала нужно распаковать во что-то разумное, но все зависит от того, как вы представляете данные датчика).

person n42    schedule 25.05.2011

Можете проверить проект Pyduino:

pyduino — это библиотека, которая позволяет вам взаимодействовать с платами Arduino, загруженными протоколом Firmata, из Python. В настоящее время он поддерживает версию 2 протокола Firmata.

person mrkva    schedule 25.05.2011

Во-первых, позвольте мне сказать, что предыдущие ответы хороши, полезны и имеют прямое отношение к делу. Мои комментарии носят более общий характер и применимы ко всем, кто реализует двунаправленный поток данных к Arduino и от него. Основная идея состоит в том, чтобы спроектировать поток данных таким образом, чтобы он был удобочитаемым для человека для данных, поступающих в скетч Arudino, и удобочитаемым для человека для данных, поступающих из скетча Arduino. Это не всегда возможно, но часто это возможно.

Основная идея состоит в том, чтобы несколько раз запустить скетч Arduino с помощью Serial Monitor. Вы можете найти Serial Monitor в меню Tools в меню IDE. Вы также можете нажать Ctrl-Shift-M, чтобы вызвать Serial Monitor.

Serial Monitor отображает то, что вам отправляет скетч Arduino. Однако он также позволяет вводить данные, которые отправляются в скетч Arduino. Другими словами, вы тестируете и отлаживаете обе стороны последовательного потока данных, просто используя Serial Monitor.

Посмотрите, что появляется. Часто бывает очень полезно предположить, что ваш скетч пытается отправить данные обратно через Serial.print(). Несколько заметок. Убедитесь, что скорость передачи, установленная в Serial Monitor, точно соответствует скорости передачи в вашем скетче (почти во всех случаях 9600 — хороший выбор).

Второе замечание является критическим. Вызов последовательного монитора приводит к сбросу платы Arduino. Ваш эскиз начинается сначала (всегда). Это хорошо, потому что каждый раз дает вам новый опыт. Обратите внимание, что вы можете принудительно выполнить сброс, просто установив скорость передачи данных на 9600 (даже если она уже равна 9600). Это позволяет запускать множество тестов в Serial Monitor без необходимости каждый раз перезапускать Serial Monitor.

person Peter Schaeffer    schedule 06.11.2013