Go Down

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

Veknar

Nous avons donc testé ça :

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;
    }*/


Cependant la photo de s'écrase pas. On a bien une seule photo, mais ça reste la première. :(

john_lenfr

#16
May 06, 2014, 07:47 pm Last Edit: May 06, 2014, 07:56 pm by john_lenfr Reason: 1
Il doit falloir dire de supprimer si existe et après recréer une nouvelle.

ça marche pas comme un copier/coller sous windows.

On écrit les valeurs brutes du fichier image sur un fichier qui s'apelle IMAGE00.JPG comme si s'était un fichier texte.

Donc de toute façon à un moment il faut effacer l'ancien pour créer un nouveau, sinon ça va écrire 2 images à la suite dans le même fichier et l'image s'ouvrira pas correctement:
Code: [Select]
if (SD.exists(picName))
    {
        SD.remove(picName);
    }


Il faut donc prévoir un test:
Si le fichier n'existe pas on crée IMAGE.JPG
Si le fichier IMAGE.JPG existe et qu'il n'est pas vide, on l'efface et on en crée un nouveau pour l'image d'après

DAns le code sur cette ligne c'est indiqué:
Code: [Select]
uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
Vous avez changé à 64 pour voir si c'était mieux?

Veknar

Bonjour,
J'ai donc réalisé la premiére partie grâce à ton code.
Cela fonctionne très bien je n'ai plus d'incrementation de fichiers

Pour la deuxieme partie j'ai essayé avec "64" et cela ne fonctionne pas, tant pis pour la vitesse.

Maintenant je rencontre un problème en voulant fusionner deux programmes: celui de la camera, et un programme de serveur ethernet ( celui-ci crée une page HTML et grace a un bouton on active ou non un servo moteur).
Separement les deux codes fonctionnent, et lors de la fusion, rien ne se passe comme on le souhaite.

je vous met le code ethernet  :D

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
Servo microservo;
int pos = 0;
int fsrAnalogPin2 = A1;

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA6, 0x0D };   //physical mac address
byte ip[] = { 169, 254, 73, 50 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
EthernetServer server(80);                             //server port     
String readString;

void setup() {
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  microservo.attach(9);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {   
      if (client.available()) {
        char c = client.read();
     
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //Serial.print(c);
         }

         //if HTTP request has ended
         if (c == '\n') {         
           Serial.println(readString); //print to serial monitor for debuging
     
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
           client.println();     
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
           client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
           client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
           client.println("<TITLE>AUTOBARRIGO</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
           client.println("<H1>Autobarrigo : simulation de passage</H1>");
           client.println("<hr />");
           client.println("<br />"); 
           client.println("<br />");     
           client.println("<br />");
           client.println("<a href=\"/03312203011191tmm\"\">Ouverture</a>");
           client.println("<br />");
           client.println("</BODY>");
           client.println("</HTML>");
     
          delay(1000);
           //stopping client
          client.stop();
           //controls the Arduino if you press the buttons

           if (readString.indexOf("03312203011191tmm") >0){
                for(pos = 53; pos < 143; pos += 5)  // goes from 0 degrees to 180 degrees
                {                                  // in steps of 1 degree
                  microservo.write(pos);              // tell servo to go to position in variable 'pos'
                  delay(100);                       // waits 15ms for the servo to reach the position
                }
           }
            //clearing string for next read
            readString=""; 
           
         }
       }
    }
}
             
              if (analogRead(fsrAnalogPin2) > 400)
           {
                for(pos = 143; pos>=53; pos-=5)     // goes from 180 degrees to 0 degrees
                {                               
                  microservo.write(pos);              // tell servo to go to position in variable 'pos'
                  delay(100);                       // waits 15ms for the servo to reach the position
                }
           }
           
}

Veknar

Nous, nous demandons si arduino rentre en conflit lorsque l'on utilise les ports RX TX pour faire fonctionner la caméra et la communication ethernet

Si on réalise le montage et qu'on branche l'arduino dessus.
Et qu'on met le programme de la prise de photo, le servomoteur branché en pin digital 9 ne s'active pas (donc normal).
Pareil si on remplace le programme prise de photo par celui de la liaison ethernet et qu'on ne demande pas d'activer le servomoteur, il ne s'active pas (donc normal).

Maintenant lorsqu'on réunit les deux programmes, pour n'en faire plus qu'un, le servomoteur s'active et réalise des micro mouvements incohérent.

Auriez vous une idée du problème ?

Merci.

john_lenfr

Oui tu ne pourras normalement pas faire marcher 2 choses en même temps sur le port série.
Utilises le SoftSerial pour te mettre sur d'autres pins

;)

Veknar

Merci de pour ta reponse  :)

D'origine mon code camera est sur les PIN 2 ET 3 :
Code: [Select]
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);

Mon code ethernet lui utilise les pin 10,11,12,13
Communication d'origine sur le shield.

je ne comprends pas cela devrait fonctionner... non ?  =(


john_lenfr

Et vous avez quoi comme code fusionné, faudrait partir de là pour voir ce qui se passe.

fdufnews

Ôte-moi un doute !!
Vous utilisez les librairies softwareSerial, SD et Ethernet sur une UNO?
Je pense que vous devez très certainement vous trouver à court de mémoire. Toutes ces librairies utilisent des tampons de données de taille conséquente pour assurer les échanges entre le soft et les périphériques.
Pour s'en assurer, voir là:
http://playground.arduino.cc/Code/AvailableMemory
un outil qui permet d'afficher la mémoire disponible.

john_lenfr

Et ça ne pose pas de problème à la carte d'avoir plusieurs protocoles de communication en même temps?
Il ne faut pas les lancer les uns après les autres pour éviter les conflits?

Veknar

Voila le code fusionné ;)
J'ai crée des sous fonctions:
-Prise photo
-Ethernet
Ensuite dans mon LOOP je l'ai envois séparement donc je ne comprends pas...
Pour ce qui est de la memoire je ne pense pas avoir de probleme, sinon je ne pourrais pas le compiler non ?

