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