查看: 770|回复: 1

零知增强板-WIFI网络图像传输 OV2460 ESP8266 SPI传输

[复制链接]
  • TA的每日心情
    奋斗
    2018-6-27 00:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-1-11 17:24 | 显示全部楼层 |阅读模式
    本帖最后由 零知实验室-roc 于 2019-1-11 17:26 编辑

    零知增强板-WIFI网络图像传输 OV2460 ESP8266 SPI传输
    http://www.lingzhilab.com/forum. ... d&tid=909&fromuid=2
    (出处: 零知实验室)

    本次实验主要使用零知增强板+ESP8266无线模块+OV2640,将摄像头数据通过WIFI传输到上位机进行显示,程序有很多地方需要优化,这里仅仅抛砖引玉,提供一个网络传输图像的大体思路。
    1、硬件连接
    ESP8266与零知增强板连接如下:(参照之前ESP8266 SPI方式传输文章)

    20190110161519.jpg

    零知增强板与OV2640/OV7670摄像头连接:
    零知增强板上自带摄像头接口,请直接接入摄像头模块,这里使用的是OV2640摄像头进行试验。



    2、软件代码编写

    (1)零知平台代码,本次实验使用UDP进行传输,零知板上的ESP8266作为UDP客户端与上位机进行通信,主要代码如下:

    kittenblock中小学创客名师推荐的图形化编程软件

    /*WiFiSPI example: esp8266连接AP,UDP传输数据
    
    电路连接:
       1. On ESP8266 must be running (flashed) WiFiSPIESP application.
        
       2. Connect the Arduino to the following pins on the esp8266:
    
                ESP8266         |
        GPIO    NodeMCU   Name  |   Lingzhi Enhanced Board
       ===================================
         15       D8       SS   |   53
         13       D7      MOSI  |   51
         12       D6      MISO  |   50
         14       D5      SCK   |   52
    */
    
    #include "WiFiSpi.h"
    #include "WiFiSpiUdp.h" 
    
    #include "camera.h"
    
    #include <fsmc_lcd.h>
    
    CAMERA_DCMI_INTERFACE camera;
    
    #ifdef JPEG_OUTPUT_MODE
    uint32_t jpeg_buf[jpeg_buf_size];        //JPEG数据缓存buf
    extern volatile uint8_t jpeg_data_ok;
    extern volatile uint32_t jpeg_data_len;
    #endif
    
    unsigned int localPort = 8081;
    
    #define        ssid                "lingzhilab"//换成自己的wifi热点
    #define        password        "lingzhilab.com"
    
    char udpServerIP[] = "192.168.0.126";
    int serverPort = 8081;
    
    #define PACKET_SIZE 512
    byte packetBuffer[PACKET_SIZE];
    
    const int UDP_TIMEOUT = 2000;
    
    WiFiSpiUdp udpClient;
    
    WiFiSpiClient client;
    
    uint8_t connect_server_flag = 0;
    
    void setup()
    {
      // initialize serial for debugging
      Serial.begin(9600);
      Serial3.begin(460800);//camera data
      // initialize the ESP module
      WiFiSpi.init();
    
      // 检查是否连接了运行SPIWifi程序的8266模块
      if (WiFiSpi.status() == WL_NO_SHIELD) {
        Serial.println("WiFi shield not present");
        // don't continue
        while (true);
      }
    
      int status = WL_IDLE_STATUS;
      // attempt to connect to WiFi network
      while (status != WL_CONNECTED) {
        Serial.print("Attempting to connect to WPA SSID: ");
        Serial.println(ssid);
        // Connect to WPA/WPA2 network
        status = WiFiSpi.begin(ssid, password);
      }
    
      // you're connected now, so print out the data
      Serial.println("You're connected to the network");
      
      udpClient.begin(localPort);
      
      //camera begin
            camera.begin(OV2640_DEVICE_ID);
    
    #ifdef JPEG_OUTPUT_MODE
            camera.setOutSize(800,600);
            camera.startCapture((uint32_t)&jpeg_buf);
    #endif
    }
    
    void loop()
    {
      sendPacket(udpServerIP); // send an packet to server
    
      // wait ten seconds before asking for the time again
      //delay(100);
    }
    
    int i;
    uint8_t *p;
    
    // send an packet to server 
    void sendPacket(char *server)
    {
            //send camera data process
            {
                    if(jpeg_data_ok==1)        //
                    {
                            p=(uint8_t*)jpeg_buf;
    
    //                        Serial.println("send one frame data...");
                            
                            int times = jpeg_data_len*4/1024;
                            int retlen = jpeg_data_len*4 - 1024*times;
                            int x = 0;
                            for(x=0; x<times; x++)
                            {
                                    udpClient.beginPacket(server, serverPort);
                                    udpClient.write(p+1024*x,1024);
                                    udpClient.endPacket();
                            }
                            
                            udpClient.beginPacket(server, serverPort);
                            udpClient.write(p+1024*x,retlen);
                            udpClient.endPacket();
                            
    
                            jpeg_data_ok=2;        //
                    }
            }
    }


    上述代码中,需要替换自己的WIFI热点名字和密码。

    (2)上位机代码编写:
    参考这里,源码开放下载,根据自己需求进行更改即可:OV2640网络摄像头上位机+串口摄像头 调试工具源码。

    3、测试验证

    将模块按照步骤1正确连线后,将代码验证后上传到零知平台,然后就可以在上位机通过WIFI查看摄像头数据了,这里仅传输JPG格式图像,数据量较少,有时候会出现图像不完整的情况,因此需要一定的优化已达到更好的效果。

    20190111164508.jpg

    附件:完整工程和库请到原文下载。

    上位机源码请到:OV2640网络摄像头上位机+串口摄像头 调试工具源码 这里下载。




  • TA的每日心情
    奋斗
    2018-6-27 00:07
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2019-1-11 17:34 | 显示全部楼层
    硬件连线图:
    IMG_20190111_165340.jpg
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    BlinkerAT固件不能用
    BlinkerAT固件不能用
    如图,在配网的时候就卡住了,再发指令就没用了,固件和库都是今天刚下载的,以前的也不好
    为什么这个库已经装好了可是在调用的时候却没有显示
    为什么这个库已经装好了可
    为什么这个库已经装好了可是在调用的时候却没有显示求解决
    UART 传输(字符)不稳定,如何解决数据错位和乱码的情况
    UART 传输(字符)不稳定
    求助大家,我正在写一个 UART 传输多组数据的项目,想要将一端 Arduino 的多组数据通
    请问这是什么板子?
    请问这是什么板子?
    如图,两年前比赛学校发的,但网上找不到资料,现在翻出来,想问问有人知道它怎么用吗
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表