Arduino - Menggambar melalui Web Menggunakan Step Motor Controller
Komponen dan persediaan
Arduino UNO
×
1
PHPoC WiFi Shield 2 untuk Arduino
×
1
Pengendali Motor Stepper PHPoC
×
2
Makeblock XY Plotter
×
1
Tentang proyek ini
Demonstrasi
Jika Anda baru mengenal Arduino, Anda dapat memulai dengan :
Tutorial Arduino untuk pemula.
Semua tentang motor untuk Arduino
Cara Kerjanya
Ketika jari menyentuh area gambar di halaman web, koordinat titik sentuh XY dikirim ke Arduino. Setelah menskalakan koordinat, Arduino akan menggerakkan motor dua langkah untuk menemukan pena ke koordinat itu. Selama periode bergerak, Arduino terus mengirimkan lintasan pena ke aplikasi web, aplikasi web menggambar lintasan di kanvas.
Kode Sumber
Kode sumber mencakup dua bagian:kode Arduino dan kode Antarmuka Pengguna Web.
Kode Arduino
Ini adalah kode arduino, yang berjalan dalam infinite loop ke:
Menerima perintah dari halaman web dan melakukan tugas sesuai perintah.
CMD_MOVE:pindahkan pena ke posisi tertentu dengan mengontrol motor dua langkah
CMD_PEN_UP:angkat pena dengan mengubah sudut motor servo
CMD_PEN_DOWN:turunkan pena dengan mengubah sudut motor servo
Terus baca posisi pena saat ini dan kirim ke halaman web
Antarmuka Pengguna Web
Lihat kode di bagian Kode
Menyediakan antarmuka pengguna
Menangani event pengguna dan mengirim perintah dengan koordinat ke Arduino
Menerima lintasan dari Arduino dan menggambarnya di halaman web
remote_draw.php adalah file yang berisi Antarmuka Pengguna Web. Itu perlu disimpan di PHPoC [WiFi] Shield. Untuk mengunggah file ke PHPoC [WiFi] Shield, lakukan langkah-langkah berikut:
Copy kode di bawah ini dan simpan ke dalam file remote_draw.php.
Instal PHPoC Debugger
Hubungkan PHPoC ke PHPoC [WiFi] Shield melalui kabel micro-USB sesuai dengan instruksi ini. Perhatikan bahwa Arduino harus diberi daya.
Unggah file remote_draw.php ke PHPoC [WiFi] Shield sesuai dengan instruksi ini
Cara
Informasi jaringan konfigurasi untuk pelindung PHPoC atau pelindung WiFi PHPoC
Instal Perpustakaan PHPoC
Instal Perpustakaan Ekspansi PHPoC
Kompilasi dan unggah kode ke Arduino
Unggah antarmuka pengguna web ke pelindung PHPoC [WiFi]
Buka Serial Monitor dan salin alamat IP PHPoC Shield
Akses Antarmuka Pengguna Web melalui Browser Web:http://ip_address_of_shield /remote_draw.php
Menggambar melalui Web
Untuk membeli komponen elektronik, Anda dapat memesannya dari utsource.net
Kit Pemula Arduino Terbaik untuk Pemula
Lihat Kit Arduino Terbaik untuk Pemula
Referensi Fungsi
Serial.begin()
Serial.println()
tunda()
milis()
untuk loop
perulangan sementara
jika lain
loop()
penyiapan()
String.toInt()
String.substring()
String.indexOf()
String.remove()
String.equals()
Kode
Kode Arduino
Antarmuka Pengguna Web
Kode ArduinoArduino
#include #include #include #define MAX_X 55550 // unit adalah langkah#define MAX_Y 68780 // unit adalah langkah#define TOUCH_OFFSET 5000 // unit adalah langkah#menentukan PEN_STATE_UP 0#menentukan PEN_STATE_DOWN 1#menentukan CMD_PEN_UP 0#menentukan CMD_PEN_DOWN 1#menentukan CMD_MOVE 2#menentukan STEP_MODE 32#menentukan SPEED_X_COEF ((panjang)40 * LANGKAH_MOVE)#menentukan SPEED_XED ((panjang)1500 * STEP_MODE)#menentukan SPEED_Y_MAX ((panjang)1500 * STEP_MODE)#menentukan ACCEL_X_MAX ((panjang)6000 * STEP_MODE)#menentukan ACCEL_Y_MAX ((panjang)6000 * STEP_MODE)#menentukan STEP_STATE_STOP 1#STATE_STOP 0_#STATE_STOP define RESOLUTION 500#define MIN_UPDATE_INTERVAL 100 // dalam milidetikPhpocServer server(80);ExpansionStepper stepX(14);ExpansionStepper stepY(13);Servo servo;long preX =0;long preY =0;byte penState =PEN_STATE_UP;bool isUnlockedX =false;bool isUnlockedY =false;int forwardDirX =-1; /* arah plotter XY ketika motor X bergerak maju, tergantung pada instalasi, Ini harus diuji untuk menentukan nilai*/int forwardDirY =+1; /* arah plotter XY saat motor Y bergerak ke atas, tergantung pada instalasi, Ini harus diuji untuk menentukan nilai*/unsigned long lastUpdateMillis;void penUp() { servo.write(110); penState =PEN_STATE_UP;}void penDown() { servo.write(180); penState =PEN_STATE_DOWN;}void xyWait() { while(stepX.getState()> 1 || stepY.getState()> 1);}void xyInit() { penUp(); stepX.setMode(STEP_MODE); stepX.setVrefStop(4); stepX.setVrefDrive(15); stepX.setResonance(120, 250); stepX.setSpeed(20000); stepX.setAccel(50.000); stepY.setMode(STEP_MODE); stepY.setVrefStop(4); stepY.setVrefDrive(15); stepY.setResonance(120, 250); stepY.setSpeed (20000); stepY.setAccel(50.000); // pindahkan pena ke (0, 0) stepX.stepGotoSW(0, -forwardDirX); stepY.stepGotoSW(0, -forwardDirY); xyTunggu(); stepX.setPosition(0); stepY.setPosition(0); // batalkan komentar blok ini untuk menjalankan pertama dan ubah nilai pada baris 6, 7 dari file ini dan baris 33 dari index.php sesuai dengan nilai di konsol IDE /* // periksa langkah maksimal stepX.stepGotoSW(1, forwardDirX); stepY.stepGotoSW(1, forwardDirY); xyTunggu(); // ubah nilai ini pada baris 45 dari index.php Serial.print(F("MAX_X:")); Serial.println(stepX.getPosition() * forwardDirX); Serial.print(F("MAX_Y:")); Serial.println(stepY.getPosition() * forwardDirY); */ xyGoto(TOUCH_OFFSET, TOUCH_OFFSET); xyTunggu(); stepX.setEioMode(0, EIO_MODE_LOCK); stepX.setEioMode(1, EIO_MODE_LOCK); stepY.setEioMode(0, EIO_MODE_LOCK); stepY.setEioMode(1, EIO_MODE_LOCK);}void xyGoto(panjang x, panjang y) { if(x (MAX_X - TOUCH_OFFSET)) x =MAX_X - TOUCH_OFFSET; if(y (MAX_Y - TOUCH_OFFSET)) y =MAX_Y - TOUCH_OFFSET; x *=forwardDirX; y *=forwardDirY; int32_t deltaX =x - stepX.getPosition(); int32_t deltaY =y - stepY.getPosition(); deltaX =perut(deltaX); deltaY =perut(deltaY); kecepatan panjangX =SPEED_X_COEF * abs(deltaX); kecepatan panjangY =SPEED_Y_COEF * abs(deltaY); if(speedX> speedY) { if(speedX> SPEED_X_MAX) speedX =SPEED_X_MAX; rasio ganda =deltaY / (ganda)deltaX; speedY =(panjang) (rasio * kecepatanX); } else { if(speedY> SPEED_Y_MAX) speedY =SPEED_Y_MAX; rasio ganda =deltaX / (ganda)deltaY; speedX =(panjang) (rasio * speedY); } accelX panjang; akselerasi panjang; if(kecepatanX MIN_UPDATE_INTERVAL) isUpdate =true; curX panjang =stepX.getPosition(); curY panjang =stepY.getPosition(); deltaX panjang =curX - preX; deltaY panjang =curY - mangsa; jarak jauh =sqrt(pow(deltaX, 2) + pow(deltaY, 2)); if(dist> RESOLUTION) isUpdate =true; if(isUpdate ==false || dist ==0) mengembalikan false; lastUpdateMillis =curMillis; preX =skrX; preY =curY; sendPositionToWeb(); // kirim posisi saat ini untuk ditampilkan di web}void sendPositionToWeb() { char wbuf[20]; panjang x =stepX.getPosition() * forwardDirX; panjang y =stepY.getPosition() * forwardDirY; String data =String(F("[")) + x + String(F(",")) + y + String(F(",")) + penState + String(F("]\n")); data.toCharArray(wbuf, data.length() + 1); server.write(wbuf, data.length());}void setup() { Serial.begin(9600); while(!Serial); Phpoc.begin(PF_LOG_SPI | PF_LOG_NET); server.beginWebSocket("xy_plotter"); Serial.print("Alamat server WebSocket :"); Serial.println(Phpoc.localIP()); Ekspansi.begin(460800); servo.attach(8); /** CATATAN:Untuk menjalankan pertama:* - batalkan komentar pada blok terakhir di xyInit() * - jalankan kode Arduino * - ubah nilai pada baris 6, 7 dari file ini dan baris 33 dari index.php sesuai dengan nilai di IDE menghibur. **/ xyInit(); lastUpdateMillis =milis();}void loop() { // tunggu klien baru:PhpocClient client =server.available(); if(klien) { String data =klien.readLine(); if(data) { //Serial.println(data); byte separatorPos1 =data.indexOf(':'); byte separatorPos2 =data.lastIndexOf(':'); byte cmd =data.substring(0, separatorPos1).toInt(); panjang x =data.substring(separatorPos1 + 1, separatorPos2).toInt(); panjang y =data.substring(pemisahPos2 + 1).toInt(); switch(cmd) { kasus CMD_PEN_DOWN:xyGoto(x, y); //xyTunggu(); while(stepX.getState()> 1 || stepY.getState()> 1) xyCheckUpdateToWeb(); penDown(); merusak; kasus CMD_PEN_UP://xyWait(); while(stepX.getState()> 1 || stepY.getState()> 1) xyCheckUpdateToWeb(); penaUp(); merusak; kasus CMD_MOVE:xyGoto(x, y); merusak; } } } xyCheckUpdateToWeb();}