Membuat satu lagi kayu bedik (gamepad) pada Arduino. Membuat satu lagi kayu bedik (pad permainan) pada Arduino Menyambungkan kayu bedik wayarles ke Arduino

Saya mempunyai arduino nano yang terletak di sekeliling (klon Cina berkualiti tinggi dari RobotDyn). Dan kemudian pada hari yang lain sebuah servomotor dan manipulator juga tiba dari China, dan kami juga mendapat masa untuk memikirkannya sedikit. Jadi, matlamat saya adalah mudah: sambungkan arduino nano, servomotor dan kayu bedik, dan buat servomotor berputar apabila kayu bedik diputar. Untuk tujuan praktikal, ini boleh digunakan, sebagai contoh, untuk mengawal putaran kamera.

Ternyata, ia tidak begitu sukar. Gambar rajah sambungan adalah seperti berikut:

1. Menyambung Arduino dan servomotor:

  • wayar coklat (pada servo saya) - tanah (gnd);
  • wayar merah - 5v;
  • wayar oren - 8 pin.

2. Menyambung Arduino dan kayu bedik:

  • gnd - gnd;
  • 5v - 5v (saya disambungkan ke 3.3v);
  • VRX (isyarat untuk koordinat paksi-X) - A1;
  • VRY (isyarat untuk koordinat sepanjang paksi Y) - A0;
  • SW (mod butang - ditekan atau dilepaskan) - 2 pin.

Kami menyambungkan semua keajaiban buatan China kami, sambungkan arduino ke komputer, buka Arduino IDE, muat naik lakaran di bawah. Selepas memuatkan lakaran, anda boleh menggerakkan manipulator ke sisi, servomotor akan berputar.

#termasuk //Perpustakaan untuk bekerja dengan servomotor int xPin = A1; //A1 - isyarat analog koordinat X kayu bedik int yPin = A0; //A0 - isyarat analog Pada koordinat kayu bedik int butangPin = 2; // Pin untuk mod butang (ditekan atau dilepaskan) int xPosition = 0; // pembolehubah untuk menyimpan kedudukan semasa kayu bedik sepanjang paksi X int yPosition = 0; // pembolehubah untuk menyimpan kedudukan semasa kayu bedik sepanjang paksi Y int butangState = 0; //keadaan semasa butang (ditekan) int servoPin = 8; // pin untuk isyarat daripada servomotor Servo servo; // Sudut int pembolehubah jenis Servo = 90; //sudut permulaan putaran motor servo int semasaXpos = 0; //Persediaan X void kedudukan semasa() ( pinMode(xPin, INPUT); // Isyarat daripada xPin ditakrifkan sebagai pinMode isyarat input(yPin, INPUT); // Isyarat daripada yPin ditakrifkan sebagai isyarat input pinMode( buttonPin, INPUT_PULLUP); / / aktifkan perintang tarik pada servo pin butang (servoPin); // pasangkan pin servo.write(sudut); = analogRead(xPin); // baca nilai xPin yPosition = analogRead(yPin); // baca nilai yPin buttonState = digitalRead(buttonPin); adalah lebih besar daripada 360 jika(xPosition > 360) ( sudut = sudut-10; // kurangkan sudut putaran sebanyak 10 darjah // jika sudut kurang daripada 0 jika(sudut< 0) { angle = 0; //устанавливаем значение угла 0 градусов } } //если xPosition меньше 300 if(xPosition < 300) { angle = angle+10; // увеличиваем угол поворота сервомотора на 10 градусов //если угол поворота больше 180 градусов if(angle >180) ( sudut = 180; //tetapkan nilai sudut kepada 180 darjah) ) // jika butang kayu bedik ditekan jika(buttonState == 0) ( sudut = 90; //tetapkan sudut kepada 90 darjah) servo.write (sudut); // putarkan motor servo ke kelewatan sudut yang dikehendaki (50); // tambah kelewatan antara pembacaan data)

