Fab Academy 第十一周:輸入設備

這周學習 輸入感測器和輸入設備.

實踐作業:製作帶有輸入感測器的電路

給微控制器電路增加一個感測器,測量感興趣的值

這周開始,晶元 Attiny45 將會頻繁出場:

電路設計

嘗試用 phototransistor (光電晶體管)作為輸入模塊,去控制 LED 。

在 Eagle 先畫 schematic:

然後生成 board。可以先用 autorouter 自動布線,然後再根據需要手動調整。

在完成設計之前,需要用 ERC 命令檢查 schematic 的錯誤,用 DRC 檢查 board 的錯誤。根據機器刀頭的尺寸,設置線路間隔為 16mil 。

全部仔細檢查後,再分別把 top 圖層和 dimension 圖層輸出為兩個 png 文件,要注意勾選單色輸出:

Download the eagle sch & brd & png files.

電路板製作

依然使用 Roland SMR-20 刻電路板,用 1/64 刀頭刻線路,1/32 切割外框。在 fabmodules.org 裡面,設置輸入的 png 圖像 dpi 為 1500 ,然後計算雕刻路徑:

將元件們焊好:

程序

這周開始用 Arduino 寫程序。在上傳之前,需要選好板子的類型以及晶元。 Attiny45 使用 8 MHz 內頻。

代碼如下,也可以到這裡下載。

// set pin numbers:nconst int buttonPin = 3; // the number of the pushbutton pinnconst int ledPin = 4; // the number of the LED pinnn// variables will change:nint buttonState = 0; // variable for reading the pushbutton statusnnvoid setup() {n // initialize the LED pin as an output:n pinMode(ledPin, OUTPUT);n // initialize the pushbutton pin as an input:n pinMode(buttonPin, INPUT);n}nnvoid loop() {n // read the state of the pushbutton value:n buttonState = digitalRead(buttonPin);nn // check if the pushbutton is pressed.n // if it is, the buttonState is HIGH:n if (buttonState == HIGH) {n // turn LED on:n digitalWrite(ledPin, HIGH);n } else {n // turn LED off:n digitalWrite(ledPin, LOW);n }n}n

在這個簡單的電路程序中,光電晶體管起到開關的作用,根據光亮控制電路中 LED 的明滅:

試驗1:用 Python 和串口通信

製作一塊帶有光電晶體管的板子:

下載 hello.light.45.c 和 makefile。在 terminal cd 進入文件夾,輸入命令

make -f hello.light.45.maken

得到回應:

avr-gcc -mmcu=attiny45 -Wall -Os -DF_CPU=8000000 -I./ -o hello.button.45.out hello.button.45.cnavr-objcopy -O ihex hello.button.45.out hello.button.45.c.hex;n avr-size --mcu=attiny45 --format=avr hello.button.45.outnAVR Memory Usagen----------------nDevice: attiny45nnProgram: 364 bytes (8.9% Full)n(.text + .data + .bootloader)nnData: 0 bytes (0.0% Full)n(.data + .bss + .noinit)n

然後輸入命令:

sudo make -f hello.light.45.make program-usbtinyn

得到回應:

avr-objcopy -O ihex hello.light.45.out hello.light.45.c.hex;n avr-size --mcu=attiny45 --format=avr hello.light.45.outnAVR Memory Usagen----------------nDevice: attiny45nnProgram: 502 bytes (12.3% Full)n(.text + .data + .bootloader)nnData: 1 bytes (0.4% Full)n(.data + .bss + .noinit)nnnavrdude -p t45 -P usb -c usbtiny -U flash:w:hello.light.45.c.hexnnavrdude: AVR device initialized and ready to accept instructionsnnReading | ################################################## | 100% 0.00snnavrdude: Device signature = 0x1e9206navrdude: NOTE: "flash" memory has been specified, an erase cycle will be performedn To disable this feature, specify the -D option.navrdude: erasing chipnavrdude: reading input file "hello.light.45.c.hex"navrdude: input file hello.light.45.c.hex auto detected as Intel Hexnavrdude: writing flash (502 bytes):nnWriting | ################################################## | 100% 0.74snnavrdude: 502 bytes of flash writtennavrdude: verifying flash memory against hello.light.45.c.hex:navrdude: load data flash data from input file hello.light.45.c.hex:navrdude: input file hello.light.45.c.hex auto detected as Intel Hexnavrdude: input file hello.light.45.c.hex contains 502 bytesnavrdude: reading on-chip flash data:nnReading | ################################################## | 100% 0.94snnavrdude: verifying ...navrdude: 502 bytes of flash verifiedn

Python 程序可以在這裡下載.

用 USB to TTL 連接好板子並運行程序:

python hello.light.45.py /dev/ttyUSB0n

這時出現錯誤提示:

Traceback (most recent call last):n File "hello.light.45.py", line 62, in <module>n ser = serial.Serial(port,9600)n File "/Library/Python/2.7/site-packages/serial/serialutil.py", line 180, in __init__n self.open()n File "/Library/Python/2.7/site-packages/serial/serialposix.py", line 294, in openn raise SerialException(msg.errno, "could not open port %s: %s" % (self._port, msg))nserial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: /dev/ttyUSB0n

