2016年1月17日 星期日

Arduino UNO (LED)程式入門 with Arduino IDE

第一次使用Arduino IDE寫程式到Arduino UNO板子裡面,讓板子上的L燈(LED)根據程式設定發亮,一開始開啟Arduino IDE後先設定板子的類型與跟電腦連接的port,設定完成後確認設定是否成功,如下第二張圖,然後開始寫程式(C語言),參考如下 :
void setup() {
  // put your setup code here, to run once:
  //設定第13數位腳位做輸出
  pinMode(13, OUTPUT); 
}

void loop() {
  // put your main code here, to run repeatedly:
  //第13數位腳位輸入高電壓(5V或3.3V),此時LED就會發亮
  digitalWrite(13, HIGH);
  //停1000毫秒(ms),也就是1秒
  delay(1000);
  //第13數位腳位輸入低電壓(0V),此時LED就不會發亮
  digitalWrite(13, LOW);
  delay(1000);
}
程式完成後上傳程式到板子上,就完成L燈的發亮控制,L燈是原本已經焊接在板子的13腳位.
設定板子類型與port
確認設定成功與上傳程式
結果
Arduino pinMode()函式是在設定數位輸入/輸出的腳位,格式為 : pinMode(pin, mode)
pin : 為數位腳位設定.
mode : 有三種模式 -> INPUT : 設定數位腳位為高阻抗輸入模式
                                    INPUT_PULLUP : 設定數位腳位含上升電阻輸入模式
                                    OUTPUT : 設定數位腳位為輸出模式

2016年1月15日 星期五

更換編譯後產生的執行檔路徑

用原始的方式編譯程式檔需要回到csc.exe的目錄下,此篇用批次檔(.bat)方式更改執行檔產生位置

實作:
開啟記事本,輸入下列圖片中的文字,存檔,副檔名改成".bat",執行剛儲存的批次檔,會看到開啟命令提示字元,會發現命令提示字元顯示的路徑,是批次檔所在的路徑,因此只要將程式檔(.cs)放到跟批次檔同一個目錄下,然後在命令提示字元打上檔名.cs,按下Enter就會在同一個目錄下產生編譯後的執行檔,如此就不用再回到csc.exe的目錄下
批次檔
命令提示字元

C#基本編譯方式


在剛開始學習程式設計時,學習者大部分都是從網路上或買相關書籍回來學習,而這些參考資料都是直接使用編程軟體進行教學,未講解背後編譯流程,因此在此補充說明底層運作模式。 *此說明以C#語言做為範例 C#的程式檔副檔名是".cs",那要如何執行C#的程式檔,首先在你們的目錄下找到一個C#的編譯器名稱叫做"csc.exe",我的目錄是C:\Windows\Microsoft.NET\Framework\v4.0.30319,它會把我們寫的高階程式語言轉換成電腦懂得機器語言。 

實作:
開啟記事本,輸入下圖程式碼後存檔(任何路徑都可以),副檔名改為".cs",打開命令提示字元,將路徑改為csc.exe的所在路徑,按Enter,然後輸入csc 程式檔儲存路徑\程式檔名稱.cs,按Enter,如果出現存取被拒,請用系統管理員身分開啟命令提示字元就可以了。

程式檔
命令提示字元

編譯成功後回到csc.exe的目錄下,可以找到編譯成功後產生的Hello執行檔,點兩下,會發現它閃一下就關掉了,它其實有印出Hello只是電腦執行速度太快了,程式執行結束就關閉了,可以加個停止的程式碼,像是Console.ReadLine()。

2016年1月12日 星期二

mBot 感測器 Port 問題

今天第一次試著自己寫一個讓mBot避免撞到東西的程式,也就是透過超音波感測器來測量距離,但將寫好的程式載入到Arduino uno 的板子後,mBot卻不是照程式的寫法動作,所以用Scratch的場景來測試距離的數值是否正確,但距離的數值竟然也不會變動,後來發現了兩個問題 :

一. mBot不照載入的程式跑.
原因 : 如果Arduino 板子已經有載入的程式,要再進行場景測試,必須Reset Default Program,如第二張圖,這樣角色才會照著程式執行.
將程式載入到Arduino板子

Scratch的場景測試(圖形程式開頭是有綠色的旗子)

