置頂

我的 VPython 教學文件 (HackMD 版本)

VPython 教學文件目錄 安裝及測試 基本語法 等速度直線運動 自由落下 終端速度 水平抛射 使用For迴圈計算水平抛射資料 斜向抛射 圓周運動 簡諧運動 單擺 木塊彈簧系統分離 重力及簡諧 行星運動 相疊木塊 雙重簡諧運動 一維彈性碰撞 ...

熱門文章

2018年1月30日 星期二

波的疊加

波的疊加
 日期:2018/1/30
雖然我已經教過3次選修物理,但是我依然很討厭畫波的圖形,尤其是波的疊加,要在黑板上把圖畫準實在太花時間了,所以我在2013年就寫了一篇文章介紹如何用 Scilab 製作波的疊加動畫。但是使用 Scilab 很像在寫 C 語言的程式碼,不是一般人能接受的,還好現在用 GeoGebra 就能輕鬆做到相同的效果。
用 Scilab 製作的波的疊加動畫

行進波

行進波
 日期:2018/1/30
當我每次教到選修物理波動這章時,總是要花費很多時間向學生解釋什麼是行進波,什麼是固定相位差。從上個學期開始,我乾脆直接用電腦畫給學生看,似乎學生的接受度有高一點。下圖為最終成果。
行進波範例

數值積分

數值積分
 日期:2018/1/30
我之前在寫利用 Excel 計算數值積分的文章時,為了畫出長方形法、梯形法的示意圖努力了很久,後來是用 Gnuplot 寫指令畫出來的,沒想到 GeoGebra 有內建指令可以畫出數值積分的圖,只要一行就解決了。以下的圖都是以 $f(x) = x^2 + \sin(2 \pi x)$ 為例,積分上、下限分別為2、-2,分割數量為20。

長方形法

指令1:RectangleSum(函數名稱, 積分下限, 積分上限, 長方形數量, 長方形對齊點)
其中長方形對齊點的數值為 0 ~ 1,0代表對齊函數左側,1代表對齊函數右側,0.5代表對齊函數中點。執行指令之後會畫出圖形並顯示計算結果。
RectangleSum(f, -2, 2, 20, 0.5)

2018年1月29日 星期一

函數繪圖

函數繪圖
 日期:2018/1/29
對於物理科而言經常要繪製函數圖形,在我就讀大學期間,我聽過能夠處理函數繪圖的軟體只有 Gnuplot、Mathematica、MATLAB。其中 Gnuplot 是自由軟體,但是要做任何事都要靠指令,另外兩套則是很貴的專業軟體,只拿來畫函數實在是大材小用。應該還有其它軟體,但我當然並沒有接觸到。直到我遇到 GeoGebra 之後,才發現原來有這麼方便的工具。

函數繪圖(不限制函數區間)

開啟 GeoGebra 之後在最下方的欄位中輸入函數的式子即可,例如
f(x) = sin(x)
按下 Enter 後就會出現以下的圖形。輸入指令時如果沒有加上 f(x) = ,GeoGebra 會自動給予名稱。
f(x) = sin (x)

安裝GeoGebra並繪製三角形重心

安裝GeoGebra並繪製三角形重心
 日期:2018/1/29

下載並安裝GeoGebra

