1

m 使用 arduino 将加速度计 MMA7361L 与 blender2.49 进行交互。使用 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)

已建立传感器执行器连接.. 实施中未显示错误,但搅拌机立方体未显示任何移动。

4

2 回答 2

1

我不确定您是否遇到了与我制作 python <-> arduino 应用程序时相同的问题,但是...

默认情况下,当在 USB 端口上打开串行连接时,arduino 会自动重置。由于重新启动不是即时的,因此您的 python 程序很可能会在 arduino 开始写入之前完成其 100 次读取周期。

如果这是问题,您可以:

  1. time.sleep(3)打开串行连接后插入(或任何适合您的值)。
  2. 在电路板上的 RESET 和 5V 引脚之间粘贴一个 120 欧姆电阻,如此处所述(将禁用自动复位功能)。

于 2010-10-11T14:06:00.510 回答
1

在您的 python 代码中,您只读取来自串行端口的传感器值 100 次,即每次更新 40 毫秒时的 4 秒传感器数据(根据您的处理代码)。您需要不断读取传感器值并更新场景方向,因此请使用这样的 while 循环:

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

确保这可以至少每 40 毫秒运行一次,因为这是您让 arduino 板将加速度计值写入串行端口的频率。如果您不经常从串行端口读取数据,它将缓冲,导致出现在 serialport.read() 中的值落后于 arduino 板正在读取的当前加速度计值。这看起来不太互动。

于 2010-10-07T18:08:36.053 回答