Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Module de communication sans fil longue portée Arduino et HC-12

Dans ce tutoriel Arduino, nous apprendrons à utiliser le module de communication série sans fil HC-12 qui est capable d'établir une communication sans fil longue portée entre plusieurs cartes Arduino, avec des distances allant jusqu'à 1,8 km. Vous pouvez regarder la vidéo suivante ou lire le didacticiel écrit ci-dessous pour plus de détails.

Aperçu

Pour ce tutoriel, j'ai fait deux exemples de base expliquant comment connecter le module HC-12 et établir une communication de base entre deux Arduinos et un exemple supplémentaire où l'utilisation d'un capteur accéléromètre au premier Arduino je contrôle sans fil la position du stepper au second Arduino.

Module de communication sans fil HC-12

Examinons d'abord de plus près le module de communication de port série sans fil HC-12. Voici quelques spécifications :

  • Sa bande de fréquence de travail sans fil est de 433,4 MHz à 473,0 MHz
  • Il dispose d'un total de 100 canaux avec un pas de 400 kHz entre chaque canal
  • La puissance de transmission est comprise entre -1 dBm (0,79 mW) et 20 dBm (100 mW)
  • La sensibilité de réception est comprise entre -117 dBm (0,019 pW) et -100 dBm (10 pW).

Ces valeurs dépendent en fait du débit en bauds série et OTA sélectionné, comme indiqué dans le tableau.

Le module HC-12 dispose d'un microcontrôleur qui n'a pas besoin d'être programmé par l'utilisateur. Pour configurer le module, nous utilisons simplement les commandes AT, qui peuvent être envoyées depuis un Arduino, un PC ou tout autre microcontrôleur utilisant le port série. Pour entrer dans le mode de commande AT, il suffit de régler la broche "Set" du module sur un niveau logique bas.

Arduino et HC-12

Connectons maintenant le module HC-12 à l'Arduino et faisons le premier exemple. Voici les schémas du circuit. La tension de fonctionnement du module est de 3,2 V à 5,5 V et pour un travail plus stable, il est recommandé d'utiliser un condensateur de découplage et une alimentation externe. Cependant, j'ai utilisé l'USB du PC comme alimentation pour les trois exemples de ce didacticiel et je n'ai rencontré aucun problème.

J'ai connecté le premier module à un Arduino UNO et le deuxième module à un Arduino MEGA, mais bien sûr, vous pouvez utiliser n'importe quelle carte que vous voulez.

Vous pouvez obtenir les composants nécessaires pour ce didacticiel Arduino à partir des liens ci-dessous :

  • Module de communication sans fil HC-12 ……….. 
  • Carte Arduino ………………………………………………………
  • Breadboard et Jump Wires ………………………… 

Exemple 01 – Code Arduino


Voici le code Arduino pour le premier exemple, une communication de base entre les deux modules utilisant le Serial Monitor.

