segunda-feira, 13 de julho de 2020

NINA B302 SENDO ACESSADO VIA ROBLOX

ROBLO-IoT e ThingSpeak

O objetivo deste BLOG é apresentar uma ideia geral de como o NINA B302 possa ser comandado pelo jogo ROBLOX  e assim acender ou apagar uma lampada quando no mapa do mesmo você acionar ou não um botão, a contagem de pessoas que visitaram o mapa ROBLOX será registrada, foi utilizado como ponte o ThingSpeak. 

Uma proposta para se utilizar o ROBLOX para aplicações para Internet Das Coisas junto com ThingSpeak.

Talvez seja a primeira aplicação do ROBLOX para IoT (Internet of Things)
ROBLOX


THINGSPEAK

ADAFRUIT LIB

ROBLOX

Roblox é um MMO (jogo online com múltiplos jogadores) e, principalmente, uma plataforma de criação e desenvolvimento de jogos pelos próprios usuários. Diferente de Minecraft, que é um sandbox (um jogo onde o jogador pode fazer e criar o que quiser), Roblox foi criado como uma ferramenta educacional para ensinar conceitos de Física para crianças.

Lançado originalmente em 2006, não levou muito tempo para os usuários usarem Roblox (que no início se chamava DynaBlocks) para criar seus próprios jogos e mundos, de diversas temáticas. A partir daí, a desenvolvedora Roblox Corp. abriu o desenvolvimento e tornou a ferramenta um jogo livre (saindo do foco educacional).

ADAFRUIT WIFININA/ADAFRUIT NRF52 ARDUINO



A Adafruit foi fundada em 2005 pelo engenheiro do MIT, Limor "Ladyada" Fried. Seu objetivo era criar o melhor local on-line para o aprendizado de eletrônicos e para a fabricação dos melhores produtos projetados para fabricantes de todas as idades e níveis de habilidade.

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

THINGSPEAK


Thingspeak é uma plataforma de análise IoT (Internet of Things) que permite agregar, visualizar e analisar streams de dados, de uma forma muito simples. Uma das grandes vantagens da plataforma Thingspeak é que nos permite visualizar os dados enviados pelos nossos dispositivos, em tempo real, mas também a possibilidade de analisar os mesmo recorrendo ao poderoso Matlab.


Instalando Arduino Adafruit no NINA B302


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

Mudar NRF52840
 
O mesmo se encontra em 

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

Compile depois para o NINA B302

Com ele, você poderá transferir programas via DFU USB. Maiores detalhes sobre este 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

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


Futuramente altere arquivo variant.cpp para que as GPIOS sejam os mesmos do NINA B302, atualmente estão para o ADAFRUIT FEATHER EXPRESS.

Copie 

Criado pelo Autor

boards.txt
variant.h
viariant.cpp



CONFIGURAÇÃO DO ThingSpeak
 
1) Crie um conta no ThingSpeack

2) Em Channel Settings crie dois Fields: Field1 e Field2




3) Em API keys anote as chaves para escrita e Leitura de dados noThingsSpeak



4) Teremos então basicamente duas URLS, uma para escrita e outra para leitura dos Fields.

https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXXX&field1=X&field2=XXXX
https://api.thingspeak.com/channels/CCCCCCCCC/fields/1.json?api_key=XXXXXXXXXXXXXX
&results=
1

Instale o Roblox

Como instalar o Roblox 

  1. Vá ao site da Roblox e faça o login na sua conta.
  2. Ao entrar no Roblox, visite qualquer jogo e clique no botão verde Jogar.
  3. Uma janela pop-up aparecerá informando que o Roblox está instalando
  4. Uma vez instalado, o jogo será aberto automaticamente.

Nota: Uma janela pop-up secundária pode aparecer solicitando que você selecione um programa. Selecione Roblox e confirme. Se você optar por lembrar de sua escolha, não precisará realizar essa ação no futuro.

Uma vez instalado o ROBLOX, seja no PC ou em seu celular,  procure por ROBLO-IoT



Conhecendo com ROBLO-IoT, casa da Internet Das Coisas

Visitando a Casa

No lado Esquerdo, a Lâmpada, no Lado Direito o Botão, ambos conectados com ThingSpeak

Quando o botão estiver Preto, significa desligado, ao pressioná-lo ficará verde e depois de alguns instantes a lâmpada acenderá. Aguarde 15 segundos para novamente você pressionar-lo, depois de alguns instantes a lâmpada apagará.

