Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Modul Komunikasi Nirkabel Jarak Jauh Arduino dan HC-12

Dalam tutorial Arduino ini kita akan belajar bagaimana menggunakan modul komunikasi serial nirkabel HC-12 yang mampu melakukan komunikasi nirkabel jarak jauh antara beberapa papan Arduino, dengan jarak hingga 1,8km. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini untuk lebih jelasnya.

Ringkasan

Untuk tutorial ini saya membuat dua contoh dasar yang menjelaskan cara menghubungkan modul HC-12 dan membuat komunikasi dasar antara dua Arduino dan contoh tambahan di mana menggunakan sensor accelerometer di Arduino pertama saya secara nirkabel mengontrol posisi stepper di kedua Arduino.

Modul Komunikasi Nirkabel HC-12

Pertama mari kita lihat lebih dekat modul komunikasi port serial nirkabel HC-12. Berikut beberapa spesifikasinya:

  • Pita frekuensi kerja nirkabelnya adalah dari 433,4 MHz hingga 473,0 MHz
  • Ini memiliki total 100 saluran dengan loncatan 400 KHz di antara setiap saluran
  • Daya transmisi dari -1dBm (0,79mW) hingga 20dBm (100mW)
  • Sensitivitas penerimaan adalah dari -117dBm (0,019pW) hingga -100dBm (10pW).

Nilai-nilai ini sebenarnya bergantung pada Baud Rate Serial dan Over-the-Air yang dipilih seperti yang terlihat pada tabel.

Modul HC-12 memiliki mikrokontroler yang sebenarnya tidak harus diprogram oleh pengguna. Untuk mengkonfigurasi modul kita cukup menggunakan perintah AT, yang dapat dikirim dari Arduino, PC, atau mikrokontroler lainnya menggunakan port serial. Untuk memasuki mode perintah AT kita hanya perlu menyetel pin “Set” modul ke level logika rendah.

Arduino dan HC-12

Sekarang mari kita sambungkan modul HC-12 ke Arduino dan buat contoh pertama. Berikut skema rangkaiannya. Tegangan operasi modul adalah dari 3,2 V hingga 5,5 V dan untuk pekerjaan yang lebih stabil, disarankan untuk menggunakan kapasitor decoupling dan catu daya eksternal. Namun, saya menggunakan USB PC sebagai daya untuk ketiga contoh dalam tutorial ini dan tidak ada masalah dengan itu.

Saya menghubungkan modul pertama ke Arduino UNO dan modul kedua ke Arduino MEGA, tetapi tentu saja, Anda dapat menggunakan papan apa pun yang Anda inginkan.

Anda bisa mendapatkan komponen yang diperlukan untuk Tutorial Arduino ini dari link di bawah ini:

  • Modul Komunikasi Nirkabel HC-12 ……….. 
  • Dewan Arduino ………………………………………………
  • Breadboard dan Kabel Lompat ………………………… 

Contoh 01 – Kode Arduino


Berikut kode Arduino untuk contoh pertama, komunikasi dasar antara dua modul menggunakan 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)

Kode yang sama digunakan untuk kedua Arduino. Kita dapat menghubungkan dua Arduino di dua komputer terpisah, tetapi kita juga dapat menggunakan satu komputer.

Dalam hal ini, setelah kita menghubungkan Arduino pertama ke komputer, kita perlu memilih model dan port COM dan mengunggah kode ke Arduino. Kemudian kita menghubungkan Arduino kedua dan kita harus memulai Arduino IDE lagi untuk dapat memilih port COM lain yang terhubung dengan Arduino kedua, dan kemudian mengunggah kode yang sama.

Jadi begitu kita menjalankan dua Arduino IDE, kita dapat memulai monitor serial dan menguji apakah komunikasi berfungsi dengan baik. Apa pun yang kita ketik di monitor serial akan dikirim dari satu ke Arduino lainnya.

