Category Archives: 物聯網

Raspberry Pi 教學-使用網路線讓電腦與樹莓派進行連線(For Mac OS X)

本篇內容是由cavedu的實習生-袁佑緣使用MAC學習樹莓派的心得,用網路線將樹莓派與MAC連接再一起,使用MAC內建的終端機就可以控制樹莓派,讓我們一起來看看~

事前準備工作可以參考Raspberry Pi 教學-燒錄SD卡(For Mac OS X)

試問使用這一個方法究竟有什麼好處?好處是:

1、不需要為樹莓派連接一個螢幕

2、不需要為樹莓派另外接鍵盤、滑鼠

3、樹莓派上網可以直接透過筆電的網路進行上網,不需要另外接網路線或使用WIFI連線

一、設定Mac與Raspberry Pi連線設定

1.將燒好的SD卡插入Raspberry Pi,並將網路線兩端接上Mac與Raspberry Pi,然後插上電源開機,這時候你會看到Raspberry Pi的指示燈有四顆亮著:PWR,FDX、LNK、100,PWR是3.3V電源而其他三個是跟網路相關,另一顆在閃爍的ACT是SD卡讀寫。

2.設定Mac的網路連線:System Preferences -> Network,左欄選擇Ethernet,右欄設定Using DHCP,上面Location設定Automatic,等一陣子後就能看Status變成Connected,這樣就代表連上Raspberry Pi囉!

Rpi_mac05

 

3.設定Mac的網路分享:System Preferences -> Share,在這裡要分成兩個case

(1)如果你處在沒有無線網路的環境下,那就選擇從Ethernet分享到Ethernet

Rpi_mac06

(2)如果你處在有無線網路的環境下,那就可以選擇從Wifi分享到Ethernet,

這樣一來你的Raspberry Pi就可以透過這條網路線上網,相當於你真的接上一條數據機分出來的網路線!

Rpi_mac07

 

4.獲得Raspberry Pi的IP

先安裝mac port(官方安裝網址),安裝完後,

再開啟終端機,輸入指令:sudo port install nmap,安裝Nmap這款網路掃描工具,

完成後再在終端機輸入指令:ifconfig,如下圖並注意下面框起來的IP(192.168.2.1),也就是我們Mac的IP

Rpi_mac08

現在我們必須去掃描DHCP分配給Raspberry Pi的IP,通常是192.168.2.XXX,於是我們使用剛剛安裝的nmap,

在終端機中輸入指令:nmap -sn 192.168.2.1-255 ,從1掃到255如下圖我們掃到了一個IP(192.168.2.22),

這個IP就是Raspberry Pi的IP

Rpi_mac09

5.透過ssh連上Raspberry Pi

接下來讀者只要透過ssh(Secure Shell)遠端連線上Raspberry Pi,就可以在Mac上使用Raspberry Pi了,

首先在終端機裡輸入指令:ssh pi@”剛剛搜到Raspberry Pi的IP”,pi是預設的使用者帳號,範例如下:ssh pi@192.168.2.22,出現問你要不要連線時,輸入yes,然後輸入預設的密碼raspberry

Rpi_mac10

 

如果你的終端機顯示pi@raspberry~$,代表你已經成功與樹莓派進行連線,可以對樹莓派進行控制,如果你對只有使用終端機控制樹莓派感到困難,只要你知道樹莓派的IP,你也可以尋找有GUI介面的連線程式,這樣就更加貼近你平常使用的樹莓派囉~~

Raspberry Pi 教學-燒錄SD卡(For Mac OS X)

本篇內容是cavedu實習生-袁佑緣使用MAC學習樹莓派的心得,使用Mac內建的終端機就可以燒錄樹莓派的IMG檔案到樹莓派,我們一起來看看吧~~

一、準備材料:

1.Raspberry Pi BB+

2.下載最新Raspbian作業系統的映像檔(官方版本)(cavedu樹莓派opencv版本)

3.一張容量大於4GBSD卡(使用opencv版本容量最少需要8G)

4.網路線(於網路連線和電腦連線時使用)

5.micro USB傳輸線+USB充電器

Rpi_mac01

二、燒錄Raspbian映像檔

1.SD卡插入mac筆電

2.在mac的系統程式開啟終端機(Termminal)

3.輸入指令:diskutil list,查詢筆電的硬體狀態,列出如下圖的表

Rpi_mac02

 

這個表會列出這台mac筆電所擁有的硬碟,也包括Mac筆電內建的SSD固態硬碟

 

我們所使用的是16GBSD卡,上表所顯示的記憶體容量可以判斷disk1是SD卡,而它的位置為/dev/disk1,請記下這個位置

4.輸入指令:diskutil unmountDisk “SD卡的位置,將SD卡卸除,

例如:diskutil unmountDisk /dev/disk1

Rpi_mac03

 

5.輸入指令:sudo dd if=”要燒錄的映像檔的位置“ of=”SD卡的位置” bs=2m,將映像檔燒進去SD卡,

