電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
創(chuàng)作
電子發(fā)燒友網>電子資料下載>電子資料>簡單的Arduino光學斬波器

簡單的Arduino光學斬波器

2023-02-09 | zip | 0.33 MB | 次下載 | 免費

資料介紹

描述

光學斬波器是一種周期性地中斷外部光束的裝置。雖然在科學實驗室中使用了幾種不同類型的光束斬波器,但這類似于光學快門,它會定期打開和關閉以允許光線按規(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,它處理兩者之間的邏輯。

?
pYYBAGPjQViAXjCXAA3shS4stbQ728.jpg
圖 1:光斬波器的簡單版本,由單個伺服器和按鈕開關組成。
?

?

?
poYBAGPjQVqAPZ9NAAEzFQsnIqU662.jpg
圖 2. 簡單光斬波器的接線圖。
?

首先,根據圖 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 教程。

?
poYBAGPjQa2AXeW0AA1y1RIi0A8886.jpg
圖 3. 附有 LCD 屏幕的簡單光學斬波器。
?

?

?
pYYBAGPjQbCAD6-7AAGQpzU6jJM388.jpg
圖 4. LCD 接線圖。
?

最終,我們將能夠實時查看 chop 程序的剩余時間。但這還不是全部......通過添加一系列電位器,我們將能夠調整安靜時間的長度、程序運行時間和只需轉動一個旋鈕(或十字頭螺絲刀,如果你有和我一樣的鍋)。因此,下一步是添加電位器并將它們連接起來,如下所示:

?
pYYBAGPjQbeAVQnQAAEgYgL51s0200.jpg
圖 5. 電位器接線圖。未顯示:其他一切。
?

此時,您的斬波器應如下所示:

?
poYBAGPjQf6AK8hDABH83mVli30023.jpg
圖 6. 帶有 LCD 和電位器的完整 arduino 光斬波器。
?

現(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)形支架上,開始您的實驗,并且忘記再次手動切斷光束!

我希望你喜歡這個教程!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費