# 109-2 電資工程入門設計與實作 工作紀錄簿 (第1組)
**備註:因固定分組,本工作紀錄簿將沿用至學期末,請固定將每週紀錄填入!**
## 成員
* 班別:週三下午班
* 組員1:杜昀蓉 B09901011 大電神
* 組員2:賴群貿 B09901186
* 組員3:陳亭瑋 B09901064
---
## 第四週作業
* 陳亭瑋:

* 賴群貿:

* 杜昀蓉:

---
## 第五週紀錄 - 組車
* 課堂應完成事項(**下課前必須找助教檢查**)
* 車子組裝完成Part 1(模組)
* 車子組裝完成Part 2(電源線)
* 車子組裝完成Part 3(訊號線)
> 給助教檢查[name=謝兆和] 全部完成
* 實際達成事項 (必填)
- [x] 車子組裝完成Part 1(模組)
- [x] 車子組裝完成Part 2(電源線)
- [x] 車子組裝完成Part 3(訊號線)
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* 分工:賴紀錄,杜、陳動手做(雖然後來都一起做了...
* 問題:見遇到問題之處理狀況、解決方法
* 構想:按照課程進行
* 時間安排:做一步算一步,三人同步進行不同part
* 組員分工 (必填)
* **陳亭瑋:**
* Part 1:
* 前板x1
* 右板
* Part 2:
* 焊接開關
* 直流、降壓模組
* Part 3:
* 指示接線
* 組裝輪子
* **杜昀蓉:**
* Part 1:
* 前板x1
* ㄇ形板
* Part 2:
* 剪線
* 焊接馬達
* 紅外線組裝
* 直流、降壓模組
* Part 3:
* 接線
* 組裝輪子
* **賴群貿:**
* **紀錄**
* Part 1:
* 左板
* Part 2:
* 組裝電源和馬達
* 焊接插頭
* RFID/Arduino
* Part 3:
* 指示接線+紀錄
* 留下來處理Arduino壞掉問題
* 測試車子行走
* 遇到問題之處理狀況、解決方式 (必填)
* **焊槍排隊排太久,等待花費太多時間:**
* 下次先看完完整過程,並做好時間規劃,將所有需要焊接的步驟同時做完,可節省時間
* **接頭焊錯邊:**
* 原線剪斷,把剩餘部份解焊
* **接線到一半發現Arduino線不夠長:**
* 用焊接的方式增加電線長度
* **固定上板、中板與中板、下板之間的設計有問題,無法固定(因為螺帽無法完美卡住):**
* 螺帽無法卡住則在旋緊螺絲時會帶動螺帽一起轉,洞口的設計也讓我們無法使用尖嘴鉗夾緊,上下板視同於沒有固定
* 將放螺帽的洞設計的更小,外板不要完全切穿而是銑出溝就好,這樣應該能比較固定住螺帽
* **Arduino無法連結到Linux mint:**
* 目前改回使用Window系統,正在搜尋如何使linux系統讀取到Arduino
* 目前解決方案:
1. 先在terminal輸入lsusb指令,會得到數列資料
2. 接上Arduino,並再輸入lsusb指令,並比較之前的資料,會發現多了一條資料,此即arduino的連接阜
3. 記得把Arduino的Board設定為正確的Arduino類型(Uno)
* 課程建議 (選填)
* 杜昀蓉:"焊槍供不應求",, "螺帽設計根本鎖不了"
* 陳亭瑋:"滾珠很爛"
* 車車的設計(已經跟助教反應了)
* 想說的話 (選填)
* 陳亭瑋:"杜昀蓉好電"
* 賴群貿:"杜昀蓉是大神"、"怎麼人都走了才發現Arduino是壞的..."
* 杜昀蓉:"閉嘴拉"、"不要**再**亂講話了"、"那個螺帽設計很爛"
* 紀錄:
* ENA = 6
* ENB = 5
* IN1 = 2
* IN2 = 1
* IN3 = 4
* IN4 = 7
* Arduino自定義(RX, TX) = (3, 8)
* 照片:
* Finish Part 2:
* 大神接線中...:
* 大神焊接中...:
* 成品:
## 第五週批閱區 - 組車
* 助教批閱欄
* 助教回饋
* 紀錄完整,有記錄下每個遇到的問題與解決方法,分工也很明確,很感謝你們提出關於車體螺帽固定的建議,或許加上墊片能夠改善問題。焊槍的部分則是真的很抱歉,未來會再採購。然後如果你們linux連接arduino有成功的話,也可以在紀錄簿分享如何連接,感謝。
> [name=鐘民憲]
* 教授批閱欄
* 評分等第
* A-
* 教授回饋
* 尚未看到完成的成品圖,記得本週上課前要可以控制車子前進、後退與轉彎。
> [name=林坤佑]
---
## 第六週紀錄 - 循跡
* 課堂應完成事項(**下課前必須找助教檢查**)
* 可不輔助、不出軌,連續繞行橢圓狀地圖2圈
> 給助教檢查[name=宋馨慈] 全部完成!
* 實際達成事項 (必填)
* 橢圓循跡 (並未使用輪子反轉就可以完成這個部分)
* https://www.youtube.com/watch?v=k62gKUAu8rk
* 凹字循跡 (有使用輪子反轉)
* https://www.youtube.com/watch?v=86oAg04jW6I
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* 繼上次紀錄:
```
int ENA = 6;
int ENB = 5;
int IN1 = 2;
int IN2 = 1;
int IN3 = 4;
int IN4 = 7;
int LL = A4;
int L = A3;
int M = A2;
int R = A1;
int RR = A0;
void setup(){
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(LL, INPUT);
pinMode(L, INPUT);
pinMode(M, INPUT);
pinMode(R, INPUT);
pinMode(RR, INPUT);
}
```
* 左右輪控制函數:
```
void MotorWriting(double vL,double vR){
analogWrite(ENA, vL);
analogWrite(ENB, vR);
}
```
* 循跡演算法討論
已知兩個紅外線感測器的距離大約是1.5cm,而軌跡黑線大約是3cm,故有可能同時有1~3個感測器影響到。
* 杜:PID的原理就是用你跟目標的差值去調整妳現在的車子行走方向,而我們的目標應該是讓中間那顆讀到就好,所以左邊有值就右轉,右邊有值就左轉(可不可以偷用Arduino內建的PID函式)(後來發現沒有不太好 他較適用在單一input 可能像Gyro之類的感測器上)
* 陳:從左到右是一個漸層的過程,所以如果同時有兩個~三個感應到黑線,相加平均。(-20,-10,0,10,20) 再決定要不要調整比重。
* 賴:可以分配不同的比重,(LL,L,M,R,RR)=(-50,-10,0,+10,+50),再乘上DigitalRead的結果後加總,依照數字大小與正負去調整給motorWriting的改變量。
老師提出問題:這樣的設計RR讀到值時會比RR+R讀到值時轉的幅度小(RR:+50, R+RR: +60)
解決方法:加上偵測現在有幾個DigitalRead的值是1(=total),再把上一步所得到的值去除以total,如此一來RR時的改變量為50,R+RR的改變量是30
```
void loop(){
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
int ll = digitalRead(LL);
int l = digitalRead(L);
int m = digitalRead(M);
int r = digitalRead(R);
int rr = digitalRead(RR);
double cal = ll * (-20) - l *10 + m + r * 10 + rr * 20;
int total = ll + l + m + r + rr;
double mul = 10;
if(total != 0)
mul /= total;
cal *= mul;
double vR = 100.0 - cal;
double vL = 110.0 + cal;
if(vL > 255.0){
vL = 255.0;
}else if(vL < 0){
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}
if(vR > 255.0){
vR = 255.0;
}else if(vR < 0){
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
MotorWriting(vL, vR);
delay(1);
}
```
* PID:
```
double old_cal;
double kd = 0.3;
double ki = 0.001;
double sum_error = 0;
void loop(){
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
int ll = digitalRead(LL);
int l = digitalRead(L);
int m = digitalRead(M);
int r = digitalRead(R);
int rr = digitalRead(RR);
double cal = ll * (-20) - l *10 + m + r * 10 + rr * 20;
int total = ll + l + m + r + rr;
double mul = 10;
if(total != 0)
mul /= total;
cal *= mul;
double d_error = cal - old_cal;
sum_error += cal;
double vR = 100.0 - cal - d_error * kd - sum_error * ki;
double vL = 110.0 + cal + d_error * kd + sum_error * ki;
if(vL > 255.0){
vL = 255.0;
}else if(vL < 0){
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}
if(vR > 255.0){
vR = 255.0;
}else if(vR < 0){
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
MotorWriting(vL, vR);
old_cal = cal;
delay(1);
}
```
* 組員分工 (必填)
* **陳亭瑋:**
* 調整更換紅外線感測器
* 測試與錄影
* **杜昀蓉:**
* 紀錄
* 解決底板鎖不緊問題
* ID code
* 程式碼測試
* **賴群貿:**
* PID code
* 程式碼測試
* 時間分配 (必填)
下課前已可只用P走完凹字路線
一個小時調整車子硬體
兩個小時測試失敗:(
兩個小時處理問題&tune參數成功(Michael好棒)
* 遇到問題之處理狀況、解決方式 (必填)
* **上傳code的時候出現error message:avrdude: stk500_recv(): programmer is not responding:**
* 解決方法:Arduino的0,1腳位是用來跟電腦溝通的,在上傳程式碼的時候不能連接,所以上傳的時候先拔掉傳完再接回去
* **其中一顆紅外線感測器的靈敏度及輸出有問題**
* 解決方法:換一顆新的紅外線感測器並通知助教把壞的收好不要遺害下一組
* **在偵測到黑色的情況下可以正常運作,但卻在全白的地面上會完全不動**
* 解決方法:發現是程式碼出問題,因為原本要做/total的運算,但在地面上的total=0,因此會出問題
* **後輪會空轉**
* 解決方法1:將被動輪改成一顆,也就是變成三輪車
* 解決方法2:在空轉的那邊馬達上加一點重量
* **在凹字形的地圖上會爆衝出去**
* 解決方法:曲率半徑太小,在求出的馬達速度小於零時必須讓車輪反轉以達到循跡的目的。還有調整PID參數
* **(上週問題)因螺帽無法固定而導致底板鎖不緊**
* 解決方法:在底板下面加一個螺帽再鎖,這樣螺絲必須鎖進側板內螺帽的長度就變小,在不用夾緊螺帽的情況下可轉緊
* **車子在接到電腦的時候程式可以運作,但線拔掉後就會走走停停**
* 解決嘗試:
一開始走走停停猜測是接觸不良所以把所有線重新拉好,但問題仍在;又猜測是電池供電不穩所以去充電,但充飽後問題仍在
把各個線用三用電表測試各塊板子的電壓狀況,發現疑似是擴充板的問題,打算利用openlab去換板子
* 解決方法:我們後來多開關跟reset幾次,還有調整擴充板上的兩個給電的螺絲以後他就好了:P目前還無法確認到底是哪裡有問題
* (網路上有人提出相似的問題...而且程式不動的時候擴充板上的LED燈會閃,但還未找到100%的解決方法...)
* 課程建議 (選填)
* 可以多講一點I跟D詳細的數學原理!
* 問題
* 繞圈循跡的時候是否不太適合使用I?
因為像"陀螺儀轉0度"的這個目標,離目標的error會越變越小最後趨近0,這樣積分error值是合理的
但現在循跡的時候,雖然目標都是沿著黑線走,但實際上在每個轉彎對PID來說都是一個新的目標,這樣繞圈全部加總error不會越來越小反而會一直累加,(就像把不同目標的error加在一起的感覺 嗎)
* 想說的話 (選填)
* 陳亭瑋:"上板好沒用" "花好多時間調整參數" "杜昀蓉好強"
* 賴群貿:"Alice Du好強","欸不是,想說的話是來亂的喔"
* 杜昀蓉:"換隊友啦!!" "好啊 就換阿" "以後不把車車帶回家了,他會腦震盪:("
## 第六週批閱區 - 循跡
* 助教批閱欄
* 助教回饋
* 分工清楚,橢圓和凹型地圖循跡都順利完成,且大部分遇到的問題都能夠自己解決。第一次看到能夠上完課就想到PID control的組別,循跡也不會嚴重擺頭,效果很棒。拔掉後會走走停停應該是硬體接觸不良的問題,或許可以換Arduino或擴充版試試。頂板純粹就是美觀&未來擴充用XD(如加配重、加其他模組等) 另外要記得在工作記錄簿寫上組名喔,謝謝。
> [name=宋馨慈]
* 教授批閱欄
* 評分等第
A
* 教授回饋
兩支影片中車車都走得很順,士元老師教完可以這麼快上手,很棒! 不要換隊友啦,只要不要當豬隊友,能夠當隊友是有緣好好珍惜。 XD
期待你們指定題的表現。指定題不再是只有一條黑線,會遇到底線、轉折的方塊,要怎麼在這些路上轉彎、迴轉,都考驗你們的設計喔,加油! :D
> [name=君朋]
## 第八週紀錄 - 指定題介紹
* 課堂應完成事項(**下課前必須找助教檢查**)
* 問題0回答、答案訂正
* 6V X 180ma = 1.08W
電壓 * 電流 = 功率
* 問題1回答、答案訂正
* (1) (200 + 33 + 75 X 5 + 86) / 1000 + 1.08 X 2 = 2.854W
* (2) 2.854 / 11.1 = 0.257A
* (3) 2250 / 257 = 8.75hr
* 問題2回答、答案訂正
* (1) 150 * 8 * 2 = 2400 bytes
認為index不用被儲存,因此只有8列(東西南北的node是誰以及距離多少)
=> the correct answer => 150 * 9 * 2 = 2700 bytes
* (2) 300 + 300 + 300 = 900 bytes
1. queue會在讀每個node的時候去存與它連接的其他未走過的node => 最多150 nodes => 150 * 2
2. pi_function存每個node的前面一顆是誰 => 150 * 2
3. path是一個list儲存要回傳的完整路徑 => 150 * 2
* The correct answer => 沒有算path list, 但多了mark表示走過
* 我們的想法:可用pi_function是否有值表示有沒有走過,不需要多一個mark
* (3) (2400 + 900) < 2048 = false, The answer is no!
* 問題3回答、答案訂正
* (1) (1 + 8 + 6 X 2) / 0.1 = 210 bps
1. 通知看到轉彎塊使用一個boolean => 1 byte
2. 8個char => 8 bytes
3. 後續指令:控制馬達轉動 一個馬達需要6個參數控制 => 6 * 2 = 12 bytes
* The correct answer => (1 + 4 + 1) /0.1 = 60 bps
1. 傳回看到轉彎塊 => 1 byte
2. 8個16進位的數字(一個16進位4 bits = 0.5 byte) => 4 bytes
3. 下載指令 => 1 byte
* (2) 60 < (9600 / 8) = true, The answer is yes!
* 完成甘特圖
* 項目:Arduino程式、Python程式、車車硬體、參數、報告、紀錄簿
* 完成系統方塊圖
> 給助教檢查[name=謝兆和] 全部完成
* 實際達成事項 (必填)
* 回答上課問題
* 甘特圖:https://app.gantt.io/embedded-gantts/a34d0167-4894-4b76-9816-7f9465133b19

* 工作流程圖
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* 上課問題(討論內容見上方回答)
* 分工
* 賴群貿:軟體
* 杜昀蓉:硬體
* 陳亭瑋:什麼都會!
* 組員分工 (必填)
* **杜昀蓉:**
* 甘特圖
* 討論上課問題
* 測試藍芽模組
* 紀錄
* **賴群貿:**
* 測試藍芽模組
* 討論上課問題
* 紀錄
* **陳亭瑋:**
* 工作流程圖
* 討論上課問題
* 測試藍芽模組
* 遇到問題之處理狀況、解決方式 (必填)
* **藍芽模組無法傳回Arduino**
因為腳位不夠所以勢必有感測器必須接到Arduino自己的傳輸腳位(1),我們之前將藍牙模組的Tx、也就是Arduino的接收腳位設在(1)結果數值無法從python傳回Arduino,後來嘗試把連結馬達控制器的線改連到(1),就成功了:)馬達也運作正常,推測是該腳位不能有"接收"方向的傳輸,只能傳出去。
* **紀錄:(linux mint connect bluetooth)**
* [link](http://www.userk.co.uk/arduino-bluetooth-linux/)
```
$ sudo rfcomm bind 0 98:D3:31:F6:2C:AE 1
```
* 課程建議 (選填)
* 腳位不夠用,每次上傳都要拔掉稍微麻煩
* 想說的話 (選填)
* 杜昀蓉:餅乾大富翁4我啦、洋芋片直接變晚餐 好棒
* 賴群貿:
* 陳亭瑋:餅乾好吃 我只是打雜ㄉ啦
* 進度:
* 完成軟體部分:(尚未測試)
* https://github.com/Mecoli1219/PUIPUI_assigned_project_groupOne
## 第八週批閱區 - 指定題介紹
* 助教批閱欄
* 助教回饋
* 課堂問題討論紀錄很詳細,甘特圖、系統方塊圖、分工表都很清楚,如果能照著甘特圖上的進度走,期末絕對不會爆肝XD
* 助教發現你們期中考週循跡code還有進度,覺得超感動~~
* 關於藍芽模組無法傳回的問題,只要 code 中沒有 serial.begin(),0,1號腳位就是可以用的,但你們的解決方法也很好:)
> [name=謝兆和]
* 教授批閱欄
* 評分等第
* A
* 教授回饋
*
> [name=林坤佑]
## 第十週紀錄 - 指定題進度報告
* 預計完成事項 (必填)
更新後甘特圖:https://app.gantt.io/embedded-gantts/a34d0167-4894-4b76-9816-7f9465133b19
- [x] 完成進度簡報
- [x] 上台報告
- [x] 寫好程式架構圖
- [x] 寫好BFS演算法
- [x] 寫好RFID程式
- [x] 寫好check point程式
- [x] 測試E字形地圖
- [x] 測試check point地圖
- [x] 測試RFID程式
* 實際達成事項 (必填)
* 更換Arduino板
* 換馬達、L298N
* 重焊電源線與電池線
* 測試完成E字形地圖
https://youtu.be/brHbXvC0S_0
https://youtu.be/-kCrONK28dM
* 測試完成中地圖
https://youtu.be/GfOBScmMBJs
* 測試完成ckeck point地圖
https://youtu.be/hQgQuveMmZw
* 修正BFS演算法
* 完成所有code
更新完的code:https://github.com/Mecoli1219/PUIPUI_assigned_project_groupOne
* 畫好程式架構圖






* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* 終於開messenger群組了..
* 為什麼會左轉直走迴轉但不會右轉...
* 組員分工 (必填)
* **杜昀蓉**
* 完成簡報
* 紀錄
* 換開發板與擴充板
* 解決開發板連不到的問題!(我好棒!)
* 完成程式架構圖
* 換馬達、換L298N
* 重焊電源線與電池線
* check point code
* **陳亭瑋**
* 上台報告
* 製作下周簡報
* 紀錄
* 換開發板與擴充板
* 換馬達
* RFID code
* **賴群貿**
* 處理程式碼bug
* 完成大部分code
* 向組員解釋已完成之程式碼
* 發現馬達不能右轉
* 測試調參數
* RFID code
* 修正BFS演算法
* 遇到問題之處理狀況、解決方式 (必填)
* **更換完Arduino板後,連序列埠都無法連上,推測是板子不同。**
解決方法:先到本機的裝置管理員看Arduino對電腦而言是哪種裝置
發現是FT232 Usb UART,於是就上網查該連接方法的驅動程式
下載網址:https://www.dell.com/support/home/zh-tw/drivers/driversdetails?driverid=pf73w
安裝好再更新該裝置的驅動程式以後就可以連到了
* **轉彎只用時間控制較不精準**
解決方法:轉彎先用計時,再以低速配上紅外線感測器偵測讓他找到路徑,最後再讓他循跡回到線中間
```
void do_TURN_RIGHT()
{
analogWrite(MotorL_PWML, 255);
analogWrite(MotorR_PWMR, 150);
digitalWrite(MotorL_I1, LOW);
digitalWrite(MotorL_I2, HIGH);
digitalWrite(MotorR_I3, HIGH);
digitalWrite(MotorR_I4, LOW);
delay(800);
analogWrite(MotorL_PWML, 100);
analogWrite(MotorR_PWMR, 100);
while(digitalRead(M) != 1);
digitalWrite(MotorL_PWML, LOW);
digitalWrite(MotorR_PWMR, LOW);
do_ADVANCE();
}
* **修正方向時可能會重複進出node導致判斷錯誤**
解決方法:為了把轉彎後的循跡判斷都放進轉彎的function裡,我們修正了do_ADVANCE,裡面會讓他循跡修正20次,再多設了一個會在走道全白區域時回傳false的tracking_advance,讓他如果偏掉倒退回去之後又會重新開始修正。都包在裡面之後不管再多次進出對他而言都還是in_node狀態,因此不會再去重複偵測與計算是否in_node。
* **電源線跟電池線斷了**
解決方法:重新焊接(電源線很容易掉,要在金屬上先上錫再焊會比較穩固)
* **發現車子無法右轉**
解決嘗試:更換馬達
解決嘗試:灌回之前的純粹直走與PID程式,可以正常循跡與運作,但在我們自己的程式跑就不行;甚至我們的車子可以直走循跡跟左轉,卻不會右轉
解決嘗試:更換L298N模組,
解決嘗試:調高電壓(10V)
**暫時的解決方法:讓他左轉三次,精確調整時間參數**
* **陳的電腦連main.py都無法正確執行,會產生AttributeError: module 'serial' has no attribute 'Serial'**
解決方法:在Windows power shell先輸入pip uninstall pyserial 再pip install pyserial,並update pip的版本就可以了,推估是版本過舊。
* **跑Arduino code顯示.h file no such file or directory**
解決方法:https://www.youtube.com/watch?v=igdBT0hwsJc
* **寫法一:RFID code 會重複感應到;寫法二:只有在U Turn完感應,但就傳不過來了**
解決方法:sleep真的要懂,後來採用第二個寫法,當sleep給的時間太短的時候傳過來的UID會被截斷(而且還是從前面截斷,超奇怪),後來寫成在U Turn後才允許去掃描是否有卡片的存在(畢竟場地規定卡片都在死巷處,一定要迴轉),用node和node之間直走的移動時間來換取sleep時間拉長,這樣就可以成功回傳UID了,並新增測試用的卡片UID進UID.csv,也成功獲得分數。
* 課程建議 (選填)
* 如果可以有一份"sample code的說明書.pdf"就好了哈哈哈
* 馬達存貨不足
* 想說的話 (選填)
* 杜昀蓉:這根本超乎常理...
* 賴群貿:幹你右轉
* 陳亭瑋:我肚子好餓 好想睡 我是誰 我在哪裡
## 第十週批閱區 - 指定題進度報告
* 助教批閱欄
* 助教回饋
* 你們的進度看起來非常不錯耶,checkpoint地圖已經能順利跑完了,而且程式的流程圖、遇到哪些bug及解決方法也都寫得非常詳盡且清楚,不過目前看起來尚待解決的是右轉問題,我猜測可能是L298N的pin腳接到錯誤的arduino腳位了,但就算不能右轉你們能想到用三次左轉取代也真的很天才~ 至於sample code的說明書嘛...其實寫得太詳盡就有點太過限制你們的思維了不是嗎XD,而且這樣也可以訓練你們閱讀別人的code,這樣已經算少的了,未來你們在電機系會看到更多更多的code...。總之,期待你們在checkpoint當天的表現 : )
> [name=鐘民憲]
* 教授批閱欄
* 評分等第
A
* 教授回饋
今天表現的不錯阿,即使出問題還好有影片做證,證明工作記錄是很重要的。 XD 另外程式流程規劃的不錯,這樣更可以知道到程式發生什麼事。之後指定題、自選題都希望有好的表現喔。
> [name=陳君朋]
## 第十一週紀錄 - 指定題進度檢視
- CHECKPOINTS
- 車車
- [x] 循跡
- [x] 可以偵測到 node(包含十字路口和死巷)
- [x] 偵測到 node 之後,穩定直走、轉彎、迴轉(寫死指令)
- [x] 可以接收來自電腦的藍芽指令
- python
- [x] 完成基本的 BFS
- [x] 完成第一題的設計
- [x] 可以透過藍芽傳輸指令
- combined
- [x] 可以讀取 RFID 的值
- [x] 能走完 3 個點
- [x] 可以不輔助的情況下,完成小型 E 字地圖
- [ ] 可以不輔助的情況下,完成進階地圖
- [x] 可以正確在死巷讀取 RFID
> 給助教檢查[name=助教姓名]
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* 更新完的code:https://github.com/Mecoli1219/PUIPUI_assigned_project_groupOne
* 調完參數的測試影片:https://youtu.be/lmfuGKgR3Zg
一開始卡了一下是因為紙不平,在U Turn後的停止是故意讓他來讀UID
* 分工:一起測試與解決問題
* 時間安排:週日早上調整參數,在那之前修好code!
* 隊名:否決Michael的中二名稱,決定用我們從湊在一起開始就一直在喊的口號,"換隊員啦!!"
* 簡報、甘特圖、流程圖更新:我們進度穩定,都在測試調整階段
* Sleep()函式的功能:python是單線程的,在每個時刻都只有一段code可以執行,所以如果沒有sleep,UID讀到一半就會被截斷,但sleep太久又會影響程式運行,因此要調整到剛好的sleep時間長度。
* 增加後退的command:因應check point的地圖,倒退前都是先左轉、直走再後退,後退時邊判斷是否到node,到達後開始讀取RFID。
* 修改的code:
* 為了要讓車子不重複進出node因此把一小段循跡包在轉彎的函式中,但仍發生一樣的問題,因此將循跡的時間再增加
* RFID放到U Turn裡面,到node後給他數到50的時間內(while迴圈)讀RFID,由於RFID的函式是pass by reference,他讀到之後id size會瞬間變化,在從0到有值的時候傳送UID給python,這樣可以解決如果只寫當a!=0時傳送導致的重複傳送問題
* BFS演算法~~修正~~重寫:因為大地圖的node太多時間太少,擔心會走不完,所以演算法的目標改成走完所有死巷塊。在__init__時就先getUTurnList(),回傳所有死巷塊node的編號;接著執行complete_target_list(),根據getUTurnList()去對所有UID_node的排列組合呼叫BFS_rec()(這是找兩個UID_node之間最短距離與路徑),生成一個dict{key:node, value:dict{key:上一層外的所有nodes, value:tuple(distance, route)}};最後呼叫shortest_path(),尋找所有uid node連成的最短路徑,中間再加回其他node把他們連成路線
* 組員分工 (必填)
* 杜昀蓉
* 解決不會右轉的問題
* 測試
* 重新調整參數
* 紀錄
* 賴群貿
* 完成倒車code
* 修改BFS演算法
* 測試
* 重新調整參數
* 解決不會倒車的問題
* 陳亭瑋
* 測試
* 重新調整參數
* 遇到問題之處理狀況、解決方式 (必填)
* **上個禮拜延續之問題:車子無法右轉,因為左輪無法正常前進**
* 新的解決方法:再認真看一次程式碼發現左輪剛好接在Arduino的一號pin,而之前藍牙接在該腳位時就曾經出過問題,因此推測是該腳位造成左輪無法正常運動。(所以其他code很正常是因為沒有Serial.begin()!現在想起來超合理XD)
於是我們將程式碼中的Serial.begin()刪掉,但如此一來之前以左輪力道很弱此前提為基礎調整的參數必須全部重來,擔心來不及解決因此想在checkpoint前先改回原本不能右轉而以左轉三次取代的程式碼。
* **改回原本的程式碼以後右輪無法正常運作**
* 推測過幾個原因,一是輪胎裡面會空轉,輪子無法帶動外面那層輪胎一起轉,於是換了輪胎,並將輪胎不完全貼齊內部軸,有稍微改善狀況;二是馬達內部可能因為之前幾乎是單靠右輪驅動所以過度耗損齒輪箱,現在可能到了他能承受的臨界點(?;三是Serial.begin()如果跟別的訊號衝撞會影響整體的程式運作。到現在都還無法完全確認確切原因。
* 解決方法:checkpoint前突然發生這個問題害我們以為差點要0分了嗚嗚,最後果斷決定把Serial.begin()再次刪掉,然後在15分鐘內全部重新調整參數上場。(真的是極限操作 好可怕)
* 需調整之參數:轉彎需要的秒數,轉彎後離開node需循跡回到正軌的次數,pid,馬達速度修正係數(兩邊力量不同,要使車子行走時兩輪給值的比例)
* **checkpoint在跑倒車入庫的程式時無法走完全程**
* checkpoint開始時先跑沒有倒車之版本,在約兩分鐘內順利走完,雖然因為參數是臨時調的因此循跡變得較不穩定,這個部分待周末測試修正。
當改成有倒車入庫時的版本,我們的倒車部分順利完成,但走到後面的node時循跡卻會出現問題,發生可能在同一個node in node多次,或是直接停下導致無法完成的問題。但後面code的寫法與沒有倒車的版本相同,可能真的是因為車子不夠穩定,能否走完多少是運氣問題XD會把參數調正過後再次測試。
* **中地圖測試失敗**
* 初步推測是循跡問題,星期天會調整完循跡後再判斷
* 發現是在轉彎完以低速調整方向(循跡)的時候,給馬達的數值太低導致他跑不動
* 測試失敗影片:https://youtu.be/irIPWc7Wtjo
* **車子出軌不會倒退**
* 解決方法:發現是在tracking時判斷是否出軌的時候,只叫他後退但沒有return,所以他會在跑了一下下到退後繼續執行下面的程式碼。加了之後他就會不斷判斷該if else,直到他有任何一個讀到黑線才會跳出if else繼續執行其他code。
* 想說的話 (選填)
* 杜昀蓉:先感謝助教讓我們延後check point時間讓我們來得及調好他
這次學到其實每件事都是有原因的只是我笨到沒有發現:P
* 賴群貿:hackmd原來是聊天軟體
* 陳亭瑋:這劇情我好像在哪裡看過
## 第十一週批閱區 - 指定題進度檢視
* 助教批閱欄
* 助教回饋
* 進度、分工、甘特圖狀況都很不錯
* 你們臨時車子出狀況還能在短時間內就修好bug,真的很棒。第二次遇到Serial.begin()的問題,以後真的要小心不要再被他害慘了XD 恭喜你們 checkpoint通過~
* 你們演算法的想法很好,期待競賽當天的表現。如果在指定題當天遇到先從最遠開始走的組別也可以來比較看看哪一種寫法比較快。
* 組員很棒不要換組員啦XD
> [name=宋馨慈]
* 教授批閱欄
* 評分等第
* A
* 教授回饋
* 雖然車子臨時出狀況。不過能夠及時處理好車子的bug,順利完成check point的關卡,表現非常好。
> [name=林坤佑]
## 第十二週紀錄 - 指定題競賽
* 預計完成事項 (必填)
* 預期表現:
- [ ] 跑完整張地圖
- [X] 拿前三名!
- [ ] 不要出太多事:P
* 討論自選題題目
* 實際達成事項 (必填)
* 測試check point失敗(我沒有改do_BACK(),所以跑不了qq)
* 指定題競賽1230分
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* 參數是否要重新調整(因為教室地板跟男一舍參數不一樣)
決定先跑一次,如果不順利十分鐘現場調
* 在比賽的10分鐘內要做什麼調整或直接跑
* 是否更改arduino中read_uid與U_TURN順序
* 組員分工 (必填)
* 一起測試能否跑指定題地圖
* 遇到問題之處理狀況、解決方式 (必填)
* check point失敗
* 原本設定是在U Turn之後走一段讓他讀UID,但因為參數設定與時間問題讓他經過了那個點卻沒有讀到UID,在五分鐘內來不及修正完因此checkpoint依然只拿到100分。
* 解決方法:改成在讀到死巷塊停止之後,直接先讀UID(此時RFID的位置會剛好對到卡片),之後再做U Turn,修正後再繼續前進,在指定題比賽前及時解決問題。
* 藍芽連線時間稍長
* 推測是因為教室裡有太多台藍芽導致連線有問題
* 解決方法:趴在地上離車車近一點再連
* 無法跑完整張地圖
* 為了確保車子的行進穩定,不要太容易超出node或出軌,我們不敢讓馬達平常跑太快;在死巷塊前為了要確保他有讀到UID再走我們也讓他停了2秒,因此即使我們一切順暢也無法走完整張地圖
* 解決方法:C'est la vie,盡可能拿到夠高分就好了:P 或者可以多測測看車子能接受的極限是什麼讓他可以發揮到最好
* 想說的話 (選填)
* 陳亭瑋:"車車課沒了,那還要提案自選題嗎?"
* 杜昀蓉:"上場第一次就成功真的是奇蹟 Michael好棒"
* 賴群貿:"竟然成功了,我傻眼", "第二名獎品好棒"
## 第十二週批閱區 - 指定題競賽
* 助教批閱欄
* 助教回饋
* 自選題還是要做喔,而且每個禮拜還是有線上meeting。如果組員沒辦法約,可以選擇偏軟體類的題目。課堂上可以跟大家討論。
* 組員分工可以再寫詳細一點。
> [name=謝兆和]
* 教授批閱欄
* 評分等第
B+
* 教授回饋
要提案自選題阿, 車車課不是只有車車, 還有很多重要的事情喔。另外現在疫情變嚴重,儘量用線上聯繫,減少面對面的接觸呦。
我也覺得拿第二名很棒。 :D
> [name=陳君朋]
## 第十三週紀錄 - 自選題介紹
* 預計完成事項 (必填)
- [X] 討論自選題題目
- [x] 完成自選題進度規劃
- [X] 完成自選題提案簡報
* 實際達成事項 (必填)
* 自選題題目:
* **自動化倉儲**
* 撞球車
* 足球車
* 雜耍車
* 撿垃圾車
* 爬樓梯車
ref: https://youtu.be/hpQFXrgkbLo
* 自選題進度規劃:

* 自選題
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
| 題目 | 目標 | 軟體需求 | 硬體需求 | 難度評估(1-10) |
| -------- | -------- | -------- |-----|---|
| 撞球車 | 辨識球、照順序打入洞| 影像辨識顏色、測距、控球| 持球機構 |9
| 足球車 | 找到球、瞄準、射門| 影像辨識球與球門、測距、控球| 持球機構| 7
| 拋接球車 | 射出球、追蹤球、移動| 影像辨識球、精準的移動車| 接球機構 | 10
| 撿垃圾車 | 辨識垃圾、收垃圾| 影像辨識、避障| 收垃圾機構 | 8
| 爬樓梯車 | 爬樓梯 | 馬達控制 | 車輪設計或抬升機構 | 9
* 結論:撞球車的生活應用--**自動化倉儲**
* 目標:以不同顏色的球代表不同貨物,分別要送到對應顏色的倉庫,車子必須辨識出目前球的顏色,控制前方像鍬形蟲角的機構抱住球,並控制車子移動帶著球移動前往對應顏色的倉庫(門)。
* 動機:近年來Amazon等大型物流公司都推行倉庫無人化,使用機器人來進行貨物的搬運與歸類,節省人力成本也可以解決壓榨工人的問題。於是我們想藉由用現有的車車去設計出一個簡單的分類運送貨物機器,由娛樂性的撞球延伸到貨物運送,盼能從日常生活中為看似複雜的專業問題尋找解方。
* 撞球車理念修改:把撞球的"撞"球改成帶球,考量對貨物而言需要較大的穩定性,丟出去任意滾則無法控制。保留辨識顏色與使球進洞的樂趣,說不定設計完成之後還是可以拿來打撞球:P
* 軟體需求(RPI):OpenCV顏色辨識、距離感測(?(若無則用超音波感測器)
* 控制需求(Arduino):藍芽(連結rpi與arduino);陀螺儀(尋找目標時會用到?)
* 硬體需求:上板修改;sensors與rpi的家;抱住球的手臂(一個馬達控制開合)
* 未來分工
* 賴群貿:軟體(**南部**遠端**高級**軟體工程師)(不廉價 絕對不廉價)
* 陳亭瑋:控制與測試(還在男一的車車擁有者)
* 卡卡西:硬體(能自由進出mks的Mr.3)(可以駭進雷切室的Hacker杜昀蓉)
* 組員分工 (必填)
* 杜昀蓉
* 自選題提案簡報
* 自選題討論
* 完成甘特圖
* 紀錄
* 賴群貿
* 自選題討論
* 指定題檢討報告
* 陳亭瑋
* 指定題檢討簡報
* 自選題討論
* 指定題檢討報告
* 自選題提案報告
* 遇到問題之處理狀況、解決方式 (必填)
* 待填
* 課程建議 (選填)
* 遠距的車車課真的很難做事...而且會變成持有車車的人必須負責最多的測試debug工作,雖然是真的很想做自選題的作品但真的好難分工合作...
* 想說的話 (選填)
* 杜昀蓉:"遠距上課好好玩" "陳亭瑋上課吃泡麵害我好餓"
* 賴群貿:"但好麻煩" "欸不用" "我知道了" "嗎" "欸" "哭" "難" "額" "麻煩" "我好冗"
* 陳亭瑋:"其他兩人開會都有偷偷睡著喔 抓"
## 第十三週批閱區 - 自選題介紹
* 助教批閱欄
* 助教回饋
* 遠距的確會使分工非常困難,不過你們想到的自選題題目看起來都蠻有趣的,而且也都有評估各個題目的難易度,相當不錯,建議你們可以考量時間與loading選擇合適的題目做,此外,選題動機與想解決的問題也需要好好思考,老師還蠻重視這方面的,期待你們下禮拜之前能把題目決定好並開工。
> [name=鐘民憲]
* 教授批閱欄
* 評分等第
A
* 教授回饋
其實我上週發現,視訊比平常上課還要累很多。可能是因為螢幕很小,要高度注意力....
但現在台北疫情這麼嚴重,大家還是遠端上課討論就好。沒有硬體的同學,看是否可成為主要撰寫程式的同學,有硬體的幫忙測試就花很多時間了,各位還有其他課程要準備,不要讓其他課爆囉。
> [name=陳君朋]
## 第十四週紀錄 - 自選題proposal報告
* 預計完成事項 (必填)
* [X] 簡報、上台報告
* [X] 設計草圖
* [X] 購買器材
* [X] 設定RPI,完成RPI遠端連線
* [X] 填好器材寄送清單
* 實際達成事項 (必填)
* 工作流程圖:https://youtu.be/Og-OB8m71XA

* RPI設定:
tutorial: https://www.learnrobotics.org/blog/start-raspberry-pi
設備:螢幕、滑鼠、鍵盤、SD卡、風扇、行動充
* RPI遠端連線:https://youtu.be/3q_cz_TmSyw
這樣Michael就可以從台南控制在我家的Raspberry Pi, VNC真酷
* 設計草圖
* 查詢opencv資料:
* 基礎: https://www.bilibili.com/video/BV1Fo4y1d7JL?p=53&t=28
* 在RPI裝OpenCV套件
* tutorial: https://towardsdatascience.com/installing-opencv-3-4-3-on-raspberry-pi-3-model-b-e9af08a9f1d9
* 目前花費時間:3小時 and ongoing
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* 是否將推球改成推箱子?
* 原本是想說推箱子的機器人已經很常見,加上想保留原本撞球的理念以及樂趣才選擇推球的。但決定按照教授的建議先從箱子開始嘗試,如果嘗試順利再挑戰其他形狀。
* 車子機構設計構想
* 夾取機構之設計:
ref 1:https://blog.cavedu.com/2015/04/20/mearm%E7%B5%84%E8%A3%9D%E8%AA%AA%E6%98%8E-%E5%A4%BE%E7%88%AA%E7%B5%84%E8%A3%9D/
ref 2:https://www.youtube.com/watch?v=Y3WKSY7juSI
ref 3:https://www.blibli.com/p/1pc-3d-printing-robotic-arm-micro-servo-motor-9g-rc-mechanical-clamp/pc--MTA-8046696
一開始想採用第二個的設計,~~(因為有現成的CAD模型)~~,但後來考量蝸輪較難買且要對準較難,且我未使用過,因此決定改成像一或三的設計。
最後選擇三而非一是因為第一個他是藉由馬達軸帶動擺臂再去帶動手臂,讓手臂轉再帶動齒輪跟旁邊的齒輪轉,動力傳動較複雜,且我們使用的伺服馬達本身力道較小,太多層的動力傳動可能會造成不必要的消耗。
第三個的設計簡單明瞭,其中一片齒輪放在馬達軸上,轉動的時候直接帶動另一片齒輪。唯一可能缺點是這樣相較第二個設計兩邊的受力感覺比較不平均,但我們只要求爪子張開沒有要求完美對稱所以應該還好(?
最後購買之爪子:https://www.ruten.com.tw/item/show?22103789247599
* 電子元件之選擇:
* KIS 3R33S:是Raspberry Pi常用的降壓模組,因為他的輸出端是USB接頭,可以直接接micro usb的線供電給RPI
* 18650鋰離子電池:大小重量差不多符合(?但還需要充電器
* RPI 3B+:需要影像處理怕用原本的Arduino會跑不動,因此另外加裝一個高級的處理器:P
* Tower Pro S490 Servo Motor:伺服馬達可以控制轉動角度,適用於我們要轉一定角度齒輪的設計
* PI Camera:專門搭配RPI的相機
* 超音波感測器 HC-SR04:makeNTU完我覺得他其實比我想像的好用:)
* 不能雷切的備案:
爪子直接上網買現成機構,需要固定的部分可能直接用快乾膠,要加高的部分就黏很多層厚紙板再黏上去(?
* 車子運送:
陳亭瑋先把上板用7-11店到店寄給我,等我把上面的機構組裝完成後再寄回去給他做之後的測試。
* 採購清單:
* 跟助教拿的:
* 18650電池 *3
* 串聯電池盒(18650,無開關) *1
* 自己買的:
| 品項 | 價格 | 數量 | 賣家 |
| -------- | -------- | -------- | -----|
| KIS 3R33S 降壓模組 | 120 | 1 |露天-taiwaniot|
| Tower Pro S490 Servo Motor | 60 | 1 | 露天-taiwaniot|
| 樹莓派風扇 | 60 | 1 | 露天-taiwaniot|
| 攝影鏡頭透明壓克力支架 | 80 | 1 | 露天-taiwaniot|
| 鋰離子電池充電器 | 100 | 1 | 露天-taiwaniot|
| 超音波感測器 | 65 | 1 | 露天-taiwaniot|
| 機械爪子 | 170 | 1 | 蝦皮-宇倉電子 |
| 店對店寄上板給組員| 60 | 1 |7-11 |
| 總計 | 655 + 120(運費) + 60
* 組員分工 (必填)
* 杜昀蓉
* 紀錄
* 報告
* 設計草圖
* 設定RPI
* 灌OpenCV套件
* 賴群貿
* 設定RPI
* 查openCV使用教學
* 灌OpenCV套件
* 陳亭瑋
* 報告
* 做簡報
* 遇到問題之處理狀況、解決方式 (必填)
* RPI需跟Arduino連線因此必須在台北,但負責寫Rpi code的人在台南
* 解決方法1:SSH
問題:必須連到同一個網路才能控制RPI,不符合我們需求


* 解決方法2:VPN
問題:好麻煩喔,所以後來沒有嘗試
tutorial:https://www.experte.com/vpn/raspberry-pi
* 解決方法3:VNC
tutorial: https://lifehacker.com/how-to-control-a-raspberry-pi-remotely-from-anywhere-in-1792892937
沒有問題!成功完成遠端連線!


* RPI用5V2A的行動電源充被警告low voltage
* 解決方法:去買鋰離子電池兩個配降壓器
* 有想過跟Arduino共用電源,即在原本降壓器之後再拉一條出來再降壓,但不知道這樣一顆電池供這麼多元件,尤其RPI會需要影像處理部分;而且還有原本車子設計的配重問題,因此決定還是買兩顆18650
* RPI 字太大
* 改解析度即可
* RPI的terminal上下載opencv-contrib-python 到99%時會自動停止 (killed)

* 解決方法(換個方法):改先下載.zip檔後在terminal跑make讓它安裝,但所需耗費時間較長(就算4個core一起跑也至少兩個小時...)
* RPI在opencv-4.5.2的資料夾裡跑make的時候出現"cmake error 'the source does not appear to contain CMakeLists.txt'"
```
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.3/modules \
-D BUILD_EXAMPLES=ON ..
```
* 解決方法:command . . 之後會讓他回去兩層,確定他回去的那層會在opencv-4.5.2的資料夾裡,裡面才有CMakeLists.txt
* RPI在opencv-4.5.2的資料夾裡跑make的時候出現"FATAL: In-source builds are not allowed. You should create separate directory for build files."
* 解決方法:跑過任何一次(不管是否成功)都會讓資料夾裡面出現CMakeCache.txt,但如果已經出現該檔案會影響下一次的run,所以要把它刪掉,刪完後就好了
* RPI在跑make的時候容易當掉
* 解決方法:給他很多電風扇!
* 解決方法:原本為了要快想用make -j4,即讓4個核心同時運作,但他一直當機害我得拔掉電源重來(這樣有夠傷RPI...),所以只好忍痛讓他只有一個核心,但現在慢到我有點受不了了OAO
* 課程建議 (選填)
* 待填
* 想說的話 (選填)
* 杜昀蓉:"Michael從軟體工程師變成駭客了" "架RPI根本就是在自己兜一台電腦..."
* 賴群貿:"腦袋在晃動"
* 陳亭瑋:"我覺得這堂課越來越荒謬了"
## 第十四週批閱區 - 自選題proposal報告
* 助教批閱欄
* 助教回饋
* RPI安裝opencv時竟然遇到那麼多問題....,幸好你們最後都解決了,很棒!!(但運算速度太慢可能是RPI的RAM不夠)
* 硬體設計的部分很厲害,不過因為你們最後決定要夾箱子,精準度跟力道其實不用太高,所以如果覺得第三個設計受力不平均會影響很大的話,還是可以用用看第一個設計。
> [name=宋馨慈]
* 教授批閱欄
* 評分等第
* A
* 教授回饋
* 疫情的關係,造成大家必須遠端分工合作,的確又提升了自選專題的難度。看到你們在這樣的挑戰下,還可以一一解決問題,非常不容易。加油!
> [name=林坤佑]
## 第十五週紀錄 - 自選題進度報告
* 預計完成事項 (必填)
* [X] 灌好OpenCV
* [X] 測試OpenCV
* [ ] 測試各個硬體
* [X] 組裝完爪子機構
* [X] 完成顏色辨識程式碼
* [X] 完成形狀辨識程式碼
* [ ] 完成欲抓取之方塊
* 實際達成事項 (必填)
* **測試PI Camera**
* PI Camera的線很像薄薄一層紙,把他插在RPI上Camera專屬的Port,金屬對金屬的插入
* 記得去RPI Config那裡把Camera Enable
* 測試指令:
我們用的是
```
raspistill -o image.jpg
```
他會錄影一小段時間後拍照並存成image,這樣用在影像處理就是讓他每隔很小的一段時間拍照後處理影像

* **灌好OpenCV**
* 總計花費時間:6+14+4=24(怎麼有人跟我說差不多六小時...)
* 總計浪費電:4.5顆行動電源完全放電、電風扇、螢幕、藍芽鍵盤充電
* 自己整理之Tutorial: 已經發在臉書社團中了,但也多放了一份PDF在這裡,助教跟教授可以留著明年給學弟妹參考!https://drive.google.com/file/d/1uGb2N5nYgEMAlVY5Ghh5AC6rfjFwUqDJ/view?usp=sharing
* 完成Arduino與RPI的Serial連線
* tutorial: https://roboticsbackend.com/raspberry-pi-arduino-serial-communication/
* 硬體連接:Arduino USB B公的頭接到RPI USB A公的頭
* Arduino code:
```
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available() > 0) {
String data = Serial.readStringUntil('\n');
Serial.print("You sent me: ");
Serial.println(data);
}
}
```
* RPI Code:
```
import serial
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
ser.flush()
while True:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
print(line)
```
* 完成顏色辨識程式(紅綠藍三色)
* https://github.com/Mecoli1219/PUIPUI_Selected_Project_groupOne
* 方法:把RGB轉HSV判斷
* 成果展示:(圖三仍在參數調整過程)



* 場地設計
* 一版

* 二版

* 購買之感測器與爪子已到貨
* 組裝爪子
* 沒有說明書的組裝真的好難喔 我已經不知道拆掉重裝幾次了
* 


* 本周購買物品:
| 品項 | 價格 | 數量 | 賣家 |
| -------- | -------- | -------- | -----|
|瞬間接著劑 | 31 | 1 |優購精品屋|
|A4粉彩紙 黑色20張入| 29 | 1 |優購精品屋|
|塑膠空心球 | 13 | 1 |優購精品屋|
|雙面膠帶 | 21 | 1 |優購精品屋|
|8開丹迪紙 混色12張入 | 31 | 2 |優購精品屋|
|總計 | 150+運費60-150(蝦皮首購折價券)=60 | ||
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* RPI演算法討論
* 辨識與判斷交給RPI
* 車子邊旋轉,相機邊用顏色與形狀辨識找到目標,並沒有設定是先運送什麼顏色,目前打算找到就將目標設為那個顏色然後開始運送,送完後再把該顏色從程式裡的list畫掉
* 找到目標後朝他前進,並使用超音波感測器拿捏距離,到適當距離時傳訊息給Arduino命令打開爪子
* 抓到以後一樣旋轉去尋找有該顏色圖案的箱子並控制車子移動
* 到了以後傳指令放開、推入、後退,並開始尋找下一個目標
* Arduino控制部分討論
* 車子移動控制交給Arduino
* RPI利用Serial傳送String給Arduino,控制前進後退左右旋轉等。
* 組員分工 (必填)
* 杜昀蓉:
* 紀錄
* 報告
* 測試PI Camera
* 灌好OpenCV
* 測試
* 整理RPI Tutorial
* 組裝爪子
* 賴群貿:
* 紀錄
* 報告
* 寫顏色辨識程式
* 測試
* 陳亭瑋:
* 紀錄
* 報告
* 訂購場地材料
* 設計場地
* 遇到問題之處理狀況、解決方式 (必填)
* RPI灌OpenCV到一半會自己當機
* 原因:RPI過熱、RAM不足、SD卡記憶體不足
* 一定要讓他吹電風扇,然後電風扇最好可以另外供電
* 開始裝之前要在advanced settings設定Expand File System,確保記憶體的每一個bit都可以被用到XD
* 如果還擔心就再把libre office和wolfram解安裝,前者影響好像幾百MB而已,但後者有3GB...,整個記憶體也才32G而已ㄟ
* 不要用make -j4(四個CPU同時),用make就好
* 拔掉電源強制重新開機,然後再跑一次make指令(他會從上次結束的前面一點點開始,還可以接受啦:P)
* 增加RPI的Swap
tutorial: https://blog.cavedu.com/2020/03/16/raspberry-pi4-ram/
Swap是一個在RAM不足的時候會被叫出來的空間,所以增加他可以某種程度上的視為增加RAM
但安裝完之後好像還是改回原本的比較好
* 給他愛與鼓勵(不要溫暖 他已經夠燙了),然後可以三不五時滑一下滑鼠讓他保持清醒比較不容易當掉
* 用行動電源供電因此會有灌到一半沒電的問題
* 馬上下單一個RPI專用豆腐頭
* 比起讓他沒電自己斷電再重開機,不如自己先關terminal後關機再拔電源並更換,這樣他幾乎會從他剛停下的部分繼續開始不會做白工
* VNC連線不穩
* 可能是家裡網路問題,用乙太網路線似乎會比較好
* 可能是供電不穩導致,因為我自己的螢幕也會有時候突然黑掉(;′⌒`) 我很期待鋰離子電池跟豆腐頭趕快來
* 豆腐頭來了!真的好用很多,之前用5V2A的行動充他一直顯示電壓不夠,現在都很穩定了
* 兩邊互搶RPI控制權
* 解決方法:跟Michael打架(沒 他好遠
* 如果是遠端那邊的人要控那有RPI的人最好把滑鼠鍵盤都拔掉不然對方好像會控不了
* 測試到一半發現相機全黑,以為相機壞掉
* 問題原因:昀蓉有隨手關燈的好習慣
* 解決方法:Michael工作的時候昀蓉要保持房間燈打開:P還要擺好兩隻娃娃讓Michael辨識!
* (這根本不是個問題,只是很好笑所以來跟你們分享XD)
* 組裝爪子一直失敗
* 因為他有給幾種長度不同的銅柱,而且有些公公有些公母,一開始會不知道該怎麼鎖
* 解決方法:多試幾次,然後先在平面排好確認各個的高度再開始組裝,(他居然有些是要墊螺帽!他又沒說 真的是)
* 伺服馬達擺臂:他給的螺絲直徑遠大於洞,因此研究很久到底要怎麼鎖上去ಥ_ಥ後來發現他給的是螺絲釘,所以你要自己把他轉進洞裡然後攻出螺紋,(真的要拿尖嘴鉗轉,一開始用起子根本轉不動還手很痛),好酷
* 課程建議 (選填)
* 東西拜託趕快寄來!謝謝助教!
* 想說的話 (選填)
* 杜昀蓉:"希望我這個月的電費不要爆...麻麻抱歉了"
* 賴群貿:"天啊這門課是聊天軟體通論嗎" "Swap是基本常識" "影像辨識比Swap還簡單" "以上都是精神不好時的胡言亂語,對不起"
* 陳亭瑋:"我好廢 抱歉了組員"
## 第十五週批閱區 - 自選題進度報告
* 助教批閱欄
* 助教回饋
* 記錄非常完整,軟體、硬體都有達到預計進度。在疫情期間收集素材非常困難,看到你們硬體完成度這麼高,真的很感動,明達402的東西也都正在寄了,希望大家見諒。
* 謝謝你們把 trouble-shooting 的經驗分享給大家,相信很多組應該能更快上手Linux 及 RPi :)
> [name=謝兆和]
* 教授批閱欄
* 評分等第
A+
* 教授回饋
做得很好! 並且願意分享給大家也很棒! Linux 這將近 30 年很多內容,都是靠這樣的精神建立起來,並且讓大家都變強的。剩下的時間不多,大家加油喔,也要顧到其他科目喔。
> [name=陳君朋]
## 第十六週紀錄 - 自選題進度報告
* 預計完成事項 (必填)
* [X] RPI(杜)交接給車車擁有者(陳)
* [ ] Arduino調整參數
* [ ] Python調整參數
* [X] 測試各項硬體
* [X] 將所有硬體裝上車子
* 實際達成事項 (必填)
* Arduino初版框架
github: https://github.com/Mecoli1219/PUIPUI_Selected_Project_groupOne
* 拆車車,五顆紅外線感測器眼睛和藍芽都拔掉了,只剩下L298N的超陽春車車
* 測試Ultrasonic Sensor完成
tutorial: https://thepihut.com/blogs/raspberry-pi-tutorials/hc-sr04-ultrasonic-range-sensor-on-the-raspberry-pi?fbclid=IwAR1klr1tF5mWZusGE-R8yl0z2HkU6X62NjbQ-LnBncJ3Iuyw041_p2yTSK0

* 測試爪子完成
```
#include <Servo.h> //載入函式庫,這是內建的,不用安裝
Servo myservo; // 建立SERVO物件
void setup() {
myservo.attach(9); //設定要將伺服馬達接到哪一個PIN腳
}
void loop() {
myservo.write(0); //旋轉到0度,就是一般所說的歸零
delay(1000);
myservo.write(60); //旋轉到60度
delay(1000);
}
```
測試影片:https://youtu.be/Y4kOh2GJCQo
* 設定RPI使其開機自己跑Python code
tutorial: https://yanwei-liu.medium.com/raspberry-pi%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-%E5%8D%81-%E9%96%8B%E6%A9%9F%E8%87%AA%E5%8B%95%E5%9F%B7%E8%A1%8Cpython%E7%A8%8B%E5%BC%8F-69a936709c0c
* 上板感測器安置
* 設計
RPI、降壓模組、相機都使用魔鬼氈黏貼,考量可能要拔下來接螢幕或做其他調整;超音波感測器固定在相機支架下方,因為超音波是要感測跟箱子的距離,而相機得同時辨識箱子跟倉庫,故如此安排位置


* 場地初步完成 120x100x21 (cm^3)

* 箱子預計大小 12x6x6 (cm^3)
* 這樣在夾住的時候剛好佔RPI camera的視野下方三分之一
* 裝上上板、夾子 在場地行走測試影片:https://youtu.be/ehOsjOt29T8
* 在宿舍測試結果:
1. Servo接在Arduino上可以正常運作
2. 接宿舍wifi,VNC正常,Michael可以從台南操控
3. 手刻Arduino code夾箱子正常 https://youtu.be/FFNS8zyN3p8
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* RPI傳straight\n、left\n、right\n、catch\n、drop\n指令給Arduino,以\n切割指令,Arduino這邊不會回饋情況給RPI,所以在抓東西的時候務必第一次就抓到
* 車子交接後須做的事
1. 測試VNC(不行我就要把車車帶回家了 嗚嗚)
2. 將Servo接線到Arduino(記得接5V的,不是3 pin的3.3V)(可是後來接3 pin G V S的可以直接跑)
3. 把RPI跟Arduino的線連上
4. 鎖上頂板(感覺就會很艱困,可以用一字抵著螺帽不讓他轉) (尷尬 我根本沒有螺絲可以鎖)
5. 測試&加油!
* 採購清單
| 品項 | 價格 | 數量 | 賣家 |
| -------- | -------- | -------- | -----|
| 黑色瓦楞板 60*100cm 0.3cm厚 | 39 | 2 |光南|
|總計 | 78
* 組員分工 (必填)
* 杜昀蓉:
* 紀錄
* 報告
* 簡報
* 測試
* 裝好上板的零件
* 把上板跟RPI交給陳 (無接觸)
* 賴群貿:
* 紀錄
* 報告
* 完成顏色、形狀辨識程式
* 測試
* 想演算法、實作
* 陳亭瑋:
* 紀錄
* 報告
* Arduino
* 調參數
* 製作場地
* 拆車
* 測試車車
* 遇到問題之處理狀況、解決方式 (必填)
* 爪子一開始無法轉動
* 一開始測爪子的時候他看起來像在抖動,完全無法帶動爪子
* 先調整硬體,發現兩個齒輪並未完全對齊,因此在銅柱與壓克力板間加墊片
* 但調整後還是有問題,最後換了一個電腦的Port就好了
* 降壓模組測試顯示Low Voltage
* 之前因為行充供電出現此問題因此買了網路上號稱可以變壓供電給RPI的降壓模組,沒想到還是出現一樣的問題:( 雖然應該是不會影響運作 吧
* 擔心開發板無法供足夠的電給Servo
* 鋰離子電池出來的電壓是7.4V,Servo最高可以承受7.2V,因此想說如果真的供電不足就把7.4V拉線出來到麵包板,串聯電阻後再接上伺服馬達
* Arduino和RPI連接的Serial線不夠長
* RPI拆下來換邊,一開始用魔鬼氈而不是黏死有先見之明,好棒
* 課程建議 (選填)
* 待填
* 想說的話 (選填)
* 杜昀蓉:"硬體部分結束了 吧"
* 賴群貿:
* 陳亭瑋:"室友剛好回家,跟室友借大螢幕、鍵盤、滑鼠跑RPI 齁勝" "宿舍真的好小 那個場地直接讓我無法通行"
## 第十六週批閱區 - 自選題進度報告
* 助教批閱欄
* 助教回饋
* 你們目前完成的進度真的非常棒,而且從你們的工作紀錄簿也可以看得出來你們不僅分工十分明確,而且就算大家身處異地,依然能夠順暢地合作將所有事情一步步完成,這點也非常值得嘉獎。
* 現在看起來你們硬體都已經初步完成了,軟體的部分還差一點,再接下來應該是要進入測試debug的階段了,辛苦你們了,繼續加油!
> [name=鐘民憲]
* 教授批閱欄
* 評分等第
* A
* 教授回饋
* 很接近完成了,期待你們的demo
> [name=坤佑]
## 第十七週紀錄 - 自選題進度報告
* 預計完成事項 (必填)
* [X] 測試
* [ ] 調整參數
* 實際達成事項 (必填)
* 測試RPI丟指令功能正常
* https://www.youtube.com/watch?v=DREeEvDF124
* 確定Arduino可以接收指令並執行
* 組內討論事項 (必填,如問題、構想、分工合作、時間安排...等等)
* 採購清單
| 品項 | 價格 | 數量 | 賣家 |
| -------- | -------- | -------- | -----|
| 雙面膠 | 24 | 1 |光南|
| 藍色色紙 | 5 | 3 |光南|
|總計 | 39
* 組員分工 (必填)
* 杜昀蓉:
* 確保車車整體正常,並轉交給陳亭瑋
* 線上討論時,處理車車硬體的突發問題
* 賴群貿
* 調整rpi程式碼及內部各項參數
* rpi程式碼優化
* 陳亭瑋
* 協助調整rpi參數
* 製作場地
* 設定rpi網路,確保在宿舍vnc可以連接
* 遇到問題之處理狀況、解決方式 (必填)
* 鋰電池配降壓模組仍電壓不足
* 就跟之前用行動充一樣處於可以運作但RPI會覺得不夠的情況,但我明明就已經查過那是常用的降壓模組了啊...
* 要接VNC的時候就盡量用豆腐頭,實際下去跑再用電池
* 測試一開始相機跑不動
* 問題是resolution太高(1720x1080),以至於計算時間過長,調低後(512x512)即解決
* 光線非常影響影像辨識的效果
* 原本的塑膠球好像很容易反光(?,目前嘗試調整參數跟陳亭瑋人工打光
* 前幾次測試每次重起相機就需要重開RPI
* 等不夠久就把程式kill掉導致他沒有完全中止,下次再需要使用camera的時候程式會覺得他已被使用故須重啟
* Arduino無法接收RPI指令
* 一開始以為是C++的字串處理比較嚴格,打算利用strcmp、strcpy處理字串,後來才發現根本不是那個問題,而是忘記在setup中加入Serial.begin(9600),好好笑,我們這組栽在Serial.begin(9600)三次了,兩次為了藍芽多加這串出事,一次少加這串無法傳送指令。
* Opencv裡Hough circle參數超難調:
* 很容易跑出很多其他不存在或不準確的圓,調高param2雖然也能解決問題,但連我們要的圓也會讀不到,最後試過調高canny的param值,依然無法解決問題
* 最後才發現,之前寫的find_color_circle函數就已經有處理這個方面的問題了,他會判斷裡面含有該顏色的比例是否超過某個%數(我好像設80?),來決定他是否為我們要的圓
* 課程建議 (選填)
* 疫情下之調整與心得建議
* 陳亭瑋:
我覺得...在疫情宣布一切改遠距教學的時候,實體手作如車車課停課比較 好,從結果來看似乎我們還是可以變出一些酷酷的東西,然後再用VNC和視訊、無接觸交接、遠距離合作(組員好強...)。但組員們在溝通會遇到一些困難、看不到實體的情況下根據想像組硬體、根據想像寫code,東西在某個人身上的時候,遇到問題也很難互相幫助,手邊沒有半點工具、請助教或組員寄送時間是以周來計算,如果我們能很輕易地在家裡或是宿舍就解決所有問題,我想MKS跟402可以不用存在啦~ 大家之前也不會Office hour的時候塞爆402了。只有四五周的時間,後面卡了一屁股的期末考、作業、報告,買材料運送一周、組一組發現,阿東西有缺,再一周,我是不知道我們有多少時間分配給車車課啦...(雖然教授有提出一些替代方案像是注重在軟體的部分之類的啦),沒有很Carry的機器人大神Alice和資訊部大神Michael直接幹掉硬體軟體問題的話,我想我會讓這20%直接放水流吧XD,組員很讚。
* 杜昀蓉:
遠距之後實作變得很麻煩,很喜歡畫圖Make的我只能忍痛關掉Solidworks然後在蝦皮尋找現成的機構,的確是少了一些車車課的樂趣。合作的部分一開始會覺得不習慣,但其實後來也是慢慢克服,可能就分享螢幕加視訊來讓隊友了解狀況。但寄工具的時間的確偏久,從填好表單到真正寄出也拖了一個禮拜(可能是助教也很忙啦 助教辛苦了),要不是我自己家裡有RPI我不可能在期中考前還花這麼多時間重灌跟debug。但還是謝謝助教跟教授,這學期辛苦了!
在家工作還是蠻好玩的,像在半夜三點群通早安啊、像在相機前擺各種娃娃、像互相分享自己在吃的豆乾Pocky跟泡麵,疫情打亂了生活但沒打散感情(大概啦),很榮幸可以一起做車車:P不換組員了!
* 想說的話 (選填)
* 杜昀蓉:"專業吃瓜民眾 阿不對 是吃豆乾"
* 賴群貿:"hough circle真棒"
* 陳亭瑋:"嚼嚼嚼"
## 第十七週批閱區 - 自選題進度報告
* 助教批閱欄
* 助教回饋
* 又被Serial.begin(9600)害了一次...,真是令人哭笑不得。關於塑膠球反光你們可以考慮在外面多貼一層薄薄的紙或貼紙膠帶,否則就是要花時間寫反光的判斷code了。
* 恭喜你們大致上都完成期末專題了,很喜歡你們這組歡樂的合作氣氛。遠距之後憑想像組硬體寫code,還要平均的分工真的不容易,但你們都做到了,一路克服困難走過來了! 希望之後你們還能維持這份熱忱,在電機系學到自己想學的東西!
> [name=宋馨慈]
* 教授批閱欄
* 評分等第
A
* 教授回饋
影片有錄下一些有趣的對話才真實阿~ XD
我們老師一開始上課也很不習慣,然後線上上課比平常在課堂上還要累,不過幸運的是,我們大家都撐完這學期啦~ :D
期待你們 6/30 有好的表現呦!
> [name= 君朋]
###### tags: `電資工程入門設計與實作` `109-2`