2020年5月30日 星期六

ROSA 2020 系統開發 2 ─ 投幣計時器 (4rdp Timer)

https://4rdp.blogspot.com/2020/05/rosa-2020-2-4rdp-timer.html?m=0

每次創客活動擺攤,4rdp 益智拼圖攤位前總是一堆遊客玩拼圖,因此讓我興起十元投幣贈獎的念頭,設計一個投幣計時器,投入十塊錢開始計時,只要五分鐘內排好拼圖,現場獎品隨便挑,反正家中很多雜物藉機出脫,即使拼圖沒賣出一個,總是有人會殺時間嘗試拼圖能力吧!

去年因參加創客比賽,學會雷切木盒子設計,因此計時器從外觀設計到內部電路及程式設計,一手包辦,下次擺攤時,這個計時器就可以讓遊客們打賞使用。

電路的挑選就是 Arduino Uno 和 LCD KeyPad 模組,一個按鈕 (停止鍵) 和微動開關 (偵測投幣)。

這個 LCD KeyPad 模組,使用 Arduino pin 4 ~ 9,pin 10 為背光控制,A0 是按鍵讀取的腳位,利用類比方式處理,因此不會占用過多數位腳,不過模組的按鍵這裡沒有使用。 另外這個投幣計時器使用 pin 3 偵測計時啟動,pin A1 偵測計時停止,這兩隻腳都設定數位輸入,並且 PULLUP,所以未按鍵時會讀到 1。

程式當然是使用 ROSA 2020,它使用了ROSA_BASE.cpp 、ROSA_DISPLAY.cpp、ROSA_TIMER.cpp 三個函式庫,ROSA_DISPLAY 內含 LCD KeyPad 驅動程式,並引用外部的程式庫 LiquidCrystal.h (Arduino 內含的程式庫)、LCDKeypad.h,ROSA_TIMER 函式可以處理碼錶正數和倒數計時,ROSA_BASE 除了基本時間和 IO 腳控制外,還加入 STRING,可將整數依據格式轉換成字串,這個 STRING 讓我花了五天時間把它最佳化,下一篇文章再仔細介紹設計的關鍵在哪裡。

現在繼續看 ROSA_Coin.ino 程式碼,系統使用 2ms 和10ms,2ms 用於碼錶計時,也是 ROSA 系統最小時間單位,10ms 為按鍵讀取時間間隔,原本設定 50ms 即可,不需要這麼密集,但是怕有人反應計時器按鍵反應遲鈍誤差高達 50ms,所以選擇 10ms,另外 Stop 按鍵持續一秒鐘,會把時間歸零。










// (C) 2019-2020, Bridan Wang, CC BY-NC-SA 3.0 TW
// This is a demo program applied Robot Operating System for Arduino (ROSA)
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)

//軟件許可協議
//
//研發養成所 Bridan Wang 提供此軟體供學校教育或個人單獨使用
//對外分享展示本軟體時,請說明來源來自研發養成所
//你可以架構在本軟體基礎上,設計新功能或修改
//本軟體屬於 Bridan 和或其它原始碼供應商,並受適用的法律版權保護
//此軟體按“原樣”提供,可能含有錯誤,不作任何明示,暗示或法律的保證
//本軟體僅限 Arduino 部分微控制器產品,適用於特定用途
// Bridan 在任何情況、環境以及特殊使用不負任何原因損害賠償責任
//
//這是 ROSA 韌體版本的一部分。
//
//建議使用 Arduino-1.8.8 以後版本編譯,因為有發現舊版本有錯誤情形


/***********************************************************
// System Condition DEFINE
************************************************************/
#define PRODUCT  "ROSA- 4rdp Timer"
#define VERSION  "v2020.5.12"

