# <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)