sexta-feira, 27 de setembro de 2024

Carrinho robô com Arduino Uno R3 - Como funciona

 Introdução - Arduino

O Arduino é uma plataforma open-source sendo composta por software e hardware. Com relação ao software, conseguimos desenvolver programas que serão inseridos no CHIP (microcontrolador ATMega328) da empresa Atmel Corporation, e estes programas são desenvolvidos na linguagem C. Já quando ao Hardware, podemos pegar as peças de acordo com a esquemática eletrônica do Arduino e construir o nosso próprio projeto, inclusive, nomeando como bem entendermos.

Demais componentes

Além do Arduino, usamos também um motor de 6V, miniprotoboard, jumpers, um resistor de 2.2k e outro de 1k, Ponte H, um Módulo Bluetooth e uma bateria de 9V.

  • Miniprotoboard e Jumpers - Usados para conectar os componentes eletrônicos
  • Motor de 6V - Usado para girar as rodas e fazer nosso robô andar
  • Resistor - Usado para limitar corrente elétrica no circuito do módulo Bluetooth
  • Módulo Bluetooth - Usado para fazer o robô conversar com o telefone celular através do Bluetooth (APP para fazer essa conversa entre ambos)
  • Ponte H - Usado para que o Arduino consiga controlar os motores

Funcionamento

Me perdoem se o desenho estiver confuso, não sou desenhista kkk


Feito isto, podemos utilizar o seguinte conjunto de códigos:
char caracter;
void setup() {
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop() {
  if (Serial.available())
    caracter = Serial.read();
    Serial.print("Recebi os dados;");
    Serial.println(caracter);
    if (caracter == 'D')
    {
      digitalWrite(10, LOW);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);
      delay(10000);
      caracter = 'P';
    }
    if (caracter == 'E')
    {
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, HIGH);
      delay(10000);
      caracter = 'P';
    }
    if (caracter == 'F')
    {
      digitalWrite(10, HIGH);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      digitalWrite(13, LOW);
      delay(10000);
      caracter = 'P';
    }
    if (caracter == 'T')
    {
      digitalWrite(10, LOW);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      digitalWrite(13, HIGH);
      delay(10000);
      caracter = 'P';
    }
    if (caracter == 'P')
    {
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);
    }    
}
Observe que o Serial.available() verifica quantos bytes estão disponíveis para serem lidos da porta serial. Se retornar um valor maior que zero, significa que há dados recebidos prontos para serem lidos, permitindo que o código execute a leitura com Serial.read().

Não esqueçam de baixar o App para enviar dados dos caracteres via bluetooth, siga o link abaixo:

quinta-feira, 26 de setembro de 2024

Trabalhando com IA através da Engenharia de Prompt - ChatGPT

Primeiramente, o que é IA? Segundo o rival do ChatGPT, o Gemini, IA é um conjunto de tecnologias que permite o computador imitar a inteligência humana de forma a operar de igual ou superior que a cognição humana.

Como funciona o ChatGPT? Os textos que são gerados pelo chatgpt tem como previsões de palavras futuras, fazendo isto várias vezes, o sistema consegue produzir frases completas.

O que é Prompt Engineering? A engenharia de prompt é a arte de criar prompt ("pedidos" gerados pelo usuário) para esta IA Generativa (categoria de IA para criar novos textos) da melhor e mais eficiente forma possível. O resultado disso é ter uma saída mais precisa deste sistema.

Abaixo esta alguns principios para desenvolver melhor estes prompts:

  • Clareza - Evite pedidos ambiguos, exemplo: "Fale-me sobre carros" por "Forneça descrições do modelo de carro (...)"
  • Presição - Se quero listar algo, começe por isto: "Liste os 10 (...)"
  • Interpretações de papéis - É possível fazer com que o sistema interprete papéis com prompt como: "Como historiador, exeplique (...)"

Outro exemplo:

"Como cientista de dados, descreva o processo de limpeza de um conjunto de dados antes de ele ser usado para análise. Inclua etapas como tratamento de dados ausentes, tratamento de valores discrepantes e normalização de dados."


Outras maneiras de fazer isto é por meio da depuração (debugging/exclusão de substâncias indesejadas) no prompt:

  • Ajuste do tom de formalidade: "Explique-me como se eu tivesse cinco anos (...)" ou "Escreva um relatório formal sobre (...)"
  • Muito ou pouco texto: "Brevemente" ou "Em detalhes", podem ser palavras que na frase vai dizer se teremos textão ou não.

