terça-feira, 12 de maio de 2020

NINA B302 ACESSANDO VIA WIFI UM SERVIDOR NODE-RED


U-BLOX NINA B302 e WIFI - ARDUINO
ACESSANDO UM SERVIDOR HTTP (NODE-RED)

O objetivo deste BLOG é mostrar um exemplo em ARDUINO que permite o NINA B302 acessar um servidor WEB via WIFI, o qual foi desenvolvido em NODE-RED. Utiliza o COPROCESSOR W102 (WIFININA), via 802.11.

WIFI COPROCESSOR é baseado no NINA W102, o qual permite que você tenha acesso a INTERNET, via SPI.

Utilize a programação clássica com Sockets do Arduino!


COPROCESSOR PARA O NINA B302

NODE-RED

O Node-RED é uma ferramenta de programação baseada em fluxo, originalmente desenvolvida pela equipe de Serviços de Tecnologia Emergentes da IBM e agora parte da Fundação JS .

Programação Baseada em Fluxo

Inventado por J. Paul Morrison na década de 1970, a programação baseada em fluxo é uma maneira de descrever o comportamento de uma aplicação como uma rede de caixas pretas, ou “nós”, como são chamados no Node-RED. Cada nó tem um propósito bem definido; é dado alguns dados, faz algo com esses dados e depois passa esses dados. A rede é responsável pelo fluxo de dados entre os nós.

É um modelo que se presta muito bem a uma representação visual e o torna mais acessível a uma ampla gama de usuários. Se alguém pode dividir um problema em etapas discretas, ele pode analisar um fluxo e ter uma noção do que está fazendo; sem ter que entender as linhas individuais de código dentro de cada nó.


Instale NODE-RED em sua plataforma, pode ser RASPBERRY também


MONTAGEM

Adquirimos então os seguintes componentes



Montado ficou assim



O esquema elétrico é este



Algumas características do Kit

-Botão de RESET;
-Botão de Modo BOOTLOADER (W102);
-Plugável no PROTOBOARD;
-Acesso às várias GPIOS;

Pequena 


Abaixo o roteiro para você seguir:

Baixe e instale o Arduino IDE 
Inicie o Arduino IDE, vá em Preferências e adicione 

https://www.adafruit.com/package_adafruit_index.json



como "URL adicional do gerenciador de pastas"

Abra o Boards Manager no menu Tools -> Board e instale o "Adafruit nRF52 by Adafruit"

Selecione sua placa nRF5 no menu Ferramentas -> Placa

Adafruit Bluefruit nRF52 Feather



OBSERVAÇÃO: Durante a instalação, o Arduino IDE leva alguns minutos para extrair as ferramentas após o download, por favor, seja paciente.

Gravando bootloader da Adafruit

Use o gravador SEGGER JLINK para gravar o BREAKOUT com módulo NINA B302, conecte nos pinos do SWCLK (pino 7) e SWDIO (pino 9) do SEGGER JLINK nos pinos  SWDCLK e SWDIO do BREAKOUT (pinos nas laterais, próximo à antena). Não esquecer de ligar os GND do BREAKOUT no GND do SEGGER JTAG, bem como alimentar o BREAKOUT com 3.3V.



Ligue os pinos SWD DIO e CLK ...
...nestes pinos da placa BREAKOUT

Você pode também usar o ST-LINK V2



Abra J-FLASH lite e grave o bootloader da Adafruit




O mesmo se encontra em 

....\packages\adafruit\hardware\nrf52\0.19.0\bootloader\feather_nrf52840_express

Compile depois para o NINA B302
https://github.com/adafruit/Adafruit_nRF52_Bootloader

Com ele, você poderá transferir programas via DFU USB. Maiores detalhes sobre este bootloader

https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/update-bootloader

Segundo a documentação, se você pressionar o reset, o módulo aguardará por um certo tempo se há algo sendo enviado pelo Arduino, ou seja, o programa a ser gravado via DFU.

ATENÇÃO, o bootloader usa USB para gravação do NINA 302, OU SEJA, CRIA UMA COMM VIRTUAL, TAMBÉM PARA SER A SERIAL PADRÃO DO ARDUINO

INSTALE OS DRIVERS
https://github.com/adafruit/Adafruit_Windows_Drivers

Conecte na USB + e USB - um cabo USB, AGUARDE INSTALAR OS DRIVERS



