Как получить статистику о текущем положении шагового двигателя на Arduino с python - PullRequest
0 голосов
/ 27 января 2020

Я - ладья 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' с помощью другой техники.

Может кто-нибудь помочь мне встать на правильный путь или у меня есть идея преодолеть эту проблему? Заранее спасибо.

РЕДАКТИРОВАТЬ предоставлено больше кода, чем раньше

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