#define TIME_2ms      // ROSA_TIME_2ms()
#define TIME_10ms     // ROSA_TIME_10ms()
//#define TIME_50ms     // ROSA_TIME_50ms()
//#define TIME_100ms    // ROSA_TIME_100ms()
//#define TIME_250ms    // ROSA_TIME_250ms()
//#define TIME_500ms    // ROSA_TIME_500ms()
//#define TIME_1sec     // ROSA_TIME_1sec()

//#define TIME_SYSTEM   // ROSA_TIME_SETUP()

#define PROJECT_ROOT C:\Users\bridwang\Desktop\Bridan\ROSA_2020
#define TO_STRING(s) #s
#define ABSOLUTE_PATH(root, relative_path) TO_STRING(root\relative_path)
#define RELATIVE_PATH(library) ABSOLUTE_PATH(PROJECT_ROOT, library)
/***********************************************************
// Include
************************************************************/
#include RELATIVE_PATH(ROSA\ROSA_BASE.cpp)
#include RELATIVE_PATH(ROSA\ROSA_DISPLAY.cpp)
#include RELATIVE_PATH(ROSA\ROSA_TIMER.cpp)

ROSA_PIN        key_start;
ROSA_PIN        key_stop;
ROSA_LCD_KEYPAD lcd;
ROSA_TIMER      timer;

/***********************************************************
// Main Program
************************************************************/
void setup() {
  timer.START(0, 0, 0, 0, 0);        // start, hr, min, sec, msec  
  key_start.SETUP(3, INPUT_PULLUP);  // pin 3
  key_stop.SETUP(A1, INPUT_PULLUP);  // pin A1
  lcd.SETUP();                       // pin 4 ~ 9, 10, A0
  DISPLAY_INITIAL();
}

void loop() 
{
  ROSA_TIME_RUNNING();     // 系統時間處理
  DISPLAY_UPDATE();
}

/***********************************************************
// DISPLAY
************************************************************/

void DISPLAY_INITIAL() {
  lcd.CLEAR();
  lcd.PRINT(PRODUCT);
  lcd.CURSOR(0,1);   // 換行
  lcd.PRINT("  00:00:00.000");
}

void DISPLAY_UPDATE() {
  lcd.CURSOR(2,1);   // 換行
  lcd.PRINT(STRING("%02d:", timer.hr));
  lcd.PRINT(STRING("%02d:", timer.min));
  lcd.PRINT(STRING("%02d.", timer.sec));
  lcd.PRINT(STRING("%03d", timer.msec));
}

/***********************************************************
// SYSTEM TIME
************************************************************/
void ROSA_TIME_2ms()
{
  timer.RUNUP();
}

void ROSA_TIME_10ms()
{
  if (key_stop.IN()==0) {
    if (key_stop.count == 100)        // 持續按 STOP 一秒
      timer.START(0, 0, 0, 0, 0);     // start, hr, min, sec, msec
    else {
      timer.start = 0;                // 按一下 STOP
      key_stop.count++;
    }
  } else {
    key_stop.count = 0;
    if (key_start.IN()==0)            // 投幣 START
      timer.START(1, 0, 0, 0, 0);     // start, hr, min, sec, msec
  }
}

2020年5月26日 星期二

訓練數學感 252 ─ 書籍排列

https://4rdp.blogspot.com/2020/05/252.html?m=0

有四種不同的書,剛好書皮顏色也不一樣,分別是紅黃藍綠,每種書各有四本,有四個地方可以堆放,現在規定每個地方可以堆放四本不同顏色的書,請問

1. 每堆的堆放層別不可重複時,有幾種放法?例如第一堆由上而下為紅黃藍綠,第二堆不可以紅藍綠黃,因為最上層同顏色。

2. 如果不限制堆放重複時,有幾種放法?

2020年5月22日 星期五

ROSA 2020 系統開發 1 ─ LED control

https://4rdp.blogspot.com/2020/05/rosa-2020-1-led-control.html?m=0

