3DCG屋さんの活動記録

PROFILE ★★こんな人です

映像制作会社でクリエイティブの修行中。日ごろはMaya&AEを中心にいろんなCGソフトを触りながら、TD寄りの作業が好きで、インタラクティブな体験型空間演出をやりたいと模索中。面白いこと新しいこと大好きな『素直』でいつづける

2017年11月2日木曜日

Arduino Blender & Maya Serial通信テスト(Facebook内容転載)


Facebook記事を転載(2016年4月時点の情報です)

Arduino  ->  Serial  ->   Blender
========================

▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️
          for Mac
▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️

【Mac で pyserial】 ★★★
pyserialが動かんわ!!!!かれこれ1ヶ月近くになる
import serialはOKでも、その次serial.Serialが通らない。。
Arduinoにシリアル通信、、できない。
というわけで、win64では諦め、
とりあえずmacで。Blender + pyserialを確立したい
とりあえずmacのpython+Blender環境を刷新。
Blender 2.77に。
python3.5インストール

macにはpython2.7が標準インストールされてるので
それ以外をアンインストール。
●アプリケーションから削除
●アプリケーションに表示のないpythonを削除
  移動/フォルダへ移動 から以下のパスを
/Library/Frameworks/Python.framework/Versions/
 例えば3.4のフォルダを削除して3.5を入れるとかするときなど

pythonの最新版3.51を公式サイトからインストール

pipのインストール
macのターミナルから
easy_install pip
sudo pip3 install pyserial
ここで結果pyserialのインストール先が表示されるので確認
pyserial in /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages
④Blender起動
sys.version
sys.prefix
sys.path.append("ここにserialのパスを入れる")



▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️
▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️

ようやく安定して使えるようになってきた(^^)

安定の使用手順

①Arduino電源再起動(USB抜き差し)
②Blender再起動
③Scriptで一度RunScriptする (シリアルポートの認識?)
  ここでArduinoが反応してチカチカします
④Blender再生→OK



▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️
▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️

Blender でオブジェクトの位置を変数化、
それをpyserialでシリアル通信する。
→Blenderのオブジェクト位置からLEDの明るさ制御


ser.write(b"値.") の値に変数を入れるのに苦労。。。encodeで解決。理由はまだわかりません!!!わら
あと、若干LEDがチカチカするのが気になるけどまた今度

====以下=======================================
import bpy
import serial
import math
ser = serial.Serial("dev/cu.usbmodem1421",9600)

def my_handler(scene):
height = bpy.data.objects['Cube'].location.z
val = math.floor(height)
outPut = str(val)+"." #ArduinoSerialInput needs "." at last
ser.write(outPut.encode())

bpy.app.handlers.frame_change_post.append(my_handler) # Tells blender to load "my_handler" on every new frame

=============================================


<特に pyserial 関係のトラブルシューティング>


blender でpyserialが読み込まれない。。。
原因はBlenderコンソールという、
Blender専用のpythonエディタ上で作業していたから。Mayaも一緒かな?
というわけで、コンソールからフォルダを指定してModuleを読み込めば使えるのか?というわけでエラー時の対処法まとめ


pythonの保存場所は次のコマンドで
import sys
sys.prefix



「Blender のpython」でpip及びpyserialをインストール(ファイルをコピペ?)しなきゃでした ><



▪️
▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️
       for Windows

▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️

【Win で pyserial】 ★★★
・・・pyserialがどーしても使えない(インストールできない)ので
思い切ってpythonのインストールをはじめから。

①完全にアンインストール (最後にフォルダ残りかすも削除)
②新規インストール
ここまでで3分
③pip install pyserial をcmdで実行。OK
    しかしpipのアップグレードしてとのことで言われるままにアップデートを実行。が、その後再度pyserialインストールしようとするが更新されていない感じ。もしかしたら、さきにアップグレードするべき?