Apabila menyambungkan kayu bedik ke bekalan kuasa 3.3V, nilai lalai untuk kedudukan X dan Y ialah 330 (apabila disambungkan kepada 5V, nilai mungkin berbeza), untuk menyemak nilai bacaan semasa, saya mengambil sisihan daripada nilai awal 30 unit.

Anda boleh memantau nilai isyarat analog menggunakan monitor port bersiri (anda boleh membukanya seperti ini: alat -> monitor port atau CTRL + SHIFT + M). Untuk melakukan ini, dalam fungsi persediaan() anda perlu menulis perkara berikut:

Serial.begin(9600); // permulaan pertukaran data melalui protokol bersiri pada kelajuan 9600 bps

Dalam fungsi gelung() tulis yang berikut:

Serial.print("X: ");

Serial.print(xPosition);

Jadi, artikel ini membincangkan proses menyambungkan servomotor dan kayu bedik ke Arduino Nano, dan menyediakan lakaran contoh. Pada masa hadapan, saya merancang untuk menyambung motor servo kedua untuk memanfaatkan sepenuhnya keupayaan kayu bedik dan melakukan putaran di sepanjang paksi X dan Y.

Artikel baru


Pelaksanaan mudah medan teks dengan petua lungsur (serupa dengan carian dalam Yandex dan Google) apabila memasukkan teks dalam C# WPF. Melaksanakan kawalan pengguna dalam C#/

Kajian Kayu Joy Haptic

Kayu bedik ialah salah satu peranti untuk memindahkan maklumat dengan mudah daripada seseorang ke komputer atau mikropengawal. Kayu bedik digunakan untuk mengawal pergerakan robot, platform mudah alih dan mekanisme lain.

Modul kayu bedik dua paksi (Gamb. 1) mempunyai dua darjah kebebasan dan merupakan pemegang yang dipasang pada sambungan bola dengan dua paksi saling berserenjang.

Rajah 1. Kayu bedik.

Apabila pemegang dicondongkan, sesentuh bergerak setiap satu daripada dua potensiometer dengan nilai nominal 10 kOhm berputar, yang menentukan kedudukan paksi X dan Y Sesentuh tengah setiap potensiometer disambungkan ke pin VRX dan VRY penyambung, dan yang luar disambungkan kepada kuasa dan tanah. Kayu bedik juga dilengkapi dengan butang kebijaksanaan, yang diaktifkan apabila pemegang ditekan secara menegak bacaan diambil dari kenalan SW. Apabila dilepaskan, kayu bedik kembali ke keadaan tengah asalnya.

Spesifikasi

    Voltan bekalan: nominal 3.0…5.5 V;

    Isyarat keluaran: digital (butang) dan analog (paksi X dan Y);

    Dimensi: 26 mm x 40 mm x 22 mm.

Sambungan ke papan Arduino

Untuk menyambungkan modul kayu bedik ke papan Arduino, kami akan menggunakan dua pin Arduino analog dan satu digital, serta Papan Arduino Kami membekalkan kuasa kepada kenalan kayu bedik GND dan +5V. Gambar rajah sambungan ditunjukkan dalam Rajah 2.


Rajah 2. Gambar rajah sambungan modul kayu bedik ke papan Arduino.

Mari tulis lakaran untuk menerima data daripada kayu bedik. Data daripada potensiometer pada paksi X dan Y boleh mengambil nilai dari 0 hingga 1023. Kedudukan tetap kayu bedik sepadan dengan nilai 511 untuk setiap potensiometer. Apabila anda menekan butang, 0 akan muncul pada input 3 Arduino Untuk mengelakkan gangguan, output butang mesti ditarik sehingga +5 V. Kami mengeluarkan data ke port bersiri.

Kandungan lakaran ditunjukkan dalam Penyenaraian 1.


Penyenaraian 1

#define PIN_VRX A0

#define PIN_VRY A1

// pin sambungan butang

#define PIN_BUTTON 3

Serial.begin(9600);

// Keluarkan nilai di sepanjang paksi X