二. 場景角色無法正確顯示感測器偵測到的數值.
原因 : 要顯示感測器偵測到的數值,必須設定感測器連接Arduino板子的接口(port)是幾號或是已經在Arduino板子上,而不是設定電腦連接Arduino板子的port號,下圖範例是光度感測器的設定,看到最後一張圖的光度感測器是已經在Arduino板子上,所以設定光度感測器是light sensor on board,而超音波感測器是在此範例是設定Port 3.

setting light sensor is light sensor on board


setting ultrasonic sensor is port 3

此圖的超音波感測器的連接線是連在Arduino板子的port 3

2016年1月11日 星期一

My first robot

2016.01.10 參加全佑電腦舉辦的mBot自走車機器人的半日課程,mBot是由Makeblock公司所製造的產品,由全佑電腦代理.

課程一開始先簡單的講解機器人的定義,然後說明如何組裝mBot,大致上就是將金屬外殼結合motor,lithium battery and some sensors. 而mbot 主要的microcontroller board是使用Arduino UNO,所以在程式開發是使用C語言,但在課程中我們是使用Scratch圖形化程式語言讓軟體自動轉譯成C語言,因此小學生也可以很容易的完成mBot的程式編輯. 程式開發的教學主要是教如何讓mBot行走和sensor的控制,最後是mBot的巡線應用.

在整個課程中實際動手寫程式,測試機器人,還蠻有趣的.在未來,機器人的服務可說是會越來越普及,尤其是在替代人力資源上,很開心擁有第一台robot. It is called mBot. ^^
組裝mBot

組裝mBot

當天課程的產品零件




2016年1月9日 星期六

程式設計原則

單一職責原則 (Single Responsibility Principle, SRP) :
        一個類別若負責的功能(函式)過多,就會把這些功能都偶合再一起(同一個類別內),如此可能造成一個功能的修改會減弱或限制這個類別去增加其他功能的能力。

開放封閉原則 (Open-Closed Principle, OCP) :
        程式內的類別,函數,模組等應該要是可以擴增,但不可修改。
        開發人員應將程式中常修改的部分做抽象,但不要做出不成熟的抽象。

        程式設計中,抽象類別別包括下列4類:
        1:過程抽象:能夠引入一些新的操作。
        2:資料抽象:能夠引入新的資料物件類型。
        3:反覆運算抽象:能夠反覆運算遍歷在集合中的元素,而不必顯示如何獲得元素的細節。
        4:類型層次:能夠從多個單獨的資料類型中抽象成幾組相關的類型。

迪米特法則 (Low of Demeter, LoD) :
  兩個類別如果不需要直接溝通,就不應該直接互相存取對方類別內的成員,但若需要另一個類別內的成員,可以透過第三方類別轉發該成員。

  LoD法則主要強調,每個類別應該降低自己類別內成員的存取權限,以達到類別之間的低耦合,耦合越低越有利於複用,不會因修改一個類別而影響到另一個有關係類別。

參考資料:
大話設計(書)
https://zh.wikipedia.org/wiki/%E6%8A%BD%E8%B1%A1%E5%8C%96_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8)

2016年1月1日 星期五

Simple Factory Pattern 簡單工廠模式

特性 : 各類別職責歸類清楚,達到鬆耦合優點。


簡單工廠模式UML圖
以下是拆解各類別並說明 :
class simpleFactory
{
    public static Operation CreateOperate(string oper)
    {
        Operation opera = null;
        switch (oper)
        {
            case "+":
                opera = new Add();
                break;
            case "-":
                opera = new Sub();
                break;
            case "*":
                opera = new Mul();
                break;
            case "/":
               opera = new Div();
                break;
        }
        return opera;
    }
}

class Operation
{
    public double NumberA { get; set; }
    public double NumberB { get; set; }
    public virtual double GetResult()
    {
        double result = 0;
        return result;
    } 
}

//此例以Add類別做代表,Sub, Mul, Div類別依此類推。
class Add:Operation
{
    public override double GetResult()
    {
        double r = NumberA + NumberB;
        return r;
    }
}

