8.25.2014

Raspberry Pi智慧家庭應用-2.硬體模組規劃

基於先前的智慧家庭系統規劃,由實體應用連結層來看,為了達成家電控制、智慧家庭主體裝置移動控制、環境監控和影音娛樂分享等...各個方法,在實作上需配合相關硬體模組,架構主要可分為五部分。


【硬體模組架構】


第 一部為紅外線模組:使用其中的紅外線接收器,錄製居家環境中的具有紅外線功 能的家電裝罝,例如:電視、冷氣;再利用紅外線發射器,透過預錄的紅外線訊 號操控裝置電家。
第二部分為顯示模組:當智慧家庭系統開啟時,系統取得網路 IP 位址後,即可透過 HD44780 顯示螢幕,觀看裝置網路 IP 及系統時間狀態。
第三部分為移動模組:方便使用者可以透過遠端操控的方法,移動智慧家庭系統車 體裝置,可利用於居家環境巡邏之用。
第四部分則是環境監控模組:其中包含 Logitech C170 視訊攝影機和一個 Sg90 舵機,這樣的搭配可使攝影機做角度旋轉,透過移動模組讓使用者在監控居家環境時更無死角。
第五部分為溫溼度感測模組:用以觀察居家環境中的溫度與溼度情形。



【實作以車體型式呈現的智慧家庭實體裝置成品】

Raspberry Pi智慧家庭應用-1.系統規劃

純單以自我實作完成的方法做個簡單分享與介紹,基於作者研究主題是以Raspberry Pi Model B 開發版為硬體基礎平台,用以達成居家環境的自動化與智慧化目標,所以在這邊簡單敘述作者利用Raspberry Pi為基礎所建置的智慧家庭系統應用,包含家電控制、智慧家庭主體裝置移動控制、環境監控和影音娛樂分享等...各個的實現方法說明。

選用 Raspberry Pi Model B 是考量未來擴充的便利性,期能透過觀察將現有傳統居家環境缺乏之處予以加強改善,使智慧家庭系統更符合使用者的需求,並易於人性化操作。
如圖所示,將智慧家庭系統規劃分為三層,分別是使用者應用介面層網路層實體應用連結層

規劃使用者應用介面層之目的是讓智慧家庭系統提供的操作介面可在不同裝置平台上執行(跨平台操作使用),並提供使用者一致的系統操作體驗,使其更易於人性化操作。

網路層的規劃考量是因應智慧裝置和網際網路的普及,其目的是讓使用者可以隨時使用隨身的智慧型裝置或是電腦,透過網路傳輸命令來操控居家環境中的智慧家庭裝置,讓使用者在使用上更便利。

實體應用連結層的部分又劃分為兩大單元,分別為遠端控制和影音娛樂,其系統實體裝置提供的功能單元,以及單元中的細部項目詳如下圖所示。


【智慧家庭系統規劃】

本智慧家庭系統之軟體基礎平台是採用源自於 Linux Kernel 3.6 的 Wheezy Raspbion作業系統,此系統建構在 Raspberry Pi Model B 上,就如同小型個人電腦,其與一般個人電腦的差異是多了 24Pin 的 GPIO 腳位,以提供系統硬體模 組擴展之用。如此的設計架構有助於方便擴充其它所需的硬體電子元件與軟體模 組擴展,讓系統規劃更符合本論文所要建置的智慧家庭需求目標。


系統規劃
目的為讓智慧家庭系統負責遠端家電控制和多媒體影音娛樂以及監控系統應用操作,系統裝置能夠移動於無線網路的居家環境,並能即時監控現場居家環境狀況,讓使用者能經由第三方裝置即時透過網際網路掌握和控制居家情況,像是電腦、智慧型手機,平板電腦等智慧型可攜式裝置,希望經由這樣的智慧家庭系統機制,讓使用者在離開家後,仍能隨時透過網際網路與居家環境保持資訊交換,並予以監控狀況。

我的系統規劃是將智慧家庭系統裝置主要劃分兩大單元:
(1) 控制中心: 使用 Whezzy Raspbion 作業系統平台為基礎中心,包含遠端 控制和裝置移動以及環境監控都建構於此作業系統平台架構上,透過網路遙控裝 置,接收使用者端的命令請求,並發送至控制中心,使裝置能夠於居家環境空間 中移動,或是針對系統中的功能下達啟動關閉等操作命令。
(2) 影音娛樂: 具備多媒體影音娛樂功能,透過網路串流服務,操作使用者 端裝置達到影音串流播放,或是直接操作系統提供的使用者介面讓裝置輸出音源 播放和相片預覽。

