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

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

Dalam tutorial Arduino ini, kita akan mempelajari cara menggunakan modul komunikasi serial nirkabel HC-12 yang mampu membuat komunikasi nirkabel jarak jauh antara beberapa papan Arduino, dengan jarak hingga 1,8 km. Anda dapat menonton video di bawah ini atau membaca tutorial tertulis untuk detail selengkapnya.

Ringkasan

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

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

Modul Komunikasi Nirkabel HC-12

Pertama, mari kita perhatikan lebih dekat modul komunikasi serial port nirkabel HC-12. Berikut beberapa spesifikasi:

  • Frekuensi kerja nirkabelnya berkisar dari 433,4 MHz hingga 473,0 MHz
  • Memiliki total 100 saluran dengan jarak 400 KHz antara setiap saluran
  • Daya transmisi berkisar dari -1 dBm (0,79 mW) hingga 20 dBm (100 mW)
  • Sensitivitas penerimaan berkisar dari -117 dBm (0,019 pW) hingga -100 dBm (10 pW)

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

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

Modul HC-12 memiliki mikrokontroler yang sebenarnya tidak perlu diprogram oleh pengguna. Untuk mengonfigurasi modul, kita cukup menggunakan perintah AT, yang dapat dikirim dari Arduino, PC, atau mikrokontroler lain menggunakan port serial. Untuk memasuki mode perintah AT, kita cukup mengatur pin “Set” modul ke tingkat logika rendah.

Arduino dan HC-12

Sekarang mari kita hubungkan modul HC-12 ke Arduino dan buat contoh pertama. Berikut skema rangkaiannya. Tegangan operasi modul berkisar dari 3,2 V hingga 5,5 V, dan untuk bekerja lebih stabil, disarankan menggunakan kapasitor pemisah dan suplai daya eksternal. Namun, saya menggunakan USB PC sebagai daya untuk semua tiga contoh dalam tutorial ini dan tidak mengalami masalah apa pun.

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

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 dapat mendapatkan komponen yang diperlukan untuk tutorial Arduino ini dari tautan di bawah ini:

  • Modul Komunikasi Nirkabel HC-12 ………..
  • Papan Arduino ………………………………………………
  • Breadboard dan Kabel Jumper …………………………

Contoh 01 – Kode Arduino


Berikut kode Arduino untuk contoh pertama, komunikasi dasar antara kedua 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 } }Bahasa kode: Arduino (arduino)

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

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

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

Jadi, setelah kedua Arduino IDE berjalan, kita dapat memulai serial monitor dan menguji apakah komunikasi berfungsi dengan baik. Apa pun yang kita ketik di serial monitor akan dikirim dari satu Arduino ke yang lain.

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

Cara kerja kode: Jadi, setelah kita mengetik sesuatu di serial monitor dan klik tombol Send, pada Arduino pertama, loop while dengan fungsi Serial.available() akan menjadi benar, dan menggunakan fungsi HC12.write(), kita akan mengirim data dari serial monitor 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 benar, dan menggunakan fungsi Serial.write(), data akan dikirim ke serial monitor.

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

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

Untuk menguji apakah kita telah berhasil memasuki mode, di serial monitor kita dapat mengetik “AT” dan kita seharusnya menerima respons pesan “OK”. Total ada 12 Perintah AT, dan digunakan untuk mengubah berbagai parameter seperti baud rate, saluran, daya transmisi, dan sebagainya. Misalnya, jika kita ketik “AT+B38400”, baud rate modul akan diatur ke 38400.

Perintah AT:

1. AT – Perintah pengujian.

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

2. AT+Bxxxx – Ubah 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. Default: 9600 bps.

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

3. AT+Cxxxx – Ubah saluran komunikasi nirkabel, dari 001 hingga 100.

Default: Saluran 001, dengan frekuensi kerja 433,4 MHz. Setiap saluran berikutnya 400 KHz lebih tinggi.

Contoh: Jika kita ingin mengatur modul ke saluran 006, kita perlu mengirim perintah “AT+C006” ke modul, dan modul akan mengembalikan “OK+C006”. Frekuensi kerja baru akan menjadi 435,4 MHz.

Contoh 02


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

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