/*    Arduino Long Range Wireless Communication using HC-12
                      Example 01
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin

void setup() {
  Serial.begin(9600);             // Serial port to computer
  HC12.begin(9600);               // Serial port to HC12

}

void loop() {
  while (HC12.available()) {        // If HC-12 has data
    Serial.write(HC12.read());      // Send the data to Serial monitor
  }
  while (Serial.available()) {      // If Serial monitor has data
    HC12.write(Serial.read());      // Send that data to HC-12
  }
}Code language: Arduino (arduino)

Le même code est utilisé pour les deux Arduinos. Nous pouvons connecter les deux Arduinos sur deux ordinateurs distincts mais nous pouvons également utiliser un seul ordinateur.

Dans ce cas, une fois que nous avons connecté le premier Arduino à l'ordinateur, nous devons sélectionner le modèle et le port COM et télécharger le code sur l'Arduino. Ensuite, nous connectons le deuxième Arduino et nous devons redémarrer l'IDE Arduino afin de pouvoir sélectionner l'autre port COM auquel notre deuxième Arduino est connecté, puis télécharger le même code.

Ainsi, une fois que nous avons les deux IDE Arduino en cours d'exécution, nous pouvons démarrer les moniteurs série et tester si la communication fonctionne correctement. Tout ce que nous tapons dans le moniteur série sera envoyé de l'un à l'autre Arduino.

Comment fonctionne le code : Donc, une fois que nous avons tapé quelque chose dans le moniteur série et cliqué sur le bouton Envoyer, au premier Arduino, la boucle while avec la fonction Serial.available () deviendra vraie et en utilisant la fonction HC12.write () nous enverrons les données du moniteur série au module HC-12. Ce module transférera les données sans fil au deuxième module HC-12, donc au deuxième Arduino, la boucle while avec la fonction HC12.available() deviendra vraie et en utilisant la fonction Serial.write() les données seront envoyées au moniteur série.

Nous pouvons utiliser le même code pour envoyer des commandes AT et configurer les paramètres du module. Tout ce que nous avons à faire est de connecter la broche "Set" du module à la masse ou à n'importe quelle broche numérique de l'Arduino et de régler la broche sur le niveau logique bas.

Pour tester si nous avons réussi à entrer dans le mode, dans le moniteur série, nous pouvons taper "AT" et nous devrions obtenir un message de réponse "OK". Il y a au total 12 commandes AT, et elles sont utilisées pour modifier divers paramètres tels que le débit en bauds, le canal, la puissance d'émission, etc. Par exemple, si nous tapons "AT + B38400", le débit en bauds du module sera défini sur 38400.

Commandes AT :

1. AT - Commande de test.

Exemple :Envoyez "AT" au module, et le module renvoie "OK".

2. AT+Bxxxx – Modifier le débit en bauds du port série.

Débits en bauds disponibles :1200 bps, 2400 bps, 4800 bps, 9600 bps, 19200 bps, 38400 bps, 57600 bps et 115200 bps. Par défaut :9 600 bits/s.

Exemple :envoyez "AT+B38400" au module, et le module renvoie "OK+B19200".

3. AT+Cxxxx – Changer le canal de communication sans fil, de 001 à 100.

Par défaut :Canal 001, avec une fréquence de travail de 433,4 MHz. Chaque canal suivant est supérieur de 400 KHz.

Exemple : si nous voulons régler le module sur le canal 006, nous devons envoyer la commande "AT+C006" au module, et le module renverra "OK+C006". La nouvelle fréquence de travail sera de 435,4 MHz.

Exemple 02


Passons maintenant au deuxième exemple. Ici, nous allons utiliser deux boutons-poussoirs pour sélectionner différents canaux de communication et voir une méthode différente de stockage des données entrantes.

Remarque :Les broches "Set" des deux modules HC-12 sont connectées aux broches numéro 6 des deux Arduinos et les deux boutons, au premier Arduino, aux broches 4 et 3.

Premier code Arduino :

/*    Arduino Long Range Wireless Communication using HC-12
    Example 02 - Changing channels using push buttons - Buttons side
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>

#define setPin 6
#define button1 4
#define button2 3

SoftwareSerial HC12(10, 11);         // HC-12 TX Pin, HC-12 RX Pin

byte incomingByte;
String readBuffer = "";

int button1State = 0;
int button1Pressed = 0;
int button2State = 0;
int button2Pressed = 0;

void setup() {
  Serial.begin(9600);                   // Open serial port to computer
  HC12.begin(9600);                     // Open serial port to HC12
  pinMode(setPin, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  digitalWrite(setPin, HIGH);           // HC-12 normal, transparent mode
}

void loop() {
  // ==== Storing the incoming data into a String variable
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
  }
  delay(100);
  // ==== Sending data from one HC-12 to another via the Serial Monitor
  while (Serial.available()) {
    HC12.write(Serial.read());
  }

  // ==== If button 1 is pressed, set the channel 01
  button1State = digitalRead(button1);
  if (button1State == HIGH & button1Pressed == LOW) {
    button1Pressed = HIGH;
    delay(20);
  }
  if (button1Pressed == HIGH) {
    HC12.print("AT+C001");               // Send the AT Command to the other module
    delay(100);
    //Set AT Command Mode
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print("AT+C001");               // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
    button1Pressed = LOW;
  }
  
  // ====  If button 2 is pressed, set the channel 02
  button2State = digitalRead(button2);
  if (button2State == HIGH & button2Pressed == LOW) {
    button2Pressed = HIGH;
    delay(100);
  }
  if (button2Pressed == HIGH) {
    HC12.print("AT+C002"); // Send the AT Command to the other module
    delay(100);
    //Set AT Command Mode
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print("AT+C002");               // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);
    button2Pressed = LOW;
  }
  checkATCommand();
  readBuffer = "";                       // Clear readBuffer
}
// ==== Custom function - Check whether we have received an AT Command via the Serial Monitor
void checkATCommand () {
  if (readBuffer.startsWith("AT")) {     // Check whether the String starts with "AT"
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(200);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
  }
}Code language: Arduino (arduino)

Deuxième code Arduino :

/*    Arduino Long Range Wireless Communication using HC-12
        Example 02 - Changing channels using push buttons
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>

#define setPin 6

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin

byte incomingByte;
String readBuffer = "";

void setup() {
  Serial.begin(9600);             // Open serial port to computer
  HC12.begin(9600);               // Open serial port to HC12
  pinMode(setPin, OUTPUT);
  digitalWrite(setPin, HIGH);     // HC-12 normal mode
}

void loop() {
  // ==== Storing the incoming data into a String variable
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
  }
  delay(100);
  // ==== Sending data from one HC-12 to another via the Serial Monitor
  while (Serial.available()) {
    HC12.write(Serial.read());
  }
  // === If button 1 is pressed, set channel 01
  if (readBuffer == "AT+C001") {
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12 ("AT+C001")
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
    readBuffer = "";
  }
  // === If button 2 is pressed, set channel 02
  if (readBuffer == "AT+C002") {
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode

    readBuffer = "";
  }
  checkATCommand();
  readBuffer = "";                       // Clear readBuffer
}
// ==== Custom function - Check whether we have received an AT Command via the Serial Monitor
void checkATCommand () {
  if (readBuffer.startsWith("AT")) {     // Check whether the String starts with "AT"
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
  }
}Code language: Arduino (arduino)

Description des codes :

Donc, nous devons d'abord définir les broches et régler la broche "Set" sur le niveau logique élevé pour que le module fonctionne en mode normal et transparent. Avec la première boucle while, nous stockons les données entrantes dans une variable String, afin que nous puissions mieux les gérer.

// ==== Storing the incoming data into a String variable
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
  }Code language: Arduino (arduino)

Les données entrantes arrivent toujours un octet à la fois, donc par exemple si nous envoyons la chaîne "Test123" du second Arduino, cette boucle while fera 7 itérations. À chaque itération, en utilisant la fonction HC12.read(), nous lirons chaque octet ou caractère entrant et l'ajouterons à la variable String nommée "readBuffer".

Voyons ensuite comment changer de canal de communication à l'aide du premier bouton poussoir. Donc, si nous appuyons sur le premier bouton-poussoir, en utilisant la fonction HC12.print(), nous enverrons la chaîne "AT+C001" au module HC-12 ou au deuxième Arduino.

if (button1Pressed == HIGH) {
    HC12.print("AT+C001");               // Send the AT Command to the other module
    delay(100);
    //Set AT Command Mode
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print("AT+C001");               // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
    button1Pressed = LOW;
  }Code language: Arduino (arduino)

Lorsque cette chaîne sera reçue sur le deuxième Arduino, nous mettrons le module HC-12 en mode de commande AT, puis y écrirons la même chaîne "AT + C001" qui définira le module sur le canal de communication numéro un.

// At the second Arduino

// === If button 1 is pressed, set channel 01
  if (readBuffer == "AT+C001") {
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12 ("AT+C001")
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
    readBuffer = "";
  }Code language: Arduino (arduino)

Nous utilisons la boucle while suivante pour imprimer le message de réponse du module HC-12 indiquant si le canal a été modifié avec succès.

while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }Code language: Arduino (arduino)

De retour au premier Arduino, nous effectuons la même procédure d'envoi de la commande AT au premier module HC-12. De la même manière, en appuyant sur le deuxième bouton, nous définissons le canal de communication numéro deux. Ainsi, en utilisant cette méthode, nous pouvons sélectionner, à tout moment, avec quel module HC-12 nous communiquerons.

À la fin, la fonction personnalisée checkATCommand() vérifie si le message reçu est une commande AT, en vérifiant si la chaîne commence par "AT". Si tel est le cas, le module passe en mode de commande AT et exécute la commande.

// ==== Custom function - Check whether we have received an AT Command via the Serial Monitor
void checkATCommand () {
  if (readBuffer.startsWith("AT")) {     // Check whether the String starts with "AT"
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(200);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
  }
}Code language: Arduino (arduino)

Communication sans fil HC-12 :contrôle de moteur pas à pas à l'aide d'un accéléromètre

Voyons maintenant le troisième exemple. Ici, nous contrôlons la position du moteur pas à pas du deuxième Arduino, en utilisant le module accéléromètre du premier Arduino.

Le circuit contient également un micro-interrupteur pour trouver la position initiale du moteur pas à pas à 0 degré.

Vous pouvez obtenir les composants nécessaires pour cet exemple à partir des liens ci-dessous :

  • Module de communication sans fil HC-12 ………… 
  • A4988 Pilote de moteur pas à pas ………………………….. 
  • Moteur pas à pas NEMA 17 ………………………………………… 
  • Carte Arduino ………………………………………………………..
  • Breadboard et Jump Wires ………………………….. 
  • Carte GY-80 avec accéléromètre ADXL345 ……… 

Notez ici que j'ai déjà des tutoriels détaillés sur la façon de connecter et d'utiliser à la fois l'accéléromètre et le moteur pas à pas, donc pour cet exemple, je n'expliquerai que la partie HC-12 du code.

Premier Arduino – Code émetteur :

/*   Arduino Long Range Wireless Communication using HC-12
     Example 03 - Stepper Motor Control using Accelerometer - Transmitter, Accelerometer
    by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>
#include <Wire.h>

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin

float angle;
int lastAngle = 0;
int count = 0;
int angleSum = 0;

//--- Accelerometer Register Addresses
#define Power_Register 0x2D
#define X_Axis_Register_DATAX0 0x32 // Hexadecima address for the DATAX0 internal register.
#define X_Axis_Register_DATAX1 0x33 // Hexadecima address for the DATAX1 internal register.
#define Y_Axis_Register_DATAY0 0x34
#define Y_Axis_Register_DATAY1 0x35
#define Z_Axis_Register_DATAZ0 0x36
#define Z_Axis_Register_DATAZ1 0x37
int ADXAddress = 0x53;  //Device address in which is also included the 8th bit for selecting the mode, read in this case.
int X0, X1, X_out;
int Y0, Y1, Y_out;
int Z1, Z0, Z_out;
float Xa, Ya, Za;

void setup() {
  HC12.begin(9600);               // Open serial port to HC12
  Wire.begin(); // Initiate the Wire library
  Serial.begin(9600);
  delay(100);

  Wire.beginTransmission(ADXAddress);
  Wire.write(Power_Register); // Power_CTL Register
  // Enable measurement
  Wire.write(8); // Bit D3 High for measuring enable (0000 1000)
  Wire.endTransmission();
}
void loop() {
  // X-axis
  Wire.beginTransmission(ADXAddress); // Begin transmission to the Sensor
  //Ask the particular registers for data
  Wire.write(X_Axis_Register_DATAX0);
  Wire.write(X_Axis_Register_DATAX1);
  Wire.endTransmission(); // Ends the transmission and transmits the data from the two registers
  Wire.requestFrom(ADXAddress, 2); // Request the transmitted two bytes from the two registers
  if (Wire.available() <= 2) { //
    X0 = Wire.read(); // Reads the data from the register
    X1 = Wire.read();
    /* Converting the raw data of the X-Axis into X-Axis Acceleration
      - The output data is Two's complement
      - X0 as the least significant byte
      - X1 as the most significant byte */
    X1 = X1 << 8;
    X_out = X0 + X1;
    Xa = X_out / 256.0; // Xa = output value from -1 to +1, Gravity acceleration acting on the X-Axis
  }
  //Serial.print("Xa= ");
  //Serial.println(X_out);

  // Y-Axis
  Wire.beginTransmission(ADXAddress);
  Wire.write(Y_Axis_Register_DATAY0);
  Wire.write(Y_Axis_Register_DATAY1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress, 2);
  if (Wire.available() <= 2) {
    Y0 = Wire.read();
    Y1 = Wire.read();
    Y1 = Y1 << 8;
    Y_out = Y0 + Y1;
    Ya = Y_out / 256.0;
  }

  // Combine X and Y values for getting the angle value from 0 to 180 degrees
  if (Y_out > 0) {
    angle = map(Y_out, 0, 256, 90, 0);
  }
  else if (Y_out < 0) {
    angle = map(Y_out, 256, 0, 90, 0);
    angle = 90 - angle;
  }
  if (X_out < 0 & Y_out < 0) {
    angle = 180;
  }
  if (X_out < 0 & Y_out >0) {
    angle = 0;
  }
  
  // float to int
  int angleInt = int(angle);
  // Makes 100 accelerometer readings and sends the average for smoother result
  angleSum = angleSum + angleInt;
  count++;
  if (count >= 100) {
    angleInt = angleSum / 100;
    angleSum = 0;
    count = 0;
    // Some more smoothing of acceleromter reading - sends the new angle only if it differes from the previous one by +-2
    if (angleInt > lastAngle + 2 || angleInt < lastAngle - 2) {
      Serial.println(angleInt);
      String angleString = String(angleInt);
      //sends the angle value with start marker "s" and end marker "e"
      HC12.print("s" + angleString + "e");
      delay(10);
      lastAngle = angleInt;
      angleSum = 0;
      count = 0;
    }
  }
}
Code language: Arduino (arduino)