dddisk dumpifinput fileofoutput filebsblock size

    小技巧1:要得到燒錄的映像檔的位置可以直接將.img檔的圖示拖曳進終端機裡就可以了

    小技巧2dd指令通常都需要等一段時間,而且終端機的畫面會一直停留在那裏,請大家稍安勿躁,千萬不要以為它失敗就強制取消!但如果想要加快燒進去的速度的話,可以將“disk“改成“rdisk”rraw的意思,原理是raw disk會有較高的讀寫速度

例如:sudo dd if=~/Desktop/2014-12-24-wheezy-raspbian.img of=/dev/rdisk1 bs=2m ,幾分鐘後便燒錄完成了!

Rpi_mac04

 

下一篇是使用網路線讓筆電可以直接控制樹莓派,敬請期待~~~

[LinkIt One 教學] LinkIt One 紀錄 GPS 點於 MediaTek Sandbox (實測於台北 – 武陵農場來回)

為了測試 LinkIt One 的 GPRS 行動網路功能以及電池續航力,決定去一趟武陵農場走走(想玩就說一聲啦!)

早上6:00從台北出發, LinkIt One 插上 3G行動網路預付卡以及 GPS 與 GPRS 天線,希望能順利把GPS座標上傳到 MediaTek Cloud Sandbox 雲端服務。

我們正在與聯發科規劃一系列的 LinkIt One 研習,到時候您也能體驗這項雲端服務喔!

2015-01-23 06.06.08

連 beta 版都算不上的行動版,之後要加裝外殼、燈號/聲音來確認資料是否順利寫入(前一天晚上還在確認啊…)

2015-01-23 06.06.15

來看看,這是從台北走國道五號到宜蘭市的座標軌跡,中間缺一段應該是在雪隧。

2015-01-23 07.12.45

這一段就是走台七甲線到武陵農場,好遠的一段路啊。

2015-01-23 09.02.32

武陵農場內的七家灣溪旁,就是櫻花鉤吻鮭培育中心那邊喔

2015-01-23 13.00.19

 

最後是福利時間,來看看美麗的櫻花與梅花吧!

[LinkIt One 教學] MediaTek Cloud Sandbox 控制 LED 並檢視狀態 – 可同時用手機與網頁來操作

照過來照過來,看看如何使用 MediaTek Cloud Sandbox 雲端服務來控制 LED 並檢視狀態 – 手機與網頁都可以同時控制喔。沒有LinkIt One 開發板的朋友,也可以先到 MCS 註冊一個帳號,我們很快就會辦理 LinkIt One 的物聯網研習,歡迎大家報名喔!

[LinkIt One 教學] 連接 LinkIt ONE 到 MediaTek Cloud Sandbox

先來看影片,配音員阿吉老師

這是系統的樣子,我們直接在 pin 13 插一個超白光 LED,錄影效果比較好。三支天線由上而下分別是 GPRS、Wifi/BT 與 GPS。

IMG_0710

這是本範例的介面,請看最下面的 LED_CONTROL 是控制 LED 亮滅,右邊的 LED 則是檢視 LED 狀態。

螢幕快照 2015-01-21 下午9.19.00

程式碼如下:

//#include <b64.h>
#include <HttpClient.h>
#include <LTask.h>
#include <LWiFi.h>
#include <LWiFiClient.h>
#include <LDateTime.h>
#define WIFI_AP "IT Portable Hotspot"
#define WIFI_PASSWORD "12345678"
#define WIFI_AUTH LWIFI_WPA  // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP.
#define per 50
#define per1 3
#define DEVICEID "********" // Input your deviceId
#define DEVICEKEY "***************" // Input your deviceKey
#define SITE_URL "api.mediatek.com"

LWiFiClient c;
unsigned int rtc;
unsigned int lrtc;
unsigned int rtc1;
unsigned int lrtc1;
char port[4]="   ";
char connection_info[21]="                    ";
char ip[21]="              ";             
int portnum;
int val = 0;
String tcpdata = String(DEVICEID) + "," + String(DEVICEKEY) + ",0";
String upload_led;
LWiFiClient c2;
HttpClient http(c2);

void setup()
{
  
  LTask.begin();
  LWiFi.begin();
  Serial.begin(115200);
  while(!Serial) delay(1000); /* comment out this line when Serial is not present, ie. run this demo without connect to PC */

  Serial.println("Connecting to AP");
  while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
  {
    delay(1000);
  }
  
  Serial.println("calling connection");

  while (!c2.connect(SITE_URL, 80))
  {
    Serial.println("Re-Connecting to WebSite");
    delay(1000);
  }
  delay(100);

  pinMode(13, OUTPUT);
  getconnectInfo();
  connectTCP();
}

