非常好用、免費的螢幕抓圖軟體。
官網 http://ngwin.com/picpick
操作畫面變更為繁體中文
右鍵點選圖示 > Porgram Options... > General > Language > 正體中文
變更熱鍵
右鍵點選圖示 > 程式選項(Porgram Options...) > 一般(General) > 快速鍵(Hot keys)
可以畫框、箭頭、加註解...等
2015年12月21日 星期一
2015年10月20日 星期二
認識 IFTTT
有人會常常提醒你 "明天會下雨,出門記得要帶雨具" 嗎? 可能沒有人這麼貼心吧,但 IFTTT 就是這麼貼心,它絕對不會忘了寄給您一封有著貼心叮嚀的 email。
IFTTT 是 "If This Then That" 的縮寫,意思就是「如果發生這件事,那麼就做那件事」。以「如果明天下雨,就寄一封提醒的郵件給您」這件事來說,解釋如下:
If This Then That
如果 明天下雨 就 寄一封提醒的信
由以上可知,我們可以利用 IFTTT 主動幫我們做一些事,下雨提醒您這件事只是其中功能之一,還有更多的功能我將陸續為大家介紹。
IFTTT 官網 https://ifttt.com/
2015年7月19日 星期日
淺談 IoT 和 ThingSpeak.com
ThingSpeak 是一個專為物聯網而產生的應用程式平台,它允許你使用網路設備即時地將數據上傳到雲端使之聚集在一起(成為資料)。
而頻道(Channel)是 ThingSpeak 心臟之所在,您可以切換不同的頻道以存取不同的資料。
下列圖片是您可以在 ThingSpeak 達成的事情之一,將住家的光線數據上傳到雲端:
Thingspeak 官網 https://thingspeak.com/
想要瞭解 Thingspeak 能為您做什,我們來看影片比較快,影片網址 https://www.youtube.com/watch?v=JsHGxe6lRSY
建議在使用 Thingspeak.com 之前要先註冊,註冊網址 https://thingspeak.com/users/sign_up
ThingSpeak 所提供的API,下載網址 https://github.com/iobridge/ThingSpeak
而頻道(Channel)是 ThingSpeak 心臟之所在,您可以切換不同的頻道以存取不同的資料。
下列圖片是您可以在 ThingSpeak 達成的事情之一,將住家的光線數據上傳到雲端:
Thingspeak 官網 https://thingspeak.com/
想要瞭解 Thingspeak 能為您做什,我們來看影片比較快,影片網址 https://www.youtube.com/watch?v=JsHGxe6lRSY
建議在使用 Thingspeak.com 之前要先註冊,註冊網址 https://thingspeak.com/users/sign_up
ThingSpeak 所提供的API,下載網址 https://github.com/iobridge/ThingSpeak
將光線數據上傳到雲端(ThingSpeak)
Thingspeak.com 允許你使用網路設備即時地將數據上傳到雲端使之聚集在一起(成為資料),所以我決定要用一個簡單的光線感測器來測試這個系統。而 Processing 應用軟體剛好符合我的需求,可以透過它操控網路攝影機來偵測人的移動,然後將結果上傳到 ThingSpeak 頻道。
開始前的測試
首先,下載這個簡單的程式,你可以透過它和 ThingSpeak.com 從事簡單的聯繫:
https://drive.google.com/file/d/0B2ZbLCPalrgEZWZjNWMxYjYtZTZmYS00YTExLThkNWYtYzI0ZjYxYWY4YzRm/view?ddrp=1&hl=en#
你可以用鍵盤隨便打幾個數字,這些數字將會被上傳到 ThingSpeak.com,如果出現下列畫面表示可以正常工作。
上傳光線感測數據
在這兒我們會使用 LDR 去偵測光線的強度,請依照下列電路圖在麵包板上插妥零件與接線。
底下這個程式很簡單,它單純地只是把 A0 腳位的值透過序列埠傳送出去,程式如下:
請您將上述程式複製並貼到 Arduino IDE 裡,並上傳到板子。
接收數據
我們要用 Processing 來接收這些數據,需要變更一些程式碼,如下:
/**
* Tests the thinkspeak channel by sending any numeric
* keypress using the specified APIKEY and FIELD
*/
import processing.serial.*;
import processing.net.*;
//CONFIGURATION
String APIKEY = "YOURAPI"; //your api key
String FIELD = "field1";
int PORTNUM = 0; //port number of your arduino
//END CONFIGURATION
Serial arduino;
Client c;
String data;
int number; //read from arduino
void setup() {
size(600, 400);
//setup the serial port
// List all the available serial ports:
println(Serial.list());
//Init the Serial object
arduino = new Serial(this, Serial.list()[PORTNUM], 9600);
// The font must be located in the sketch's
// "data" directory to load successfully
PFont font;
font = loadFont("Monaco-12.vlw");
textFont(font);
}
void draw() {
background(50);
fill(255);
text("ThinkSpeak Processor", 10, 20);
fill(0, 255, 0);
text("Light Value Read: " + number, 10, 40);
if( data != null ) {
fill(0, 255, 0);
text("Server Response:", 10, 60);
fill(200);
text(data, 10, 80);
}
if(c != null) {
if (c.available() > 0) { // If there's incoming data from the client...
data = c.readString(); // ...then grab it
println(data);
}
}
//if we have a new line from our arduino, then send it to the server
String ln;
if( (ln = arduino.readStringUntil('\n')) != null) {
try {
number = new Integer(trim(ln));
if(number < 1025) {
println("Writing " + number);
sendNumber(number);
}
}
catch(Exception ex) {
}
}
}
void sendNumber(float num) {
c = new Client(this, "api.thingspeak.com", 80); // Connect to server on port 80
c.write("GET /update?key="+APIKEY+"&"+FIELD+"=" + num + " HTTP/1.1\n");
c.write("Host: my_domain_name.com\n\n"); // Be polite and say who we are
}
請您將上述程式複製並貼到 Processing IDE 裡,並執行它。
如果你看到下列畫面,其中 Light Value Read:的值每 2 秒跳動一次,那麼恭喜你,你成功了。
開始前的測試
首先,下載這個簡單的程式,你可以透過它和 ThingSpeak.com 從事簡單的聯繫:
https://drive.google.com/file/d/0B2ZbLCPalrgEZWZjNWMxYjYtZTZmYS00YTExLThkNWYtYzI0ZjYxYWY4YzRm/view?ddrp=1&hl=en#
你可以用鍵盤隨便打幾個數字,這些數字將會被上傳到 ThingSpeak.com,如果出現下列畫面表示可以正常工作。
上傳光線感測數據
在這兒我們會使用 LDR 去偵測光線的強度,請依照下列電路圖在麵包板上插妥零件與接線。
底下這個程式很簡單,它單純地只是把 A0 腳位的值透過序列埠傳送出去,程式如下:
void setup(){ Serial.begin(9600); } void loop(){ Serial.println(analogRead(0)); delay(2000); }
請您將上述程式複製並貼到 Arduino IDE 裡,並上傳到板子。
接收數據
我們要用 Processing 來接收這些數據,需要變更一些程式碼,如下:
/**
* Tests the thinkspeak channel by sending any numeric
* keypress using the specified APIKEY and FIELD
*/
import processing.serial.*;
import processing.net.*;
//CONFIGURATION
String APIKEY = "YOURAPI"; //your api key
String FIELD = "field1";
int PORTNUM = 0; //port number of your arduino
//END CONFIGURATION
Serial arduino;
Client c;
String data;
int number; //read from arduino
void setup() {
size(600, 400);
//setup the serial port
// List all the available serial ports:
println(Serial.list());
//Init the Serial object
arduino = new Serial(this, Serial.list()[PORTNUM], 9600);
// The font must be located in the sketch's
// "data" directory to load successfully
PFont font;
font = loadFont("Monaco-12.vlw");
textFont(font);
}
void draw() {
background(50);
fill(255);
text("ThinkSpeak Processor", 10, 20);
fill(0, 255, 0);
text("Light Value Read: " + number, 10, 40);
if( data != null ) {
fill(0, 255, 0);
text("Server Response:", 10, 60);
fill(200);
text(data, 10, 80);
}
if(c != null) {
if (c.available() > 0) { // If there's incoming data from the client...
data = c.readString(); // ...then grab it
println(data);
}
}
//if we have a new line from our arduino, then send it to the server
String ln;
if( (ln = arduino.readStringUntil('\n')) != null) {
try {
number = new Integer(trim(ln));
if(number < 1025) {
println("Writing " + number);
sendNumber(number);
}
}
catch(Exception ex) {
}
}
}
void sendNumber(float num) {
c = new Client(this, "api.thingspeak.com", 80); // Connect to server on port 80
c.write("GET /update?key="+APIKEY+"&"+FIELD+"=" + num + " HTTP/1.1\n");
c.write("Host: my_domain_name.com\n\n"); // Be polite and say who we are
}
如果你看到下列畫面,其中 Light Value Read:的值每 2 秒跳動一次,那麼恭喜你,你成功了。
2015年7月12日 星期日
error: 'TKD2' was not declared in this scope
新版的 Arduino IDE 在使用 IR Library 時會編譯錯誤,如下圖:
導致錯誤的原因是因為在 IRremoteTools.cpp 裡面沒有宣告 'TKD2' 變數。
歸根究底的原因是新版的 IDE 會讀取內建的紅外線函式庫,而這個內建的紅外線函式庫是專為 Adafruit 公司產品訂製的,如果你沒有該公司的產品可能就無法使用它的函式庫。
那麼該如何解決這個問題呢?
解決辦法有很多種,其中一種是去修改 RobotIRremote.cpp,但這個方法對於不熟悉 C 語言的人來說似乎是有點困難,有可能會愈弄愈糟。
另一種辦法是用其他可用的紅外線函式庫取代內建的 RobotIRremote Library,此舉應該是最簡單又安全的作法了。
下載 IR Library https://github.com/coopermaa/Arduino-IRremote/archive/master.zip
下載後解壓縮,將資料夾名稱更改為「IRremote」,然後複製到 [Arduino]\libraries 路徑下,再重新啟動 Arduino IDE 即可。
你也可以把 Robot_Control、Robot_Motor 和 RobotIRremote 這幾個資料夾移除掉,這樣並不會影響紅外線函式庫的運作。
檢查新的紅外線函式庫是否正常運作
我們可以開啟內建的範例程式:
1. 點擊下拉功能表 File > Examples > IRremote > IRrecvDemo
2. 點擊工具列的 Upload 按鈕。
成功編譯,如下圖:
導致錯誤的原因是因為在 IRremoteTools.cpp 裡面沒有宣告 'TKD2' 變數。
歸根究底的原因是新版的 IDE 會讀取內建的紅外線函式庫,而這個內建的紅外線函式庫是專為 Adafruit 公司產品訂製的,如果你沒有該公司的產品可能就無法使用它的函式庫。
那麼該如何解決這個問題呢?
解決辦法有很多種,其中一種是去修改 RobotIRremote.cpp,但這個方法對於不熟悉 C 語言的人來說似乎是有點困難,有可能會愈弄愈糟。
另一種辦法是用其他可用的紅外線函式庫取代內建的 RobotIRremote Library,此舉應該是最簡單又安全的作法了。
下載 IR Library https://github.com/coopermaa/Arduino-IRremote/archive/master.zip
下載後解壓縮,將資料夾名稱更改為「IRremote」,然後複製到 [Arduino]\libraries 路徑下,再重新啟動 Arduino IDE 即可。
你也可以把 Robot_Control、Robot_Motor 和 RobotIRremote 這幾個資料夾移除掉,這樣並不會影響紅外線函式庫的運作。
檢查新的紅外線函式庫是否正常運作
我們可以開啟內建的範例程式:
1. 點擊下拉功能表 File > Examples > IRremote > IRrecvDemo
2. 點擊工具列的 Upload 按鈕。
成功編譯,如下圖:
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);
}
取得滑鼠游標座標
系統變數 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
在說明如何移動之前,我們要先瞭解 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章 蒐集編譯資料
本人會依據上述章節陸續來探討人工智慧。
這本「頻果的智慧」書中所謂的人工智慧,前面幾個章節僅僅只是模擬動物如何移動、搜尋、獵殺或躲避,最後一個章節則加入記憶。若以現今的電腦遊戲設計方法來看,書中所謂的人工智慧只能算是幼稚園等級。雖然如此,它還是有很多地方值得初學者來學習的。
「頻果的智慧」書中的範例程式是用 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 的好夥伴。
我有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" 這樣的訊息,表示完成上傳動作。
這裡我們要介紹 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" 這樣的訊息,表示完成上傳動作。
2015年5月12日 星期二
讓AutoCAD圓柱體模型表面更精細
AutoCAD 3D模型可以匯出為 .stl 檔給3D印表機列印,但是列印出來時為什麼精細度不是很好? 如下圖:
改變 AutoCAD 系統變數「FACETRES」可以調整圓弧面的精細度。
FACETRES 的值愈大愈精細。
因為 AutoCAD 系統變數「FACETRES」的預設值是 0.5,所以才會出現如上圖的很多摺邊。
您可以將 FACETRES 的值調大一些(例如 10),列印出來的精細度就會好多了,如下圖:
改變 AutoCAD 系統變數「FACETRES」可以調整圓弧面的精細度。
FACETRES 的值愈大愈精細。
因為 AutoCAD 系統變數「FACETRES」的預設值是 0.5,所以才會出現如上圖的很多摺邊。
您可以將 FACETRES 的值調大一些(例如 10),列印出來的精細度就會好多了,如下圖:
2015年5月11日 星期一
const vs. #define
大家都知道 Arduino 可用的記憶體非常少,以 UNO 來說它能用來存放變數的靜態記憶體只有 2k,所以在避免超限使用記憶體的情況下,使用 const 或 #define 哪一個會比較節省記憶體呢?
#define 是甚麼?
#define 經常被誤以為是一個程式函式,其實它不是。事實上,它的作用只是會在程式被編譯前將文字內容相互替換而已。例如我們編寫 define.ino 程式碼,如下:
#define PIN 13
void setup() {
pinMode(PIN, OUTPUT);
}
void loop() {
digitalWrite(PIN, HIGH);
delay(500);
digitalWrite(PIN, LOW);
delay(500);
}
在 IDE 將程式碼送到編譯器編譯之前,預置處理器會先做一個簡單的內容置換,將 PIN 置換為 13,所以其實編譯器編譯的內容會是如下程式碼:
#define PIN 13
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
上述是一個強大且實用的功能,沒有任何記憶體被 "PIN" 這個變數所耗損。事實上,所有程式碼當中並不存在一個叫作 "PIN" 的變數。
const 是甚麼?
關鍵字 "const" 告訴編譯器它是一個不能被編譯的變數(或指標)。然而,它仍舊是一個變數,你要如何使用它,就看你在程式碼當中的使用方式了,或許會也或許不會因而耗損到記憶體。事實上,編譯器藉由使用 IDE 和 avr-gcc 已經聰明到可以辨識具有常數修飾子(const modifier)的變數是不能在程式運作時去改變它的值的,並且它也會試著去避免使用到記憶體。
例如,我們編寫 const.ino 程式碼,如下:
const int pin=13;
void setup() {
pinMode(pin, OUTPUT);
}
void loop() {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
它將不會耗損任何記憶體,編譯器知道它沒有理由可以在記憶體內建立一個變數,所以原本的記憶體空間還是保存著。
使用 avr-size
您可能已經注意到,在 Arduino 的 IDE 編譯程式碼時,狀態窗口會顯示如下這樣的訊息:
這個"草稿碼二進位的大小"訊息指的是經過編譯後的十六進位檔案(.hex)佔用多少快閃(Flash)記憶體的大小,請注意,它並未指出這個程式碼使用了多少靜態記憶體。
那麼要如何才能知道使用了多少靜態記憶體呢? 我們可以使用 avr-gcc 工具箱裏面的 avr-size.exe (它的路徑是在 <Arduino>\hardware\tools\avr\bin) 去查詢 .elf 檔案 (它的路徑是在 C:\Documents and Settings\USER\Local Settings\Temp\build<一串數字>.tmp 資料夾裏)。
因為我們要比較 define.ino 和 const.ino 各自使用多少靜態記憶體,所以您應該分別編譯這兩個檔案。
由於待會兒我們要在命令視窗下執行,為了方便起見,您可以將 avr-size.exe、define.cpp.elf 和 const.cpp.elf 複製貼到 D:\ 裏面。
現在請開啟命令視窗,並切換路徑到 D:\,然後鍵入
avr-size -C define.cpp.elf
然後您可以看到它顯示如下畫面:
接著再鍵入
avr-size -C const.cpp.elf
然後您可以看到它顯示如下畫面:
結果~~~~讓人非常驚訝對吧? 它們所耗用的記憶體竟然是相同的,都是 9 bytes。
那麼到底使用哪一個比較好?
筆者建議您使用 const 的方式會比較好。因為如果您不小心把 #define PIN 13 寫成 #defun pin 13 (注意 PIN 變成小寫的 pin),如下:
#define pin 13
void setup() {
pinMode(pin, OUTPUT);
}
void loop() {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
或是不小心把 #define PIN 13 寫成 #defun PIN 13; (注意在13的後面多了一個分號),如下:
#define pin 13;
void setup() {
pinMode(pin, OUTPUT);
}
void loop() {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
那麼在編譯時將會產生錯誤,而這個錯誤是不太容易發現是在哪兒出錯的,如下圖:
相關文章
有關於 const vs. #define 的社群討論 http://forum.arduino.cc/index.php?topic=86800.15
hex 檔 http://pizgchen.blogspot.tw/2015/04/hex.html
#define 是甚麼?
#define 經常被誤以為是一個程式函式,其實它不是。事實上,它的作用只是會在程式被編譯前將文字內容相互替換而已。例如我們編寫 define.ino 程式碼,如下:
#define PIN 13
void setup() {
pinMode(PIN, OUTPUT);
}
void loop() {
digitalWrite(PIN, HIGH);
delay(500);
digitalWrite(PIN, LOW);
delay(500);
}
在 IDE 將程式碼送到編譯器編譯之前,預置處理器會先做一個簡單的內容置換,將 PIN 置換為 13,所以其實編譯器編譯的內容會是如下程式碼:
#define PIN 13
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
上述是一個強大且實用的功能,沒有任何記憶體被 "PIN" 這個變數所耗損。事實上,所有程式碼當中並不存在一個叫作 "PIN" 的變數。
const 是甚麼?
關鍵字 "const" 告訴編譯器它是一個不能被編譯的變數(或指標)。然而,它仍舊是一個變數,你要如何使用它,就看你在程式碼當中的使用方式了,或許會也或許不會因而耗損到記憶體。事實上,編譯器藉由使用 IDE 和 avr-gcc 已經聰明到可以辨識具有常數修飾子(const modifier)的變數是不能在程式運作時去改變它的值的,並且它也會試著去避免使用到記憶體。
例如,我們編寫 const.ino 程式碼,如下:
const int pin=13;
void setup() {
pinMode(pin, OUTPUT);
}
void loop() {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
它將不會耗損任何記憶體,編譯器知道它沒有理由可以在記憶體內建立一個變數,所以原本的記憶體空間還是保存著。
使用 avr-size
您可能已經注意到,在 Arduino 的 IDE 編譯程式碼時,狀態窗口會顯示如下這樣的訊息:
這個"草稿碼二進位的大小"訊息指的是經過編譯後的十六進位檔案(.hex)佔用多少快閃(Flash)記憶體的大小,請注意,它並未指出這個程式碼使用了多少靜態記憶體。
那麼要如何才能知道使用了多少靜態記憶體呢? 我們可以使用 avr-gcc 工具箱裏面的 avr-size.exe (它的路徑是在 <Arduino>\hardware\tools\avr\bin) 去查詢 .elf 檔案 (它的路徑是在 C:\Documents and Settings\USER\Local Settings\Temp\build<一串數字>.tmp 資料夾裏)。
因為我們要比較 define.ino 和 const.ino 各自使用多少靜態記憶體,所以您應該分別編譯這兩個檔案。
由於待會兒我們要在命令視窗下執行,為了方便起見,您可以將 avr-size.exe、define.cpp.elf 和 const.cpp.elf 複製貼到 D:\ 裏面。
現在請開啟命令視窗,並切換路徑到 D:\,然後鍵入
avr-size -C define.cpp.elf
然後您可以看到它顯示如下畫面:
接著再鍵入
avr-size -C const.cpp.elf
然後您可以看到它顯示如下畫面:
結果~~~~讓人非常驚訝對吧? 它們所耗用的記憶體竟然是相同的,都是 9 bytes。
那麼到底使用哪一個比較好?
筆者建議您使用 const 的方式會比較好。因為如果您不小心把 #define PIN 13 寫成 #defun pin 13 (注意 PIN 變成小寫的 pin),如下:
#define pin 13
void setup() {
pinMode(pin, OUTPUT);
}
void loop() {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
或是不小心把 #define PIN 13 寫成 #defun PIN 13; (注意在13的後面多了一個分號),如下:
#define pin 13;
void setup() {
pinMode(pin, OUTPUT);
}
void loop() {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
那麼在編譯時將會產生錯誤,而這個錯誤是不太容易發現是在哪兒出錯的,如下圖:
相關文章
有關於 const vs. #define 的社群討論 http://forum.arduino.cc/index.php?topic=86800.15
hex 檔 http://pizgchen.blogspot.tw/2015/04/hex.html
2015年5月7日 星期四
枚舉(enum)
如果我們能善加使用 enum 的功能,產生更短的且可讀性更好的代碼,將是非常有益的。
我們知道 Java 支援 enum 語法,但其實 Processing 並不支援 enum 語法。雖然您可以在 Processing IDE 裏看到 enum 這個關鍵字會變色,而且您也遵循它的使用規則建構枚舉資料,可是在編譯時它會產生這樣的錯誤:
Unrecognized type:46 (ENUM_DEF)
雖然如此,我們還是可以找出一個辦法來解決這個問題。從現在起您必須記住,您無法像 Java 那樣把 enum 跟主程式寫在一起,而必須把 enum 寫在另外一個頁籤(Tab),然將它的延伸檔名命名為 .java 即可,如下:
主程式:
Day day;
void setup() {
println(day.FRIDAY);
}
void draw(){}
新建一個頁籤,並將它命名為 Day.java
public enum Day {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
我們知道 Java 支援 enum 語法,但其實 Processing 並不支援 enum 語法。雖然您可以在 Processing IDE 裏看到 enum 這個關鍵字會變色,而且您也遵循它的使用規則建構枚舉資料,可是在編譯時它會產生這樣的錯誤:
Unrecognized type:46 (ENUM_DEF)
主程式:
Day day;
void setup() {
println(day.FRIDAY);
}
void draw(){}
新建一個頁籤,並將它命名為 Day.java
public enum Day {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
start()
一般寫 Processing 程式的人都知道,一個最基本的程式架構必須包括 setup() 和 draw() 這兩個函式,如下:
void setup() {
}
void draw() {
}
而且一直以來都以為第一個執行的函式是 setup(),其實不是如此。
請您將下列程式碼鍵入 IDE 並執行,
void start() {
println("start");
}
void setup() {
println("setup");
}
void draw() {
}
void setup() {
}
void draw() {
}
而且一直以來都以為第一個執行的函式是 setup(),其實不是如此。
請您將下列程式碼鍵入 IDE 並執行,
void start() {
println("start");
}
void setup() {
println("setup");
}
void draw() {
}
結果您會發現訊息欄印出的是
start
setup
所以結論是:
第一個執行的函式是 start(),Processing 主要是用它來做初始化的動作,接著才是執行 setup()。
那麼問題來了,Arduino 是否也隱藏有這樣的玄機嗎?
2015年5月5日 星期二
讀取 Yahoo 氣象資訊
Yahoo 網站提供免費的氣象資訊,包括溫度、濕度、風速、風向、能見度和大氣壓力...等,我們可以使用 Processing 取回這些資訊,將它顯示在電腦螢幕上,或是傳給 Arduino 等互動裝置。
下載 Library
切換到網頁 https://github.com/onformative/YahooWeather ,點選右下角落的「Download ZIP」按鈕。或是點按網址 http://www.onformative.com/uploads/googleWeather/YahooWeather.zip 直接下載。
下載後解壓縮,並將他複製到 <Processing>/libraries 資料夾內。最後,別忘了要退出 Processing 再重新啟動。
開啟範例圖檔
內建的範例程式可以讓您快速感受到取得氣象資訊是多麼容易的一件事。
點按下拉功能表 File > Examples...,再展開 Contributed Libraries > Yahoo Weather 並雙擊 WeatherSimpleExample。
程式碼如下:
import com.onformative.yahooweather.*;
YahooWeather weather;
int updateIntervallMillis = 30000;
void setup() {
size(700, 300);
fill(0);
textFont(createFont("Arial", 14));
// 2442047 = the WOEID of Berlin
// use this site to find out about your WOEID : http://sigizmund.info/woeidinfo/
weather = new YahooWeather(this, 638242, "c", updateIntervallMillis);
}
void draw() {
weather.update();
background(255);
text("City: "+weather.getCityName()+"; Region: "+weather.getRegionName()+"; Country: "+weather.getCountryName()+"; Last updated: "+weather.getLastUpdated(), 20, 20);
text("Lon: "+weather.getLongitude()+" Lat: "+weather.getLatitude(), 20, 40);
text("WindTemp: "+weather.getWindTemperature()+" WindSpeed: "+weather.getWindSpeed()+" WindDirection: "+weather.getWindDirection(), 20, 60);
text("Humidity: "+weather.getHumidity()+" visibility: "+weather.getVisibleDistance()+" pressure: "+weather.getPressure()+" rising: "+weather.getRising(), 20, 80);
text("Sunrise: "+weather.getSunrise()+" sunset: "+weather.getSunset(), 20, 100);
}
public void keyPressed() {
if (key == 'q') {
weather.setWOEID(638242);
}
if (key == 'r') {
weather.setWOEID(44418);
}
}
點擊「Run」按鈕執行程式,就可以看到如下畫面:
目前顯示的是德國柏林(Berlin)的天氣,按下鍵盤的 'r' 鍵可以顯示英國倫敦(London)的天氣,按下鍵盤的 'q' 鍵可以再顯示柏林的天氣。
顯示台灣城市天氣資訊
要顯示各地區氣象資訊的關鍵是甚麼? 答案是「WOE ID」,只要改變 WOE ID 就可以顯示不同區域的氣象資訊。
範例程式中德國柏林(Berlin)的 WOEID 是 638242,英國倫敦(London)的 WOE ID 是 44418,那麼台北的 WOE ID 是多少呢? 您可以到這個網頁
https://weather.yahoo.com/taiwan/
選擇清單中的台灣各地區城市。
我們以台北為例,請您點按 Taipei City,在新頁面內再點按一次 Taipei City,網頁會跳到
https://weather.yahoo.com/taiwan/taipei-city/taipei-city-2306179/
網址最後面的數字就是台北的 WOE ID。
您可以用這組數字取代掉程式碼中的 638242,如下兩行:
weather = new YahooWeather(this, 638242, "c", updateIntervallMillis);
和
weather.setWOEID(638242);
如果要查其他地方的 WOEID,可以直接在搜尋欄位內鍵入地名或郵遞區號。
我們再以桃園為例,在搜尋欄位內鍵入「taoyuan」,就可以得到網址
https://weather.yahoo.com/taiwan/taoyuan-county/taoyuan-city-2298866/
所以桃園的 WOE ID 為 2298866。
最後,我們要顯示台北和桃園的氣象資訊,程式碼如下:
import com.onformative.yahooweather.*;
YahooWeather weather;
int updateIntervallMillis = 30000;
void setup() {
size(700, 300);
fill(0);
textFont(createFont("Arial", 14));
weather = new YahooWeather(this, 2298866, "c", updateIntervallMillis);
}
void draw() {
weather.update();
background(255);
text("City: "+weather.getCityName()+"; Region: "+weather.getRegionName()+"; Country: "+weather.getCountryName()+"; Last updated: "+weather.getLastUpdated(), 20, 20);
text("Lon: "+weather.getLongitude()+" Lat: "+weather.getLatitude(), 20, 40);
text("WindTemp: "+weather.getWindTemperature()+" WindSpeed: "+weather.getWindSpeed()+" WindDirection: "+weather.getWindDirection(), 20, 60);
text("Humidity: "+weather.getHumidity()+" visibility: "+weather.getVisibleDistance()+" pressure: "+weather.getPressure()+" rising: "+weather.getRising(), 20, 80);
text("Sunrise: "+weather.getSunrise()+" sunset: "+weather.getSunset(), 20, 100);
}
public void keyPressed() {
if (key == 'q') {
weather.setWOEID(2298866);
}
if (key == 'r') {
weather.setWOEID(2306179);
}
}
相關文章
Onformative http://www.onformative.com/lab/google-weather-library-for-processing/
Python Weather API https://code.google.com/p/python-weather-api/
下載 Library
切換到網頁 https://github.com/onformative/YahooWeather ,點選右下角落的「Download ZIP」按鈕。或是點按網址 http://www.onformative.com/uploads/googleWeather/YahooWeather.zip 直接下載。
下載後解壓縮,並將他複製到 <Processing>/libraries 資料夾內。最後,別忘了要退出 Processing 再重新啟動。
開啟範例圖檔
內建的範例程式可以讓您快速感受到取得氣象資訊是多麼容易的一件事。
點按下拉功能表 File > Examples...,再展開 Contributed Libraries > Yahoo Weather 並雙擊 WeatherSimpleExample。
程式碼如下:
import com.onformative.yahooweather.*;
YahooWeather weather;
int updateIntervallMillis = 30000;
void setup() {
size(700, 300);
fill(0);
textFont(createFont("Arial", 14));
// 2442047 = the WOEID of Berlin
// use this site to find out about your WOEID : http://sigizmund.info/woeidinfo/
weather = new YahooWeather(this, 638242, "c", updateIntervallMillis);
}
void draw() {
weather.update();
background(255);
text("City: "+weather.getCityName()+"; Region: "+weather.getRegionName()+"; Country: "+weather.getCountryName()+"; Last updated: "+weather.getLastUpdated(), 20, 20);
text("Lon: "+weather.getLongitude()+" Lat: "+weather.getLatitude(), 20, 40);
text("WindTemp: "+weather.getWindTemperature()+" WindSpeed: "+weather.getWindSpeed()+" WindDirection: "+weather.getWindDirection(), 20, 60);
text("Humidity: "+weather.getHumidity()+" visibility: "+weather.getVisibleDistance()+" pressure: "+weather.getPressure()+" rising: "+weather.getRising(), 20, 80);
text("Sunrise: "+weather.getSunrise()+" sunset: "+weather.getSunset(), 20, 100);
}
public void keyPressed() {
if (key == 'q') {
weather.setWOEID(638242);
}
if (key == 'r') {
weather.setWOEID(44418);
}
}
點擊「Run」按鈕執行程式,就可以看到如下畫面:
目前顯示的是德國柏林(Berlin)的天氣,按下鍵盤的 'r' 鍵可以顯示英國倫敦(London)的天氣,按下鍵盤的 'q' 鍵可以再顯示柏林的天氣。
顯示台灣城市天氣資訊
要顯示各地區氣象資訊的關鍵是甚麼? 答案是「WOE ID」,只要改變 WOE ID 就可以顯示不同區域的氣象資訊。
範例程式中德國柏林(Berlin)的 WOEID 是 638242,英國倫敦(London)的 WOE ID 是 44418,那麼台北的 WOE ID 是多少呢? 您可以到這個網頁
https://weather.yahoo.com/taiwan/
選擇清單中的台灣各地區城市。
我們以台北為例,請您點按 Taipei City,在新頁面內再點按一次 Taipei City,網頁會跳到
https://weather.yahoo.com/taiwan/taipei-city/taipei-city-2306179/
網址最後面的數字就是台北的 WOE ID。
您可以用這組數字取代掉程式碼中的 638242,如下兩行:
weather = new YahooWeather(this, 638242, "c", updateIntervallMillis);
和
weather.setWOEID(638242);
如果要查其他地方的 WOEID,可以直接在搜尋欄位內鍵入地名或郵遞區號。
我們再以桃園為例,在搜尋欄位內鍵入「taoyuan」,就可以得到網址
https://weather.yahoo.com/taiwan/taoyuan-county/taoyuan-city-2298866/
所以桃園的 WOE ID 為 2298866。
最後,我們要顯示台北和桃園的氣象資訊,程式碼如下:
import com.onformative.yahooweather.*;
YahooWeather weather;
int updateIntervallMillis = 30000;
void setup() {
size(700, 300);
fill(0);
textFont(createFont("Arial", 14));
weather = new YahooWeather(this, 2298866, "c", updateIntervallMillis);
}
void draw() {
weather.update();
background(255);
text("City: "+weather.getCityName()+"; Region: "+weather.getRegionName()+"; Country: "+weather.getCountryName()+"; Last updated: "+weather.getLastUpdated(), 20, 20);
text("Lon: "+weather.getLongitude()+" Lat: "+weather.getLatitude(), 20, 40);
text("WindTemp: "+weather.getWindTemperature()+" WindSpeed: "+weather.getWindSpeed()+" WindDirection: "+weather.getWindDirection(), 20, 60);
text("Humidity: "+weather.getHumidity()+" visibility: "+weather.getVisibleDistance()+" pressure: "+weather.getPressure()+" rising: "+weather.getRising(), 20, 80);
text("Sunrise: "+weather.getSunrise()+" sunset: "+weather.getSunset(), 20, 100);
}
public void keyPressed() {
if (key == 'q') {
weather.setWOEID(2298866);
}
if (key == 'r') {
weather.setWOEID(2306179);
}
}
相關文章
Onformative http://www.onformative.com/lab/google-weather-library-for-processing/
Python Weather API https://code.google.com/p/python-weather-api/
2015年4月1日 星期三
hex 檔
hex 檔是原始碼編譯過後產生的檔案,你可以將 hex 檔上傳給 Arduino,它的功用等同於你寫的程式。
如果你想把自己寫的程式給別人安裝在他的 Arduino 板子上來炫耀一下自己有多麼聰明,又不想讓他看到程式碼是怎麼寫的,那麼你可以把 hex 檔交給他即可。像這樣的方式也可以算是保護智慧權的一種。
產生 hex 檔案
在編譯或上傳程式到 Arduino 板子時,Arduino 會順便產生一些檔案,這些檔案會被放置到
C:\Documents and Settings\USER\Local Settings\Temp\build<一堆數字>.tmp 資料夾裏,其中一個就是 hex 檔。如果你的程式名稱是 blink.ino,那麼這個 hex 檔會被命名為 blink.cpp.hex。
將 hex 安裝到 Arduino
網路有很多應用軟體都可以將 hex 安裝到 Arduino 上,像是 XLoader、 Arduino UNO Uploader Tool ...等。大部分像這樣的軟體都會使用 Arduino 內建的 avrdude 程式作為上傳媒介。
您可以打開命令列視窗,並切換到 hex 檔所在路徑,鍵入下列命令可以將 hex 安裝到 Arduino。
<Arduino path>/hardware/tools/avrdude -V -F -C <Arduino path>/hardware/tools/avrdude.conf -p atmega328p -P COM5 -c stk500v1 -b 57600 -U flash:w:applet/blink.cpp.hex
使用應用軟體安裝 hex
下載 Arduino UNO Uploader Tool
網址 https://github.com/downloads/rlangoy/Arduino-Uno-Uploader-Tool/AUTSetupVer1_18.zip
下載 Xloader
網址 http://xloader.russemotto.com/XLoader.zip
教學 http://pizgchen.blogspot.tw/2015/06/upload-hex.html
使用自己熟悉的軟體安裝 hex
如果您熟悉 Python、C 和 VB ...這樣的程式語言,您也可以使用這些程式語言將 hex 安裝到 Arduino。
使用 Python 安裝 hex
(敬請期待...)
如果你想把自己寫的程式給別人安裝在他的 Arduino 板子上來炫耀一下自己有多麼聰明,又不想讓他看到程式碼是怎麼寫的,那麼你可以把 hex 檔交給他即可。像這樣的方式也可以算是保護智慧權的一種。
產生 hex 檔案
在編譯或上傳程式到 Arduino 板子時,Arduino 會順便產生一些檔案,這些檔案會被放置到
C:\Documents and Settings\USER\Local Settings\Temp\build<一堆數字>.tmp 資料夾裏,其中一個就是 hex 檔。如果你的程式名稱是 blink.ino,那麼這個 hex 檔會被命名為 blink.cpp.hex。
將 hex 安裝到 Arduino
網路有很多應用軟體都可以將 hex 安裝到 Arduino 上,像是 XLoader、 Arduino UNO Uploader Tool ...等。大部分像這樣的軟體都會使用 Arduino 內建的 avrdude 程式作為上傳媒介。
您可以打開命令列視窗,並切換到 hex 檔所在路徑,鍵入下列命令可以將 hex 安裝到 Arduino。
<Arduino path>/hardware/tools/avrdude -V -F -C <Arduino path>/hardware/tools/avrdude.conf -p atmega328p -P COM5 -c stk500v1 -b 57600 -U flash:w:applet/blink.cpp.hex
使用應用軟體安裝 hex
下載 Arduino UNO Uploader Tool
網址 https://github.com/downloads/rlangoy/Arduino-Uno-Uploader-Tool/AUTSetupVer1_18.zip
下載 Xloader
網址 http://xloader.russemotto.com/XLoader.zip
教學 http://pizgchen.blogspot.tw/2015/06/upload-hex.html
使用自己熟悉的軟體安裝 hex
如果您熟悉 Python、C 和 VB ...這樣的程式語言,您也可以使用這些程式語言將 hex 安裝到 Arduino。
使用 Python 安裝 hex
(敬請期待...)
2015年3月30日 星期一
鑑定你的 bootloader 是哪一個版本
這裡有一個 Arduino 程式,它可以試著幫您找出 Arduino 板子的 bootloader 是哪一種版本。
我的板子是 Pro mini,經過鑑定之後顯示如下資訊:
[bootCheck.2]
CRC 2048b @ 0x7800 = 489C
Boot loader: Duemilanove
程式碼
//bootCheck.ino
// Detect which type of boot loader is present, using a fixed built-in table
// http://opensource.org/licenses/mit-license.php
#include <avr/pgmspace.h>
#include <util/crc16.h>
#define VERSION "2"
// list of all known boot loaders with their unique signatures
struct { word crc; const char* desc; } signatures[] = {
0x489C, "Duemilanove",
0xF1A0, "Nanode (Duemilanove mod)",
0xFD70, "OptiBoot 4.4",
0, 0
};
static word CalculateChecksum (word addr, word size) {
word crc = ~0;
prog_uint8_t* p = (prog_uint8_t*) addr;
for (word i = 0; i < size; ++i)
crc = _crc16_update(crc, pgm_read_byte(p++));
Serial.print(" CRC ");
Serial.print(size);
Serial.print("b @ 0x");
Serial.print(addr, HEX);
Serial.print(" = ");
Serial.println(crc, HEX);
return crc;
}
static const char* IdentifyBootLoader (word addr, word size) {
word crc = CalculateChecksum(addr, size);
for (byte i = 0; signatures[i].desc != 0; ++i)
if (signatures[i].crc == crc)
return signatures[i].desc;
return 0;
}
void setup () {
Serial.begin(9600);
Serial.println("\n[bootCheck." VERSION "]");
const char* message = IdentifyBootLoader(0x7800, 2048);
if (message == 0)
message = IdentifyBootLoader(0x7E00, 512);
if (message == 0)
message = "(UNKNOWN)";
Serial.print("Boot loader: ");
Serial.println(message);
}
void loop () {}
2015年3月18日 星期三
用 Arduino UNO 板子將程式上傳到 Arduino Pro mini
Arduino Pro mini 缺少一個可以將 USB 轉 TTL 的電路,然而 Arduino UNO 卻有這個電路,所以我們可以利用 Arduino UNO 上面的 USB 轉 TTL 電路將程式上傳到 Arduino Pro mini。
步驟如下:
1. 小心地移除 Arduino UNO 上面的 ATmega328 晶片。
2. 為 UNO 和 Pro mini 接線,方式如下:
UNO Pro mini
5V VCC
GND GND
RX RXI
TX TXO
RESET DTR
3. 啟動 Arduino IDE,開始撰寫程式。或是開啟 Blink 範例檔案。
4. 設定板子型號。點擊下拉功能表 Tools > Board > Arduino Pro or Pro Mini (5V, 16Mhz) w/ Atmega 328
5. 點擊工具列按鈕 [Upload]。
完成。
這兒有一段影片您可以參考看看 https://www.youtube.com/watch?v=qqSLwK1DP8Q
步驟如下:
1. 小心地移除 Arduino UNO 上面的 ATmega328 晶片。
2. 為 UNO 和 Pro mini 接線,方式如下:
UNO Pro mini
5V VCC
GND GND
RX RXI
TX TXO
RESET DTR
3. 啟動 Arduino IDE,開始撰寫程式。或是開啟 Blink 範例檔案。
4. 設定板子型號。點擊下拉功能表 Tools > Board > Arduino Pro or Pro Mini (5V, 16Mhz) w/ Atmega 328
5. 點擊工具列按鈕 [Upload]。
完成。
這兒有一段影片您可以參考看看 https://www.youtube.com/watch?v=qqSLwK1DP8Q
2015年3月17日 星期二
Arduino IDE - SublimeText
這是一款多用途的編輯器,它具有關鍵字亮顯(Highlight)、自動彈出(Auto Popup)和可中文註解...等功能,對於用不慣陽春的 Arduino 編輯器使用者而言,這是個不錯的選擇。
官網 http://www.sublimetext.com/
下載
目前穩定版為 Sublime Text 2,下載網址 http://www.sublimetext.com/2
Sublime Text 3 為 beta 版,下載網址 http://www.sublimetext.com/3
我們還需要下載 Stino 插件,它提供一個類似 Arduino IDE 的編輯環境,下載網址
https://github.com/Robot-Will/Stino
安裝
此處我們以 Sublime Text 3 來說明。
雙擊 Sublime Text Build 3065 Setup.exe,然後依照視窗提示進行即可。您會發現它的安裝過程式是極為快速簡單的。
設定
1. 啟動 Sublime Text 3。
2. 點擊下拉功能表 Preferences > Browse Packages...,出現 Packages 視窗
3. 將剛剛下載的 Stino-new-stino.zip 解壓縮後複製貼到路徑 C:\Documents and Settings\USER\Application Data\Sublime Text 3\Packages 裏面。
4. 關閉並重新啟動 Sublime Text 3,您就可以在下拉功能表最右側看到 Arduino 的項目
5. 接著要指定 Arduino 的資料夾路徑,點擊下拉功能表 Arduino > Preferences > Select Arduino Application Folder,出現下列對話框後指定 Arduino 系統所在路徑。
如果正確,在下方的訊息欄內會出現已找到 Arduino 路徑的訊息。
撰寫 Arduino 程式
1. 點擊下拉功能表 Arduino > New Sketch,在下方的欄位輸入「my01」並按下<Enter>鍵,如下
接著在編輯區內會出現數行程式碼,您是不是覺得很眼熟? 沒錯,它就是「Blink」(註A)。
註A: 在為 Arduino 燒錄 Bootloader 時會一併將 Blink 程式燒錄到 ATmega328 晶片裏,以便讓使用者能透過觀察板子上的 LED 閃爍狀態來判斷 Bootloader 是否燒錄成功。
2. 您可以將 Blink 程式碼全部刪除,並編寫自己的程式碼 (此處我仍以 Blink 為例)。
3. 指定主板型號,點擊下拉功能表 Arduino > Board,在項目中挑選 Arduino 主板型號。
4. 指定主板連接埠,點擊下拉功能表 Arduino > Serial Port,在項目中挑選 Arduino 連接埠。
5. 上傳程式,點擊下拉功能表 Arduino > Upload (註B),如果訊息欄顯示「[Stino - Done uploading.[」表上傳成功。
註B:如果點擊「Upload by Useing Programmer」,會出現錯誤訊息
avrdude: stk500_getsync(): not in sync: resp=0x00
[Stino - Exit with error code 1.]
您可能也喜歡
Sublime Text 線上說明手冊 http://docs.sublimetext.tw/
Sublime Text 台灣臉書粉絲專頁 https://www.facebook.com/SublimeTextTW
官網 http://www.sublimetext.com/
下載
目前穩定版為 Sublime Text 2,下載網址 http://www.sublimetext.com/2
Sublime Text 3 為 beta 版,下載網址 http://www.sublimetext.com/3
我們還需要下載 Stino 插件,它提供一個類似 Arduino IDE 的編輯環境,下載網址
https://github.com/Robot-Will/Stino
安裝
此處我們以 Sublime Text 3 來說明。
雙擊 Sublime Text Build 3065 Setup.exe,然後依照視窗提示進行即可。您會發現它的安裝過程式是極為快速簡單的。
設定
1. 啟動 Sublime Text 3。
2. 點擊下拉功能表 Preferences > Browse Packages...,出現 Packages 視窗
3. 將剛剛下載的 Stino-new-stino.zip 解壓縮後複製貼到路徑 C:\Documents and Settings\USER\Application Data\Sublime Text 3\Packages 裏面。
4. 關閉並重新啟動 Sublime Text 3,您就可以在下拉功能表最右側看到 Arduino 的項目
5. 接著要指定 Arduino 的資料夾路徑,點擊下拉功能表 Arduino > Preferences > Select Arduino Application Folder,出現下列對話框後指定 Arduino 系統所在路徑。
如果正確,在下方的訊息欄內會出現已找到 Arduino 路徑的訊息。
撰寫 Arduino 程式
1. 點擊下拉功能表 Arduino > New Sketch,在下方的欄位輸入「my01」並按下<Enter>鍵,如下
接著在編輯區內會出現數行程式碼,您是不是覺得很眼熟? 沒錯,它就是「Blink」(註A)。
註A: 在為 Arduino 燒錄 Bootloader 時會一併將 Blink 程式燒錄到 ATmega328 晶片裏,以便讓使用者能透過觀察板子上的 LED 閃爍狀態來判斷 Bootloader 是否燒錄成功。
2. 您可以將 Blink 程式碼全部刪除,並編寫自己的程式碼 (此處我仍以 Blink 為例)。
3. 指定主板型號,點擊下拉功能表 Arduino > Board,在項目中挑選 Arduino 主板型號。
4. 指定主板連接埠,點擊下拉功能表 Arduino > Serial Port,在項目中挑選 Arduino 連接埠。
5. 上傳程式,點擊下拉功能表 Arduino > Upload (註B),如果訊息欄顯示「[Stino - Done uploading.[」表上傳成功。
註B:如果點擊「Upload by Useing Programmer」,會出現錯誤訊息
avrdude: stk500_getsync(): not in sync: resp=0x00
[Stino - Exit with error code 1.]
您可能也喜歡
Sublime Text 線上說明手冊 http://docs.sublimetext.tw/
Sublime Text 台灣臉書粉絲專頁 https://www.facebook.com/SublimeTextTW
2015年3月12日 星期四
Library - Hermes
Hermes 核心提供一個獨特的系統用來管理遊戲。除了核心框架,它還包括有碰撞檢測,物理,鍵盤,鼠標,聲音和動畫等控制模組。
您可以到官網並移動滑桿到網頁最底端,就可以看到 Hermes 做出的一些動畫效果。
官網 http://rdlester.github.io/hermes/
下載
有數種下載的方式:
1. 這個網址下載函式庫 http://rdlester.github.com/hermes/downloads/hermes.zip
2. 這兒也可以下載 https://github.com/rdlester/hermes/
3. 個人比較建議用 Processing IDE 下載與安裝。步驟如下:
點擊下拉功能表 Sketch > Import Library...> Add Libary...,移動滑桿到 Hermes 項目並點擊該項目與 Install 按鈕。
手動安裝
如果不是使用上述第3種方式下載,您也可以手動安裝,步驟如下。
將 hermes-master.zip 解壓縮後,將該資料夾名稱更名為 hermes 並將整個資料夾複製貼到 <Processing 路徑>\libraries 裏。
記得要關閉 Processing 系統並重新啟動後,Hermes 這個函式庫才會出現唷。
教學
教學說明在下方的網址
https://github.com/rdlester/hermes/wiki/Tutorial-Pt.-0:-Before-Getting-Started
或是您也可以開啟範例檔案先執行看看 Hermes 它有哪些令人驚喜的地方,
點擊下拉功能表 File > Examples...> Contributed Libraries > Hermes,雙擊 tutorialA
點擊工具列按鈕 Run,接著您就可以看到執行的結果,如下圖
問題與對策
執行時如果出現如下圖之訊息,有可能的原因是您使用的 Processsing 版本太老舊了,建議您換用最新版本執行。
您可以到官網並移動滑桿到網頁最底端,就可以看到 Hermes 做出的一些動畫效果。
官網 http://rdlester.github.io/hermes/
下載
有數種下載的方式:
1. 這個網址下載函式庫 http://rdlester.github.com/hermes/downloads/hermes.zip
2. 這兒也可以下載 https://github.com/rdlester/hermes/
3. 個人比較建議用 Processing IDE 下載與安裝。步驟如下:
點擊下拉功能表 Sketch > Import Library...> Add Libary...,移動滑桿到 Hermes 項目並點擊該項目與 Install 按鈕。
手動安裝
如果不是使用上述第3種方式下載,您也可以手動安裝,步驟如下。
將 hermes-master.zip 解壓縮後,將該資料夾名稱更名為 hermes 並將整個資料夾複製貼到 <Processing 路徑>\libraries 裏。
記得要關閉 Processing 系統並重新啟動後,Hermes 這個函式庫才會出現唷。
教學
教學說明在下方的網址
https://github.com/rdlester/hermes/wiki/Tutorial-Pt.-0:-Before-Getting-Started
或是您也可以開啟範例檔案先執行看看 Hermes 它有哪些令人驚喜的地方,
點擊下拉功能表 File > Examples...> Contributed Libraries > Hermes,雙擊 tutorialA
點擊工具列按鈕 Run,接著您就可以看到執行的結果,如下圖
問題與對策
執行時如果出現如下圖之訊息,有可能的原因是您使用的 Processsing 版本太老舊了,建議您換用最新版本執行。
2015年3月11日 星期三
使用者介面 - G4PTool
這是一款視覺化的圖形介面編輯器,它使用的方式跟一般圖形介面建構軟體差不多,都是使用拖拉方式將工具拖拉到視窗內。它雖然操作簡單方便,但不適用於 Android。如果只是想寫 JAVA 程式,是可以考慮這個。
官網 http://lagers.org.uk/g4ptool/index.html
下載與安裝
下載網址 http://sourceforge.net/projects/guibuilder/files/?source=navbar。
我比較建議您使用下列方式下載與安裝。
1. 點擊下拉功能表 Tools > Add Tool...
2. 往下拉動滑桿並點擊 G4PTool 這一項,再點擊 Install 按鈕
3. 如果出現 Remove 按鈕,表示已安裝完成。
4. 退出 Processing 並重新啟動。
範例
1. 點擊下拉功能表 Files > Examples...,出現視窗
2. 展開 G4P,快擊二下 G4P_ImageButton 開啟文件
3. 點擊 Run 工具列按鈕,即可看見如下畫面
設計自己的 GUI
1. 點擊下拉功能表 Tools > GUI builder,出現視窗
2. 點擊工具列的 Button 鈕,用滑鼠將 Button 稍微移動到旁邊,並再點擊一次 Button 鈕。您可以看見如下圖
3. 點擊 Processing IDE,您可以看見新增兩個頁籤,其中一個是 gui。另外,原本空白的編輯區裏面已經佈滿了程式碼,這是自動產生的。
如果您對 gui 頁籤裏的程式碼還不熟悉,建議您不要隨意變更該程式碼內容。
4. 點擊主頁籤 sketch_xxxx,再點擊工具列按鈕 Run,即可看見如下畫面
官網 http://lagers.org.uk/g4ptool/index.html
下載與安裝
下載網址 http://sourceforge.net/projects/guibuilder/files/?source=navbar。
我比較建議您使用下列方式下載與安裝。
1. 點擊下拉功能表 Tools > Add Tool...
2. 往下拉動滑桿並點擊 G4PTool 這一項,再點擊 Install 按鈕
3. 如果出現 Remove 按鈕,表示已安裝完成。
4. 退出 Processing 並重新啟動。
範例
1. 點擊下拉功能表 Files > Examples...,出現視窗
2. 展開 G4P,快擊二下 G4P_ImageButton 開啟文件
3. 點擊 Run 工具列按鈕,即可看見如下畫面
設計自己的 GUI
1. 點擊下拉功能表 Tools > GUI builder,出現視窗
2. 點擊工具列的 Button 鈕,用滑鼠將 Button 稍微移動到旁邊,並再點擊一次 Button 鈕。您可以看見如下圖
3. 點擊 Processing IDE,您可以看見新增兩個頁籤,其中一個是 gui。另外,原本空白的編輯區裏面已經佈滿了程式碼,這是自動產生的。
如果您對 gui 頁籤裏的程式碼還不熟悉,建議您不要隨意變更該程式碼內容。
4. 點擊主頁籤 sketch_xxxx,再點擊工具列按鈕 Run,即可看見如下畫面
訂閱:
文章 (Atom)