Cara kerja kode: Jadi begitu kita mengetik sesuatu di serial monitor dan klik tombol Send, di Arduino pertama, loop while dengan fungsi Serial.available() akan menjadi true dan menggunakan fungsi HC12.write() kita akan mengirimkan data dari monitor serial ke modul HC-12. Modul ini akan mentransfer data secara nirkabel ke modul HC-12 kedua, sehingga pada Arduino kedua loop while dengan fungsi HC12.available() akan menjadi true dan menggunakan fungsi Serial.write() data akan dikirim ke monitor serial.

Kita dapat menggunakan kode yang sama untuk mengirim Perintah AT dan mengkonfigurasi parameter modul. Yang harus kita lakukan adalah menghubungkan pin “Set” modul ke Ground atau pin digital Arduino dan mengatur pin ke level logika rendah.

Untuk mengetes apakah kita sudah berhasil masuk ke mode tersebut, di serial monitor kita bisa mengetikkan “AT” dan kita akan mendapatkan pesan respon “OK”. Ada total 12 Perintah AT, dan digunakan untuk mengubah berbagai parameter seperti kecepatan baud, saluran, daya pancar, dll. Misalnya, jika kita mengetik “AT+B38400”, kecepatan baud modul akan diatur ke 38400.

Perintah DI:

1. AT – Perintah uji.

Contoh:Kirim “AT” ke modul, dan modul mengembalikan “OK”.

2. AT+Bxxxx – Mengubah baud rate port serial.

Baud rate yang tersedia:1200 bps, 2400 bps, 4800 bps, 9600 bps, 19200 bps, 38400 bps, 57600 bps, dan 115200 bps. Bawaan:9600 bps.

Contoh:Kirim “AT+B38400” ke modul, dan modul mengembalikan “OK+B19200”.

3. AT+Cxxxx – Mengubah saluran komunikasi nirkabel, dari 001 menjadi 100.

Default:Channel 001, dengan frekuensi kerja 433.4MHz. Setiap saluran berikutnya 400KHz lebih tinggi.

Contoh:Jika kita ingin menyetel modul ke saluran 006, kita perlu mengirimkan perintah “AT+C006” ke modul, dan modul akan mengembalikan “OK+C006”. Frekuensi kerja yang baru akan menjadi 435.4MHz.

Contoh 02


Sekarang mari kita pindahkan contoh kedua. Di sini kita akan menggunakan dua tombol untuk memilih saluran komunikasi yang berbeda dan melihat metode yang berbeda untuk menyimpan data yang masuk.

Catatan:Pin “Set” dari kedua modul HC-12 terhubung ke pin nomor 6 dari dua Arduino dan dua tombol, di Arduino pertama, ke pin 4 dan 3.

Kode Arduino pertama:

