2. SETUP
• Arduino: https://www.arduino.cc/en/Main/Software
• Driver CH340 (si es necesario: OSX, Win 7,8. OK en Linux, Win10)
• Soporte para ESP8266:
• Ir a Arduino (o File) -> Preferences
• En “Additional Boards Managers URLs” poner:
http://arduino.esp8266.com/package_esp8266com_index.json
11. int ledPin = D0; // pin LED
void setup() {
// nothing happens in setup
}
void loop() {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
analogWrite(ledPin, fadeValue);
delay(30);
}
// fade out from max to min in increments of 5 points:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(ledPin, fadeValue);
delay(30);
}
}
FADE
13. void setup() {
Serial.begin(9600);
}
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023)
// to a voltage (0 - 3.3V):
float voltage = sensorValue * (3.3 / 1023.0);
Serial.println(voltage);
}
LDR
15. #include <Servo.h>
Servo myservo; // create servo object to control a servo
void setup()
{
myservo.attach(D8); // connect the servo to D8
}
void loop()
{
int pos;
for(pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=0; pos-=1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
SERVO
19. #include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(3, D8, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin();
pixels.show();
}
void loop() {
for(int i=0; i<3; i++) {
pixels.setPixelColor(i, pixels.Color(0, 150, 0));
pixels.show();
delay(300);
}
}
NEOPIXELS I
Nota: Instalar la librería NeoPixel si en necesario desde Sketch -> Include Library -> Manage Libraries …
20. #include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strip = Adafruit_NeoPixel(3, D8, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
colorWipe(strip.Color(255, 0, 0), 20); // Red
colorWipe(strip.Color(0, 255, 0), 20); // Green
colorWipe(strip.Color(0, 0, 255), 20); // Blue
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
NEOPIXEL II
23. RED LOCAL ENTRE LOS ROBOTS
WIFI
Nombre de la red WiFi: Pi3-AP
Contraseña: raspberry
IP del broker MQTT: 172.24.1.1
Alternativamente puede considerar algún
servicio público de MQTT como por ejemplo
el servidor de pruebas de HiveMQ:
broker.hivemq.com
27. TOPICS Y REGLAS
r1/ldr 2.1
r2/ldr 1.4
r42/ldr 1.0
r13/ip Hello from …
r1/cmd/led1 on
r42/cmd/led2 off
r42/cmd/led1 on
r1/cmd/motL 800
r1/cmd/motR 800
r13/cmd/rgb 016:200:000
r42/cmd/rgbhex #0FAA00
De cada robot al MQTT:
Del MQTT a los robots:
Posibles suscripciones:
r1/+
+/ldr
r42/#
r13/cmd/+
+/ip
28. remote_001
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Pi3-AP";
const char* password = "raspberry";
const char* mqtt_server = "172.24.1.1";
char msg[50];
long ldr;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");
}
Serial.println("WiFi connected. IP address: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, 1883);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP8266Client")) {
Serial.println("connected");
client.publish("r1/ip", "Hello world from R1");
} else {
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) { reconnect(); }
client.loop();
long now = millis();
if (now - lastMsg > 500) {
lastMsg = now;
ldr = analogRead(A0);
snprintf (msg, 75, "%ld", ldr);
client.publish("r1/ldr", msg);
}
}
COMO PUBLICAR EN MQTT
29. #include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Pi3-AP";
const char* password = "raspberry";
const char* mqtt_server = "172.24.1.1";
long lastMsg = 0;
char msg[50];
long ldr;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
pinMode(D0, OUTPUT);
pinMode(D1, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
Serial.begin(9600);
}
void setup_wifi() {
delay(20);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected. IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
String topic_str(topic);
String cmd;
String param;
for (int i = 0; i < length; i++) {
param += (char)payload[i];
}
Serial.print("Message arrived: ");
Serial.print(topic); Serial.print(" ");
Serial.println(param);
// "r1/cmd/abc" -> abc
cmd = topic_str.substring( topic_str.lastIndexOf('/')+1 );
if (cmd == "led1") {
if (param=="on") digitalWrite(D0, LOW);
else digitalWrite(D0, HIGH);
} else if (cmd == "led2") {
if (param=="on") digitalWrite(D1, HIGH);
else digitalWrite(D1, LOW);
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP8266Client")) {
Serial.println("connected");
client.publish("r1/ip", "Hello world from R1");
client.subscribe("r1/cmd/+");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
la función void loop() es igual que en el ejemplo anterior
PUBLISH Y SUBSCRIBE CON MQTT
33. PUBLICAR EN MQTT
import mqtt.*;
MQTTClient client;
void setup() {
client = new MQTTClient(this);
client.connect("mqtt://172.24.1.1", "pc42");
}
void draw() {}
void keyPressed() {
switch(key) {
case 'a':
client.publish("/r42/led1", "on");
break;
case 'z':
client.publish("/r42/led1", "off");
break;
}
}
mqtt_001
34. !!! VM-NC
cuando esta conectado
al ordenador y a la batería
VM+
-
motor A
motor B
CONEXIONES DE MOTORES DC
35. CONTROL DE MOTORES DC
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
digitalWrite(D3, HIGH); // Dirección Motor A
digitalWrite(D4, HIGH); // Dirección Motor B
analogWrite(D1, 800); // Velocidad Motor A
analogWrite(D2, 800); // Velocidad Motor A
En el setup
Control