非UML圖,講解下面程式碼用
public partial class MainWindow : Window
{
    Operation oper = new Operation();  //Operation型別的oper一開始參考Operation物件。
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //tb_opera, tb_numbera, tb_numberb, tb_result為TextBox控制項
        //變數oper依輸入的運算式,而改變參考對象,此圖示參考到Add物件,而一開始參考的Operation物件會取消。
        oper = simpleFactory.CreateOperate(tb_opera.Text);    
        oper.NumberA = double.Parse(tb_numbera.Text);
        oper.NumberB = double.Parse(tb_numberb.Text);
        //變數oper呼叫參考到的Add物件裡的GetResult()函式。
        tb_result.Text = oper.GetResult().ToString();            
    }
}

簡單工廠模式讓使用者端需要參考兩個類別 Operation與simpleFactory,因此耦合度還可以改善.
範例程式碼
參考大話設計一書

蘭花種植方式整理


  • 蘭株要淺植 : 種植蘭株不可深植,深植基部長期潮濕會腐爛。種植時,將植料填充根部,基部或假球莖必須露出,不可埋入植料裡面。
  • 根部要展開 : 種植蘭花根部要向四面八方均勻展開,不可擠壓成一團,這樣每條根才能接觸植料,通氣也良好,否則容易腐根,初學者要特別注意。
  • 株身要固定 : 蘭株不能深植,所以常常有搖搖欲墜站不穩的現象,因此必須用支柱.綁線或利用提耳當支柱加以固定,使它不會動搖,傷及根部。
  • 植料稍壓緊 : 蘭花植料必須要求通氣.排水良好,但植料也應稍壓緊,否則基部空間太大,根部生長不良。正確的方法是從兩側壓實,不是從上面重壓


修根或剪葉 : 舊料清除後稍加晾乾,再將老根.壞根剪除,保留活根,活根太長加以剪短,保留5~7cm。若另有半乾枯的老莖葉,也一併加以剪除。

株多要分株 : 如果株數很多,可以趁此分株繁殖,分株最好每株有3個假球莖(壯株有2莖,弱株有3~4莖)。若希望近期能開花,應增加莖數,初學者最好分切多莖為宜。

陰乾再栽植 : 最後將蘭株陰乾,準備栽植。陰乾可以促進新根.新芽長出。莖葉肥厚者最好等到傷口乾涸再栽植,莖葉較薄者不可放太久,也可以先植盆,隔數天後再澆水。


  • 為什麼要分株 :


1)株身已滿盆,新芽長盆外。 2)株數已很多,想要多分盆。 3)親友很中意,分株給栽培。

4)植料已腐壞,換料兼分株。 5)必須要換盆,換盆兼分株。


  • 澆水十大要訣 :


1)水質要清潔,地下水或自來水應貯於水池或水缸12小時以上再澆灌為佳。

2)渾濁的雨水,地下水含有大量鐵質.石灰質,忌澆蘭花。

3)水質的酸鹼度要適中,不可過酸或過鹼。

4)澆水的原則是植料乾了再澆,切忌經常保持濕潤狀態。

5)植料已乾了,再放置一天,使植料更乾再澆水。初學養蘭,大多失敗在澆水太勤。

6)該澆水的時候應澆透,使多餘的水從盆底流出,也能換掉盆內的空氣。

7)澆水的時間,盡量選在晴朗而有陽光的上午為佳。中午氣溫高不宜澆水。

8)冬或早春水溫很低,應使用在室溫下存放了一天的水,這樣的水較溫暖。

9)夏天或秋初氣溫高,盡量使用冷水噴灑或澆灌。

10)已正常澆水,但蘭株仍有乾枯缺水現象,必須設法提高空氣濕度,千萬不可天天猛灌水。


  • 澆水的方法 : 蘭花的澆水方法大致和澆灌一般花木相同,應自上方充分澆灌,直至多餘的水自盆底流出為止澆水時應能噴灑到全株莖葉,藉此沖洗莖葉上的灰塵污垢,以增加生長機能若用蛇木板.柱栽植,必須澆透板.柱使其充分吸水。


資料來源 : http://blog.xuite.net/y1420u/y1420u/85879320-%E7%AC%AC402%E5%96%AE%E5%85%83+%E5%AE%B6%E5%BA%AD%E5%9C%92%E8%97%9D%E6%A6%82%E8%AB%96(2)-%E8%98%AD%E8%8A%B1%E6%A0%BD%E5%9F%B9