/*    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)

Kode Arduino kedua:

/*    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)

Deskripsi kode:

Jadi, pertama-tama kita perlu mendefinisikan pin dan mengatur pin "Set" ke level logika tinggi agar modul dapat bekerja dalam mode normal dan transparan. Dengan loop while pertama kami menyimpan data yang masuk ke dalam variabel String, sehingga kami dapat menanganinya dengan lebih baik.

// ==== 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)

Data yang masuk selalu datang satu byte pada satu waktu, jadi misalnya jika kita mengirim string “Test123” dari Arduino kedua, loop while ini akan melakukan 7 iterasi. Setiap iterasi, menggunakan fungsi HC12.read() kita akan membaca setiap byte atau karakter yang masuk dan menambahkannya ke variabel String bernama “readBuffer”.

Selanjutnya mari kita lihat bagaimana kita dapat mengubah saluran komunikasi menggunakan tombol tekan pertama. Jadi jika kita menekan tombol push pertama, menggunakan fungsi HC12.print() kita akan mengirimkan string “AT+C001”  ke modul HC-12 atau ke Arduino kedua.

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)

Ketika string ini akan diterima di Arduino kedua, kami akan mengatur modul HC-12 ke mode perintah AT, dan kemudian menulis string yang sama "AT+C001" padanya yang akan mengatur modul ke saluran komunikasi nomor satu.

// 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)

Kami menggunakan loop while berikutnya untuk mencetak pesan respons dari modul HC-12 apakah saluran telah berhasil diubah.

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)

Kembali ke Arduino pertama, kami melakukan prosedur yang sama dengan mengirimkan perintah AT ke modul HC-12 pertama. Dengan cara yang sama kami, dengan menekan tombol kedua, kami mengatur saluran komunikasi nomor dua. Jadi dengan menggunakan metode ini kita dapat memilih, kapan saja, dengan modul HC-12 mana yang akan kita komunikasikan.

Pada akhirnya, fungsi kustom checkATCommand(), memeriksa apakah pesan yang diterima adalah perintah AT, dengan memeriksa apakah string dimulai dengan “AT”. Jika demikian, modul memasuki mode perintah AT dan menjalankan perintah.

// ==== 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)

Komunikasi Nirkabel HC-12:Kontrol Motor Stepper menggunakan Akselerometer

Sekarang mari kita lihat contoh ketiga. Di sini kita mengontrol posisi motor stepper di Arduino kedua, menggunakan modul akselerometer di Arduino pertama.

Rangkaian ini juga berisi microswitch untuk mencari posisi awal motor stepper pada 0 derajat.

Anda bisa mendapatkan komponen yang diperlukan untuk contoh ini dari tautan di bawah:

  • Modul Komunikasi Nirkabel HC-12 ………… 
  • Pengemudi Motor Stepper A4988 ………………………….. 
  • Motor Stepper NEMA 17 ………………………………… 
  • Dewan Arduino ………………………………………………..
  • Breadboard dan Kabel Lompat ………………………….. 
  • Papan GY-80 dengan Akselerometer ADXL345 ……… 

Perhatikan di sini bahwa saya sudah memiliki tutorial terperinci tentang cara menghubungkan dan menggunakan akselerometer dan motor stepper, jadi untuk contoh ini saya hanya akan menjelaskan bagian kode HC-12.

Arduino Pertama – Kode pemancar:

/*   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)

Arduino Kedua – Kode penerima:

/*   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)

Deskripsi kode:

Jadi pertama-tama kita mendefinisikan pin dan menginisialisasi modul di bagian setup. Kemudian kita membaca nilai sumbu X dan Y dari akselerometer dan memetakannya ke nilai dari 0 hingga 180 derajat. Nilai yang berasal dari akselerometer terkadang tidak stabil atau goyang, jadi untuk menghaluskan hasilnya saya menggunakan nilai rata-rata seratus pembacaan.

// 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)

Untuk pemulusan lebih lanjut, saya akan mengirimkan nilai sudut yang baru hanya jika berbeda dari sebelumnya sebesar 2.

Perhatikan di sini bahwa saat mengirim sudut ke modul HC-12, saya juga mengirim karakter "s" di depan, dan karakter "e" setelahnya, yang akan membantu saya saat menerima data di Arduino kedua.

Pada Arduino kedua kita menunggu sampai penanda awal “s” datang, kemudian kita membaca nilai sudut hingga penanda akhir “e” tiba. Dengan cara ini kita yakin bahwa kita hanya akan menerima nilai sudut.

// 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)

Kemudian kami mengonversi nilai ke bilangan bulat, dan memetakan nilai dari 0 hingga 1600 langkah, yang sesuai dengan resolusi langkah keenam belas yang dipilih pada driver stepper A4988. Kemudian kita putar motor stepper ke sudut saat ini.

Jadi itu saja untuk tutorial Arduino ini. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah.


Proses manufaktur

  1. Jangkauan Komunikasi Nirkabel
  2. Mengapa Nirkabel Jarak Jauh Bertenaga Baterai Mengganggu
  3. Animasi dan Permainan LCD
  4. JX Wave Generator
  5. u-blox LEA-6H 02 Modul GPS dengan Arduino dan Python
  6. Pemindai Suhu IR Nirkabel
  7. Python3 dan Komunikasi Arduino
  8. Radio FM Menggunakan Arduino dan RDA8057M
  9. Sistem deteksi jatuh berdasarkan Arduino, Windows dan Azure
  10. ArduRadio AlarmClock