Categories
Arduino Raspberry Technological

Arduino (IoT): Simple Tutorial Robot Autónomo Parte I

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Robot Autónomo: Parte I

Ya sabemos controlar motores y sabemos sentir (ver).  Combinemos estas habilidades para hacer que nuestro robot se mueva.

Requisitos:

  1. Computadora (mac)
  2. Arduino UNO.
  3. Llantas (2)
  4. Motores DC (2)
  5. Sensor Ultrasonico
  6. Motor Mini Servo
  7. Arduino IDE (https://www.arduino.cc/en/Main/Software)

Primero vamos a armar el motor shield con los 2 DC motors y los vamos a hacer funcionar de forma sencilla para ver como operar los motores a través del shield.

Componentes

Arduino Robot Autonomo Movil Motor Shield Tutorial Santiapps Marcio Valenzuela
Arduino Robot Autonomo Movil Motor Shield

El sensor ultrasonico se puede pegar con silicon transparente escolar a la paleta del servo.  El alambrado es sencillo:

  • El servo se conecta a la terminal de Servo2 en la shield
  • El Sensor tiene 4 conexiones
    • Vcc al pin en la shield soldado a la fila 5V
    • GND al pin en la shield soldado a la fila GND
    • Trig al pin en la shield soldado en A5
    • Echo al pin en la shield soldado en A4
  • Luego se conectan los motores DC al shield
    • M1 en la shield al motor derecho
    • M4 en la shield al motor izquierdo
Arduino Tutorial Robot Autonomo Santiapps Marcio Valenzuela
Arduino Tutorial Robot Autonomo

Ahora solo resta conectar la shield sobre la Arduino UNO, el cable USB a la Arduino UNO y subimos la sketch.  Vamos a subir la sketch y no tendremos los motores conectados a las llantas ni mucho menos el chasis.  Solo queremos ver como funciona el sketch.  Una vez cargada a la UNO podremos ver como se mueven los motores.  Se debería mover tanto los DC como el servo.

En el sketch podemos ver:

  • setup() y loop()
  • moveStop(), moveForward() y moveBackward()

Ahora podemos desconectar la UNO y comenzar a conectar los motores a las llantas y la UNO/Shield sobre el battery pack para luego montarlo a un chasis sobre las llantas.

Arduino Tutorial Robot Autonomo Motores Llantas Shield Ultrasonic Sensor Santiapps Marcio Valenzuela
Arduino Tutorial Robot Autonomo Motores Llantas Shield Ultrasonic Sensor

El código para este proyecto seria sencillo:

#include <AFMotor.h>
#define MAX_SPEED_OFFSET 10 // Maxima separation entre motores
#define MAX_SPEED 180 // Maxima velocidad (80% de 256)
AF_DCMotor motor1(1, MOTOR12_1KHZ); // crear motor #1 en M1
AF_DCMotor motor2(4, MOTOR12_1KHZ); // crear motor #2, en M2
String motorSet = "";
int speedSet = 0;
void setup() {
Serial.begin(9600);
moveForward();
delay(2000);
moveStop();
delay(2000);
moveBackward();
delay(2000);
moveStop();
}
void loop() {
}
void moveStop() {
Serial.println("Deteniendo...");
motor1.run(RELEASE);
motor2.run(RELEASE);
} // stop the motors.
void moveForward() {
Serial.println("Avanzando...");
motorSet = "FORWARD";
motor1.run(FORWARD); // Encender hacia el frente
motor2.run(FORWARD); // Encender hacia el frente
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // Acelerar lentamente
{
motor1.setSpeed(speedSet+MAX_SPEED_OFFSET);
motor2.setSpeed(speedSet);
delay(5);
}
}
void moveBackward() {
Serial.println("Retrocediendo...");
motorSet = "BACKWARD";
motor1.run(BACKWARD); // Encender hacia atras
motor2.run(BACKWARD); // Encender hacia atras
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // Acelerar lentamente
{
motor1.setSpeed(speedSet+MAX_SPEED_OFFSET);
motor2.setSpeed(speedSet);
delay(5);
}
}

Al correr este sketch podemos ver que los motores arrancan, se detienen, retroceden y se detienen nuevamente.

Ahora vamos a agregar los ojos, el sensor ultrasonico.

Esta va para largo!



		
Categories
Arduino Raspberry Technological

Arduino (IoT): Simple Tutorial Escribir Data en SD Card

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial SD Card

Almacenar datos en SD.  SDCardReadWrite.ino.

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 con SD
  4. Breadboard
  5. Arduino IDE (https://www.arduino.cc/en/Main/Software)

El código:

#include <SD.h>

File myFile;

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
}

Serial.print(“Initializing SD card…”);
// On the Ethernet Shield, CS is pin 4. It’s set as an output by default.
// Note that even if it’s not used as the CS pin, the hardware SS pin 
// (10 on most Arduino boards, 53 on the Mega) must be left as an output 
// or the SD library functions will not work. 
pinMode(10, OUTPUT);

if (!SD.begin(4)) {
Serial.println(“initialization failed!”);
return;
}
Serial.println(“initialization done.”);

// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
myFile = SD.open(“test.txt”, FILE_WRITE);

// if the file opened okay, write to it:
if (myFile) {
Serial.print(“Writing to test.txt…”);
myFile.println(“testing 1, 2, 3.”);
// close the file:
myFile.close();
Serial.println(“done.”);
} else {
// if the file didn’t open, print an error:
Serial.println(“error opening test.txt”);
}

// re-open the file for reading:
myFile = SD.open(“test.txt”);
if (myFile) {
Serial.println(“test.txt:”);

// read from the file until there’s nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn’t open, print an error:
Serial.println(“error opening test.txt”);
}
}

