Lo Último en IP@P
- Stellar Data Recovery revoluciona la recuperación de archivos perdidos en discos duros externos
- Goblin Mine: La Estrategia Económica Detrás del Juego de Minería que está Fascinando a Todos
- Estos son los nuevos Cargadores UGREEN: potencia y portabilidad en dos versiones que no te puedes perder
- UGREEN Nexode Pro: El Cargador Ultradelgado que revoluciona la carga de dispositivos móviles
- La computación en la nube está transformando los juegos Online y estas son sus grandes ventajas
La placa Arduino ZERO está pensada para aquellos usuarios que ejecutan proyectos que no soportan las clásicas Arduino UNO. Esto se debe a la capacidad de procesamiento que tiene el MCU, la memoria flash y el reloj CPU.
Debido a esto es importante que conozcas qué son las Arduino ZERO y para qué sirven estas placas en electrónica. Esta información la podrás encontrar en los párrafos de este artículo.
Además, te mostraremos las características principales que tiene la placa y los criterios que debes tener en cuenta al trabajar con las Arduino ZERO. Echa un vistazo a esta potente placa.
¿Qué son las Arduino Zero y para qué sirven estas placas de desarrollo en electrónica?
La placa Arduino ZERO es un dispositivo que cuenta con un bus electrónico que incluye un MCU ATMEL Cortex-M0 SAMD21 de 32 bits de núcleo. Se caracteriza por tener una depuración de programas, o debug, haciendo que sea posible para el usuario no necesitar de ningún hardware externo.
Cuenta con toda la tecnología necesaria para trabajar en proyectos de Internet de las Cosas. Es necesario aclarar que su funcionamiento es un poco más bajo que el de otras placas, ya que la tensión que soporta es de 3.3V. Todos los pines, excepto el 4, trabajan con interrupciones externas de tipo 0 y 1. Por otro lado, la corriente continua, tanto de entrada de entrada como de salida, es de 7 mA y la velocidad del reloj del CPU llega a los 48 MHz.
Características ¿Cuáles son las principales prestaciones de esta placa de Arduino?
Las características principales que tiene esta placa de Arduino son:
- Es ideal para trabajar en robótica, en la automatización y en proyectos de tecnología.
- Posee un depurador incrustado que se conecta con el hardware del MCU con lo cual se puede programar el SAMD21 por medio de una interfaz SWD. Esto también permite acceder de manera completa al microcontrolador y trabajar con los códigos de los programas para modificarlos.
- La alimentación externa que tiene Arduino ZERO se realiza por medio de un conector de centro-positivo o por los pines GND y VIN es ubican en la cabecera de este conector de 2,1 mm. Esto quiere decir que no hay un puerto USB para alimentar la placa.
- Los PWM son 3, 4, 5, 6, 8, 9, 10, 11, 12 y 13; mientras que las entradas analógicas se encuentran en A0 a A5. La tensión de salida está en el DAC, el cual es el canal A0.
- El SPI se ubica en SS, MOSI, MISO y SCK de la palca.
- Posee un reloj que trabaja 48MHz, por lo que se puede contar el tiempo real y el calendario.
¿Qué debo tener en cuenta al trabajar con las placas Arduino ZERO?
Lo primero que debes saber es que la placa Arduino ZERO trabaja con una tensión de 3.3V, un poco más baja que el resto de las otras placas. Por tal motivo debe tener en cuenta esta restricción porque podrías quemar el microprocesador y otros componentes. Cuando trabajas en el IDE y abres el monitor, los microcontroladores y la ejecución del boceto no se reinician, por lo que deberás reiniciar el proceso por medio de un botón que encontrarás en el tablero del software de Arduino.
La alimentación no se realiza por medio de una entrada USB, lo cual podría complicar el proyecto si es que quieres utilizar el conector de 2,1mm para otra conexión de circuito. Por último, debes tener cuidado en la cantidad de procesos que atribuyas al proyecto. Si bien es cierto que esta placa es muy superior en potencia a la Arduino UNO y dispones de un potente microcontrolador, una buena memoria y un reloj de 48 MHz, siempre debes estar atento a la carga que le transfieras.
Lista de los mejores proyectos que puedes hacer con placas Arduino ZERO
Conoce los mejores proyectos que puedes llevar a cabo con una placa de Arduino ZERO:
Pantalla de NeoPixel controlada por WiFi
Más en Hardware
- Proyectos Raspberry Pi: ¿Cómo crear un servidor NAS en Raspberry Pi y tener tu propia nube privada? Guía paso a paso
- Tecnología aeroespacial ¿Qué es, cuál es su historia y qué le depara el futuro?
- ¿Cómo instalar OwnCloud en Raspberry Pi para crear una nube personal? Guía paso s paso
- Proyectos Raspberry Pi: ¿Cómo crear un sistema de videovigilancia con una Webcam y Motion en Raspberry Pi? Guía paso a paso
- OSMC para Raspberry Pi ¿Qué es, para qué sirve y cómo instalarlo en mi Raspberry Pi?
SÍGUENOS EN 👉 YOUTUBE TV
Con este proyecto vas a poder crear una pantalla de NeoPixel manejada por WiFi. Vas a necesitar una placa Arduino ZERO, un anillo con luces de tipo NeoPixel, varios leds, un protoboard, un condensador de 1000 µF, una resistencia de 475 ohmios y cables para generar las conexiones. El montaje lo tendrás que hacer siguiendo las descripciones y especificaciones de las piezas y considerando los pines de la placa, de acuerdo con todo lo que hemos hablado en este post.
Cuando tengas listo el ensamblaje deberás ingresar el siguiente código:
#include <Adafruit_NeoPixel.h> #include <WiFi101.h> #define PIN 12 #define NUMPIXELS 10 #define interval 50 #define wifiRetryTimes 0 Adafruit_NeoPixel píxeles = Adafruit_NeoPixel ( NUMPIXELS , PIN , NEO_GRB + NEO_KHZ800 ); uint32_t rojo = píxeles . Color ( 255 , 0 , 0 ); uint32_t azul = píxeles . Color ( 0 , 0 , 255 ); uint32_t verde = píxeles . Color ( 0 , 255 , 0 ); uint32_t pixelColour ; uint32_t lastColor ; float activeColor [] = { 255 , 0 , 0 }; IPAddress apIP ( 192 , 168 , 0 , 150 ); IPAddress netMsk ( 255 , 255 , 255 , 0 ); Dirección IP gw ( 192 , 168 , 0 , 1 ); Dirección IP dns ( 192 , 168 , 0 , 1 ); IP de cadena ; char APssid [] = "MKR1000" ; char APpass [] = "MKR1000" ; char ssid [] = "YourSSID" ; char pass [] = "YourPassword" ; int keyIndex = 0 ; int status = WL_IDLE_STATUS ; Servidor WiFiServer ( 80 ); const char html1 [] PROGMEM = "<! DOCTYPE html> <html> <head> <meta http-equiv = 'X-UA-Compatible' content = 'IE = Edge'> <meta charset = 'utf-8'> <title> Neopixel Color Picker < / título> " "<style type = 'text / css'>. bt {display: block; width: 250px; height: 100px; padding: 10px; margin: 10px; text-align: center; border-radius: 5px; color: white; font-weight: bold; font-size: 40px; text-decoration: none;} body {background: # 000;} " ".red {fondo: rojo; color: blanco;}. verde {fondo: # 0C0; color: blanco;}. azul {fondo: azul; color: blanco;}" ".white {fondo: blanco; color: negro; borde: 1px negro sólido;}. off {fondo: # 666; color: blanco;}. colorPicker {fondo: blanco; color: negro;}. colorWipe {tamaño de fuente : 40px; fondo: degradado lineal (a la derecha, rojo, # 0C0, azul);} " ".theatreChase {font-size: 40px; background: linear-gradient (a la derecha, rojo, negro, rojo, negro, # 0C0, negro, # 0C0, negro, azul, negro, azul);}" ".rainbow {tamaño de fuente: 40px; fondo: rojo; fondo: degradado lineal (a la derecha, rojo, naranja, amarillo, verde, azul, índigo, violeta, rojo, naranja, amarillo, verde, azul, índigo, violeta) );} " ".rainbowCycle {tamaño de fuente: 40px; fondo: rojo; fondo: degradado lineal (a la derecha, rojo, naranja, amarillo, verde, azul, índigo, violeta);}" ".rainbowChase {tamaño de fuente: 40px; fondo: rojo; fondo: degradado lineal (a la derecha, rojo, negro, naranja, negro, amarillo, negro, verde, negro, azul, negro, índigo, negro, violeta); } " ; const char html2 [] PROGMEM = ".breathe {fondo: azul; color: blanco;}. cylon {fondo: rojo; color: negro;}. latido {fondo: rojo; color: blanco;}. NAVIDAD {tamaño de fuente: 40px; fondo: rojo; fondo: degradado lineal (a la derecha, rojo, verde, rojo, verde, rojo, verde, rojo, verde, rojo, verde, rojo, verde);} " ".TODOS {fondo: blanco; color: azul;}. Y {fondo: # EE0; alto: 100px; ancho: 100px; radio del borde: 50px;}. B {fondo: # 000; alto: 100px; ancho: 100px; border-radius: 50px;}. A {font-size: 35px;} td {vertical-align: middle;} " "td {vertical-align: middle;} </style> </head>" "<script type = 'text / javascript'>" ; const char html3 [] PROGMEM = "función ResetWebpage () {if (window.location.href! = 'http: // # IPADDRESS /') {window.open ('http: // # IPADDRESS /', '_ self', true)}};" // cambie el valor del sitio web aquí a su sitio web estático "función myFunction () {document.getElementById ('brilloLevel'). submit ();} </script>" "<body onload = 'ResetWebpage ()'> <table> <tr> <td width = '100'> <div class = 'TGT00'> </div> </td> <td> <a class = 'bt red 'href =' / L00? v = 1 '> Rojo </a> </td> <td> <a class='bt colorWipe' href='/L01?v=1'> Color Wipe </a> </td> <td> <div class = 'TGT01'> </div> </td> </tr> " "<tr> <td> <div class = 'TGT02'> </div> </td> <td> <a class='bt green' href='/L02?v=1'> Verde </a> </td> <td> <a class='bt theatreChase' href='/L03?v=1'> Theatre Chase </a> </td> <td> <div class = 'TGT03'> </ div > </td> </tr> " "<tr> <td> <div class = 'TGT04'> </div> </td> <td> <a class='bt blue' href='/L04?v=1'> Azul </a> </td> <td> <a class='bt rainbow' href='/L05?v=1'> Rainbow </a> </td> <td> <div class = 'TGT05'> </div> </td> </tr> " "<tr> <td> <div class = 'TGT06'> </div> </td> <td> <a class='bt white' href='/L06?v=1'> White </a> </td> <td> <a class='bt rainbowChase' href='/L07?v=1'> Rainbow Chase </a> </td> <td> <div class = 'TGT07'> </ div > </td> </tr> " ; const char html4 [] PROGMEM = "<tr> <td> <div class = 'TGT08'> </div> </td> <td> <a class='bt cylon' href='/L08?v=1'> Cylon Chaser </ a > </td> <td> <a class='bt rainbowCycle' href='/L09?v=1'> Rainbow Cycle </a> </td> <td> <div class = 'TGT09'> </ div> </td> </tr> " "<tr> <td> <div class = 'TGT10'> </div> </td> <td> <a class='bt breathe' href='/L10?v=1'> Breathe </a> </td> <td> <a class='bt heartbeat' href='/L11?v=1'> Heartbeat </a> </td> <td> <div class = 'TGT11'> </div> </td> </tr> " "<tr> <td> <div class = 'TGT12'> </div> </td> <td> <a class='bt XMAS' href='/L12?v=1'> Navidad </a> </td> <td> <a class='bt ALL' href='/L13?v=1'> Ciclo TODO </a> </td> <td> <div class = 'TGT13'> </ div > </td> </tr> " "<tr> <td> <div class = 'TGT14'> </div> </td> <td> <a class='bt off' href='/L14?v=1'> Desactivado </a> </td> <td> <form id = 'shineLevel'> <input type = 'range' name = 'bright' max = '255' min = '0' value = '# BRIGHT' onchange = 'myFunction ()' class = 'bt off'> </form> </td> </tr> " "</table> </body> </html>" ; String sendHtml3 = html3 ; String sendHtml4 = html4 ; String currentLine; boolean NeoState[] = {false, false, false, false, false, false, false, false, false, false, false, false, false, false, true}; //Active Neopixel Function (off by default) int neopixMode = 0; long previousMillis = 0 ; long lastAllCycle = 0 ; long previousColorMillis = 0 ; int i = 0 ; int CWColor = 0 ; int j ; int ciclo = 0 ; int TCColor = 0 ; int l = 0 ; int m = 0 ; int n = 2 ; int respiradero = 0 ; latido booleano = verdadero ; int beats = 0 ; int brillo = 150 ; int o = 0 ; int q = 5 ; uint32_t lastAllColor = 0 ; configuración vacía () { píxeles . comenzar (); píxeles . setBrightness ( brillo ); writeLEDS ( 0 , 0 , 0 ); Serial . comenzar ( 9600 ); Serial . println ( ssid ); if ( WiFi . status () == WL_NO_SHIELD ) { Serial . println ( F ( "escudo WiFi no presente" )); while ( verdadero ); } WiFi . config ( apIP ); //WiFi.config(apIP, dns, gw, netMsk); while ( status ! = WL_CONNECTED ) { para ( int x = 0 ; x <= wifiRetryTimes ; x ++ ) { Serial . print ( F ( "Intentando conectarse a la red denominada:" )); Serial . println ( ssid ); } Serial . print ( F ( "No se pudo conectar a Wifi" )); estado = WiFi . beginAP ( APssid ); // crea un AP - IP es actualmente estático a 192.168.1.1 // estado = WiFi.beginAP (APssid, APpass); retraso ( 10000 ); romper ; } printWifiStatus (); sendHtml3 . reemplazar ( "#IPADDRESS" , IP ); sendHtml4 . reemplazar ( "#BRIGHT" , "150" ); Serial . println ( F ( "¡¡Servidor USP iniciado !!" )); servidor . comenzar (); Serial . println ( F ( "¡¡servidor HTTP iniciado !!" )); } bucle vacío () { Cliente WiFiClient = servidor . disponible (); if ( cliente ) { println(F("new client")); currentLine = ""; while (client.connected()) { if (client.available()) { char c = client.read(); Serial . escribir ( c ); if ( c == '\ n' ) { cliente . println ( "Tipo de contenido: texto / html" ); cliente . println (); cliente . imprimir ( F ( html1 )); cliente . imprimir ( F ( html2 )); cliente . imprimir ( sendHtml3 ); cliente . imprimir ( sendHtml4 ); cliente . println (); romper ; } else { // si tiene una nueva línea, vas a tener que borrar currentLine: if ( currentLine . indexOf ( "Referer" ) < 0 ) { // realiza siempre que Referer no esté en el valor devuelto if ( currentLine . indexOf ( "/ L00" ) > 0 ) { // si / L00 está presente en la cadena handle_L00 (); // ejecuta la función } if ( currentLine . indexOf ( "/ L01" ) > 0 ) { handle_L01 (); } if ( currentLine . indexOf ( "/ L02" ) > 0 ) { handle_L02 (); } if ( currentLine . indexOf ( "/ L03" ) > 0 ) { handle_L03 (); } if ( currentLine . indexOf ( "/ L04" ) > 0 ) { handle_L04 (); } if ( currentLine . indexOf ( "/ L05" ) > 0 ) { handle_L05 (); } if ( currentLine . indexOf ( "/ L06" ) > 0 ) { handle_L06 (); } if ( currentLine . indexOf ( "/ L07" ) > 0 ) { handle_L07 (); } if ( currentLine . indexOf ( "/ L08" ) > 0 ) { handle_L08 (); } if ( currentLine . indexOf ( "/ L09" ) > 0 ) { handle_L09 (); } if ( currentLine . indexOf ( "/ L10" ) > 0 ) { handle_L10 (); } if ( currentLine . indexOf ( "/ L11" ) > 0 ) { handle_L11 (); } if ( currentLine . indexOf ( "/ L12" ) > 0 ) { handle_L12 (); } if ( currentLine . indexOf ( "/ L13" ) > 0 ) { handle_L13 (); } if ( currentLine . indexOf ( "/ L14" ) > 0 ) { handle_L14 (); } if ( currentLine . indexOf ( "brillante" ) > 0 ) { handle_bright (); } } currentLine = "" ; } } else if ( c ! = '\ r' ) currentLine + = c ; } if ( currentLine . endsWith ( "/ generate_204" )) { handle_root (); } } } // cierra la conexión: cliente . detener (); Serial . println ( F ( "cliente desconectado" )); } NeoPixModes (); }
Registro de valores de temperatura
Vas a necesitar una placa Arduino MKR Zero, condensador 100 nF, una resistencia de 4.75 k ohmios, un sensor de temperatura y humedad, una placa de inserción, cables y una tarjeta MicroSD. Con este proyecto obra llevar un registro de los valores de temperatura y humedad que registra tu dispositivo.
Tendrás que ensamblar el Arduino con la placa de pruebas, luego el sensor de temperatura y humedad con la placa de pruebas, después de esto tendrás que conectar el pin de alimentación del sensor al pin VCC y por último conectar el pin de datos del sensor con el pin7. Cuando termines deberás llevar el pin de tierra que tiene el sensor de humedad y temperatura al pin GND de la placa de Arduino. A continuación, conectarás el condensador con el GND y la resistencia.
Una vez que termines deberás ingresar estos códigos:
#include <SD.h> #include <RTCZero.h> #include <DHT.h> #define DHTPIN 7 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); const int chipSelect = SS1; unsigned long previousTime; int loadDataCheck; RTCZero rtc; const byte seconds = 50; const byte minutes = 44; const byte hours = 17; const byte day = 1; const byte month = 9; const byte year = 16; void setup() { pinMode(LED_BUILTIN, OUTPUT); begin(9600); println("DataLogger Example:"); if (!SD.begin(chipSelect)) { println("Card failed, or not present"); return; } println("card initialized."); //When power is supplied to the DHT22 sensor, //don't send any instruction to the sensor //within one second to pass unstable status delay(1000); println("Initializing DHT"); begin(); println("Initializing RTC"); begin(); setTime(hours, minutes, seconds); setDate(day, month, year); setAlarmTime(0, 0, 0); enableAlarm(rtc.MATCH_SS); attachInterrupt(dataCheck); loadDataCheck=0; previousTime=millis(); println("System ready..."); } void loop() { unsigned long currentTime=millis(); if ((currentTime-previousTime)>5000) { digitalWrite(LED_BUILTIN, HIGH); delay(100); digitalWrite(LED_BUILTIN, LOW); previousTime=millis(); } if (loadDataCheck) logData(); } void dataCheck(){ loadDataCheck=1; } void logData(void) { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); String dataString = ""; dataString += "Temperature: " + String(temperature) + " C" + "\t" + "Humidity: " + String(humidity) + "%\t" + "Time: " + getTime(); File dataFile = SD.open("datalog.txt", FILE_WRITE); // if the file is available, write to it: if (dataFile) { println(dataString); close(); // print to the Serial port too: println(dataString); } String getTime(void) { String returnString = ""; if (rtc.getHours() < 10) returnString += "0" + String(rtc.getHours()); else returnString += String(rtc.getHours()); returnString += ":"; if (rtc.getMinutes() < 10) returnString += "0" + String(rtc.getMinutes()); else returnString += String(rtc.getMinutes()); returnString += ":"; if (rtc.getSeconds() < 10) returnString += "0" + String(rtc.getSeconds()); else returnString += String(rtc.getSeconds()); return returnString; }
Robot Arduino Zero
Podrás crear un robot con una placa de Arduino. Para ello vas a necesitar un adaptador de Arduino MKR2UNO, una placa Arduino MotorShield Rev3, motor de corriente continua, cables y una batería de 9V. Cuando tengas estos materiales vas a tener que ensamblarlos pegando el motor y luego haciendo las conexiones que indican las piezas.
A continuación, tendrás que ingresar estos códigos:
#include <SPI.h> #include <WiFi101.h> #include <WiFiMDNSResponder.h> #include "arduino_secrets.h" char ssid[] = SECRET_SSID; char pass[] = SECRET_PASS; int keyIndex = 0; char mdnsName[] = "WiFiRobot"; int status = WL_IDLE_STATUS; WiFiServer server(80); String readString; const int pinDirA = 12; const int pinDirB = 0; const int pinPwmA = 3; const int pinPwmB = 11; const int pinBrakeA = 9; const int pinBrakeB = 8; const int motorSpeed = 200; const int stepsDelay = 500; void setup() { pinMode(pinDirA, OUTPUT); pinMode(pinPwmA, OUTPUT); pinMode(pinBrakeA, OUTPUT); pinMode(pinDirB, OUTPUT); pinMode(pinPwmB, OUTPUT); pinMode(pinBrakeB, OUTPUT); brake(); begin(9600); if (WiFi.status() == WL_NO_SHIELD) { println("WiFi shield not present"); // don't continue: while (true); } while ( status != WL_CONNECTED) { print("Attempting to connect to SSID: "); println(ssid); status = WiFi.begin(ssid, pass); delay(10000); } printWiFiStatus(); begin(); if (!mdnsResponder.begin(mdnsName)) { println("Failed to start MDNS responder!"); while (1); } print("Server listening at http://"); print(mdnsName); println(".local/"); println(); } void loop() { poll(); WiFiClient client = server.available(); if (client) { println("new client"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); readString += c; write(c); if (c == '\n' && currentLineIsBlank) { // send a standard http response header println("HTTP/1.1 200 OK"); println("Content-Type: text/html"); println("Connection: close"); //client.println("Refresh: 5"); println(); println("<!DOCTYPE HTML>"); println("<head><title>WiFi Robot</title></head>"); println("<center><hr/><p> Click the Buttons to move the robot <p/><hr/></center>"); println("<center><input type=button value='GO UP' onmousedown=location.href='/?GO_UP'></center><br/>"); println("<center><left><input type=button value='GO LEFT' onmousedown=location.href='/?GO_LEFT'><input type=button value='GO RIGHT' onmousedown=location.href='/?GO_RIGHT'></center><br/>"); println("<center><input type=button value='GO DOWN' onmousedown=location.href='/?GO_DOWN'></right></center><br/><br/>"); println("<hr/>"); println("</body>"); println("</html>"); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(1); stop(); if (readString.indexOf("/?GO_UP") > 0) { println(); println("UP"); println(); goUp(); } if (readString.indexOf("/?GO_DOWN") > 0) { println(); println("DOWN"); println(); goDown(); } if (readString.indexOf("/?GO_LEFT") > 0) { println(); println("LEFT"); println(); goLeft(); } if (readString.indexOf("/?GO_RIGHT") > 0) { println(); println("RIGHT"); println(); goRight(); } readString = ""; println("client disconnected"); } } void printWiFiStatus() { print("SSID: "); println(WiFi.SSID()); IPAddress ip = WiFi.localIP(); print("IP Address: "); println(ip); long rssi = WiFi.RSSI(); print("signal strength (RSSI):"); print(rssi); println(" dBm"); } void goDown(void) { motorAforward(); motorBforward(); delay(stepsDelay); brake(); } void goUp(void) { motorBbackward(); motorBbackward(); delay(stepsDelay); brake(); } void goLeft(void) { motorAforward(); motorBbackward(); delay(2*stepsDelay); brake(); } void goRight(void) { motorBforward(); motorAbackward(); delay(2*stepsDelay); brake(); } void motorAforward(void) { digitalWrite(pinDirA, HIGH); digitalWrite(pinBrakeA, LOW); analogWrite(pinPwmA, motorSpeed); } void motorAbackward(void) { digitalWrite(pinDirA, LOW); digitalWrite(pinBrakeA, LOW); analogWrite(pinPwmA, motorSpeed); } void motorBforward(void) { digitalWrite(pinDirB, HIGH); digitalWrite(pinBrakeB, LOW); analogWrite(pinPwmB, motorSpeed); } void motorBbackward(void) { digitalWrite(pinDirB, LOW); digitalWrite(pinBrakeB, LOW); analogWrite(pinPwmB, motorSpeed); } void brake(void) { digitalWrite(pinBrakeA, HIGH); digitalWrite(pinBrakeB, HIGH); }