void getconnectInfo(){
  //calling RESTful API to get TCP socket connection
  c2.print("GET /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/connections.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.println("Connection: close");
  c2.println();
  
  delay(500);

  int errorcount = 0;
  while (!c2.available())
  {
    Serial.println("waiting HTTP response: ");
    Serial.println(errorcount);
    errorcount += 1;
    if (errorcount > 10) {
      c2.stop();
      return;
    }
    delay(100);
  }
  int err = http.skipResponseHeaders();

  int bodyLen = http.contentLength();
  Serial.print("Content length is: ");
  Serial.println(bodyLen);
  Serial.println();
  char c;
  int ipcount = 0;
  int count = 0;
  int separater = 0;
  while (c2)
  {
    int v = c2.read();
    if (v != -1)
    {
      c = v;
      Serial.print(c);
      connection_info[ipcount]=c;
      if(c==',')
      separater=ipcount;
      ipcount++;    
    }
    else
    {
      Serial.println("no more content, disconnect");
      c2.stop();

    }
    
  }
  Serial.print("The connection info: ");
  Serial.println(connection_info);
  int i;
  for(i=0;i<separater;i++)
  {  ip[i]=connection_info[i];
  }
  int j=0;
  separater++;
  for(i=separater;i<21 && j<5;i++)
  {  port[j]=connection_info[i];
     j++;
  }
  Serial.println("The TCP Socket connection instructions:");
  Serial.print("IP: ");
  Serial.println(ip);
  Serial.print("Port: ");
  Serial.println(port);
  portnum = atoi (port);
  Serial.println(portnum);

} //getconnectInfo

void uploadstatus(){
  //calling RESTful API to upload datapoint to MCS to report LED status
  Serial.println("calling connection");
  LWiFiClient c2;  

  while (!c2.connect(SITE_URL, 80))
  {
    Serial.println("Re-Connecting to WebSite");
    delay(1000);
  }
  delay(100);
  if(digitalRead(13)==1)
  upload_led = "LED,,on";
  else
  upload_led = "LED,,off";
  int thislength = upload_led.length();
  HttpClient http(c2);
  c2.print("POST /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/datapoints.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.print("Content-Length: ");
  c2.println(thislength);
  c2.println("Content-Type: text/csv");
  c2.println("Connection: close");
  c2.println();
  c2.println(upload_led);
  
  delay(500);

  int errorcount = 0;
  while (!c2.available())
  {
    Serial.print("waiting HTTP response: ");
    Serial.println(errorcount);
    errorcount += 1;
    if (errorcount > 10) {
      c2.stop();
      return;
    }
    delay(100);
  }
  int err = http.skipResponseHeaders();

  int bodyLen = http.contentLength();
  Serial.print("Content length is: ");
  Serial.println(bodyLen);
  Serial.println();
  while (c2)
  {
    int v = c2.read();
    if (v != -1)
    {
      Serial.print(char(v));
    }
    else
    {
      Serial.println("no more content, disconnect");
      c2.stop();

    }
    
  }
}



void connectTCP(){
  //establish TCP connection with TCP Server with designate IP and Port
  c.stop();
  Serial.println("Connecting to TCP");
  Serial.println(ip);
  Serial.println(portnum);
  while (0 == c.connect(ip, portnum))
  {
    Serial.println("Re-Connecting to TCP");    
    delay(1000);
  }  
  Serial.println("send TCP connect");
  c.println(tcpdata);
  c.println();
  Serial.println("waiting TCP response:");
} //connectTCP

void heartBeat(){
  Serial.println("send TCP heartBeat");
  c.println(tcpdata);
  c.println();
    
} //heartBeat

void loop()
{
  //Check for TCP socket command from MCS Server 
  String tcpcmd="";
  while (c.available())
   {
      int v = c.read();
      if (v != -1)
      {
        Serial.print((char)v);
        tcpcmd += (char)v;
        if (tcpcmd.substring(52).equals("1")){
          digitalWrite(13, HIGH);
          Serial.print("Switch LED ON ");
          tcpcmd="";
        }else if(tcpcmd.substring(52).equals("0")){  
          digitalWrite(13, LOW);
          Serial.print("Switch LED OFF");
          tcpcmd="";
        }
      }
   }

  LDateTime.getRtc(&rtc);
  if ((rtc - lrtc) >= per) {
    heartBeat();
    lrtc = rtc;
  }
  //Check for report datapoint status interval
  LDateTime.getRtc(&rtc1);
  if ((rtc1 - lrtc1) >= per1) {
    uploadstatus();
    lrtc1 = rtc1;
  }
  
}
LinkItOne_LED_MCS

Broadcom WICED Sense – Bluetooth Smart Sensor Tag 開發環境建置

Broadcom 公司推出的 WICED Sense – Bluetooth Smart Sensor Tag 最近在各大社群討論的相當熱烈。本文要介紹如何安裝其驅動程式,以及安裝 IDE 並燒錄第一支程式。定價19.99 美元,上面就有陀螺儀、加速度計、電子指南針、氣壓、濕度與溫度感測器,超值超值~

只當做終端商品就太可惜了,因此Broadcom 公司也推出了開發環境與範例程式,讓您可以把 WICED Sense 與您的系統進行整合。

2015-01-09 18.44.39

請先在 Broadcom WICDE 網頁 註冊一個帳號之後就可以下載相關的檔案。總共需要兩個檔案:

  • CP210x_Windows.exe – 裝置驅動程式
  • WICED-Smart-SDK-2.2.0-IDE-Installer.exe – 開發環境 (掛在 Eclipse 下)

請注意 WICED Sense能夠做程式燒入的時間大概只有在開機前10幾秒,一旦裝置上電太久,WICED Sense就會開始執行內部程式。另外,WICED Sense 的 RESET 鍵是做在殼的內部,外面兩個按鈕是從MCU的GPIO拉出來。因此如果要讓WICED Sense重新開機的話:

1.      首先要先把電池拔掉(USB也是)
2.      先將遇燒入的程式準備好
3.      插上USB接頭後馬上按下燒錄鈕

接下來請開啟 WICED 開發環境,有使用過 Eclispe 的朋友應該會感到很熟悉囉。

0002

展開來可以看到許多範例

WICED Sense 提供了相當多的範例程式,在 IDE 右側可以找到幾個可以直接用於 WICED Sense 的 Make Target,在此先利用 pwm_tones-BCM920737TAG_Q32 download 做示範:

1.      將電池取出
2.      插上USB線後馬上點兩下pwm_tones-BCM920737TAG_Q32 download
3.      如果下方”Console”出現如下圖的畫面就代表程式燒錄成功。之後每次開機就會直接執行這個程式。

0001

燒入完之後,這隻程式會讓 WICED Sense 發生嗶嗶聲,按下側邊的按鈕還可以改變聲音頻率。

[LinkIt One 教學] 連接 LinkIt ONE 到 MediaTek Cloud Sandbox

本文要介紹如何讓您的 LinkIt ONE 開發板連上 MediaTek Cloud Sandbox 雲端服務。官方說明

前言

首先是在 MCS 上建立一個測試用裝置來代表您的 Linkit one 開發板,接著上傳 Arduino 程式碼好讓這片板子可以藉由 RESTful API 把 代表 D13 LED 燈狀態的資料點(data point) 發佈到 MSC,就能用 MSC 來控制 LED 燈狀態(使用  TCP Socket)。

硬體需求

您需要完成以下兩步驟::

  1. LinkIT ONE 開發板,用USB 或電池供電皆可
  2. 可讓 LinkIT ONE 開發板連上的無線網路

其它則不需任何電子零件,當然您之後要再加入也是可以的。

Step 1. 建立開關式資料通道(Switch-Type data channel) 的新產品 (product)

a. 登入 MSC 之後,請在左側導覽列點選 “Development“,接著點選 “Create” 來建立新產品

b. 請為您的產品填入相關資訊,包括名稱、版本、晶片版號、產品簡述等等,最後點選 save 存檔完成。

c. 在新建完成的產品頁面點選 “Detail

d. 在本頁面中,選擇 “Data Channel” 標籤並點選  “Add” 來建立新的資料通道。

在此要建立兩個資料通道,一個是用來呈現板載 LED 狀態的顯示器資料通道(Display Data Channel);另一個則是對 LinkIt ONE 開發板發送指令來控制 LED 亮滅的控制器資料通道(Controller Data Channel)

e. 請點選 “Display” Data Channel” 並輸入以下資訊:

請把 Data Channel Id 記下來,之後在進行 API 呼叫時要用它來識別。

f. 重複上一步,但請選擇 “Controller” Data Channel” 並輸入以下資訊。它也有一個 Data Channel Id, 請記下來,之後在進行 API 呼叫時要用到它。

g. 完成之後,您應該會在頁面上看到兩個資料通道,如下圖:

Step 2. 建立測試裝置

a. 請點選網頁右上角的 “Create Test Device” 來建立測試裝置。

b. 一旦建立好測試裝置之後,就會看到這個訊息視窗,建立成功囉!

c. 請點選左側導覽列的 “My devices“,您應該可以看到剛剛新增好的 test device。

d. 請點選 “detail” 來看一下裝置頁面。請把裝置ID (deviceId) 與 裝置金鑰(deviceKey),稍後呼叫 API 時會用到。

Step 3. 取得 Device ID, Device Key, Data Channel ID

以下是我們要控制這個 test device 裝置所需要的資訊。請注意以下的 deviceIddeviceKey 要使用您自己裝置的資訊,別忘了在程式碼中修改。

NameValueRemark
deviceIdDsre1qRQUnique Identifier for this Test Device
deviceKeyDFbtsNWg4AuLZ30vUnique API Key for this Test Device
dataChannelIdLEDData Channel Id for LED status
dataChannelIdLED_CONTROLData Channel Id for LED control

Step 4. 編寫開發板的程式

開發板端的程式流程如下,程式碼請由此下載。請注意,本份程式碼需要用到 HttpClient 函式庫,記得下載喔

a. 呼叫 RESTful API:GET api.mediatek.com/mcs/v2/devices/{deviceId}/connections.csv 。藉此取得 Socket Server IP 與Port 的回應值。

b. 初始化 TCP 連線的 socket server

c. 透過 RESTful API ,每5秒鐘上傳一次 D13 (LED) 的狀態到 MCS:POST api.mediatek.com/mcs/v2/devices/{deviceId}/datapoints.csv

d. 透過 TCP 連線來監聽由 MSC 發來的切換指令

e. 每 90 秒更新一次 TCP 連線

Step 5. 啟動!

上傳程式完成的話,請確認裝置真的連上無線網路(天線記得插!),並開啟 Serial Monitor 來看看是否有下列的連線確認訊息。

現在可以回到裝置頁面,這時 LED controller 已經正常運作了,當您將 LED 切換到 ON 時,板子上的 LED 就會亮起來,接著and moments later the state of the LED data channel 的狀態也會跟著顯示為 ON state。另外當您將 LED 切換到 OFF 時,板載LED會熄滅,LED data channel 也馬上會顯示為 OFF state。

完成了,您可以控制 LED 了嗎?

141209 Arduino Yun 物聯網結訓囉 @FutureWard 未來產房

為期四周的 Arduino Yun 物聯網課程結訓囉,大家應該都被折磨的很徹底才對。Arduino Yun 的強項當然在於聯網,不過要連怎樣的網頁甚至是網路服務,這就需要一些額外的申請步驟與認證手續。不會很難,只是麻煩點就是了。

我們四次上課的內容如下:

1. Arduino yun 硬體介紹、環境設定與無線網路設定(可透過無線網路來燒錄 Arduino 程式)。

2. 認識 REST API,能藉由瀏覽器指令(例如 http://arduino.local/arduino/digital/13/1 )控制或讀取腳位狀態

。藉由繼電器來控制一般家電(檯燈),並可自動寄發 Gmail(使用 Temboo 服務)

3. 使用 DHT11 溫濕度感測器,將感測器資料上傳到 Google Docs 試算表、發布訊息到 Twitter 社群網站。

4. 登入 Arduino Yun 的 Linux machine,下指令讓 Webcam拍照。藉由 PIR動作感測器來觸發拍照並上傳到 Dropbox 服務。

上課投影片請由此下載 (全部都放在 SlideShare),CAVEDU 會陸續把所有投影片上線。也歡迎大家許願告訴我們您需要哪方面的內容喔

P1300923

[LinkIt ONE 教學] 取得 Facebook 粉絲頁的 JSON 物件

各位朋友新年快樂,這篇文章要介紹如何使用 LinkIt ONE 來取得 Facebook 粉絲頁底層的 JSON 格式,您可以參考我們日前用 App Inventor 做的版本

LinkIt ONE 的 Wifi / BT 天線是整合在同一支,只要接上板子即可,如下圖。

2015-01-03 16.36.20

在程式中有一個叫做 c 的 LWiFiClient 物件,它負責管理網路相關的動作,get 與 post 等等

LWiFiClient c;

接著在 loop() 中,就透過 c.read() 把指定 URL (再次使用 CAVEDU Facebook 專頁的 open graph) 的字元逐一顯示出來。如下圖的最後一行  { “id” = …  開始就是了。有了這些資料之後就可以玩很多東西了。

while (c)
{
int v = c.read();

if (v != -1)
{
Serial.print((char)v);
}…   //以下省略

 

 

linkit_002

完整的程式碼如下,歡迎您也入手一片 LinkIt ONE 與我們互相討論喔~

/*
  Web client

 This sketch connects to a website 
 using Wi-Fi functionality on MediaTek LinkIt platform.

 Change the macro WIFI_AP, WIFI_PASSWORD, WIFI_AUTH and SITE_URL accordingly.

 created 13 July 2010
 by dlf (Metodo2 srl)
 modified 31 May 2012
 by Tom Igoe
 modified 20 Aug 2014
 by MediaTek Inc.
 */

#include <LTask.h>
#include <LWiFi.h>
#include <LWiFiClient.h>

#define WIFI_AP "XXX"   //your WIFI AP
#define WIFI_PASSWORD "YYY"  //WIFI PWD#define WIFI_AUTH LWIFI_WPA  // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP.
#define SITE_URL "graph.facebook.com"  // note that "caveeducation" is part of the HTTP request rather than host name.

LWiFiClient c;

void setup()
{
  LTask.begin();
  LWiFi.begin();
  Serial.begin(115200);
  
  while(!Serial)delay(100);

  // keep retrying until connected to AP
  Serial.println("Connecting to AP");
  while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
  {
    delay(1000);
  }

  // keep retrying until connected to website
  Serial.println("Connecting to WebSite");
  while (0 == c.connect(SITE_URL, 80))
  {
    Serial.println("Re-Connecting to WebSite");
    delay(1000);
  }

  // send HTTP request, ends with 2 CR/LF
  Serial.println("send HTTP GET request");
  c.println("GET /caveeducation HTTP/1.1");
  c.println("Host: " SITE_URL);
  c.println("Connection: close");
  c.println();

  // waiting for server response
  Serial.println("waiting HTTP response:");
  while (!c.available())
  {
    delay(100);
  }
}

boolean disconnectedMsg = false;

void loop()
{
  // Make sure we are connected, and dump the response content to Serial
  while (c)
  {
    int v = c.read();
    if (v != -1)
    {
      Serial.print((char)v);
    }
    else
    {
      Serial.println("no more content, disconnect");
      c.stop();
      while (1)
      {
        delay(1);
      }
    }
  }

  if (!disconnectedMsg)
  {
    Serial.println("disconnected by server");
    disconnectedMsg = true;
  }
  delay(500);
}
LinkIt ONE 取得 Facebook JSON object

141220_RaspberryPi樹莓派研習營 使用GPIO控制外接電路@未來廠房

樹莓派研習營已經進入倒數第二週了,上週使用Webcam,

掛載opencv讓樹莓派可以進行視覺辨識這週進入GPIO的實戰教學,

本週讓少接電路的學員挑戰控制LED燈的明亮、讀取按鈕是否被按下

還讓樹莓派使用馬達外接晶片L293D,控制直流馬達前進後退!!

首先在樹莓派掛載python專用的GPIO函式庫RPi.GPIO

$sudo apt-get install RPi.GPIO

接著體驗由樹莓派晶片進行的腳位輸出

141222_1

 

再來體驗由樹莓派的針腳高電位與低電位,判斷是否按鈕按下

141222_2

 

 

將以上兩個範例結合,就能直接按按鈕控制LED燈亮案囉

141222_3

 

接著進入樹莓派控制直流馬達,一般控制直流馬達會以PWM訊號為主,

不過實際體驗過後會發現,單單以晶片的供電是很難讓馬達正常的運轉

141222_4

 

 

這時候使用L293D晶片控制馬達,讓我們能夠從外部給予電源供應,樹莓派則是提供

是否讓外部電源給電與停止供電,L293D晶片總共有四個腳位輸入、四個腳位輸出

讓我們最多可以控制四個馬達,這次是使用兩個輸入輸出腳位控制直流馬達正轉或反轉

141222_5

 

 

最後一週會使用機械手臂進行控制伺服馬達的教學,經請期待~

141211_RaspberryPi樹莓派研習營 使用openCV視覺函式庫@未來廠房

第四周未來廠房的樹莓派研習營,本週要介紹的是在樹莓派上運行opencv函式庫。opencv函式庫主要功能在於影像資料的處理,不僅能夠處理靜態影像(圖片、照片等…),也能即時處理動態影像(webcam傳送的即時影像),這次分享的是使用攝影機,讓攝影機能夠辨識眼前的綠色球體。

不過要把 openCV 在 Pi 上面的環境建好需要一點功夫,所以我們已經幫大家準備好了 SD 卡的映像檔,下載之後燒錄,開機就能開始玩 openCV了

[感謝祭,有下有推]Raspbian openCV img 檔下載 – 可用於 Raspberry Pi B、B+ 以及 Banana Pi

這次主要分為三個主題分享

1、讓Webcam連線至樹莓派,將影像串流成功傳到Python開啟的視窗

camera01

2、將影像影像平滑化,找出綠色的物件,將物件以外的影像變為黑色,物件變為白色

camrea02

3、找出綠色物件的邊界值,將物件用框架框起來

camera03

這次分享的內容主要是電腦再進行視覺辨識時,需要做的步驟,

比如透過(1)平滑化,將影像變模糊,減少綠色物件因為光造成顏色不同而產生的辨識錯誤

使用(2)RGB轉換HSV,降低光對顏色造成的影響

接下來(3)調整可以接受的顏色範圍。這樣我們就可以把指定的顏色以白色顯示,其他部分以黑色顯示。

camrea04

接著找出綠色的邊界值,找出辨識物件的對角線頂點,將物件以綠色的線框起來。

這樣就可以在樹莓派上面看到辨識出來的影像囉。

camrea05

這週大家也是全神貫注的聽~12月18日,第五週的課程會上GPIO,

除了上LED和按鈕控制之外,也會把樹莓派裝在車上控制直流馬達,敬請期待!!!

[LinkIt One教學] 雙馬達機器人

使用 LinkIt One 來進行各種 I/O 之後,要做一台機器人也是一定要的。只要使用 L293D 這樣的馬達控制晶片就可以控制直流馬達。先來看影片。偷懶使用 Motoduino 來當作馬達控制板,本程式無法調整馬達速度。

CAVEDU LinkIt One 系列文章

任何雙馬達車身都可以喔。行動電源是對 LinkIt One 供電,電池則是對馬達供電

10815893_889158677763902_535136444_n 10815734_889158541097249_2047084033_n

從上方看下去

10841307_889159007763869_1680010118_n

程式碼如下:

void setup() {
  // put your setup code here, to run once:
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  forward();
  delay(500);
  stopped();
  delay(500);
  back();
  delay(500);
  stopped();
  delay(500);
  left();
  delay(500);
  stopped();
  delay(500);
  right();
  delay(500);
  stopped();
  delay(500);
}

void forward()
{
  digitalWrite( 2, HIGH);
  digitalWrite( 3, LOW);
  digitalWrite( 4, LOW);
}

void back()
{
  digitalWrite( 2, LOW);
  digitalWrite( 3, LOW);
  digitalWrite( 4, LOW);
}

void left()
{
  digitalWrite( 2, HIGH);
  digitalWrite( 3, LOW);
  digitalWrite( 4, HIGH);
}

void right()
{
  digitalWrite( 2, HIGH);
  digitalWrite( 3, HIGH);
  digitalWrite( 4, LOW);
}

void stopped()
{
  digitalWrite( 2, HIGH);
  digitalWrite( 3, HIGH);
  digitalWrite( 4, HIGH);
}

141204_RaspberryPi樹莓派研習營@未來廠房

在未來廠房的樹莓派研習營,已經邁入第三週了,這週要介紹的是在樹莓派上運行 Python程式語言,在這兩個小時當中首先讓大家體驗Python的撰寫特性,

  • 使用辨識符號時只需要給它們賦一個值。不需要聲明或定義資料型別
  • 判斷式沒有大括弧與小括弧,一切以程式是否同一排為準。”縮排”(按鍵Tab)
  • 一行程式碼結束,不需要 ; 號
  • 註解為井字號

01 02

接著是Python的編譯聲明,還有Linux在檔案權限與屬性管理的解說,讓檔案能夠在Linux的環境中被執行,需要對檔案的使用權限逕行更改

03 04

 

0607

 

最後則是分享,Python建立副函式、輸入函式庫、建立函式庫的方法與注意事項

08 09

上課的時候不僅練習課程上的範例,還有學員上台分享自己使用python的經驗,連負責分享的我也長知識啦

20141204_211052 20141204_211110

 

下次上課分享的內容,在樹莓派上裝設webcam,使用Python輸入opencv視覺函式庫,

對球體以及物體的顏色進行視覺辨識,敬請期待~~~

[LinkIt ONE 教學] 透過 Wifi 取得網頁內容

LinkIt One 教學又來囉,這一次是把指定網站的字元讀回來,字元讀回來之後,後面就可以做很多事情啦~  本文參考LinkIt  One 官方使用手冊

只要把 Wifi / 藍牙二合一天線接上去就好,別接錯啊!

2014-12-01 00.50.09

本支程式有幾個重點請您注意,完整的程式碼在文末。請慢慢看完以下說明:

以下是截取 www.appinventor.tw” 的執行畫面,但經過測試,有些不是 www 開頭的網站爬不回來,還在測試中。

0001

網路設定,在此輸入無線網路帳密。

#define WIFI_AP “Name_of_your_AP”
#define WIFI_PWD “Password_of_your_AP”
LWiFi.begin();
LWiFi.connect(WIFI_AP); // if the AP is not encrypted
LWiFi.connectWEP(WIFI_AP, WIFI_PWD); // if the AP uses WEP encryption
LWiFi.connectWPA(WIFI_AP, WIFI_PWD); // if the AP uses WPA encryption

連接指定網站

#define SITE_URL “www.appinventor.tw”
LWiFiClient c; //用這個物件來執行網路動作
c.connect(SITE_URL, 80);

送出 Http request

c.println(“GET / HTTP/1.1”);
c.println(“Host: ” SITE_URL);
c.println(“Connection: close”);
c.println();

取得網站內容,透過 c 來將網頁字元逐一讀回來,並顯示於 serial monitor

int v;
while(c.available())
{
v = c.read(); // return one byte at a time
if(v < 0)
break; // no more data
}

以下為完整的 code,歡迎自己玩玩看喔!

#include <LWiFi.h>
#include <LWiFiClient.h>
#define SITE_URL "www.mediatek.com"
#define WIFI_AP "您的 AP 名稱" //請輸入所要連的AP名稱
#define WIFI_PWD "AP 密碼" // 請輸入AP 密碼
LWiFiClient c;

void setup() {
 Serial.begin(9600);
 LWiFi.begin();

 Serial.println();
 Serial.print("Connecting to AP...");
 if(LWiFi.connectWEP(WIFI_AP, WIFI_PWD) < 0)
 {
 Serial.println("FAIL!");
 return;
 }
 Serial.println("ok");
 Serial.print("Connecting to site...");
 if(!c.connect(SITE_URL, 80))
 {
 Serial.println("FAIL!");
 return;
 }
 Serial.println("ok");
 Serial.println("send HTTP GET request");
 c.println("GET / HTTP/1.1");
 c.println("Host: " SITE_URL);
 c.println("Connection: close");
 c.println();
}

void loop() {
 int v;
 while(c.available())
 {
 v = c.read();
 if(v < 0)
 break;
 Serial.print((char)v);
 }
 delay(100);
}
LinkIt One 讀取網頁

141118 電鈴工作坊@松山文創園區 台北數位藝術中心主辦

11/18 由台北數位藝術中心主辦的 Raspberry Pi 電鈴工作坊,在松山文創園區5號倉庫舉辦。原本主辦單位還擔心辦在週二白天會不會人不多,結果很快就客滿了。好的主題一定會有人支持,還有一家三口來參加呢,爸媽願意帶小朋友參加一些動手做的課程,真是太棒了。

2014-11-18-18_Fotor

本次的主題非常酷!是用 Raspberry Pi 來解析一個 Midi 音樂檔,音樂檔中用什麼節奏來播放音符,Raspberry Pi 就會用這個節奏去帶動電磁閥來敲打鐵琴。程式語言是用 Python,對這份程式有興趣的朋友請點我下載。本日教學投影片請見文末。

學員們早上是焊接並組裝電鈴,聽說隔天還會教大家怎麼設計電路板,太充實啦!下圖中學員是在焊接要接在 Raspberry Pi GPIO 腳位上的控制板

2014-11-18 17.19.01

2014-11-18 17.18.49

這就是我們的電鈴成品,電磁閥帶動木片去敲打鐵管,就可以發出五種不同的聲音。

2014-11-18 13.17.19

到了下午則開始進入 Raspberry Pi 教學。有幾位學員之前沒有玩過 Pi ,所以在燒錄作業系統上花了一點時間。阿吉老師很快教大家一些基礎的系統操作之後,就要開始[認識] 這隻 Python 程式了。簡單來說,程式會去把指定的 midi 檔解碼,並根據對應的時間透過 GPIO 來驅動電磁閥。這樣不論您怎麼寫歌,Raspberry Pi 都會彈出來喔!

這位同學,您為何眉頭深鎖呢?ccc

2014-11-18 17.10.08

2014-11-18 17.30.12

這是本日的教學投影片,是 CAVEDU 一年辦理20場以上的 Raspberry Pi 研習的精華喔,裡面整理了許多疑難雜症的解決方法。如果您還意猶未盡的話,可以參考葉難的專業教學部落格


 

[LinkIt One教學] – 簡訊控制LED亮滅

繼續來介紹 LinkIt One的通訊功能,先從 GPRS 模組開始。

請將 SIM 卡插入 LinkIt One 背面的 SIM 卡插槽,另外還要安裝 GPRS 天線,如下圖。另外請在 pin3 接上一顆LED。操作時,請插入一張有效的 SIM 卡(大張的),對這個號碼發送 “ON” 可以點亮 LED, “OFF”則熄滅 。大小寫沒有差別,程式中都有檢查到喔。

玩一兩次就好,傳簡訊要錢…   或是您可以找一張傳簡訊不用錢的門號就可以一直玩了

2014-11-22 18.16.48

以下為程式碼說明:

重點在於 dtaget[20] 這個字元陣列(長度為20)是用來依序存放簡訊的各個字元,我們藉由檢查前兩個字元是否等於 ON 來開燈,等於 OFF 則關燈。當然囉,一封簡訊可以有許多字元,您可以使用這種方式來把各種檢查碼放入簡訊中,LinkIt One 收到之後就可以執行對應的動作,就好像解碼天書一樣呢!

#include <LTask.h>
#include <LGSM.h>
const int pinLed = 3; // LED接在 D3 腳位

void setup()
{
    Serial.begin(9600);
    while(!LSMS.ready()) //等候 SIM卡模組 ready
    {
         delay(1000);
    }

    Serial.println("GSM OK!!");
}
void loop()
{

    char p_num[20];
    int len = 0;
    char dtaget[500];

    if(LSMS.available()) // 檢查有沒有新簡訊
   {
        LSMS.remoteNumber(p_num, 20); //顯示發送者電話號碼
        Serial.println("There is new message.");

        Serial.print("Number:");
        Serial.println(p_num);
        Serial.print("Content:"); // 顯示簡訊內容

        while(true)
        {
            int v = LSMS.read();
            if(v < 0)
                break;

            dtaget[len++] = (char)v;
            Serial.print((char)v);
         }

         Serial.println();
         LSMS.flush(); // 刪除簡訊
         if((dtaget[0] == 'O' && dtaget[1] == 'N') || (dtaget[0] == 'o' && dtaget[1] == 'n'))
         {
         //檢查簡訊前兩個字元是否為 ON 或 on
         digitalWrite(pinLed, HIGH); 
         // 這不用多說了吧,亮燈!
}

        else if((dtaget[0] == 'O' && dtaget[1] == 'F' && dtaget[2] == 'F') || (dtaget[0] == 'o' && dtaget[1] == 'f' && dtaget[2] == 'f'))
         {
             digitalWrite(pinLed, LOW); 
             // 熄燈
         }
    }
}