使用“W5100S PoE 模块”创建网络摄像头,无需额外电源

转发: Create a webcam with a "W5100S PoE module" without additional power supply

概述

PoE(以太网供电)网络模块是一种使用能够通过以太网电缆供电和传输数据的技术的设备。 该技术通常用于网络设备或 IP 摄像机。

PoE 网络模块是一种互联网连接设备,仅使用一根以太网电缆即可轻松远程控制。 通过使用该模块,无需额外的电源线,可以降低现有系统的维护或安装成本。

PoE Web模块通常支持Web服务器、数据库、CGI脚本等Web应用,用户可以通过网络上的浏览器查看网页,并通过网页控制模块。

PoE 网络模块可用于各种工业和家庭应用,并提供高可靠性和稳定性。 此外,该模块通常支持多种协议,使其与现有系统高度兼容。

发展

更多信息可以在下面的链接中找到。

  • Raspberry Pi Pico

Buy a Raspberry Pi Pico – Raspberry Pi

  • Arducam OV2640

https://www.arducam.com/product/arducam-2mp-spi-camera-b0067-arduino/

准备

安装 CircuitPython

参考上面的链接在 Raspberry Pi Pico 上安装 CircuitPython。

Installing CircuitPython | Getting Started with Raspberry Pi Pico and CircuitPython | Adafruit Learning System

  • 在您的计算机上下载以下 uf2 文件链接

CircuitPython 7.0.0 - https://downloads.circuitpython.org/bin/raspberry_pi_pico/en_US/adafruit-circuitpython-raspberry_pi_pico-en_US-7.0.0.uf2

安装库

复制到 Raspberry Pi Pico 内的 lib 文件夹中。 从下面的链接下载 Bundle,并将其放在“CIRCUITPY”文件内的 lib 文件夹中。

Libraries

测试

使用以太网电缆将您的电路板连接到互联网路由器。 几分钟后。

在终端窗口中按“Ctrl+D”。 您可以看到如下消息。

相反,按“Ctrl+C”会导致正在运行的源停止。

打开网络浏览器并输入模块的 IP 地址。

import time as utime
import busio
import board
import usb_cdc
from Arducam import *
from board import *

import board
import busio
import digitalio
import time
import gc
from adafruit_wiznet5k.adafruit_wiznet5k import WIZNET5K
from adafruit_wiznet5k.adafruit_wiznet5k import *
from adafruit_wiznet5k.adafruit_wiznet5k_socket import socket
from adafruit_wiznet5k.adafruit_wiznet5k_socket import *
        
once_number=1024
#once_number=128
mode = 0
prev_mode = mode
start_capture = 0
stop_flag=0
data_in=0
value_command=0
flag_command=0
buffer=bytearray(once_number)

mycam = ArducamClass(OV2640)
mycam.Camera_Detection()
mycam.Spi_Test()
mycam.Camera_Init()
utime.sleep(1)
mycam.clear_fifo_flag()


def read_fifo_burst():
    count=0
    lenght=mycam.read_fifo_length()
    mycam.SPI_CS_LOW()
    mycam.set_fifo_burst()
    while True:
        mycam.spi.readinto(buffer,start=0,end=once_number)
        usb_cdc.data.write(buffer)
        utime.sleep(0.00015)
        count+=once_number
        if count+once_number>lenght:
            count=lenght-count
            mycam.spi.readinto(buffer,start=0,end=count)
            usb_cdc.data.write(buffer)
            mycam.SPI_CS_HIGH()
            mycam.clear_fifo_flag()
            break
    return lenght

def read_fifo_burst_socket(cli_sock, length):
    count=0
    #lenght=mycam.read_fifo_length()
    mycam.SPI_CS_LOW()
    mycam.set_fifo_burst()
    while True:
        mycam.spi.readinto(buffer,start=0,end=once_number)
        #usb_cdc.data.write(buffer)
        cli_sock.send(buffer)
        #utime.sleep(0.001)
        count+=once_number
        if count+once_number>length:
            count=length-count
            mycam.spi.readinto(buffer,start=0,end=count)
            #usb_cdc.data.write(buffer)
            cli_sock.send(buffer[0:count])
            mycam.SPI_CS_HIGH()
            mycam.clear_fifo_flag()
            break

    gc.collect()    
    return length   

def read_fifo_burst_socket1(cli_sock, length):
    count=0
    #lenght=mycam.read_fifo_length()
    mycam.SPI_CS_LOW()
    mycam.set_fifo_burst()
    send_buffer = b''  #bytearray()
    while True:
        mycam.spi.readinto(buffer,start=0,end=once_number)
        send_buffer += buffer
        #usb_cdc.data.write(buffer)
        count+=once_number
        if count+once_number>length:
            count = length-count
            mycam.spi.readinto(buffer,start=0,end=count)
            send_buffer += buffer[0:count]
            #usb_cdc.data.write(buffer)
            mycam.SPI_CS_HIGH()
            mycam.clear_fifo_flag()
            break

    index = 0
    while True:
        buff = send_buffer[index:index+2048]
        print(buff)
        cli_sock.send(buffer)
        index += 2048
        gc.collect()    
        utime.sleep(0.001)
        if index + 2048 >= length:
            buff = send_buffer[index:length]
            cli_sock.send(buff)
            gc.collect()    
            break            
    
    return length   

def w5x00_init():
    ##SPI0
    SPI0_SCK = board.GP18
    SPI0_TX = board.GP19
    SPI0_RX = board.GP16
    SPI0_CSn = board.GP17

    ##reset
    W5x00_RSTn = board.GP20

    print("Wiznet5k (DHCP)")

    # Setup your network configuration below
    # random MAC, later should change this value on your vendor ID
    MY_MAC = (0x00, 0x01, 0x02, 0x03, 0x04, 0x05)
    IP_ADDRESS = (192, 168, 11, 5)
    SUBNET_MASK = (255, 255, 255, 0)
    GATEWAY_ADDRESS = (192, 168, 11, 1)
    DNS_SERVER = (8, 8, 8, 8)

    ethernetRst = digitalio.DigitalInOut(W5x00_RSTn)
    ethernetRst.direction = digitalio.Direction.OUTPUT

    led = digitalio.DigitalInOut(board.GP25)
    led.direction = digitalio.Direction.OUTPUT

    # For Adafruit Ethernet FeatherWing
    cs = digitalio.DigitalInOut(SPI0_CSn)
    spi_bus = busio.SPI(SPI0_SCK, MOSI=SPI0_TX, MISO=SPI0_RX)

    # Reset W5500 first
    ethernetRst.value = False
    time.sleep(1)
    ethernetRst.value = True


    # Initialize ethernet interface without DHCP
    eth = WIZNET5K(spi_bus, cs, is_dhcp=True, mac=MY_MAC)

    # Set network configuration
    #eth.ifconfig = (IP_ADDRESS, SUBNET_MASK, GATEWAY_ADDRESS, DNS_SERVER)

    print("Chip Version:", eth.chip)
    print("MAC Address:", [hex(i) for i in eth.mac_address])
    print("My IP address is:", eth.pretty_ip(eth.ip_address))
    print("Done!")

    return eth, led


def httpServer_init():
    eth, led = w5x00_init()
    set_interface(eth)
    sock = socket()
    return sock


def httpServer_listen(sock):
    sock.bind((None, 80))
    sock.listen()
    
def httpServer_accept(sock):    
    cli_sock, addr = sock.accept()
    while not cli_sock.connect:
        time.sleep(0.01)
    print('Connect')
    #print(conn)
    return cli_sock

def httpServer_read(cli_sock):
    request = cli_sock.recv()
    print(request)
    if len(request) > 0:
        #print(request)
        request = request.decode("utf-8")
        #print('Content = %s' % request)
        reqlines = request.split('\r\n')
        #print(reqlines)
        method = reqlines[0].split(' ')
        print(method)
        print(method[1][1:])

        return True, method[1][1:]
    else:
        time.sleep(0.001)
        return False, b''

def httpServer_response_single(cli_sock):
    print('httpServer_response_single()')
    length = mycam.read_fifo_length()
    print(length)
    cli_sock.send(b'HTTP/1.1 200 OK\n')
    cli_sock.send(b'Connection: close\n')
    cli_sock.send(b"Content-Type: image/jpeg\n")
    cli_sock.send(b"Content-Length: %d\n\n" % length)
    read_fifo_burst_socket(cli_sock, length)
    #eth.socket_write(s, b"\n\n")
    print('response done')


BOUNDARY = b"e8b8c539-047d-4777-a985-fbba6edff11e"

def httpServer_response_stream_init(cli_sock):
    print('httpServer_response_stream_init()')
    cli_sock.send(b'HTTP/1.1 200 OK\n')
    cli_sock.send(b'Content-Type: multipart/x-mixed-replace;boundary=' + BOUNDARY + b'\n\n')

def httpServer_response_stream_burst(cli_sock):
    print('httpServer_response_stream_burst()')
    length = mycam.read_fifo_length()
    print(length)
    cli_sock.send(b"Content-Type: image/jpeg\n")
    cli_sock.send(b"Content-Length: %d\n\n" % length)
    read_fifo_burst_socket(cli_sock, length)
    cli_sock.send(b"\n--" + BOUNDARY + b"\n");


def httpServer_close(cli_sock):
    cli_sock.disconnect()
    time.sleep(0.05)


#########################################################################

mycam.OV2640_set_JPEG_size(OV2640_320x240)
mycam.set_format(JPEG)
mycam.OV2640_set_Light_Mode(Auto)
mycam.OV2640_set_Color_Saturation(Saturation0)
mycam.OV2640_set_Brightness(Brightness0)
mycam.OV2640_set_Contrast(Contrast0)
mycam.OV2640_set_Special_effects(Normal)
mycam.Camera_Init()
mycam.set_bit(ARDUCHIP_TIM,VSYNC_LEVEL_MASK)

mycam.OV2640_set_JPEG_size(OV2640_176x144)
mycam.set_format(JPEG)
#mycam.Camera_Init()
mycam.set_bit(ARDUCHIP_TIM,VSYNC_LEVEL_MASK)

sock = httpServer_init()
httpServer_listen(sock)

while True:
    cli_sock = httpServer_accept(sock)

    while True:
        has_cmd, cmd = httpServer_read(cli_sock)

        if has_cmd:
            value_command = cmd
            flag_command=1
        if flag_command==1:
            flag_command=0
            #value=int.from_bytes(value_command,"big")
            try:
                value = int(value_command)
                #print(value)
            except:
                value = -1
                httpServer_close(cli_sock)
                break
                
            if value==0:
                mycam.OV2640_set_JPEG_size(OV2640_160x120)
            elif value==1:
                mycam.OV2640_set_JPEG_size(OV2640_176x144)
            elif value==2:
                mycam.OV2640_set_JPEG_size(OV2640_320x240)
            elif value==3:
                mycam.OV2640_set_JPEG_size(OV2640_352x288)
            elif value==4:
                mycam.OV2640_set_JPEG_size(OV2640_640x480)
            elif value==5:
                mycam.OV2640_set_JPEG_size(OV2640_800x600)
            elif value==6:
                mycam.OV2640_set_JPEG_size(OV2640_1024x768)
            elif value==7:
                mycam.OV2640_set_JPEG_size(OV2640_1280x1024)
            elif value==8:
                mycam.OV2640_set_JPEG_size(OV2640_1600x1200)
            elif value==0x10:
                print('single capture')
                mode=1
                start_capture=1
            elif value==0x11:
                mycam.set_format(JPEG)
                mycam.Camera_Init()
                mycam.set_bit(ARDUCHIP_TIM,VSYNC_LEVEL_MASK)
            elif value==0x20:
                print('stream capture')
                mode=2
                start_capture=2
                stop_flag=0
                httpServer_response_stream_init(cli_sock)
            elif value==0x21:
                stop_flag=1
            elif value==0x30:
                mode=3
                start_capture=3
            elif value==0x40:
                mycam.OV2640_set_Light_Mode(Auto)
            elif value==0x41:
                mycam.OV2640_set_Light_Mode(Sunny)
            elif value==0x42:
                mycam.OV2640_set_Light_Mode(Cloudy)
            elif value==0x43:
                mycam.OV2640_set_Light_Mode(Office)
            elif value==0x44:
                mycam.OV2640_set_Light_Mode(Home)
            elif value==0x50:
                mycam.OV2640_set_Color_Saturation(Saturation2)
            elif value==0x51:
                mycam.OV2640_set_Color_Saturation(Saturation1)
            elif value==0x52:
                mycam.OV2640_set_Color_Saturation(Saturation0)
            elif value==0x53:
                mycam.OV2640_set_Color_Saturation(Saturation_1)
            elif value==0x54:
                mycam.OV2640_set_Color_Saturation(Saturation_2)
            elif value==0x60:
                mycam.OV2640_set_Brightness(Brightness2)
            elif value==0x61:
                mycam.OV2640_set_Brightness(Brightness1)
            elif value==0x62:
                mycam.OV2640_set_Brightness(Brightness0)
            elif value==0x63:
                mycam.OV2640_set_Brightness(Brightness_1)
            elif value==0x64:
                mycam.OV2640_set_Brightness(Brightness_2)
            elif value==0x70:
                mycam.OV2640_set_Contrast(Contrast2)
            elif value==0x71:
                mycam.OV2640_set_Contrast(Contrast1)
            elif value==0x72:
                mycam.OV2640_set_Contrast(Contrast0)
            elif value==0x73:
                mycam.OV2640_set_Contrast(Contrast_1)
            elif value==0x74:
                mycam.OV2640_set_Contrast(Contrast_2)
            elif value==0x80:
                mycam.OV2640_set_Special_effects(Antique);
            elif value==0x81:
                mycam.OV2640_set_Special_effects(Bluish);
            elif value==0x82:
                mycam.OV2640_set_Special_effects(Greenish);
            elif value==0x83:
                mycam.OV2640_set_Special_effects(Reddish);
            elif value==0x84:
                mycam.OV2640_set_Special_effects(BW);
            elif value==0x85:
                mycam.OV2640_set_Special_effects(Negative); 
            elif value==0x86:
                mycam.OV2640_set_Special_effects(BWnegative);
            elif value==0x87:
                mycam.OV2640_set_Special_effects(Normal);
                
        if mode==1:
            if start_capture==1:
                mycam.flush_fifo();
                mycam.clear_fifo_flag();
                mycam.start_capture();
                start_capture=0
            if mycam.get_bit(ARDUCHIP_TRIG,CAP_DONE_MASK)!=0:
                #read_fifo_burst_socket(eth, s)
                httpServer_response_single(cli_sock)
                mode=0
        elif mode==2:
            if stop_flag==0:
                if start_capture==2:
                    start_capture=0
                    mycam.flush_fifo();
                    mycam.clear_fifo_flag();
                    mycam.start_capture();
                if mycam.get_bit(ARDUCHIP_TRIG,CAP_DONE_MASK)!=0:
                    httpServer_response_stream_burst(cli_sock)
                    #read_fifo_burst_socket(eth, s)
                    start_capture=2
            else:
                mode=0
                start_capture=0
        
        if mode == 0:
            if prev_mode != mode:
                print('Stop')
                httpServer_close(cli_sock)
                break

        prev_mode = mode

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
W5500以太网主控器以W5500为核心,集成ATmega32u4和W5500以太网芯片的主控板,能够满足一般IOT项目的应用要求。其大小与Leonardo尺寸相等,板载POE供电电源、外接电源稳压电路、SD卡电路以及Leonardo主控单元电路,引出Arduino标准接口。该主控板采用4层布线设计,元件布局紧凑,大大减小了以往Shield+Arduino主板这种可堆叠设计造成的空间浪费问题,小小的尺寸可以为您创造更大的想象空间。 接口定义: 技术参数: 微控制器:Atmel Atmega32u4 外部输入电压(推荐):7V~23V DC 外部输入电压(极限):<24V DC POE输入电压:48V AC/DC(本产品为符合802.3af标准的PD设备) POE单独供电时 5V接口最大输出电流为800MA 数字信号I/O引脚:20(其中6个PWM输出接口) 模拟信号输入引脚:6 I/O接口电流:40 mA Flash容量:32 KB (4K用于bootloader) SRAM静态存储容量:2KB EEPROM存储容量:1KB 时钟频率:16MHz PHY:WIZnet W5500 PHY晶振:25MHz 尺寸:73.5x53.5x15mm 注意事项: 1、W5500 Ethernet with POE Mainboard加入了POE供电电路单元,该高压单元电压高至50V,虽该高压单元电流不至于对人体造成伤害,但由于硬件电路板上存在部分低压电路无法承受如此高的电压,因此请勿在产品工作时用手或其它导体触碰电路板以免造成功能电路的损坏。 2、W5500 Ethernet with POE Mainboard所使用的 变压器 、电源芯片、在高负荷的使用过程中会产生大量的热量,因此请保持使用时的良好散热环境,以免过热造成产品损坏以及小心高温烫伤。 供电方式: POE供电: IEEE 802.3af标准PSE设备供电 USB供电: Micro USB供电 VIN供电: 外接7-23V电源(PCB上有标注) 5V引脚供电: 给5V引脚输入5V电源 电源会自动选择最高电压输入源作为输入。 可能感兴趣的项目设计: W5500以太网开发板设计-支持云服务,附原理图/PCB/示例代码等

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值