分类 硬件/开发板 下的文章

搞得这个MicroPython啊,亦可赛艇。
经过上一篇文章,已经配置好了WiFi连接和Webrepl,下面我们来尝试与ESP8266来通信,在GPIO2上我接入了一个DS18x20温度传感器,通过访问ESP8266的8267端口,来获得ESP8266上传感器的数值。

main.py:
(在ESP8266上的socket库叫usocket,json库叫ujson)

 from ds18020 import DS18020
 import usocket
 import ujson
 import esp
 host = '0.0.0.0'
 port = 8267

 ds = DS18020(2)
 ds_addr = ds.getaddr()

 s = usocket.socket()
 s.bind((host,port))
 s.listen(6)
 while True:
     client,addr = s.accept()
     print('Client IP:',addr[0])
     info = {}
     info['flash_size'] = str(esp.flash_size())
     info['flash_free'] = str(esp.freemem())
     info['flash_id'] = str(esp.flash_id())
     info['ds18x20_temp'] = str(ds.gettemp(ds_addr[0]))
     print(info)
     client.send(ujson.dumps(info))
     info = {}
     client.close()

ds18020.py
(很惭愧,只做了一点的微小工作)

 import onewire
 import ds18x20
 import time
 from machine import Pin
 class DS18020:
     def __init__(self,pin):
         self.pin = Pin(pin)
     def getaddr(self):
         ow = onewire.OneWire(self.pin)
         self.ds = ds18x20.DS18X20(ow)
         roms = self.ds.scan()
         return roms
     def gettemp(self,addr):
         self.ds.convert_temp()
         time.sleep_ms(450)
         return self.ds.read_temp(addr)

效果:
31_0.PNG
今天还是挺冷的。

之前一直用Arduino,现在来尝试一下Python。

烧录

1. 到官网下载固件

http://www.micropython.org/download

2. 安装esptool工具

请确保有Python环境(Linux或Windows)

pip install esptool

3. 清空Flash

这一步很重要,可以避免很多错误:

esptool.py --port /dev/ttyUSB0 erase_flash (Windows下port为COM口)

4. 下载到ESP8266上

下载前先将GPIO0下拉,进入下载模式:

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20180511-v1.9.4.bin

有些模块的Flash是512K的,可能无法下载固件,可以通过esptool来查看:

esptool.py --port /dev/ttyUSB0 flash_id

连接WiFi与远程编程

通过串口连接ESP8266,可以看到串口输出:
25_0.PNG
依次输入:

>>> import network
>>> sta_if = network.WLAN(network.STA_IF)
>>> sta_if.active(True)
>>> sta_if.connect("", "") #SSID,PASSWD
>>> sta_if.isconnected()
>>> print("IP:",sta_if.ifconfig()[0])

连接后可以看到模块的IP。
远程编程需要用到webrepl,你可以使用MicroPython的在线客户端,或从Github获取:

  1. Github:https://github.com/micropython/webrepl
  2. 在线客户端:http://micropython.org/webrepl

在使用webrepl前,需要进行配置,在串口输入:

>>> import webrepl_setup #按提示配置

配置完成后再在串口输入下面的代码,来开启:

>>> import webrepl
>>> webrepl.start()

你可以通过webrepl来上传/下载文件。
webrepl的界面:
25_1.PNG

文件系统

输入下面命令查看当前有的文件:

 >>> os.listdir()
 ['boot.py', 'webrepl_cfg.py', 'main.py']
 boot.py main.py前被执行(开发板启动时将执行这个该脚本,它设置了开发板的多个选项参数) | main.py 主程序

查看剩余空间:

>>> import micropython
>>> micropython.mem_info()
stack: 2112 out of 8192
GC: total: 35968, used: 10000, free: 25968
No. of 1-blocks: 44, 2-blocks: 15, max blk sz: 264, max free sz: 1417

文档

http://docs.micropython.org/en/latest/library/index.html#python-standard-libraries-and-micro-libraries

SDCC(Small Device C Compiler)是一个优化的 ANSI - C交叉编译器,目标CPU为基于Intel 8051, Maxim 80DS390, Zilog Z80 和Motorola 68HC08 的单片机。

安装

在Debian/Ubuntu下很容易通过Apt来安装:

sudo apt-get install sdcc sdcc-doc

SDCC使用与编译

SDCC到此就安装完了,我们来简单点个灯:

#include "reg51.h"
#define LED P3_0
void Delay1000ms(){             //@11.0592MHz
        unsigned char i, j, k;
        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void main(){
        while(1){
                LED = 0;
                Delay1000ms();
                LED = 1;
        }
}

编译:

sdcc led.c

编译完后看到目录下生成了许多东西:

# ls
led.asm  led.ihx  led.lst  led.mem  led.rst
led.c    led.lk   led.map  led.rel  led.sym

这里我们只关心led.ihx这个文件,我们需要将它转为hex来烧录:

packihx led.ihx > led.hex

在Linux下可以通过stcflash来烧录它:

sudo apt-get install git python python-serial
git clone https://github.com/laborer/stcflash.git
cd stcflash
python stcflash.py [--port /dev/ttyUSB0] <filename.ihx>
//由于我没有支持的单片机,所以无法演示,stcflash的支持列表和更多使用方法详情请看项目的README

SDCC的多文件编译

例如:

//main.c 引用了 test.c中的函数方法
main.c test.c test.h

这样来编译成为一个HEX:

sdcc -c main.c
sdcc -c test.c
sdcc main.rel test.rel

批判一番

手头上只有几片STC15F104E,就是那个定时器有问题的片子,下载只能通过几个特定版本的STC-ISP来下载的刁端货。

当有人触发传感器时,自动拍照,相机使用RaspberryPi的CSI接口摄像头。

1.安装GPIO,picamera库:

pip install RPi.GPIO picamera
(仅pip)

2.在raspi-config中打开摄像头:

sudo raspi-config
5 Interfacing Options > P1 Camera > Yes(enabled)

源代码:

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO #Python GPIO库
import time,picamera
GPIO.setmode(GPIO.BOARD) #引脚模式
GPIO.setup(7,GPIO.IN) #板上7号引脚,输入
img = picamera.PiCamera() #初始化相机
img.brightness = 70 #相机亮度

while 1:
    if GPIO.input(7): #检测电平
        filename = time.strftime("%Y-%m-%d+%H:%M:%S",time.localtime()) + '.jpg'
        img.capture(filename) #保存一张照片
        print '[info] action'
    else:
        print '[info] no action'
    time.sleep(1)

电路图:

418_0.png

原理:

其他电路不讲了,主要讲一下下面的部分:

418_1.png

上图是一个简单的反向器,在IN输入一个高电平,使三极管导通,由于电流向电阻小的方向流动,所以这时没有电流流向A,所以A点为低电平,当IN没有输入(低电平)时,由于三极管没有导通,所以电流通过10K电阻流向A,于是在A处就产生了高电平。

把Q3的LED和500欧姆电阻去了,接入负载,就可以当做简单的UPS来使,大电流把Q3换成MOS就行了。

防烤糊必备

import os
import time
from pyA20.gpio import gpio
from pyA20.gpio import port
#GPIO:https://github.com/duxingkei33/orangepi_PC_gpio_pyH3
#适用于全H3系列和H2+
Pin = port.PA10
gpio.init() #初始化
gpio.setcfg(Pin, gpio.OUTPUT) #输出
while 1:
    output = os.popen('cat /sys/devices/virtual/hwmon/hwmon1/temp1_input') 
    #读取温度,来自CPU的温度传感器
    #初版Zero由于基准电压的原因,可能偏高
    wd = output.read()
    print int(wd)
    if(int(wd)>50): #大于50度开启
        gpio.output(Pin, 1)
        time.sleep(1)
    if(int(wd)<50):
        gpio.output(Pin, 0)
        time.sleep(1)

需要安装Python-Opencv:

apt install python-opencv
(自动处理依赖关系)

一段简短的代码:

#coding=utf-8
import cv2,time
cap = cv2.VideoCapture(0) #选择设备
cap.set(3,1280) #设置宽度(720p)
cap.set(4,720) #设置高度
while(1):
    file = 'photo/' + time.strftime('%Y-%m-%d-%H:%M:%S',time.localtime(time.time())) + '.jpg' #存储在photo文件夹,以时间命名,JPG格式
    print 'GET',file
    ret,photo = cap.read()  #读取摄像头
    cv2.imwrite(file,photo) #写照片
    time.sleep(10) #延时时间,10s一张

之后照片用FFmpeg之类的工具合成视频就可以了。

1.插上网卡,输入 lsusb

340_1.png

*1-1.更新软件包

apt-get update && apt-get upgrade && apt-get autoremove

2.安装依赖包

apt-get -y install linux-headers-sun8i build-essential fakeroot dpkg-dev

3.下载驱动源码

wget http://cdn-cw.mediatek.com/Downloads/linux/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2

4.解压

tar -jxvf DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
cd DPO_MT7601U_LinuxSTA_3.0.0.4_20130913

5.进了目录直接make

make
make install

340_2.png

6.加载驱动

modprobe mt7601Usta

现在可以ifconfig看看了,多出来个ra0,后面按正常连接配置就行了。

340_3.png

MT7601u发热感人,Orange Pi自带XR819就是垃圾。