GeoGebra 是一套基於 GPL 發行的數學動態繪圖軟體,主要是以 JAVA 和 HTML5 寫成的,我覺得目前的功能已經足以應付高中課堂的需求。以下是 GeoGebra 的首頁 ( https://www.geogebra.org/?lang=zh_TW ),上面3個項目 GeoGebra 繪圖計算機、GeoGebra Geometry、GeoGebra 立體繪圖是 GeoGebra 其中3種功能的線上版,可以不需要安裝軟體,直接在瀏覽器上面執行。但是我們想在電腦上安裝 GeoGebra ,請按右下角的 Downloads。在下載頁面當中有6種不同的軟體,我選擇的是最傳統的 GeoGebra Classic 5。
GeoGebra首頁

2017年12月25日 星期一

Word圖表標號及自動產生目錄

Word圖表標號及自動產生目錄
日期:2017/12/25
  我會寫這篇文章是因為某人寫論文時遇到困難,我只好又幫忙測試。其實我很討厭 Microsoft Word,平常只用 LibreOffice Writer。以下是我找出來的方法,使用的版本為 Word 2013。(Word 檔、pdf 檔)

步驟1:設定章節用的多層次清單
路徑:常用 ⇒ 段落 ⇒ 第1列第3個圖示多層次清單 ⇒ 定義新的多層次清單

2017年12月14日 星期四

將 Python 程式碼打包為可執行檔

將 Python 程式碼打包為可執行檔
Version 1: December 4, 2017
Version 2: December 5, 2017

  最近正好要將一些以前寫的 Python 程式碼打包為可執行檔,這樣才能把程式拿到沒有安裝 Python 的電腦上執行。在請教 Google 之後,找到了3個目前最多人使用的方法:
  1. py2exe ( http://www.py2exe.org/ )
  2. cx_Freeze ( https://anthony-tuininga.github.io/cx_Freeze/ )
  3. PyInstaller ( http://www.pyinstaller.org/ )
其中 py2exe 只有支授到 Python 2.7 版,但是我使用的是 Python 3.6.3 版,所以我就跳過這個軟體不進行測試。所用的作業系統為 Windows 10 64-bit 家用版。以下是另外2個軟體的安裝及測試結果。


cx_Freeze
  1. 打開指令界面,輸入並執行以下指令安裝軟體
    python -m pip install cx_Freeze --upgrade
  2. 新增一個測試用的資料夾,我是在桌面上新增名為 "cx_Freeze" 的資料夾,把想要轉檔的 Python 程式碼複製到這個資料夾中,我的檔案為 "gcd.py"
  3. 進到安裝 Python 的資料夾中,將 "cxfreeze-quickstart" 檔案複製到測試用的資料夾中。路徑可能為
    (a) 安裝給所有使用者:"C:\Program Files\Python36\Scripts\"
    (b) 安裝給特定使用者:"C:\Users\[username]\AppData\Local\Programs\Python\Python36\Scripts\"
  4. 在指令界面中使用 cd 指令切換到測試用資料夾中,輸入並執行以下指令以產生轉檔用的 setup.py 檔
    python cxfreeze-quickstart
    依據畫面指示輸入適當的選項,執行完畢後會產生 setup.py
  5. 輸入並執行以下指令以完成轉檔
    python setup.py build
  6. 進入 "build\exe.win-amd64-3.6\" 找到輸出的 .exe 檔,但在執行時出現以下的錯誤訊息 " ModuleNotFoundError: No module named 'codecs' " ,再度請教 Google 之後發現這似乎是 cx_Freeze 的 bug,已經有人向開發者回報問題,詳細情形可以參考 https://github.com/anthony-tuininga/cx_Freeze/issues/325

2017年12月4日 星期一

紅外線發射接收器

作者:王一哲
Ver. 1:2016/11/20
Ver. 2:2018/3/29



所需元件



  1. 紅外線發射 LED 2 個
  2. 紅外線接收 LED 2 個
  3. 3 mm 或 5 mm LED 1 個
  4. 220 Ω 電阻 1 個(串聯普通 LED)
  5. 560 Ω 電阻 2 個(串聯紅外線發射 LED)
  6. 1 MΩ 電阻 2 個(串聯紅外線接收 LED)
  7. 麵包板 1 塊
  8. Arduino Uno 開發板 1 塊
  9. 麵包板連接線數條
  10. 自製的 LED 支架 2 組

圖中藍色的是紅外線發射 LED、透明的是紅外線接收 LED。
請注意,各廠牌的發射器及接收器顏色不一定相同,購買前最好先向店家確認。

自製的LED支架


去除按鈕彈跳的應用

作者:王一哲
日期:2017/5/5



所需元件



  1. 可插入麵包板的按鈕4個
  2. 220 Ω 電阻3個
  3. 3 mm 或 5 mm LED 3 個
  4. 麵包板 1 塊
  5. Arduino Uno 開發板 1 塊
  6. 麵包板連接線數條


用按鈕控制數值



本裝置的要求:
  1. 按下「增加按鈕」使數值 +1,按下「減少按鈕」使數值 -1,按下「重設按鈕」使數值回到預設值0。
  2. 使用 Bounce2.h 去除按鈕彈跳的問題,不能持續按著按鈕。
  3. 使用開發板內建的上拉電阻,使接線方式更加簡單。
線路圖

實際的裝置照片

序列埠監控視窗截圖


按鈕及彈跳

作者:王一哲
日期:2016/9/7



所需元件



  1. 可插入麵包板的按鈕1個
  2. 220 Ω 電阻1個
  3. 10 kΩ 電阻1個
  4. 3 mm 或 5 mm LED 1個
  5. 麵包板1塊
  6. Arduino Uno 開發板1塊
  7. 麵包板連接線數條

使用外接電阻



將 5 V 接到按鈕,按鈕的另一端串聯1個 10 kΩ 電阻再接地,這樣的接法被稱為下拉電阻(pull-down resistor)。若測量電阻及按鈕間的電壓,當按鈕未按下時電路未接通,測量到低電位;當按鈕按下時測量到高電位。當按鈕被按下時,點亮LED;反之則熄滅。
線路圖

實際的裝置照片


程式碼如下:
/* 實驗5-1:用按鈕控制LED                              *
 *          使用外接10kOhm電阻                         *
 * 參考資料:葉難(2014)。Arduino輕鬆入門              *
 * 日期:Sep. 17, 2016                                 *
 * 作者:王一哲                                        */
#define LEDPIN 7     //定義LED接腳
#define BUTTONPIN 4  //定義按鈕接腳
#define BAUDRATE 9600
int state;

void setup() {
    pinMode(LEDPIN, OUTPUT); //定義LED接腳為輸出
    pinMode(BUTTONPIN, INPUT); //定義按鈕接腳為輸入
    Serial.begin(BAUDRATE);
}

void loop() {
    state = digitalRead(BUTTONPIN); //讀取按鈕狀態,按下為HIGH
    if (state == HIGH) {               //若按下按鈕則點亮LED
        digitalWrite(LEDPIN, HIGH);
    } else {                        //若沒有按下按鈕則熄滅LED
        digitalWrite(LEDPIN, LOW);
    }
}