2024年4月26日 星期五
2023年8月31日 星期四
漢聲學堂數學遊戲 - "拼"出數學力
2021年11月8日 星期一
2021年8月28日 星期六
2021年2月6日 星期六
程式人媒體公益集團
響應金門大學資訊工程學系陳鍾誠助理教授成立程式人媒體公益集團,個人提供想法如下:
21世紀是科技飛快發展的世紀,機器人產業是其中一環,若想在機器人產業鏈中發展出如台積電、大立光之類重要關鍵產業,機器手是目前大家所忽略的,試想再經過十幾二十年,機器人將隨處可見,但是它們無法像人類手指輕易拿取物件,做一些細緻的動作,那是多可惜的事。可以預想機器手是未來機器人產業非常重要的一環,目前世界各國皆已搶進機器人大肢體動作的研究,而細緻動作尚未發展完善,台灣可以搶先在這方面科技發展,當未來他國需要細緻動作機器手關鍵零組件時,就是從台灣出口。
那現在該如何發展細緻動作機器手產業,個人認為從教育著手,未來十幾二十年後的人才,就需要從現在養成。2018年個人設計了 4rdp 益智拼圖後,經過長期沉思,發現它有啟發機器手產業的功效,因為可以藉由它展現技術的成熟程度,每年定期舉辦拼圖比賽,激發學生選手研究如何精進機器手控制,而且還能發展影像辨識以判別拼圖塊及拼放位置,另外這個拼圖有幾乎數不盡的拼法,可藉由此拼圖測試人工智能的能力可否尋找解法。這些主題很適合資訊工程、機電工程與材料科學各領域人才投入,把這拼圖當作機器手啟蒙的種子。
2020年12月8日 星期二
2020年5月30日 星期六
ROSA 2020 系統開發 2 ─ 投幣計時器 (4rdp Timer)
去年因參加創客比賽,學會雷切木盒子設計,因此計時器從外觀設計到內部電路及程式設計,一手包辦,下次擺攤時,這個計時器就可以讓遊客們打賞使用。
電路的挑選就是 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年2月14日 星期五
2020年1月13日 星期一
2020 的新想法與目標
2020 總統暨立委選舉總算塵埃落定,因為年輕世代逐漸崛起,可以從選舉結果看到一些端倪,回歸部落格主題,這一兩年個人致力於 4rdp 益智拼圖的開發,在開發過程中逐步發現 4rdp 益智拼圖未來可以繼續的目標:
1.大家對彩色拼圖喜愛比較高,這部份有三個方案,一個是直接製作精美彩色紙板拼圖,另一個是雷切壓克力,最後一個是開模塑膠射出,若想普及紙板是比較經濟的,以個人能力短期內可以達成,壓克力成本高只能當暫時措施,有空會嘗試限量試做,最好的製品是塑膠射出,但是開模不是個人可以負擔,這要等紙板更流行後,自然會有合作廠商讓它上市。
2.紙板方面,如果只單純原始出版僅適合幼齡學童,但是加入一些配件把它桌遊化,是我最感興趣的事,雖然去年有推出觸觸危機,不過個人經歷這段時間試玩、學習、沉澱,發現還有改善空間,改好後再向桌遊公司推銷。
2019年11月26日 星期二
創客智造節活動感想
希望明年能和創客朋友們一起合作,我想弄機器手臂來拼圖,這個主題絕對可以有機會再次入圍,因為北分署創客比賽很喜歡機器人主題。注意到國外的機器人比賽對相關產業的影響很大,例如,搬運賽,迷宮賽都可以促進物流特定產業進步,機器人格鬥賽能促進控制器及伺服馬達等工業發展,個人覺得拼圖賽可以對精密工業發展是有幫助的,當大多數的人朝向機器人控制,關注在大肢體動作時, 我們可以朝向細部動作控制發展,組裝工業很需要這方面的部件與知識。
2019年10月29日 星期二
4rdp 益智拼圖參展 Maker Faire Taipei 2019 後的想法
![]() |
| 感謝 謝清佑先生幫忙攝影 |
4rdp 益智拼圖是 2018 年初在勞動部勞動力發展署北分署學習雷射切割機後的創作品,原先設計木質小拼圖是為了方便攜帶,希望幫忙家長減少兒童玩手機的情形,而後為了多人玩桌遊放大尺寸,再來改變材質,例如不鏽鋼的拼圖可當展示品,透明的可以製作夜燈,雖然只是簡單的元素,但是加入不同想法可以有千萬的變化。
關於金屬拼圖,嘗試過紅銅、黑鐵、鋁等各類材質,評估後不鏽鋼適合商品化,未來將它定位為展示品,將屬於拼圖系列中最高價的商品,現在仍研究量產技術問題與成本價格中。
鑒於創客基地需求各類課程,因此想到透明拼圖可以加入燈光電控做成拼圖夜燈,如果想低成本可以紅外線控制,普及的做法,可以使用手機藍牙控制,如果想要物聯網遠端控制,可以利用MQTT 來達成,希望未來有機會成為創客基地其中一個課程。
2019年10月1日 星期二
觸觸危機桌遊玩法解說影片 (Crisis on Touching)
2019年9月3日 星期二
九月活動預告
越接近年底,越來越多活動,在此公告九月活動情形,有興趣的朋友或許藉此機會相遇。
2019年8月18日 星期日
呼吸燈設計
為 4rdp 拼圖夜燈設計燈光控制,這程式包含了亮度控制、呼吸燈、變色燈三種模式,現在簡易說明如下:
顏色控制 ─ 以 RGB 三色混光,每色數值 0 ~ 255
亮度控制 ─ lit_speed = 0 時,lit_auto 決定亮度,lit_auto = 0 燈滅, lit_auto = 255 燈最亮
呼吸燈 ─ lit_auto = 0 時,lit_speed 控制呼吸速度,1 最快,9 最慢,變化範圍 0.3 ~ 2.7 秒
變色燈 ─ lit_auto = 1~7 時,lit_speed 控制變色速度,1 最快,9 最慢,變化範圍 0.3 ~ 2.7 秒
程式碼如下:
2019年8月10日 星期六
4rdp 拼圖抽籤及計時程式
# 4rdp puzzle timer
from microbit import *
from random import randint
import utime
shapes = "TIJLOSZTIJLOSZTIJLOSZTIJLOSZTIJLOSZT "
display.show("-")
while True:
if button_a.was_pressed():
display.show(" ")
sleep(100)
ln = len(shapes)
if ln == 37:
t0 = utime.ticks_ms()
elif ln == 1:
t1 = utime.ticks_ms()
break
r = randint(0,ln-2)
display.show(shapes[r])
if r == 0:
shapes = shapes[1:]
else:
shapes = shapes[0:r] + shapes[r+1:]
display.show("=")
while not button_a.was_pressed():
sleep(1)
else:
t = (t1 - t0)//1000
m = t //60
s = t % 60
if s < 10:
s = "0"+str(s)
else:
s = str(s)
display.scroll(str(m)+":"+s,loop=True)
2019年7月29日 星期一
4rdp 拼圖抽籤程式
from microbit import *
from random import randint
shapes = "TIJLOSZTIJLOSZTIJLOSZTIJLOSZTIJLOSZT "
display.show("-")
while True:
if button_a.was_pressed():
display.show(" ")
sleep(100)
ln = len(shapes)
if ln == 1:
break
r = randint(0,ln-2)
display.show(shapes[r])
if r == 0:
shapes = shapes[1:]
else:
shapes = shapes[0:r] + shapes[r+1:]
display.show("=")
2019年7月25日 星期四
觸觸危機 (Crisis on Touching ─ 4rdp 益智拼圖) 的遊戲規則
7/19 - 20 兩天,新天鵝堡桌遊在三重綜合體育館舉辦桌遊展,也邀請遊戲設計師們一同參加,在此之前我曾主動聯繫新天鵝堡,希望推薦 4rdp 益智拼圖由他們出版發行,但是告訴我,拼圖不是他們的菜,需要加入遊戲機制,因此「觸觸危機」遊戲因應產生,這在前文說明過了,本文將公開遊戲規則內容,4rdp 益智拼圖的玩家有興趣可以仿製試玩。
雖然以下遊戲說明是彩色版,手邊有木質拼圖的人可以在拼圖塊背面加貼紙著色,或是用純色玩也可以 (去除第7、9兩張卡),小拼圖塊放入拼圖盤不方便,建議圖框可以拿掉,或是另外手繪 12x12 棋盤,其它再製做 9 張卡片,準備小棋子等,小朋友自己動手做棋子是很好的工作職能訓練,下棋學策略 做棋學研發。
觸觸危機 v1.1,遊戲相關內容如下
2019年7月12日 星期五
觸觸危機 (4rdp 益智拼圖) 的設計想法
4rdp 益智拼圖很玄妙,如果你說它是桌遊,但它可以拼圖,可是從桌遊專家的角度審視,它又不具備桌遊特質,因為缺乏特殊遊戲機制讓多位玩家一起同樂,因此「觸觸危機」(暫時命名) 遊戲的產生,就是要補足 4rdp 益智拼圖欠缺遊戲機制的問題,這要感謝新天鵝堡的桌遊編輯大光給予設計方向提示:拼圖類遊戲重點就是在圖塊拼放,例如改成棋塊擺置,就失去拼圖遊戲的精髓了,而「觸觸危機」的遊戲機制,就讓我想了好幾個禮拜才成形。
接下來介紹本遊戲設計理念,關於拼圖塊,它架構在 4rdp 益智拼圖上共 36 片,但是配上五種顏色,每種顏色有 IJLOSTZ 七個拼塊,另外還有一個獨立白色 T 不使用。這樣設計的原因是讓一些朋友沒玩「觸觸危機」遊戲的時候,也可以把它當作拼圖玩,打散填滿它,一物兩用,是一個很超值的遊戲。玩桌遊最多五位玩家,每人各執一色拼塊,兩人玩時把它當四人局,每人控制兩家。
為了拼圖擺放決定勝負,加入了拼圖任務計分卡,這些拼圖任務卡充分洗牌後,每一輪翻開一張,它決定該輪 (每位玩家都有輪到一次) 拼塊擺放方式以及如何計分,另外會因為連接相同顏色、相異顏色、反拼圖塊、框邊或是沒接到拼塊而產生各種不同分數。因為有分數,所以有計分表,這裡設計成蝸牛式跑分表,從零分開始,最高 15 分,分數跑過頭又會變成低分,或是原本分數低再扣一些分數退到成十幾分,而逆轉局勢變成優勝者都有可能。這麼設計是想提升遊戲趣味性,玩家需要做些努力,才能維持在高分區,這個設計是小兒 Andy 給我的靈感。
最後一輪的拼圖擺置將是勝負決定的關鍵,也是這遊戲最引人入勝之處,
2019年7月9日 星期二
4rdp 益智拼圖 ─ 合縱連橫
4rdp 四格益智拼圖推行快一年了,雖然有最簡單的玩法 ─ 打散重組,不過這比較像是在玩拼圖而不是桌遊,因此今天正式提出一個棋盤類新玩法,本文除了列出遊戲規則外,也一邊說明設計想法,請大家多多指教。
遊戲配件:
一套 4rdp 益智拼圖 (圖框、底板 12x12、七種拼圖塊 IJLOSTZ,T有六片,其餘各五片)
每人一種顏色棋子數個
遊戲人數
|
每人棋子數量 = 36 子平均 + 爭子
|
棋子總數
|
遊戲順位調整分
|
兩 人
|
各 24 棋子 = 18 + 6
|
48
|
0, 1
|
三 人
|
各 16 棋子 = 12 + 4
|
48
|
0, 1, 2
|
四 人
|
各 12 棋子 = 9 + 3
|
48
|
0, 1, 2, 3
|
五 人
|
各 10 棋子 = 7 + 3
|
50
|
0, 1, 2, 3, 4
|
六 人
|
各 8 棋子 = 6 + 2
|
48
|
0, 1, 2, 3, 4, 5
|
七 人
|
各 7 棋子 = 5 + 2
|
49
|
0, 1, 2, 3, 4, 5, 6
|
八 人
|
各 6 棋子 = 4 + 2
|
48
|
0, 1, 2, 3, 4, 5, 6, 7
|
我方棋子佔領區塊,越多者勝。
遊戲設置:
將所有拼圖塊任意排入拼圖盤中,這就是該局的棋盤地圖,另外,每位玩家準備自己同色棋子數個。
遊戲流程:
1. 可以由最後一位排好拼圖的人擔任起始玩家,依順時針方向輪流進行,起始玩家將自己一顆棋子任意放到 12 x 12 棋格中之一。
2. 接續的玩家,受制前一位玩家擺置的棋格位置,只能在某特定範圍空位擺放自己的棋子,參見棋子擺放規則。
3. 當兩顆棋子相鄰連成一直線時,可以攻擊敵家,被攻擊的棋子就從棋盤中移除,不得再使用,細節詳見攻擊敵家規則。
4. 重複步驟 2 和 3,直到所有棋子都下完,進行分數結算。
勝負判定:
計算在棋盤上棋子數量,首先,同區塊內有多顆同顏色棋子,只保留一顆同色棋子在該區塊內,
A顏色棋子分數 = (A顏色獨佔區塊數量 x 2分) + (A顏色非獨佔區塊數量 x 1分) - (依據遊戲順位調整分),
分數高者勝,同分時比較單色獨佔多者勝,參考計分範例。
2019年7月1日 星期一
4rdp 益智拼圖的全對稱
![]() |
| 香港孫老師的對稱圖案 (差三片) |
個人觀察到林慈閔是第一位排出差三片對稱圖的人,差三片已經是這拼圖的極致了。
首先,差一片是不可能的,因為任何偶數,必是偶數+偶數,或是奇數+奇數,所以差一片不對稱就會引發另一片不對稱。
再者,差兩片的情形也是不可能,因為兩片排出的輪廓圖案需要左右對稱,這情形兩片就已經對稱了,所以不存在差兩片。
最後是全對稱,讓我們看看林益成對它的分析觀點:
#起手勢
T型有六個、其餘圖形各有五,其中“L”與反“L”、“Z”與“反Z”圖形是左右對稱,所以多出來的一個長條形與正方形必須橫放中間才能算是對稱。
#左右分配方式
以半盤進行(範圍6格*12格)
其中一個長條形與正方形需各自有一半面積(各兩格)落於此範圍中。
#長條形與正方形
可以置於6*12格中,也可以一、三、五個壓在中線上(因為各有五個,所以壓在中線上的同類形數量需為單數,對稱條件才能成立。
#T形
一邊有三個
#L或反L(Z與反Z原則相同)
自由發揮,一邊五個,正/反比例無論是0/5、1/4、2/3、3/2、4/1、5/0…無所謂,反正剩下的五片一定會跟這五片對稱。
#結論
以這樣的排列組合,也許真的無法完全對稱,個人覺得解題關鍵是“把壓在中線上落單的長條形與正方形換成任“兩個對稱的圖形”就有解了,目前已確認這兩片都換成 T 是可以達成完全對稱。