Aqui você encontra variant.cpp e variant.h e boards.txt
Ligue os pino do NINA B302 no NINA W102 (com WIFININA GRAVADO)

 

BREAKOUT B3

 

BREAKOUT W1

 

CS

IO1

P0.13

IO28

5

READY

IO2

P0.14

IO7

33

RESET

IO21

P1.12

RESET

RESET

SCK

IO45

P0.07

IO29

18

MOSI

IO3

P0.15

IO31

14

MISO

IO8

P1.00

IO1

23

GPIO0

IO4

P0.16

IO27

0

 

 

 

 

 



INSTALE LIB WIFI GENERIC - EXEMPLOS QUE USAM W102 COPROCESSOR

Thanks to Khoi Hoang to help to port WIFI GENERIC to NINA B302

https://github.com/khoih-prog/WiFiNINA_Generic

INSTALE LIB HttpClient

CRIE UM PROJETO E COPIE O PROGRAMA ABAIXO

/**************************************************************************************************************************** WiFiWebClient.ino This sketch connects to a website (http://www.google.com) using the WiFi module. This example is written for a network using WPA encryption. For WEP or WPA, change the Wifi.begin() call accordingly. This example is written for a network using WPA encryption. For WEP or WPA, change the Wifi.begin() call accordingly. Circuit: Board with NINA module (Arduino MKR WiFi 1010, MKR VIDOR 4000 and UNO WiFi Rev.2) created 13 July 2010 by dlf (Metodo2 srl) modified 31 May 2012 by Tom Igoe Based on and modified from WiFiNINA libarary https://www.arduino.cc/en/Reference/WiFiNINA to support other boards besides Nano-33 IoT, MKRWIFI1010, MKRVIDOR4000, etc. Built by Khoi Hoang https://github.com/khoih-prog/ESP8266_AT_WebServer Licensed under MIT license Version: 1.5.1 Copyright (c) 2018 Arduino SA. All rights reserved. Copyright (c) 2011-2014 Arduino LLC. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Version Modified By Date Comments ------- ----------- ---------- ----------- 1.5.0 K Hoang 27/03/2020 Initial coding to support other boards besides Nano-33 IoT, MKRWIFI1010, MKRVIDOR4000, etc. such as Arduino Mega, Teensy, SAMD21, SAMD51, STM32, etc 1.5.1 K Hoang 22/04/2020 Add support to nRF52 boards, such as AdaFruit Feather nRF52832, nRF52840 Express, BlueFruit Sense, Itsy-Bitsy nRF52840 Express, Metro nRF52840 Express, etc. *****************************************************************************************************************************/ #include <SPI.h> #include <WiFiNINA_Generic.h> #include <ArduinoHttpClient.h> ///////please enter your sensitive data in the Secret tab/arduino_secrets.h char ssid[] = "Andreia Oi Miguel 2.4G"; // your network SSID (name) char pass[] = "XXXXXXXXX"; // your network password (use for WPA, or use as key for WEP), length must be 8+ int keyIndex = 0; // your network key Index number (needed only for WEP) int status = WL_IDLE_STATUS; // if you don't want to use DNS (and reduce your sketch size) // use the numeric IP instead of the name for the server: //IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) char server[] = "192.168.100.6"; // name address for Google (using DNS) int port = 1880; // Initialize the Ethernet client library // with the IP address and port of the server // that you want to connect to (port 80 is default for HTTP): WiFiClient client; HttpClient clientHttp = HttpClient(client, server, port); void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true); } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to Wifi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } Serial.println("Connected to wifi"); printWifiStatus(); } void loop() { Serial.println("making POST request"); String contentType = "application/json";
//Dados estáticos String postData = "{\"api_key\":\"tPmAT5Ab3j7F9\",\"sensor_name\":\"BME280\",\"temperature\":24.25,\"humidity\":49.54,\"pressure\":1005.14}"; clientHttp.post("/update-sensor", contentType, postData); // read the status code and body of the response int statusCode = clientHttp.responseStatusCode(); String response = clientHttp.responseBody(); Serial.print("Status code: "); Serial.println(statusCode); Serial.print("Response: "); Serial.println(response); Serial.println("Wait five seconds"); delay(5000); } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }




Compile o programa WifiWebClient e pressione o botão para gravar.

Altere suas credenciais

