2015年6月28日 星期日

蘋果的智慧 - Part2.2 再談移動

不知您有沒有發現到,在上一章裡初級智慧動物像無頭蒼蠅那樣隨意亂竄,這是因為它沒有目標可以追尋。在本章裡,我們將利用滑鼠游標代表另一隻動物,而具有初級智慧的那隻動物會來追逐牠。


取得滑鼠游標座標

系統變數 mouseX 和 mouseY 分別表示滑鼠的 X 座標和 Y 座標。當移動滑鼠時,您所取得的 mouseX 和 mouseY 數值也會跟著改變。

這兒我們要讓初級智慧動物追逐游標,游標移動到哪裡牠便跟著移動到那裡,程式碼如下:

int cx, cy;
int vx, vy;

void setup() {
  size(800,600);
  cx = width / 2;
  cy = height / 2;
}

void draw() {
  background(155);
  if (mouseX > cx)
    vx = 1;
  else
    vx = -1;
  if (mouseY > cy)
    vy = 1;
  else
    vy = -1;
  cx += vx;
  cy += vy;
  rect(cx, cy, 5, 5);
}




蘋果的智慧 - Part2.1 移動

本章旨在探討初級智慧動物如何移動。

在說明如何移動之前,我們要先瞭解 Processing 的座標系統。Processing 是以螢幕的左上角落為座標原點 (0, 0),水平方向為 X 軸,往右為正(+),往左為負(-);垂直方向為 Y 軸,往下為正(+),往上為負(-)。旋轉方向順時針為正(+),逆時針為負(-)。您可以參考 https://processing.org/tutorials/drawing/


最初出現的地方

為了方便觀察,最開始我們會將初級智慧動物置放於螢幕中央,如此牠不至於很快就走出螢幕而消失不見。程式碼如下:

size(800, 600)       // 設置螢幕大小,水平為 800 單位,垂直為 600 單位
int cx = width / 2      // cx 表動物目前的水平座標位置
int cy = height / 2     // cy 表動物目前的垂直座標位置

width 和 height 都是公用變數,其意思分別是螢幕的水平尺寸和垂直尺寸,在此處也就是 800 x 600。

如果我們希望初級智慧動物是隨意出現在螢幕的任一角落,我們可以使用亂數函式 random,程式碼可以修改如下:

size(800, 600)       // 設置螢幕大小,水平為 800 單位,垂直為 600 單位
int cx = (int)random(0, width)      // cx 表動物目前的水平座標位置
int cy = (int)random(0, height)     // cy 表動物目前的垂直座標位置

因為 random 傳回的值是 float 的格式,為了要配合 cx 和 cy 的 int 格式,所以我們要在前面加上 (int) 做格式轉換的動作。

然後,我們畫出一個 5x5 單位的正方形來代表初級智慧動物,程式碼如下:

rect(cx, cy, 5, 5);

完整程式碼如下:

int cx, cy;

void setup() {
  size(800,600);
  cx = width / 2;
  cy = height / 2;
}

void draw() {
  rect(cx, cy, 5, 5);
}



更改為隨機出現在任一位置,完整程式碼如下:

int cx, cy;

void setup() {
  size(800,600);
  frameRate(2); // 指定影格速率,每秒執行 2 次 draw 函式
}

void draw() {
  background(155);  // 指定背景顏色,此處有刷新螢幕的作用
  cx = (int)random(0, width);
  cy = (int)random(0, height);
  rect(cx, cy, 5, 5);
}


移動碼

初級智慧動物會依據移動碼的數值來移動。移動碼又可分為水平分量與垂直分量。分量的值愈大表移動速度愈快,反之則愈慢,若為 0 則表示靜止不動。

我們用變數 xv 和 yv 分別代表水平分量和垂直分量的移動值,將位置變數 cx 和 cy 分別加入變數 vx 和 vy,就可以讓初級智慧動物產生移動的效果。

移動有方向性,所以 xv 和 yv 有正負的分別。另外為了限制移動的速度,此處我們將移動分量暫時限定於 -5 ~ 5 之間。

程式碼如下:

int vx = (int)random(-5, 5);
int vy = (int)random(-5, 5);
cx += vx;
cy += vy;


完整程式碼如下:

int cx, cy;

