Índice:

Controlando servo usando MPU6050 entre Arduino e ESP8266 com HC-12: 6 etapas
Controlando servo usando MPU6050 entre Arduino e ESP8266 com HC-12: 6 etapas

Vídeo: Controlando servo usando MPU6050 entre Arduino e ESP8266 com HC-12: 6 etapas

Vídeo: Controlando servo usando MPU6050 entre Arduino e ESP8266 com HC-12: 6 etapas
Vídeo: ESP32 vs Arduino: Servo Motor Control! 2024, Novembro
Anonim
Controlando servo usando MPU6050 entre Arduino e ESP8266 com HC-12
Controlando servo usando MPU6050 entre Arduino e ESP8266 com HC-12

Neste projeto, estamos controlando a posição de um servo motor usando o mpu6050 e o HC-12 para comunicação entre o Arduino UNO e o ESP8266 NodeMCU.

Etapa 1: SOBRE ESTE PROJETO

É outro projeto IoT baseado no módulo RF HC-12. Aqui, os dados imu (mpu6050) do arduino são usados para controlar o servo motor (conectado ao Nodemcu). Aqui, a visualização dos dados também é realizada no lado do arduino, onde os dados de pitch do mpu6050 (rotação em torno do eixo x) são visualizados com um esboço de processamento (discutido posteriormente). Basicamente, este projeto é apenas um pequeno aquecimento para lembrar diferentes aspectos do controle Imu & Servo com Arduino e ESP8266 nodemcu.

OBJETIVO

O objetivo disso é bem claro, estamos controlando a posição do servo motor usando o valor de pitch da IMU. E, no conjunto, esse passo e a posição do motor sincronizado são visualizados com o Processing.

Etapa 2: Hardware necessário

Módulo NodeMCU ESP8266 12E Wifi

Placa de ensaio sem solda

Jumper wire

MPU6050 accelo + giroscópio

Módulos de RF HC-12 (par)

Servo motor SG90

Etapa 3: Circuito e conexões

Circuito e conexões
Circuito e conexões
Circuito e conexões
Circuito e conexões

As conexões são diretas. Você pode alimentar o servo com 3,3 V do seu Nodemcu. Você também pode usar Vin para alimentar o servo se o seu nodemcu tiver tanta voltagem naquele pino. Mas a maioria das placas Lolin não tem 5V no Vin (depende do fabricante).

Esses diagramas de circuito são feitos usando o EasyADA.

Etapa 4: TRABALHO

TRABALHANDO
TRABALHANDO

Assim que o esboço do Arduino começar, ele enviará o ângulo de inclinação (que varia de -45 a 45) para o receptor hc12 do Nodemcu, que será mapeado com a posição Servo de 0 a 180 graus. Aqui usamos o ângulo de inclinação de -45 a +45 graus para que possamos mapear facilmente para a posição do Servo.

Agora, você está pensando por que podemos simplesmente usar o método de mapa da seguinte maneira: -

pos int = map (val, -45, 45, 0, 180);

Porque o ângulo negativo enviado pelo transmissor hc12 é recebido como:

1ª metade: (T) 0 a 45 => 0 a 45 (R)

2ª metade: (T) -45 a -1 => 255 a 210 (R)

Então você tem que mapeá-lo de 0 a 180 como

if (val> = 0 && val <= 45) pos = (val * 2) +90; senão pos = (val-210) * 2;

Estou evitando o método do mapa devido a algum erro irrelevante. Você pode experimentar e comentar se funciona com você

if (val> = 0 && val <= 45) pos = map (val, 0, 45, 90, 180); else pos = map (val, 255, 210, 0, 90); // 4º argumento pode ser 2 (você pode verificar)

Cálculo do ângulo de inclinação MPU6050

Estou usando a biblioteca MPU6050_tockn que se baseia no fornecimento de dados brutos do IMU.

int pitchAngle = mpu6050.getAngleX ()

