# <font color="#DEC2E6">期末專案作品介紹 - ㄋㄧㄚˊ
<font size=2><font color="#909090"><p class="text-center">劉又瑜、周昱雯
## <font color="#"><font size=5>設計概念
<font size=3>真的沒有要幹嘛⋯⋯ 剛好出現在你的桌面的ㄋㄧㄚˊ ,「慢」的非常有原則,人ㄋㄧㄚˊ 互不干擾:relieved:
![](https://hackmd.io/_uploads/B1CHSawWa.jpg)
## 運作情境
辦公桌面,當你在打字時,ㄋㄧㄚˊ 會悄悄根據你打的某些鍵滾動⋯⋯
![IMG_6305](https://hackmd.io/_uploads/ryj6_OvNT.png)
<br>
## 功能造型
ㄋㄧㄚˊ + 你的鍵盤,當你按下 "Enter",ㄋㄧㄚˊ 會順時針轉,當你按下 "Backspace",ㄋㄧㄚˊ 會逆時針轉 💫
{%youtube MZp3LatIgKg%}
(請務必開聲音!!!)
<br>
## 材料質地
### <font color="#DEC2E6">ㄋㄧㄚˊ 本體
* 瓦愣紙板(割出縫隙讓紙板可以擺動)
* 毛線
![IMG_9954-2](https://hackmd.io/_uploads/HyDj3xfUT.jpg =45%x) ![image](https://i.imgur.com/pWJxeq9.jpg =45%x)
![image](https://i.imgur.com/hfuIlam.jpg =45%x) ![IMG_9950-2](https://hackmd.io/_uploads/BkmQjxGIa.jpg =45%x)
### ㄋㄧㄚˊ 的運動裝置
* Arduino UNO
* L9110S驅動板
* TT減速馬達
* 電阻(18歐姆)
* 木棍
* 3D列印卡楯(接馬達與木棍)
(* 很多跟ChatGPT溝通的時間)
![image](https://i.imgur.com/91OxL0d.jpg =45%x)
### 鍵盤
* 任君挑選喜歡的鍵盤,只要能連上Arduino,ㄋㄧㄚˊ 就可以陪你
<br>
## <font color="#">機構電路
![IMG_9DF6432D6E99-1](https://hackmd.io/_uploads/ryH5BhqLp.jpg =60%x)
(最後因為電阻太不穩定所以還是先放棄了嗚嗚)
<br>
## 程式技術
我們要先可以監聽到鍵盤的資訊,所以會先有一串 python code:
```javascript
from pynput import keyboard
import serial
import time
# 根據 Arduino 的串列埠更改這裡的參數
arduino_port = '/dev/cu.usbserial-14310'
baud_rate = 9600
# 建立串列物件
ser = serial.Serial(arduino_port, baud_rate, timeout=1)
# tt馬達控制的相關函數
def move_clockwise():
print("Enter, moving clockwise...")
# 在終端機顯示鍵盤監聽Enter的結果
def move_counterclockwise():
print("Backspace, moving counterclockwise...")
# 在終端機顯示鍵盤監聽Backspace
的結果
# 串列埠通信的相關函數
def send_to_arduino(data):
ser.write(data.encode())
# 監聽鍵盤事件的函數
def on_press(key):
try:
if key == keyboard.Key.enter:
move_clockwise()
send_to_arduino('1')
elif key == keyboard.Key.backspace:
move_counterclockwise()
send_to_arduino('2')
except AttributeError:
pass
# 啟動鍵盤監聽
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
ser.close()
```
接著回到Arduino,操控馬達:
```javascript
const int a1APin = 5; // A-1A腳位接到Arduino的~5腳
const int a1BPin = 3; // A-1B腳位接到Arduino的~3腳
void setup() {
pinMode(a1APin, OUTPUT);
pinMode(a1BPin, OUTPUT);
Serial.begin(9600); // 啟動串列通訊
}
void loop() {
if (Serial.available() > 0) {
char incomingChar = Serial.read();
if (incomingChar == '1') {
// 指令 '1',順時鐘轉動
clockwiseRotation(100); // 請根據實際需求調整 PWM 值
}
if (incomingChar == '2') {
// 指令 '2',逆時鐘轉動
counterclockwiseRotation(100); // 請根據實際需求調整 PWM 值
}
}
}
void clockwiseRotation(int pwmValue) {
digitalWrite(a1APin, pwmValue);
digitalWrite(a1BPin, LOW);
delay(1000); // 順時鐘轉動1秒
// 逐漸減速至停止
for (int i = pwmValue; i >= 0; i--) {
analogWrite(a1APin, i);
analogWrite(a1BPin, 0);
delay(100);
}
// 停止馬達
digitalWrite(a1BPin, LOW);
digitalWrite(a1APin, LOW);
}
void counterclockwiseRotation(int pwmValue) {
digitalWrite(a1APin, LOW);
digitalWrite(a1BPin, pwmValue);
delay(1000); // 逆時鐘轉動1秒
// 逐漸減速至停止
for (int i = pwmValue; i >= 0; i--) {
analogWrite(a1BPin, i);
analogWrite(a1APin, 0);
delay(100);
}
// 停止馬達
digitalWrite(a1BPin, LOW);
digitalWrite(a1APin, LOW);
}
```
<br>
## 試錯經驗
### ㄋㄧㄚˊ本體
ㄋㄧㄚˊ 的理想型態應該是個無線,指節大小又軟軟爛爛的小東西,但因為軟軟的材質實在太難加工,最後呈現是以堅硬的狀態出現。
原本打算使用的是慢回彈的舒壓捏捏樂(材質是TPR),買來後才發現他是往裡面灌了很多質地像奶油的東西,所以沒有辦法切開或放東西進去。也嘗試了把木棍插進去,但發現沒有辦法阻止木棍空轉,無法帶動TPR轉動。
![image](https://i.imgur.com/jZISsaQ.jpg =45%x)
### 速度控制
因為ㄋㄧㄚˊ最重要的元素就是「慢」,所以花了很多時間想辦法讓馬達變慢⋯⋯從tt馬達到步進馬達再回到tt馬達⋯PWM、DigitalWrite、AnalogWrite⋯常常出包,但沒人知道原因,哈哈。
最後是在線路上加了電阻 (物理減速),然後調整程式碼,讓ㄋㄧㄚˊ盡量轉得跟想像中一樣⋯慢⋯⋯_(´ཀ`」 ∠)_
<br>
## 過去報告
[第一次提案](https://hackmd.io/@Laurence/BkUJToPWp)
[11/20 進度分享](https://hackmd.io/@Laurence/HJr6IUG4a)