Second Arduino – Code récepteur :

/*   Arduino Long Range Wireless Communication using HC-12
     Example 03 - Stepper Motor Control using Accelerometer - Receiver, Stepper Motor

    by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <SoftwareSerial.h>

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin

char incomingByte;
String readBuffer = "";

// defines pins numbers
const int dirPin = 4;
const int stepPin = 3;
const int button = 2;

int currentAngle = 0;
int lastAngle = 0;
int rotate = 0;

void setup() {
  Serial.begin(9600);             // Open serial port to computer
  HC12.begin(9600);               // Open serial port to HC12

  // Sets the two pins as Outputs
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  // Microswitch input, with internal pull-up resistor activated
  pinMode(button, INPUT_PULLUP);
  delay(10);
  digitalWrite(dirPin, HIGH);
  boolean startingPosition = true;
  while (startingPosition) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(200);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(200);
    if (digitalRead(button) == LOW) {
      startingPosition = false;
    }
  }
  delay(100);
}
void loop() {
  readBuffer = "";
  boolean start = false;
  // Reads the incoming angle
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    delay(5);
    // Reads the data between the start "s" and end marker "e"
    if (start == true) {
      if (incomingByte != 'e') {
        readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
      }
      else {
        start = false;
      }
    }
    // Checks whether the received message statrs with the start marker "s"
    else if ( incomingByte == 's') {
      start = true; // If true start reading the message
    }
  }
  // Converts the string into integer
  currentAngle = readBuffer.toInt();
  // Makes sure it uses angles between 0 and 180
  if (currentAngle > 0 && currentAngle < 180) {
    // Convert angle value to steps (depending on the selected step resolution)
    // A cycle = 200 steps, 180deg = 100 steps ; Resolution: Sixteenth step x16
    currentAngle = map(currentAngle, 0, 180, 0, 1600); 
    //Serial.println(currentAngle); // Prints the angle on the serial monitor
    digitalWrite(dirPin, LOW); // Enables the motor to move in a particular direction
    // Rotates the motor the amount of steps that differs from the previous positon
    if (currentAngle != lastAngle) {
      if (currentAngle > lastAngle) {
        rotate = currentAngle - lastAngle;
        for (int x = 0; x < rotate; x++) {
          digitalWrite(stepPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(stepPin, LOW);
          delayMicroseconds(400);
        }
      }
      // rotate the other way
      if (currentAngle < lastAngle) {
        rotate = lastAngle - currentAngle;
        digitalWrite(dirPin, HIGH);        //Changes the rotations direction
        for (int x = 0; x < rotate; x++) {
          digitalWrite(stepPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(stepPin, LOW);
          delayMicroseconds(400);
        }
      }
    }
    lastAngle = currentAngle;  // Remembers the current/ last positon
  }
}Code language: Arduino (arduino)

Description des codes :

Nous définissons donc d'abord les broches et initialisons les modules dans la section de configuration. Ensuite, nous lisons les valeurs des axes X et Y de l'accéléromètre et les mappons à des valeurs de 0 à 180 degrés. Les valeurs provenant de l'accéléromètre peuvent parfois être instables ou secouer, donc pour lisser le résultat, j'ai utilisé la valeur moyenne de cent lectures.

// Makes 100 accelerometer readings and sends the average for smoother result
  angleSum = angleSum + angleInt;
  count++;
  if (count >= 100) {
    angleInt = angleSum / 100;
    angleSum = 0;
    count = 0;
    // Some more smoothing of acceleromter reading - sends the new angle only if it differes from the previous one by +-2
    if (angleInt > lastAngle + 2 || angleInt < lastAngle - 2) {
      Serial.println(angleInt);
      String angleString = String(angleInt);
      //sends the angle value with start marker "s" and end marker "e"
      HC12.print("s" + angleString + "e");
      delay(10);
      lastAngle = angleInt;
      angleSum = 0;
      count = 0;
    }
  }Code language: Arduino (arduino)

Pour encore plus de lissage, j'enverrai la nouvelle valeur de l'angle uniquement si elle diffère de la précédente de 2.

Notez ici que lors de l'envoi de l'angle au module HC-12, j'envoie également le caractère "s" devant et le caractère "e" après, ce qui m'aidera lors de la réception des données sur le deuxième Arduino.

Au deuxième Arduino, nous attendons que le marqueur de début "s" vienne, puis nous lisons la valeur de l'angle jusqu'à ce que le marqueur de fin "e" arrive. De cette façon, nous sommes sûrs que nous ne recevrons que la valeur de l'angle.

// Reads the incoming angle
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    delay(5);
    // Reads the data between the start "s" and end marker "e"
    if (start == true) {
      if (incomingByte != 'e') {
        readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
      }
      else {
        start = false;
      }
    }
    // Checks whether the received message statrs with the start marker "s"
    else if ( incomingByte == 's') {
      start = true; // If true start reading the message
    }
  }Code language: Arduino (arduino)

Ensuite, nous convertissons la valeur en nombre entier et mappons la valeur de 0 à 1600 pas, ce qui correspond à la résolution de seizième pas sélectionnée sur le pilote pas à pas A4988. Ensuite, nous faisons tourner le moteur pas à pas à l'angle actuel.

Ce serait donc tout pour ce tutoriel Arduino. N'hésitez pas à poser des questions dans la section des commentaires ci-dessous.


Processus de fabrication

  1. Portée de communication sans fil
  2. Pourquoi le sans fil longue portée alimenté par batterie est perturbateur
  3. Animation LCD et jeux
  4. Générateur d'ondes JX
  5. module GPS u-blox LEA-6H 02 avec Arduino et Python
  6. Scanner de température infrarouge sans fil
  7. Communication Python3 et Arduino
  8. Radio FM utilisant Arduino et RDA8057M
  9. Un système de détection de chute basé sur Arduino, Windows et Azure