Isso nos dará o ângulo de rotação em torno do eixo x. Como você viu na figura, meu IMU é colocado verticalmente na placa de ensaio, então não confunda com pitch and roll. Na verdade, você deve sempre ver os eixos impressos na placa de breakout.

Por meio dessa biblioteca, você não precisa se preocupar com a eletrônica interna de leitura de registros específicos para operação específica. você apenas especifica o trabalho e pronto!

A propósito, se você quiser calcular o ângulo sozinho. Você pode fazer isso facilmente da seguinte maneira:

#incluir

const int MPU6050_addr = 0x68; int16_t AcX, AcY, AcZ, Temp, GyroX, GyroY, GyroZ; void setup () {Wire.begin (); Wire.beginTransmission (MPU6050_addr); Wire.write (0x6B); Wire.write (0); Wire.endTransmission (true); Serial.begin (9600); } void loop () {Wire.beginTransmission (MPU6050_addr); Wire.write (0x3B); Wire.endTransmission (false); Wire.requestFrom (MPU6050_addr, 14, verdadeiro); AcX = Wire.read () << 8 | Wire.read (); AcY = Wire.read () << 8 | Wire.read (); AcZ = Wire.read () << 8 | Wire.read (); Temp = Wire.read () << 8 | Wire.read (); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read ();

int xAng = map (AcX, minVal, maxVal, -90, 90); int yAng = map (AcY, minVal, maxVal, -90, 90); int zAng = map (AcZ, minVal, maxVal, -90, 90); x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI); y = RAD_TO_DEG * (atan2 (-xAng, -zAng) + PI); z = RAD_TO_DEG * (atan2 (-yAng, -xAng) + PI); Serial.print ("AngleX ="); // Pitch Serial.println (x); Serial.print ("AngleY ="); // Rolar Serial.println (y); Serial.print ("AngleZ ="); // Yaw Serial.println (z); }

Mas, não é necessário que você escreva tanto código para obter o ângulo. Você deve conhecer os fatos por trás da cena, mas usar a biblioteca de outras pessoas é muito eficaz em muitos projetos. Você pode ler sobre este imu e outras abordagens para obter mais dados filtrados no seguinte link: Explore-mpu6050.

Meu código arduino na extremidade de transmissão tem apenas 30 linhas com a ajuda da biblioteca MPU6050_tockn, portanto, usar uma biblioteca é bom, a menos que você não precise de algumas alterações básicas na funcionalidade do IMU. Uma biblioteca chamada I2Cdev de Jeff Rowberg é muito útil se você quiser alguns dados filtrados usando o DMP (Processador de movimento digital) da IMU.

Integração com Processamento

Aqui, o processamento é usado para visualizar os dados rotacionais sobre o eixo x de IMU, conforme calculado pelos dados brutos provenientes do MPU6050. Recebemos os dados brutos de entrada em SerialEvent da seguinte maneira:

void serialEvent (Serial myPort) {

inString = myPort.readString (); tente {// Analise os dados // println (inString); String dataStrings = split (inString, ':'); if (dataStrings.length == 2) {if (dataStrings [0].equals ("RAW")) {for (int i = 0; i <dataStrings.length - 1; i ++) {raw = float (dataStrings [i + 1]); }} else {println (inString); }}} catch (Exception e) {println ("Caught Exception"); }}

Aqui você pode ver a visualização na imagem anexada nesta etapa. Os dados de posição recebidos no final do nó também são vistos no monitor serial, conforme mostrado na imagem.

Etapa 5: CODE

Anexei o repositório github. Você pode clonar e bifurcar para usar em seus projetos.

my_code

O repo inclui 2 esboços de arduino para transmissor (arduino + IMU) e receptor (Nodemcu + Servo).

E um esboço de processamento. Marque o repositório se isso ajudar em seu projeto.

Neste instrutível, R- Receptor e T- Transmissor

Etapa 6: DEMONSTRAÇÃO DE VÍDEO

Vou anexar o vídeo amanhã. Siga-me para ser notificado.

Obrigado a todos!

Recomendado: