Arduino (IoT): Simple Tutorial Camara JPEG IR TTL

JPEG Camera IR TTL Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

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:

  1. Computadora (mac)
  2. Arduino MEGA (u otra variante Arduino) o incluso Arduino clone, Edison, Raspberry…  Este tutorial en particular usa una Arduino MEGA.
  3. Modulo Camara JPEG
  4. Modulo SD para almacenar la imágen
  5. Breadboard
  6. Arduino IDE (https://www.arduino.cc/en/Main/Software)

 

Arduino Tutorial Camara JPEG Santiapps Marcio Valenzuela
Arduino Tutorial Camara JPEG

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 :
/* &lt;1&gt; 0x22 : 160*120
/* &lt;2&gt; 0x11 : 320*240
/* &lt;3&gt; 0x00 : 640*480
/* &lt;4&gt; 0x1D : 800*600
/* &lt;5&gt; 0x1C : 1024*768
/* &lt;6&gt; 0x1B : 1280*960
/* &lt;7&gt; 0x21 : 1600*1200
/************************************/
void SetImageSizeCmd(byte Size){
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x54);
mySerial.write(0x01);
mySerial.write(Size);
}
/*************************************/
/* Set BaudRate :
/* &lt;1&gt; 0xAE : 9600
/* &lt;2&gt; 0x2A : 38400
/* &lt;3&gt; 0x1C : 57600
/* &lt;4&gt; 0x0D : 115200
/* &lt;5&gt; 0xAE : 128000
/* &lt;6&gt; 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()&gt;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()&gt;0)
{
incomingbyte=mySerial.read();
k++;
delayMicroseconds(100);
if((k&gt;5)&amp;&amp;(j&lt;32)&amp;&amp;(!EndFlag))
{
a[j]=incomingbyte;
if((a[j-1]==0xFF)&amp;&amp;(a[j]==0xD9)) //tell if the picture is finished
EndFlag=1;
j++;
count++;
}
}
for(j=0;j&lt;count;j++){
if(a[j]&lt;0x10) Serial.print(“0″);
Serial.print(a[j],HEX); // observe the image through serial port
Serial.print(” “);
}
for(ii=0; ii&lt;count; ii++)
myFile.write(a[ii]);
Serial.println();
}
myFile.close();
Serial.print(“Finished writing data to file”);
while(1);
}
[/code]

Ahora repasemos las conexiones:

Arduino Tutorial Conexiones Camara JPEG Santiapps Marcio Valenzuela
Arduino Tutorial Conexiones Camara JPEG

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í:

FinalWorkingJPEGIRCameraSDSetup

 

Excelente!  Podemos hacer varias cosas con estas imágenes, desde almacenarlas en una SD hasta postearlas a internet!

Arduino (IoT): Simple Tutorial WiFi CC3000 Arduino Shield

Wifi Communication Arduino Santiapps

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial WiFi CC3000 Arduino Shield

En este tutorial exploramos la shield original de Arduino, WiFi, CC3000.  Esta acaba de ser reemplazada (Nov 2015) por la WiFi 101.  Veremos esa en tutoriales futuros.

Ahora veamos los componentes requeridos.

Requisitos:

  1. Computadora (mac)
  2. Arduino UNO
  3. Arduino WiFi Shield CC300
  4. Arduino IDE (https://www.arduino.cc/en/Main/Software)
Arduino Simple Tutorial WiFi CC3000 Shield
Arduino Simple Tutorial WiFi CC3000 Shield

Las shields son muy practicas y fáciles de usar.  Simplemente se conectan sobre los headers de la Arduino UNO.  Cuidado porque hay shields para distintas placas.  Es decir que una shield es especifica para la UNO y no funciona sobre la MEGA y vv.

Ya conectada podemos repasar el código rápidamente para montar un servidor que muestre datos de sensores análogos (o digitales) de nuestra AVR como para montar rápidamente un servidor de datos de sensores.

[code]
#include <SPI.h>
#include <WiFi.h>
char ssid[] = “tuRed”; // La SSID de tu red
char pass[] = “clave”; // La clave de tu red (pass o key)
int keyIndex = 0; // El indice de tu red (para WEP)
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
//Inicializar
Serial.begin(9600);
while (!Serial) {
; // esperar el puerto (necesario solo en Leo)
}
// Verificar presencia de la shield
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println(“No hay shield”);
// No continuar
while(true);
}
// Intentar conexion a red
while ( status != WL_CONNECTED) {
Serial.print(“Conectando a SSID: “);
Serial.println(ssid);
// Conectar a WPA/WPA2 network.
// Si es red WEP: status = WiFi.begin(ssid, keyIndex, key);
status = WiFi.begin(ssid, pass);
// Esperar para negociar conexion
delay(10000);
}
server.begin();
// Iniciar servidor imprimiendo estatus y ‘sirviendolo’
printWifiStatus();
}
void loop() {
// Buscar clientes activamente
WiFiClient client = server.available();
if (client) {
Serial.println(“Cliente Nuevo”);
// Un HTTPRequest termina con una linea en blanco
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// Si se llego al final de una linea (via un caracter de linea nueva
// y la linea esta en blanco, el HTTPRequest ha terminado,
// asi que podemos responder asi…
if (c == ‘\n’ && currentLineIsBlank) {
// Enviar header de HTTPResponse tipico…
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“Connection: close”); // La connexion cerrara luego de la HTTPResponse
client.println(“Refresh: 5”); // Refrescar cada 5 segundos
client.println();
client.println(“<!DOCTYPE HTML>”);
client.println(“<html>”); //tambien puede insertar php
// Escribir en pantalla los niveles de los puertos analogos
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print(“Input analogo “);
client.print(analogChannel);
client.print(” es “);
client.print(sensorReading); //algun sensor conectado a cada pin/channel
client.println(”
“);
}
client.println(</html>”);
break;
}
if (c == ‘\n’) {
// Nueva linea
currentLineIsBlank = true;
}
else if (c != ‘\r’) {
// Nuevo caracter en la linea actual
currentLineIsBlank = false;
}
}
}
// Dar tiempo para que browser reciba datos
delay(1);
// Cerrar conexion
client.stop();
Serial.println(“cliente desonectado”);
}
}
void printWifiStatus() {
// Imprimir ID de la red
Serial.print(“SSID: “);
Serial.println(WiFi.SSID());
// Imprimir IP del dispositivo
IPAddress ip = WiFi.localIP();
Serial.print(“Direccion IP: “);
Serial.println(ip);
// Imprimir senal
long rssi = WiFi.RSSI();
Serial.print(“Potencia de la senal (RSSI):”);
Serial.print(rssi);
Serial.println(” dBm”);
}[/code]