🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    Arducam (arduino) Can't find OV2640 module!

    PRODUCTS
    2
    6
    8.7k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • ajb2k3A
      ajb2k3
      last edited by

      @m5stack Have you guys got any idea how to get the arducam esp32 examples working on the M5Camera (2nd version)?

      UIFlow, so easy an adult can learn it!
      If I don't know it, be patient!
      I've ether not learned it or am too drunk to remember it!
      Author of the WIP UIFlow Handbook!
      M5Black, Go, Stick, Core2, and so much more it cant be fit in here!

      1 Reply Last reply Reply Quote 0
      • ajb2k3A
        ajb2k3
        last edited by

        // ArduCAM Mini demo (C)2017 Lee
        // Web: http://www.ArduCAM.com
        // This program is a demo of how to use most of the functions
        // of the library with ArduCAM ESP32 2MP/5MP camera.
        // This demo was made for ArduCAM ESP32 2MP/5MP Camera.
        // It can take photo and send to the Web.
        // It can take photo continuously as video streaming and send to the Web.
        // The demo sketch will do the following tasks:
        // 1. Set the camera to JPEG output mode.
        // 2. if server receives "GET /capture",it can take photo and send to the Web.
        // 3.if server receives "GET /stream",it can take photo continuously as video 
        //streaming and send to the Web.
        
        // This program requires the ArduCAM V4.0.0 (or later) library and ArduCAM ESP32 2MP/5MP camera
        // and use Arduino IDE 1.8.1 compiler or above
        
        #include <WiFi.h>
        #include <Wire.h>
        #include <ESP32WebServer.h>
        #include <ArduCAM.h>
        #include <SPI.h>
        #include "memorysaver.h"
        
        #if !(defined ESP32 )
        #error Please select the ArduCAM ESP32 UNO board in the Tools/Board
        #endif
        //This demo can only work on OV2640_MINI_2MP or ARDUCAM_SHIELD_V2 platform.
        #if !(defined (OV2640_MINI_2MP)||defined (OV5640_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP_PLUS) \
            || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) \
            ||(defined (ARDUCAM_SHIELD_V2) && (defined (OV2640_CAM) || defined (OV5640_CAM) || defined (OV5642_CAM))))
        #error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
        #endif
        
        // set GPIO17 as the slave select :
        const int CS = 17;
        const int CAM_POWER_ON = D10;
        #if defined (OV2640_MINI_2MP) || defined (OV2640_CAM)
          ArduCAM myCAM(OV2640, CS);
        #elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
          ArduCAM myCAM(OV5640, CS);
        #elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
          ArduCAM myCAM(OV5642, CS);
        #endif
        
        //you can change the value of wifiType to select Station or AP mode.
        //Default is AP mode.
        int wifiType = 1; // 0:Station  1:AP
        
        //AP mode configuration
        //Default is arducam_esp8266.If you want,you can change the AP_aaid  to your favorite name
        const char *AP_ssid = "M5Cam"; 
        //Default is no password.If you want to set password,put your password here
        const char *AP_password = NULL;
        
        //Station mode you should put your ssid and password
        const char *ssid = "SSID"; // Put your SSID here
        const char *password = "PASSWORD"; // Put your PASSWORD here
        
        static const size_t bufferSize = 2048;
        static uint8_t buffer[bufferSize] = {0xFF};
        uint8_t temp = 0, temp_last = 0;
        int i = 0;
        bool is_header = false;
        
        ESP32WebServer server(80);
        
        void start_capture(){
          myCAM.clear_fifo_flag();
          myCAM.start_capture();
        }
        
        void camCapture(ArduCAM myCAM){
        WiFiClient client = server.client();
        uint32_t len  = myCAM.read_fifo_length();
        if (len >= MAX_FIFO_SIZE) //8M
        {
          Serial.println(F("Over size."));
        }
        if (len == 0 ) //0 kb
        {
          Serial.println(F("Size is 0."));
        }
        myCAM.CS_LOW();
        myCAM.set_fifo_burst(); 
        if (!client.connected()) return;
        String response = "HTTP/1.1 200 OK\r\n";
        response += "Content-Type: image/jpeg\r\n";
        response += "Content-len: " + String(len) + "\r\n\r\n";
        server.sendContent(response);
        i = 0;
        while ( len-- )
        {
        temp_last = temp;
        temp =  SPI.transfer(0x00);
        //Read JPEG data from FIFO
        if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
        {
        buffer[i++] = temp;  //save the last  0XD9     
        //Write the remain bytes in the buffer
        if (!client.connected()) break;
        client.write(&buffer[0], i);
        is_header = false;
        i = 0;
        myCAM.CS_HIGH();
        break; 
        }  
        if (is_header == true)
        { 
        //Write image data to buffer if not full
        if (i < bufferSize)
        buffer[i++] = temp;
        else
        {
        //Write bufferSize bytes image data to file
        if (!client.connected()) break;
        client.write(&buffer[0], bufferSize);
        i = 0;
        buffer[i++] = temp;
        }        
        }
        else if ((temp == 0xD8) & (temp_last == 0xFF))
        {
        is_header = true;
        buffer[i++] = temp_last;
        buffer[i++] = temp;   
        } 
        } 
        }
        
        void serverCapture(){
          delay(1000);
        start_capture();
        Serial.println(F("CAM Capturing"));
        
        int total_time = 0;
        
        total_time = millis();
        while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK));
        total_time = millis() - total_time;
        Serial.print(F("capture total_time used (in miliseconds):"));
        Serial.println(total_time, DEC);
        
        total_time = 0;
        
        Serial.println(F("CAM Capture Done."));
        total_time = millis();
        camCapture(myCAM);
        total_time = millis() - total_time;
        Serial.print(F("send total_time used (in miliseconds):"));
        Serial.println(total_time, DEC);
        Serial.println(F("CAM send Done."));
        }
        
        void serverStream(){
        WiFiClient client = server.client();
        
        String response = "HTTP/1.1 200 OK\r\n";
        response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
        server.sendContent(response);
        
        while (1){
        start_capture();
        while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK));
        size_t len = myCAM.read_fifo_length();
        if (len >= MAX_FIFO_SIZE) //8M
        {
        Serial.println(F("Over size."));
        continue;
        }
        if (len == 0 ) //0 kb
        {
        Serial.println(F("Size is 0."));
        continue;
        } 
        myCAM.CS_LOW();
        myCAM.set_fifo_burst();
        if (!client.connected()) break;
        response = "--frame\r\n";
        response += "Content-Type: image/jpeg\r\n\r\n";
        server.sendContent(response); 
        while ( len-- )
        {
        temp_last = temp;
        temp =  SPI.transfer(0x00);
        
        //Read JPEG data from FIFO
        if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
        {
        buffer[i++] = temp;  //save the last  0XD9     
        //Write the remain bytes in the buffer
        myCAM.CS_HIGH();; 
        if (!client.connected()) break;
        client.write(&buffer[0], i);
        is_header = false;
        i = 0;
        }  
        if (is_header == true)
        { 
        //Write image data to buffer if not full
        if (i < bufferSize)
        buffer[i++] = temp;
        else
        {
        //Write bufferSize bytes image data to file
        myCAM.CS_HIGH(); 
        if (!client.connected()) break;
        client.write(&buffer[0], bufferSize);
        i = 0;
        buffer[i++] = temp;
        myCAM.CS_LOW();
        myCAM.set_fifo_burst();
        }        
        }
        else if ((temp == 0xD8) & (temp_last == 0xFF))
        {
        is_header = true;
        buffer[i++] = temp_last;
        buffer[i++] = temp;   
        } 
        }
        if (!client.connected()) break;
        }
        }
        void handleNotFound(){
        String message = "Server is running!\n\n";
        message += "URI: ";
        message += server.uri();
        message += "\nMethod: ";
        message += (server.method() == HTTP_GET)?"GET":"POST";
        message += "\nArguments: ";
        message += server.args();
        message += "\n";
        server.send(200, "text/plain", message);
        Serial.println(message);
        
        
        
        if (server.hasArg("ql")){
        int ql = server.arg("ql").toInt();
        #if defined (OV2640_MINI_2MP) || defined (OV2640_CAM)
        myCAM.OV2640_set_JPEG_size(ql);
        #elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)  
        myCAM.OV5640_set_JPEG_size(ql);
        #elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
        myCAM.OV5642_set_JPEG_size(ql);
        #endif
        
        Serial.println("QL change to: " + server.arg("ql"));
        }
        }
        void setup() {
        uint8_t vid, pid;
        uint8_t temp;
          //set the CS as an output:
          pinMode(CS,OUTPUT);
          pinMode(CAM_POWER_ON , OUTPUT);
          digitalWrite(CAM_POWER_ON, HIGH);
        #if defined(__SAM3X8E__)
        Wire1.begin();
        #else
        Wire.begin();
        #endif
        Serial.begin(115200);
        Serial.println(F("ArduCAM Start!"));
        
        
        
        // initialize SPI:
        SPI.begin();
        SPI.setFrequency(4000000); //4MHz
        /*
        //Check if the ArduCAM SPI bus is OK
        myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
        temp = myCAM.read_reg(ARDUCHIP_TEST1);
        if (temp != 0x55){
        Serial.println(F("SPI1 interface Error!"));
        while(1);
        }
        
        //Check if the ArduCAM SPI bus is OK
        myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
        temp = myCAM.read_reg(ARDUCHIP_TEST1);
        if (temp != 0x55){
        Serial.println(F("SPI1 interface Error!"));
        while(1);
        }
        */
        
        #if defined (OV2640_MINI_2MP) || defined (OV2640_CAM)
        //Check if the camera module type is OV2640
        myCAM.wrSensorReg8_8(0xff, 0x01);
        myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
        myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);
        if ((vid != 0x26 ) && (( pid != 0x41 ) || ( pid != 0x42 )))
        Serial.println(F("Can't find OV2640 module!"));
        else
        Serial.println(F("OV2640 detected."));
        Serial.print ("vid = ");
        Serial.println (vid);
        Serial.print ("pid = ");
        Serial.println (pid);
        #elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
        //Check if the camera module type is OV5640
        myCAM.wrSensorReg16_8(0xff, 0x01);
        myCAM.rdSensorReg16_8(OV5640_CHIPID_HIGH, &vid);
        myCAM.rdSensorReg16_8(OV5640_CHIPID_LOW, &pid);
        if((vid != 0x56) || (pid != 0x40))
        Serial.println(F("Can't find OV5640 module!"));
        else
        Serial.println(F("OV5640 detected."));
        
        #elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
        //Check if the camera module type is OV5642
        myCAM.wrSensorReg16_8(0xff, 0x01);
        myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
        myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
        if((vid != 0x56) || (pid != 0x42)){
        Serial.println(F("Can't find OV5642 module!"));
        }
        else
        Serial.println(F("OV5642 detected."));
        #endif
        
        
        //Change to JPEG capture mode and initialize the OV2640 module
        myCAM.set_format(JPEG);
        myCAM.InitCAM();
        #if defined (OV2640_MINI_2MP) || defined (OV2640_CAM)
        myCAM.OV2640_set_JPEG_size(OV2640_320x240);
        #elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
        myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);   //VSYNC is active HIGH
        myCAM.OV5640_set_JPEG_size(OV5640_320x240);
        #elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
        myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);   //VSYNC is active HIGH
        myCAM.OV5640_set_JPEG_size(OV5642_320x240);  
        #endif
        
        myCAM.clear_fifo_flag();
        if (wifiType == 0){
        if(!strcmp(ssid,"SSID")){
        Serial.println(F("Please set your SSID"));
        while(1);
        }
        if(!strcmp(password,"PASSWORD")){
        Serial.println(F("Please set your PASSWORD"));
        while(1);
        }
        // Connect to WiFi network
        Serial.println();
        Serial.println();
        Serial.print(F("Connecting to "));
        Serial.println(ssid);
        
        WiFi.mode(WIFI_STA);
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(F("."));
        }
        Serial.println(F("WiFi connected"));
        Serial.println("");
        Serial.println(WiFi.localIP());
        }else if (wifiType == 1){
        Serial.println();
        Serial.println();
        Serial.print(F("Share AP: "));
        Serial.println(AP_ssid);
        Serial.print(F("The password is: "));
        Serial.println(AP_password);
        
        WiFi.mode(WIFI_AP);
        WiFi.softAP(AP_ssid, AP_password);
        Serial.println("");
        Serial.println(WiFi.softAPIP());
        }
        
        // Start the server
        server.on("/capture", HTTP_GET, serverCapture);
        server.on("/stream", HTTP_GET, serverStream);
        server.onNotFound(handleNotFound);
        server.begin();
        Serial.println(F("Server started"));
        }
        void loop() {
            server.handleClient(); 
          }
        
        

        UIFlow, so easy an adult can learn it!
        If I don't know it, be patient!
        I've ether not learned it or am too drunk to remember it!
        Author of the WIP UIFlow Handbook!
        M5Black, Go, Stick, Core2, and so much more it cant be fit in here!

        m5-docsM 3 Replies Last reply Reply Quote 0
        • m5-docsM
          m5-docs @ajb2k3
          last edited by

          @ajb2k3
          Hi, I have not tried ArduCAM. But once I'm free, I'll try that.

          1 Reply Last reply Reply Quote 0
          • m5-docsM
            m5-docs @ajb2k3
            last edited by

            This post is deleted!
            1 Reply Last reply Reply Quote 0
            • m5-docsM
              m5-docs @ajb2k3
              last edited by

              @ajb2k3
              Here's the pinmap about camera supplied by m5stack.

              https://github.com/m5stack/M5-Schematic/blob/master/Units/m5camera/hardware_diff_with_ESP32CAM_M5Camera.md

              1 Reply Last reply Reply Quote 0
              • ajb2k3A
                ajb2k3
                last edited by ajb2k3

                @watson 在 Arducam (arduino) Can't find OV2640 module! 中说:

                @ajb2k3
                Here's the pinmap about camera supplied by m5stack.

                https://github.com/m5stack/M5-Schematic/blob/master/Units/m5camera/hardware_diff_with_ESP32CAM_M5Camera.md

                That doesn't tie up because the arducams arduino_pin.h has D2 as I/O12
                and slave select as I/O17

                UIFlow, so easy an adult can learn it!
                If I don't know it, be patient!
                I've ether not learned it or am too drunk to remember it!
                Author of the WIP UIFlow Handbook!
                M5Black, Go, Stick, Core2, and so much more it cant be fit in here!

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post