Ulasan kursus online tentang Arduino / Robotika dari MIPT (minggu kedua)


Kami terus menerbitkan ikhtisar kursus online "Robot Bangunan dan Perangkat Arduino Lain," mulai di sini .


Jadi, berapa lama itu singkat, minggu kedua kursus robotika online dari MIPT berakhir. Terus terang, minggu itu sangat penuh dengan berbagai topik.


Berikut adalah daftar sampel yang telah saya alokasikan untuk diri saya sendiri:


  • Pembagi tegangan. Menggunakan photoresistor dan termistor
  • Sinyal analog. Lebar sinyal
  • Komunikasi melalui port serial. Lingkungan Pemrosesan
  • Sinyal digital. Tombol dan opsi koneksi. Penarik pull-up
  • Ekspresi logis, pernyataan if and else
  • Bel, bilah LED, indikator tujuh segmen
  • Sirkuit mikro. Logika Inverter 74HC04, Shift Register 74HC595
  • Program Debugging
  • Modul eksternal
  • Varian dari sistem pemantauan siap pakai yang menampilkan suhu dan tingkat cahaya pada skala LED, serta speaker yang berfungsi saat suhu tertentu terlampaui

Setelah berhasil lulus tes dan mengumpulkan skema yang diusulkan dari pelajaran, saya berpikir tentang bagaimana meningkatkan skema ini atau itu atau mengumpulkan sesuatu dari saya sendiri.



Hal pertama yang terlintas dalam pikiran adalah modernisasi sensor cahaya. Implementasi yang diusulkan dalam pelajaran hanya mengambil nilai dari photoresistor dan mengirimkannya ke port serial.


Versi yang ditingkatkan harus menggunakan indikator tujuh segmen untuk menampilkan angka dari 0 (pencahayaan minimum) hingga 9 (pencahayaan maksimum). Indikator harus terhubung melalui register geser. Dua tombol harus digunakan untuk mengatur tingkat pencahayaan minimum dan maksimum. Register geser diperlukan agar tidak menggunakan pin Arduino pada setiap segmen, melainkan menggunakan pin yang lebih sedikit. Bahkan, register geser mengubah output data serial (satu bit per unit waktu) ke paralel (beberapa bit per unit waktu). Dalam kasus kami, alih-alih tujuh pin Arduino, kami hanya membutuhkan tiga pin.


Di editor Fritzing, saya mendapat alat seperti itu.



Dengan cara ini terlihat hidup.




Dasar diambil skema untuk bekerja dengan register geser dan photoresistor.


Perhatikan bahwa di papan photoresistor terhubung agak berbeda daripada di tutorial video - di sana kami mengambil nilai tegangan pada photoresistor relatif ke tanah, dan di sirkuit kami menghapus penurunan tegangan relatif terhadap catu daya. Hal ini dilakukan untuk menyederhanakan program sedikit - dengan peningkatan tingkat iluminasi, hambatan photoresistor berkurang. Oleh karena itu, pada saat yang sama, penurunan tegangan berkurang. Oleh karena itu, pada input analog, semakin tinggi tegangan, semakin tinggi tingkat iluminasi, dan sebaliknya.


Sekarang terserah Anda untuk menyelesaikan kode sumber. Program yang sama digunakan sebagai dasar untuk menampilkan nilai pada indikator tujuh segmen.


Kode program
// ,      #define DATA_PIN 13 #define LATCH_PIN 12 #define CLOCK_PIN 11 //  ,        #define BTN_MIN 3 #define BTN_MAX 2 // ,       #define SENS_PIN A5 //     ,   byte d0 = 0b01111101; byte d1 = 0b00100100; byte d2 = 0b01111010; byte d3 = 0b01110110; byte d4 = 0b00100111; byte d5 = 0b01010111; byte d6 = 0b01011111; byte d7 = 0b01100100; byte d8 = 0b01111111; byte d9 = 0b01110111; //        int min_light = 0; int max_light = 1023; //    int value; // ,  .  .  int output; //   int digit; void setup() { //     pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); //       Serial.begin(9600); //     pinMode(BTN_MIN, INPUT_PULLUP); pinMode(BTN_MAX, INPUT_PULLUP); } void loop() { //     value = analogRead(SENS_PIN); output = value; //    -    if (!digitalRead(BTN_MIN)) min_light = value; if (!digitalRead(BTN_MAX)) max_light = value - 10; //      if (value < min_light) output = min_light; if (value > max_light) output = max_light; //  ,      digit = map(value, min_light, max_light, 0, 9); //   Serial.println("Value: " + String(value) + " Output: " + String(output) + " Min: " + String(min_light) + " Max: " + String(max_light) + " Current : " + String(value) + " Digit: " + String(digit)); //      if (digit == 0) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d0); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 1) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d1); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 2) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d2); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 3) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d3); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 4) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d4); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 5) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d5); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 6) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d6); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 7) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d7); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 8) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d8); digitalWrite(LATCH_PIN, HIGH); } else if (digit == 9) { digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, d9); digitalWrite(LATCH_PIN, HIGH); } //       delay(10); } 

Dari fitur - ketika mengatur tingkat pencahayaan maksimum, kami harus mengurangi beberapa konstan (max_light = nilai - 10), yang dipilih secara empiris. Ini diperlukan untuk menghindari "berderak" pada tingkat pencahayaan maksimum, karena nilai tegangan yang diambil dari photoresistor tidak stabil.


Kami mengkompilasi sketsa, memuatnya ke dalam Arduino dan memeriksa.


Pertama di monitor port ...




Dan kemudian hidup



Seperti yang Anda lihat, perangkat berhasil berfungsi seperti dijelaskan. Tentu saja, masih ada ruang untuk perbaikan - misalnya, Anda dapat menambahkan sinyal audio ketika pencahayaan turun di bawah tingkat tertentu - ini berarti Anda harus menyalakan lampu tambahan di tempat kerja. Juga di masa depan akan dimungkinkan untuk mengubah program itu sendiri, menggunakan array dan fungsi tambahan.


Sebagai kesimpulan, saya ulangi sekali lagi bahwa minggu itu ternyata sangat penuh dengan berbagai topik. Perhatikan bahwa sejak publikasi kursus di Arduino IDE, fungsi Serial Plotter bawaan telah muncul, yang tumpang tindih sebagian fungsi lingkungan pemrosesan yang dipertimbangkan dalam pelajaran. Juga, pada akhir minggu, penulis datang dengan ide modularitas ketika perangkat akhir dirakit dari elemen siap pakai - modul, misalnya, tombol dengan resistor pull-up yang sudah terpasang, sensor cahaya siap pakai, di mana photoresistor dan resistor konvensional sudah dirakit menjadi pembagi tegangan, dan sejenisnya. Namun, perangkat dapat dengan mudah dipasang di papan tempat memotong roti, yang sudah dilakukan. Pertanyaannya adalah untuk pembaca, apakah Anda pernah membuat casing untuk perangkat Anda? Bahan apa yang Anda gunakan untuk ini? Mungkin kardus, plywood, plexiglass, atau, yang tidak jarang hari ini, dicetak pada printer 3D?

Source: https://habr.com/ru/post/id403029/


All Articles