Serial.print("X = ");

Serial.println(analogRead(PIN_VRX));

// Keluarkan nilai di sepanjang paksi Y

Serial.print("Y = ");

Serial.println(analogRead(PIN_VRY));

// Keadaan butang

Serial.print("butang = ");

jika (digitalRead(PIN_BUTTON) == TINGGI) (

Serial.println("TIDAK KLIK");

Serial.println("KLIK!");

// Jeda 1 saat

Kami memuat naik lakaran ke papan Arduino, buka monitor port bersiri dan lihat output data apabila kedudukan kayu bedik berubah (Gamb. 3).


Rajah 3. Mengeluarkan data daripada kayu bedik ke monitor port bersiri.

Contoh penggunaan

Mari lihat contoh menggunakan kayu bedik untuk mengawal gimbal kamera dengan pemacu servo. Kami memerlukan butiran berikut:

    Papan Arduino Uno - 1 keping;

    papan prototaip - 1 keping;

    modul kayu bedik - 1 keping;

    pemacu servo - 2 pcs;

    penggantungan kamera - 1 keping;

    Bekalan kuasa 5V - 1 keping;

Rajah sambungan ditunjukkan dalam Rajah 4.


Rajah 4. Gambar rajah sambungan kayu bedik dan modul penggantungan pada servos ke papan Arduino.

Kami membaca bacaan kayu bedik untuk setiap paksi X, Y dan menukarkannya kepada nilai sudut putaran pemacu servo yang sepadan. Untuk menghapuskan jitter pemacu servo, kami tidak bertindak balas terhadap perubahan kecil dalam kedudukan kayu bedik.

Kandungan lakaran ditunjukkan dalam Penyenaraian 2.


Penyenaraian 2

// sambungkan perpustakaan Servo

#termasuk

// pin untuk menyambungkan servos

#define PIN_SERVO_X 9

#define PIN_SERVO_Y 10

// Pin sambungan pin VRX

#define PIN_VRX A0

// Pin sambungan kenalan VRY

#define PIN_VRY A1

// pin sambungan butang

#define PIN_BUTTON 3

// buat objek Servo

// pembolehubah perkhidmatan

int sudutX, sudutY;

// mulakan port bersiri

Serial.begin(9600);

// sambungkan kawalan servo kepada pin

// PIN_SERVO_X dan PIN_SERVO_Y

servoX.attach(PIN_SERVO_X);

servoY.attach(PIN_SERVO_Y);

// menerima data daripada kayu bedik

joyX=analogRead(PIN_VRX);

joyY=analogRead(PIN_VRY);

// Keluarkan nilai di sepanjang paksi X

Serial.print("X = ");

Serial.print(joyX);

// Keluarkan nilai di sepanjang paksi Y

Serial.print(" Y = ");

Serial.println(joyY);

// perbandingan dengan yang sebelumnya

if(abs(joyX-joyXpr)>10) ( // berputar di sepanjang paksi X

angleX=peta(joyX,0,1023,0,180);

servoX.write(angleX);

if(abs(joyY-joyYpr)>10) ( // berputar di sepanjang paksi Y

sudutY=peta(joyY,0.1023,0.180);

servoY.write(angleY);

// masa untuk menggerakkan servo

Kami memuat naik lakaran ke papan Arduino dan mengawal gimbal menggunakan kayu bedik.



Rajah 5-6. Gambar rajah lengkap.

Soalan Lazim

1. Data pada pin analog Arduino tidak berubah apabila kedudukan kayu bedik berubah.

2. Nilai butang kayu bedik mengambil nilai rawak atau tidak berubah, arusnya negatif

    Periksa sama ada kayu bedik disambungkan dengan betul ke papan Arduino.

    Tarik pin butang ke kuasa melalui perintang 4.7 kOhm.

Hari ini saya memutuskan untuk mencuba mengawal servo menggunakan kayu bedik dengan membina litar ringkas berdasarkan Arduino Uno.

Apa yang kita perlukan

  1. Menyambung wayar;

Kod sumber

#termasuk
int kegembiraanX=0;
int angl=0;
Servo myservo;
persediaan batal()
{
myservo.attach(9);
pinMode(joyX,INPUT);
Serial.begin(9600);
}
gelung kosong()
{
int val = (analogRead(joyX)/64)-8;
jika (val > 0) (
angl=angl+abs(val);
}
lain (
jika (val< 0) {
angl=angl-abs(val);)
}
jika (engl< 0) angl = 0;
jika (angl > 180) angl = 180;
Serial.print("Kuasa: ");
Serial.println(val);
Serial.print("Sudut: ");
Serial.println(angl);
myservo.write(angl);
int spd = 500;
jika (val != 0) (
spd = 600/abs(val);
}
Serial.print("Kelajuan: ");
Serial.println(spd);
Serial.println("----------");
kelewatan(spd);
}

Bagaimana ini berfungsi

Mengawal servo adalah mudah (menggunakan perpustakaan). Kami hanya memanggil fungsi tulis dan sudut putaran dalam darjah. Tetapi kami akan menukar nilai sudut itu sendiri secara dinamik menggunakan kayu bedik.

Gelung membaca nilai daripada input analog (berbeza dari 0 hingga 1023 bergantung pada kedudukan kayu bedik), saya membahagikan nilai ini untuk mengurangkan langkah sebanyak 64 dan menolak 8 kepada purata. Sekarang kita akan mempunyai nilai antara 7 dan -8. Kemudian saya menukar pembolehubah yang menyimpan sudut putaran kepada nilai ini. Saya juga menukar kelewatan bergantung pada nilai ini. Lebih besar sisihan, lebih sedikit kelewatan (putaran berlaku lebih cepat).

  1. Dari Arduino kami mengambil +5 V ke satu sisi papan (wayar merah);
  2. Kawat hitam pergi dari GND ke bahagian lain papan;
  3. Pin isyarat - kesembilan, wayar hijau, pergi ke servomotor (kabel kuning);
  4. Juga, wayar biru dari kayu bedik (pin S-X) dibekalkan kepada input analog a0;
  5. Dari kayu bedik VCC sisi X, wayar merah pergi ke +5 V papan;
  6. Dari kayu bedik GND sebelah X terdapat wayar putih menuju ke umum GND papan;
  7. Nah, dan, dengan itu, wayar GND putih Bradboard ke dalam kabel hitam servomotor;
  8. Wayar jingga +5 V papan ke dalam kabel merah motor servo;

Apa yang berlaku

Arahan

Joystick ialah peranti yang mudah dan mudah digunakan untuk menghantar maklumat. Terdapat jenis kayu bedik mengikut bilangan darjah kebebasan, prinsip bacaan bacaan dan teknologi yang digunakan bilangan yang besar. Kayu bedik paling kerap digunakan untuk mengawal pergerakan mana-mana mekanisme, model terkawal atau robot. Kayu bedik analog yang akan kita lihat hari ini ialah pemegang yang dipasang pada sambungan bola dengan dua paksi yang saling berserenjang. Apabila pemegang dicondongkan, paksi memutarkan sesentuh alih potensiometer, kerana voltan pada outputnya berubah. Kayu bedik analog juga mempunyai butang kebijaksanaan, yang diaktifkan oleh tekanan menegak pada pemegang.

Mari sambung kayu bedik mengikut rajah di bawah. Kami menyambungkan output analog X dan Y kayu bedik kepada input analog A1 dan A2 Arduino, output butang SW ke input digital 8. Kayu bedik dikuasakan oleh voltan +5 V.

Untuk melihat dengan jelas cara kayu bedik berfungsi, mari tulis lakaran berikut. Mari kita isytiharkan pin dan tetapkan mod pengendaliannya. Sila ambil perhatian bahawa dalam prosedur persediaan() kami membekalkan switchPin sebagai input tahap tinggi. Dengan ini kami mendayakan perintang tarik terbina dalam pada port ini. Jika anda tidak menghidupkannya, maka apabila butang kayu bedik tidak ditekan, port Arduino ke-8 akan tergantung di udara dan menerima gangguan. Ini akan membawa kepada positif palsu yang tidak diingini dan huru-hara.

Dalam prosedur gelung(), kami sentiasa meninjau keadaan butang dan memaparkannya menggunakan LED pada output 13. Disebabkan fakta bahawa input switchPin ditarik ke kuasa, LED sentiasa dihidupkan dan padam apabila butang ditekan, dan bukan sebaliknya.

Seterusnya, kita membaca bacaan dua potensiometer kayu bedik - keluaran paksi X dan Y Arduino mempunyai ADC 10-bit, jadi nilai yang dibaca dari kayu bedik terletak dalam julat dari 0 hingga 1023. Dalam. kedudukan tengah kayu bedik, seperti yang dapat dilihat dalam ilustrasi, nilai diambil di rantau 500 adalah kira-kira pertengahan julat.

Biasanya, kayu bedik digunakan untuk mengawal motor elektrik. Tetapi mengapa tidak menggunakannya, sebagai contoh, untuk mengawal kecerahan LED? Mari sambung seperti yang diberikan Skim RGB LED (atau tiga LED biasa) ke port digital 9, 10 dan 11 Arduino, tidak lupa, tentu saja, perintang.

Kami akan menukar kecerahan warna yang sepadan apabila menukar kedudukan kayu bedik di sepanjang paksi, seperti yang ditunjukkan dalam rajah. Disebabkan fakta bahawa kayu bedik mungkin tidak dipusatkan dengan tepat oleh pengilang dan mempunyai skala tengah bukan pada 512, tetapi dari 490 hingga 525, LED mungkin bercahaya sedikit walaupun apabila kayu bedik berada dalam kedudukan neutral. Jika anda mahu ia dimatikan sepenuhnya, kemudian buat pelarasan yang sesuai pada program.

Berdasarkan rajah di atas, mari kita tulis lakaran untuk mengawal kecerahan Arduino LED RGB menggunakan kayu bedik.

Pertama, mari kita isytiharkan korespondensi pin dan dua pembolehubah - ledOn dan prevSw - untuk bekerja dengan butang. Dalam prosedur persediaan(), tetapkan fungsi pada pin dan sambungkan perintang tarik ke atas pada pin butang dengan arahan digitalWrite(swPin, HIGH).

Dalam gelung gelung(), kami menentukan sama ada butang kayu bedik ditekan. Apabila anda menekan butang, kami menukar mod pengendalian antara mod "lampu suluh" dan mod "muzik berwarna".

Dalam mod freeMode(), kami mengawal kecerahan LED dengan mencondongkan kayu bedik ke arah yang berbeza: semakin kuat kecondongan di sepanjang paksi, semakin terang warna yang sepadan bersinar. Selain itu, transformasi nilai diambil alih oleh fungsi peta(nilai, dariBawah, dariAtas, keBawah, keAtas). Fungsi map() memindahkan nilai yang diukur (dari Bawah, dari Atas) di sepanjang paksi kayu bedik ke julat kecerahan yang dikehendaki (dari Bawah, ke Atas). Anda boleh melakukan perkara yang sama menggunakan operasi aritmetik biasa, tetapi tatatanda ini jauh lebih pendek.

Dalam discoMode(), tiga warna pudar masuk dan keluar secara bergantian. Untuk dapat keluar dari gelung apabila butang ditekan, setiap lelaran kami menyemak sama ada butang itu ditekan.

Terdapat modul kayu bedik analog untuk papan Arduino. Sebagai peraturan, mereka mempunyai paksi X, Y dan butang - paksi Z Kayu bedik membolehkan anda memantau tahap sisihan dari titik sifar dengan lebih lancar dan tepat. Dan sebagai tambahan kepada lebih mudah daripada butang, ini membolehkan anda melaksanakan antara muka yang lebih maju. Sebagai contoh, apabila menukar nilai dalam menu, anda boleh menulis program sedemikian rupa sehingga lebih banyak paksi kayu bedik dipesongkan, lebih cepat nilai pembolehubah berubah. Sebagai contoh, kita perlu menukar nilai daripada 0 hingga 2000 dalam langkah 1. Bayangkan berapa kali anda perlu menekan butang atau menulis algoritma khas, katakan, jika penekanan berlangsung selama lebih daripada 3 saat, tambah tukar langkah demi 10 atau 100. Dan apabila menggunakan kayu bedik, ini boleh dilakukan dengan lebih mudah untuk dilaksanakan.

Harga purata untuk modul sedemikian turun naik sekitar $1-2 setiap modul (dengan penghantaran percuma ke Rusia). Cari modul di kedai AliExpress

Modul itu sendiri kelihatan seperti ini:

Jangan takut dengan bilangan pin, ini dilakukan untuk fleksibiliti dan kemudahan sambungan. Pin Vcc dan GND antara ketiga-tiga kumpulan pin disambungkan. Itu. Untuk menyambung anda memerlukan 5 wayar: paksi X, paksi Y, butang Z, kuasa V cc dan GND biasa. Kayu bedik ialah modul pasif dan tidak menggunakan sebarang kuasa daripada papan Arduino. Bekalan V cc hanya diperlukan untuk perintang tarik naik. Terdapat modul tanpa perintang tarik naik, dalam hal ini perlu untuk menarik pin sambungan butang ke +V cc melalui perintang 1-10 kOhm.

Gambar rajah sambungan ke Arduino:

Dalam program ini, bekerja dengan kayu bedik juga sangat mudah:

#define axis_X 0 // X axis disambungkan ke Analog 0 #define axis_Y 1 // Y axis disambungkan ke Analog 1 #define axis_Z 2 // Z axis (butang joystick) disambungkan ke Digital 2 int value_X, value_Y, value_Z = 0; // Pembolehubah untuk menyimpan nilai paksi void setup() ( pinMode(axis_Z, INPUT); // Tetapkan sebagai input Serial.begin(9600); ) void loop() ( value_X = analogRead(axis_X); // Baca nilai paksi analog X Serial.print("X:"); print(" | Y:" ); Serial.print(value_Y, DEC); // Paparkan nilai dalam Serial Monitor value_Z = digitalRead(axis_Z); 1; // Terbalikkan nilai Serial.print(" | Z: ");

Seperti yang anda lihat di atas, pada mulanya kami menentukan pin input untuk paksi (takrifkan), dan kemudian dalam gelung utama kami membaca nilai dari pin dan mengeluarkannya ke Monitor Bersiri. Dan kita lihat gambar berikut:

Seperti yang anda lihat, semuanya agak mudah. Dan akhirnya, kami akan menulis program kecil, yang tujuannya adalah untuk menukar nilai pembolehubah, bergantung pada sisihan kayu bedik di sepanjang paksi Y dari titik sifar. Dan apabila anda menekan butang kayu bedik, pembolehubah akan ditetapkan semula.

#define axis_Y 1 // Y paksi disambungkan ke Analog 1 #define axis_Z 2 // Z axis (butang joystick) disambungkan ke Digital 2 int value, value_Y, value_Z = 0; // Pembolehubah untuk menyimpan nilai paksi void setup() ( pinMode(axis_Z, INPUT); // Tetapkan sebagai input Serial.begin(9600); ) void loop() ( value_Y = analogRead(axis_Y); // Baca nilai paksi analog Y jika(nilai_Y >= 0 && nilai_Y< 100) value = value - 10; if(value_Y >100 && nilai_Y< 300) value = value - 5; if(value_Y >300 && nilai_Y< 520) value = value - 1; if(value_Y >535 && nilai_Y< 700) value = value + 1; if(value_Y >700 && nilai_Y< 900) value = value + 5; if(value_Y >900) nilai = nilai + 10;