Tag Archives: iphone

[ 介紹文 ] 2018.09.13- 從Apple秋季新品發表會,整理Apple目前最新的機器學習應用

文字撰寫

宗諭、阿吉老師

審閱

阿吉老師

照片來源pixabay發表會地點Steve Jobs Theater
發表會時間

2018年9月13日

部分觀點、看法參考自WIRED網站文章:APPLE’S LATEST IPHONES ARE PACKED WITH AI SMARTS  ,特此致謝!

完整看完這次的Apple秋季新品發表會,其中真是有相當多的亮點,包括更強大的Apple watch、最新的A12 Bionic 手機晶片、革新的iPhone照相系統,更為環保的手機生產、製造、回收方式⋯⋯等等。本文將把焦點放在新一代iPhone上所整合的AI人工智慧功能。小編將為讀者們整理出Apple將機器學習功能應用在最新一代iPhone手機上的幾個重點。

圖1 Apple更多將機器學習應用至新一代iPhone上

 

根據小編觀察,Apple在新一代iPhone以自行設計的「A12仿生」手機晶片為基礎整合了更多了機器學習的功能。根據蘋果台灣官網上的資料(https://www.apple.com/tw/iphone-xs/a12-bionic/),這款晶片搭載了一個「神經網路引擎」,每秒能執行五兆次運算來做到「即時的機器學習(Real-time Machine Learning)」。

 

上一段提及的「即時的機器學習」,實際在新一代iPhone上的應用是什麼呢?舉例而言,當小編想使用新一代iPhone照相,當我按下手機上快門後,A12晶片的「神經網路引擎」會快速運作從照片的場景中精確辨識出所要拍攝的人物、臉孔,然後把這項資訊提供給iPhone相機內建的「人像模式」使用,使我們可以在運用「人像模式」拍攝照片完畢後,自由地調整背景虛化。在這裡,真是要給Apple按個讚,因為通常一張照片景深的控制,多半在按下相機快門那一剎那就決定了,現在藉由「神經網路引擎」運用機器學習的技術,可在照片拍攝好後調整背景虛化,的確能夠幫助更多非專業攝影師,拍攝出更具質感、更有創意的照片。

圖2 搭配機器學習的技術,使用者可運用新一代iPhone相機,輕鬆拍攝出具備適合景深的照片。

 

除透過「神經網路引擎」在iPhone上實踐機器學習之外,Apple更首次讓非蘋果的開發人員,可透過Core ML(https://developer.apple.com/documentation/coreml)運用前面提到的「神經網路引擎」。什麼是Core ML呢?簡而言之,它是一個Apple開發的機器學習框架,目的是讓開發者可將機器學習部署至Apple裝置上。這樣的開放、突破將帶出什麼影響呢?預期將會有更多開發者能把機器學習運用到他們所設計的App上,讓使用者在社交、藝術創作⋯⋯等等層面上,有更棒、更豐富的體驗。

 

最後要提到的是,Apple總公司雇用了來自Google的頂尖AI主管John Giannandrea(https://www.apple.com/tw/leadership/john-giannandrea/),擔任機器學習與AI策略的主管,直接向執行長Tim Cook負責。由此可知,Apple加強了在機器學習與AI人工智慧上的發展力道,不僅是開發人員可以運用Apple現有的產品做出更棒的產品,一般使用者也能享受到更好的軟硬體操作體驗。

 

備註:若欲購買CAVEDU自造的AI人工智慧產品,請洽機器人王國商城,謝謝。

 

相關文章

[LinkIt 7697 iOS 方案] 寫出 Arduino code自動生成手機介面!

作者/攝影  曾吉弘
時間  3小時
成本
  • LinkIt 7697開發板
難度  * * *
材料表
  • 個人電腦
  • LinkIt 7697 開發板
  • iphone

本文要介紹聯發科技實驗室推出的LinkIt Remote iOS小程式,透過BLE來與 7697開發板互動,特色在於可以輕鬆設計各種簡易的控制界面喔!

 

LinkIt Remote iOS app

LinkIt Remote 是一個用來產生app介面的iOS小程式,是以 BLE 與 LinkIt 7697開發板搭配使用。只要在7697端設定好,就可以在兩者連線之後產生對應的介面。您需要做兩件事:

  • Arduino IDE 的 7697 SDK需要升級到9.5,才可使用最新LRemote 函式庫與本文的範例。

View post on imgur.com

  • 找一隻 iphone 安裝 LinkIt Remote iOS app,可用於掃描鄰近的 7697 開發板(需執行類似於本文的程式),並彼此溝通。

重點就是這一句:

寫Arduino code 可以自動生成 app 介面!

1.請開啟 File > Examples > LRemote > RemoteControl 範例,並上傳至您的 7697開發板。

2.下載 LinkIt Remote 到您的 iphone上,目前版本需要 iOS 10。

3.啟動 LinkIt Remote app,會看到 中的 7697 顯示在畫面的裝置清單中。

View post on imgur.com

4.點選這個 LinkIt 7697。item, the app connects to LinkIt 7697 and display the following remote UI control: (如果範圍裡有多台的話,就會看到多個項目,後續程式碼中的#25 LRemote.setName(“LinkIt 7697”); 可以修改開發板所顯示的名稱)

 

View post on imgur.com

5.請點選畫面中的 USR LED 搖頭開關,就會觸發 7697 的 USR LED (P7腳位)亮起。

6.請開啟 Arduino 的Serial Monitor,並拖拉畫面中的 Value Slider 滑桿,就可以在Serial Monitor中看到數值的變化,我們後續可以拿這個數值來控制LED亮度(analogWrite)、伺服機角度等等都可以喔。

View post on imgur.com

完工了,開始玩吧~

 

7697程式碼

 

最後是7697的程式碼,路徑是 File/Exmaples/LRemote/RemoteControl

由此可以看到如何編寫Arduino code 去定義畫面上的元件

  //設定 app 端介面 UI canvas
  LRemote.setName("LinkIt 7697");
  LRemote.setOrientation(RC_PORTRAIT);
  LRemote.setGrid(3, 5);         //設定螢幕棋盤格數 3行5列

  //加入按鈕
  button.setText("Press Me");   //加入文字
  button.setPos(1, 1);               //設定位置
  button.setSize(2, 1);              //設定元件尺寸
  button.setColor(RC_PINK);   //設定位置
  LRemote.addControl(button); //加入按鈕

  //加入大型圓形按鈕
  bigButton.setText("!BIG!");
  bigButton.setPos(0, 3);
  bigButton.setSize(3, 2);
  bigButton.setColor(RC_GREEN);
  LRemote.addControl(bigButton);

  //加入滑桿
  slider.setText("Value Slider(-100 ~ 1024)");    
  slider.setPos(0, 2);
  slider.setSize(3, 1);
  slider.setColor(RC_ORANGE);
  slider.setValueRange(-100, 1024, 0);   //設定滑桿範圍
  LRemote.addControl(slider);

  //加入文字標籤
  label.setText("Remote Test");
  label.setPos(0, 0);
  label.setSize(3, 1);
  label.setColor(RC_GREY);
  LRemote.addControl(label);

  //加入on/off搖頭開關
  switchButton.setText("USR LED");
  switchButton.setPos(0, 1);
  switchButton.setSize(1, 1);
  switchButton.setColor(RC_BLUE);
  LRemote.addControl(switchButton);

 

完整程式碼如下:

/*
  This example configures LinkIt 7697 to a reciver of the iOS LinkIt Remote App

  created Aug 2017
*/
#include <LRemote.h>

LRemoteButton button;
LRemoteSlider slider;
LRemoteLabel label;
LRemoteSwitch switchButton;
LRemoteCircleButton bigButton;

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);

  Serial.println("Start configuring remote");

  // Initialize GPIO
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 0);

  // Setup the Remote Control's UI canvas
  LRemote.setName("LinkIt 7697");
  LRemote.setOrientation(RC_PORTRAIT);
  LRemote.setGrid(3, 5);

  // Add a push button
  button.setText("Press Me");
  button.setPos(1, 1);
  button.setSize(2, 1);
  button.setColor(RC_PINK);
  LRemote.addControl(button);

  // Add a big, round button
  bigButton.setText("!BIG!");
  bigButton.setPos(0, 3);
  bigButton.setSize(3, 2);
  bigButton.setColor(RC_GREEN);
  LRemote.addControl(bigButton);

  // Add a slider
  slider.setText("Value Slider(-100 ~ 1024)");
  slider.setPos(0, 2);
  slider.setSize(3, 1);
  slider.setColor(RC_ORANGE);
  slider.setValueRange(-100, 1024, 0);
  LRemote.addControl(slider);

  // Add a simple text label
  label.setText("Remote Test");
  label.setPos(0, 0);
  label.setSize(3, 1);
  label.setColor(RC_GREY);
  LRemote.addControl(label);

  // Add an on/off switch
  switchButton.setText("USR LED");
  switchButton.setPos(0, 1);
  switchButton.setSize(1, 1);
  switchButton.setColor(RC_BLUE);
  LRemote.addControl(switchButton);

  // Start broadcasting our remote contoller
  // This method implicitly initialized underlying BLE subsystem
  // to create a BLE peripheral, and then start advertisement on it.
  LRemote.begin();
  Serial.println("begin() returned");
}

void loop() {

  // check if we are connect by some BLE central device, e.g. an mobile app
  if(!LRemote.connected()) {
    Serial.println("waiting for connection");
    delay(1000);
  } else {
    delay(100);
  }
  
  // Process the incoming BLE write request
  // and translate them to control events
  LRemote.process();

  // Now we poll each control's status
  
  if(button.isValueChanged()){
    Serial.print("button new value =");
    Serial.println(button.getValue());
  }

  if(bigButton.isValueChanged()){
    Serial.print("big button new value =");
    Serial.println(bigButton.getValue());
  }

  if(switchButton.isValueChanged()){
    digitalWrite(LED_BUILTIN, switchButton.getValue());
  }

  if(slider.isValueChanged()){
    Serial.print("slider to new value = ");
    Serial.println(slider.getValue());
    analogWrite(7, map(slider.getValue(),-100, 1024, 0 , 255)); 
    //將slider的數值轉換之後用來控制LED
  }
}

 

相關文章:

[DuoKit Browser ] 7688物聯網開發板的iOS解決方案

本系列文將介紹 DuoKit 與 DuoKit Browser 這個 iOS 裝置端的控制方案,您可以透過網頁以及 iOS app ( iphone 或 iPad)與您的 7688 (Arduino Yun系列板子也可以) 開發板互動。

作者/攝影  曾吉弘
時間  3小時
成本
難度  * * *
材料表
  • iOS 裝置,例如 iphone 與 ipad,作業系統版本為 iOS7以上
  • 7688 Duo 開發板  


DuoKit 為聯發科技為 LinkIt Smart 7688 Duo 以及其他 Arduino Yún 相容開發板(Arduino + OpenWRT)建構的開源專案,只需要簡單設定就能控制/存取區域網路內的開發板。此外,DuoKit運作時不需要外部網路連線也不需要中央雲服務,控制端裝置僅需與開發板位於同一區域網路之中,即可從行動裝置端(手機或電腦)進行偵測與存取。也不需要額外申請帳號,更適合隱私需求較高的智慧家庭環境。

如果您擁有 iOS 裝置(例如:iPhone、iPad),DuoKit Browser 為 DuoKit 所對應的管理工具,或透過瀏覽器使用 REST API 進行相關控制,或自行撰寫您常用用平台上的控制工具。

本文將介紹如何匯入 DuoKit 函式庫到您的 Arduino IDE中,就能透過 Restful API 控制/讀取7688 Duo 的腳位狀態。

DuoKit 環境設定

    接著介紹如何建置 DuoKit 所需的運作和開發環境。

安裝 Arduino 函式庫

  • 請下載Arduino IDE (http://arduino.cc),解壓縮即可  
  • 請到 GitHub 下載 DuoKit 的最新版本函式庫(https://github.com/x43x61x69/DuoKit/archive/master.zip),並解壓縮。
  • 開啟 Arduino IDE,點選「 Sktech → Include Library → Add .ZIP Library…

  • 選取於上一步驟中解壓縮文件夾內的「lib → Arduino → DuoKit」資料夾並按「選擇」,完成之後即可在 Example下看到 DuoKit 這個資料夾。

開發板設定:首次使用 DuoKit 時,依據開發板型號需先進行相關設定。

  • 請先確認您的 LinkIt Smart 7688 Duo 韌體版本是否為 0.9.4 或更高的版本,以避免網路相關的問題(版本可透過開發板 WebUI 介面查詢)。
  • 使用 putty 或其他連線程式連線至您的裝置,在terminal中使用下列指令開啟的 Yún Bridge 服務(預設為關閉):

 

uci set yunbridge.config.disabled='0'
uci commit
reboot
DuoKit 函式庫內建數個範例,草稿碼皆可透過 Arduino IDE 選單中的「檔案 → 範例 → DuoKit」中查看。DuoKit 的基本架構如下:

#include <DuoKit.h>           	// 引入 DuoKit 函式庫
DuoKit duokit;                    	// 宣告 DuoKit 物件
void setup()
{
	duokit.begin();  // 初始化 DuoKit
}
void loop()
{
	duokit.loop();	// DuoKit 核心功能
}

您可以在原本的專案中加入以上程式碼就能 DuoKit 大多數的功能,例如:透過 DuoKit Browser 對開發板進行基本控制。DuoKit 包含了多項進階功能:

  • 設定腳位I/O模式
  • 存取腳位狀態
  • 存取變數
  • 自定義使用者介面

  DuoKit Browser則可實作上述的功能,只要加入對應的程式碼即可透過 DuoKit Browser 控制 7688 Duo 開發板。

 

請上傳範例「Basic」至開發板,即可透過 REST API 存取相關變數(以 LinkIt Smart 7688 Duo 預設名稱為例):

  •  讀取變數「count」: http://mylinkit.local/arduino/read/count
  •  修改變數「count」為 123.45http://mylinkit.local/arduino/update/count/123.45

或者,您可以透過 DuoKit Browser 視覺化瀏覽範例內的設定值,詳細請見之後的「透過 DuoKit 定義預設使用者操作介面」內容。

* 註:DuoObject 所使用的字串型別為 String(字串物件)而非 C 語言的 char 陣列。

  •  透過 DuoKit 定義預設使用者操作介面:

與變數存取類似,您亦可透過 DuoKit 中的 DuoUI 物件,於 Arduino 草稿碼當中定義一組預設的使用者操作介面設定細節(參考範例「Basic」)。在 DuoKitBrowser 內呈現結果如圖所示:

首先,您必須先初始化一個 DuoUI 陣列(範例中長度為 6):

DuoUI layout[6];

接著設定陣列內的物件:

void setup()
{
	// 略
	duokit.layoutProfile = "Basic Controller”;  // 裝置名稱(選擇性)
 
	layout[0].type  	= DuoUIWebUI;                           	// 第一個物件類型為 WebUI 介面
	layout[0].name  	= "Access WebUI";                    	// 此項目的說明文字
 
	layout[1].type  	= DuoUISwitch;                          	// 第二個項目類型為開關
	layout[1].name  	= "Built-in LED";                        	// 範例為內建的 LED 燈
	layout[1].pin   	= LED_BUILTIN;                          	// 內建 LED 的腳位,7688 Duo 為 13
	layout[1].interval  = 10;                                             	// 自動刷新的時間間隔。不設定或設定為 0 則停用自動刷新
 
	layout[2].type  	= DuoUIValueGetter;    	// 第三個項目類型為數值顯示
	layout[2].name  	= "Program started";   	// 範例為程式執行時間
	layout[2].key   	= "boot";                                    	// 為前述 DuoObject 陣列中的對應關鍵字名稱
	layout[2].interval  = 5;
 
	layout[3].type  	= DuoUIValueSetter;    	// 第三個項目類型為數值設定
	layout[3].name  	= "This is count";        	      // 範例為變數「count」
	layout[3].key   	= "count";
	layout[3].interval  = 10;
 
	layout[4].type  	= DuoUIValueSetter;
	layout[4].name  	= "This is fixed";
	layout[4].key   	= "fixed";
	layout[4].interval  = 10;
 
	layout[5].type  	= DuoUISlider;             	// 第五個項目類型為滑桿(Slider)
	layout[5].name  	= "Slider for fixed";
	layout[5].key	   = "fixed";
	layout[5].min   	= 0;                                            	// 滑桿的最小值
	layout[5].max   	= 9999;                                     	// 滑桿的最大值
	layout[5].interval  = 10;
 
	duokit.setLayout(layout, 6);                                        	// 將初始化完成的 DuoUI 陣列指向 DuoKit 物件
	// 略
}

使用 DuoKit Browser

DuoKit Browser 為 DuoKit 在 iOS 上一款免費且開源的對應控制程式。您只需要具備 iOS 裝置,搭配 DuoKit 即可專注於開發板端的設計,輕鬆透過行動裝置實現智慧家庭;亦可以依自己的需求客製化相關的進階功能,可以免費於 App Store 下載(https://itunes.apple.com/us/app/id1196094443):

您可依照個人喜好或需求更改上述 DuoUI 的值,每個 DuoUI 物件所需的參數可在 DuoKit Github 找到相關文件。

下一篇將介紹如何透過 DuoKit Browser 控制 7688 板子的腳位狀況

相關文章: