資料介紹
描述
動機
數據分析是科學、技術、工程和數學 (STEM) 領域的一個關鍵問題。可視化數據的能力對于理解數據并得出結論至關重要。因此,視力受損的學生處于不利地位,可能會不鼓勵從事科學事業。已經開發了許多工具來克服這一挑戰,但是,它們通常依賴于口頭描述或靜態觸覺圖片,這可能會受到限制。據報道,觸覺和聽覺刺激的結合可以提高盲人學生對幾何等視覺主題的學習[1] 。很明顯,需要讓視障者更容易接觸到 STEM 科目,因此在這個項目中,我們的目標是構建一個廉價的3D 跟蹤器,用于動態聽覺數據表示.
計劃
這個想法是構建一個將數學函數(在真實的線、平面或 3D 空間上)轉換為聲音的設備。我們可以通過使用MGC3130芯片的 3D 跟蹤傳感器(例如Flick或Skywriter )檢測用戶手的位置來導航空間。然后可以將記錄的位置用作數學函數的輸入,該數學函數的輸出可以處理成聲音信號。通過將 3D-tracker 連接到Arduino或RaspberryPi可以輕松完成數據采集,然后我們可以處理數據并將輸出發送到聲音處理軟件,例如Supercollider或CSound 。
由于我們打算將其作為一種包容性技術,我們還將嘗試包括視覺和觸覺反饋。為了可視化數據,我們可以使用Processing ,這是一種專門為視覺藝術家開發的簡單編程語言。觸覺反饋可以通過不同的方式來實現。一方面,我們可以使用超聲波換能器在半空中創建觸覺反饋(Ultraino )。另一方面,我們可以使用振動馬達來模擬不同的紋理(Hap2U )。
目前,我們仍然不確定哪種是包含觸覺反饋的最佳方式,但我們會不斷更新。
適用于 Chromebook 的 Arduino、Processing 和 Supercollider
我們項目所需的軟件適用于 Windows、Mac 和 Linux 系統,但不適用于 Chrome OS。如果您使用的是 Chromebook,有一些選項可以解決它。第一個是使用Arduino和Processing的網絡編輯器,不幸的是,Supercollider 沒有在線選項。另一種選擇是CSound Web IDE ,但我們發現 Supercollider 更易于使用。第二種選擇是安裝 Linux,可以通過多種方式完成。最簡單的一種是啟用原生 Chrome OS Linux(測試版)虛擬機并安裝 Linux 應用程序。這種方法的問題是虛擬機仍然存在一些問題,特別是設置音頻不是那么容易,使用 Supercollider 幾乎是不可能的。在 Chromebook 上安裝 Linux 的另一種方法是使用Crouton ,它為我們提供了一個可以更輕松地配置聲音的 Linux 發行版。讓 Supercollider 服務器運行還有一個額外的步驟,將JACK 轉發到 CRAS 。請注意,此方法需要啟用開發者模式,這會使您的 Chromebook 保修失效。
Arduino基礎知識
- 代碼結構
- 變量
- 功能
超級對撞機基礎
客戶端-服務器架構
- 評估線
- 變量
- 基本振蕩器
- 合成器
加工基礎
- 代碼結構
- 變量
- 功能
輕彈/天空作家 (MGC3130)
第一步是獲取位置數據。我們使用Pi Supply的 Flick Large ,但 Pimoroni 的Skywriter可以以相同的方式連接,實際上,兩者都使用相同的 Arduino 庫。Flick 有 8 個公針,兩個用于電源(VCC、GND),兩個用于數據通信(SDA、SCL)和四個數字針(TS、RESET、LED1、LED2)。前四個必須連接到Elegoo (Arduino) UNO R3中的相應引腳,其他四個可以連接到 Elegoo 中的任何數字引腳。下面我們展示了示意圖連接,Skywriter 應該以類似方式連接,除了在這種情況下不存在的 LED 引腳。
為了控制 Flick,我們使用 Pimoroni 的Skywriter 庫。下載后,我們通過將 Skywriter 目錄復制到 Arduino 庫目錄來安裝庫。我們現在可以啟動 Arduino IDE 并開始編碼。一個簡單的例子是跟蹤位置并將其顯示在串行監視器上。為了啟用串行端口上的通信,我們包括接下來的兩個庫
#include
#include
然后我們初始化Arduino板如下
void setup() {
Serial.begin(9600); //Initialise serial communication at 9600 bds
while(!Serial){}; //We wait for the data serial port to start
Serial.println("Hello world!"); //The port is ready!
Skywriter.begin(10,11); //Initialise the Flick with the pins TS=D10 and RESET=D11
Skywriter.onXYZ(handle_xyz); //This method records the position on the Flick and the function handle_xyz manipulates the data.
//We can initialise the LED pins as follows
//pinMode (9, OUTPUT); //Red LED
//pinMode (8, OUTPUT); //Green LED
//We can turn on the green LED to know when the Flick is ready
//digitalWrite (8, HIGH);
}
在這種情況下,Arduino 代碼的循環部分將只包含一行
void loop() {
Skywriter.poll(); //Check if the status of the Flick has changed
}
此行檢查 Flick 的狀態是否已更改。如果沒有發生任何事情,我們將觀察到串行監視器上沒有發生任何事情。如果狀態發生變化,例如將我們的手放在棋盤上,那么我們將觀察到一些動作。最簡單的方法是將位置打印為串行監視器中的元組。以下功能可以解決問題
void handle_xyz(unsigned int x, unsigned int y, unsigned int z){
char buf[17]; //An array of 17 characters 5 for each coordinate and two delimiters
sprintf(buf, "%05u:%05u:%05u",x,y,z); //Record the position on the Flick
Serial.println(buf); //Print the position to the serial port, one line at a time
}
編譯代碼并將其上傳到 Arduino 板后,我們打開串口監視器,應該會看到該行Hello world!
(確保監視器的速度與我們用于初始化串口的速度相匹配,本例中為 9600 bds)。如果我們將手放在 Flick 上并在它周圍移動,那么我們應該會看到該位置一次打印一行。
Arduino 和超級對撞機
為了獲得代表數據的聲音,我們首先需要讓 Arduino 和 Supercollider 相互交談。我們通過串口通信來實現這一點,并通過一個簡單的例子來演示。我們將在 Supercollider 中播放一個簡單的 Synth,并使用 Flick 上的氣輪手勢控制它的頻率。
首先是Arduino代碼。我們像以前一樣初始化電路板,用方法更改行Skywriter.onXYZ();
Skywriter.onAirwheel(handleAirwheel); //This method records an airwheel event and returns a positive/negative value if clockwise/counterclockwise rotation is detedted
我們定義一個變量來控制正弦振蕩器的頻率:
int freq=440;
當檢測到順時針或逆時針旋轉時,該功能handleAirwheel
會增加或減少頻率的值:
void handleAirwheel (int delta){
if(delta>0){ //Increase the frequency if clockwise rotation
if(freq<1000){ //Upper cutoff
freq=freq+1;
}
}else if(delta<0){//Decrease the frequency if counterclockwise rotation
if(freq>1){ //Lower cutoff
freq=freq-1;
}
}
}
我們在代碼的循環部分將頻率的值打印到串口:
void loop() {
Skywriter.poll(); //Check if the status of the Flick has changed
Serial.print(freq); //Print frequency to serial port
Serial.print('a'); //Print a delimiter character
delay(1);
}
我們打印一個分隔符a
來輕松處理數據,并打印一個小的延遲以避免 Supercollider 中的服務器崩潰。一旦我們的 Arduino 代碼在板上運行,我們關閉 IDE,因為只有一個設備可以同時與串行端口通信。然后我們打開 Supercollider IDE 并啟動服務器。我們檢查下一行可用的串行端口
SerialPort.devices; //Check the available ports
帖子窗口(右下角)上的輸出應該類似于[/dev/ttyACM0]
. 然后我們定義一個新的 Serial 變量運行下一行
~port = SerialPort.new("/dev/ttyACM0",9600);
第一個參數對應端口的名稱,第二個參數是速度,確保這與 Arduino 代碼中的速度相匹配。然后我們需要創建一個從 Flick 讀取數據并將其存儲在 Supercollider 變量中的函數
(
~charArray = []; //An array to store the characters printed to the serial port
~getValues = Routine.new({ //The code inside the routine loops indefinitely
var ascii; //Supercollider read the characters in the serial port as ascii, so we need to convert them to numbers
{
ascii = ~port.read.asAscii; //We read the characters one by one and convert them to digits
if(ascii.isDecDigit, {
~charArray = ~charArray.add(ascii)
});
if(ascii == $a, { //We stop reading the characters when Supercollider finds the delimiter 'a'
~val = ~charArray.collect(_.digit).convertDigits; //We collect and combine the digits into a number
~charArray = []; //We empty the array
})
}.loop;
}).play
)
然后我們定義最簡單的合成器,一個正弦波
(
SynthDef.new(\sineWave, { //Name of the Synth
arg freq = 440; //Frequency
var sig; //Output
sig = SinOsc.ar(freq,0,1); //Sine oscillator with frequency freq, phase 0 and amplitude 1
Out.ar(0,sig); //send output signal to the left speaker
}).add;
)
我們播放運行下一行的合成器
~synth = Synth(\sineWave, [\freq, 440]);
然后我們創建一個例程來使用來自 Flick 的數據修改振蕩器的頻率
(
~control = Routine.new({
{
~synth.set(\freq, ~val.linexp(1,1000,20,2000)); //exponential map from (1;1000) to (20,2000)
0.01.wait;
}.loop;
}).play;
)
該例程~control
以指數方式將打印到串行端口的值范圍映射到一個范圍(maximum frequency, minimum frequency)
。當人類以對數方式感知頻率時,我們使用指數圖。
如果一切正常,我們應該聽到這樣的聲音
當我們玩完合成器后,我們停止控制例程并釋放服務器并停止串行通信,評估以下行
~control.stop;
~synth.free;
~port.stop;
Arduino 和處理
將 Arduino 板與 Processing 進行通信使我們能夠可視化我們的數據。通訊也是通過串口實現的。我們將通過一個使用手勢檢測的簡單示例來展示如何做到這一點。Arduino代碼和之前一樣,這次將Skywriter.onAirwheel();
方法替換為
Skywriter.onGesture(handleGesture); //This method records a gesture event up/down/right/left
其中函數handleGesture
定義如下
void handleGesture(unsigned char type){
Serial.println(type,DEC); //Prints 2 left-right, 3 right-left, 4 bottom-top, 5 top-bottom swipe
}
現在要讀取處理中的數據,我們打開 IDE,加載serial
庫,并設置草圖窗口
import processing.serial.*;//load serial library
Serial myPort;//define serial variable
void setup(){
size(400,400);//size of the sketch in pixels
background(255);//white background
myPort = new Serial(this, "/dev/ttyACM0",9600);//Use the same serial port and communication speed used in the Arduino code
myPort.bufferUntil('\n');//Wait for the port to be ready
}
該變量mySerial
必須定義為從我們在 Arduino 代碼中使用的相同端口讀取,并以相同的速度讀取數據。一旦我們建立通信,我們就可以使用串口中的數據。我們將創建一個帶有移動粒子的簡單草圖,該粒子可以在 +/- x 和 y 方向上加速,具體取決于我們在 Flick 上滑動的方向。要讀取mySerial
端口中的數據,我們使用函數serialEvent()
,該函數會在串行端口中有新信息可用時進行注冊并對其進行處理,例如
void serialEvent (Serial myPort){
direction=int(float(myPort.readStringUntil('\n')));//Read the data in the serial port as a string one line at a time, and converts it into a integer
gravity();//Changes the direction of the acceleration depending on the value stored in direction. 2=right, 3=left, 4=up, 5 =down.
}
在這種情況下,我們一次讀取mySerial
端口中的一行數據(這是'\n'
字符所指示的)并將其作為整數存儲在變量中direction
。該函數gravity()
會根據 o 中存儲的值更改加速度,direction
例如,如果我們向右滑動,粒子應該開始向右“下落”,如下面的視頻所示。您可以在代碼部分找到草圖的詳細信息。
處理和超級對撞機
為了聽到和可視化我們的數據,我們需要讓 Processing 和 Supercollider 相互交談。與前面兩個例子不同的是,兩個平臺之間的通信不是通過串口來實現的,而是通過OSC 消息來實現的,它是專門為音樂和表演控制而設計的。我們將展示如何讓這兩個程序與一個簡單的示波器草圖進行對話。讓我們從處理草圖開始。我們首先需要下載oscP5庫并安裝它。在 IDE 上轉到 Sketch->Import Library->Add Library 并查找 oscP5 文件。我們草圖的標題和設置部分應如下所示
import netP5.*;
import oscP5.*;
//Declare osc and supercollider ip address
OscP5 osc;
NetAddress supercollider;
void setup(){
size(800,400);
osc = new OscP5(this,12000); //construct object osc, "this" references the Processing sketch and 12000 is the port at which it talks, this can be any number
supercollider = new NetAddress("127.0.0.1", 57120); //construct object supercollider, 127.0.0.1 is the local IP address and 57120 the port
}
我們應該知道我們正在與之交談的程序的IP地址,在這種情況下,我們正在向supercollider
同一臺計算機上運行的程序發送數據,因此我們使用本地IP地址127.0.0.1和端口號57120。可以獲取此信息通過評估NetAddr.localAddr;
Supercollider 中的線。我們現在必須在 Supercollider 中建立通信。打開 IDE,我們要做的第一件事是使用本地 IP 和我們用于 OSC 的端口號構造一個 Net Address 對象
~processing = NetAddr.new("127.0.0.1",12000); //Construct object processing at the local address 127.0.0.1 and port number 12000
現在我們將產生一個頻率的正弦波,freq
并將這個值發送到處理。我們使用與 Arduino-Supercollider 示例中相同的 Synth,但我們將控制例程更改如下
(
//Change the frequency at random
~fr = rrand(220,3520);
~synth.set(\freq, ~fr);
//Send OSC message to Processing, '/frequency' is the name of the message and ~fr its contents
~processing.sendMsg(
'/frequency', ~fr
);
~fr; //Print the value of the frequency as a sanity check
)
每次我們評估這些線時,我們都會改變正弦波的頻率并將其值發送到處理。要接收消息,我們使用 oscEvent() 函數
void oscEvent(OscMessage theOscMessage){
omega=TWO_PI*float(theOscMessage.get(0).intValue())/(440*width); //convert the frequency value sent as a string from supercollider into an integer and then calculate the angular frequency
}
在這種情況下,我們使用 OSC 消息中的數據來繪制一個角頻率為 的正弦波omega
,這樣 440 Hz 波的一個周期就適合屏幕。我們還想從 Processing 向 Supercollider 發送消息,為此我們使用一個OscMessage
對象。在這種情況下,我們將使用鍵盤上的向上和向下箭頭來增加正弦波的幅度/音量
void keyPressed(){//Registers when a key is pressed and stores it value on the variable key
if(keyCode==UP){//UP,DOWN,RIGHT and LEFT are coded keys
if(amplitude<200){//Increase amplitude
amplitude+=10;
}
}else if(keyCode==DOWN){//Decrease amplitude
if(amplitude>0){
amplitude-=10;
}
}
OscMessage msg = new OscMessage("/amplitude"); //Construct OscMessage object with name /amplitude
msg.add(map(amplitude,0,200,0,1)); //map the amplitude to the [0,1] range and add it to the OSC message
osc.send(msg,supercollider); //send the message
}
我們捕捉到消息并通過評估以下幾行來使用它來增加 Supercollider 中的音量
(
//This routine reads the message /amplitude from processing and uses it to control the volume of the sine wave
OSCdef('volume',{
arg msg;//This variable stores the message
~synth.set(\amp,msg[1]);//component [0] contains the OSC address, [1], [2],... contain the values added to the message
},"/amplitude"); //the OSC message we are listening to
)
為了讓這個示例運行,我們首先在 Processing 中播放草圖,然后評估 Supercollider 代碼。特別是,我們必須運行,OSCdef
以便 Supercollider 監聽來自 Processing 的消息。在下面的視頻中,您可以看到此示例的工作原理,您可以下載代碼以查看詳細信息。
數學之聲
我們現在準備把它們放在一起并聽一些數據。例如,我們可以根據輸出信號的音量來推斷分布的形狀
?
添加觸覺反饋
我們可以通過使用跟蹤數據產生振動來增加另一個層次的感覺。為此,我們為傳感器構建了一個外殼,它允許我們安裝一個顯示器,我們可以使用微型振動電機使其振動。由于這需要定制零件,我們將對外殼進行建模并進行 3D 打印。我們可以使用幾個免費軟件工具來解決這個問題,例如適用于 Linux 的FreeCAD或在線選項Fusion 360和OnShape 。每一個都有幾個在線教程和資源,但在我看來,OnShape 是最容易使用和學習最快的. 您可以在附件部分找到 skywriter 原型案例的 stl 文件。這種情況應該允許在傳感器頂部安裝一塊透明的亞克力板,作為“觸覺顯示器”。我們可以將振動電機粘附在亞克力板上,使用跟蹤數據激活。例如在上面的例子中,我們可以根據每個分布中點的局部密度來增加振動強度。
不幸的是,在使用振動反饋對傳感器進行測試后,我們發現運動跟蹤器在封裝時的準確性并不是那么好。因此,跟蹤數據是嘈雜的,并沒有給出公平的表示。也許,使用不同類型的傳感器可能會很方便,例如 Sparkfun 的ZXgesture傳感器。
參考
[1] Cryer, H. (2013)。“向盲人和弱視學生教授 STEM 科目:文獻回顧和資源”。RNIB 無障礙信息中心,伯明翰:文獻綜述 #6。
?
- 3D打印底盤開源分享
- 3D掃描儀的構建
- 光子時間跟蹤器開源分享
- 螺栓離開跟蹤器和限制器開源分享
- 對象跟蹤器和更新器開源硬件
- 移動水位跟蹤器開源分享
- 超級太陽能跟蹤器開源分享
- 雙軸太陽能跟蹤器開源分享
- 使用Arduino的光跟蹤器
- IV Swinger IV曲線跟蹤器開源分享
- 用于為PV電池構建IV曲線跟蹤器的Arduino屏蔽PCB
- 3D視頻目標分割與快速跟蹤 0次下載
- 2/3通道電源跟蹤器/排序器/監控器
- 基于有源像元傳感器的多用途微型跟蹤器
- 基于雙DSP的電視跟蹤器
- 3D打印技術的種類 2201次閱讀
- 利用ADALM-PLUTO構建單脈沖信號跟蹤器 1150次閱讀
- 車輛跟蹤系統:隨時隨地 1287次閱讀
- 車輛跟蹤系統可用于實時跟蹤的主動數據傳輸 898次閱讀
- 工業應用太陽能跟蹤器設計方案 1470次閱讀
- HarmonyOS如何玩 3d 游戲 2122次閱讀
- 基于LBT01 LoRa的GPS跟蹤器和來自LoRa的BLE信標 3668次閱讀
- 什么是3D成像_3D成像應用 8385次閱讀
- 基于ISA總線和FPGA技術實現模塊化跟蹤器的系統設計 1591次閱讀
- 淺析3D結構光技術 2w次閱讀
- 追溯3D人臉識別背后的技術之源 5412次閱讀
- 一款只通過單個普通的2D攝像頭就能實時捕捉視頻中的3D動作的系統 1.2w次閱讀
- 簡易的3D建模工具Doodle3D制作出你個人專屬的3D模型創作吧 1.9w次閱讀
- Linux跟蹤器如何選擇,學會這招就很簡單了 5089次閱讀
- FAIR和INRIA的合作提出人體姿勢估計新模型,適用于人體3D表面構建 5715次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多