Técnicas para gerar melhores prompts

  • Zero-shot: Se baseia em fornecer uma pergunta e respostas prontas (igual a colar numa prova virtual) ao ChatGPT, dessa forma, ele vai eleger a melhor resposta (estatisticamente). Podemos gerar uma diversidade de respostas para uma pergunta, mudando o modo como é feito a pergunta.
  • Few-shot: Igual o zero-shot, mas fornecemos um número maior de exemplos ao modelo de IA (algoritmo que permite que a IA aprenda) para que ele retorne saidas mais desejadas.
  • Chain-of-Thought: O usuário orienta a IA a responder e já gerar novas perguntas de acordo com a resposta. Assim, o modelo identifica corretamente o padrão lógico da resposta desejada.


Agora vamos supor que tenha um imóvel, uma casa que queira alugar, mas ainda preciso de desenvolver um contrato para o inquilido assinar, como poderia prosseguir?

Hoje em dia conseguimos utilizar modelos de IA para mitigar riscos em contratos e cláusulas potencialmente problemáticas ou até ambíguas, minimizando riscos legais e financeiros.

Primeiro precisamos saber no mínimo alguns jargões técnicos da área jurídica, como:

  • Minuta: Rascunho de um contrato (é o que vamos fazer, o contrato de fato será firmado pelo advogado)
  • Contrato e contratante: Mesma relação de empresa e funcionário
  • Locação e locatário: Imóvel fornecido pelo locador para o locatário


Dito isto, podemos começar por:

  1. "Crie um contrato de locação de imóvel considerando o seguinte: (...)"
  2. "O contrato está muito genérico. Quero que você me faça perguntas mais especificas sobre a situação concreta e, depois disso, considerando as respostas que eu der, reformule o contrato para que ele fique melhor. Ainda, o prazo de vigência do contrato deverá ser de 2 anos."
  3. Pergunte também quais são as cláusulas são indispensáveis em um contrato de locação de imóvel, observando a legislação brasileira.
  4. Também veja cláusulas para segurança jurídica. Exemplo: "Existem outras cláusulas que poderiam ser indispensáveis, pensando na segurança jurídica dos envolvidos nesse contrato?"
  5. Podemos pedir exemplos para desenvolvermos entendendo as cláusulas: "Redija a cláusula referente ao tópico 'uso do imóvel', por favor."
  6. Junto a isto, podemos pedir que ele transcreva o que quero:
"Atue como um advogado especialista em contratos, com profundo conhecimento na legislação brasileira, e analise a seguinte cláusula contratual:
'O locatário concorda em fazer a manutenção adequada do apartamento durante o período de locação.
Caso haja necessidade, por favor, corrija a cláusula acima."


Outras formas de continuar com os prompts, abaixo:

"Você saberia me informar quais são as cláusulas indispensáveis em um contrato de locação de imóvel, observando a legislação brasileira?"

E continuar a pedir para incluir cláusulas a respeito da seguinte questão:

"Em um contrato de aluguel, a falta de uma cláusula de manutenção pode representar um risco para o locatário, pois isso pode levar a disputas sobre quem é responsável por reparos e manutenção do imóvel e em quais condições, especialmente útil na finalização do contrato."



Um exemplo dos tipos de coisas que conseguimos fazer é identificar cláusulas que sejam injustamente onerosas para uma das partes. Outra coisa importante é pedir para que ele utilize linguagens de contrato onde em sua maioria deram certo, historicamente falando.

Podemos usar o modelo do link abaixo, que é um modelo treinado para averiguar riscos em contratos:

https://chatgpt.com/g/g-b4GBGXAkE-gpt-contrato-avaliacao-de-riscos-e-clausulas


Caso ainda tenha alguma dúvida sobre como desenvolver os contratos, podemos encontrar exemplos de prompt no link abaixo:

sexta-feira, 25 de março de 2022

Sensores Digitais e Analógicos

Diferença entre sinal Analógico e Digital

Segundo Oliveira (2017), sinal analógico pode assumir infinitos valores em um intervalo de tempo, enquanto que o digital (sinal discreto), assume finitos valores em um intervalo de tempo. Os sinais digitais geralmente assumem valores booleanos, enquanto que analógicos são decimais.

Analógicos: Sensores de Temperatura, Umidade, Pressão e Luminosidade.

Digitais: Sensores de Presença, Push Button (ligado ou desligado) e Estado Lógico.