今年因為 COVID-19 的關係,把一些活動行程打亂,最近有空再重整 ROSA (Robot Operation System for Arduino) 程式碼,程式庫改以 C++ 物件導向設計,因此 ROSA 2020 跟 ROSA 2019 還是有許多差異,不過基本概念仍然相通。以下程式使用 Arduino Uno 控制 LED 為例,將程式寫得更結構化,以此 ROSA 再出發。


ROSA 主程式目錄檔案

ROSA 函式庫檔案

主程式為 ROSA_LED.ino,下面藍色部分,它讓 pin 13 的 LED 亮 250 ms,滅 250 ms 循環閃爍,因為這程式不需要處理日期時間,所以取消綠色部分的程式,可讓程式更小。關於 ROSA 系統參數設定,基本上標示作品名稱及日期版本,和重要 #define,ROSA 設計成函式庫型式,就是讓一般使用者專注寫自己的程式碼,而專業開發者提供精簡好用的功能, 這些 #define 和 #include 是介於兩者之間的橋樑,讓那些函式庫程式碼引入,個人覺得這些放在主程式比較醒目,提醒使用者他的設定。

// (C) 2019-2020, Bridan Wang, CC BY-NC-SA 3.0 TW
// This is a demo program applied Robot Operation System for Arduino (ROSA)
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)

//軟件許可協議
//
//研發養成所 Bridan Wang 提供此軟體供學校教育或個人單獨使用
//對外分享展示本軟體時,請說明來源來自研發養成所
//你可以架構在本軟體基礎上,設計新功能或修改
//本軟體屬於 Bridan 和或其它原始碼供應商,並受適用的法律版權保護
//此軟體按“原樣”提供,可能含有錯誤,不作任何明示,暗示或法律的保證
//本軟體僅限 Arduino 部分微控制器產品,適用於特定用途
// Bridan 在任何情況、環境以及特殊使用不負任何原因損害賠償責任
//
//這是 ROSA 韌體版本的一部分。
//
//建議使用 Arduino-1.8.8 以後版本編譯,因為有發現舊版本有錯誤情形


/***********************************************************
// System Condition DEFINE
************************************************************/
#define PRODUCT  "ROSA,LED "
#define VERSION  "v2020.5.11"

//#define TIME_2ms      // ROSA_TIME_2ms()
//#define TIME_10ms     // ROSA_TIME_10ms()
//#define TIME_50ms     // ROSA_TIME_50ms()
//#define TIME_100ms    // ROSA_TIME_100ms()
#define TIME_250ms    // ROSA_TIME_250ms()
//#define TIME_500ms    // ROSA_TIME_500ms()
//#define TIME_1sec     // ROSA_TIME_1sec()

//#define TIME_SYSTEM   // ROSA_TIME_SETUP()

/***********************************************************
// Include
************************************************************/
#include ".\ROSA\ROSA_BASE.cpp"

ROSA_PIN     led;

/***********************************************************
// Main Program
************************************************************/
void setup() {
  //ROSA_TIME_SETUP(20, 5, 9, 0, 0, 0) ;  // YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
  led.SETUP(13, OUTPUT);                  // pin 13
}

void loop() 
{
  ROSA_TIME_RUNNING();     // 系統時間處理
}

/***********************************************************
// SYSTEM TIME
************************************************************/
void ROSA_TIME_250ms()
{
  led.OUT(CHANGE);     // 閃爍
}

所有 ROSA 程式必須包含 ROSA_BASE.cpp 函式庫,它是 ROSA 的基礎程式,先看一下程式碼,先說明跟時間相關部分,根據主程式 #define 設定,將需要的程式碼含入編譯。

2020年5月18日 星期一

訓練數學感 251 ─ 分割排列

https://4rdp.blogspot.com/2020/05/251.html?m=0



































































上圖為 8 x 8 表格,以剪刀沿著格線修剪,只允許邊長為 1, 2, 4, 8 格子的倍數,在不旋轉的情況下,有幾種排列組合?

2020年5月14日 星期四

一次搞懂密碼學中的三兄弟 — Encode、Encrypt 跟 Hash

