WiringX é uma biblioteca que permite aos desenvolvedores controlar o GPIO de diversas plataformas com funções genéricas e uniformes. Ao usar o wiringX, o mesmo código será executado em todas as plataformas suportadas pelo wiringX, nativamente.
Demonstração do sensor DHT11
Na placa de desenvolvimento Duo
Link do GitHub: https://github.com/milkv-duo/duo-files/blob/main/duo/hardware/duo-schematic-v1.2.pdf
DHT11, sensor de temperatura e umidade DHT22
Link dfrobotwiki: https://wiki.dfrobot.com.cn/\_SKU_SEN0137\_%E9%AB%98%E7%B2%BE%E5%BA%A6DHT22%E6%B8%A9%E6%B9%BF% E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8
O Sensor de Temperatura e Umidade DHT22 é um sensor versátil e econômico usado para medir temperatura e umidade ambiental. É baseado em saída de sinal digital, fornecendo medições de alta precisão com resolução de temperatura de 0,1 graus Celsius e resolução de umidade de 0,1%. O sensor usa um elemento sensor de umidade capacitivo e um termistor para medir umidade e temperatura, respectivamente. O sensor DHT22 também possui consumo de energia relativamente baixo e pode operar em uma faixa de tensão de 3,3 V a 5 V, tornando-o adequado para projetos alimentados por bateria. Além disso, o sensor oferece estabilidade a longo prazo e alta confiabilidade, tornando-o uma escolha ideal para diversas aplicações, incluindo sistemas HVAC, estações meteorológicas e sistemas de monitoramento da qualidade do ar interno.
Módulo
O módulo DHT22 possui um total de 3 pinos, enquanto o sensor nu DHT22 possui 4 pinos. Ao considerar o módulo com três pinos, dois são pinos de alimentação e um é o pino de dados. Para o sensor de 4 pinos, o pino adicional é um pino NC (Sem Conexão) sem função específica. A pinagem do módulo e do sensor é a seguinte:
- DADOS: Pino de dados para comunicação de 1 fio.
- GND: Pino terra do módulo.
- VCC: Pino de alimentação do módulo.
- Não utilizado: Este pino não é utilizado neste sensor.
Componentes do módulo sensor DHT22
Além do sensor, o módulo DHT22 na PCB inclui apenas dois componentes: um resistor pull-up e um capacitor de desacoplamento. As marcações dos componentes do módulo DHT22 são as seguintes.
Diagrama de circuito do módulo DHT22
O diagrama esquemático completo do módulo Sensor de Temperatura e Umidade DHT22 é mostrado no diagrama abaixo.
O diagrama esquemático do módulo DHT22 é mostrado acima. Conforme mencionado anteriormente, a placa possui apenas alguns componentes. Os pinos VCC e GND estão conectados diretamente ao sensor DHT22 e o resistor pull-up está conectado ao pino DATA. Capacitores de tântalo e multicamadas fornecem filtragem suficiente. Em algumas PCBs, você pode encontrar um indicador LED como indicador de energia, mas para a maioria das placas de circuito, o LED não está presente.
Perguntas comuns sobre DHT22
P: Em termos simples, o que é DHT22?
R: DHT22 é uma versão mais cara do sensor DHT11 com melhores especificações. Sua faixa de medição de temperatura é de -40 a +125 graus Celsius com precisão de ±0,5 graus, enquanto o DHT11 tem faixa de temperatura de 0 a 50 graus Celsius com precisão de ±2 graus.
P: O DHT22 é analógico ou digital?
R: DHT-22 (também conhecido como AM2302) é um sensor de umidade relativa e temperatura de saída digital.
P: O DHT22 é à prova d'água?
R: Não, não é à prova d'água.
P: Qual é a taxa de amostragem do sensor DHT11?
R: A taxa de amostragem do DHT22 é de 1 Hz.
P: Qual protocolo o DHT22 usa?
R: O sensor DHT22 usa um protocolo proprietário de comunicação de fio único que envia e recebe dados por meio de pulsos temporizados.
Como funciona o DHT22
Se você estiver usando um sensor DHT22 original, ele contém um termistor NTC e um módulo sensor. Porém, a maioria dos sensores disponíveis no mercado são peças não originais e contêm um pequeno sensor, conforme mostra a imagem abaixo.
O elemento sensor de umidade consiste em um substrato absorvente de umidade imprensado entre dois eletrodos. À medida que o substrato absorve umidade, a resistência entre os dois eletrodos diminui. A mudança de resistência entre os eletrodos é proporcional à umidade relativa. Uma umidade relativa mais alta diminui a resistência entre os eletrodos, enquanto uma umidade relativa mais baixa aumenta a resistência. Esta mudança de resistência é medida pelo ADC do MCU integrado e usada para calcular a umidade relativa.
Cada componente DHT22 passa por calibração rigorosa em laboratório, com calibração de umidade extremamente precisa. Os coeficientes de calibração são armazenados como programas na memória OTP para uso no processo de detecção de sinal interno do sensor.
Protocolo de comunicação de fio único DHT22 (one wire)
Um protocolo de comunicação de fio único é usado para comunicação com o DHT22 e o microcontrolador. A amostragem de dados leva aproximadamente 4 milissegundos para ser concluída. Os dados consistem em partes decimais e inteiras e totalizam 40 bits de comprimento, no formato MSB. O formato dos dados é o seguinte: dados RH inteiros de 8 bits + dados RH decimais de 8 bits + dados T inteiros de 8 bits + dados T decimais de 8 bits + soma de verificação de 8 bits. Se a transmissão de dados estiver correta, a soma de verificação deve ser os últimos 8 bits de "dados RH inteiros de 8 bits + dados RH decimais de 8 bits + dados T inteiros de 8 bits + dados T decimais de 8 bits".
Quando o MCU envia o sinal de início, o DHT muda do modo de baixo consumo de energia para o modo de execução e despeja todos os 40 bits de dados no microcontrolador. O microcontrolador lê os dados e calcula a temperatura e a umidade com base nos dados binários.
A imagem acima mostra como funciona a comunicação de dados com o microcontrolador e o DHT22.
Conectando-se à placa de desenvolvimento
DHT22: Fio vermelho para 3V3 (OUT), fio preto para terra, fio verde para GPIOA15.
O diagrama do circuito é o seguinte: O círculo preto representa o DHT22.
O DHT22 deve ser conectado da seguinte forma:
Exemplo de código
Link do GitHub: https://github.com/milkv-duo/duo-examples
dht22.c:
// Ref: https://github.com/technion/lol_dht22/blob/master/dht22.c#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <unistd.h>#include <wiringx.h>#define MAXTIMINGS 85static int DHTPIN = 15;static int dht22_dat[5] = {0, 0, 0, 0, 0};static uint8_t sizecvt(const int read){ /* digitalRead() and friends from wiringpi are defined as returning a value < 256. However, they are returned as int() types. This is a safety function */
if (read > 255 || read < 0) { printf("Invalid data from wiringPi library\n"); exit(EXIT_FAILURE); } return (uint8_t)read;}
static int read_dht22_dat(){ uint8_t laststate = HIGH; uint8_t counter = 0; uint8_t j = 0, i;
dht22_dat[0] = dht22_dat[1] = dht22_dat[2] = dht22_dat[3] = dht22_dat[4] = 0;
// pull pin down for 18 milliseconds pinMode(DHTPIN, PINMODE_OUTPUT); digitalWrite(DHTPIN, HIGH); // delay(500); delayMicroseconds(500000); digitalWrite(DHTPIN, LOW); // delay(20); delayMicroseconds(20000); // prepare to read the pin pinMode(DHTPIN, PINMODE_INPUT);
// detect change and read data for (i = 0; i < MAXTIMINGS; i++) { counter = 0; while (sizecvt(digitalRead(DHTPIN)) == laststate) { counter++; delayMicroseconds(2); if (counter == 255) { break; } } laststate = sizecvt(digitalRead(DHTPIN));
if (counter == 255) break;
// ignore first 3 transitions if ((i >= 4) && (i % 2 == 0)) { // shove each bit into the storage bytes dht22_dat[j / 8] <<= 1; if (counter > 16) dht22_dat[j / 8] |= 1; j++; } }
// check we read 40 bits (8bit x 5 ) + verify checksum in the last byte // print it out if data is good if ((j >= 40) && (dht22_dat[4] == ((dht22_dat[0] + dht22_dat[1] + dht22_dat[2] + dht22_dat[3]) & 0xFF))) { float t, h; h = (float)dht22_dat[0] * 256 + (float)dht22_dat[1]; h /= 10; t = (float)(dht22_dat[2] & 0x7F) * 256 + (float)dht22_dat[3]; t /= 10.0; if ((dht22_dat[2] & 0x80) != 0) t *= -1; printf("Humidity = %.2f %% Temperature = %.2f *C \n", h, t); return 1; } else { printf("Data not good, skip\n"); return 0; }}
int main(){ // Duo: milkv_duo // Duo256M: milkv_duo256m // DuoS: milkv_duos if (wiringXSetup("milkv_duo", NULL) == -1) { wiringXGC(); return -1; }
if (wiringXValidGPIO(DHTPIN) != 0) { printf("Invalid GPIO %d\n", DHTPIN); }
while (1) { read_dht22_dat(); delayMicroseconds(1500000); }
return 0;}
Makefile:
TARGET=dht22
ifeq (,$(TOOLCHAIN_PREFIX))$(error TOOLCHAIN_PREFIX is not set)endif
ifeq (,$(CFLAGS))$(error CFLAGS is not set)endif
ifeq (,$(LDFLAGS))$(error LDFLAGS is not set)endif
CC = $(TOOLCHAIN_PREFIX)gccCFLAGS += -I$(SYSROOT)/usr/includeLDFLAGS += -L$(SYSROOT)/libLDFLAGS += -L$(SYSROOT)/usr/libLDFLAGS += -lwiringx
SOURCE = $(wildcard *.c)OBJS = $(patsubst %.c,%.o,$(SOURCE))
$(TARGET): $(OBJS) $(CC) -o $@ $(OBJS) $(LDFLAGS)
%.o: %.c $(CC) $(CFLAGS) -o $@ -c $<
.PHONY: cleanclean: @rm *.o -rf @rm $(OBJS) -rf @rm $(TARGET)
Ambiente de Build no UBUNTU 20.04 (WSL)
Você também pode usar Ubuntu instalado em uma máquina virtual, Ubuntu instalado via WSL no Windows ou sistemas baseados em Ubuntu usando Docker.
Instale as ferramentas que compilam dependências.
Obtenha exemplo de código-fonte
git clone https://github.com/milkv-duo/duo-examples.git
Preparar ambiente de compilação
Na primeira vez que você o adquirir, o pacote SDK necessário será baixado automaticamente, com aproximadamente 180 MB de tamanho. Depois de baixado, ele será extraído automaticamente para o diretório
duo-examples
com o nomeduo-sdk
. Na próxima vez, se o diretório já existir, ele não será baixado novamente.Teste de compilação
Tome hello-world como exemplo, entre no diretório hello-world e execute make
Após a compilação ser bem-sucedida, envie o programa executável gerado
helloworld
para o dispositivo Duo através da porta de rede ou da rede RNDIS. Por exemplo, o método RNDIS suportado pelo firmware padrão , o IP do Duo é 192.168.42.1, o nome de usuário éroot
e a senha émilkv
scp helloworld root@192.168.42.1:/root/
Após o envio com sucesso, execute ./helloworld no terminal logado via ssh ou porta serial, e ele irá imprimir
Hello, World!
[root@milkv]~# ./helloworldHello, World!Neste ponto, nosso ambiente de compilação e desenvolvimento está pronto para uso.
Procedimento de Operação
Em seguida, compile-o. Tomando dht22 como exemplo, entre no diretório do exemplo e simplesmente execute make
cd dht22make it
Faça um relatório de erros e forneça-o. Após compilar com sucesso, você obterá o programa executável df9gms. Conforme mostrado na figura abaixo.
Em seguida, carregue df9gms no caminho raiz da placa de desenvolvimento e digite ./dht22
para executá-lo. A captura de tela da execução bem-sucedida é mostrada abaixo
DF9GMS 180
Informação de hardware
Pinos da placa de desenvolvimento Duo
GitHub: https://github.com/milkv-duo/duo-files/blob/main/duo/hardware/duo-schematic-v1.2.pdf
DF9GMS 180
Micro Servo DF9GMS da DFRobot, este servo possui uma caixa transparente ABS de alta resistência com conjunto interno de engrenagens de náilon de alta precisão, circuito de controle de precisão e motor de copo oco leve e de última geração, resultando em um peso de apenas 9g para este mini servo, enquanto o torque de saída atinge incríveis 1,6kg/cm.
Composição e Princípio de Funcionamento do Micro Servo
Diagrama de conexão
conectado à placa de desenvolvimento
O DF9GMS deve ser conectado da seguinte forma:
Exemplo de código
Link do GitHub: https://github.com/milkv-duo/duo-examples
df9gms.c:
#include <stdio.h>#include <unistd.h>#include <wiringx.h>/*Duo------------------------------------------PWM operation at a fixed frequency clock of 100MHz, writing Period in units of nanoseconds. DF9GMS 360-degree PWM Duty Cycle ------------------------------------------ 0.4ms - 1.4ms CW deceleration 1.5ms Stop 1.6ms - 3ms CCW acceleration */static int PWM_PIN = 4; // PWM5@GP4
int main(){ long i;
// Duo: milkv_duo // Duo256M: milkv_duo256m // DuoS: milkv_duos if(wiringXSetup("milkv_duo", NULL) == -1) { wiringXGC(); return -1; }
wiringXPWMSetPeriod(PWM_PIN, 20000000); // 20ms wiringXPWMSetDuty(PWM_PIN, 1500000); // 1.5ms stop wiringXPWMSetPolarity(PWM_PIN, 0); // 0-normal, 1-inversed wiringXPWMEnable(PWM_PIN, 1); // 1-enable, 0-disable
delayMicroseconds(1000000); // 1s
for (i = 10000; i< 3000000; i += 10000) // 10 us { wiringXPWMSetDuty(PWM_PIN, i); printf("Duty: %ld\n", i); delayMicroseconds(50000); // 50ms }
wiringXPWMSetDuty(PWM_PIN, 1500000); // 1.5ms stop
return 0;}
Makefile:
TARGET=df9gms
ifeq (,$(TOOLCHAIN_PREFIX))$(error TOOLCHAIN_PREFIX is not set)endif
ifeq (,$(CFLAGS))$(error CFLAGS is not set)endif
ifeq (,$(LDFLAGS))$(error LDFLAGS is not set)endif
CC = $(TOOLCHAIN_PREFIX)gcc
CFLAGS += -I$(SYSROOT)/usr/include
LDFLAGS += -L$(SYSROOT)/libLDFLAGS += -L$(SYSROOT)/usr/libLDFLAGS += -lwiringx
SOURCE = $(wildcard *.c)OBJS = $(patsubst %.c,%.o,$(SOURCE))
$(TARGET): $(OBJS) $(CC) -o $@ $(OBJS) $(LDFLAGS)
%.o: %.c $(CC) $(CFLAGS) -o $@ -c $<
.PHONY: cleanclean: @rm *.o -rf @rm $(OBJS) -rf @rm $(TARGET)
Ambiente de Build no UBUNTU 20.04 (WSL)Ubuntu20.04
Você também pode usar Ubuntu instalado em uma máquina virtual, Ubuntu instalado via WSL no Windows ou sistemas baseados em Ubuntu usando Docker.
Instale as ferramentas que compilam dependências.
sudo apt-get install wget git make
Obtenha exemplo de código-fonte
git clone https://github.com/milkv-duo/duo-examples.git
Preparar ambiente de compilação
cd duo-examplessource envsetup.shNa primeira vez que você o adquirir, o pacote SDK necessário será baixado automaticamente, com aproximadamente 180 MB de tamanho. Depois de baixado, ele será extraído automaticamente para o diretório
duo-examples
com o nomeduo-sdk
. Na próxima vez, se o diretório já existir, ele não será baixado novamente.Teste de compilação
Tome hello-world como exemplo, entre no diretório hello-world e execute make
cd hello-worldmakeApós a compilação ser bem-sucedida, envie o programa executável gerado
helloworld
para o dispositivo Duo através da porta de rede ou da rede RNDIS. Por exemplo, o método RNDIS suportado pelo firmware padrão , o IP do Duo é 192.168.42.1, o nome de usuário éroot
e a senha émilkv
scp helloworld root@192.168.42.1:/root/
Após o envio com sucesso, execute ./helloworld no terminal logado via ssh ou porta serial, e ele irá imprimir
Hello, World!
[root@milkv]~# ./helloworldHello, World!Neste ponto, nosso ambiente de compilação e desenvolvimento está pronto para uso.
Procedimento de Operação
Em seguida, compile-o. Tomando df9gms como exemplo, entre no diretório do exemplo e simplesmente execute make
cd df9gmsmake it
Faça um relatório de erros e forneça-o. Após compilar com sucesso, você obterá o programa executável df9gms. Conforme mostrado na figura abaixo.
Em seguida, carregue df9gms no caminho raiz da placa de desenvolvimento e digite ./df9gms
para executá-lo. A captura de tela da execução bem-sucedida é mostrada abaixo
Nenhum comentário:
Postar um comentário