Open el-j opened 6 years ago
ok, i managed to get the code from BBBCAM_OV5642_DigitalCamera to find the OV5640. I added the related code from the original ArduCam.h and ArduCam.c to BBBCam.h and BBBCam.c since that i got the output that the cam is found.
now the problem is that my Setup() ends with InitCAM() and seems never to return back to the main-void which will do the capturing logic. any idea why this happens?
/*
============================================================================
Name : BBBCAM_OV5640_DigitalCamera.c
Author : Lee
Version : V1.0
Copyright : ArduCAM demo (C)2015 Lee
Description :
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
// #include "memorysaver.h"
#include "UTFT_SPI.h"
#include "BBBCAM.h"
#define BOOL int
#define TRUE 1
#define FALSE 0
#define OV5640_CHIPID_HIGH 0x300a
#define OV5640_CHIPID_LOW 0x300b
#define OV5640_MAX_FIFO_SIZE 0x7FFFFF //8MByte
#define SHUTTER_MASK 0x02
#define BUF_SIZE 4096
// #define CAM1_CS 0x15c
void setup()
{
uint8_t vid,pid;
uint8_t temp;
UTFT();
ArduCAM(OV5640);
printf("ArduCAM Start!\n");
//Check if the ArduCAM SPI bus is OK
write_reg(ARDUCHIP_TEST1, 0x55);
temp = read_reg(ARDUCHIP_TEST1);
// printf(temp);
if(temp != 0x55)
{
printf("SPI interface Error!\n");
while(1);
}
else
printf("SPI interface SEEMS OK!!!\n");
//Change MCU mode
write_reg(ARDUCHIP_MODE, 0x00);
// InitLCD();
//Check if the camera module type is OV5640
rdSensorReg16_8(OV5640_CHIPID_HIGH, &vid);
printf("vid is : %x",vid);
rdSensorReg16_8(OV5640_CHIPID_LOW, &pid);
printf(" pid is : %x\n",pid);
if((vid != 0x56) || (pid != 0x40))
printf("Can't find OV5640 module!\n");
else
printf("OV5640 detected\n");
//Change to BMP capture mode and initialize the OV5640 module
set_format(JPEG);
InitCAM();
}
int main(void)
{
BOOL isShowFlag = TRUE;
int nmemb = 1;
// set_format(BMP);
setup();
printf("after setup");
printf("after initCam in setup");
while(1)
{
uint8_t buf[256];
static int i = 0;
static int k = 0;
static int n = 0;
uint8_t temp,temp_last;
uint8_t start_capture = 0;
// printf("%d\n",read_reg(ARDUCHIP_TRIG));
// printf("wait trigger");
//Wait trigger from shutter buttom
if(read_reg(ARDUCHIP_TRIG) & SHUTTER_MASK)
{
printf("read something\n");
isShowFlag = FALSE;
write_reg(ARDUCHIP_MODE, 0x00);
set_format(JPEG);
InitCAM();
write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK); //VSYNC is active HIGH
//Wait until buttom released
while(read_reg(ARDUCHIP_TRIG) & SHUTTER_MASK);
delayms(1000);
start_capture = 1;
}
else
{
if(isShowFlag )
{
temp = read_reg(ARDUCHIP_TRIG);
if(!(temp & VSYNC_MASK)) //New Frame is coming
{
// printf("else and isShowFlag");
write_reg(ARDUCHIP_MODE, 0x00); //Switch to MCU
resetXY();
write_reg(ARDUCHIP_MODE, 0x01); //Switch to CAM
while(!(read_reg(ARDUCHIP_TRIG)&0x01)); //Wait for VSYNC is gone
}
}
}
if(start_capture)
{
printf("try to Capture\n");
//Flush the FIFO
flush_fifo();
//Clear the capture done flag
clear_fifo_flag();
//Start capture
capture();
printf("Start Capture\n");
}
if(read_reg(ARDUCHIP_TRIG) & CAP_DONE_MASK)
{
printf("Capture Done!\n");
//Construct a file name
memset(filePath,0,20);
strcat(filePath,"/home/debian/");
getnowtime();
strcat(filePath,nowtime);
strcat(filePath,".bmp");
//Open the new file
fp = fopen(filePath,"w+");
if (fp == NULL)
{
printf("open file failed");
return 0;
}
i = 0;
temp = read_fifo();
//Write first image data to buffer
buf[i++] = temp;
// printf("%d\n",temp);
//Read JPEG data from FIFO
while( (temp != 0xD9) | (temp_last != 0xFF) )
{
temp_last = temp;
temp = read_fifo();
// printf("%d\n",temp);
//Write image data to buffer if not full
if(i < 256)
buf[i++] = temp;
else
{
//Write 256 uint8_ts image data to file
fwrite(buf,256,nmemb,fp);
i = 0;
buf[i++] = temp;
}
}
//Write the remain uint8_ts in the buffer
if(i > 0)
fwrite(buf,i,nmemb,fp);
//Close the file
fclose(fp);
//Clear the capture done flag
clear_fifo_flag();
//Clear the start capture flag
start_capture = 0;
set_format(BMP);
InitCAM();
isShowFlag = TRUE;
}
}
}
What kind of OV5640 module you are using, can you show me your hardware setup?
hi there. thank for your reply. i use the ArduCam Mini-5Mp-Plus Module attached to spi0 and i2c-1.
The fast way to verify if the hardware is good is using Arduino UNO R3 to do the quick. The OV5640 should be well initialized before normal operation, or else it will not output anything. So please try the simple and verified hardware to do the testing before moving to beaglebone board.
ok i tested with arduino uno and everything works fine with the module.
so i will switch back to the beaglebone. any idea how i can get this to work?
The next step I suggest you to use the Arduino to initialize the camera using I2C, and connect the SPI to your Beaglebone board to capture image. So in this case you can isolate the problem that comes from the senor or from the SPI command.
how do i do this? i switched the sda sdl to my arduino and the spi pins to the bone. the app now prints out a spi error when i try to connect:
Make sure two boards share the same ground pin.
ok i try this without any progress. but now i realize the vid and pid changed after this test. how is this possible?
ok this was a strange bug. now they are back to
vid = 0x56
pid = 0x40
but no real image. shouldn't it be possible when the programm is running that i get connection via ArduCAM_Host_V2?
so the programm runs till InitCAM() gets the case for the camera model, but seems to stand still after reaching the first wrSensorReg16_8 methode.
maybe you could be more specific in how i can test the cam with beaglebone and arduino ...
Sorry sir, we didn't work on BBB for a long time, I didn't know what's wrong right now. But you can have a look at the document http://www.arducam.com/downloads/shields/ArduCAM_mini_adapter_ug.pdf we wrote for BBB before.
hello, after a while of experimenting, i have a problem with the arduChip_Trig. when i use the bmp mode, the Arduchip_trig changes from 1 to 8 and leaves the capture while. but when i change the format to JPEG it ARDUCHIP_TRIG does not change. the while loop runs infinit.
while (!(read_reg(ARDUCHIP_TRIG) & CAP_DONE_MASK))
do you have any suggestion why this happens?
i used the // ArduCAM Mini 5MP demo (C)2017 Lee and the newest ArduCam library and add alle the differences to the BBBCam library. i really need to get this to work. so any help or idea why the "capture done" flag does not change will help me.
thank you very much
int main(void)
{
uint8_t temp;
uint8_t tempData = 0, tempData_last = 0;
printf("tut er was ? \n");
setup();
printf("back from setup \n");
delayms(1000);
//VSYNC is active HIGH
// Flush the FIFO
flush_fifo();
// Clear the capture done flag
clear_fifo_flag();
// Start capture
printf("Start capture\n");
temp = read_reg(ARDUCHIP_TRIG);
printf("after capture ARDUCHIP_TRIG %x \n", temp);
capture();
// while (!(read_reg(ARDUCHIP_TRIG) & CAP_DONE_MASK)){
while ((read_reg(ARDUCHIP_TRIG) == 1) ){
temp = read_reg(ARDUCHIP_TRIG);
printf("CAPTURING %x \n", temp);
}
//never reaches this point. stuck in while loop ARDUCHIP_TRIG stays at 1
printf("CAM Capture Done %x \n", temp);
void setup()
{
uint8_t temp;
uint8_t vid,pid;
printf("im Setup \n");
// system(DECONFIGCSPIN);
ArduCAM(OV5640);
write_reg(ARDUCHIP_TEST1, 0x54);
// delayms(1000);
temp = read_reg(ARDUCHIP_TEST1);
printf( "ARDUCHIP_TEST1: %X \n", temp);
write_reg(ARDUCHIP_TEST2, 0x84);
// delayms(1000);
temp = read_reg(ARDUCHIP_TEST2);
printf( "ARDUCHIP_TEST2: %X \n", temp);
printf( "SensorAddress: %X \n", myCAM.sensor_addr);
write_reg(ARDUCHIP_MODE, 0x00);
// delayms(1000);
temp = read_reg(ARDUCHIP_MODE);
printf( "ARDUCHIP_MODE: %X \n", temp);
//
rdSensorReg16_8(OV5640_CHIPID_HIGH, &vid);
printf( "OV5640_CHIPID_HIGH:%x \n", vid);
rdSensorReg16_8(OV5640_CHIPID_LOW, &pid);
printf( "OV5640_CHIPID_LOW:%x \n", pid);
if((vid != 0x56) || (pid != 0x40))
printf("Can't find OV5640 module!");
else
printf("OV5640 detected.\n");
set_format(JPEG);
OV5640_set_JPEG_size(OV5640_320x240);
delayms(1000);
InitCAM();
write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
printf("after set VSYNC active HIGH \n");
// OV5640_set_JPEG_size(OV5640_2592x1944); //2592x1944 QSXGA
// Let auto exposure do it's thing after changing image settings
delayms(1000);
// Clear the capture done flag
clear_fifo_flag();
}
I will dig into the old code on my BBB board and get back to you soon. Can you tell me your email address?
Hi, Do you have any progress here? I'm using PocketBeagle, however, images are broken. I can communicate with a camera with both I2C and SPI:
By Using Arduino Mega ADK and the code from github, I can capture images from the camera.
However, on a BeagleBone (pocket in my case) the captured data is not a relevant jpeg.
i try to use the cam with the pocketbeagle. sadly everything is for 5642 only. is there any idea how i get this to work with the 5640 variant. i just need to capture a picture.
i try to find an answer in the orginal arduino-library. sadly without any luck. someone have any advice how i can use this cam?