Catatan: Pin “Set” dari kedua modul HC-12 terhubung ke pin nomor 6 dari kedua Arduino, dan dua tombol, pada 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 } }Bahasa kode: 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 } }Bahasa kode: Arduino (arduino)

Deskripsi kode:

Jadi, pertama-tama kita perlu mendefinisikan pin dan mengatur pin “Set” ke tingkat logika tinggi agar modul bekerja dalam mode normal, transparan. Dengan loop while pertama, kita menyimpan data yang masuk ke dalam variabel String, sehingga kita dapat mengolahnya 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 }Bahasa kode: 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”.

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

Selanjutnya, mari kita lihat cara kita dapat mengubah saluran komunikasi menggunakan tombol push pertama. Jadi, jika kita menekan tombol push pertama, menggunakan fungsi HC12.print(), kita akan mengirim 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; }Bahasa kode: Arduino (arduino)

Ketika string ini diterima di Arduino kedua, kita akan mengatur modul HC-12 ke mode perintah AT, lalu menulis string yang sama “AT+C001” ke dalamnya 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 = ""; }Bahasa kode: Arduino (arduino)

Kita 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 }Bahasa kode: Arduino (arduino)

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

Pada akhirnya, fungsi khusus checkATCommand() memeriksa apakah pesan yang diterima adalah perintah AT, dengan memeriksa apakah string dimulai dengan “AT”. Jika ya, modul memasuki mode perintah AT dan mengeksekusi perintahnya.

// ==== 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 } }Bahasa kode: Arduino (arduino)

Komunikasi Nirkabel HC-12: Kontrol Motor Stepper menggunakan Akselerometer

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

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

Rangkaian juga berisi mikroswitch untuk menemukan posisi awal motor stepper pada 0 derajat.

Membangun Jaringan Arduino Jarak Jauh yang Andalan dengan Modul HC-12

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

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

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

Kode Arduino pertama – Transmiter:

/* 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 } // 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; } } } Bahasa kode: Arduino (arduino)

Kode Arduino kedua – 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 } }Bahasa kode: 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 memetakan ke nilai dari 0 hingga 180 derajat. Nilai yang datang dari akselerometer terkadang tidak stabil atau goyah, jadi untuk menyelaraskan hasilnya, saya menggunakan nilai rata-rata dari 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; } }Bahasa kode: Arduino (arduino)

Untuk penyelesaian yang lebih baik lagi, saya akan mengirim nilai sudut baru hanya jika berbeda dari sebelumnya sebesar 2.

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

Di Arduino kedua, kita menunggu hingga tanda awal “s” datang, lalu kita membaca nilai sudut hingga tanda akhir “e” tiba. Dengan cara ini, kita yakin bahwa kita hanya akan menerima nilai sudutnya.

// 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 } }Bahasa kode: Arduino (arduino)

Kemudian kita mengubah nilai menjadi integer, dan memetakan nilai dari 0 hingga 1600 langkah, yang sesuai dengan resolusi langkah belasan yang dipilih pada driver stepper A4988. Kemudian kita memutar motor stepper ke sudut saat ini.

Itu saja untuk tutorial Arduino ini. Silakan ajukan pertanyaan apa pun di bagian komentar di bawah ini.


Proses manufaktur

  1. Menguasai Jangkauan Komunikasi Nirkabel: Bagaimana Daya, Laju Data, dan Gangguan Bentuk Konektivitas
  2. Nirkabel Jarak Jauh Bertenaga Baterai Mengubah Konektivitas
  3. Buat Animasi LCD dan Game Menarik dengan Arduino UNO
  4. JX Wave Generator – Osilator DDS Kompatibel Arduino dengan Tampilan OLED
  5. Modul GPS u-blox LEA-6H 02: Panduan Integrasi Arduino & Python
  6. Skenner Suara IR Nirkabel – Arduino Nano dengan Bluetooth & MLX90614
  7. Python 3 ke Arduino UNO: Kontrol Perintah Mudah dan Demo LED
  8. Membuat Radio FM Kompak dengan Arduino Nano dan RDA8057M
  9. Sistem Deteksi Jatuh Canggih dengan Arduino, Windows IoT, dan Azure Cloud
  10. Jam Alarm ArduRadio: Sistem Radio FM & Alarm Berbasis Arduino DIY