Aqui ROBLOX apertou o botão, então o Abajour ligou e contador de visitas incrementou, tudo via ThingSpeak


Resumo da Operação

Como funciona:

Toda vez o Roblox toca o Botão, uma mensagem via HTTP é enviada para o ThingSpeak, contendo o estado do Botão.

Toda vez que o Botão é pressionado para Ligar, é enviado enviado para o ThingSpeak uma atualização de vezes/visita que o botão foi pressionado.

A cada cinco segundos, o Roblox faz uma requisição ao ThingSpeak solicitando o estado do botão, então acende ou apaga o Abajour conforme seu valor. Também é atualizado um painel com as visitas realizadas por todo ROBLOX MANIACS do mundo todo!

A placa U-blox a cada cinco segundos fará uma requisição HTTP ao ThingSpeak sobre o estado do Botão e assim acender ou apagar um LED.

LUA SCRIPT (não foi utilizado JSON)

No Script tem algumas dicas.

local HttpService = game:GetService("HttpService") local Result --Http local URL_ISS --Http request local function printISS() local response local data -- Use pcall in case something goes wrong pcall(function () response = HttpService:GetAsync(URL_ISS) end) if not response then return false end Result=response return true end --Get last ThingSpeak State function Last_State_Counter() wait(5) URL_ISS="https://api.thingspeak.com/channels/1097028/feeds.json?api_key=xxxxxxxxxC&results=1" printISS() --print(Result) --{"channel":{"id":1097028,"name":"ROBLOX","description":"Experimental Test","latitude":"0.0","longitude":"0.0","field1":"Field Label 1","field2":"Field Label 2","created_at":"2020-07-10T18:15:15Z","updated_at":"2020-07-13T00:37:00Z","last_entry_id":179},"feeds":[{"created_at":"2020-07-13T02:17:23Z","entry_id":179,"field1":"1","field2":"7"}]} --Not Using JSON local S_begin, S_end = string.find(Result,"\"field1\":\"",-32) --got 0 or 1 (OFF or ON) local On_Off = string.sub(Result, S_end + 1 , S_end + 1) if On_Off == "0" then workspace.Lamp1.Light.PointLight.Enabled = false State_1=0; workspace.Button1.Button.BrickColor = BrickColor.Black() end if On_Off == "1" then workspace.Lamp1.Light.PointLight.Enabled = true State_1=1; workspace.Button1.Button.BrickColor = BrickColor.Green() end --search at last 32 characters --"field2":"9999"}]} local S_begin, S_end = string.find(Result,"\"field2\":\"",-32) Result = string.sub(Result,S_end+1) --remove "}]} Counter = string.gsub(Result,"\"}]}","") --print(Counter) workspace.Sign.Text.SurfaceGui.TextLabel.Text = "Visits: " .. Counter end --Button Event with Debounce function debounce(func) local isRunning = false -- Create a local debounce variable return function(...) -- Return a new function if not isRunning then isRunning = true func(...) -- Call it with the original arguments isRunning = false end end end workspace.Button1.Button.Touched:Connect(debounce(function(hit) --print("Button 1 pressed, sending IoT info") --Print the message if State_1==0 then --&field = 1 = ON Counter = Counter + 1 URL_ISS = "https://api.thingspeak.com/update?api_key=xxxxxxxxx&field1=1&field2=" .. Counter workspace.Button1.Button.BrickColor = BrickColor.Red() State_1 = 1 else --&field = 0 = OFF URL_ISS = "https://api.thingspeak.com/update?api_key=xxxxxxxxxQ&field1=0&field2=" .. Counter workspace.Button1.Button.BrickColor = BrickColor.Black() State_1 = 0 end printISS() wait(15) --Wait for 15 second to ThingSpeaks accept other command --print(Result) --print("Sent") end)) --Get Last state of ThingSpeak, you can modify direcly on Browser Last_State_Counter() workspace.Sign.Text.SurfaceGui.TextLabel.Text = "Visits: 0000" --Main loop (each 5 seconds, see the State of Key (thingspeak) and Turn On/off a Light! while 1==1 do wait(5) URL_ISS="https://api.thingspeak.com/channels/1097028/feeds.json?api_key=xxxxxxxxx&results=1" printISS() print(Result) --{"channel":{"id":1097028,"name":"ROBLOX","description":"Experimental Test","latitude":"0.0","longitude":"0.0","field1":"Field Label 1","created_at":"2020-07-10T18:15:15Z","updated_at":"2020-07-10T18:15:15Z","last_entry_id":73},"feeds":[{"created_at":"2020-07-10T21:04:30Z","entry_id":72,"field1":"1"},{"created_at":"2020-07-10T23:52:09Z","entry_id":73,"field1":"0"}]} --Not Using JSON :( --search at last 32 characters local S_begin, S_end = string.find(Result,"\"field1\":\"",-32) --got 0 or 1 (OFF or ON) local On_Off = string.sub(Result, S_end + 1 , S_end + 1) --print(On_Off) if On_Off == "0" then workspace.Lamp1.Light.PointLight.Enabled = false workspace.Button1.Button.BrickColor = BrickColor.Black() end if On_Off == "1" then workspace.Lamp1.Light.PointLight.Enabled = true workspace.Button1.Button.BrickColor = BrickColor.Green() end --search at last 32 characters --"field2":"9999"}]} local S_begin, S_end = string.find(Result,"\"field2\":\"",-32) Result = string.sub(Result,S_end+1) --remove "}]} Counter = string.gsub(Result,"\"}]}","") workspace.Sign.Text.SurfaceGui.TextLabel.Text = "Visits: " .. Counter end