CONCEITOS AUXILIARES - ESP32

Não será abordado digitalWrite, digitalRead, analogRead entre outros termos correlatos, por conta do nível de simplicidade, pois estes termos podem ser compreendidos na prática.

Push Button (interruptor ou botão de liga/desliga)


Pull up

Com a chave aberta (push button), recebo um valor muito próximo a 5V na entrada analógica do Embarcado, e ele "enxerga" ligado. Porém "por uma lei da natureza que diz que a energia tenderá a percorrer o caminho mais fácil", se a chave fecha, o sentido da corrente muda e recebo 0V na porta analógica do Embarcado.

"Quando tenho dois caminhos para uma corrente elétrica, essa corrente vai procurar o caminho mais fácil"

"Com base no trecho acima analise com a chave aberta e fechada, onde houve menos resistência? lembrando que quando chave aberta, a resistência tende ao infinito"

Pull down

Pull down é oposto do Pull Up, onde havia 0V ficou 5V, e onde havia 5V ficou 0V, logo a lógica do que recebo na porta analógica do embarcado inverte.

Repare que na imagem abaixo, para um embarcado ler de maneira digital, o I/O pin será a entrada analógica do Embarcado.


LDR (Light Depent Resistors)

Um bom sensor que trabalha de maneira analógica e muito útil em muito projeto é o LDR (Light Depent Resistors), pois o sensor de fato montamos juntando este RESISTOR LDR (no lugar do push button) em um Pull up com um resistor de 10k, vejamos:


DATASHEET - LDR


Logo, no sketch ficará da seguinte maneira:

#define Light 4  

void setup() {  

  Serial.begin(115200);  

  delay(1000);  

}  

void loop() {  

  int val = analogRead(Light);  

  Serial.println(val);  

  delay(100);  

}


Segundo Campos (2018), o sensor LDR mede a luminosidade do ambiente, então de acordo com a luminosidade, será possível ver um valor analógico na IDE Arduino.

Este sensor é um sensor resistivo, pois este dispositivo funcionará como um resistor alternando sua resistência de acordo com a luminosidade.

Uma maneira interessante de usá-lo é colocá-lo em um Pull up com um resistor de 10kOhm como demonstrado no tutorial do sensor DIY no link abaixo:

Soil Moisture Sensor ou higrômetro DIY


CAMPOS, João. Sensor LDR Com Arduino E ESP32. 2018. Disponível em <https://www.iomaker.com.br/sensor-ldr-com-arduino-e-esp32/>. Acesso em 16 marc. 2022.

OLIVEIRA, Rodolpho. Sinal Analógico x Sinal Digital. 2017. Disponível em <https://www.embarcados.com.br/sinal-analogico-x-sinal-digital/>. Acesso em 21 marc. 2022.


domingo, 20 de março de 2022

MQTT com Desenvolvimento Web - PHP Laravel

Detalhe: Caso não saiba PHP, recomendo o curso gratuito do famoso Gustavo Guanabara ou do link abaixo:

CURSO PHP 8

Para com questão do Framework PHP, o Laravel, indico duas (dois mini cursos) playlist no Youtube:

CURSO LARAVEL - OPÇÃO 1

CURSO LARAVEL - OPRÇÃO 2


O seguinte tutorial será com o Framework PHP Laravel, vejamos:


Web.php

No grupo das rotas do arquivo das rotas, o web.php adicione uma rota a uma página MQTT para acionar publish para o Embarcado:

// Grupo de rotas que dita todo fluxo de dados do site - web.php

Route::prefix('projetolaravel')->group(function(){

    Route::get('/{id}/{var}/{salt}',[nomeController::class, 'mqtt'])->name('projetolaravel-mqtt')->middleware('auth');

});


nomeController.php

Precisamos efetuar a configuração no arquivo responsável pelo Controller, logo, em seu Controller adicione a função abaixo para efetuar um Publish (considerando que ):

    // Função que vai publicar um dado via MQTT através da página de IoT

    public function mqtt($id, $var, $salt){

        $dados = Projetolaravel::where('id',$id)->first();

        $key = $dados->key_produto;

        $var = "teste";        

        return view('projetolaravel.publish',['key'=>$key, 'var '=>$var]);

    }


publish.blade.php

O arquivo com o qual usaremos para apontar de acordo com essa roda é um .PHP que deve conter as seguintes configurações:

<?php

 require('C:/xampp/php/hua/app/Models/phpMQTT.php');

// require('/var/www/html/hua/app/Models/phpMQTT.php');

$server = 'ENDERECOAQUI';     // change if necessary

$port = 1883;                     // change if necessary

$username = 'USUARIOBROKER';                   // set your username

$password = 'SENHABROKER';                   // set your password

$client_id = 'phpMQTT-publisher'; // make sure this is unique for connecting to sever - you could use uniqid()

$mqtt = new Bluerhinos\phpMQTT($server, $port, $client_id);

if ($mqtt->connect(true, NULL, $username, $password)) {

  $mqtt->publish('fonte/acao/'.$key.'', $var, 0, false);

  $mqtt->close();

  echo "foi\n";

  // echo $key;

} else {

    echo "Time out!\n";

}

?>

Repare que na linha abaixo, caso estivermos em Linux (Unix), inverteremos qual linha utiliza comentário, pois precisamos deste phpMQTT.php para trabalhar com MQTT:

 require('C:/xampp/php/hua/app/Models/phpMQTT.php');

// require('/var/www/html/hua/app/Models/phpMQTT.php');

Não esqueça de mudar o tópico e o payload em:

publish('fonte/acao/', $var_payload, 0, false)

Não esqueça de mudar o endereço do servidor em:

$server = 'ENDERECOAQUI';

Não esqueça de mudar as credenciais em:

$username = 'USUARIOBROKER';

$password = 'SENHABROKER'; 

E não menos importante, não esqueça de abrir a porta 1883 de sua VPS.

Um ponto interessante é que este módulo MQTT para o Laravel, só utilizo para Publish e não Subscribe, esse Subscribe será em Python.


Subscribe

Com relação ao subscribe em Python, já foi feito alguns materiais a respeito, vejamos:

IoT - Internet of Things - MQTT na prática (3/3)

Com isso, basta obter um exemplo genérico de como receber estes dados, e depois fazer a conexão com banco de dados com a biblioteca MySQLdb.


Caso ainda haja dúvidas, baixe nosso material e agende uma consultoria para obter uma senha ao baixar os arquivos necessários abaixo:

Kit Oficinaiot - 01


MQTT no Sketch

Quanto ao Sketch do embarcado, este vai seguir os seguintes scripts:

MQTT Genérico - Sketch

Repare que: o conteúdo da variável valor será enviado, este sendo um bom tipo de dado para se aprender, já que na maioria das vezes utilizaremos valores iguais a este, como por exemplo, temperatura:

int valor = 7;

Tudo que for para ser recebido, será o que estiver usando mesmo Broker e mesmo tópico.

domingo, 13 de março de 2022

Comunicação I2C - parte 1/3

Neste tutorial será abordado como protocolo I2C pode servir para comunicação escravo (Slave) e mestre (Master), e isso utilizando IDE Arduino e os pinos I2C do embarcado.

I2C significa Inter Integrated Circuit, e pode trabalhar de algumas maneiras, porém vamos efetuar a comunicação do sensor de temperatura e umidade do ar, AHT10.

Fora o pino de Vcc o GND, o I2C se comunica através do SCL (Clock Signal) e SDA (Envio e recebimento de dados), e a partir daí haverá comunicação via protocolo I2C.

Na prática o GPIO 21 é padrão para SDA e GPIO 22 é padrão para SCL.

Obs: Vcc pode ser tanto 3,3V, quando 5V.


Quando essa comunicação é feita no firmware do embarcado, é colocado um endereço do Slave I2C (que pode ser descoberto no Datasheet do Slave, seja sensor, display, etc).

Para efetuar essa comunicação I2C, é usado a biblioteca "Wire.h", logo, "Wire.begin();" no Setup (repare que no código begin do Wire não foi definido a GPIO, porém, as portas padrões não precisam ser colocadas).


#include <Wire.h>

#include <AHT10.h>


int sensor_temperatura = 0;

int sensor_umidade = 0;


// Define o endereço sensor AHT10 para 0X38

AHT10 myAHT10(AHT10_ADDRESS_0X38);


void sensor_AHT10(void) {  

  Wire.beginTransmission(AHT10_ADDRESS_0X38);

    sensor_temperatura = myAHT10.readTemperature();

    Serial.print("A temperatura é ");

    Serial.println(sensor_temperatura);

    sensor_umidade = myAHT10.readHumidity();

    Serial.print("A humidade é ");

    Serial.println(sensor_umidade);

  Wire.endTransmission();

}


void setup(){

   Serial.begin(115200); //INICIALIZA A SERIAL

   Wire.begin();

}

void loop(){

  sensor_AHT10();

}


Biblioteca do AHT10


Como referência, esta sendo utilizado as informações do site randomnerdtutorials.


Um outro ponto interessante de se ter conhecimento é quanto aos endereços: após a postagem do presente material, obtive o feedbak da se seguinte pergunta: 

"AHT10 myAHT10(AHT10_ADDRESS_0X38);

O que é isso ai?"

Basicamente estou instanciando o objeto myAHT10 para usar o endereço AHT10_ADDRESS_0X38 com o software do sensor, este endereço que nomeei como AHT10_ADDRESS_0X38 é o endereço deste sensor, do AHT10, pois cada módulo adicional do Embarcado terá seu próprio endereço, exemplo: 0x27 para sensor Oled, DS3231_I2C_ADDRESS para o RTC (relógio com bateria), entre outros com os quais podem ser obtidos no datasheet do módulo, estes foram os que lembrei e que estou atualmente fazendo o uso nos projetos.


Até a próxima.

Calculando LED - circuito para Embarcado

Supondo que não tenhamos déficit de conhecimento no que tange a lei de Ohm e matemática básica (Ainda que desconheça ou não esteja familiarizado, tente prosseguir e entender a teoria na prática), podemos destrinchar essa regra da seguinte forma:

R = E / I, logo, R = Vcc - Vled / Iled

Logo:

Fonte 9V e 1A

Quero calcular 2 LEDs em série depois do resistor

3,2V e 0,02A por LED (Consulte uma tabela de LEDs)

Total de 6,4V (2 x 3,2V)

De acordo com a lei de Ohm, R = V / I

R = (9V - 6,4) / 0,02

R = (2,6) / 0,02

R = 130

Um outro exemplo seria:

Fonte 12V e 1A

Quero calcular 3 LEDs em série depois do resistor

3,2V e 0,02A por LED (Consulte uma tabela das LEDs)

Total de 6,4V (2 x 3,2V)

De acordo com a lei de Ohm, R = V / I

R = (12V - 9,6) / 0,02

R = (2,4) / 0,02

R = 120

Supondo que vá colocar 3 LEDs de cores diferentes e distribuído entre resistores:

Fonte 5V

Tenho o circuito na ordem: Resistor, LED, resistor, LED, resistor, LED

R1 = 5 - 2  / 0,02 = 150

R2 = 5 - 2,5  / 0,02 = 125 (Obtenha um resistor de 120)

R3 = 5 - 3 / 0,02 = 100


Exemplo de tabela das LEDs





Dimensionando um sistema fotovoltaico - Estudo de caso 1/3

Equipamentos

Watt

Quantidade

Total Watt

Corrente

Horas/dia

Ah/dia

CA ou CC

Perdas (%)

Ah/dia Corrigido

Lâmpada

9W

4

36W

3A

5 Horas

15

CC

10%

16,5Ah/dia

TV

50W

1

50W

4,2A

4 Horas

16,8

CA

25%

21Ah/dia


Total Ah/dia: 37,5Ah/dia


Observações:

  1. A potência em Watt é multiplicado pela quantidade;
  2. A corrente se deve ao resultado do calculo P / V = I considerando que a tensão é 12V (Padrão de bateria adotada);
  3. Multiplique a corrente pelo tempo de uso;
  4. Se for corrente CC calcule os 10%, se AC, calcule os 25%;
  5. Some as perdas com Ah/dia para obter Ah/dia corrigido;
  6. Some os valores da coluna e obtenha o total em Amperes.


Dimensionando Painel Solar

150Wp

In = 8,12A

Icc = 8,61A

8,12A x 5 Horas = 40,6Ah/dia

NP = 37,5Ah/dia / 40,6Ah/dia = 3,96 Aproximadamente 4 Placas Solares


Dimensionando Controlador de Carga

(Quantidade de Painéis ou Placas x Icc) = 4 x 8,16A = 34,4A Aproximadamente 40A


Dimensionando Bateria

Capacidade (Ah) = (Dias sem “luz” x 37,5Ah/dia) / Descarga da Bateria

(3 x 37,5Ah/dia) / 0,8 = 140,625Ah


Dimensionando Inversor

Soma de todos os equipamentos (Watt) = 195

O recomendado seria pegar um inversor de 1000W