highlight.js

星期四, 6月 29, 2017

解決 PCM 播放與 Servo 程式庫衝突的問題

由於同事在製作使用伺服馬達的六腳機器人專案, 想要讓機器人遇到障礙物時可以用喇叭播放驚恐的聲音, 因此就利用了善心人士寫好的 PCM 播放程式庫, 不過一用才知道, 原來 Servo 程式庫和 PCM 程式庫都用到了 Arduino UNO 上的 Timer, 因此無法共存。研究了一下發現, Servo 會用到 Timer1 產生中斷送出給伺服馬達的方波訊號, 而 PCM 程式庫為了播放 8KHz 的聲音, 同時用了 Timer1 和 Timer2, Timer1 負責每秒產生 8000 次中斷, 每次中斷切換下一個 PCM 採樣值, 而 Timer2 則負責將 Sample 資料以 PWM 方式送出給喇叭發聲。兩個程式庫都用到了 Timer1, 如果混在一起用, 連編譯都不會過。即使編譯會過, 程式也無法正常運作, 因為兩個程式所需要的 Timer1 頻率根本不一樣。

為了解決問題, 必須有一方讓出 Timer1 給對方使用。討論之後發現, 機器人遇到障礙時可發出聲音後再繼續動作, 並不一定要邊發出聲音邊動作, 所以決定修改 PCM 程式庫, 把 Timer1 讓出來, 改成用很單純的迴圈搭配 delayMicroseconds(), 每 125μs 切換 PCM 採樣值發聲, 問題就解決了。修改過的程式庫可在這裡下載, 如果您也有一樣的困擾, 也許可以試用看看。

有關 Timer, 可參考這一篇文章, 有簡明易懂的說明, 並且整理了常用的程式庫所佔用的 Timer, 如果你的程式遇到怪現象, 例如使用了 tone() 函式後, 3 和 11 腳的 PWM 就失效, 很可能就是 Timer 的問題。

星期六, 6月 17, 2017

Windows 上 Python2/3 共存的最簡單方式

我真是後知後覺, 原來在 Windows 上從 Python 3.3 之後就提供了 Python launcher 工具程式, 可以讓你用 "py -版本" 的方式執行 Python 2 或是 Python 3 的直譯器。而對於套件管理軟體 pip, 也可以使用 pip2 或是 pip3 來區別管理 Python 2 與 Python 3 的套件:

星期四, 6月 01, 2017

Windows 下如何清除 DNS 快取與 NetBios 快取

平常我們再使用網路時, 可以直接透過主機名稱, 向是 www.yahoo.com.tw 瀏覽網頁, 或是透過區網中的電腦名稱直接連線, 例如我的主機電腦名稱叫做 tom, 就可以在檔案總管直接瀏覽 \\tom 察看分享的資源, 前者靠的是 TCP/IP 中的 DNS 名稱對應, 幫你從名稱找到對應的 IP 位址;後者靠的是微軟的 WINS 服務從 NetBIOS 協定使用的電腦名稱對應到 IP 位址。這兩種位址對應的資訊都會由系統快取下來, 後續再遇到相同的名稱實際不需要重新透過較繁瑣的查詢程序, 而可以直接從快取中找出之前查到的 IP 位址來使用。

但是當電腦在不同的網路中切換時, 比如說辦公室中有兩個以上的無線網路, 當你從 A 無線網路切換到 B 無線網路時, 系統還是會從快取中取得之前查詢的 IP 位址, 就可能會導致同樣以檔案總管瀏覽 \\tom 時卻無法連線的問題。這時我們可以先清除快取, 強迫讓系統重新查詢。要做到這件事, 必須以管理員身份執行『命令提示字元』(也就是 cmd.exe), 並透過以下指令清除 DNS 服務的名稱對應快取內容:

C:\WINDOWS\system32>ipconfig /flushdns

Windows IP 設定

成功清除 DNS 解讀器快取。

如果要清除 WINS 服務的 NetBIOS 名稱快取, 則要使用以下指令:

C:\WINDOWS\system32>nbtstat -R
順利清除和預先載入 NBT 遠端快取名稱表格。