可變電阻控制幾何體形態(Grasshopper、C#腳本、Arduino)

2021-02-19 Rhino原廠

很多同學對硬體控制 GH 很感興趣,正好今天有同學自己寫程序連外設遇到點小問題,那就正好解答問題順帶做個教程了。這位 Zzzz 同學的帖子如下:

http://bbs.shaper3d.com/thread-24815-1-1.html

Read me

本教學中的例子,用 Grasshopper 的 Firefly 插件做是非常簡單的,但是這篇教學不用Firefly,而是用C#寫腳本來實現。

如果不是對C#程序感興趣,只是想做這種控制效果的話,這個教學粗略瀏覽一下,當作了解製作過程就好,然後直接去下載 Firefly,Firefly 使用簡單而且很強大很穩定。Firefly 的中文教程繁體論壇有。

教學

我們要製作的就是通過旋轉可變電阻的旋鈕來改變Grasshopper在場景中生成物件的形態。效果如下:



一、連線和原理概述

我們要用到的材料是一塊Arduino UNO控制板、一個可變電阻,一塊麵包板和若干根電線。

首先按照下圖所示將材料全部連接起來。


上面這張圖中連線的意思是,可變電阻最外面的兩頭,連接在電源上,即紅色線連的是5V的電源輸出,黃色線連接的是GND地線。中間的藍色線是模擬信號,接到控制板的A0模擬信號輸入接口。模擬信號在這裡其實就是電信號,控制板會按照電流或電壓的不同,將這裡輸入的電流和電壓變化翻譯成0到1024之間的數字。

那麼這個例子的整體思路,就是把電阻輸出的模擬信號,通過控制板翻譯成數字以後發送給電腦,我們在電腦上用Grasshopper中的C#腳本讀取這個數字,把這個數字作為影響形態的參數用在幾何體上就可以實現用電阻控制形態了。

二、上傳代碼

將下面的代碼上傳到Arduino控制板中,如何給Arduino上傳代碼屬於 Arduino 硬體使用的基礎知識,網際網路上有非常多的資料介紹,firefly的幫助文檔中也有很詳細的描述,這裡就不贅述了。

大家可以到firefly的官方網站下載firefly和幫助文檔。

10 val=analogRead(potpin);

上面這段代碼的意思是每隔200毫秒,讀取電阻輸入進來的信號轉成數值,然後把數值送到串口中去。

那麼接下來我們就要學習最重要的一步了,如何把這個數值讀取到 Grasshopper 中。

三、通過C#腳本讀取信號

在寫代碼之前我們先解答一下 Zzzz 同學的問題,這位同學的代碼如下:

1System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort();5int val = sp.ReadByte();

他遇到的問題是代碼可以執行,但是只要接上外設,就會非常的卡,拔掉外設就好了,這是什麼原因呢?

我們先逐行來分析一下這段代碼:

System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort();

這句的意思是實例化了一個SerialPort(串口)對象,命名為sp,這個串口對象就可以看成是計算機和外設交互數據串口的代表。

sp.PortName = 「COM3″;

這句把串口的名稱設置COM3,也就是說要用sp這個串口對象代表哪個串口。
通過硬體管理器查看一下,正好arduino在我的計算機上也是COM3

sp.BaudRate = 9600;

設置波特率為9600,接入不同的設備,按設備波特率的不同設置為相應的值。

sp.Open();

這句是打開串口。

int val = sp.ReadByte();

A = val;

這兩句是從串口讀取字節,然後把讀取到的值賦值給C#電池的輸出變量A。

sp.Close();

這句是關閉串口。

了解了每個語句的用途,我們再回過頭來看這個連線圖

從圖中可以看到,為了讓代碼能夠不停的從COM3中讀取數據,連接了一個Timer,每隔20毫秒就會執行一次腳本,這樣做是沒有錯的,但是接了Timer 以後,代碼中的sp.Open()和sp.Close()每隔20毫秒就會執行一次,也就是說每20毫秒就要把串口COM3打開並關閉一次,在如此段的間隔內打開關閉硬體接口是非常消耗資源的,這就是卡的原因所在了。

下面我們就動手來改代碼

為了不用每執行一次就打開關閉一次串口,我在電池外面做了一個開關,需要的時候,從外面打開,代碼裡面主要負責讀取數據,用完了,從外面關掉就好了,不用每執行一次就打開關閉一次。

這個電池裡面的代碼如下:

1System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM3", 9600);5 if (sp.IsOpen == false) sp.Open();6 if (sp.IsOpen) Msg = "埠已開啟";7 int data = sp.ReadByte();13 if (sp.IsOpen) sp.Close();14 if (sp.IsOpen == false) Msg = "埠已關閉";

雖然現在已經不卡了,但是用現在這個,有時還會出現錯誤,關閉埠以後馬上打開,會發生打不開的情況,程序會告訴你埠被佔用。這種情況打開關閉五次,就會出現至少兩次打不開,就像這樣:

這是因為每執行一次代碼,就實例化一個串口對象,在打開串口的時候,之前一次的串口對象並沒有完全被系統釋放,依然佔用著串口,再打就打不開了。

那我們就不要不停的去實例話串口對象,實例化一次就好了。要如何做呢?
大家看我這個圖就明白了:

我們把實例話的過程放在左邊的電池裡,也就是說整個運行過程只需要在左邊實例話了一個串口對象,傳遞到右邊的電池中就好了,右邊只是負責打開和關閉埠以及讀取數據。這樣打開關閉點的再快也不會出錯了。

左邊電池的代碼:

1System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM3", 9600);

右邊電池的代碼:

1System.IO.Ports.SerialPort sp = ( System.IO.Ports.SerialPort) port;6 if (sp.IsOpen == false) sp.Open();7 if (sp.IsOpen) Msg = "埠已開啟";9 string data = sp.ReadExisting();10 if (data.Contains("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r"))12 string[] sArray = data.Split('\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r');21 if (sp.IsOpen) sp.Close();22 if (sp.IsOpen == false) Msg = "埠已關閉";

注意,我為了讀到電阻發來的信號,這裡讀取數據用的是sp.ReadExisting()

好了,現在打開串口以後,就可以正確讀出數據了。

四、用串口數據控制形態

現在就可以把我們寫好的腳本放到做好的sketch裡面用電阻去控制形態了,這一步學過Grasshopper的同學都懂得。

例如最前面視頻裡演示的放到一個更具輸入值不同變換高度的。


要下載做好的文件,或對此話題有任何疑問,請點擊閱讀原文前往論壇。


關注公眾帳號Shaper3d獲取更多Rhino相關資訊。

相關焦點

  • Arduino使用光敏電阻實驗
    Arduino能通過各種各樣的傳感器來感知環境,通過控制燈光、馬達和其他的裝置來反饋、影響環境。板子上的微控制器可以通過Arduino的程式語言來編寫程序,編譯成二進位文件,燒錄進微控制器。對Arduino的編程是通過 Arduino程式語言 (基於 Wiring)和Arduino開發環境(基於 Processing)來實現的。
  • 如何用Matlab連接控制Arduino:GUI界面製作與電機控制
    筆者以Matlab軟體研究如何控制Arduino,將從Matlab製作Arduino的GUI界面和simulink應用出發,探索如何使用Matlab連接和控制Arduino。  Matlab與Arduino聯合應用——GUI界面  首先介紹如何安裝配置一個基於Matlab的GUI界面,能夠實現對ArduinoIO口的操作。
  • 輸出電容器的等效串聯電阻對滯環控制功率轉換器的影響
    的穩定性取決於輸出電容器的等效串聯電阻(ESR)。圖1 滯環控制降壓轉換器這種運作方式與可變結構控制系統類似,它能夠依據一個超平面(hyper-plane)來轉換控制法則。因此,可變結構控制理論便成為分析滯環控制功率轉換器的最佳工具。分析為了專注分析RC的影響,這裡假設電感器的ESR為零,而開關S1和S2處於最理想的情況。當S1開啟時S2便關閉。
  • 用可變電阻改變容量的電容倍增器電路工作原理分析
    容量可變的電容器,其最大可變容量為500PF,當容量變化範圍要求更大時,可採用容量倍增器由於電容器一端接地,使其用途受到一定限制採用可變電阻VR1,可使容量倍率在1~11倍範圍內連續調節。若把VR1的滑動觸點移到R1一側,C1被增加11倍,在另一側為1倍(與C1相同)用可變電阻改變了靜電容量,所以也可稱為大容量微調電容電路。因本電路使用了OP放大器組成的反饋電路。最高頻率取決於OP放大器,在選擇OP放大器,在選擇OP放大器時應予注意。
  • 【arduino】流水燈
    最近球球小朋友對arduino產生了濃厚的興趣,沒事就找書或者找視頻進行學習。
  • 脫離Arduino IDE的外部編譯及上傳模式
    call命令主要有2種用法,一種是調用其他批處理程序(*.bat,*.exe,*.cmd,*.COM),目前常用的是*.exe文件和*.bat文件;另一種是CALL :label arguments這個地方我看見了%1這種寫法:bat腳本中的%~的作用%0,指的是當前腳本,而~代表各種擴展,如下:%~f0
  • 「初識Arduino - 3」PWM控制LED燈
    準備器材:開發板(Arduino UNO)麵包板1塊麵包板跳線LED燈:1個220Ω電阻:1是將模擬信號變為脈衝的一種技術(用數字來控制模擬輸出的一種手段)。PWM可以控制LED亮度、控制馬達速度、控制直流電動機的速度等
  • arduino從零開始(3)電子元件與LED流水燈
    、使用for循環電子元件相關arduino色環電阻:色環電阻計算方法arduino LED:arduino針腳輸出的是5V電壓,所以如果將LED連接到arduino需要串聯電阻。使用歐姆定律:歐姆定律計算得到電阻大概範圍在165Ω到660Ω之間,常用的算換電阻為220Ω、330歐姆、1KΩ。arduino 麵包板:
  • 電阻在電路中的作用是什麼,電阻是如何分壓的
    電阻是一種最為常用的電子元器件,它在電路中用量最大。電阻的主要作用有分壓、降壓、分流、限流、上拉、下拉、取樣、反饋、啟動、洩放、連續可調分壓器、電位器的音量及平衡控制、可變電阻調整偏流等,本節只介紹一些電阻的常用電路,其餘功能在後續電路中再做介紹。
  • 如何使用藍牙模塊從Android設備控制Arduino
    打開APP 如何使用藍牙模塊從Android設備控制Arduino 發表於 2019-10-11 14:41:23 http://www.dealextreme.com/p/jy-mcu-arduino-bluetooth-wireless-serial-port-module-104299 或搜索「藍牙模塊」 「在ebay 我以$ 8.20的價格在Dealextreme上買了我的。 2。具有藍牙功能的Android設備。 3。
  • 萬能超的arduino學習日記(一)
    本科時候有接觸過arduino,但是由於導師方向原因,轉做了3D列印和動力學分析,所以這裡是啥都會一點點的萬能超,希望能夠和大家一起學習討論。最近由於興趣原因,決定重新撿起arduino,所以決定寫這個萬能超的arduino學習日記跟大家一起重新學習。最開始的入門學習,我選擇跟B站太極創客的學習視頻,因為有基礎,選擇二倍速觀看學習。
  • 智能家居控制-arduino紅外遙控控制燈
    上一篇文章介紹了 arduino接受智能家具系統中的紅外遙控的解碼在此基礎上,今天就做一個遙控器控制的燈,我們可以將燈換成繼電器,這樣的話就實現了,用紅外遙控機,控制家裡的電器開關,比如燈,電視,插座,洗衣機等
  • Arduino硬體編程二
    硬體器材1.arduino uno r3 開發板+ usb數據線2.擴展板3.麵包板4.按鍵模塊5.無源蜂鳴器模塊11.小馬達模塊+風扇12.電機驅動模塊13.led交通燈模塊X214.紅外避障模塊X215.紅外尋跡模塊X216.光敏電阻模塊
  • 常用電子元器件-可變電阻器的識別
    可變電阻器是一種阻值可以改變的電阻多用於需要調節電路電流或者需要改變電路電阻值的場合中.常用的可變電阻器有兩個固定端第三個接頭連接到一個可調的電刷上面.可變電阻器是一種電阻器,它與一般電阻器不同的地方是,它的阻值可以在一定範圍內連續變化,阻值可以調整的電阻器,用於需要調節電路電流或需要改變電路阻值的場合。可變電阻器可以改變信號發生器的特性,使燈光變暗,啟動電動機或控制它的轉速。根據用途的不同,可變電阻器的電阻材料可以是金屬絲、金屬片、碳膜或導電液。
  • 輕聊智能拋石車電控——基於Arduino的控制
    的確,主要就是一個循跡控制,玩過單片機的都知道,這是最最基礎的電控,用arduino控制小車輪子正反轉,「分分鐘」完事一點也不誇張。但在實際備戰過程中,結合小車的機械以及賽事規則的實際,大部分隊伍還是難以解決這看似「小兒科」的控制。下面我來闡述一下如何根據這個賽題的實際情況做一個漂亮的控制。
  • 【樹上動態】乾貨滿滿的《Arduino 是什麼》主題分享會
    對於後來者來說,你可以在Arduino社區輕鬆找到自己想要使用的一些基本功能模塊:舵機控制、PID調速、A/D轉換等。特別一些模塊供應商也開始越來越重視Arduino社區,會為自己的產品提供Arduino下的使用庫,這些都極大的方便了Arduino開發者,使你可以不必受限於一些基本功能的編寫,從而能夠把更多的精力放在自己的功能設計中去。
  • arduino 從零開始(2)探索arduino開發板和arduino IDE
    1、你將會探索arduino開發板2、你將會打開並上傳程序到arduino 板3、你將會學到arduino程序的基本框架和基本函數4、你將會自己編寫並上傳arduino程序一、arduino 板簡單來說,arduino(硬體)就是一個可以用來根據你的要求進行編程從而可以和很多輸入輸出設備進行交互的一個微型電腦系統。
  • 基於ArduinoLeonardo板子的BadUSB攻擊實戰
    * 原創作者:Professor X,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載前言在Freebuf上許多同學已經對HID攻擊談了自己的看法,如維克斯同學的《利用Arduino快速製作Teensy BadUSB》無論從科普還是實踐都給我們詳盡的描述了BadUSB製作的相關過程,lpcdma同學的《使用arduino
  • Arduino_集合Arduino教程、Arduino IDE及設計應用的技術專題
    在線等挺急的 詳細點 回答28# eepwlover:Arduino開發工具(arduino IDE) 1.0.5 綠色免費版
  • 初步認識Arduino
    自復位保險絲,保護電腦的USB埠免遭短路或過電流的損害(儘管大部分PC都有自己的內部保護),如果施加到USB埠上的電流超過500mA保險絲會自動切斷連接直到短路或過電流情況消失為止16MHz的晶振是用來計算時間、處理時間問題的3.3V的穩壓器用來控制供給開發板的電壓