блендер не реагирует на движение акселерометра - PullRequest
1 голос
/ 07 октября 2010

м, используя arduino для взаимодействия акселерометра MMA7361L с blender2.49.using python 2.62.мой код Arduino:

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.print(analogRead(0)/4, BYTE);    //x-axis
  Serial.print(analogRead(1)/4, BYTE);    //y-axis
  Serial.print(analogRead(2)/4, BYTE);    //z-axis
  delay(40);
}

мой код Python:

import Blender
import GameLogic
import serial

serialport = serial.Serial('COM4', 9600)
ob = Blender.Object.Get ('Cube')
cont=GameLogic.getCurrentController()
own = cont.owner
rotxx = move.dRot[0]
rotyy = move.dRot[1]
rotzz = move.dRot[2]
move = cont.actuators["move"]
Blender.Window.WaitCursor(1)
x=[0,0,0]
for i in range(1, 100):
    x1[0] = serialport.read(size=1)
    x1[1] = serialport.read(size=1)
    x1[2] = serialport.read(size=1)

    x2=[(((m - n)*1.65)/180) for m,n in zip(x,x1)]
    rotxx = rotxx + x2[0]
    rotyy = rotyy + x2[1]
    rotzz = rotzz + x2[2]
    move.dRot=(rotxx,rotyy,rotzz)
    cont.activate(move)
    x1=x

else:
    serialport.close()
    Blender.Window.WaitCursor(0)

установил соединение привода датчика .. ошибок в реализации не показано, но куб Blender не показывает движения.*

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Я не уверен, что вы сталкиваетесь с той же проблемой, с которой я столкнулся при создании приложения python <-> arduino, но ...

По умолчанию, когда на USB-устройстве открывается последовательное соединениепорт, Arduino автоматически сбросит .Поскольку перезагрузка происходит не мгновенно, ваша программа на Python, скорее всего, завершит свой цикл чтения 100 раз, прежде чем arduino даже начнет писать.

Если это проблема, вы можете либо:

  1. Вставьте time.sleep(3) (или любые другие значения, которые вам подходят) после открытия последовательного соединения.
  2. Вставьте 120-омный резистор между RESET и 5В контактами на вашей плате, как описано здесь (это будетотключить функцию автоматического сброса).

HTH!

1 голос
/ 07 октября 2010

В вашем коде Python вы читаете только значения датчика, поступающие через последовательный порт 100 раз, что составляет 4 секунды данных датчика при 40 мс на обновление (согласно вашему коду обработки). Вам необходимо постоянно считывать значения датчика и обновлять ориентацию сцены, поэтому используйте цикл while, подобный следующему:

read_sensors = True
while(read_sensors):
    # call serialport.read() to read current sensor values
    # update scene

Убедитесь, что это может выполняться не реже, чем каждые 40 миллисекунд, поскольку именно так часто у вас плата arduino записывает значения акселерометра в последовательный порт. Если вы не будете читать данные с последовательного порта достаточно часто, они будут буферизоваться, в результате чего значения, появляющиеся в serialport.read (), будут отставать от текущих значений акселерометра, которые читает плата Arduino. Это не будет выглядеть очень интерактивно.

...