Code: [Select]
#include <Adafruit_VC0706.h>
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>

Servo microservo;
int pos = 0;
int fsrAnalogPin2 = A1;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA6, 0x0D };   //physical mac address
byte ip[] = { 169, 254, 73, 50 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
EthernetServer server(80);                             //server port     
String readString;
///////////capteur de présence d'entrée/////////////////////
  int fsrAnalogPin = A0;
///////////capteur lumineu + LED flash//////////
int photocellPin = A2; // the cell and 10K pulldown are connected to a0
const int diode_flash=5;
////////////////////////////Fonction prise de photo////////////////////////
void prise_de_photo ()
{
  #define chipSelect 4
  #include <SoftwareSerial.h>
  SoftwareSerial cameraconnection = SoftwareSerial(2, 3); 
  Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);
  #if !defined(SOFTWARE_SPI)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  if(chipSelect != 53) pinMode(53, OUTPUT); // SS on Mega
#else
  if(chipSelect != 10) pinMode(10, OUTPUT); // SS on Uno, etc.
#endif
#endif
 
  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;
  } 
  if (!SD.begin(chipSelect)) {
    return;
  } 
  if (cam.begin()) {

  }
  char *reply = cam.getVersion();
  if (reply == 0) {
   
  }
 
  cam.setImageSize(VC0706_640x480);     
  uint8_t imgsize = cam.getImageSize();

  if (! cam.takePicture())
    Serial.println("Failed to snap!");
  else
    Serial.println("Picture taken!");
 
  // Create an image with the name IMAGExx.JPG
  char filename[13];
    if (SD.exists("IMAGE00.JPG"))
    {
        SD.remove("IMAGE00.JPG");
    }
  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();


  int32_t time = millis();
  // 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
      wCount = 0;
    }
    //Serial.print("Read ");  Serial.print(bytesToRead, DEC); Serial.println(" bytes");
    jpglen -= bytesToRead;
  }
  imgFile.close();


  Serial.println("done!");
  delay (500);
  asm volatile ("  jmp 0");
 
}


//////////////////////////////////void ethernet//////////////
void ethernet ()
{
   // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {   
      if (client.available()) {
        char c = client.read();
     
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //Serial.print(c);
         }

         //if HTTP request has ended
         if (c == '\n') {         
           Serial.println(readString); //print to serial monitor for debuging
     
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
           client.println();     
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
           client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
           client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
           client.println("<TITLE>AUTOBARRIGO</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
           client.println("<H1>Autobarrigo : simulation de passage</H1>");
           client.println("<hr />");
           client.println("<br />"); 
           client.println("<br />");     
           client.println("<br />");
           client.println("<a href=\"/03312203011191tmm\"\">Ouverture</a>");
           client.println("<br />");
           client.println("</BODY>");
           client.println("</HTML>");
     
          delay(1);
           //stopping client
          client.stop();
           //controls the Arduino if you press the buttons

           if (readString.indexOf("03312203011191tmm") >0){
                for(pos = 53; pos < 143; pos += 5)  // goes from 0 degrees to 180 degrees
                {                                  // in steps of 1 degree
                  microservo.write(pos);              // tell servo to go to position in variable 'pos'
                  delay(100);                       // waits 15ms for the servo to reach the position
                }
           }
            //clearing string for next read
            readString=""; 
           
         }
       }
    }
}
             
              if (analogRead(fsrAnalogPin2) > 400)
           {
                for(pos = 143; pos>=53; pos-=5)     // goes from 180 degrees to 0 degrees
                {                               
                  microservo.write(pos);              // tell servo to go to position in variable 'pos'
                  delay(100);                       // waits 15ms for the servo to reach the position
                }
           }
       
}

/////////////////////void setup/////////////////////////////

void setup(void) {
    Ethernet.begin(mac, ip, gateway, subnet);
    delay (1000);
    Serial.begin(9600);         
   
   server.begin();
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
    microservo.attach(9);
    pinMode(diode_flash, OUTPUT);
}

////////////////////////////////LOOP///////////////////////// 


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();
    }
    delay (2000);
ethernet();

Veknar

Pour la freeMemory j'ai fais le test : 1821

fdufnews

#26
May 10, 2014, 06:37 pm Last Edit: May 10, 2014, 06:45 pm by fdufnews Reason: 1

Pour la freeMemory j'ai fais le test : 1821

Gros doutes.
La UNO a 2K de RAM la librairie SD doit déjà avoir un buffer de 512 octets et l'Ethernet doit aussi gérer un buffer de la taille des paquets à manipuler donc je serais très surpris que le programme n'utilise que 200 octets.
Il y a beaucoup de fonctions qui font de l'allocation dynamique de mémoire donc il faut faire afficher la mémoire disponible en différents points du programme.

Il y a aussi des trucs comme ça qui m'interpelle:
Code: [Select]
 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

buffer est un pointeur, un pointeur c'est juste une adresse vers un bloc de données. Qui fait l'allocation des 32 octets, la méthode readPictures()? Parce que si ce n'est pas elle tu piques de la mémoire on ne sait pas trop où. Et si c'est readPictures() qui fait l'allocation, qui est-ce qui rend la mémoire?
edit je viens de regarder la librairie, c'est elle qui gère le buffer.

Veknar

Donc cela viens de quoi exactement ? :)

derder9161

Les librairies utilisent peut être la mémoire RAM dynamiquement.

Veknar

et voyez vous une solution ? :smiley-roll-sweat:

Go Up