=========================
てか、mayaでもpyserialつかえた!!キタコレーー!!!!
★★★★★★★★(´艸`*)★★★★★★★★★★


④site-packagesのsrialフォルダをコピー
⑤mayaのpythonフォルダのLib/site-packagesフォルダがあるので貼る
※ちなみにmayaでsys.prefixでpythonフォルダしらべる
⑥あとはArduinoをインストールして接続(ポート認識のため)
⑥あとはblenderのときとおなじ

import serial
serial.Serial("COM3",9600)

今までは余計なことたくさんしててファイルがおかしくなってたぽい。。クリーンインストールしたら何も問題なさそう(^o^)/

=============================
Windowsでpipのエラー出たとき、
cmdで
python -m pip install

これで一旦反応見る。
必要ならpipのアップグレード。

その後
python -m pip install pyserial
==============================


Mayaでオブジェクトの位置からLEDのPWM制御は完成!
あとはpython APIで処理速度を高めるとこまでマスターしたい。


以下プログラム
◆Arduino
char input[4]; //受信した文字列の格納
int i = 0; //文字数のカウンタ
int val = 0; //受信した数値(変換後)
int ledVal = 0; //LEDにPWM出力する値

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(3,OUTPUT);
pinMode(13,OUTPUT);
}

// シリアル通信で受信したデータを数値に変換
int serialNumVal(){
// データ受信した場合の処理
if (Serial.available()) {
input[i] = Serial.read();
// 文字数が3以上 or 末尾文字がある場合の処理
if (i > 2 || input[i] == '.') {
input[i] = '\0'; // 末尾に終端文字の挿入
val = atoi(input); // 文字列を数値に変換
Serial.write(input); // 文字列を送信
Serial.write("\n");
i = 0; // カウンタの初期化
}
else { i++; }
}
return val;
}

void loop() {
ledVal = serialNumVal();
// A3Pinに通電
analogWrite(3,ledVal);
// 基盤のD13PinLEDを点灯
if(ledVal>100){digitalWrite(13,HIGH);}
else{digitalWrite(13,LOW);}
}

◆Python for maya
##========================================================
## maya で ballオブジェクトのYと連動してシリアル送信 フ
##========================================================

# まずはArduinoにポート接続
#import serial
#ser=serial.Serial('COM3', 9600)
#ser.close() #最後に閉じる

# 次にMayaからシリアル送信する
import maya.cmds as mc

def com():
pos = mc.getAttr("ball.translateY")
ledCheck = str(int(pos))+"."
ser.write(ledCheck.encode())

# HUDでイベント察知して更新
mc.headsUpDisplay( 'ArduinoRunning1', s=1, b=5,lw=100,dw=200, l='AraduinoRunninavga',ev="timeChanged",command="com()") #HUD作成
#mc.headsUpDisplay( 'ArduinoRunning1', s=1, b=5,lw=100,dw=200, l='AraduinoRunninavga',ev="timeChanged",command="com()",e=True) #HUD作成
#mc.headsUpDisplay( 'ArduinoRunning1',rem=True) # 最後に削除

===================
pyserial格納場所

パソコン👉 Cドライブ/python27/Lib/site-packages/serial
MAYA👉 C/program file/auto desk/maya2016/python/Lib/site-packages

コマンドラインでインストールしたあとmayaにフォルダをコピペすると良い?

1 件のコメント:

  1. MacOSでBlender2.8用にpyserialを準備する手順
    ・Blender2.8の対応はpython3.7.0を確認
    ・MacにBlender3.7.0をインストール(手動でインストーラをDL&インストール)
    ・Macにpyseirlaをインストール前に
      今回は綺麗にしたかったので3.7以外を全て削除する
      移動/フォルダへ移動 sys.prefixで調べておいたpythonフォルダへ移動して手動削除
    ・Macにpyserialをインストール(上記記事内のpipから)
    ・あとは、Blender開いて import serialが通らないこと確認して、上記記事内の通り
      用はMac内のpyserialフォルダを、Blenderにsys.path.appendで指定。

    返信削除