Google 一下這個問題 Failed to open port /dev/ttyUSB0 - ROS Answers: Open Source Q&A Forum。問題可能是因為我還沒有裝 FTDI (用於 USB 和串口通信)驅動。

使用命令 ls /dev/tty* 可以列出當前可用的串口。確實沒有 /dev/tty.usbserial-A400gwhT 串口。所以我嘗試安裝 FTDI 驅動 - D2XX Direct Drivers 以及 Virtual COM Port Drivers。但是依然不成功。

接著,Google 到這一篇 How to Install FTDI Drivers - learn.sparkfun.com 照著再裝了一遍驅動。重啟電腦後,插入 FTDI 2 USB 設備, /dev/tty.usbserial-A400gwhT 總算出現在串口列表中。

接著,嘗試用新的串口運行程序:

python hello.light.45.py /dev/tty.usbserial-A400gwhT 9600n

繼續看到錯誤提示:

command line: hello.light.45.py serial_portn

到 python 程序中仔細看了看,將 len(sys.argv) 從 2 改為 3:

if (len(sys.argv) != 3):n print "command line: hello.light.45.py serial_port"n sys.exit()nport = sys.argv[1]n

問題解決:

測試視頻

實驗2:開關

做了一個帶開關的板子:

下載 hello.button.45.c 和 makefile。 在 terminal cd 進入文件夾,運行命令:

make -f hello.button.45.make nsudo make -f hello.button.45.make program-usbtinyn

都正常。然後用 TTL 2 USB 連接板子:

運行命令

python term.py /dev/tty.usbserial-A400gwhT 9600n

每按一次按鈕,屏幕打出一個「du」:

測試視頻

實驗3:溫度感測器

做了一個帶有溫度感測器的板子:

下載 hello.temp.45.c 和 makefile。輸入命令

make -f hello.button.45.make nsudo make -f hello.button.45.make program-usbtinyn

然後運行程序

python hello.temp.45.py /dev/tty.usbserial-A400gwhT 9600 n

感測器開始實時監測溫度變化。

課堂筆記

1. 通信模塊

  • pySerial: Python與串口通信
    • miniterm: pySerial 的操作終端
    • 實例文件rx.py, term.py
  • API:serialport(跟 js 交互),chrome.serial,WebUSB API
  • bit timing 位定時: 關鍵參數 xxx bits/sec
  • clocks (10% RC, 1% RC calibrated, .5% resonator, 50 ppm crystal)

2.開關

button 按鈕開關,slide 滑動開關

3. 運動感測器

pyroelectric 熱釋電紅外PIR運動感測器探測器模塊。可以測量身體的熱輻射,檢測活動和變化。

test motion module video

4.距離感測器

sonar 聲納:Ultrasonic Module HC-SR04 Distance Sensor

test video

5.磁場感測器

Hall effect:霍爾效應是指當固體導體放置在一個磁場內,且有電流通過時,導體內的電荷載子受到洛倫茲力而偏向一邊,繼而產生電壓(霍爾電壓)的現像。電壓所引致的電場力會平衡洛倫茲力。

test video

6.溫度感測器

NTC 負溫度係數熱敏電阻(Negative Tempperature Coefficient Thermistor) 熱敏電阻: 電阻阻值隨溫度而上升。溫度越高,敏感度越低。

RTD thermistors: lower temperature, more sensitive (NTC table)

test video

7.光感測器

phototransistor 光電晶體管

test video

8.加速,方向,旋轉感測器

3D accelerometer I2C

test video

9.聲音感測器

MEMS, Microphones > Knowles SPU0414HR5H-SB-7

test video

10.震動感測器

piezo 壓電

11.壓力感測器

force sensing resistor 力敏電阻

strain gauge 應變儀

load cell 稱重感測器

12. step response 階躍響應

resistance 電阻, capacitance 電容, inductance 電感, position 位置, pressure 壓力, proximity 接近度, tilt 傾斜, acceleration 加速, humidity 濕度

project: touchpad, multitouch, ...

loading (test video),transmit-receive (test video)

dielectric spectroscopy measurement 介電譜測量

13. 圖像

module

cameras, boards

OpenCV: 視屏處理庫

libuvc: a cross-platform library for USB video devices

WebRTC:WebRTC (Web Real-Time Communications) 使 Web 應用程序和網站來捕獲和可選流媒體音頻/視頻,以及瀏覽器之間任意數據交換,而不需要一個中介。

更多資料

  • The Physics of Information Technology
  • Basics of Measuring the Dielectric Properties of Materials
  • Measure the Difference

課程資源

  • Fab Academy 2016 課表
  • Week11 課程視頻
  • Week11 課程大綱
  • 我的英文筆記 Gitbook
  • 公眾號文章列表


推薦閱讀:

Wintergatan自造樂器搞音樂
論無用知識的有用性
Fab Academy 第二周:CAD [FabNotes03]
用垃圾造電台,19歲登上非洲福布斯,少年用燃起了非洲的創新之火

TAG:创客 | 智能硬件 | 电子 |