Go Down

Topic: Caméra série SEN0099 (Read 8558 times) previous topic - next topic

Veknar

Bonjour à tous,

Avant de vous présenter mon projet, et mon problème voici le matériel que j'utilise :

- Carte arduino uno (http://www.gotronic.fr/art-carte-arduino-uno-12420.htm)
- Caméra série SEN0099 (http://www.gotronic.fr/art-camera-serie-sen0099-19373.htm)
- Carte ethernet shield (http://www.gotronic.fr/art-module-ethernet-shield-arduino-12425.htm)
- Capteur de force FSR02 (http://www.gotronic.fr/art-capteur-de-force-fsr02-17594.htm)

Le but de mon projet étant de capturer une image avec cette caméra lorsque le capteur de force est activé (pour le moment peu importe le seuil) et d'enregistrer l'image sur la carte microSD de l'ethernet shield.

Le capteur de poids fonctionne très bien, il ne fait donc pas parti de nos soucis :)

Cependant pour ce qui en est de la caméra, nous avons testé une multitude de codes d'exemple, mais sans succès. Aucune communication se fait entre l'arduino et la caméra.

Nous venons vers vous afin de vous demander conseil.

Merci,
Cordialement Veknar.

Nommam

La camera est en RS232, ce qui n'est pas pareil que du serie TTL.

il faut passer par une conversion de niveau de tension a base de MAX232 ou derivé.

http://www.lextronic.fr/P29284-platine-shield-rs232-pour-arduino.html

La RS232, c'est du -12v 12v, le TTL 0 5V, tu as p'tre cramé l'arduino !

Veknar

Notre but c'est de rester complètement autonome du PC, on souhaite communiquer par les ports RX TX de la carte arduino. Ce qui reste de la liaison série ?

D'après la doc technique on peut communiquer en RS232 TTL etc

"Image sensor
Adopting the advanced version of OmniVision CMOS VGA colour sensor on-board making overall
unit a low powered comsuption, and good quality of image. via RS232, RS458, TTL, etc. serial
interface attached external host system's UART port etc."

3Sigma

Je pense que cette doc est plus générale, le fournisseur a peut-être des modules avec plusieurs interfaces.
Mais chez DFRobot (d'où vient la caméra achetée chez Gotronic), il est bien écrit "NOTE: The interface of this module is using RS232 protocol." (http://www.dfrobot.com/index.php?route=product/product&filter_name=SEN0099&product_id=532#.U1fCzFf2pxF).

Veknar

Donc il n'est pas possible de communiquer simplement entre l'arduino uno et cette camera?
Ne peut on pas, passer les ports de l'arduino RX/TX en communication RS232?

3Sigma

Non, il faut faire une conversion de niveau de tension comme indiqué plus haut.

Veknar

Alors, on nous a vendu cette caméra comme étant adaptable arduino uno, mais s'il faut passer par un ordinateur il n'y a plus rien d'autonome et de portatif.

Si je comprends bien nous devons investir dans une autre camera adapté arduino uno?

3Sigma


Alors, on nous a vendu cette caméra comme étant adaptable arduino uno, mais s'il faut passer par un ordinateur il n'y a plus rien d'autonome et de portatif.


Qui ça ?


Si je comprends bien nous devons investir dans une autre camera adapté arduino uno?


Oui, ou bien faire une conversion de niveau de tension.

Veknar

La camera que nous utilisons est une camera qu'il y avait en réserve, c'est certainement pour ça qu'ils nous l'ont donné pour le projet.

Nous avons regardé le module proposé par Nommam.
http://www.lextronic.fr/P29284-platine-shield-rs232-pour-arduino.html

Cependant nous avons des contraintes ergonomique qui nous empêche de cumuler des modules sur l'arduino.

Maintenant est-ce que vous auriez une idée de choix de camera, qui serait le plus approprié pour notre projet ?
C'est à dire prendre une image avec la camera, envoyé via les ports RX TX de l'arduino et stocker dans la carte microSD du module ethernet shield.

3Sigma

Il y a ça par exemple, avec un tutoriel en prime:
http://www.adafruit.com/products/397

Veknar

Nous avions également trouvé cette caméra.
Nous la commandons et reviendrons vers vous pour vous donner des nouvelles ;)

A bientôt et merci pour vos conseils.

Veknar

Bonsoir,
Alors, nous avons bien reçu la caméra (http://www.adafruit.com/products/397) cela fonctionne plutôt bien.

Deux petit soucis :
- Le premier : la rapidité, nous ne voyons pas comment faire fonctionner plus rapidement le processus, sans diminuer les résolutions. (La photo s'enregistre en 15s :()
- Le second : les photos s'incrémentent automatiquement et nous souhaiterions que les photos s'écrasent au fur et à mesure. (On veut qu'il n'y ait qu'une seule photo à chaque fois dans la SDcard, toujours le même nom.)

J'aimerai savoir si vous auriez une idée la dessus ?
Cordialement.

PS : voici notre code en pièce jointe (on retrouve un capteur "fsrAnalogPin" et une photoresistance "photocellPin")

Code: [Select]
#include <Adafruit_VC0706.h>
#include <SD.h>
#include <SoftwareSerial.h>         
#define chipSelect 4
#if ARDUINO >= 100
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif
Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

///////////capteur de présence d'entrée/////////////////////
  int fsrAnalogPin = A0; // FSR branché sur pin Analog 0
 
///////////capteur lumineu + LED flash//////////
int photocellPin = A2; // the cell and 10K pulldown are connected to a0
const int diode_flash=5;



void setup(void) {
    Serial.begin(9600); // Envoi de message de déboggage sur connexion série           
    pinMode(diode_flash, OUTPUT);
}


void prise_de_photo ()
{
         
     Serial.println("VC0706 Camera snapshot test");
 
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  } 
 
  // Try to locate the camera
  if (cam.begin()) {
    Serial.println("Camera Found:");
  } else {
    Serial.println("No camera found?");
    return;
  }
  // Print out the camera version information (optional)
  char *reply = cam.getVersion();
  if (reply == 0) {
    Serial.print("Failed to get version");
  } else {
    Serial.println("-----------------");
    Serial.print(reply);
    Serial.println("-----------------");
  }

  // Set the picture size - you can choose one of 640x480, 320x240 or 160x120
  // Remember that bigger pictures take longer to transmit!
 
  cam.setImageSize(VC0706_640x480);        // biggest
  //cam.setImageSize(VC0706_320x240);        // medium
  //cam.setImageSize(VC0706_160x120);          // small

  // You can read the size back from the camera (optional, but maybe useful?)
  uint8_t imgsize = cam.getImageSize();
  Serial.print("Image size: ");
  if (imgsize == VC0706_640x480) Serial.println("640x480");
 
 


  if (! cam.takePicture())
    Serial.println("Failed to snap!");
  else
    Serial.println("Picture taken!");
 
  // Create an image with the name IMAGExx.JPG
  char filename[13];
  strcpy(filename, "IMAGE00.JPG");
  for (int i = 0; i < 100; i++) {
    filename[5] = '0' + i/10;
    filename[6] = '0' + i%10;
    // create if does not exist, do not open existing, write, sync after write
    if (! SD.exists(filename)) {
     break;
    }
}
 
  // Open the file for writing
  File imgFile = SD.open(filename, FILE_WRITE);

  // Get the size of the image (frame) taken 
  uint16_t jpglen = cam.frameLength();
  Serial.print("Storing ");
  Serial.print(jpglen, DEC);
  Serial.print(" byte image.");

  int32_t time = millis();
  pinMode(8, OUTPUT);
  // Read all the data up to # bytes!
  byte wCount = 0; // For counting # of writes
  while (jpglen > 0) {
    // read 32 bytes at a time;
    uint8_t *buffer;
    uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
    buffer = cam.readPicture(bytesToRead);
    imgFile.write(buffer, bytesToRead);
    if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up
      Serial.print('.');
      wCount = 0;
    }
    //Serial.print("Read ");  Serial.print(bytesToRead, DEC); Serial.println(" bytes");
    jpglen -= bytesToRead;
  }
  imgFile.close();

  time = millis() - time;
  Serial.println("done!");
  Serial.print(time);
  Serial.println(" ms elapsed");
  delay (500);
  asm volatile ("  jmp 0");
 
}










void loop(void) {
    digitalWrite(diode_flash,LOW);
  if(analogRead(fsrAnalogPin) >= 400 && analogRead(photocellPin) <= 200)
    {
    digitalWrite(diode_flash,HIGH); 
    prise_de_photo();
    digitalWrite(diode_flash,LOW);
    }
  else if(analogRead(fsrAnalogPin) >= 400 && analogRead(photocellPin) >= 200)
    {
    digitalWrite(diode_flash,LOW);   
    prise_de_photo();
    }


john_lenfr

#12
May 06, 2014, 05:51 pm Last Edit: May 06, 2014, 05:53 pm by john_lenfr Reason: 1
Bizzare que cela prenne autant de temps en effet dans l'exemple Adafruit ça prend un peut plus que 2s:


Bon maitenant c'est vrai qu'ils précisent que:
Quote
This is a pretty slow UART camera, it can take up to 30 seconds to transfer an image! It is meant for snapshots or time-lapse type photography, not for any kind of real-time analysis


Pour l'écrasement des photos il faut supprimer la partie création de l'image par incrémentation et laisser un nom identique à chaque fois, dans cette partie:
Code: [Select]
// Create an image with the name IMAGExx.JPG
  char filename[13];
  strcpy(filename, "IMAGE00.JPG");
  for (int i = 0; i < 100; i++) {
    filename[5] = '0' + i/10;
    filename[6] = '0' + i%10;
    // create if does not exist, do not open existing, write, sync after write
    if (! SD.exists(filename)) {
     break;
    }

Veknar

Peut être parce que la photo doit s'enregistrer dans la SD du module shield.
Qu'en penses tu ?

john_lenfr

#14
May 06, 2014, 05:57 pm Last Edit: May 06, 2014, 07:41 pm by john_lenfr Reason: 1
Je sais pas trop moi non plus, sans baisser la résolution je vois pas trop.

En tout cas NE changez PAS le baudrate apparemment c'est pas une bonne idée.

Go Up