Arduino Es PDF
Arduino Es PDF
#arduino
Tabla de contenido
Acerca de 1
Observaciones 2
¿Qué es Arduino? 2
Versiones 2
Examples 2
Mínimo 2
Parpadeo 3
Preparar 5
Subir 7
Monitor de serie 7
Examples 9
cardInfo 9
Listfiles 14
Examples 18
Instalación en Windows 18
Instalación en Fedora 18
Instalando en Ubuntu 18
Instalación en macOS 18
Sintaxis 19
Parámetros 19
Examples 19
Uso básico 19
Capítulo 5: Bibliotecas 21
Introducción 21
Examples 21
Capítulo 6: Bucles 24
Sintaxis 24
Observaciones 24
Examples 24
Mientras 24
por 25
Control de flujo 26
Sintaxis 27
Parámetros 27
Observaciones 27
Examples 27
Sintaxis 29
Parámetros 29
Observaciones 29
Examples 29
Observaciones 32
Examples 32
Introducción 33
Examples 33
Esclavos múltiples 33
Introducción 36
Examples 36
Sintaxis 44
Parámetros 44
Observaciones 44
Examples 45
Arduino: 46
Pitón: 47
Observaciones 48
Actas 48
Conceptos básicos: inicialice el SPI y un pin de selección de chip, y realice una transfer 49
Sintaxis 51
Observaciones 51
Examples 51
Sintaxis 53
Parámetros 53
Observaciones 53
Examples 53
Pulsador de lectura 53
Observaciones 55
Examples 55
Sintaxis 57
Observaciones 57
Detalles de implementacion 57
Examples 58
Parámetros 62
Observaciones 62
Examples 62
Sintaxis 64
Parámetros 64
Observaciones 64
Examples 64
Examples 66
Arduino Uno R3 66
Examples 69
Los basicos 69
La construcción 70
El código 70
Parámetros 73
Examples 73
Sintaxis 74
Examples 74
Escribir a pin 74
Capítulo 24: Servo 75
Introducción 75
Sintaxis 75
Examples 75
Observaciones 76
Preparar 76
Conexiones 76
Consideraciones de depuración 78
Configuración de software 80
Beneficios 81
Examples 82
Examples 83
Crear variable 83
Tipos de variables 83
Creditos 85
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: arduino
It is an unofficial and free arduino ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official arduino.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/es/home 1
Capítulo 1: Empezando con el arduino
Observaciones
¿Qué es Arduino?
Arduino es una plataforma electrónica de código abierto basada en hardware y software fáciles de
usar.
Versiones
1.0.0 2016-05-08
Examples
Mínimo
Aquí está el boceto de Arduino 'mínimo'. Esto se puede cargar en el IDE de Arduino
seleccionando File > Examples > 01. Basics > Bare Minimum .
void setup() {
// put your setup code here, to run once
}
void loop() {
// put your main code here, to run repeatedly
}
El código en la función de setup() se ejecutará una vez cuando se inicie el programa. Esto es útil
para configurar pines de E / S, inicializar variables, etc. El código en la función loop() se ejecutará
repetidamente hasta que Arduino esté apagado o se cargue un nuevo programa. Efectivamente,
el código anterior se ve así en la biblioteca de tiempo de ejecución de Arduino:
https://riptutorial.com/es/home 2
setup();
while(1) {
loop();
}
Parpadeo
Aquí hay un breve ejemplo que muestra las funciones setup() y loop() . Esto se puede cargar en
el IDE de Arduino seleccionando File > Examples > 01. Basics > Blink . ( Nota: la mayoría de las
placas Arduino ya tienen un LED conectado al pin 13, pero es posible que necesite agregar un
LED externo para ver los efectos de este boceto).
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}
El fragmento anterior:
Sin esto, podría configurarse en una entrada, lo que haría que el LED no funcionara;
sin embargo, una vez que se establece como salida, seguirá siendo así, por lo que
solo debe hacerse una vez que se inicie el programa.
Debido a que loop() se ejecuta repetidamente durante el tiempo que se ejecuta el programa, el
LED se encenderá y apagará con un período de 2 segundos (1 segundo encendido, 1 segundo
https://riptutorial.com/es/home 3
apagado). Este ejemplo se basa en el Arduino Uno y cualquier otra placa que ya tenga un LED
conectado al Pin 13. Si la placa que se está utilizando no tiene un LED integrado en ese pin, se
puede conectar una externa.
Más información sobre el tiempo (por ejemplo, retrasos y tiempo de medición): Gestión del tiempo
https://riptutorial.com/es/home 4
https://riptutorial.com/es/home 5
emtpy setup() y loop() . Esto es suficiente para subir a un tablero Arduino, pero no hará nada en
absoluto. El boceto de ejemplo "Blink" funciona como una prueba simple cuando se usa por
primera vez una placa Arduino. Vaya a Archivo → Ejemplos → 01. Básicas → Parpadeo. Esto
abrirá una nueva ventana con el boceto de Blink.
Seleccione el puerto COM para su tablero. La mayoría de las tarjetas compatibles con Aurduino
https://riptutorial.com/es/home 6
crearán un puerto COM falso, que se utiliza para la comunicación en serie (depuración) y para la
programación de la tarjeta. COM 1 es por lo general ya presente, y su junta directiva creará uno
nuevo, por ejemplo COM 4. Seleccione esto desde Herramientas → → Puerto COM 4 (u otro
número de COM).
Subir
Ya estás listo para subir Blink. Haga clic en el botón Cargar o seleccione Boceto → Cargar. El
boceto se compilará, luego, cárguelo en su tablero Arduino. Si todo funcionó, el LED de a bordo
comenzará a parpadear cada segundo.
Monitor de serie
En Arduino IDE ypu hava un monitor serie. Para abrirlo use el botón monitor serie en el lado
derecho de la ventana.
Asegúrese de que el código esté cargado antes de abrir el monitor. ¡La carga y el monitor no se
ejecutarán al mismo tiempo!
También puede usar este código para configurar un LED con un interruptor de botón con una
resistencia de extracción, esto podría ser preferiblemente con el siguiente paso después de
configurar el controlador de LED inicial
void setup()
{
// initialize the LED pin as an output:
pinMode(13, OUTPUT); // You can set it just using its number
// initialize the pushbutton pin as an input:
pinMode(2, INPUT);
}
void loop()
{
// read the state of the pushbutton value:
buttonState = DigitalRead(2);
https://riptutorial.com/es/home 7
// check if the pushbutton is pressed.
// If it's not, the buttonState is HIGH : if (buttonState == HIGH)
{
// turn LED off:
digitalWrite(13, LOW);
}
else
{
// turn LED off:
digitalWrite(13, HIGH);
}
}
https://riptutorial.com/es/home 8
Capítulo 2: Almacenamiento de datos
Examples
cardInfo
/*
SD card test
This example shows how use the utility libraries on which the'
SD library is based in order to get info about your SD card.
Very useful for testing a card when you're not sure whether its working or not.
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
** CS - depends on your SD card shield or module.
Pin 4 used here for consistency with other Arduino examples
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("\nInitializing SD card...");
https://riptutorial.com/es/home 9
Serial.println("* is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
return;
} else {
Serial.println("Wiring is correct and a card is present.");
}
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
void loop(void) {
https://riptutorial.com/es/home 10
Registrador de datos de tarjeta SD
/*
SD card datalogger
This example shows how to log data from three analog sensors
to an SD card using the SD library.
The circuit:
* analog sensors on analog ins 0, 1, and 2
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
#include <SPI.h>
#include <SD.h>
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...");
void loop()
{
// make a string for assembling the data to log:
String dataString = "";
https://riptutorial.com/es/home 11
}
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
/*
SD card file dump
This example shows how to read a file from the SD card using the
SD library and send it over the serial port.
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
#include <SPI.h>
#include <SD.h>
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...");
https://riptutorial.com/es/home 12
// 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;
}
Serial.println("card initialized.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt");
void loop()
{
/*
SD card basic file example
*/
#include <SPI.h>
#include <SD.h>
File myFile;
void setup()
{
// Open serial communications and wait for port to open:
https://riptutorial.com/es/home 13
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
if (SD.exists("example.txt")) {
Serial.println("example.txt exists.");
}
else {
Serial.println("example.txt doesn't exist.");
}
if (SD.exists("example.txt")) {
Serial.println("example.txt exists.");
}
else {
Serial.println("example.txt doesn't exist.");
}
}
void loop()
{
// nothing happens after setup finishes.
}
Listfiles
/*
Listfiles
The circuit:
https://riptutorial.com/es/home 14
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
#include <SPI.h>
#include <SD.h>
File root;
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...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("done!");
}
void loop()
{
// nothing happens after setup finishes.
}
https://riptutorial.com/es/home 15
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
/*
SD card read/write
This example shows how to read and write data to and from an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
#include <SPI.h>
#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...");
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);
https://riptutorial.com/es/home 16
// 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");
}
void loop()
{
// nothing happens after setup
}
https://riptutorial.com/es/home 17
Capítulo 3: Arduino IDE
Examples
Instalación en Windows
1. Vaya a https://www.arduino.cc/en/Main/Software
2. Haga clic en el enlace "Windows Installer"
3. Sigue las instrucciones
1. Vaya a https://www.arduino.cc/en/Main/Software
2. Haga clic en el enlace "Windows ZIP for no admin install"
3. Extraer el archivo a una carpeta
4. Abra la carpeta, y haga doble clic en Arduino.exe
Instalación en Fedora
Instalando en Ubuntu
Instalación en macOS
1. Vaya a https://www.arduino.cc/en/Main/Software
2. Haga clic en el enlace de Mac OS X
3. Descomprima el archivo .zip .
4. Mueve la aplicación Arduino a Applications .
https://riptutorial.com/es/home 18
Capítulo 4: Biblioteca de cristal líquido
Introducción
La Liquid Crystal Library de Arduino es una biblioteca para controlar pantallas LCD compatibles
con el controlador Hitachi HD44780, que se caracteriza por su interfaz de 16 pines. Los 16 pines
pueden estar conectados a través de una interfaz I2C. Estas pantallas contienen una matriz de
bloques de 5x7 píxeles utilizados para mostrar caracteres o pequeñas imágenes monocromáticas.
Las pantallas suelen tener nombres de acuerdo con la cantidad de filas y columnas que tienen,
por ejemplo, 16x2 o 1602 para 16 columnas y 2 filas, y 20x4 o 2004 para 20 columnas y 4 filas.
Sintaxis
• #include <LiquidCrystal.h> // Incluye la biblioteca
• LiquidCrystal (rs, enable, d4, d5, d6, d7) //
• LiquidCrystal (rs, rw, enable, d4, d5, d6, d7)
• LiquidCrystal (rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
• LiquidCrystal (rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
Parámetros
Parámetro
Detalles
LiquidCrystal
Los números de los pines Arduino que están conectados a los pines de
datos correspondientes en la pantalla LCD. d0, d1, d2 y d3 son
d0 - d7
opcionales; si se omite, la pantalla LCD se controlará utilizando solo las
cuatro líneas de datos (d4, d5, d6, d7).
Examples
Uso básico
/*
https://riptutorial.com/es/home 19
Wiring:
LCD pin 1 (VSS) -> Arduino Ground
LCD pin 2 (VDD) -> Arduino 5V
LCD pin 3 (VO) -> Arduino Ground
LCD pin 4 (RS) -> Arduino digital pin 12
LCD pin 5 (RW) -> Arduino Ground
LCD pin 6 (E) -> Arduino digital pin 11
LCD pin 11 (D4) -> Arduino digital pin 5
LCD pin 12 (D5) -> Arduino digital pin 4
LCD pin 13 (D6) -> Arduino digital pin 3
LCD pin 14 (D7) -> Arduino digital pin 2
*/
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// start writing on the first row and first column.
lcd.setCursor(0, 0);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
// No need to do anything to keep the text on the display
}
https://riptutorial.com/es/home 20
Capítulo 5: Bibliotecas
Introducción
Aquí encontrarás documentación sobre:
Examples
Instalar bibliotecas con el administrador de bibliotecas
Una vez que haya abierto el Administrador de bibliotecas, puede usar el menú en la
parte superior para filtrar los resultados.
• Haga clic en la biblioteca que desee, seleccione una versión en el menú desplegable y
haga clic en instalar.
https://riptutorial.com/es/home 21
Ahora su biblioteca está instalada. Para usarlo, debes incluirlo en tu boceto.
Una vez que haya instalado una biblioteca, debe incluirla en su boceto para poder usarla.
• Abra el menú Boceto> Incluir biblioteca y haga clic en la biblioteca que desea incluir.
https://riptutorial.com/es/home 22
• Ahora, el IDE ha generado las etiquetas de inclusión requeridas en su código.
https://riptutorial.com/es/home 23
Capítulo 6: Bucles
Sintaxis
• para (declaración, condición, iteración) {}
• while (condición) {}
• do {} while (condicion)
Observaciones
General Remark Si pretende crear un bucle para esperar a que suceda algo, es probable que esté
en el camino equivocado aquí. Más bien, recuerde que todo el código después de la configuración
() se ejecuta desde un método llamado bucle (). Entonces, si necesita esperar por algo, es más
fácil no hacer nada (o solo otras cosas independientes) y volver para verificar la condición de
espera la próxima vez.
Examples
Mientras
Este bucle se ejecutará 100 veces, cada vez que se agregue 1 a la variable num :
int num = 0;
while (num < 100) {
// do something
num++;
}
https://riptutorial.com/es/home 24
while (true) {
// do something
}
for (;;) {
// do something
}
por
forbucles son sintaxis simplificada para un patrón de bucle muy común, lo que podría llevarse a
cabo en más líneas con un while de bucle.
El siguiente es un ejemplo común de un bucle for , que se ejecutará 100 veces y luego se
detendrá.
int num = 0;
while (num < 100) {
// do something
num++;
}
for (;;) {
// do something
}
while (true) {
// do something
}
Un do while bucle es lo mismo que un while de bucle, excepto que está garantizado para ejecutar
al menos una vez.
int i = 0;
https://riptutorial.com/es/home 25
do {
i++;
} while (i < 100);
int i = 0;
do {
i++;
} while (i < 0);
Si el bucle de arriba eran meramente un while bucle, se ejecutaría 0 veces, porque la condición
evaluaría a false antes de la primera iteración. Pero como es un bucle do while while, se ejecuta
una vez, luego verifica su condición antes de ejecutarse nuevamente.
Control de flujo
break; saldrá del bucle actual y no ejecutará más líneas dentro de ese bucle.
no ejecutará ningún código más dentro de la iteración actual del bucle, pero
continue;
permanecerá en el bucle.
El siguiente bucle se ejecutará 101 veces (i = 0, 1, ..., 100) en lugar de 1000, debido a la
instrucción break :
El siguiente bucle dará como resultado que el valor de j sea 50 en lugar de 100, debido a la
instrucción continue :
int j=0;
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) { // if `i` is even
continue;
}
j++;
}
// j has the value 50 now.
https://riptutorial.com/es/home 26
Capítulo 7: Cómo almacenar variables en
EEPROM y usarlas para almacenamiento
permanente
Sintaxis
• EEPROM.write (dirección, valor); // (Almacenar variables en EEPROM en una dirección
particular)
• EEPROM.read (dirección); // (Recuperar valores de EEPROM y leer datos almacenados en
EEPROM)
Parámetros
Parámetros de
Detalle
EEPROM.write
Parámetros de
Detalle
EEPROM.Leer
Observaciones
Las direcciones permitidas varían según el hardware.
fuente
Examples
Almacene una variable en EEPROM y luego recupérela e imprima en la
https://riptutorial.com/es/home 27
pantalla
#include <EEPROM.h>
// Stores value in a particular address in EEPROM. There are almost 512 addresses present.
// ---------
// Retrieves value from a particular address in EEPROM
// Retrieve value from address 0 in EEPROM
int retrievedVal = EEPROM.read(0); // Retrieves value stored in 0 address in
// EEPROM
https://riptutorial.com/es/home 28
Capítulo 8: Cómo Python se integra con
Arduino Uno
Sintaxis
• Serial.begin(baudrate) // Set baud rate (bits per second) for serial data transmission
• Serial.println(value) // Print data to serial port followed by Carriage Return \r and
Newline character \n
• serial.Serial((port=None, baudrate=9600, bytesize=EIGHTBITS, parity=PARITY_NONE,
stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, write_timeout=None,
dsrdtr=False, inter_byte_timeout=None) // Initialize serial port with all parameters
• serial.readline() // Read serial data which contains Carriage Return \r and Newline
character \n
Parámetros
Parámetro Detalles
de serie El paquete Python contiene clases y métodos para acceder al puerto serie
Observaciones
Utilizo un Arduino Uno con Arduino IDE 1.6.9 y Python 2.7.12 que se ejecuta en Windows 10.
Examples
Primera comunicación serial entre Arduino y Python.
En este primer ejemplo, se inicia una operación de escritura en serie básica desde un dispositivo
Arduino.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Hello World!");
delay(100);
}
https://riptutorial.com/es/home 29
Otros valores se pueden leer aquí: Arduino Serial.begin () function
En loop() , el primer mensaje que nos gustaría enviar es "Hello World!". Este mensaje se
transmite mediante Serial.println("Hello World!") , Ya que enviará esta cadena al puerto serie en
formato ASCII. Al final del mensaje, hay retorno de carro (CR, \r) y carácter de nueva línea (\n) .
Además, se utiliza un retraso de 100 milisegundos cada vez que el programa se imprime en el
puerto serie.
A continuación, cargue este boceto de Arduino a través del puerto COM (recuerde este número
de puerto COM, ya que se usará en el programa Python).
El programa Python que lee los datos en serie enviados desde el dispositivo Arduino se muestra a
continuación:
import serial
import time
Primero, el paquete pyserial debe ser importado. Para obtener más información sobre la
instalación de pyserial en el entorno de Windows, consulte esta instrucción: Instalación de Python
y pyserial . Luego, inicializamos el puerto serie con el número de puerto COM y la velocidad de
transmisión. La velocidad de transmisión debe ser la misma que la utilizada en el croquis de
Arduino.
El mensaje recibido se imprimirá en bucle while utilizando la función readline() . También se usa
un retraso de 100 milisegundos aquí como en el croquis de Arduino. Tenga en cuenta que la
función readline() requiere un tiempo de espera al abrir un puerto serie (documentación de
pyserial : PySerial ReadLine ).
https://riptutorial.com/es/home 30
Capítulo 9: Comunicación bluetooth
Parámetros
método detalles
SoftwareSerial.h Documentación
https://riptutorial.com/es/home 31
método detalles
Observaciones
Error común: si mantiene los pines rx y tx en los valores predeterminados (0 y 1), no puede cargar
código nuevo hasta que lo elimine, a menos que así sea, por lo que casi siempre es mejor
cambiar los pines tx y rx en el constructor SoftwareSerial.
Examples
Bluetooth básico hola mundo
#include <SoftwareSerial.h>
// its always better to change the default tx and rx as the may interfere with other process
in future.
void loop() {
// put code that you want it to run every time no matter what
if(blue.available()){
// put only that code which needsd to run when there is some data
// This means that the their is some data sent over the bluetooth
// You can do something with the data
int n;
// consider that the data received to be integer, read it by using blue.parseInt();
n = blue.parseInt();
https://riptutorial.com/es/home 32
Capítulo 10: Comunicación I2C
Introducción
I2C es un protocolo de comunicación que puede hacer que dos o más tableros Arduino se
comuniquen entre sí. El protocolo utiliza dos pines: SDA (línea de datos) y SCL (línea de reloj).
Esos pines son diferentes de un tipo de placa Arduino a otro, así que verifique la especificación
de la placa. El protocolo I2C estableció una placa Arduino como maestro y todas las demás como
esclavo. Cada esclavo tiene una dirección diferente que el programador configuró de forma rígida.
Observación: asegúrese de que todas las tarjetas conectadas a la misma fuente VCC
Examples
Esclavos múltiples
El siguiente ejemplo muestra cómo el maestro puede recibir datos de varios esclavos. En este
ejemplo el esclavo envía dos números cortos. El primero es para la temperatura, y el segundo es
para la humedad. Tenga en cuenta que la temperatura es un flotador (24.3). Para usar solo dos
bytes y no cuatro (el flotador es de cuatro bytes), multiplico la temperatura en 10 y lo guardo como
un corto. Así que aquí está el código maestro:
#include <Wire.h>
#define BUFFER_SIZE 4
#define MAX_NUMBER_OF_SLAVES 24
#define FIRST_SLAVE_ADDRESS 1
#define READ_CYCLE_DELAY 1000
byte buffer[BUFFER_SIZE];
void setup()
{
Serial.begin(9600);
Serial.println("MASTER READER");
Serial.println("*************");
void loop()
{
for (int slaveAddress = FIRST_SLAVE_ADDRESS;
slaveAddress <= MAX_NUMBER_OF_SLAVES;
slaveAddress++)
{
Wire.requestFrom(slaveAddress, BUFFER_SIZE); // request data from the slave
if(Wire.available() == BUFFER_SIZE)
{ // if the available data size is same as I'm expecting
// Reads the buffer the slave sent
for (int i = 0; i < BUFFER_SIZE; i++)
{
https://riptutorial.com/es/home 33
buffer[i] = Wire.read(); // gets the data
}
delay(READ_CYCLE_DELAY);
}
}
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//=====================
// This is the hard-coded address. Change it from one device to another
#define SLAVE_ADDRESS 1
//=====================
// I2C Variables
#define BUFFER_SIZE 2
#define READ_CYCLE_DELAY 1000
short data[BUFFER_SIZE];
// Temprature Variables
OneWire oneWire(8);
DallasTemperature temperatureSensors(&oneWire);
float m_temperature;
// Moisture Variables
short m_moisture;
// General Variables
https://riptutorial.com/es/home 34
int m_timestamp;
void setup()
{
Serial.begin(9600);
Serial.println("SLAVE SENDER");
Serial.print("Node address: ");
Serial.println(SLAVE_ADDRESS);
Serial.print("Buffer size: ");
Serial.println(BUFFER_SIZE * sizeof(short));
Serial.println("***********************");
m_timestamp = millis();
Wire.begin(NODE_ADDRESS); // Activate I2C network
Wire.onRequest(requestEvent); // Set the request event handler
temperatureSensors.begin();
}
void loop()
{
if(millis() - m_timestamp < READ_CYCLE_DELAY) return;
void requestEvent()
{
data[0] = m_temperature * 10; // In order to use short, I multiple by 10
data[1] = m_moisture;
Wire.write((byte*)data, BUFFER_SIZE * sizeof(short));
}
https://riptutorial.com/es/home 35
Capítulo 11: Comunicación MIDI
Introducción
La intención de este tema es mostrar algunos programas MIDI básicos que muestran cómo
operar con el protocolo y agregan progresivamente funciones útiles que requieren las
aplicaciones más complejas.
Examples
Ejemplo de MIDI THRU
El MIDI Thru es simple y fácil de probar. Cuando trabaje correctamente, podrá instalar su
proyecto Arduino entre dos dispositivos MIDI, MIDI IN a MIDI OUT y podrá verificar que los dos
dispositivos funcionan juntos. Si tiene la capacidad de medir la latencia, verá un aumento debido
a las instrucciones de captura y retransmisión del búfer en serie.
boolean byteReady;
unsigned char midiByte;
void setup() {
// put your setup code here, to run once:
// Set MIDI baud rate:
Serial.begin(31250);
byteReady = false;
midiByte = 0;
}
// The little function that gets called each time loop is called.
// This is automated somwhere in the Arduino code.
void serialEvent() {
if (Serial.available()) {
// get the new byte:
midiByte = (unsigned char)Serial.read();
byteReady = true;
}
}
https://riptutorial.com/es/home 36
// This is a more complex MIDI THRU. This version uses a queue. Queues are important because
some
// MIDI messages can be interrupted for real time events. If you are generating your own
messages,
// you may need to stop your message to let a "real time" message through and then resume your
message.
void setup() {
// put your setup code here, to run once:
// Set MIDI baud rate:
Serial.begin(31250);
}
void loop() {
if (getQDepth>0) {
Serial.write(deQueue());
}
}
// The little function that gets called each time loop is called.
// This is automated somwhere in the Arduino code.
https://riptutorial.com/es/home 37
void serialEvent() {
if (Serial.available()) {
// get the new byte:
addQueue((unsigned char)Serial.read());;
}
}
void setup() {
// Set MIDI baud rate:
Serial.begin(31250);
clk_period_us = 60000000 / (24 * BPM);
lastClock = micros();
}
https://riptutorial.com/es/home 38
myByte = tx_queue[tailQ];
tailQ++;
tailQ = tailQ % QUEUE_DEPTH; // Keep this tailQ contained within a limit
// Now that we dequeed the byte, it must be sent.
return myByte;
}
void loop() {
captClock = micros();
if (getQDepth>0) {
Serial.write(deQueue());
}
}
// The little function that gets called each time loop is called.
// This is automated somwhere in the Arduino code.
void serialEvent() {
if (Serial.available()) {
// get the new byte:
addQueue((unsigned char)Serial.read());;
}
}
• Canal de voz
• Modo de canal
• Sistema Común
• Mensajes en tiempo real del sistema
Los mensajes comienzan con un valor de byte por encima de 0x80. Cualquier valor por debajo de
0x7F se considera datos. Lo que significa efectivamente que 127 es el valor máximo que se
puede codificar en un solo byte de datos MIDI. Para codificar valores más grandes, se requieren
dos o más bytes de datos MIDI.
Debe señalarse que los mensajes deben enviarse de principio a fin sin interrupción ... EXCEPTO
... Los mensajes del sistema en tiempo real, que son un solo byte, que se pueden inyectar en
medio de cualquier mensaje.
https://riptutorial.com/es/home 39
Mensajes de voz del canal
Estado Bytes de
Descripción
D7..D0 datos
https://riptutorial.com/es/home 40
Estado Bytes de
Descripción
D7..D0 datos
https://riptutorial.com/es/home 41
Estado
Bytes de datos Descripción
D7..D0
Bytes
Estado
de Descripción
D7..D0
datos
https://riptutorial.com/es/home 42
Bytes
Estado
de Descripción
D7..D0
datos
https://riptutorial.com/es/home 43
Capítulo 12: Comunicación serial
Sintaxis
• Serial.begin(speed) // Abre el puerto serie en la velocidad de transmisión dada
• Serial.begin(speed, config)
• Serial[1-3].begin(speed) // Arduino Mega solamente! Al escribir 1-3 significa que puede
elegir entre los números 1 a 3 al elegir el puerto serie.
• Serial[1-3].begin(speed, config) // ¡ Arduino Mega solamente! Al escribir 1-3 significa que
puede elegir entre los números 1 a 3 al elegir el puerto serie.
• Serial.peek() // Lee el siguiente byte de entrada sin eliminarlo del búfer
• Serial.available() // Obtiene el número de bytes en el búfer
• Serial.print(text) // Escribe texto en el puerto serie
• Serial.println(text) // Igual que Serial.print() pero con una nueva línea final
Parámetros
Parámetro Detalles
Bits de
Número de bits de parada en un paquete: uno (predeterminado), dos
parada
Observaciones
El Arduino Mega tiene cuatro puertos serie que se pueden elegir. Se accede de la siguiente
manera.
Serial.begin(9600);
Serial1.begin(38400);
Serial2.begin(19200);
Serial3.begin(4800);
https://riptutorial.com/es/home 44
8 bits de datos, paridad par y 1 bit de parada serían - SERIAL_8E1
Examples
Simple leer y escribir
Este ejemplo escucha la entrada que llega a través de la conexión en serie y luego la repite
nuevamente en la misma conexión.
byte incomingBytes;
void setup() {
Serial.begin(9600); // Opens serial port, sets data rate to 9600 bps.
}
void loop() {
// Send data only when you receive data.
if (Serial.available() > 0) {
// Read the incoming bytes.
incomingBytes = Serial.read();
String base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
void setup() {
void loop() {
if (Serial.available() > 0) { // Check if data has been sent from the user
char c = Serial.read(); // Gets one byte/Character from serial buffer
int result = base64.indexOf(c); // Base64 filtering
if (result>=0)
Serial.print(c); // Only print Base64 string
}
}
byte incoming;
https://riptutorial.com/es/home 45
String inBuffer;
void setup() {
Serial.begin(9600); // or whatever baud rate you would like
}
void loop(){
// setup as non-blocking code
if(Serial.available() > 0) {
incoming = Serial.read();
void handle_command() {
// expect something like 'pin 3 high'
String command = inBuffer.substring(0, inBuffer.indexOf(' '));
String parameters = inBuffer.substring(inBuffer.indexOf(' ') + 1);
if(command.equalsIgnoreCase('pin')){
// parse the rest of the information
int pin = parameters.substring("0, parameters.indexOf(' ')).toInt();
String state = parameters.substring(parameters.indexOf(' ') + 1);
if(state.equalsIgnoreCase('high')){
digitalWrite(pin, HIGH);
}else if(state.equalsIgnoreCase('low)){
digitalWrite(pin, LOW);
}else{
Serial.println("did not compute");
}
} // add code for more commands
}
Si tiene un Arduino conectado a una computadora o una Raspberry Pi y desea enviar datos desde
el Arduino a la PC, puede hacer lo siguiente:
Arduino:
void setup() {
// Opens serial port, sets data rate to 9600 bps:
https://riptutorial.com/es/home 46
Serial.begin(9600);
}
void loop() {
// Sends a line over serial:
Serial.println("Hello, Python!");
delay(1000);
}
Pitón:
import serial
https://riptutorial.com/es/home 47
Capítulo 13: Comunicación SPI
Observaciones
// use:
digitalWrite(CSPIN, 0); // select
... perform data transfer ...
digitalWrite(CSPIN, 1); // deselect
Actas
Las transacciones tienen dos propósitos:
La línea del reloj tiene diferentes estados de inactividad en los diferentes modos SPI. Cambiar el
modo SPI mientras se selecciona un esclavo puede confundir al esclavo, así que siempre
configure el modo SPI antes de seleccionar un esclavo. El modo SPI se puede configurar con un
objeto SPISettings pasado a SPI.beginTransaction :
https://riptutorial.com/es/home 48
SPISettings mySettings(1000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);
Si otra parte del código intenta usar el SPI entre un par de llamadas para beginTransaction() y
endTransaction() , puede surgir un error: la forma en que se hace depende de la implementación.
Examples
Conceptos básicos: inicialice el SPI y un pin de selección de chip, y realice
una transferencia de 1 byte
#include <SPI.h>
#define CSPIN 1
void setup() {
pinMode(CSPIN, OUTPUT); // init chip select pin as an output
digitalWrite(CSPIN, 1); // most slaves interpret a high level on CS as "deasserted"
SPI.begin();
digitalWrite(CSPIN, 1);
SPI.endTransaction();
SPI.end();
}
void loop() {
// we don't need loop code in this example.
}
https://riptutorial.com/es/home 49
Este ejemplo:
https://riptutorial.com/es/home 50
Capítulo 14: Entradas analógicas
Sintaxis
• analogRead(pin) // Leer desde el pin dado.
Observaciones
Serial.println(val)
Examples
Imprima un valor analógico
void setup() {
Serial.begin(9600); //Begin serializer to print out value
void loop() {
Las clavijas analógicas se pueden usar para leer voltajes, lo que es útil para monitorear la batería
o interactuar con dispositivos analógicos. Por defecto, el pin AREF será el mismo que el voltaje de
operación del arduino, pero puede establecerse en otros valores externamente. Si el voltaje a leer
es mayor que el voltaje de entrada, se necesitará un desviador potencial para disminuir el voltaje
analógico.
https://riptutorial.com/es/home 51
int ADCValue = 0;
float voltage = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
readADC();
Serial.print(voltage); Serial.println("V");
}
void readADC()
{
ADCValue = analogRead(analogPin);
float = ( ( (float)ADCValue/ADCRange ) * AREFValue ); //Convert the ADC value to a
float, devide by the ADC resolution and multiply by the AREF voltage
}
https://riptutorial.com/es/home 52
Capítulo 15: Entradas digitales
Sintaxis
• pinMode(pin, pinMode) // Establece el pin en el modo definido.
• digitalRead(pin); // Lee el valor de un pin digital especificado,
Parámetros
Parámetro Detalles
Observaciones
Si el pin de entrada no se presiona LOW o HIGH, el valor flotará. Es decir, no será claramente un
1 o un 0, sino un punto intermedio. Para entrada digital, una resistencia pullup o desplegable es
una necesidad.
Examples
Pulsador de lectura
Este es un ejemplo básico sobre cómo cablear y hacer que un LED se encienda / apague cuando
se presiona el botón.
https://riptutorial.com/es/home 53
*
* turns on and off a light emitting diode(LED) connected to digital
* pin 13, when pressing a pushbutton attached to pin 7. It illustrates the
* concept of Active-Low, which consists in connecting buttons using a
* 1K to 10K pull-up resistor.
*
* Created 1 December 2005
* copyleft 2005 DojoDave <http://www.0j0.org>
* http://arduino.berlios.de
*
*/
void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inPin, INPUT); // declare pushbutton as input
}
void loop(){
val = digitalRead(inPin); // read input value
if (val == HIGH) { // check if the input is HIGH (button released)
digitalWrite(ledPin, LOW); // turn LED OFF
} else {
digitalWrite(ledPin, HIGH); // turn LED ON
}
}
https://riptutorial.com/es/home 54
Capítulo 16: Funciones
Observaciones
Aparte de en C / C ++ ordinario, el IDE de Arduino permite llamar a una función antes de que se
defina.
En los archivos .cpp, debe definir la función, o al menos declarar la función prototipo antes de
poder usarla.
En un archivo .ino, el IDE de Arduino crea un prototipo detrás de escena.
Examples
Crear una función simple.
return a*a : devolver un valor (el mismo tipo que el tipo de retorno definido al principio)
Si tiene una función declarada, puede llamarla en cualquier otro lugar del código. Aquí hay un
https://riptutorial.com/es/home 55
ejemplo de llamar a una función:
void setup(){
Serial.begin(9600);
}
void loop() {
int i = 2;
int squareNum(int a) {
return a*a;
}
https://riptutorial.com/es/home 56
Capítulo 17: Gestión del tiempo
Sintaxis
• millis largos sin firmar ()
Observaciones
• Perder el tiempo de la CPU: es posible que los bocetos más complejos necesiten la CPU
para otra cosa mientras esperan que termine el período de parpadeo del LED.
• retrasos inesperados: cuando se llama a delay() en subrutinas que obviamente no se
llaman, por ejemplo, en las bibliotecas que incluye.
• eventos faltantes que ocurren durante el retraso y no son manejados por un manejador de
interrupciones, por ejemplo, al presionar un botón de sondeo: un botón puede presionarse
por 100 ms, pero esto puede estar sombreado por un delay(500) .
Detalles de implementacion
millis() generalmente se basa en un temporizador de hardware que se ejecuta a una velocidad
que es mucho mayor que 1 kHz. Cuando se llama a millis() , la implementación devuelve algún
valor, pero no se sabe qué edad tiene realmente. Es posible que el milisegundo "actual" haya
comenzado, o que termine justo después de esa llamada de función. Eso significa que, al calcular
la diferencia entre dos resultados de millis() , puede estar desconectado entre casi cero y casi
https://riptutorial.com/es/home 57
un milisegundo. Use micros() si se necesita mayor precisión.
Examples
bloqueando blinky con retraso ()
Una de las formas más directas de hacer que parpadee un LED es: enciéndalo, espere un poco,
apáguelo, espere de nuevo y repita sin cesar:
void setup()
{
pinMode(OUTPIN, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(OUTPIN, HIGH); // sets the pin on
delayMicroseconds(PERIOD); // pauses for 500 miliseconds
digitalWrite(OUTPIN, LOW); // sets the pin off
delayMicroseconds(PERIOD); // pauses for 500 milliseconds
Sin embargo, esperar como se hace en el ejemplo anterior desperdicia los ciclos de la CPU, ya
que simplemente permanece allí en un bucle esperando que pase un cierto punto en el tiempo.
Eso es lo que hacen mejor las formas de no bloqueo, utilizando millis() o elapsedMillis , en el
sentido de que no queman la mayor parte de las capacidades del hardware.
La biblioteca elapsedMillis proporciona una clase con el mismo nombre que realiza un
seguimiento del tiempo transcurrido desde que se creó o se estableció en un determinado valor:
#include <elapsedMillis.h>
elapsedMillis ledTime;
void setup()
{
https://riptutorial.com/es/home 58
// initialize the digital pin as an output.
pinMode(OUTPIN, OUTPUT);
}
void loop()
{
if (ledTime >= PERIOD)
{
ledState = !ledState;
digitalWrite(OUTPIN, ledState);
ledTime = 0;
}
// do other stuff here
}
Puede ver en el ejemplo que al objeto ledTime se le asigna un cero cuando se ledTime el pin LED.
Esto puede no ser sorprendente a primera vista, pero tiene un efecto si suceden cosas que
consumen más tiempo:
Considere una situación en la que la comparación entre ledTime y PERIOD se realiza después de
750 milisegundos. Luego, establecer ledTime en cero significa que todas las siguientes
operaciones de conmutación tendrán un retraso de 250 ms. Si, por el contrario, el PERIOD se resta
de ledTime , el LED verá un período corto y luego continuará parpadeando como si no hubiera
pasado nada.
// millis() returns an unsigned long so we'll use that to keep track of time
unsigned long lastTime = 0;
void setup() {
// set the digital pin as output:
pinMode(OUTPIN, OUTPUT);
}
void loop() {
unsigned long now = millis();
if (now - lastTime >= PERIOD) // this will be true every PERIOD milliseconds
{
lastTime = now;
if (ledState == LOW)
{
ledState = HIGH;
}
else
{
ledState = LOW;
}
https://riptutorial.com/es/home 59
digitalWrite(OUTPIN, ledState);
}
El uso de millis() de esta manera (para elapsedMillis las operaciones de manera no bloqueante)
es algo que se necesita con bastante frecuencia, así que considere usar la biblioteca de
elapsedMillis para esto.
#include <elapsedMillis.h>
void setup() {
Serial.begin(115200);
elapsedMillis msTimer;
elapsedMicros usTimer;
Serial.print("delay(");Serial.print(dt);Serial.println(") took");
Serial.print(us);Serial.println(" us, or");
Serial.print(ms);Serial.println(" ms");
}
void loop() {
}
En este ejemplo, un objeto elapsedMillis y un objeto elapsedMicros se utilizan para medir cuánto
tiempo tardó algo, al crearlos justo antes de que se ejecute la expresión que queremos medir y
obtener sus valores posteriormente. Mostrarán resultados ligeramente diferentes, pero el
resultado de milisegundos no se desactivará en más de un milisegundo.
Si tiene más de 1 tarea para ejecutar repetidamente en diferentes intervalos, use este ejemplo
como punto de partida:
unsigned long intervals[] = {250,2000}; //this defines the interval for each task in
milliseconds
unsigned long last[] = {0,0}; //this records the last executed time for each task
void setup() {
pinMode(LED_BUILTIN, OUTPUT); //set the built-it led pin as output
Serial.begin(115200); //initialize serial
}
void loop() {
unsigned long now = millis();
https://riptutorial.com/es/home 60
if(now-last[0]>=intervals[0]){ last[0]=now; firstTask(); }
if(now-last[1]>=intervals[1]){ last[1]=now; secondTask(); }
void firstTask(){
//let's toggle the built-in led
digitalWrite(LED_BUILTIN, digitalRead(LED_BUILTIN)?0:1);
}
void secondTask(){
//say hello
Serial.println("hello from secondTask()");
}
Para agregar otra tarea para ejecutar cada 15 segundos, extienda los intervals las variables y
last :
Luego agrega una sentencia if para ejecutar la nueva tarea. En este ejemplo, lo nombré
thirdTask .
void thirdTask(){
//your code here
}
https://riptutorial.com/es/home 61
Capítulo 18: Interrupciones
Sintaxis
• digitalPinToInterrupt (pin); // convierte un id de pin en un id de interrupción, para usar con
attachInterrupt() y detachInterrupt() .
• detachInterrupt (interrupción);
• interrupciones (); // volver a habilitar las interrupciones después de que se haya llamado a
noInterrupts() .
Parámetros
Parámetro Notas
Observaciones
Las rutinas de servicio de interrupción (ISR) deben ser lo más cortas posible, ya que pausan la
ejecución del programa principal y, por lo tanto, pueden arruinar el código dependiente del tiempo.
Por lo general, esto significa que en el ISR establece un indicador y sale, y en el ciclo de
programa principal, comprueba el indicador y hace lo que se supone que debe hacer ese
indicador.
No puede usar delay() o millis() en un ISR porque esos métodos se basan en interrupciones.
Examples
Interrupción al presionar un botón
https://riptutorial.com/es/home 62
Este ejemplo utiliza un botón pulsador (interruptor de tacto) conectado al pin digital 2 y GND,
utilizando una resistencia de pull-up interna, de modo que el pin 2 está ALTO cuando no se
presiona el botón.
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), myISR, FALLING); // trigger when
button pressed, but not when released.
}
void loop() {
digitalWrite(LED_PIN, ledState);
}
void myISR() {
ledState = !ledState;
// note: LOW == false == 0, HIGH == true == 1, so inverting the boolean is the same as
switching between LOW and HIGH.
}
Un ejemplo simple es que los botones pulsadores tienden a rebotar, lo que significa que al
presionar o soltar, el circuito se abre y se cierra más de una vez antes de que se establezca en el
estado final cerrado o abierto. Este ejemplo no tiene eso en cuenta. Como resultado, a veces, al
presionar el botón se alternará el LED varias veces, en lugar del esperado una vez.
https://riptutorial.com/es/home 63
Capítulo 19: Números al azar
Sintaxis
• random (max) // Devuelve un número pseudo-random (long) entre 0 (inclusive) y max
(exclusive)
• random (min, max) // Devuelve un número pseudo-random (long) entre min (inclusive) y max
(exclusive)
Parámetros
Parámetro Detalles
Observaciones
Si se llama a randomSeed() con un valor fijo (por ejemplo, randomSeed(5) ), la secuencia de números
aleatorios generados por el boceto se repetirá cada vez que se ejecute. En la mayoría de los
casos, se prefiere una semilla aleatoria, que puede obtenerse leyendo un pin analógico no
conectado.
Examples
Generar un número aleatorio
void setup() {
Serial.begin(9600);
}
void loop() {
long randomNumber = random(500); // Generate a random number between 0 and 499
Serial.println(randomNumber);
randomNumber = random(100, 1000); // Generate a random number between 100 and 999
Serial.println(randomNumber);
https://riptutorial.com/es/home 64
delay(100);
}
Si es importante que una secuencia de números generados por random() difiera, es una buena
idea especificar una semilla con randomSeed() :
void setup() {
Serial.begin(9600);
void loop() {
long randomNumber = random(500); // Generate a random number between 0 and 499
Serial.println(randomNumber);
delay(100);
}
https://riptutorial.com/es/home 65
Capítulo 20: Pines de hardware
Examples
Arduino Uno R3
Los microcontroladores utilizan pines para interactuar con el resto del circuito. Estos pines
normalmente serán uno de los pines de entrada / salida, vin o tierra. Los pines de E / S pueden
ser pines de E / S digitales simples, o pueden tener algunas características especiales, como la
posibilidad de variar el voltaje de su salida mediante la modulación de ancho de pulso. Aquí hay
un esquema del Arduino R3 Uno y sus pines.
https://riptutorial.com/es/home 66
( fuente )
PWM Pins
https://riptutorial.com/es/home 67
PWM le permite controlar el voltaje de la salida cambiando la salida entre alta y baja muy
rápidamente. El porcentaje de tiempo que el pin es alto se denomina "ciclo de trabajo".
Entradas analógicas
Al igual que un pin PWM puede generar un rango de voltajes, los pines analógicos en el Arduino
Uno R3 pueden detectar un rango de voltajes de entrada. Puede usar esto para leer la posición
de un potenciómetro u otra entrada con una entrada suavemente variable. Tenga en cuenta que
los pines analógicos no pueden hacer una salida de WDS analógica, para esto necesita usar
pines PWM.
Los pines serie en el Arduino Uno R3 también son utilizados por (por ejemplo) el chip USB a
Serial cuando se comunica con una computadora a través del puerto USB incorporado. Serie: Tx
en 0, Rx en 1
SPI e I2C son protocolos de comunicación que Arduino puede usar para hablar con escudos,
sensores, salidas, etc ...:
LED de a bordo
El Arduino Uno R3 tiene un LED con su propia resistencia conectada al pin 13. Esto significa que
incluso si no conecta ningún LED a su tablero, si configura el pin 13 en una salida y lo establece
en un nivel alto, debería ver un LED. en el tablero vamos Use el bosquejo de ejemplo 'Parpadeo'
para ubicar su LED incorporado.
NOTA: El pin digital 13 es más difícil de usar como una entrada digital que los otros
pines digitales porque tiene un LED y una resistencia unidos a la placa en la mayoría
de las placas. Si habilita su resistencia de pull-up interna de 20k, se colgará a
alrededor de 1.7V en lugar de los 5V esperados porque el LED a bordo y la resistencia
en serie bajan el nivel de voltaje, lo que significa que siempre retorna BAJO. Si debe
usar el pin 13 como entrada digital, configure su pinMode () en ENTRADA y use una
resistencia desplegable externa.
https://riptutorial.com/es/home 68
Capítulo 21: PWM - Modulación de ancho de
pulso
Examples
Controlar un motor de CC a través del puerto serie utilizando PWM
En este ejemplo, nuestro objetivo es lograr una de las tareas más comunes: tengo un pequeño
motor de corriente continua, ¿cómo uso mi Arduino para controlarlo? Fácil, con PWM y
comunicación serial, usando la función analogWrite() y la biblioteca Serial .
Los basicos
La modulación de ancho de pulso o PWM para abreviar es una técnica para imitar señales
analógicas usando una salida digital. ¿Como funciona esto? Usando un tren de impulsos cuya
relación D (ciclo de trabajo) entre el tiempo en el nivel alto (digital 1, generalmente 5V) y el tiempo
en el nivel bajo (digital 0, 0V) en cada período se puede modificar para producir un voltaje
promedio entre estos dos niveles:
Sin embargo, el propósito de las señales analógicas generalmente se relaciona con el control de
los sistemas mecánicos que requieren más voltaje y corriente de lo que solo la placa Arduino es
capaz de hacer. En este ejemplo, aprenderemos cómo amplificar las capacidades PWM de
Arduino.
https://riptutorial.com/es/home 69
Para esto se utiliza un diodo MOSFET. En esencia, este diodo actúa como un interruptor. Permite
o interrumpe el flujo eléctrico entre su fuente y los terminales de drenaje . Pero en lugar de un
interruptor mecánico, presenta una tercera terminal llamada compuerta . Una corriente muy
pequeña (<1mA) "abrirá" esta puerta y permitirá que la corriente fluya. Esto es muy conveniente,
ya que podemos enviar la salida PWM de Arduino a esta puerta, creando así otro tren de pulsos
PWM con el mismo ciclo de trabajo a través del MOSFET, que permite voltajes y corrientes que
destruirían el Arduino.
La construcción
¡Pon todo junto! Alimente los rieles de la placa de pruebas y coloque el diodo MOSFET en ella.
Conecte el motor entre el riel positivo y el drenaje MOSFET. Conecte el diodo de protección de la
misma manera: entre el drenaje MOSFET y el riel positivo. Conecte la fuente del MOSFET al riel
de tierra común. Finalmente, conecte el pin PWM (estamos usando el pin 10 en este ejemplo) a la
compuerta del MOSFET y también a la tierra común a través de la resistencia (necesitamos una
corriente muy baja).
Aquí hay un ejemplo de cómo se ve esta compilación. Si prefieres un esquema aquí hay uno.
https://riptutorial.com/es/home 70
El código
Ahora podemos conectar el Arduino a una computadora, cargar el código y controlar el motor,
mediante el envío de valores a través de la comunicación en serie. Recuerde que estos valores
deben ser enteros entre 0 y 255. El código real de este ejemplo es muy simple. Se proporciona
una explicación en cada línea.
¡Y eso es! Ahora puede usar las capacidades PWM de Arduino para controlar aplicaciones que
requieren señales analógicas, incluso cuando los requisitos de energía superan los límites de la
placa.
El TLC5940 es un elemento útil para tener cuando te quedas sin puertos PWM en el Arduino.
Tiene 16 canales, cada uno controlable individualmente con 12 bits de resolución (0-4095). Una
biblioteca existente está disponible en http://playground.arduino.cc/Learning/TLC5940 . Es útil
para controlar múltiples servos o LEDs RGB. Solo tenga en cuenta que los LED deben ser ánodo
común para funcionar. Además, los chips son margaritables, lo que permite incluso más puertos
PWM.
Ejemplo:
void setup() {
// Initialize
Tlc.init();
Tlc.clear();
}
https://riptutorial.com/es/home 71
level = (level + 1) % 4096;
// Tell the library to send the values to the chip
Tlc.update();
delay(10);
}
https://riptutorial.com/es/home 72
Capítulo 22: Salida de audio
Parámetros
Parámetro Detalles
Examples
Salidas de notas básicas
#define NOTE_C4 262 //From pitches.h file defined in [Arduino Tone Tutorial][1]
int Key = 2;
int KeyVal = 0;
void setup()
{
pinMode(Key, INPUT); //Declare our key (button) as input
pinMode(speaker, OUTPUT);
}
void loop()
{
KeyVal = digitalRead(Key);
if (KeyVal == HIGH) {
tone(speaker, NOTE_C4); //Sends middle C tone out through analog speaker
} else {
noTone(speaker); //Ceases tone emitting from analog speaker
}
delay(100);
}
[1]: https://www.arduino.cc/en/Tutorial/toneMelody
https://riptutorial.com/es/home 73
Capítulo 23: Salida digital
Sintaxis
• digitalWrite(pin, value)
Examples
Escribir a pin
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
Ejemplo en Arduino.cc .
https://riptutorial.com/es/home 74
Capítulo 24: Servo
Introducción
Un Servo es un sistema cerrado que contiene un motor y algunos circuitos de soporte. El eje de
un servo se puede girar a un ángulo fijo dentro de un arco utilizando una señal de control. Si la
señal de control se mantiene, entonces el servo mantendrá su ángulo. Los servos se pueden
controlar fácilmente con la biblioteca Arduino Servo.h .
Sintaxis
• #include <Servo.h> // Incluir la biblioteca Servo
• Servo.attach (pin) // Adjuntar al servo en el pin. Devuelve un objeto Servo
• Servo.write (grados) // Grados para moverse a (0 - 180)
• Servo.read () // Obtiene la rotación actual del servo
Examples
Mover el servo de ida y vuelta
#include <Servo.h>
Servo srv;
void setup() {
srv.attach(9); // Attach to the servo on pin 9
Para usar un servo, primero debe llamar a la función attach() . Comienza a generar una señal
PWM que controla un servo en un pin específico. En tableros que no sean Arduino Mega, el uso
de la biblioteca Servo deshabilita la funcionalidad analogWrite () (PWM) en los pines 9 y 10, ya
sea que haya un Servo en esos pines o no.
void loop() {
Servo.write(90); // Move the servo to 90 degrees
delay(1000); // Wait for it to move to it's new position
Servo.write(0); // Move the servo to 0 degrees
delay(1000); // Wait for it to move to it's new position
}
Tenga en cuenta que no está garantizado que el servo haya alcanzado la posición deseada, ni
puede verificarlo desde el programa.
https://riptutorial.com/es/home 75
Capítulo 25: Usando Arduino con Atmel
Studio 7
Observaciones
Preparar
• Descargue e instale Atmel Studio 7 desde aquí .
• Compra un depurador. Usted puede arreglárselas con un programador de ISP, pero si
desea capacidades de depuración, que es una de las grandes ventajas de usar Atmel
Studio, querrá un depurador. Recomiendo el ICE Atmel , ya que proporciona capacidades
de depuración para los arduinos basados en AVR (como el Uno, pro mini, etc.) y los
Arduinos basados en ARM, como el cero y el vencimiento. Si tiene un presupuesto limitado,
puede obtenerlo sin el estuche de plástico y tener cuidado de no darle una sacudida
eléctrica.
Conexiones
• Para el Uno, use el cable ICSP de 6 pines . Enchufe un lado en el Uno como se muestra.
Conecte el otro lado al puerto AVR del depurador.
https://riptutorial.com/es/home 76
Para el Arduino Pro Mini, use el cable mini squid como se muestra, conectando de nuevo el otro
lado del puerto AVR del depurador.
https://riptutorial.com/es/home 77
Consideraciones de depuración
Para la depuración con el Uno, deberá cortar la traza Restablecer-habilitar (siempre puede volver
a soldar para usar con el IDE de Arduino):
https://riptutorial.com/es/home 78
Con Pro Mini, si pretende conectar el puerto serie a su computadora con una tarjeta FTDI, no
conecte la línea DTR, ya que interferirá con la interfaz de Debug de cables en serie (SWD) de
Atmel. Simplemente conecto la alimentación, tierra, Tx y Rx como se muestra a continuación. Rx
y Tx en Arduino van a Tx y Rx, respectivamente, en la placa FTDI. Algunas tarjetas FTDI están
etiquetadas de manera diferente, por lo que si el puerto serie no funciona, intercambie Rx y Tx.
https://riptutorial.com/es/home 79
Deberá proporcionar alimentación al Arduino por separado, ya que el depurador no lo activará.
Esto se puede hacer en el Pro Mini a través de la placa FTDI como se muestra arriba, o con un
cable USB o adaptador de CA en el Uno.
Configuración de software
Conecte Atmel ICE a su computadora, inicie Atmel Studio y ahora puede importar un proyecto
Arduino existente.
En Atmel Studio, vaya a Archivo -> Nuevo -> Proyecto y seleccione "Crear proyecto desde el
boceto de Arduino". Completa las opciones incluyendo menús y menús desplegables de
dispositivos.
Vaya a Project -> yourProjectName Properties, haga clic en Tool, seleccione Atmel ICE en
https://riptutorial.com/es/home 80
debugger / programmer y debugWire en la interfaz. Ir a depuración -> Iniciar depuración y romper.
Debería ver una advertencia y se le preguntará si desea configurar el fusible DWEN. Elija
Aceptar, desenchufe el Arduino de la alimentación y vuelva a enchufarlo. Puede detener la
depuración haciendo clic en el botón cuadrado rojo y comience haciendo clic en el botón triángulo
verde. Para devolver el Arduino a un estado en el que se puede usar en el IDE de Arduino,
mientras realiza la depuración, elija Depurar -> deshabilitar debugWIRE y cerrar.
Tenga en cuenta que cualquier función que agregue también debe incluir un prototipo de función
(el bucle y la configuración no los necesitan). Puede ver los agregados de Atmel Studio en la
parte superior del boceto si hubiera alguna función cuando importó su proyecto a Atmel Studio
(consulte el ejemplo de código).
Beneficios
La programación de Arduino con un IDE moderado como Atmel Studio 7 le brinda numerosas
ventajas sobre el IDE de Arduino, que incluyen depuración, autocompletado, salto a definición y
declaración, navegación hacia adelante / hacia atrás, marcadores y opciones de refactorización,
entre otros.
Puede configurar enlaces de teclas yendo a Herramientas -> Opciones -> Entorno -> Teclado.
Algunos que realmente aceleran el desarrollo son:
https://riptutorial.com/es/home 81
• Edit.CommentSelection, Edit.UncommentSelection
• View.NavigateForward, View.NavigateBackward
• Edit.MoveSelectedLinesUp, Edit.MoveSelectedLinesDown
• Edit.GoToDefinition
Examples
Ejemplo de boceto importado de Atmel Studio 7
void setup() {
Serial.begin(9600);
}
void loop() {
printA();
}
void printA() {
Serial.println("A");
}
https://riptutorial.com/es/home 82
Capítulo 26: Variables y tipos de datos
Examples
Crear variable
variableType variableName;
Por ejemplo:
int a;
Por ejemplo:
int a = 2;
Por ejemplo:
O cambiar el valor:
Tipos de variables
https://riptutorial.com/es/home 83
• unsigned long: sin signo entero de 32 bits
• float : número de coma flotante de 4 bytes
• double : número de coma flotante de 4 bytes (en placas basadas en ATMEGA) o de 8 bytes
(en Arduino Due)
Ejemplos:
char a = 'A';
char a = 65;
byte b = B10010;
int c = 2;
unsigned int d = 3;
long e = 186000L;
float g = 1.117;
double h = 1.117;
https://riptutorial.com/es/home 84
Creditos
S.
Capítulos Contributors
No
Almacenamiento de
2 Danny_ds, robert
datos
Biblioteca de cristal
4 Morgoth
líquido
Cómo almacenar
variables en
EEPROM y usarlas AZ Vcience, Chris Combs, Danny_ds, Jeremy, Peter Mortensen
7
para , RamenChef
almacenamiento
permanente
Cómo Python se
8 integra con Arduino Danny_ds, Peter Mortensen, Stark Nguyen
Uno
Comunicación
9 Girish, Martin Carney
bluetooth
https://riptutorial.com/es/home 85
16 Funciones datafiddler, Leah, MikeCAT
PWM - Modulación
21 Danny_ds, Johnny Mopp, JorgeGT, Martin Carney
de ancho de pulso
Variables y tipos de
26 Leah, MikeCAT
datos
https://riptutorial.com/es/home 86