2020年6月27日 星期六

在 blogspot 顯示程式碼

http://4rdp.blogspot.com/2020/06/blogspot.html?m=0

近期開始在部落格貼出程式碼,但是排版顯示總是不盡理想,因此參考別人怎樣處理,這篇文章處理的方法最簡單,所以就選用它。
https://marcus116.blogspot.com/2018/02/blogger-blogger-show-code-using-google-code-prettify.html

程式顯示範例如下

void setup() {
  Serial.begin(57600);
  int a = 255;
  char str2[4] = "ABCD";     // ROM 1576 bytes, RAM 196 bytes
  Serial.print(str2);
  Serial.print(a);
  Serial.println("EF");
}

2020年6月23日 星期二

訓練數學感 255 ─ Uncertainty

http://4rdp.blogspot.com/2020/06/255-uncertainty.html?m=0

某精密電表在 DCV 1V 檔位測試 1V,每變動 1℃ 溫度係數  0.0010% of reading + 0.0005% of range,該電表校驗於 23℃,試問它在 28℃ 時的 Uncertainty。

2020年6月19日 星期五

ROSA 2020 系統開發 4 ─ 超音波距離偵測器

http://4rdp.blogspot.com/2020/06/rosa-2020-4.html?m=0

會開發這個程式是因為正好在重新設計 ROSA,文創造設計工作室的張宇文老師正在設計一個超音波感測讓垃圾桶蓋開閉的程式,因此就順手寫一個相同功能的程式。

主程式為 ROSA_Door.ino,Arduino pin 12, 11 分別連接超音波感測器 trig, echo,pin 9 接 servo ,並使用 USB 來幫忙除錯,所以 pin 1, 0 分別為 TX, RX,baud 115200 bps,程式碼如下:

// (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,Door "
#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 STRING_LENGTH 25
/*********************************************************** // Include ************************************************************/ #include ".\ROSA\ROSA_BASE.cpp" #include ".\ROSA\ROSA_LINK.cpp" #include ".\ROSA\ROSA_SENSOR.cpp" #include ".\ROSA\ROSA_SERVO.cpp" ROSA_LINK  link; ROSA_SONAR sonar; ROSA_SERVO servo; /*********************************************************** // Main Program ************************************************************/ void setup() {   link.USB_SETUP(115200);         // pin 1, 0  TX, RX USB, 115200 baud   sonar.SETUP(12, 11);            // pin trig, echo   servo.SETUP(9);                 // pin 9 } void loop()  {   ROSA_TIME_RUNNING();       // 系統時間處理 } /*********************************************************** // SYSTEM TIMER ************************************************************/ void ROSA_TIME_50ms() {   servo.PROCESS();           // 伺服馬達處理 } void ROSA_TIME_500ms() {   int cm = sonar.DETECT();   // 超音波偵測   link.PRINT(STRING("Distance : %d cm\n", cm)); // 印出以便偵錯      if (cm < 25) {             // 接近時開動     servo.setAngle = 180;     servo.hold = HOLDON;   } else if (cm > 100) {     // 遠離時關閉     servo.setAngle = 0;     servo.hold = 0;   } }

2020年6月15日 星期一

訓練數學感 254 ─ Cpk(Process Capability Index,製程能力指標)

http://4rdp.blogspot.com/2020/06/254-cpkprocess-capability-index.html?m=0

工廠每月生產 100 台精密儀表,測試 DCV 1V 在 1V 電壓檔位,
這檔的規格為 23 ℃ 1 Year  0.025% of reading + 0.005% of range,
將這 100 台電表在這個測試點讀取一筆資料,取總平均得 0.9999789 V,
採取移動全距每組個數 n = 2,移動全距 Rm = |Vk - Vk+1|,∑ Rm = 0.00125 V
k 樣本總數,求 Cpk = ?

2020年6月11日 星期四

ROSA 2020 系統開發 3 ─ Arduino 的 String

