
Tutorial Camara JPEG IR TTL
Si vamos a tener un robot explorador, a veces vamos a querer ver lo que el ve. Podemos perfectamente agregar un modulo para tomar fotos. En este tutorial veremos como controlar un modulo para toma de fotos, una Camara JPEG. TutorialJPEGIRTTLCamerav2.
Requisitos:
- Computadora (mac)
- Arduino MEGA (u otra variante Arduino) o incluso Arduino clone, Edison, Raspberry… Este tutorial en particular usa una Arduino MEGA.
- Modulo Camara JPEG
- Modulo SD para almacenar la imágen
- Breadboard
- Arduino IDE (https://www.arduino.cc/en/Main/Software)

Veamos el código:
[code]
//*******************************************************
// www.linksprite.com
// Note:
// 1. SD must be formated to FAT16
// 2. As the buffer of softserial has 64 bytes,
// so the code read 32 bytes each time
// 3. Please add the libaray to the lib path
//
// * SD card attached to SPI bus as follows:
// * MOSI – pin 11
// * MISO – pin 12
// * CLK – pin 13
// * CS – pin 4
//*******************************************************
#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>
SoftwareSerial mySerial(5,6); // Set Arduino pin 4 and 5 as softserial
byte ZERO = 0x00;
byte incomingbyte;
long int j=0,k=0,count=0,i=0x0000;
uint8_t MH,ML;
boolean EndFlag=0;
File myFile;
void SendResetCmd(){
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x26);
mySerial.write(ZERO);
}
/*************************************/
/* Set ImageSize :
/* <1> 0x22 : 160*120
/* <2> 0x11 : 320*240
/* <3> 0x00 : 640*480
/* <4> 0x1D : 800*600
/* <5> 0x1C : 1024*768
/* <6> 0x1B : 1280*960
/* <7> 0x21 : 1600*1200
/************************************/
void SetImageSizeCmd(byte Size){
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x54);
mySerial.write(0x01);
mySerial.write(Size);
}
/*************************************/
/* Set BaudRate :
/* <1> 0xAE : 9600
/* <2> 0x2A : 38400
/* <3> 0x1C : 57600
/* <4> 0x0D : 115200
/* <5> 0xAE : 128000
/* <6> 0x56 : 256000
/*************************************/
void SetBaudRateCmd(byte baudrate){
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x24);
mySerial.write(0x03);
mySerial.write(0x01);
mySerial.write(baudrate);
}
void SendTakePhotoCmd(){
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x36);
mySerial.write(0x01);
mySerial.write(ZERO);
}
void SendReadDataCmd(){
MH=i/0x100;
ML=i%0x100;
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x32);
mySerial.write(0x0c);
mySerial.write(ZERO);
mySerial.write(0x0a);
mySerial.write(ZERO);
mySerial.write(ZERO);
mySerial.write(MH);
mySerial.write(ML);
mySerial.write(ZERO);
mySerial.write(ZERO);
mySerial.write(ZERO);
mySerial.write(0x20);
mySerial.write(ZERO);
mySerial.write(0x0a);
i+=0x20;
}
void StopTakePhotoCmd(){
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x36);
mySerial.write(0x01);
mySerial.write(0x03);
}
void setup(){
Serial.begin(38400);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print(“Initializing SD card…”);
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println(“initialization failed!”);
return;
}
Serial.println(“initialization done.”);
Serial.println(“please waiting ….”);
}
void loop(){
byte a[32];
int ii;
mySerial.begin(115200);
delay(200);
SendResetCmd();//Wait 2-3 second to send take picture command
delay(2000);
SetBaudRateCmd(0x2A);
delay(500);
mySerial.begin(38400);
delay(100);
SetImageSizeCmd(0x21);
delay(100);
SendTakePhotoCmd();
delay(3000);
while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
}
myFile = SD.open(“picture.jpg”, FILE_WRITE);
while(!EndFlag)
{
j=0;
k=0;
count=0;
SendReadDataCmd();
delay(5);
while(mySerial.available()>0)
{
incomingbyte=mySerial.read();
k++;
delayMicroseconds(100);
if((k>5)&&(j<32)&&(!EndFlag))
{
a[j]=incomingbyte;
if((a[j-1]==0xFF)&&(a[j]==0xD9)) //tell if the picture is finished
EndFlag=1;
j++;
count++;
}
}
for(j=0;j<count;j++){
if(a[j]<0x10) Serial.print(“0″);
Serial.print(a[j],HEX); // observe the image through serial port
Serial.print(” “);
}
for(ii=0; ii<count; ii++)
myFile.write(a[ii]);
Serial.println();
}
myFile.close();
Serial.print(“Finished writing data to file”);
while(1);
}
[/code]
Ahora repasemos las conexiones:

En este caso consultamos el manual del modulo y notamos que el cable rojo no es Vcc. Así que hay que tener cuidado.
Ese proyecto se puede ver aquí:
Excelente! Podemos hacer varias cosas con estas imágenes, desde almacenarlas en una SD hasta postearlas a internet!