由於行動上網人數已大幅增加,為提高未來智慧家庭系統使用的方便性,在使用者操作介面上,希望能讓使用者透過簡單的瀏覽器界面,即可以達到對操作智慧家庭系統的控制操作。
觀察目前市面上較為普及的智慧型裝置平台,從市佔率較高的兩大作業系統平台分別為 iOS 及 Android觀之,若是開發者要特別針對這兩個平台分別設計不同的操作原生型的 APP 應用程式,需考量各平台所提供的函式庫,因此會使其所設計出來的 UI(User Interface)界面難免會有所差異,因此為讓使用者能在不同裝罝上操作一致,選擇以瀏覽器做為使用者操作介面平台,讓使用者不論是在個人電腦、智慧型手機或是平板電腦等不同裝罝,使用的操作介面皆能有統一的一致性,更可以減少在開發時間成本上的浪費,對於後續的使用者操作介面維護也能更有效率。

8.24.2014

Admob sdk 遷移至 Google Mobile Ads SDK(Google Play service)

獨立式 Android SDK 將於 8 月 1 日全面淘汰
自 2014 年 8 月 1 日起,凡是使用獨立式 Google AdMob SDK 的應用程式 (包括新應用程式和舊有應用程式的更新),都會遭到 Google Play 商店拒登。這是因為獨立式 SDK 並未使用廣告 ID,因此屆時將無法符合 Google Play 廣告政策的規定。


Google Mobile Ads SDK 入門指南
Android 範例程式:https://github.com/googleads/googleads-mobile-android-examples/tree/master/doubleclick/banner
iOS 範例式:https://github.com/googleads/googleads-mobile-ios-examples/tree/master/doubleclick/DFPBannerExample


Google Play 服務遷移
https://developers.google.com/mobile-ads-sdk/docs/admob/play-migration?hl=zh-tw 



【Reference】
https://developers.google.com/mobile-ads-sdk/docs/admob/play-migration?hl=zh-tw
https://developers.google.com/mobile-ads-sdk/docs/

Add google-play-services_lib project

Add google-play-services_lib project 

1. 在 Android SDK Manager 中,確認 Extras -> Google Play service 已安裝.

2. 由Eclipse 進行 project import:File -> Import -> Android -> Existing Android Code Into Workspace -> 挑選 google-play-services_lib 的位置 (ex: /develope/Lib/android-sdk/extras/google/google_play_services/libproject/google-play-services_lib),記得選擇libproject 裡的資料夾.

3. 在原本的 project 設定:Eclipse -> Project ->Properties -> Android -> Library -> Add -> 挑選 google-play-services_lib.




條件
1. 請確認您使用的是最新版的 Android SDK,並依據 Android v3.2 或更新版本進行編譯 (將 project.properties 中的 target 設為 android-13)。

2. Android 專用 Google Mobile Ads SDK 要求 Android 2.3 或更新版本 (將 AndroidManifest.xml 中的 android:minSdkVersion 至少設為 9) 的執行階段。也就是說,您可以使用最新版本的 Android SDK 進行開發,而您的應用程式仍然可以在較早的 Android 版本 (至少 2.3 版) 上運作。


整合 SDK
將 Google 行動廣告整合進應用程式相當簡單:

1. 在 Eclipse 工作區中新增並參照 Google Play 服務程式庫專案。
2. 在 AndroidManifest.xml 加入 meta-data 標記。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.company"
          android:versionCode="1" android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name"
               android:debuggable="true">
    <meta-data android:name="com.google.android.gms.version"
               android:value="@integer/google_play_services_version"/>
    <activity android:label="@string/app_name" android:name="BannerExample">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
  </application>
</manifest>


3. 在資訊清單中宣告 com.google.android.gms.ads.AdActivity。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.company"
          android:versionCode="1" android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name"
               android:debuggable="true">
    <meta-data android:name="com.google.android.gms.version"
               android:value="@integer/google_play_services_version"/>
    <activity android:label="@string/app_name" android:name="BannerExample">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
    <activity android:name="com.google.android.gms.ads.AdActivity"
             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
  </application>
</manifest>

4. 在資訊清單中設定網路權限。
             INTERNET
                 必要。用來存取網路,以發出廣告請求。
             ACCESS_NETWORK_STATE
                 選用。用來在發出廣告請求前,先行檢查是否有可用的網路連結。


【Reference】
https://developers.google.com/mobile-ads-sdk/docs/

Raspberry Pi Install development kit

安裝遠端連線xrdp套件
pi@raspberry:~$sudo apt-get install xrdp


安裝Python GPIO套件
pi@raspberry:~$sudo apt-get update
pi@raspberry:~$sudo apt-get upgrade -y
pi@raspberry:~$sudo apt-get install python-dev
pi@raspberry:~$sudo apt-get install python-setuptools
pi@raspberry:~$sudo easy_install -U distribute
pi@raspberry:~$sudo apt-get install python-pip
pi@raspberry:~$sudo pip install rpi.gpio