void loop()
{
// nothing happens after setup
}

Ese proyecto se puede ver aquí:

Ini SD card…initialization done.
Escribimos a prueba.txt…Initializing SD card…initialization done.
Escribimos a prueba.txt…Listo!
prueba.txt:
probando 1, 2, 3.

Arduino Tutorial SD Card Santiapps Marcio Valenzuela
Arduino Tutorial SD Card

Es todo!  Ahora podemos almacenar nuestros datos de interés!

Categories
Arduino Raspberry Technological

Arduino (IoT): Simple Tutorial TFT Pantalla 1.8″ Parte III

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial TFT 1.8″ Parte III

Ver imágenes en una pantalla tft.

Requisitos:

  1. Computadora (mac)
  2. Arduino MEGA (u otra variante Arduino) o incluso Arduino clone, Edison, Raspberry…  Este tutorial en particular usa una Arduino UNO.
  3. MicroSD
  4. 1.8″ TFT
  5. Breadboard
  6. Arduino IDE (https://www.arduino.cc/en/Main/Software)

El código lo bajamos aquí:

Documents/Arduino/Adafruit-ST7735-Library-Master

Las conexiones son:

Shield——————–UNO

SCK – 13

DI –

DO – 11

TCS – 10

Reset(9) – 9

DC – 8

CCS4 – 4

Es importante set los pines en codigo correctamente:

/***************************************************
 ADAFRUIT
 ****************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <SD.h>
#define TFT_CS 10 // Chip select line for TFT display
#define TFT_RST 9 // Reset line for TFT (or see below...)
#define TFT_DC 8 // Data/command line for TFT
#define SD_CS 4 // Chip select line for SD card
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup(void) {
 Serial.begin(9600);
 // Use this initializer if you're using a 1.8" TFT
 tft.initR(INITR_BLACKTAB);
 // Use this initializer (uncomment) if you're using a 1.44" TFT
 //tft.initR(INITR_144GREENTAB);
 Serial.print("Initializing SD card...");
 if (!SD.begin(SD_CS)) {
 Serial.println("failed!");
 return;
 }
 Serial.println("OK!");
 // change the name here!
 bmpDraw("parrot.bmp", 0, 0);
 // wait 5 seconds
 delay(5000);
}
void loop() {
// uncomment these lines to draw bitmaps in different locations/rotations!
/*
 tft.fillScreen(ST7735_BLACK); // Clear display
 for(uint8_t i=0; i<4; i++) // Draw 4 parrots
 bmpDraw("parrot.bmp", tft.width() / 4 * i, tft.height() / 4 * i);
 delay(1000);
 tft.setRotation(tft.getRotation() + 1); // Inc rotation 90 degrees
*/
}
#define BUFFPIXEL 20
void bmpDraw(char *filename, uint8_t x, uint8_t y) {
 File bmpFile;
 int bmpWidth, bmpHeight; // W+H in pixels
 uint8_t bmpDepth; // Bit depth (currently must be 24)
 uint32_t bmpImageoffset; // Start of image data in file
 uint32_t rowSize; // Not always = bmpWidth; may have padding
 uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
 uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer
 boolean goodBmp = false; // Set to true on valid header parse
 boolean flip = true; // BMP is stored bottom-to-top
 int w, h, row, col;
 uint8_t r, g, b;
 uint32_t pos = 0, startTime = millis();
 if((x >= tft.width()) || (y >= tft.height())) return;
 Serial.println();
 Serial.print("Loading image '");
 Serial.print(filename);
 Serial.println('\'');
 // Open requested file on SD card
 if ((bmpFile = SD.open(filename)) == NULL) {
 Serial.print("File not found");
 return;
 }
 // Parse BMP header
 if(read16(bmpFile) == 0x4D42) { // BMP signature
 Serial.print("File size: "); Serial.println(read32(bmpFile));
 (void)read32(bmpFile); // Read & ignore creator bytes
 bmpImageoffset = read32(bmpFile); // Start of image data
 Serial.print("Image Offset: "); Serial.println(bmpImageoffset, DEC);
 // Read DIB header
 Serial.print("Header size: "); Serial.println(read32(bmpFile));
 bmpWidth = read32(bmpFile);
 bmpHeight = read32(bmpFile);
 if(read16(bmpFile) == 1) { // # planes -- must be '1'
 bmpDepth = read16(bmpFile); // bits per pixel
 Serial.print("Bit Depth: "); Serial.println(bmpDepth);
 if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
 goodBmp = true; // Supported BMP format -- proceed!
 Serial.print("Image size: ");
 Serial.print(bmpWidth);
 Serial.print('x');
 Serial.println(bmpHeight);
 // BMP rows are padded (if needed) to 4-byte boundary
 rowSize = (bmpWidth * 3 + 3) & ~3;
 // If bmpHeight is negative, image is in top-down order.
 // This is not canon but has been observed in the wild.
 if(bmpHeight < 0) {
 bmpHeight = -bmpHeight;
 flip = false;
 }
 // Crop area to be loaded
 w = bmpWidth;
 h = bmpHeight;
 if((x+w-1) >= tft.width()) w = tft.width() - x;
 if((y+h-1) >= tft.height()) h = tft.height() - y;
 // Set TFT address window to clipped image bounds
 tft.setAddrWindow(x, y, x+w-1, y+h-1);
 for (row=0; row<h; row++) { // For each scanline...
 if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
 pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
 else // Bitmap is stored top-to-bottom
 pos = bmpImageoffset + row * rowSize;
 if(bmpFile.position() != pos) { // Need seek?
 bmpFile.seek(pos);
 buffidx = sizeof(sdbuffer); // Force buffer reload
 }
 for (col=0; col<w; col++) { // For each pixel...
 // Time to read more pixel data?
 if (buffidx >= sizeof(sdbuffer)) { // Indeed
 bmpFile.read(sdbuffer, sizeof(sdbuffer));
 buffidx = 0; // Set index to beginning
 }
 // Convert pixel from BMP to TFT format, push to display
 b = sdbuffer[buffidx++];
 g = sdbuffer[buffidx++];
 r = sdbuffer[buffidx++];
 tft.pushColor(tft.Color565(r,g,b));
 } // end pixel
 } // end scanline
 Serial.print("Loaded in ");
 Serial.print(millis() - startTime);
 Serial.println(" ms");
 } // end goodBmp
 }
 }
 bmpFile.close();
 if(!goodBmp) Serial.println("BMP format not recognized.");
}
uint16_t read16(File f) {
 uint16_t result;
 ((uint8_t *)&result)[0] = f.read(); // LSB
 ((uint8_t *)&result)[1] = f.read(); // MSB
 return result;
}
uint32_t read32(File f) {
 uint32_t result;
 ((uint8_t *)&result)[0] = f.read(); // LSB
 ((uint8_t *)&result)[1] = f.read();
 ((uint8_t *)&result)[2] = f.read();
 ((uint8_t *)&result)[3] = f.read(); // MSB
 return result;
}

Ese proyecto se puede ver aquí:

Arduino Tutorial Adafruit 1.8" TFT Santiapps Marcio Valenzuela
Arduino Tutorial Adafruit 1.8″ TFT

 

Cool!  Podemos ver datos en una pantalla, usar menus, movernos en la pantalla, seleccionar y almacenar datos.

Translate »