資料介紹
描述
光學斬波器是一種周期性地中斷外部光束的裝置。雖然在科學實驗室中使用了幾種不同類型的光束斬波器,但這類似于光學快門,它會定期打開和關閉以允許光線按規(guī)定的時間間隔通過。這種類型的斬波器可以在許多類型的實驗(例如光電化學)中實現(xiàn)一致且可重復的暗與光比較。有關使用光斬波器的一種實驗的簡要示例,請考慮對用 Pt 或 CoPi 裝飾的氧化鐵 (III) 進行的光電流密度測量,與黑暗中的電流密度相比,光照下的光電流明顯增加。光學斬波器可以實現(xiàn)這種類型的比較。
Simple Arduino Optical Chopper 本質上是一個光學快門,它通過用伺服臂(10 度)阻擋光束并以設定的間隔打開光束(90 度)來操作。這是我以前通過使用一張紙或紙板并在密切監(jiān)視秒表的同時手動阻擋光束來完成的任務(令人沮喪)。與手動操作相比,使用 arduino 和伺服電機可以進行更可重復的實驗和更一致的斬波間隔。最重要的是,我不必一直站在實驗旁邊。
一般操作
按一次按鈕開關啟動斬波器程序。該程序包括兩個階段:安靜時間和波束斬波。安靜時間的量由變量 quietTime 指定,可用于允許在實驗開始時延長“黑暗”時間(例如,允許電流密度達到光電化學實驗中的基線)。在安靜時間結束時,斬波階段在總時間的剩余時間(由變量 totalTime 指定)開始,伺服電機以變量 chopInterval 指定的時間間隔在閉合角和打開角之間交替。
當?shù)竭_總時間后,程序結束,伺服臂返回到閉合角度。按一次按鈕開關可隨時停止正在運行的程序,將伺服電機設置到指定的閉合角度。arduino 的板載 LED 13 用于監(jiān)控程序當前是否正在運行。
該項目分為兩部分,第一部分演示如何構建簡單光學斬波器的基本版本,第二部分添加 LCD 等功能以查看指定的時間間隔和電位器以操縱這些間隔而不更改它們代碼。您可以通讀教程或在附件中找到這兩部分的原理圖和代碼。
簡單的光學斬波器
本節(jié)將介紹如何構建和編碼光斬波器所需的最低限度。這個斬波器由三個主要部件組成:一個伺服器,它在物理上進行斬波;一個觸覺按鈕,用于啟動和停止印章程序;和 arduino,它處理兩者之間的邏輯。
?
首先,根據圖 2 將伺服電機連接到面包板和 arduino。請注意,我的特定伺服與 Fritzing 接線圖不匹配,因此請密切注意您的引腳分配。包括一個橋接伺服器 5V 和 GND 引腳的去耦電容器。當伺服電機開始運動時,它消耗的電流比它已經運動時要大,從而導致電路板上的電壓下降。仔細檢查電容器的陰極是否接地。
簡單的光學斬波器代碼
在設置功能之前,我們必須包含伺服庫和變量以跟蹤運行時間和斬波間隔。在這里,我將安靜時間、斬波間隔和總時間分別設置為 2 分鐘、4 秒和 4 分鐘。本質上,我們希望程序在斬波器關閉的情況下運行 2 分鐘,然后開始斬波,每 4 秒在打開和關閉之間切換一次,直到達到 4 分鐘的總運行時間。這些是我的應用程序的最佳值,但顯然可以為您的應用程序隨意修改它們。
#include
Servo myServo;
unsigned long quietTime = 120000;
unsigned long chopInterval = 4000;
unsigned long totalTime = 240000;
下一組變量將存儲程序的不同狀態(tài)(例如,斬波程序是否正在運行,是否按下開關,經過的時間等)
// variable used to indicate that the chop program is running
// value of 1 or true means program is running
int programRunning = 0;
// previous state of the start button
int previousSwitchState = 0;
// start button input pin
const int startButtonPin = 8;
// onboard LED used to indicate that chop program is running
const int ledPin = 13;
// time of previous interval
unsigned long previousMillis = 0;
// time that the start button was pressed
unsigned long programStartTime = 0;
// servo angles for both open and closed positions
const int closedAngle = 10;
const int openAngle = 90;
光學斬波器將在兩種不同的“狀態(tài)”下運行,運行和不運行。觸覺按鈕開關將允許我們在兩者之間切換,當前狀態(tài)將存儲在變量中:programRunning。
下一個變量不太直觀。由于 arduino 的循環(huán)功能每秒運行數(shù)千次,我們不可能在一個程序循環(huán)中按下按鈕,因此最好監(jiān)視連接到按鈕的引腳上信號從低電平到高電平的變化,因此我們將比較previousSwitchState 與代碼后面的當前按鈕狀態(tài)。
該按鈕將連接到引腳 8,我們將使用 LED 13 作為印章程序正在運行的板載視覺指示器。
因為斬波程序在很大程度上依賴于時間間隔,所以我們必須跟蹤兩者:按下開始按鈕的時間以及自上次更改伺服位置以來已經過了多長時間。為此,我們定義了 previousMillis 和 programStartTime。
最后,我們定義打開和關閉對應的伺服角度(即光束暢通,或光束被阻擋)。90 度和 10 度最適合我使用的伺服。
現(xiàn)在讓我們看看設置函數(shù):
void setup() {
// pin 8, the start button is an input
pinMode(startButtonPin, INPUT);
// pin 13, the program running indicator LED is an output
pinMode(ledPin, OUTPUT);
// servo is attached to pin 9
myServo.attach(9);
// console for diagnostics
//Serial.begin(9600)
}
這里沒有什么太復雜的。開始按鈕連接到引腳 8,我們使用引腳 13 作為印章程序正在運行的指示器(否則在安靜的時候可能很難分辨,這些觸覺按鈕切換很容易不小心按兩次),我們正在聽寫通過引腳 9 確定伺服的位置。最后,我在注釋中包含了 Serial.begin() 函數(shù),這對于故障排除很有用。
現(xiàn)在讓我們處理代碼的核心部分,即循環(huán)函數(shù):
void loop() {
// gets the current runtime in milliseconds
unsigned long currentMillis = millis();
// reads the start button switch state
int switchState = digitalRead(startButtonPin);
}
要通過循環(huán)開始每次運行,我們需要根據 arduino 的內部時鐘以及開關是否被按下來跟蹤當前時間。
接下來讓我們編寫開始按鈕的行為代碼,
// start/stop button
if (switchState != previousSwitchState) {
if (switchState == HIGH) {
programStartTime = currentMillis;
programRunning = !programRunning;
}
}
由于我們通過循環(huán)在每次迭代中檢查開關的狀態(tài),因此我們可以將其與上一次迭代期間的開關狀態(tài)進行比較,尋找最初按下時從 LOW 到 HIGH 的變化。注意:我們將在循環(huán)結束時將 previousSwitchState 的值分配給 currentSwitchState,以便在下一次迭代中進行有意義的比較。
如果開關狀態(tài)從 LOW 變?yōu)?HIGH,則將開始時間分配給當前時間并切換 programRunning 的值。
接下來,我們將解決 chop 程序運行時的行為(programRunning 為 true)。
// if the program running state is true as a result of pressing the start button
if (programRunning) {
//turn the program running indicator LED on
digitalWrite(ledPin, HIGH);
// if quiet time has passed and total time has not been exceeded
if (currentMillis >= programStartTime + quietTime) {
// if the current time is still less than the total run time
if (currentMillis <= totalTime + programStartTime) {
// if the interval time has passed
if (currentMillis - previousMillis >= chopInterval) {
// stores the current time as previous time
// switches the state of the servo motor
}
}
}
}
一旦 chop 程序開始運行,我們的程序將做一些不同的事情:倒計時指定的安靜時間,決定伺服器何時允許光束通過,確定程序何時結束。嵌套條件包含打開伺服必須滿足的要求。首先,安靜的時間一定已經結束;第二,程序一定不能超過規(guī)定的總運行時間;最后,定義的斬波間隔必須已經過去。
如果滿足所有這些條件,我們檢查舵機的位置,如果它處于關閉角度,我們通過將以下代碼添加到上面最內層的條件來打開它:
// stores the current time as previous time
previousMillis = currentMillis;
if (myServo.read() == closedAngle) {
myServo.write(openAngle);
} else {
myServo.write(closedAngle);
}
我們還想將之前的 Millis 變量(我們用來確定是否超過斬波間隔的變量)分配給當前時間。
但是,如果斬波間隔還沒有過去怎么辦?或者如果安靜時間還沒有結束?我們希望光斬波器如何工作?
查看每個條件,如果安靜時間尚未結束,舵機應保持其關閉角度。如果我們已經超過了程序的總運行時間(即程序剛剛結束),舵機應該處于關閉角度并且我們應該將 programRunning 變量的值更改為 false。最后,如果斬波程序沒有運行,我們希望 LED 指示燈 (13) 熄滅并且伺服移動到關閉位置。我們可以通過填寫以下 else 語句來完成此操作:
// if the program running state is true as a result of pressing the start button
if (programRunning) {
//turn the program running indicator LED on
digitalWrite(ledPin, HIGH);
// if quiet time has passed and total time has not been exceeded
if (currentMillis >= programStartTime + quietTime) {
// if the current time is still less than the total run time
if (currentMillis <= totalTime + programStartTime) {
// if the interval time has passed
if (currentMillis - previousMillis >= chopInterval) {
// stores the current time as previous time
previousMillis = currentMillis;
if (myServo.read() == closedAngle) {
myServo.write(openAngle);
} else {
myServo.write(closedAngle);
}
}
// the servo returns to original position and the program is stopped
// when total run time is reached
} else {
myServo.write(closedAngle);
programRunning = !programRunning;
}
// servo remains in original position if still in quiet time
} else {
myServo.write(closedAngle);
}
// servo remains in original position when chopper program is not running
} else {
digitalWrite(ledPin, LOW);
myServo.write(closedAngle);
}
這是光學斬波代碼的核心。我們需要包括最后一行,它與開始/停止按鈕有關。我們需要包括,
previousSwitchState = switchState;
這允許我們通過存儲它并在循環(huán)的下一次迭代中將其與 switchState 的值進行比較來監(jiān)視按鈕按下,如前所述。
就是這樣!這就是基本光學斬波器所需的全部!繼續(xù)閱讀以添加 LCD 顯示屏以及即時讀取和修改斬波間隔、運行時間和安靜時間的能力……
帶 LCD 和電位器的光斬波器
基本的光學斬波器為您的光化學應用增加了一致性,但如果能夠即時更改時間并讀取斬波程序中剩余的時間量而不是進入代碼會更方便。我們將使用 LCD 和一系列電位計來添加此功能。
首先,連接 LCD 屏幕并將其接線,如圖 3 和 4 所示。如果您對為什么需要這么多電線感興趣,請查看adafruit lcd 教程。
?
最終,我們將能夠實時查看 chop 程序的剩余時間。但這還不是全部......通過添加一系列電位器,我們將能夠調整安靜時間的長度、程序運行時間和只需轉動一個旋鈕(或十字頭螺絲刀,如果你有和我一樣的鍋)。因此,下一步是添加電位器并將它們連接起來,如下所示:
此時,您的斬波器應如下所示:
現(xiàn)在一切都已連接好,讓我們修改之前的代碼以適應新功能。
帶LCD和電位器的光斬波器代碼
我們將首先從花盆開始,但最好繼續(xù)將 arduino LCD 庫添加到我們的 arduino 代碼的頂部,
#include
此外,我們需要告訴 arduino 我們是如何連接到 LCD 的(即哪些引腳)。在對 LCD 庫的調用下面添加這一行,
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
好吧,讓我們處理電位器。由于我們將根據電位器的可變電阻更改變量 quietTime、chopInterval 和 totalTime 的值,因此讓我們刪除之前給它們的值。此外,我還添加了另一個變量 programTime,它將存儲 chop 程序在安靜時間結束后運行的時間長度。用鍋來控制這個時間比總時間更直觀。您的代碼現(xiàn)在應該如下所示:
// include the servo library and assign to myServo
#include
Servo myServo;
#include
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
// quiet time, chop interval, and run time defined in milliseconds
unsigned long quietTime;
unsigned long chopInterval;
unsigned long programTime;
unsigned long totalTime;
此外,我們需要將模擬輸入引腳分配給一個變量,該變量指示連接的電位器正在修改的內容:
// pin assignments for the potentiometers
int const chopIntervalPin(A0);
int const programTimePin(A1);
int const quietTimePin(A2);
這就是變量。下一個代碼修改發(fā)生在 chop 程序未運行時。當 chop 程序未運行時,我們希望 arduino 將來自電位器的模擬值轉換為毫秒,以用于 quietTime、programTime 和 chopInterval。看看我們在 else 條件中添加了什么。
// if the program running state is true as a result of pressing the start button
if (programRunning) {
// do all that stuff we described previously
} else {
digitalWrite(ledPin, LOW);
myServo.write(closedAngle);
// the potentiometers that manipulate the time variables
// quiet time between 0 and 300 seconds
quietTime = analogRead(quietTimePin);
quietTime = map(quietTime, 0, 1023, 0, 10);
quietTime *= 30000;
// chop time between 0 and 300 seconds
programTime = analogRead(programTimePin);
programTime = map(programTime, 0, 1023, 1, 10);
programTime *= 30000;
// chop interval between 1 and 10 seconds
chopInterval = analogRead(chopIntervalPin);
chopInterval = map(chopInterval, 0, 1023, 1, 10);
chopInterval *= 1000;
totalTime = quietTime + programTime;
}
映射函數(shù)非常適合將模擬值從原始 0 到 1023 范圍轉換為 1 到 10“增量”。通過將這些值乘以毫秒值,我們定義了每個電位器的增量幅度(例如 quietTime 和 programTime 為 30s,chopInterval 為 1s)。我發(fā)現(xiàn)這種方法效果最好,因為直接映射到毫秒(例如 0 到 300000)會導致難以將電位計設置為精確時間,例如恰好 4 分鐘或 2 秒。相反,這種方法為我們提供了很好且容易使用的時間增量。
如果我們不知道要將它們更改為什么,那么能夠在實驗之間更改時間值毫無意義。在本節(jié)中,我們將為 LCD 添加代碼。
我們已經添加了 LCD 庫并告訴 arduino 使用哪些引腳與 LCD 通信,但是我們需要添加,
lcd.begin(16, 2);
命令設置功能,它啟動顯示并告訴arduino顯示有多大。
與 chop 程序本身類似,我們希望將 LCD 編程為在兩種狀態(tài)下運行:“開”和“關”。當斬波程序運行時,我們希望LCD顯示還剩多少安靜時間或斬波時間。為此,我添加了兩個條件語句,一個將顯示剩余安靜時間,一個將顯示剩余切割時間:
if (programRunning) {
digitalWrite(ledPin, HIGH);
if ((currentMillis - programStartTime) % 500 == 0) {
// if quiet time has passed and total time has not been exceeded
if (currentMillis >= programStartTime + quietTime) {
lcd.clear();
lcd.print("Quiet Time:");
lcd.setCursor(12, 0);
lcd.print((quietTime - (currentMillis - programStartTime)) / 1000);
}
}
}
最初,我發(fā)現(xiàn) LCD 刷新方式很快使它難以閱讀,因此我添加了,
if ((currentMillis - programStartTime) % 500 == 0)
有條件的,因此顯示每秒僅更新兩次。刷新后,LCD 清除其顯示,打印“安靜時間:”或“運行時間:”,移動光標并以秒為單位打印剩余時間(我認為四舍五入到最接近的整秒)。
當斬波程序停止時,我們希望 LCD 動態(tài)顯示斬波間隔、安靜時間和總運行時間的值以及“程序已停止”消息。
在我們計算出電位器的值后,我們可以添加以下代碼:
if (currentMillis % 500 == 0) {
lcd.clear();
lcd.print("Program Stopped");
lcd.setCursor(0, 1);
lcd.print("Q:");
lcd.print(quietTime / 1000);
lcd.print(" R:");
lcd.print(programTime / 1000);
lcd.print(" I:");
lcd.print(chopInterval / 1000);
}
與上面類似,這會清除顯示并顯示 quietTime、programTime 和 chopInterval 變量的值,因為它們已更改。
在這一點上,你應該有一個像這樣工作的顯示器,
就是這樣!現(xiàn)在剩下的就是連接一塊硬紙板或類似伺服電機的東西,將電機安裝到環(huán)形支架上,開始您的實驗,并且忘記再次手動切斷光束!
我希望你喜歡這個教程!
- 力感電阻(FSR)Arduino簡單教程
- 使用Arduino的簡單追逐者
- 使用Arduino制作簡單的數(shù)字時鐘
- 基于Arduino設計的簡單小鋼琴 0次下載
- 使用Arduino的簡單Vu表
- 使用Arduino的簡單計步器
- DIY簡單的Arduino鍵盤
- 簡單的arduino游戲機設計案例
- Arduino Uno國內改版電路原理圖下載 0次下載
- Arduino Uno Rev.3開發(fā)板意大利原版電路圖 0次下載
- 四通道光學耦合隔離器芯片PS2801-4 37次下載
- Arduino編程基礎(一)——Arduino語言資料下載
- Arduino的簡單介紹和Arduino的幾類主要產品詳細說明
- Arduino 0017軟件免費下載 200次下載
- 用晶閘管作為電子開關的直流斬波器
- 斬波器的基本概念和工作原理 1572次閱讀
- 斬波器的工作原理 斬波電路的三種控制方式 8287次閱讀
- 如何制作一個簡單的2步Arduino可編程定時器電路 1980次閱讀
- 如何制作一個簡單的2步Arduino可編程定時器電路 4219次閱讀
- 如何利用Arduino UNO設計無RTC模塊簡單時鐘 3962次閱讀
- 如何使用Arduino來制作一個簡單的歐姆表 5565次閱讀
- DIY一個簡單的Arduino板子 5350次閱讀
- 如何使用Arduino Nano控制紅綠燈 5001次閱讀
- 如何從網頁控制arduino? 3836次閱讀
- 簡評FPGA——Arduino MKR Vidor 4000 6807次閱讀
- 高精度光學斬波器對光信號的調制 1.2w次閱讀
- 直流斬波器工作原理 2.7w次閱讀
- 直流斬波器的控制方式 5229次閱讀
- arduino是什么以及arduino能干什么 4.4w次閱讀
- arduino和樹莓派的區(qū)別 2.5w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據手冊
- 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開發(fā)指南
- 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數(shù)字電路基礎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次下載 | 免費
評論
查看更多