Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)

1,800 views

Published on

專業的電子鼓,一套要價數萬元。本 session 將講述如何使用開源的軟體和硬體,加上 200 元的簡單電路,純手工打造真實可用的打擊樂器。 使用 Raspberry Pi 2 搭配 python 程式設計,使用便宜的 sensors,結合從 Hydrogen drum machine 取出的 free drum kits,可以做出一整套功能完整,音色倣真的電子鼓。

Published in: Devices & Hardware

COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)

  1. 1. PyDrum: 開源軟硬體實做電子鼓 使用 Raspberry Pi + Python 洪任諭 (PCMan)@COSCUP 2016 E-mail: pcman.tw@gmail.com 2016-08-20
  2. 2. 2 講者簡介 ● Appier Backend Engineer ● 台大資訊工程研究所畢業 ● 前榮總風濕免疫科醫師 ● 陽明大學醫學系畢業 ● 13 年自由軟體開發 – LXDE / LXQt 桌面環境 – PIME 輸入法平台 – 新酷音輸入法 windows port – PCMan BBS client 全系列 – IE Tab Firefox 外掛
  3. 3. 3 http://www.yamahamusic.com.tw/instrument/drums/drums%20manual/drums-manual-101.htm YAMAHA Drumkit
  4. 4. 4 學音樂的孩子不會變壞 只是 ...
  5. 5. 5 夢想是昂貴的 ... http://tw.yamaha.com/zh/products/musical-instruments/drums/el- drums/drumsets/dtx900_series/dtx900k/?mode=model YAMAHA DTX series 官網售價 NTD: 225,000 元
  6. 6. 6 學音樂程式的孩子不會變壞 Maker 魂發作!
  7. 7. 7 初代 PyDrum!
  8. 8. 8 這才是完全體 !
  9. 9. 9 沒圖沒真相 ... 1: https://youtu.be/ZGUp40ab1Dk 2: https://youtu.be/yVq7tDUDeAA Demo: 台大吉他社 汪汪
  10. 10. 10 硬體材料 ● Raspberry Pi 2 (~NT.1300↓) ● ADC: Microchip MCP 3008 (~NT.90) ● RS SMD Diaphragm External Piezo Buzzer, 3700 → 4700 Hz (NT.18) x 7 ● 2W 1MΩ 電阻 (NT. 2) x 7 ● Linear Hall effect sensor (~NT. 80) ● 強力磁鐵 (~NT.40) ● 麵包板 : (~NT.80) 、各種線材… ● 很多洋芋片 (~NT. 65) x 6
  11. 11. 11 軟體環境 ● 程式部份: – Python3 – Spidev ( 透過 Serial Peripheral Interface 讀取 ADC) – Pygame ( 播放音效 ) ● 鼓音色檔案 – 取自 Hydrogen 軟體 (GPL’d) – http://www.hydrogen-music.org/hcms/ – 轉檔成 ogg
  12. 12. 12 Piezo Element ● 壓電材質 – 輸入電訊號,產生形變 / 振動 → 蜂鳴器 – 輸入聲音 / 振動,產生電壓 → sensor ● 類比訊號 (Raspberry Pi 無法讀取 ) ● 類似電容放電
  13. 13. 13 Analogue to Digital Converter (ADC) ● 類比訊號 ( 電壓值 ) 轉數位訊號 ● Microchip MCP3008 (10-bit, SPI 界面 ) 類比 輸入 數位接地 電源供應 (RPi: 5V) 參考電壓 (ADC=VCHx / VREF * 1024) 類比接地 SPI clock SPI chip select ( 接 RPi SPI_CE0) SPI 輸入 ( 來自 RPi MOSI 的輸入 ) SPI 輸出 ( 轉換結果送到 RPi MISO)
  14. 14. 14 RaspberryPiModel2v1.1 ©RaspberryPi2014 http://www.raspberrypi.org Power HDMI Audio USB 2x USB 2x ETHERNET DSI (DISPLAY) CSI(CAMERA) GPIO 11 55 1010 1515 2020 2525 3030 3535 4040 4545 5050 5555 6060 A A B B C C D D E E F F G G H H I I J J MCP3008 SC70 1 25 34 crash Hihat padel bass drum ride floor tomhihat snare tom Pydrum - https://github.com/PCMan/pydrum Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com> 動手接線 !
  15. 15. 15 訊號分析 ● 用 busy loop 連續讀取 ADC – 平均 sampling rate 約 4000-5000 Hz ● 頻譜分析 – 5-order moving average ( 減低雜訊 ) – 傅立葉轉換 → 頻寬約 200Hz – 根據 sampling theorem → 取樣率至少 400 Hz ● 嘗試下修 sampling rate – 省電 – 200 Hz 會破壞波形,但偵測敲擊仍堪用 – 副作用:減少高頻雜訊 ?
  16. 16. 16 訊號分析 原始訊號波形 傅立葉轉換 ( 頻譜 ) 時間 (sec) 頻率 (Hz) 200Hz
  17. 17. 17 取樣率 : 200Hz Threshold: 100
  18. 18. 18 ( 近似 ) 固定時間取樣 SAMPLING_RATE = 200 # 目標 : 一秒讀 ADC 200 次 sampling_period = 1.0 / SAMPLING_RATE # 每次取樣時間間隔 wait_adjust = 0.0 next_read_time = time.time() # 下次讀取 spi 的時間 while True: read_time = time.time() # 這次讀取的時間 read_adc_value() # 從 ADC 讀取數值 wait_adjust = next_read_time – read_time # 修正誤差 # 估計下一次應該讀取的時間 next_read_time = read_time + sampling_period + wait_adjust # 計算現在時間距離下一次讀取還有多久 wait_time = next_read_time - time.time() if wait_time > 0: time.sleep(wait_time) # 等待下一次讀取 ● RPi 無 realtime clock ,取樣速度忽快忽慢 ... RPi2 實驗結果:平均取樣率 199.99 Hz
  19. 19. 19 進化了 !
  20. 20. 20 進化了 !
  21. 21. 21 LIVE! By: 餘弦杯 cos(☕) 樂團
  22. 22. 22
  23. 23. 23 特別致謝 ● 勸世宗親會 ( 授權使用喵電感應 ) ● 台大吉他社 汪汪 ( 測試及錄製 demo) ● 鼓手 : Jessie Mi ● 烏克麗麗 : penk (http://ukulele.design/) – 下午 14:15 R1 議程 : 自己的樂器自己做 ● Vocal: Dona ● COSCUP 全體人員 GitHub https://github.com/PCMan/pydrum

×