Я - ладья ie для Ардуино и Python, и в настоящее время я застрял и мне нужна помощь. Моя цель - управлять шаговыми двигателями с помощью python, где шаговые двигатели подключены к Arduino. Arduino подключен к моему p c через последовательное соединение. Я отправил команды в Arduino через Python, и arduino успешно транслирует эти команды для управления двигателями.
Проблема возникает, когда я хочу выполнить несколько движений. Когда я пытаюсь выполнить несколько движений, python отправляет несколько команд движения в Arduino одновременно. Первая команда выполняется, и когда двигатель все еще вращается, последующие команды будут игнорироваться. Это приводит к тому, что двигатели не складываются, и делает невозможным выполнение каждого движения.
Я хочу использовать python для отправки команд шаг за шагом и в нужный момент. Я подумал о следующем обходном пути: я хочу отправить еще одну команду из Python в Arduino, которая извлекает текущее положение шагового двигателя. Имея эту информацию об абсолютной позиции, я смогу рассчитать свои команды python. Настройка Arduino использует библиотеку accelstepper.h.
В моем случае строка "stepperX.currentPosition ()" получит текущую позицию в Arduino. Это работает в Arduino и может быть распечатано на серийном мониторе Arduino. К сожалению, с Python я пока не могу извлечь эту информацию.
С python я использую следующий код. Отправка в порядке, приемная часть не работает для меня.
#Python
# this is what i use as function in the python code to extract the current position
def chkpos_x(self):
self.__send('chkposX')
positioning = self.__receive()
return positioning
# this his how python sends to the arduino with an established connection
def send(self, message):
if not self.is_connected():
print('Can\'t send message. Connect to a port first.')
return
print('Trying to send to ' + self.__serial_port.name + ': \"' + message + '\"')
try:
# str.encode converts a string to ASCII bytes:
self.__serial_port.write(str.encode(message))
except (SerialException, SerialTimeoutException) as e:
self.__serial_port = None
print('Failed to send to serial port ' + self.__serial_port.name + ': ' + str(e))
# this is how python should receive the serial communication
def receive(self):
if self.__serial_port is None:
print('Can\'t receive: Connect to a port first.')
return ''
try:
# readline() stops the program - unless a timeout is specified when constructing the serial port (see connect())
instrument_answer_bytes = self.__serial_port.readline()
instrument_answer = instrument_answer_bytes.decode('utf-8')
#print('Instrument on serial port ' + self.__serial_port.name + ' answered: \"' + instrument_answer + '\"')
return instrument_answer
except (SerialException, SerialTimeoutException) as e:
self.__serial_port = None
#print('Failed to receive from serial port ' + self.__serial_port.name + ': ' + str(e))
return ''
#Arduino
#The arduino converts commands from python with this:
String receivedData;
String command;
int param;
void initSerialConnection() {
Serial.begin(9600);
}
void interpretIncomingData() {
if(!Serial.available()) {
return;
}
receivedData = Serial.readStringUntil('\n');
command = getStringSegment(receivedData, ' ', 0);
if (command.equals("chkposX")){
chkposX();
return;
}
# when it gets the 'chkposX' command it should execute the following
void chkposX() {
long XPOS = stepperX.currentPosition();
Serial.print(XPOS);
}
Я предполагаю, что общие устройства, такие как датчик, на самом деле "реагируют" на указанную команду c, отправленную им через последовательную связь, и возвращают некоторые ответ. Я полагаю, что это не так в моей ситуации с Python / Arduino, и мне нужно извлечь или прочитать переменную 'currentposition' с помощью другой техники.
Может кто-нибудь помочь мне встать на правильный путь или у меня есть идея преодолеть эту проблему? Заранее спасибо.
РЕДАКТИРОВАТЬ предоставлено больше кода, чем раньше