Daftar Isi:

Mengubah Roomba Anda Menjadi Mars Rover: 5 Langkah
Mengubah Roomba Anda Menjadi Mars Rover: 5 Langkah

Video: Mengubah Roomba Anda Menjadi Mars Rover: 5 Langkah

Video: Mengubah Roomba Anda Menjadi Mars Rover: 5 Langkah
Video: [HINDI ]How To Make Mars Rover Step By Step [PART-3] 2024, November
Anonim
Mengubah Roomba Anda Menjadi Mars Rover
Mengubah Roomba Anda Menjadi Mars Rover

Langkah 1: Kumpulkan Bahan Anda

Untuk menyelesaikan proyek ini, Anda perlu mengumpulkan bahan-bahan berikut:

1 Robot Roomba

1 Kit Raspberry Pi

1 Kamera Video

Akses ke MATLAB

Langkah 2: Unduh Toolbox Roomba untuk MATLAB

Unduh Kotak Alat Roomba untuk MATLAB
Unduh Kotak Alat Roomba untuk MATLAB
Unduh Kotak Alat Roomba untuk MATLAB
Unduh Kotak Alat Roomba untuk MATLAB

Jalankan kode berikut untuk menginstal kotak alat yang diperlukan untuk menyelesaikan proyek ini.

fungsi roombaInstal

kl;

% daftar file yang akan diinstal

file = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% lokasi untuk menginstal dari

opsi = weboptions('NamaFileSertifikat', ''); % katakan untuk mengabaikan persyaratan sertifikat

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Instal/Perbarui Roomba';

% tujuan tampilan dan dapatkan konfirmasi

cepat = {

'Program ini akan mengunduh file EF 230 Roomba ini:'

''

strjoin(file, ' ')

''

'ke folder ini:'

''

CD

''

'Apakah Anda ingin melanjutkan? '

};

berbunyi;

yn = questdlg(prompt, …

dlgJudul,…

'Ya', 'Tidak', 'Ya');

jika ~strcmp(yn, 'Ya'), kembalikan; akhir

% dapatkan daftar file yang ada

existing_files = files(cellfun(@exist, files) > 0);

jika ~kosong(file_yang ada)

% pastikan tidak apa-apa untuk menggantinya

prompt = {'Anda sedang mengganti file ini: '

''

strjoin(file_yang ada, ' ')

''

'Oke untuk menggantikannya?'

};

berbunyi;

yn = questdlg(prompt, …

dlgJudul,…

'Ya', 'Tidak', 'Ya');

jika ~strcmp(yn, 'Ya'), kembalikan; akhir

akhir

% unduh file

cnt = 0;

untuk i=1:panjang(berkas)

f=file{i};

disp(['Mengunduh ' f]);

mencoba

url = [server f];

websave(f, url, opsi); % opsi tambahan untuk menghindari kesalahan keamanan

cnt = cnt + 1;

menangkap

disp(['Kesalahan mengunduh ' f]);

dummy = [f '.html'];

jika ada(dummy, 'file')==2

hapus (bodoh)

akhir

akhir

akhir

jika cnt == panjang (file)

msg = 'Instalasi Berhasil';

tunggu(kotak pesan(pesan, dlgTitle));

lain

msg = 'Kesalahan Instalasi - lihat jendela perintah untuk detailnya';

tunggu(errordlg(pesan, dlgTitle));

akhir

akhir %roombaInstal

Langkah 3: Hubungkan ke Roomba Anda

