2016/01/25

Raspberry Pi情報彙整(62)

我收集整理網路上看到的、感興趣的、跟Raspberry Pi相關的資訊,如果您發現任何新奇驚人的專案、新聞、活動等等,還請留言告知。

[活動] Microsoft × Raspberry Pi.Taiwan × Raspberry.Taipei 社群聚會 #13 @2016/02/24,由台灣樹莓派、台灣微軟與Raspberry.Taipei聯合舉辦,主題是「如何在Windows 10上開發 RPi 以及物聯網的應用」,分享者微軟資深平台架構技術經理Herman Wu(吳宏彬),介紹如何在Windows10上開發RPi以及物聯網的應用。活動時間: 2016/2/24(週三)19:30 ~ 21:00,免費入場,但要先報名。
[活動] Raspberry Pi 樹莓派遊戲機實作坊,4大課程+7項主題,從入門到進階一天完全學會 × T客邦,時間:2016/2/20(六) 早上 09:30~下午 17:30。
SeeMore - parallel computing sculpture - The Magpi Magazine,256台Model B+,其模樣仿效70年代的超級電腦Cray-1,企圖以視覺化的方式,向一般大眾介紹平行運算。
Raspberry Pi Physical Dashboard | Adafruit Learning System,詳細教學文,打造實體儀表板,顯示各種資訊,包括未讀郵件、CPU負載、記憶體用量,甚至還能顯示快樂指數。
Pimp your Raspberry Pi with a 3D Printed Case! - joosNET,Pi有外殼並不稀奇,但你沒看過造型如同果餡餅一般的外殼吧,看起來很美味。
Video output challenge solved with the RPI-Zero – Nerdsynth Devblog,合成器(synthesizer)專案的副專案,以Pi Zero負責視訊輸出的部份。
Musical Minecraft - The Magpi Magazine,結合Sonic Pi與Minecraft,有聽覺、也有視覺,雙效合一。
DIY Raspberry Pi LED Matrix Display: PiXels,使用Pi 2,控制12個32x32 LED矩陣。
PiGRRL 2 | Adafruit Learning System,Adafruit更新先前的專案,改用Pi 2,自己打造隨身攜帶的掌上型遊戲機。
Pocket FM,發生戰爭與偏遠地區,往往沒有網路、報紙、電視,此時就要靠廣播radio來接收消息。
Raspberry Pi High Tide Tracker | Average Man Vs Raspberry Pi,住在海邊,要小心漲潮啊。
HomePi - A Windows 10 & Raspberry Pi 2 IoT app - Part 1,Windows 10 IoT與Pi 2的專案不多,看看這個吧,顯示當日天氣與下一班公車何時來。
Life-Size Raspberry Pi 3D Scanner Is A Revolution In The Making - Techy Trends,挖賽,可以掃描真人大小的3D掃瞄器。嗯,接下來是不是可以3D列印,印出類似真人大小的銅像?
How to Use Lidar with the Raspberry Pi | Hackaday,偵測距離乃是一門課題,對於體積龐大的機器人或自走車更是如此,試試Lidar吧,雷射距離偵測裝置。


其他:

2016/01/23

Raspberry Pi:B+與Pi 2採用二合一型影音類比端子(AV視訊端子與3.5mm耳機音訊)

Raspberry Pi Model B擁有AV端子類比視訊輸出(RCA梅花端子)與3.5mm耳機孔插座類比音訊輸出,而Raspberry Pi Model B+Raspberry Pi 2結合兩者,減小體積,因此需要不一樣的線材。

從左到右:3.5mm TS插頭(單聲道)、3.5mm TRS插頭(雙聲道、立體聲)、3.5mm TRRS插頭。tip、ring、sleeve之間的黑色部分是絕緣環。
若是3.5mm TRS插頭(雙聲道、立體聲),應是普遍採用的標準,常用於一般耳機。tip是左聲道、ring是右聲道、sleeve是接地。也是下圖Model B採用的標準。
但若是下圖的Model B+(以及Pi 2),則是3.5mm TRRS規格,結合了AV端子類比視訊輸出與3.5mm耳機孔插座類比音訊輸出,需要準備不同的線材。
Model B+(以及Pi 2)採用的標準是:tip是左聲道、ring(first)是右聲道、ring(second)是接地、sleeve是視訊。需要類似底下的線材,一般來說,黃色代表AV視訊端子,紅色是右聲道,白色是左聲道。

可惜的是,上述線材並未有統一標準,某些廠牌與裝置,可能採用不同的規格,購買時須分辨清楚。
另外,上述線材會把音訊左右聲道轉成RCA端子,可再使用底下轉接頭(或線)再轉成一般的3.5mm TRS規格。

