隨著VR,AR,MR的普及,人們對虛擬與現(xiàn)實場景的互動需求日益提高。在VR AR MR 體驗的過程中,人們需要與現(xiàn)實場景進行互動,聲光,觸覺,味覺的建立都是急待發(fā)展的方向。
對于觸覺方面,需要的是形狀的快速建立,這就需要一些可變的平面。該作品對平面進行分割,來動態(tài)立體的生成可變的平面,來滿足VR,AR,MR中對平面形狀改變的觸感要求。
在教育方面,該平面可以迅速生成一些需要立體考量的平面(如地理等高線圖,數(shù)學函數(shù)的曲面建立,甚至是一些晦澀難懂的符號語言(如易經(jīng)))都可以通過這個作品快速呈現(xiàn)出來。以達到更加簡易的目的。
在AI應用方面,平面的像素格子上安置了壓力傳感器,可以通過機器學習,來監(jiān)控平面上的壓力變化,從而學習平面的形狀。
手繪的設計圖紙如上,陰影部分是下面的軸套,上面的六棱柱作為該平面的像素可以由下方的步進電機驅(qū)動,通過這些六棱柱的升降來起到動態(tài)模擬平面的作用。六棱柱表面上有壓力傳感器,可以傳輸數(shù)據(jù)到電腦上,動態(tài)顯示壓力感應情況。
上面是由3D One設計的骨架圖和渲染過后的圖紙,可以直接用3D打印或者激光切割拼接來直接做成實體的外殼。
這里的像素設計是受到了蜂巢的啟發(fā),對于一個平面,可以鋪滿整個平面的只有,三角形,正方形,六邊形,其他的相同圖形去鋪滿平面都會產(chǎn)生一定的空隙。另外,正六邊形不僅堅固而且很美觀,有科技感。我們分別采用紙作為材料,對三棱柱,四棱柱,圓柱,六棱柱進行測試,發(fā)現(xiàn)六棱柱作為這里的像素用材少,強度高,適合作為軸套和像素點。
材料上,我們使用亞克力板材作為棱柱的材料和軸套,使用熱熔膠對亞克力板材進行固定。下面的版本是測試版,是用硬紙板做出的。
電路部分
因為需要控制的步進電機與傳感器接收的IO口比較多,所以并未考慮使用arduino的其他板子作為主控板。選用兩個arduino mega2560,一個作為所有步進電機的主控制器,另一個作為所有壓力傳感器的主接收器,分別控制和接收信號。驅(qū)動板有多種選擇
其中easy Driver 是比較好的選擇。
檢查了Fritzing的實例庫,里面有控制步進電機的一種面包板的接線方法如圖,采取的主控板是arduino uno.模仿這里的接線那么
終采用arduino mega2560 和easy driver V4.4 這樣的組合來控制步進電機,只需要占用arduino mega2560 上的兩個額外的I/O口
接線圖如下(另一種采用L298N待測試):
用9V的電池或者恒定電源作為所有步進電機的供電,用5V電源帶動arduino mega2560作為所有步進電機的控制端子。步進電機帶動絲桿推動六棱柱,或者使六棱柱回到初始位置。
程序部分,采用arduino IDE C+ 進行編輯。
通過 easy driver 控制帶絲桿的步進電機對六棱柱像素進行操作。
結(jié)果可以觀看視頻像素縮回和像素挺進來看到
程序如下:
const int dirPin = 22;
const int stepPin = 23;
int speed = 800;
int steps = 0;
//建立控制端子的兩個變量 初始化速度為800 步長初始化為0//
void setup() {
pinMode(dirPin,OUTPUT);
pinMode(stepPin,OUTPUT);
Serial.begin(9600);
}
//初始化IO口引腳 將22,23 端口設定為輸出端子,將波特率初始化為9600 HZ
void loop() {
if (Serial.available()){
char ch = Serial.read();
if(isDigit(ch)){
steps = steps10+ch-'0';
}
else if (ch == '+'){
step(steps);
steps = 0;
}
else if (ch == '-'){
step(-steps);
steps=0;
}
else if (ch == 's'){
speed = steps;
Serial.print("Setting speed to");
Serial.println(steps);
steps = 0;
}
}
}
//通過串口監(jiān)視器輸入正負參數(shù)來控制步進電機的正反轉(zhuǎn),如果輸入s,則速度為0,步進電機停止動作。//
void step(int steps)
{
int stepDelay = 1000/speed;
int stepsLeft;
if (steps>0){
digitalWrite(dirPin,HIGH);
stepsLeft = steps;
}
if (steps<0){
digitalWrite(dirPin,LOW);
stepsLeft = -steps;
}
while(stepsLeft>0)
{
digitalWrite(stepPin,HIGH);
delayMicroseconds(1);
digitalWrite(stepPin,LOW);
delay(stepDelay);
stepsLeft--;
}
}
// 通過剩余步數(shù)調(diào)整輸出信號,從而控制步進電機帶動絲桿完成動作。//
以上是單個像素的控制,而我們想控制的是像素群,我們設計的是25個像素的像素群,所以需要同時給出25個步進電機的參數(shù),于是引入方陣,同時對方陣中的像素編號。
圖中深色部分表示六棱柱像素的突起,淺色部分表示像素縮回。那么將步進電機編號,將控制單個步進電機的程序封裝成函數(shù),就可以用方陣作為輸入進行群體的控制。我們突發(fā)奇想,想用這個顯示器來對易經(jīng)中的八卦進行顯示,顯示的設計圖在文件八卦中。按照這種顯示方法,如果同時有兩個這樣的顯示器,就會發(fā)現(xiàn),八卦在空間上的互補(如乾坤互補)。我們思考后覺得這是一個巧妙的發(fā)現(xiàn),是有待找到它的應用方向的。
反過來,在每一個像素上我們安裝了一些精密的壓力傳感器,這些精密的壓力傳感器又會根據(jù)這些像素運動傳遞回來的壓力來進行反饋,生成反饋方陣。儲存反饋方陣。從而學習這個平面顯示器所感受到的形狀。
加入單個的壓力傳感器程序如下:
const int dirPin = 22;
const int stepPin = 23;
int speed = 800;
int steps = 0;
int s_pin = A0;//設置A0口為壓力傳感讀取口,讀取為整形常量//
int p_pin = 0;
void setup() {
pinMode(dirPin,OUTPUT);
pinMode(stepPin,OUTPUT);
pinMode(s_pin,INPUT);//設置A0口為輸入口//
Serial.begin(9600);
}
void loop() {
p_pin = analogRead(s_pin);
Serial.println(p_pin);//串口監(jiān)視器打印壓力讀取值//
delay(500);
if (Serial.available()){
char ch = Serial.read();
if(isDigit(ch)){
steps = steps10+ch-'0';
}
else if (ch == '+'){
step(steps);
steps = 0;
}
else if (ch == '-'){
step(-steps);
steps=0;
}
else if (ch == 's'){
speed = steps;
Serial.print("Setting speed to");
Serial.println(steps);
steps = 0;
}
}
}
void step(int steps)
{
int stepDelay = 1000/speed;
int stepsLeft;
if (steps>0){
digitalWrite(dirPin,HIGH);
stepsLeft = steps;
}
if (steps<0){
digitalWrite(dirPin,LOW);
stepsLeft = -steps;
}
while(stepsLeft>0)
{
digitalWrite(stepPin,HIGH);
delayMicroseconds(1);
digitalWrite(stepPin,LOW);
delay(stepDelay);
stepsLeft--;
}
}
上述程序讀取壓力傳感器的輸出值到串口監(jiān)視器,因此將壓力傳感器固定在像素的頂端,通過觸碰壓力傳感器陣列,形成讀數(shù)的方陣。
壓力傳感器連線如下:
經(jīng)過查閱書籍,我們發(fā)現(xiàn)彈性膜片型壓力傳感器可以勝任這種高靈敏度的壓力檢測需求。
Keyes 薄膜壓力傳感器是基于新型納米壓敏材料輔以舒適楊式模量的超薄薄膜襯底一次性貼片而成,兼具防水和壓敏雙重功能。當傳感器感知到外界壓力時,傳感器電阻值發(fā)生變化,我們采用電路將傳感器感知壓力變化的壓力信號轉(zhuǎn)換成相應變化強度的電信號輸出。這樣我們就可以通過檢測電信號變化就可以得到壓力變化情況。
下面是實際安裝壓力傳感器的狀態(tài),傳感器動態(tài)情況見視頻
通過反饋的壓力方陣綁定步進電機的控制陣,即可模擬一個平面的形狀。
本文內(nèi)容僅代表作者本人觀點,與i3DOne社區(qū)無關。