Transferindo Programa para o NINA B302

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

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

Veja o resultado do programa

/**************************************************************************************************************************** WiFiWebClientRepeating.ino This sketch connects to a a web server and makes a request using a WiFi equipped Arduino board. created 23 April 2012 modified 31 May 2012 by Tom Igoe modified 13 Jan 2014 by Federico Vanzati http://www.arduino.cc/en/Tutorial/WifiWebClientRepeating This code is in the public domain. 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.2 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. 1.5.2 K Hoang 09/05/2020 Port FirmwareUpdater to permit nRF52 boards to update W102 firmware and SSL certs on IDE Update default pin-outs. *****************************************************************************************************************************/ #include <SPI.h> #include <WiFi_Generic.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[] = "xxxxxxxx"; // 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; // Initialize the Wifi client library WiFiClient client; // server address: char server[] = "api.thingspeak.com"; //IPAddress server(64,131,82,241); unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds const unsigned long postingInterval = 5L * 1000L; // delay between updates, in milliseconds void setup() { pinMode(8,OUTPUT); //Initialize serial and wait for port to open: Serial.begin(115200); while (!Serial); // 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); } // you're connected now, so print out the status: printWifiStatus(); } String Http_Concat = ""; void loop() { // if there's incoming data from the net connection. // send it out the serial port. This is for debugging // purposes only: while (client.available()) { char c = client.read(); Http_Concat.concat(c); //Serial.write(c); } // if ten seconds have passed since your last connection, // then connect again and send data: if (millis() - lastConnectionTime > postingInterval) { //{"channel":{"id":1097028,"name":"ROBLOX","description":"Experimental Test","latitude":"0.0","longitude":"0.0","field1":"Field Label 1","field2":"Field Label 2","created_at":"2020-07-10T18:15:15Z","updated_at":"2020-07-13T00:37:00Z","last_entry_id":195},"feeds":[{"created_at":"2020-07-13T17:16:26Z","entry_id":195,"field1":"1","field2":"14"}]} // point to the last entry_id, then search to field1 = 0 and field1 = 1 Http_Concat = Http_Concat.substring(Http_Concat.indexOf("entry_id")); //Find it Serial.println(Http_Concat); if(Http_Concat.lastIndexOf("\"field1\":\"1\"") > 0) { digitalWrite(8,HIGH); } if(Http_Concat.lastIndexOf("\"field1\":\"0\"") > 0) { digitalWrite(8,LOW); } Http_Concat=""; httpRequest(); } } // this method makes a HTTP connection to the server: void httpRequest() { // close any connection before send a new request. // This will free the socket on the Nina module client.stop(); // if there's a successful connection: if (client.connect(server, 80)) { Serial.println("connecting..."); // send the HTTP PUT request: client.println("GET /channels/xxxxxxx/feeds.json?api_key=xxxxxxxxxx&results=1 HTTP/1.1"); client.println("Host: api.thingspeak.com"); client.println("User-Agent: ArduinoWiFi/1.1"); client.println("Connection: close"); client.println(); // note the time that the connection was made: lastConnectionTime = millis(); } else { // if you couldn't make a connection: Serial.println("connection failed"); } } 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"); }



Gravação


Execução

Vídeos

DÚVIDAS

Thanks to my son
José Pietro Ferreira Wisintainer, who presented me ROBLOX


Nenhum comentário:

Postar um comentário