Как отправить значение из Arduino в Python, а затем использовать это значение - PullRequest
7 голосов
/ 25 мая 2011

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

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

Основная проблема, с которой я сталкиваюсь, заключается в том, как интегрировать код Python, который будет использовать уже установленный COM-порт, с Arduino и отправить сообщение, чтобы сообщить Arduino опросить датчик ping, а затем отправить в программу 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 в последние две недели.

Ответы [ 3 ]

1 голос
/ 26 мая 2011

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

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

1 голос
/ 25 мая 2011

По сути, вы просто отправили бы подходящую команду в 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 в случае, если это последовательность байтов, которую нужно сначала распаковать во что-то вменяемое, но все зависит от того, как вы представляете данные датчика).

0 голосов
/ 06 ноября 2013

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

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

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

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

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

...