http://4rdp.blogspot.com/2020/06/rosa-2020-3-arduino-string.html?m=0

最近開始動手重寫 ROSA (Robot Operating System for Arduino),原本想利用 Arduino 的字串函數來處理字串,發現它的函數庫尚未優化,會佔用很多記憶體,因此留文記錄問題,並提供 ROSA 的解決方案。

正式討論 ROSA 程式之前,先從資料結構說起,話說 String 是一串字元以零值結尾,可以表示成

String str1 = "123456789"; 它也可以是字元陣列,
char str2[10] = "123456789";   或
char str3[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0};  或
char str4[10] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00};  或
char str5[10] = {49, 50, 51, 52, 53, 54, 55, 56, 57, 0}; 甚至可以是字元指標,
char* str6 = str2;   將 str6 指標指向 str2 字串的起頭。

了解上述概念後,我們寫幾個程式測試,你會更加清楚怎麼一回事。
void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  String str1 = "123456789";
  Serial.println(str1);
}

void loop() {
  // put your main code here, to run repeatedly:
}
這個程式編譯後,程式碼佔用 ROM 2642 bytes,RAM 使用 208 bytes

後面的程式僅更改 setup() 比較差異,
void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  char str2[10] = "123456789";     // ROM 1546 bytes, RAM 198 bytes
  Serial.println(str2);
}
當陣列改成 {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}、{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00}  或 {49, 50, 51, 52, 53, 54, 55, 56, 57, 0},都和 "123456789" 一樣。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  char str2[10] = "123456789";     // ROM 1546 bytes, RAM 198 bytes
  char* str6 = str2;
  Serial.println(str6);
}
使用指標也相同於陣列。
=====================================================

再來測試字串與數值混雜顯示的情形,
void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  int a = 255;
  char str2[4] = "ABCD";     // ROM 1576 bytes, RAM 196 bytes
  Serial.print(str2);
  Serial.print(a);
  Serial.println("EF");
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  int a = 255;
  Serial.println(String("ABCD")+a+"EF");     // ROM 3132 bytes, RAM 206 bytes
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  int a = 255;
  char str2[10];          // ROM 3020 bytes, RAM 196 bytes
  sprintf(str2, "ABCD%dEF", a);
  Serial.println(str2);
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  int a = 255;
  Serial.println(STRING("ABCD%dEF", a));     // ROM 1728 bytes, RAM 206 bytes
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  int a = 255;
  Serial.print(STRING("ABCD%dEF\n", a));     // ROM 1710 bytes, RAM 204 bytes
}
這個 STRING() 副程式是自己設計的,雖然無法像第一個例子 ROM size 那麼小,但是可以像 sprintf() 進行格式設定。

2020年6月7日 星期日

自由軟體 (Free Software)

http://4rdp.blogspot.com/2020/06/free-software.html?m=0

這裡做一個註記,五個不錯的 Free Software,介紹內容請詳見下列連結
https://slat-tw.blogspot.com/2018/12/5.html?fbclid=IwAR2Htwb7fXJrwTqgg6FSlZy9h_C-50ot0UxbsOWd1IyMykWvAJOQooh_0lw

1. Shotcut 跨平台的影音編輯軟體
2. XMind 心智圖軟體
3. Stellarium 虛擬星象軟體
4. Inkscape 向量繪圖軟體
5. Blender 3D 動畫設計軟體


2020年6月3日 星期三

訓練數學感 253 ─ 費氏數列 (Fibonacci numbers) 中 17 的倍數

http://4rdp.blogspot.com/2020/06/253-fibonacci-numbers-17.html?m=0

大家熟知費氏數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... , F(n-2), F(n-1), F(n), F(n+1), F(n+2), ...


F(n) = F(n-2) + F(n-1)

請找出 F(n) 從第幾項後可使

F(n) - 0, F(n+1) - 1, F(n+2) - 1, F(n+3) - 2, F(n+4) - 3, ... 為 17 的倍數。