highlight.js

星期四, 5月 11, 2017

Windows 10 下切換私人/公用網路的方法

許多人都遇到找不到切換 Windows 10 中私人/公用網路的設定, 其實很簡單, 只是現在沒有直接的選項, 而是必須以切換『讓此電腦可供探索』的方式來變更, 開啟『讓此電腦可供探索』就是私人網路, 關閉該選項就是公用網路。詳細設定過程就是先進『控制台』:


選取『網路與網際網路』:


我要改的是無線網路設定, 所以選『Wi-Fi』:


再按一下出現的無線網路名稱:


根據要切換成私人或是公用網路, 開啟或關閉『讓此電腦可供探索』選項即可。

星期三, 5月 03, 2017

使用 SSD1306 晶片控制的 OLED 顯示模組

由於 OLED 顯示實在很有科技感, 所以我測試了這一款從淘寶買到的模組, 賣家其實有提供一堆資料,包含 Arduino 可用的函式庫, 我自己測試時是採用 Adafruit 的 Adafruit_SSD1306 函式庫, 不過在使用這一個函式庫時有幾個注意事項:
  1. 它需要使用到 Adafruit 的另一個函式庫 Adafruit GFX graphics core library 才能運作, 這個函式庫是 Adafruit 所有繪圖類函式庫的核心。
  2. 我所買到的模組是使用 I2C 傳輸介面, 但是它的 I2C 位址和 Adafruit 自己賣的不一樣,經檢測後發現我的模組是 0x3C,如果你購買時買家沒有提供相關資訊,也可以接上 Arduino 後, 用 i2c_scanner 程式幫你搜尋。並修改範例中  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);的 0x3D 為你模組的 I2C 位址。
  3. 必須修改函式庫中的 Adafruit_SSD1306.h 檔, 根據你模組的解析度調整取消對應的註解:
    #define SSD1306_128_64
    //   #define SSD1306_128_32
    //   #define SSD1306_96_16
    
這樣就可以讓 OLED 模組正常運作了。

星期四, 4月 13, 2017

使用 Raspberry 硬體加速播放影片當影片展示機

在 Raspberry Pi 中播放影片檔可能會發現有嚴重的卡頓, 這是因為你所使用的播放程式並沒有使用硬體解碼的功能, 要解決這個問題, 最簡單的方式就是使用 omxplayer 程式, 因為這個程式本來就是專為 Raspberry Pi 設計。不過 omxplayer 並沒有播放清單的設計, 如果你想重複連續播放多個檔案, 就無法完成。還好, 網路上已經有善心人士提供了簡易的 shell script, 可以幫你將指定的資料夾當成播放清單, 自動重複一一播放資料夾中影音檔案的工作。

像是我就將所有的影音檔放在 /home/pi/share/pv 下, 然後在 /home/pi 下建立一個 play.sh 檔:

#!/bin/sh

# get rid of the cursor so we don't see it when videos are running
setterm -cursor off

# set here the path to the directory containing your videos
VIDEOPATH="/home/pi/share/pv" 

# you can normally leave this alone
SERVICE="omxplayer"

# now for our infinite loop!
while true; do
 if ps ax | grep -v grep | grep $SERVICE > /dev/null
 then
  sleep 1;
 else
  for entry in $VIDEOPATH/*
  do
   clear

   # -r for stretched over the entire screen
   omxplayer -r $entry > /dev/null
  done
 fi
done

再使用以下的指令將 play.sh 變更為可執行檔:

sudo chmod +x videoloop.sh

就可以執行 /home/pi/play.sh 來重複一一播放 /home/pi/share/pv 下的所有影音檔了。如果你想要讓 Raspberry Pi 在開機後自動執行上述的 play.sh 檔, 可以修改 /home/pi/.config/lxsession/LXDE-pi/autostart 檔, 在最後加上一行執行 /home/pi/play.sh 的指令即可:

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@point-rpi
@/home/pi/play.sh

上述方法只對開機後會登入圖形化介面的設定有效, 如果你是設定成開機後進入文字介面, 就要使用別的方式, 這裡不再多做介紹。

星期四, 2月 23, 2017

HC-SR04 超音波測距模組讀到 0 值後當住的解法

我在使用 Arduino 讀取 HC-SR04 超音波測距模組時, 常會遇到若 pulseIn() 傳回 0 (表示前方無任何障礙物, 所以 timeout) 後, 會有一段無法預期的時間 pulseIn() 都只會傳回 0, 像是 HC-SR04 的 echo 腳位完全沒有作用一樣。有的時候這段時間還超級長, 根本像是整個模組當掉了一樣。

經過搜尋網路上別人的經驗後, 發現這一篇討論串也提到相同的問題, 解決方法就是將 Arduino 原本用來讀取 HC-SR04 的 echo 訊號的腳位先故意設為輸出模式, 並且輸出低電位後一小段時間, 再重新設定回輸入模式, 就可以喚醒 HC-SR04, 或者說是 echo 的功能。

我自己把上述作法寫成以下的程式, 只要 pulseIn() 傳回 0, 我就採取前述對策:

const int echoPin = 11;
const int triggerPin = 12;

unsigned long ping1() {
  unsigned long pulse;

  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pulse = pulseIn(echoPin, HIGH, 50000);

  if(pulse == 0) {
    pinMode(echoPin, OUTPUT);
    digitalWrite(echoPin, LOW);
    delay(100);
    pinMode(echoPin, INPUT);
  }
  
  return pulse;
}


另外, HC-SR04 似乎對供電非常敏感, 我使用的有些 Arduino UNO 板如果只靠 USB 供電, 即使套用上述作法, 仍然無效, 必須外加電源供電, 才會正常, 也提供給大家參考。

星期四, 2月 09, 2017

Raspberry Pi 設定系統音量

Raspberry Pi 開機後會回復預設的音量, 而不是使用者設定的音量, 如果需要在程式中設定音量, 可以使用這篇文章提供的指令:

amixer set PCM -- 100%

如果使用 Python, 可以依照這篇文章的說明, 安裝 python-alsaaudio 模組, 即可利用以下程式片段調整音量:

import alsaaudio
m = alsaaudio.Mixer()
vol = m.getvolume()
vol = int(vol[0])

newVol = vol + 10
m.setvolume(newVol)

星期四, 9月 29, 2016

Arduino 1.6.10 編譯中文資料夾下的程式問題

從 Arduino 1.6.10 版開始, 如果你的專案儲存在有中文名稱的路徑下, 而你的程式中又包含有函式的定義在呼叫函式處之後的狀況, 例如以下的範例:
其中 foo() 定義在程式最尾端, 但是在程式一開始的 setup() 中就呼叫了 foo()。這時編譯會出現 "'foo' was not declared in this scope" 錯誤訊息。只要把程式移到沒有中文名稱的路徑下就可以正常編譯。推測可能是 Arduino 1.6.10 之後, 在編譯的細節中有所變動, 導致編譯前段蒐集所有定義項目的資訊無法存回存到位在中文名稱路徑下的專案資料夾, 因而在後段編譯時認不得這些定義在引用處之後的名稱。 附註:在『文件』以及『桌面』下並不會有問題, 因為實際上『文件』與『桌面』的真實資料夾名稱是 Document 與 Desktop, 並不含中文。

星期三, 9月 28, 2016

在 Visual Studio Code 為新語言增加語法標示 (Syntax Highlighting)

Visual Studio Code 寫程式很好用, 但如果遇到特殊或是很新的語言, 就不見得有前人製作好的套件可以幫程式碼標示語法, 這時候就只好自己動手做了。這得自行設計好對應該語言的語法規則套件, 相關說明可參考 Visual Studio Code 的文件。大致步驟如下:
  1. 撰寫該語言的語法規則檔
  2. 以語法規則檔為基礎建立該語言的擴充功能 (extension)
  3. 將建立好的擴充功能加入 Visual Studio Code 後重新啟動 Visual Studio Code
  4. 開啟該語言的檔案或手動選用該語言擴充功能, 就可以看到語法標示發揮效用
首先, Visual Studio Code 沿用了 Mac 上知名的文字編輯器 TextMate 的語法規則檔格式,名稱為 tmLanguage, 可參考 TextMate 網站上的說明。它其實是依循 Properties List Format 格式的 XML 檔, TextMate 本身有提供工具可以編修 tmLanguage 檔, 如果要手工編輯 XML 檔, 我想大部分的人都會卻步, 還好有善心人士設計好工具可以讓我們用 JSON 或是 YAML 格式來編寫語法規則。由於 TextMate 工具與網頁上的說明範例跟 JSON 較相近, 因此我建議採用 JSON, 大家應該可以很容易將 TextMate 網頁上的範例轉換成 JSON 格式。 使用 JSON 寫好語法規格後, 請先安裝 Visual Studio Code 上的 TextMate Language 擴充功能 (extension),它提供有從 JSON 轉成 tmLanguage 格式的功能:
轉換結果會建立一個與你的 JSON 檔同名的文檔, 但附檔名是 tmLanguage, 這個檔案才是符合 TextMate 的語法規則檔, 存檔後就可以進行下一步。 Visual Studio Code 中的語法功能必須建立成擴充功能, 微軟已經幫大家準備好工具, 可以從 tmLanguage 檔自動設計好擴充功能, 這個工具叫做 'code'-Yeoman Generator, 請依照網頁上的說明安裝 (它需要 node.js 以及 npm 套件管理程式)。安裝完成後即可以下達 yo code 指令建立語言擴充套件:
選取『New Language Support』就會進入選項, 你必須依序回答 tmLanguage 檔的位置、此種語言的副檔名、在 Visual Studio Code 中該語言的識別名稱等等,完成後會以你指定的識別名稱建立一個新資料夾, 裡頭就是它幫你設計好的語言擴充功能。 接著, 只要把該資料夾複製到你的 Visual Studio Code 擴充功能資料夾下即可, 一般就是 C:\Users\使用者名稱\.vscode\extensions, 重新開啟 Visual Studio Code 就可以讓語言擴充套件生效了。像是以下就是我建立的新語言擴充功能, 叫做 FLAG-TXT, 專門用來顯示我服務的公司制式文字檔稿件的格式:
在右下角可以看到目前套用的語言名稱為 FLAG-TXT,畫面中也可以看到小節、中標、圖片標示處以及內文中用全行括號標示的加粗文字都會以不同顏色及樣式顯示。 完成了語言法標示後, 你可能還需要為該種語言加上 auto completion 以及 code snippets, 使用起來就會更便利。

附註:TextMate 的語法規則檔不只 Visual Studio Code 使用,鼎鼎大名的 Sublime Text 以及 Atom 也都是使用同一格式來描述語法的規則, 儼然成為文字編輯器界的標準了。