Sekarang saatnya untuk terhubung ke Roomba Anda menggunakan WiFi. Menggunakan 2 jari, tekan tombol Dock dan Spot secara bersamaan untuk menghidupkan atau mengatur ulang Roomba Anda. Selanjutnya, Jalankan kode r=roomba(# dari Roomba Anda) di jendela perintah MATLAB untuk terhubung ke robot Anda. Setelah Anda menjalankan perintah ini, Roomba Anda harus siap digunakan.

Langkah 4: Pilih Bagaimana Anda Ingin Mengontrol Roomba Anda

Pilih Bagaimana Anda Ingin Mengontrol Roomba Anda
Pilih Bagaimana Anda Ingin Mengontrol Roomba Anda
Pilih Bagaimana Anda Ingin Mengontrol Roomba Anda
Pilih Bagaimana Anda Ingin Mengontrol Roomba Anda

Ada dua cara untuk mengontrol Roomba Anda: secara mandiri atau menggunakan smartphone sebagai pengontrol.

Jika Anda memilih untuk mengemudikan Roomba secara mandiri, Anda harus menggunakan tiga sensor bawaan: sensor tebing, sensor benturan, dan sensor cahaya.

Untuk menggunakan ponsel cerdas, Anda harus terlebih dahulu menghubungkan ponsel cerdas Anda ke komputer dengan mengikuti langkah-langkah di bawah ini.

CATATAN: Komputer dan ponsel cerdas Anda harus berada di jaringan WiFi yang sama agar dapat terhubung dengan benar!

1. Unduh aplikasi MATLAB dari app store di perangkat Anda.

2. Ketik "connector on" ke jendela perintah Anda dan atur kata sandi yang perlu dimasukkan ke kedua perangkat.

3. Setelah melakukannya, MATLAB akan memberikan alamat IP komputer Anda. Anda harus masuk ke halaman pengaturan di aplikasi MATLAB pada ponsel cerdas Anda dan menambahkan komputer menggunakan alamat IP yang diberikan dan kata sandi yang Anda masukkan sebelumnya.

4. Di jendela perintah di komputer Anda, ketik kode m=mobiledev dan ini akan menginisialisasi ponsel cerdas Anda sebagai pengontrol untuk Roomba Anda.

5. Komputer dan ponsel cerdas Anda seharusnya sudah siap digunakan sekarang.

Langkah 5: Kendarai Roomba Anda

Sekarang Anda memiliki semua alat yang diperlukan untuk membuat Mars Rover Anda, Anda siap untuk membuat kode Anda sendiri. Kami telah melampirkan contoh kode di bawah ini untuk mengemudi otonom dan mengemudi yang dikendalikan smartphone.

Mengemudi Otonom

fungsi Jelajahi_modifikasi(r)

%argumen masukan: 1 objek roomba, r

%argumen keluaran: tidak ada

%keterangan:

%fungsi menggunakan loop while tak terbatas untuk memungkinkan otonomi

%eksplorasi lingkungan bot.

%

%funciton juga memberikan instruksi kepada roomba tentang apa yang harus dilakukan di

%situasi berikut: Roda kehilangan kontak dengan tanah, dan

%objek terdeteksi di depan atau di kedua sisi bot, dan a

% penurunan tiba-tiba terdeteksi di depan atau di kedua sisi bot.

%

%instruksi tipikal termasuk perintah gerakan yang dimaksudkan untuk memaksimalkan

%eksplorasi atau hindari bahaya yang terdeteksi dan perintah untuk berkomunikasi

%informasi mengenai penemuan bot (gambar), posisi (grafik), %dan status (peringatan terdampar) dengan pengguna melalui matlab dan/atau email. Beberapa

%perintah suara ditambahkan untuk kesenangan.

%setup kemampuan email

mail = '[email protected]';

kata sandi = 'EF230Roomba';

setpref('Internet', 'SMTP_Server', 'smtp.gmail.com');

setpref('Internet', 'E_mail', surat);

setpref('Internet', 'SMTP_Username', email);

setpref('Internet', 'SMTP_Password', kata sandi);

props = java.lang. System.getProperties;

props.setProperty('mail.smtp.starttls.enable', 'true');

props.setProperty('mail.smtp.auth', 'benar');

props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');

props.setProperty('mail.smtp.socketFactory.port', '465');

% r=ruangan(19)

r.beep('G2^^, G2^^, G2^^, G2^^, A2^^, A2^^, G1^^, E1^^, C2^^, C2^^, C1^^, C1 ^^, D1^^, C1^^, D2^^, E4^^, G2^^, G2^^, G2^^, G2^^, A2^^, A2^^, G1^^, E1^^, C2^^, C2^^, C2^^, E1^^, E1^^, E1^^, D1^^, C4^^');

v =.1;

mencerminkan_datum=2700; %set nilai referensi sensor tebing

lightBumper_datum = 200; %set nilai referensi sensor Bumper cahaya

pos=[0, 0]; %variabel untuk penyimpanan posisi dengan datum diinisialisasi

sudut=0; %set sudut referensi

jaring = 0; % perpindahan sudut bersih

saya=2; %iterator untuk menambahkan baris ke variabel penyimpanan posisi

jarak = 0;

r.setDriveVelocity(v, v); %mulai roomba bergerak maju

sementara benar

Tebing = r.getCliffSensors;

Bump = r.getBumper;

Cahaya = r.getLightBumpers;

RandAngle = randi([20, 60], 1); % menghasilkan 1 sudut acak antara 20 dan 60 derajat. Digunakan untuk mencegah bot terjebak dalam satu lingkaran

%Apa yang harus dilakukan jika satu atau lebih roda kehilangan kontak dengan tanah:

%hentikan gerakan, kirim email peringatan dengan gambar sekitar, %dan tanyakan pengguna apakah akan melanjutkan atau menunggu bantuan

if Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

r.beep('F#1^^, C1^^, F#1^^, C1^^, F#1^^, C1^^, F#1^^, C1^^, F#1^^, C1^^, F#1^^, C1^^, F#1^^, C1^^, F#1^^, C1^^')

img = r.getGambar;

imwrite(img, 'macet.png');

%--------------------------

imfile='macet.png';

posisi=savepos(pos);

%---------------------------

sendmail(mail, 'HELP!', 'Saya terdampar di tebing!', {imfile, position})

list = {'Lanjutkan', 'Berhenti'};

idx = menu('Apa yang harus saya lakukan?', daftar);

jika idx == 2

merusak

akhir

%Apa yang harus dilakukan jika objek terdeteksi di depan bot:

%berhenti, mundur, ambil gambar, beri tahu pengguna tentang penemuan

%melalui email, putar 90 derajat, dan terus menjelajah

elseif Light.leftCenter > lightBumper_datum || Light.rightCenter > lightBumper_datum || Bump.depan == 1

r.berhenti;

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

r.moveDistance(-.125);

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

r.beep('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')

img = r.getGambar;

imwrite(img, 'FrontBump.png')

%--------------------------

imfile='FrontBump.png';

posisi=savepos(pos);

%---------------------------

sendmail(mail, 'Alert!', 'Saya menemukan sesuatu!', {imfile, position})

sudut = 90;

netangle=jejaring+sudut;

r.turnAngle(sudut);

r.setDriveVelocity(v, v);

%Apa yang harus dilakukan jika objek terdeteksi di sebelah kiri bot:

%berhenti, putar ke arah objek, mundur, ambil gambar, waspada

%pengguna penemuan melalui email, putar 90 derajat dan terus menjelajah

elseif Light.leftFront > lightBumper_datum || Light.left > lightBumper_datum || Bump.kiri == 1

r.berhenti;

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

sudut = 30;

netangle=jejaring+sudut;

r.turnAngle(sudut);

r.moveDistance(-.125);

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

r.beep('A4^, A4^, G1^, E1^, C3.5^, C2^^, C1^, C1^, C2^, D2^, D2^, E8^')

img = r.getGambar;

imwrite(img, 'LeftBump.png')

%--------------------------

imfile='LeftBump.png';

posisi=savepos(pos);

%---------------------------

sendmail(mail, 'Alert!', 'Saya menemukan sesuatu!', {imfile, position})

sudut=-90;

netangle=jejaring+sudut;

r.turnAngle(sudut);

r.setDriveVelocity(v, v);

%Apa yang harus dilakukan jika objek terdeteksi di sebelah kanan bot:

%berhenti, putar ke arah objek, mundur, ambil gambar, waspada

%pengguna penemuan melalui email, putar 90 derajat dan terus menjelajah

elseif Light.rightFront > lightBumper_datum || Light.right > lightBumper_datum || Benjolan.kanan == 1

r.berhenti;

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

sudut=-30;

netangle=jejaring+sudut;

r.turnAngle(sudut);

r.moveDistance(-.125);

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

jeda(1.5);

r.bip('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getGambar;

imwrite(img, 'RightBump.png')

%--------------------------

imfile='RightBump.png';

posisi=savepos(pos);

%---------------------------

sendmail(mail, 'Alert!', 'Saya menemukan sesuatu!', {imfile, position});

sudut = 90;

netangle=jejaring+sudut;

r.turnAngle(sudut);

r.setDriveVelocity(v, v);

%Apa yang harus dilakukan jika tebing terdeteksi di sebelah kiri bot:

%berhenti, mundur, belok kanan, lanjutkan penjelajahan

elseif Tebing.kiri < reflect_datum || Tebing.kiriDepan < reflect_datum

r.berhenti;

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

r.moveDistance(-.125);

dist = r.getJarak;

pos(i, 1)= pos(i-1, 1) + dist * sind(jejaring); %dapatkan koordinat x

pos(i, 2)= pos(i-1, 2) + dist * cosd(jaring); %dapatkan koordinat y

saya=i+1;

sudut=-RandAngle;

netangle=jejaring+sudut;

r.turnAngle(sudut);

r.setDriveVelocity(v, v);

%Apa yang harus dilakukan jika tebing terdeteksi di sebelah kanan bot:

%berhenti, mundur, belok kiri, lanjutkan penjelajahan

elseif Tebing.kanan < reflect_datum || Tebing.kananFront < reflect_datum

r.berhenti;

dist = r.getJarak;

pos(i, 1)= dist * sind(sudut); %dapatkan koordinat x

pos(i, 2)= dist * cosd(sudut); %dapatkan koordinat y

saya=i+1;

r.moveDistance(-.125);

sudut=RandAngle;

netangle=jejaring+sudut;

r.turnAngle(sudut);

r.setDriveVelocity(v, v);

akhir

akhir

Pengontrol Ponsel Cerdas

Opsi = {'Otonomis', 'Kontrol Manual'}

Prompt = menu('Bagaimana Anda ingin mengontrol penjelajah?', Opsi)

m = mobiledev

r = kamarba(19)

jika Prompt == 1

Penjelajah)

lain

sementara benar

jeda(.5)

PhoneData=m. Orientasi;

Azi=DataTelepon(1);

Pitch=DataTelepon(2);

Sisi=DataTelepon(3);

jika Sisi>130 || Samping<-130 %jika ponsel dibalik menghadap ke bawah hentikan roomba dan keluar dari loop

r.stop

r.bip('C, C, C, C')

merusak

elseif Sisi>25 && Sisi<40 %jika ponsel diputar ke samping antara 25 dan 40 derajat belok kiri 5 derajat

r.turnAngle(-5);

elseif Sisi>40 %jika ponsel diputar ke samping lebih dari 40 derajat belok kiri 45 derajat

r.turnAngle (-45)

elseif Sisi-40 %jika ponsel diputar menyamping antara -25 dan -40 derajat belok kanan 5 derajat

r.turnAngle(5);

elseif Sisi<-40 %jika ponsel diputar ke samping kurang dari -40 derajat belok kiri 45 derajat

r.turnAngle(45)

akhir

%Jika ponsel dipegang dekat verticle ambil gambar dan plot itu

jika Pitch<-60 && gambar<=9

r.bip

img=r.getGambar;

subplot(3, 3, gambar)

tampilkan (img)

akhir

%bergerak maju dan mundur berdasarkan orientasi depan dan belakang

jika Pitch>15 && Pitch<35 %jika pitch antara 15 dan 35 derajat bergerak maju jarak pendek

%dapatkan data bumper ringan sebelum pindah

litBump=r.getLightBumpers;

jika litBump.leftFront>500 || litBump.leftCenter>500 || litBump.rightCenter>500 || litBump.rightFront>500 %jika ada sesuatu di depan roomba dan akan mengenai jika bergerak maju membuat kebisingan dan menampilkan pesan

r.beep('C^^, F#^, C^^, F#^')

lain %bergerak

r.moveDistance(.03);

%Dapatkan data bumper setelah pindah

Bump=r.getBumper;

jika Bump.right==1 || Bump.kiri==1 || Bump.depan = 1

r.bip('A,C,E')

r.moveDistance(-.01)

akhir

%mendapatkan data sensor tebing

Tebing=r.getCliffSensors;

jika Tebing.kiri>1500 || Tebing.kiriDepan>1500 || Tebing.kananDepan>1500 || Tebing.kanan>1500 %jika sesuatu memicu sensor tebing memperlakukannya sebagai lava dan kembali ke atas

r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')

r.moveDistance(-.031)

akhir

akhir

elseif Pitch>35 %jika pitch lebih besar 35 derajat bergerak maju dengan jarak yang lebih jauh

%dapatkan data bumper ringan sebelum pindah

litBump=r.getLightBumpers;

jika litBump.leftFront>15 || litBump.leftCenter>15 || litBump.rightCenter>15 || litBump.rightFront>15 %jika ada sesuatu di depan roomba dan akan mengenai jika bergerak maju membuat kebisingan dan menampilkan pesan

r.beep('C^^, F#^, C^^, F#^')

lain %bergerak

r.moveDistance(.3)

%Dapatkan data bumper setelah pindah

Bump=r.getBumper;

jika Bump.right==1 || Bump.kiri==1 || Bump.front==1 %jika Anda menekan sesuatu membuat suara, menampilkan pesan, dan membuat cadangan

r.bip('A, C, E')

r.moveDistance(-.01)

akhir

%dapatkan data sensor tebing setelah pindah

Tebing=r.getCliffSensors;

jika Tebing.kiri>1500 || Tebing.kiriDepan>1500 || Tebing.kananDepan>1500 || Tebing.kanan>1500 %jika sesuatu memicu sensor tebing memperlakukannya sebagai lava dan kembali ke atas

r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')

r.moveDistance(-.31)

akhir

akhir

elseif Pitch-35 %jika pitch antara -15 dan -35 deg mundur jarak pendek

r.moveDistance(-.03);

%dapatkan data sensor tebing setelah pindah

Tebing=r.getCliffSensors;

jika Tebing.kiri>1500 || Tebing.kiriDepan>1500 || Tebing.kananDepan>1500 || Tebing.kanan>1500 %jika sesuatu memicu sensor tebing memperlakukannya sebagai lava dan kembali ke atas

r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')

r.moveDistance(.04)

akhir

elseif Pitch-60 %jika pitch antara -35 dan -60 deg mundur lebih jauh

r.moveDistance(-.3)

%dapatkan data sensor tebing setelah pindah

Tebing=r.getCliffSensors;

jika Tebing.kiri>1500 || Tebing.kiriDepan>1500 || Tebing.kananDepan>1500 || Tebing.kanan>1500 %jika sesuatu memicu sensor tebing memperlakukannya sebagai lava dan kembali ke atas

r.beep('C^^, C, C^^, C, C^^, C, C^^, C, C^^, C, C^^, C')

r.moveDistance(.31)

akhir

akhir

akhir

akhir

Direkomendasikan: