Arducam (arduino) Can't find OV2640 module!



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



  • // 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(); 
      }
    
    


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



  • This post is deleted!




  • @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