char ssid[] = "Andreia Oi Miguel 2.4G"; // your network SSID (name)
char pass[] = "XXXXXXXXX"; // your network password (use for WPA, or use as key for WEP), length must be 8+

e o servidor, bem como a porta

char server[] = "IP DO NODE-RED"; // name address for Google (using DNS)
int port = 1880;



Ao aparecer a mensagem "Upgrading target on COM...", pressione imediatamente o botão de reset do módulo NINA B302



Como podem observar, o programa será transferido!
 
Abra a serial



Veja o NODE-RED recebendo os Dados




Entre na Interface de Sensores no Servidor NODE-RED


Projeto Node-Red server - Import

[{"id":"5ddcb592.3a70dc","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"9530ca8e.045538","type":"http response","z":"5ddcb592.3a70dc","name":"","statusCode":"200","headers":{},"x":460,"y":340,"wires":[]},{"id":"be436d76.bf13d","type":"debug","z":"5ddcb592.3a70dc","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":650,"y":360,"wires":[]},{"id":"2f5a0ca4.0f9004","type":"http in","z":"5ddcb592.3a70dc","name":"","url":"update-sensor","method":"post","upload":false,"swaggerDoc":"","x":240,"y":391,"wires":[["9530ca8e.045538","be436d76.bf13d","904d0ec6.732d3"]]},{"id":"904d0ec6.732d3","type":"json","z":"5ddcb592.3a70dc","name":"","property":"payload","action":"obj","pretty":true,"x":450,"y":460,"wires":[["be436d76.bf13d","8deb0cec.b657"]]},{"id":"f32e4a01.6f0ef8","type":"ui_gauge","z":"5ddcb592.3a70dc","name":"","group":"b5806088.39ff4","order":4,"width":0,"height":0,"gtype":"gage","title":"Pressure","label":"hPa","format":"{{value}}","min":0,"max":"1200","colors":["#b366ff","#8000ff","#440088"],"seg1":"","seg2":"","x":880,"y":600,"wires":[]},{"id":"8e71a3f.85b6e6","type":"ui_gauge","z":"5ddcb592.3a70dc","name":"","group":"b5806088.39ff4","order":3,"width":0,"height":0,"gtype":"gage","title":"Humidity","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#0080ff","#0062c4","#002f5e"],"seg1":"","seg2":"","x":880,"y":540,"wires":[]},{"id":"fb783753.cabd68","type":"ui_gauge","z":"5ddcb592.3a70dc","name":"","group":"b5806088.39ff4","order":2,"width":0,"height":0,"gtype":"gage","title":"Temperature","label":"ºC","format":"{{value}}","min":0,"max":"38","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":890,"y":480,"wires":[]},{"id":"ecd86985.bf61c8","type":"ui_text","z":"5ddcb592.3a70dc","group":"b5806088.39ff4","order":1,"width":0,"height":0,"name":"","label":"Sensor Name","format":"{{msg.payload}}","layout":"row-spread","x":900,"y":420,"wires":[]},{"id":"8deb0cec.b657","type":"function","z":"5ddcb592.3a70dc","name":"JSON or URL Encoded","func":"var msg0 = { payload: msg.payload.api_key };\nvar msg1 = { payload: msg.payload.sensor_name };\nvar msg2 = { payload: msg.payload.temperature };\nvar msg3 = { payload: msg.payload.humidity };\nvar msg4 = { payload: msg.payload.pressure };\n\nreturn [msg0, msg1, msg2, msg3, msg4];","outputs":5,"noerr":0,"x":650,"y":460,"wires":[["be436d76.bf13d"],["ecd86985.bf61c8"],["fb783753.cabd68"],["8e71a3f.85b6e6"],["f32e4a01.6f0ef8"]]},{"id":"b5806088.39ff4","type":"ui_group","z":"","name":"SENSORS","tab":"667c00e9.9ac12","disp":true,"width":"6","collapse":false},{"id":"667c00e9.9ac12","type":"ui_tab","z":"","name":"HTTP","icon":"dashboard","order":1,"disabled":false,"hidden":false}]
https://github.com/arduino-libraries/ArduinoHttpClient


Sobre a SMARTCORE

A SmartCore fornece módulos para comunição wireless, biometria, conectividade, rastreamento e automação.
Nosso portifólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.
Mais detalhes em www.smartcore.com.br