美文网首页FabAcademy 学习汇我爱编程
[FabNotes23] 作业11:输入设备

[FabNotes23] 作业11:输入设备

作者: Kidult | 来源:发表于2016-07-30 22:14 被阅读52次

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

    这周开始,芯片 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 。传感器开始实时监测温度变化。

    课程资源

    相关文章

      网友评论

        本文标题:[FabNotes23] 作业11:输入设备

        本文链接:https://www.haomeiwen.com/subject/tzytsttx.html