https://4rdp.blogspot.com/2020/05/encodeencrypt-hash.html?m=0


作者 Larry 盧承億寫這篇文章很棒,很淺顯地把編碼(Encode)、加密(Encrypt)跟雜湊(Hash)三者的關係與差異點出來,在此留下連結,有興趣的朋友細細品味
https://medium.com/starbugs/what-are-encoding-encrypt-and-hashing-4b03d40e7b0c


2020年5月10日 星期日

訓練數學感 250 ─ 抽到哪一箱

https://4rdp.blogspot.com/2020/05/250.html?m=0

有兩箱球各有十顆,一箱為七紅三白,另一箱為三紅七白,選其中一箱抽球,現在抽球十二次,出現八紅四白,每次抽出放回去,請問抽到七紅三白那一箱的機率有多少?

2020年5月6日 星期三

QCAD

https://4rdp.blogspot.com/2020/05/qcad.html?m=0

兩年前曾推薦一款 DraftSight ─ 好用的 CAD 軟體,因為 2020 年起開始收費,本想付費訂購,但是因為它是年費制 (年費 NTD 3464),沒有提供一次性買斷的交易方式,讓我放棄使用它,因此上網尋找替代品,最後選定 QCAD (Professional, USD 38 = NTD 1140),剛開始使用蠻痛苦,因為整個操作習慣不一樣,學習一段時間才慢慢適應,不過它有許多不錯功能,更勝 DraftSight,以下為 QCAD 簡介。

1. 滾輪控制尺寸大小;Ctrl + 滑鼠左鍵 可以拖動圖上下左右;Shift + 滑鼠左鍵 可以加選物件;Alt + 滑鼠左鍵 可以選取重疊物件

2. 自動標點,製圖不同於繪圖,需要精確尺寸,有標點比較容易計數位置,也比較容易製圖定位,而且 QCAD 它還會自動隨尺寸大小調整,標點也跟著自動調整,非常方便。


3. 參數細調,製圖過程需要修改座標、長度等參數,可以從 Property Editor 的欄位去修改數值,線粗 Lineweight;顏色初始 By Layer。

4. 線頭起點為紅色,結尾為藍色,圓形角度方向為逆時鐘,可以利用對調 (Modify > Reverse) 來改變。

5. 填色,Draw > Hatch > HS > 選輪廓 > 滑鼠右鍵點填圖區。

6. Move / Copy,點選物件 > Modify > Move / Copy > 滑鼠左鍵點選參考點 > 滑鼠左鍵點選放置點。

7. 可輸入中文字體。

8. 物件上下層,Modify > Draw Order > Bring to front | Send to back。

9. 繪圖次序,當想雷射切割最佳化路徑,可以 Modify > Draw Order > Reorder。

10. 群組,Block > Create Block from Selection;分解,Block > Explode。編輯從 Block List 處理。

11. 刪除多於線段 (被刪除的線段在兩邊界線之間),Modify > Break out Segment > 點選欲刪除線段。

12. 切齊 (刪除多餘 或是 補充不足),Modify > Trim > 點選界線 > 點選保留部分;
      Modify > Trim Both > 界線 > 點保留部份 > 點另一界線 > 點保留部份。

13. 分割Modify > Divide > 點物件 > 點第一分離點 > 點第二分離點;
      圓弧第一分離點為頭,逆時針方向,第二點為尾。

2020年5月2日 星期六

訓練數學感 249 ─ Total 13

https://4rdp.blogspot.com/2020/05/249-total-13.html?m=0

A + B + C + D + E + F = 13,   0 ≦  A,B,C,D,E,F ≦ 9

任意正整數排列組合,相加等於 13,並且單一整數最大值為 9,如果 9 + 2 + 2 + 0 + 0 + 0 是一種組合,那麼 2 + 2 + 9 + 0 + 0 + 0 是重覆的組合,請問有多少種排列組合不重覆?如果可以重覆有多少種?