安裝Java JRE
sudo apt-get remove python3
sudo apt-get clean
JDK: sudo apt-get install openjdk-7-jdk (不用裝,裝JRE即可啟動Apache WebService)
JRE: sudo apt-get update && sudo apt-get install openjdk-7-jre
sudo apt-get install openjdk-7-jre
OR
sudo apt-get install openjdk-6-jre (new)



Uninstall OpenJDK related packages.
sudo apt-get purge icedtea-* openjdk-*
sudo apt-get remove openjdk-6-jre

sudo apt-get remove default-jre

Raspberry Pi setup nework

Setup nework設定網路
    01 搜尋無線網路
  pi@raspberry:~$sudo iwlist scan | grep ESSID

    02 pi@raspberry:~$sudo nano /etc/network/interfaces
  Add below...

【Example】
---------------------------------------------------------------------------------------------------------------------
#/etc/network/interface
#修改/etc/network/interface文件,修改成功後保存,最後執行/etc/init.d/networking restart即可

iface lo inet loopback
iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "myssid"
wpa-psk  "mypsk"

Explanation說明:
auto wlan0 :說明系統啟動時自動啟動wlan0;
allow-hotplug wlan0:允許熱插拔wlan0;
iface wlan0 inet dhcp:對wlan0網口使用dhcp方式獲取IP地址;
wpa-ssid "myssid":設置准備連接的wifi熱點的ESSID;
wpa-psk  "mypsk":設置wifi熱點的密碼。這裏需要注意的是mypsk不是wifi熱點的密碼,而是通過使用wpa_passphrase命令得到的結果的psk值;
---------------------------------------------------------------------------------------------------------------------


【網路配置方法】
---------------------------------------------------------------------------------------------------------------------
#sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="AirPort_Router"
        psk="abcdefghij123"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}

network={
        ssid="ssidname"
        psk="ssidpassowrd"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}

---------------------------------------------------------------------------------------------------------------------

Raspberry Pi SD backup and restore

01. Start up  your terminal tool on computer.

02. Backup 備份:BackupSDImg (MaxOS)
    02-1。$df -h ( look for your SD Card. My card is listed as /dev/disk1s1. Once you know which card is your SD Card type)
    02-2。$diskutil unmount /dev/disk1s1 (or whatever your SD Card is listed as)
    02-3。$sudo dd if=/dev/disk1 of=/develope/rpi_backupImg/wheezy-raspbian-Backup.img bs=4m


03. Restore 還原:WritingSDImg (MaxOS) 
    03-1。$diskutil unmount /dev/disk1s1 (or whatever your SD Card is listed as)
    03-2。$sudo dd if=/develope/rpi_backupImg/wheezy-raspbian-Backup.img of=/dev/disk1 bs=4m




【Other】
$Ctrl+t (check backup process status查看備份進度)
$diskutil eject /dev/rdisk1 (Once the backup is complete execute)

Raspberry Pi 介紹


Raspberry Pi(簡稱RPI,中文稱樹莓派),由英國的Raspberry Pi基金會所開發,其目的主要是為促進學校的電腦科技學教育,採用低價的硬體及自由軟體,平台以Linux為基礎系統。

Raspberry Pi外形只有一張信用卡大小,但具有電腦的所有基本功能,類同小型電腦主機板,支援滑鼠、鍵盤、螢幕輸出、還有音訊與網路,以及包含GPIO傳輸介面,並且還可以執行Debian作業系統(Linux Kernel)或者其它嵌入式系統如Arch Linux ARMQtonPi的一台小型迷你電腦。


【  Raspberry Pi Model B結構圖 [1] 】



【  Raspberry PiPCB電路板配置圖 [2] 】



【 Raspberry Pi Model B 26 Pin腳位配置圖 [3]  】



尺寸
85.60mm x 53.98mm
處理器
Broadcom BCM2835
每秒周轉速數
ARM1176JZF 700MHz
記憶體
512MB
外接儲存媒體
SD/MMC/SDIO card slot
輸入電壓
5V (via MicroUSB or GPIO header)
最低輸出功率
700mA(3.5W)
周邊
GPIO, SPI, I2C, UART
RTC
No clock or battery
網路埠
10/100 wired Ethernet
USB 2.0
2 (via iterated USB hub)
影像輸出
Composite RCA, HDMI
音頻輸出
3.5mm jack, HDMI
Digital GPIO
8
【 Raspberry Pi Model B規格 】






【Ohter】
Downloads | Raspberry Pi:http://www.raspberrypi.org/downloads/
硬Pi製作:https://sites.google.com/site/raspberrypidiy/home


【Reference】
[1] Raspberry Pi, http://www.raspberrypi.org/.
[2] Raspberry Pi PCB, http://en.wikipedia.org/wiki/Raspberry_Pi.
[3] Raspberry Pi GPIO Connector, http://www.combinatorialdesign.com/boards/Raspberry_Pi/P1.