void setup() {
  size(800,600);
  cx = width / 2;
  cy = height / 2;
  frameRate(10);
}

void draw() {
  background(155);
  int vx = (int)random(-5, 5);
  int vy = (int)random(-5, 5);
  cx += vx;
  cy += vy;
  rect(cx, cy, 5, 5);
}


延伸閱讀

亂數 random 函式 https://processing.org/reference/random_.html








蘋果的智慧 - Part1 智慧的分級

「蘋果的智慧」這本書將機器智慧概分為初級智慧與中級智慧。

初級智慧動物會隨機取得一個指令,告訴他該往右、往左或往其他方向移動,另外還會隨機取得移動的速度。

中級智慧動物除了俱備初級智慧動物所有的屬性之外,它最特別的是有記憶功能,它會學習,可以透過記憶資料庫告訴他在面對問題時該怎麼做。

蘋果的智慧 - Part0 前言

作者黃松榮於民國72年12月出版一本書,書名叫「蘋果的智慧」,這本書在我書架內已塵封30幾年了,最近在臉書看到一篇有關人工智慧的貼文,剛好我這幾年來也在玩自走車和機器人,心想或許能為機器人加入一些人工智慧,於是就把這本書再重新翻出來看看。

這本「頻果的智慧」書中所謂的人工智慧,前面幾個章節僅僅只是模擬動物如何移動、搜尋、獵殺或躲避,最後一個章節則加入記憶。若以現今的電腦遊戲設計方法來看,書中所謂的人工智慧只能算是幼稚園等級。雖然如此,它還是有很多地方值得初學者來學習的。

「頻果的智慧」書中的範例程式是用 APPLE BASIC 寫的,我個人覺得 Processing 這種自然語言比 BASIC 更能表現圖形和動態效果,所以如果對人工智慧有興趣卻又不瞭解 Processing 程式語言的人可能得花更多時間和精神在這上面。

人工智慧 (Artificial Intelligence) 簡稱AI,我不多作解釋,建議您可以看一下維基百科,文中說明得非常詳細,網址 https://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD


「頻果的智慧」目錄如下:

第1章  智慧的分級
第2章  移動與前往搜尋
第3章  初級智慧
第4章  初級智慧的互相結合
第5章  中級智慧
第6章  機器心理學簡介
第7章  蒐集編譯資料

本人會依據上述章節陸續來探討人工智慧。

2015年6月19日 星期五

列印電風扇遙控器電池蓋

夏天到了,即使不開冷氣也需要開電風扇。家裡的壁扇遙控器電池蓋失蹤許久,CR2032 電池容易掉出來,想要開啟電風扇時搖控器卻因為沒有電池而無法發揮作用,久而久之大家都寧可爬高開壁扇,也懶得再去尋找遙控器的電池。

我有3D印表機,畫機構圖也不是難事,好吧~~趁著端午假期閒閒沒事那就來做一個蓋子。


這是壁扇搖控器


這是背面,可以看到沒有蓋子。中間那個是 CR2032 電池。


量取相關尺寸後用 AutoCAD 畫圖


經過數分鐘後終於畫好了,切換視角到立體圖。


使用 Cura 切片軟體產生 GCode。


3D 列印。


列印完成。


打磨後組裝。我設計了一個10元硬幣的凹槽,可以使用10元開關這個蓋子。


成功~~~~。

3D列印確實是 Maker 的好夥伴。









2015年6月18日 星期四

上傳(Upload) hex 檔

如果別人給你的檔案不是 .ino,而是 .hex,這時該如何把它上傳(Upload)到 Arduino 呢?

這裡我們要介紹 XLoader 這套軟體給你。

官網 http://russemotto.com/xloader/

下載 http://russemotto.com/xloader/XLoader.zip




上傳步驟如下:

1. 下載 XLoader,解壓縮後執行 xloader.exe。

2. 點擊 Hex file 右側的瀏覽按鈕,選取 hex 檔案。

3. 點擊 Device 右側的按鈕,選取您的 Arduino 板子,如果是 Uno,可以選取「Uno(ATmega328」。

4. 指定正確的 COM port。

5. 指定 Baud rate 為 115200。

6. 點擊「Upload」按鈕。

一旦出現類似 "xxxxs byte uploaded" 這樣的訊息,表示完成上傳動作。