2016/01/22

Arduino:在Windows裡使用Python語言經由Firmata協定控制Arduino開發板

Firmata是一套溝通協定,用於微控制器開發板(如Arduino)和主機電腦(如Windows、Linux、Mac OS X、Android、iOS)之間的溝通,採用MIDI訊息格式,但訊息內容的意義不同,藉由各種訊息來控制Arduino腳位、以及從Arduino回報狀態。

既然是套協定,溝通兩端都必須實作,Arduino端的實作已包含在Arduino IDE裡,並且有範例程式;至於主機端的實作,有各種程式語言的版本,此處採用Python語言的模組pyFirmata

這一篇僅是簡單試用,主機端是Windows XP(以及Cygwin),在Python shell下,使用模組pyFirmata,經由序列埠介面,控制Arduino UNO板內建的LED(腳位13);但不會介紹Firmata程式庫與模組的任何API。

首先是Arduino端,Arduino IDE已包含Firmata程式庫,我們要做的事是燒錄範例草稿碼StandardFirmata,位於選單「檔案」-「範例」-「Firmata」-「StandardFirmata」,開啟後燒錄進Arduino開發板,這支草稿碼能夠接受從主機端傳來的Firmata訊息,解析其中的指令,操控腳位。

然後是主機端, 我的Windows已安裝Python 2.7與pip,以底下指令安裝模組pyFirmata:
$ pip install pyFirmata

然後進入Python shell,匯入模組:
$ python
>>> from pyfirmata import Arduino, util

傳入埠號,開啟序列埠裝置。從Arduino IDE的選單裡,可看到我的UNO板連接到電腦的COM3,若是在Windows的命令提示字元底下,應傳入'COM3';而若是在Cygwin裡,會被命名為裝置/dev/ttyS2:
>>> board = Arduino('COM3')

然後運用API,傳出Firmata訊息,控制腳位13(LED):
>>> board.digital[13].write(1)
>>> board.digital[13].write(0)

便可看到LED被點亮與熄滅。


參考資料:

2016/01/19

Arduino IDE 1.5:程式庫規格書

翻譯自官方文件:Arduino IDE 1.5: Library specification · arduino/Arduino Wiki


Arduino IDE 1.5.x(以上)的第三方程式庫規格書。
  • rev.1,從1.5.3開始實作。(已被rev.2取代)
  • rev.2,從1.5.6開始實作此規格。
制定新程式庫格式的用意是為了搭配自動化的程式庫管理員Library Manager),自1.6.2版開始啟用。有了程式庫管理員,使用者就能夠根據專案需求,透過操作簡易的圖形化介面,自動下載並安裝所需程式庫;目前尚未能處理程式庫之間相依性,關於程式庫管理員的進一步資訊,請參閱此處說明文件

Arduino 1.5.x支援多種微控制器架構(諸如AVR、SAM、等等),意思是說,程式庫可能需要能在多種架構上運作,新版的1.5.x程式庫格式,並未對跨架構程式庫提供特殊支援,但提供了前置處理機制,供程式庫判斷,可為不同架構提供不同的程式碼。

其他參考文件:


1.5版程式庫格式(rev.2)

程式庫後設資料(metadata)

新格式最重要的地方是透過名為library.properties這支屬性檔案,描述程式庫本身的資訊。

有了這支檔案,將來的程式庫管理員就能夠以簡易且自動的方式,搜尋並安裝相依的程式庫。

library.properties檔案格式

library.properties檔案含有「鍵=值」的屬性列表,此檔內每一欄位都採用UTF-8文字編碼,可用欄位如下:

name:程式庫的名稱。
version:程式庫的版本,版本編號應相容於semver,1.2.0是正確的,1.2可接受,但r5、003、1.1c則為無效的版本編號。
author:作者的姓名或暱稱,以及電子郵件地址(非必要),以逗號「,」隔開。
maintainer:維護者的姓名與電子郵件地址。
sentence:以一句話檢視這套程式庫的用途。
paragraph:用更長的句子描述說明。一定會加上sentence的句子,所以你應該從第二個句子開始撰寫。
category:若有此欄位,請從Display、Communication、Signal Input/Output、Sensors、Device Control、Timing、Data Storage、Data Processing、Other之中選一個。
url:程式庫專案的網址,供他人參訪。可以是github或其他類似頁面。
architectures:這套程式庫支援的架構清單,以逗號「,」隔開。若程式庫不含有特定於某架構的程式庫,請使用「*」代表所有架構。

範例:
name=WebServer
version=1.0
author=Cristian Maglie <c.maglie@example.com>, Pippo Pluto <pippo@example.com>
maintainer=Cristian Maglie <c.maglie@example.com>
sentence=A library that makes coding a Webserver a breeze.
paragraph=Supports HTTP1.1 and you can do GET and POST.
category=Communication
url=http://example.com/
architectures=avr

資料夾與檔案的位置規劃

Arduino程式庫由數個資料夾組合而成,每個資料夾皆有其特定用途(原始碼、範例、文件、等等),將來改版時可能會加入底下未提及的新資料夾。

原始碼

只相容於1.5.x版的程式庫,把原始碼檔案放在資料夾src裡,例如:

Servo/src/Servo.h 
Servo/src/Servo.cpp

資料夾src與它的所有子資料夾裡的原始碼,都會被編譯並跟使用者的草稿碼連結在一起,只有資料夾src被加入搜尋路徑清單裡(編譯草稿碼與程式庫之時)。當使用者匯入程式庫到他的草稿碼(透過選單「工具」-「匯入程式庫」),src資料夾裡的所有.h標頭檔(但不包括子資料夾),都會加上#include前置處理指令放進草稿碼,因此,這些標頭檔可算是你的程式庫的對外介面,一般來說,放在src資料夾內的標頭檔,會是你想要對外公開的東西,並且計畫在程式庫未來版本維持相容性。程式庫內部自己使用得標頭檔,應放在src的子資料夾裡。

若想向後相容於Arduino 1.0.x,程式庫作者可選擇不要把原始碼放進src資料夾內,此時應採用1.0版程式庫格式的資料夾規劃,放在根資料夾以及utility子資料夾裡,例如:

Servo/Servo.h 
Servo/Servo.cpp 
Servo/utility/ServoTimers.h 
Servo/utility/ServoTimers.cpp

This will allow existing 1.0.x libraries to compile under 1.5.x as well and vice-versa. If a library only needs to run on 1.5.x, we recommend placing all source code in the src/ folder. If a library requires recursive compilation of nested source folders, its code must be in the src/ folder (since 1.0.x doesn’t support recursive compilation, backwards compatibility wouldn’t be possible anyway).

這麼一來,1.0.x程式庫便可在1.5.x之下進行編譯,反之亦然。若程式庫只需相容於1.5.x,我們建議把所有原始碼放進src資料夾,若程式庫需要巢狀原始碼資料夾的遞迴式編譯,那麼原始碼必須放在src資料夾內(因為1.0.x不支援遞迴式編譯,所以無法維持向後相容性)。

程式庫範例

程式庫的範例程式,應放在examples資料夾裡,此資料夾的名稱必須一字不差,全部都是小寫字母。

Servo/examples/...

範例資料夾內的草稿碼,會顯示在IDE選單「範例」裡。

額外文件

開發人員可在extra資料夾內,放入說明文件或其他想跟程式庫綁在一起的東西。請記得,此資料夾裡的東西將會增加程式庫的大小,因此若放進僅含數KB內容的20MB PDF檔,大概不會是個好主意。

IDE完全忽視extra資料夾的內容,你可以放入任何東西,諸如其他說明文件等等。

關鍵字

在名為keywords.txt的檔案裡,放入應特別顯示的關鍵字清單,此檔案的格式與1.0版相同。

Servo/keywords.txt

完整示範

根據上述規格,底下是名為Servo的假想程式庫:

Servo/ 
Servo/library.properties 
Servo/keywords.txt 
Servo/src/ 
Servo/src/Servo.h 
Servo/src/Servo.cpp
Servo/src/ServoTimers.h 
Servo/examples/ 
Servo/examples/Sweep/Sweep.ino 
Servo/examples/Pot/Pot.ino 
Servo/extras/ 
Servo/extras/Servo_Connectors.pdf

多重架構

