[FabNotes23] 作业11:输入设备 | Week11 - Input Devices

给微控制器电路增加一个传感器,测量感兴趣的值

这周开始,芯片 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:
const int buttonPin = 3;     // the number of the pushbutton pin
const int ledPin =  4;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

在这个简单的电路程序中,光电晶体管起到开关的作用,根据光亮控制电路中 LED 的明灭:

试验1:用 Python 和串口通信

制作一块带有光电晶体管的板子:

下载 hello.light.45.cmakefile。在 terminal cd 进入文件夹,输入命令 make -f hello.light.45.make

得到回应:

avr-gcc -mmcu=attiny45 -Wall -Os -DF_CPU=8000000 -I./ -o hello.button.45.out hello.button.45.c
avr-objcopy -O ihex hello.button.45.out hello.button.45.c.hex;\
    avr-size --mcu=attiny45 --format=avr hello.button.45.out
AVR Memory Usage
----------------
Device: attiny45

Program:     364 bytes (8.9% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)

然后输入命令: sudo make -f hello.light.45.make program-usbtiny

得到回应:

avr-objcopy -O ihex hello.light.45.out hello.light.45.c.hex;\
    avr-size --mcu=attiny45 --format=avr hello.light.45.out
AVR Memory Usage
----------------
Device: attiny45

Program:     502 bytes (12.3% Full)
(.text + .data + .bootloader)

Data:          1 bytes (0.4% Full)
(.data + .bss + .noinit)


avrdude -p t45 -P usb -c usbtiny -U flash:w:hello.light.45.c.hex

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9206
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "hello.light.45.c.hex"
avrdude: input file hello.light.45.c.hex auto detected as Intel Hex
avrdude: writing flash (502 bytes):

Writing | ################################################## | 100% 0.74s

avrdude: 502 bytes of flash written
avrdude: verifying flash memory against hello.light.45.c.hex:
avrdude: load data flash data from input file hello.light.45.c.hex:
avrdude: input file hello.light.45.c.hex auto detected as Intel Hex
avrdude: input file hello.light.45.c.hex contains 502 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.94s

avrdude: verifying ...
avrdude: 502 bytes of flash verified

Python 程序可以在这里下载.

用 USB to TTL 连接好板子并运行程序:

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

这时出现错误提示:

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

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 9600

继续看到错误提示:

command line: hello.light.45.py serial_port

到 python 程序中仔细看了看,将 len(sys.argv) 从 2 改为 3:

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

问题解决:

测试视频

实验2:开关

做了一个带开关的板子:

下载 hello.button.45.cmakefile。 在 terminal cd 进入文件夹,运行命令: make -f hello.button.45.makesudo make -f hello.button.45.make program-usbtiny。都正常。

然后用 TTL 2 USB 连接板子:

运行命令

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

每按一次按钮,屏幕打出一个“du”:

测试视频

实验3:温度传感器

做了一个带有温度传感器的板子:

下载 hello.temp.45.cmakefile。输入命令 make -f hello.button.45.makesudo make -f hello.button.45.make program-usbtiny

然后运行程序 python hello.temp.45.py /dev/tty.usbserial-A400gwhT 9600 。传感器开始实时监测温度变化。

课程资源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容