Blender 2.78. Python 3.5. Скрипт работы с COM-портом работает не корректно

Тема в разделе "Arduino & Shields", создана пользователем kocmockocmoc, 11 дек 2016.

  1. kocmockocmoc

    kocmockocmoc Нуб

    Добрый день!
    Пишу визуализатор данных с трехосевого гироскопа. Данные поступают по COM порту в формате *.CSV. (Поток состоит из подобных строк: 'b'0.00,1.22,0.00\n'). Для вытаскивания данных использую библиотеку re. Для работы с COM портом PySerial. Все подключается. Но есть одна проблема: при повторном срабатывании скрипта - микроконтроллер перезагружается и blender тормозит. Итого выходит, что на полторы-две секунды перезагрузки 300мсек сбора данных. Не очень похоже на RealTime систему визуализации.
    Цикл While - Blender Не переваривает и просто отказывается визуализировать.
    Цикл for - визуализирует только последнее значение.
    s.isOpen() - определяется только после s = serial.Serial('COM1', 9600)
    А мне надо как-то один раз только открыть последовательный порт. Может кто подскажет как можно глобально открыть-закрыть порт. и локально работать с данными в Blenderе или как python скрипт исправить?
    Работаю на Arduino MEGA 2560, пробовал отключить автоперезагрузку (100 ОМ между RESET и 5V), но пока не получилось.

    Код (Python):
    import bge
    import serial
    import re
    import time
    cont = bge.logic.getCurrentController() # получить текущий контролер
    obj = cont.owner # получить выделенный объект
    s = serial.Serial('COM1', 9600)
    left = cont.sensors["left"]
    m = [0, 1, 2, 3, 4, 5, 6 , 7, 8, 9]
    line2 = ['1', '1', '1', '1', '1', '1', '1' , '1', '1', '1']
    for i in range(2):
        m[i] = s.readline()
    for i in range(2):
        line2[i] = str(m[i])
    for i in range(2):
        sp = re.split('[^0-9.]+', line2[i])
        x = float(sp[1])
        obj["line_1"] = x
        obj.applyRotation([x,0,0],True)
    https://yadi.sk/d/J0VdidB132yhkL
    Объект Test1. Плитка.
     
  2. rkit

    rkit Гуру

    Это делается перерезанием перемычки RESET-EN.
     
  3. Igor68

    Igor68 Гуру

    Если я правильно понял вам надо выполнять какие-то действия в функциях....
    Код (Python):
    import bge
    import serial
    import re
    import time
    cont = bge.logic.getCurrentController() # получить текущий контролер
    obj = cont.owner # получить выделенный объект
    s = serial.Serial('COM1', 9600)
    left = cont.sensors["left"]
    m = [0, 1, 2, 3, 4, 5, 6 , 7, 8, 9]
    line2 = ['1', '1', '1', '1', '1', '1', '1' , '1', '1', '1']

    #ваша функция
    def Func():
                 global s
                 global m
                 for i in range(2):
                     m[i] = s.readline()

    #вызываем функцию
    Func()
     
    Вызов функции, где применяются глобальные переменные я правильно понял?
    Спасибо!
     
  4. kocmockocmoc

    kocmockocmoc Нуб

    я не понимаю как её перерезать, в интернете про это только словами написано. где это находится - я нашел на плате меги. Но там просто две полоски, Можете подсказать?
     
  5. kocmockocmoc

    kocmockocmoc Нуб

    Тогда она постоянно будет вызываться, скрипт прошел. После этого блендер абсолютно забывает, что делал ДО этого. И снова день сурка. А проблема в том, что при открытии порта - ардуино перезагружается, из-за чего блендер тупит жутко.
     
  6. rkit

    rkit Гуру

    Две контактные площадки, между ними перемычка. Резать ножом.
     
  7. kocmockocmoc

    kocmockocmoc Нуб

    на картинке можете показать?
     
  8. kocmockocmoc

    kocmockocmoc Нуб

    между ними нет контакта, там есть маленькая дорожка, но она прерывается.
     

    Вложения:

    • uPVMrBRv6BE.jpg
      uPVMrBRv6BE.jpg
      Размер файла:
      71,5 КБ
      Просмотров:
      599
  9. rkit

    rkit Гуру

    Дорожка там есть. Не верите мне - проверяйте мультиметром. На фото ничего не видно.
     
  10. UserDefUno

    UserDefUno Нерд

    Извиняюсь что не по теме, но это ужасно, зачем 3 цикла?
    Можно спокойно убрать 2 цикла и вообще не понятно зачем нужны массивы m, line2

    Код (Python):

    import bge
    import serial
    import re
    import time
    cont = bge.logic.getCurrentController() # получить текущий контролер
    obj = cont.owner # получить выделенный объект
    s = serial.Serial('COM1', 9600)
    left = cont.sensors["left"]
    m = [0, 1, 2, 3, 4, 5, 6 , 7, 8, 9]
    line2 = ['1', '1', '1', '1', '1', '1', '1' , '1', '1', '1']

    for i in range(2):
        m[i] = s.readline()
        line2[i] = str(m[i])
        sp = re.split('[^0-9.]+', line2[i])
        x = float(sp[1])
        obj["line_1"] = x
        obj.applyRotation([x,0,0],True)
     
     
  11. UserDefUno

    UserDefUno Нерд

    А можно просто сделать вот так и не особо что-то изменится

    Код (Python):
    import bge
    import serial
    import re
    import time
    cont = bge.logic.getCurrentController() # получить текущий контролер
    obj = cont.owner # получить выделенный объект
    s = serial.Serial('COM1', 9600)
    left = cont.sensors["left"]
    m = [ i for i in range(10)]
    line2 = [ 1 for i in range(10)]

    for i in range(2):
        sp = re.split('[^0-9.]+', str(s.readline()))
        x = float(sp[1])
        obj["line_1"] = x
        obj.applyRotation([x,0,0],True)
     
  12. kocmockocmoc

    kocmockocmoc Нуб

    Решил на другом сайте. Спасибо за советы, но они не туда все