In 1.5.x, libraries placed in the user’s sketchbook folder (in the libraries/ subfolder) will be made available for all boards, which may include multiple different processor architectures. To provide architecture-specific code or optimizations, library authors can use the ARDUINO_ARCH_XXX preprocessor macro (#define), where XXX is the name of the architecture (as determined by the name of the folder containing it), e.g. ARDUINO_ARCH_AVR will be defined when compiling for AVR-based boards. For example,

在1.5.x版裡,放在草稿碼簿資料夾裡的程式庫(位於libraries子資料夾內),可供所有板子使用,可能包含不同處理器架構的特定程式碼;若想撰寫特定架構的程式碼或最佳化,程式庫作者可以使用前置處理器的巨集ARDUINO_ARCH_XXX(#define)來判斷,其中XXX是架構的名稱(根據包含該架構的資料夾之名稱),譬如在為AVR板子進行編譯時,將會定義ARDUINO_ARCH_AVR,寫法如下:

#if defined(ARDUINO_ARCH_AVR)
  // AVR特定程式碼
#elif defined(ARDUINO_ARCH_SAM)
  // SAM特定程式碼
#else
  // 泛用、非特定平台的程式碼
#endif

Alternatively, if a library only works on certain architectures, you can provide an explicit error message (instead of allowing the compilation to fail in an difficult to understand way):
或者,若你的程式庫只能用於某些特定架構,可提供明確的錯誤訊息(而不是直接讓編譯失敗,難以了解到底哪裡出錯):

#if defined(ARDUINO_ARCH_AVR)
  // AVR特定程式碼
#elif defined(ARDUINO_ARCH_SAM)
  // SAM特定程式碼
#else
  #error "This library only supports boards with an AVR or SAM processor."
#endif

舊程式庫格式(1.5版之前)

為了支援舊版格式的程式庫(自Arduino 1.0.x版以來),Arduino 1.5.x也能編譯缺少後設資料檔library.properties的程式庫,使用時,這些舊程式庫應如同在Arduino 1.0.x的樣子;可用於所有板子,包括非AVR架構的板子(不會出現於1.0.x版)。

2016/01/18

Raspberry Pi情報彙整(61)

我收集整理網路上看到的、感興趣的、跟Raspberry Pi相關的資訊,如果您發現任何新奇驚人的專案、新聞、活動等等,還請留言告知。

LEGO Ideas - Lovelace & Babbage,贊同人數已到七千,超過一萬的話,就有可能商品化。請大家抽空註冊(免費),按下「Support」鈕(免費),支持這套樂高組合吧。
Artificial Raspberry Pi Pancreas - Raspberry Pi,監控血糖,控制胰島素;太厲害啦。
Ubuntu Pi Flavour Maker,讓Pi 2嘗試各種不同風味的Ubuntu。
SmartiPi Touch: A Raspberry Pi Touch stand by Tom Murray — Kickstarter,特別設計的架子,可裝Raspberry Pi官方出的觸控螢幕與HAT擴充板。
PiNoculars - Raspberry Pi Binoculars,Pi相機加上望遠鏡。
Ten Mile Raspberry Pi WiFi (with a Catch) | Hackaday,Wi-Fi訊號頻帶與美國Ham無線電頻帶重疊,以更強功率發射Wi-Fi訊號,範圍更廣。(註:視各國對於電磁波頻率的管制法律而定。)
Using a PS/2 keyboard with a Raspberry Pi,想自己動手為rpi寫個OS,可是鍵盤輸入的部份怎麼辦呢,USB用起來很方便,但在那背後可是有一大堆程式碼啊。自己動手弄個PS/2鍵盤的功能吧。
Raspberry Pi 2: 17 of the best projects you can try with the microcomputer | Alphr,專案集錦,包括Bitcoin挖礦機、啤酒冰箱、雲端運算叢集、下載機、媒體中心等等。
Raspberry Pi Wind Measurement | Hackaday,偵測風速、風向、氣溫,太陽能供電。
Self Driving RC Car – Zheng Wang,自動駕駛汽車,運用Python與OpenCV視覺辨識。
Raspberry Pi: Wall Mounted Calendar and Notification Center,數位日曆;嗯,希望可以模仿撕日曆紙的動作,呵呵。
Primrose Solar Power monitor - Bad Dog Designs Nixie Clocks,重現30年代的太陽能電源監視器。
En synthèse, pour ceux qui ne veulent pas se palucher tout le forum - ardechelibre[.org],蝙蝠記錄器,嘿,可以抓到蝙蝠俠嗎?
RasPiO Pro Hat Protect/Position Raspberry Pi Ports Perfectly by Alex Eames - RasPi.TV — Kickstarter,擴充板,加入保護機制,防止過大電流或電壓造成毀損。
Pingometer - Everyday Engineering - The Magpi Magazine,簡單的事搞得複雜一點,明明ping一下、從螢幕上即可得知網路延遲,偏偏要以伺服馬達轉動指針,真累人啊。
How to build your own R2-D2 with the Raspberry Pi Zero | TechRadar,雖然BB-8是新寵兒,但我們不可能忘記R2-D2啊,自己打造吧。
ProtoZero - A Raspberry Pi Zero Prototyping Board by Richard Saville — Kickstarter,Pi Zero的原型擴充板。
PiZero Christmas Project Complete | The Meandering Pi,文字時鐘,使用LED矩陣與MAX7219。
Raspberry Pi Zero Retro Gaming System | element14,在Pi Zero上玩玩骨灰遊戲吧。
Raspberry Pi Zero Internet Connected Information Display – Frederick Vandenbosch,資訊顯示螢幕,想顯示什麼就顯示什麼。
Audio Outputs | Introducing the Raspberry Pi Zero | Adafruit Learning System,Pi Zero沒有一般的耳機插孔,但可以自己動手改啊。
Raspberry Pi ZERO Minimal Streamer - PolyVection,Pi Zero沒有一般的耳機插孔,這項專案使用TI的PCM5142(DAC晶片),打造音樂串流器。
Tote Zero - Affordable quadruped robot powered by a Pi Zero,四足機器人。
PXFMini Open Autopilot Shield for Raspberry Pi Zero | Erle Robotics,Pi Zero擴充板,自動駕駛。

其他:

2016/01/16

Raspberry Pi Zero:網路、USB、電源

拿到Pi Zero後,最需要關切的地方應有兩處:網路與USB,Pi Zero無內建乙太網路,USB埠只有一個(另一個是電源);我在「Raspberry Pi Zero開箱、從序列埠登入與Wi-Fi上網」一文中,使用「USB轉序列埠」的轉接線來登入系統,設定好網路組態後,讓Pi Zero透過USB無線網卡上網。

以下列出其他相關資訊,注意,我僅是到網路上看別人的分享文章,彙整收集,大都沒有實際經驗,底下照片中的產品,不保證能用於Pi Zero。

網路:

使用USB Wi-Fi無線網卡。
使用USB轉RJ-45(乙太網路)的產品。
使用各家USB線材連接手機,由手機分享網路連線。
以上方式的參考資料:How to give an internet access to Raspberry Pi Zero - All[常見問與答] Raspberry Pi Zero 網路解決方案 - 台灣樹莓派蘋果iPhone手機要如何分享網際網路給電腦(桌上型/筆記型)? @ 電癮院 :: 痞客邦 PIXNET ::手機USB數據連線分享網路給電腦 @ 電腦分析室請上2F :: 痞客邦 PIXNET ::

Ethernet On Pi Zero – How To Put An Ethernet Port On Your Pi – RasPi.TV,透過SPI連接乙太網路模組。
First Raspberry Pi Zero Hack – Piggy-Back WiFi. | Hackaday,直接焊接USB Wi-Fi無線網卡裡的模組與Pi Zero的USB線路,等同於插入USB Wi-Fi無線網卡,但不使用USB線。
Raspberry Pi $2 WiFi Through Epic SDIO Hack,使用SDIO線路連接到ESP8266。照片裡不是Pi Zero。

USB:

Raspberry Pi Zero – USB Hub Mod – Frederick Vandenbosch,LogiLink UA0160這款USB集線器,大小尺寸跟Pi Zero差不多,稍作修改,附加到Pi Zero板子身上。
Raspberry Pi Zero 4 Port USB Hub – Open Source PCB Design | openhardware.co.za,製作4埠的USB集線器供Pi Zero使用,自己設計電路板,主要零件是TI TUSB2046B晶片。注意,目前(2015.12.12)已把PCB設計圖送往生產,但尚未完成。
(One More) Raspberry Pi Zero USB Hub • Hackaday.io,製作4埠的USB集線器供Pi Zero使用,自己設計電路板,主要零件是FE1.1s晶片注意,目前(2016.01.14)已把PCB設計圖送往生產,但尚未完成。
USB hub for the Raspberry Pi Zero - Deluxe Capacitor,製作4埠的USB集線器供Pi Zero使用,自己設計電路板,主要零件是FE1.1s晶片。
projekte:raspberry-pi:zero-usb-hub-housing [Daniels Lab Wiki],算是逆向思考嗎?把Pi Zero放進LogiLink UA0141這款USB集線器裡。
電源:

Raspberry Pi Zero - Power Consumption Comparison | Midwestern Mac, LLC、Raspberry Pi Zero - Conserve power and reduce draw to 80mA | Midwestern Mac, LLC,仔細量測Zero與其他板子的耗電量,思考如何降低,如何關閉各元件。
How to run a Pi Zero (and other Pi's) from a LiPo Including low battery…,以LiPo電池供電。

USB進階: 

Turning your Raspberry PI Zero into a USB Gadget | Adafruit Learning System,教學文,讓Pi Zero成為USB裝置(原文是device、或稱為gadget),譬如序列埠裝置與網路裝置。也請參考Raspberry Pi • View topic - HOWTO: Enable USB device mode on Pi ZeroRaspberry Pi Zero – Programming over USB! | Andrew's blog