1

m arduinoを使用して、加速度計MMA7361Lをblender2.49と相互作用させます。python2.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

これは、arduino ボードが加速度計の値をシリアル ポートに書き込む頻度であるため、少なくとも 40 ミリ秒ごとに実行できることを確認してください。シリアル ポートから十分な頻度でデータを読み取らないと、バッファリングが発生し、serialport.read() に表示される値が、arduino ボードが読み取っている現在の加速度計の値よりも遅れます。それはあまりインタラクティブに見えません。

于 2010-10-07T18:08:36.053 に答える