Robot kecil buatan sendiri. Sumber daya yang berguna untuk membuat robot dengan tangan Anda sendiri Robot keren di mikrokontroler

Selamat siang, warga Khabrovsk yang terkasih.
Sudah cukup lama berlalu sejak terakhir kali saya menulis artikel tentang pengembangan di sini, saatnya untuk memperbaiki masalah ini.
Pada artikel kali ini saya akan membahas tentang bagaimana saya merakit robot kecil pada mikrokontroler STM32F101 untuk menghibur Maine Coon saya, Arthas, tentang masalah apa yang harus saya hadapi dan apa hasilnya.

Latar belakang dan rumusan masalah

Setengah tahun yang lalu saya mendapatkan Maine Coon hitam yang tampan, yang saya beri nama Arthas untuk menghormati pahlawan permainan komputer yang terkenal.

Kucing itu sangat lucu, suka berlari, menyergap, dan bahkan mengambil bola, seperti anjing. Karena saya sudah lama tidak mengumpulkan apa pun, saya memutuskan untuk mengembangkan mainan kecil untuk kucing.
Persyaratan utama untuk itu adalah:

  1. Perlindungan bagian penting struktur dari gigi dan cakar kucing, idealnya badan tertutup seluruhnya (bola)
  2. Persyaratan untuk dimensi perangkat yang kecil mengikuti dari paragraf sebelumnya, karena Diinginkan bahwa itu masih berupa bola kecil, dan bukan bola sepak.
  3. Kemungkinan kontrol dari ponsel/tablet dan komputer desktop- agar tidak menemukan kembali roda dan memastikan kompatibilitasnya perangkat seluler Komunikasi Bluetooth sangat ideal.
  4. Untuk membuatnya lebih menarik, diharapkan memiliki setidaknya beberapa jenis sensor yang memungkinkan di masa depan membuat robot kurang lebih otonom, dan bukan hanya mobil yang dikendalikan radio.
  5. Memiliki beberapa cara untuk mengeluarkan suara untuk menarik perhatian kucing.

Saya akan segera menunjukkannya video pendek Apa yang terjadi adalah catbot diluncurkan dalam mode uji (dikendalikan oleh saya dari komputer):

Catbot diuji tanpa kulit terluar, mengeluarkan suara yang menarik perhatian kucing dan tidak dapat melarikan diri karena... salah satu drive gagal.
(Lebih lanjut tentang ini di akhir artikel)


Catbot sudah dirakit

Beberapa orang mungkin berpikir bahwa kucing tidak bereaksi terlalu aktif terhadap robot tersebut, namun kenyataannya alasannya adalah selama pengujian dia telah merebutnya dari saya ratusan kali, membawanya pergi dan mengunyahnya. Tentu saja, saya mengambil robotnya (belum selesai), jadi kucing itu, melihat robot itu di lantai, memutuskan untuk menunggu beberapa saat untuk memastikan robot itu tidak diambil darinya begitu dia menyerang)

Pengembangan: pemilihan elemen dasar dan persiapan
Bingkai
Setelah memutuskan desain yang diusulkan, saya membeli sepasang bola plastik yang terdiri dari dua bagian - satu dengan diameter 60 mm, yang lain 80 mm, jika yang pertama tidak muat. Dimensi seperti itu sangat membatasi pilihan motor dan sensor (dalam artian, misalnya, sensor ultrasonik dapat dilupakan; sensor tersebut tidak dapat masuk ke dalam bola dan, terlebih lagi, tidak akan berfungsi di ruang tertutup.

Mikrokontroler
Setelah “telinga” digergaji, bola menjadi kandidat ideal untuk peran tubuh. Karena dimensinya yang terbatas, diputuskan untuk merancang seluruh sirkuit menggunakan paket terkecil, yaitu sebagian besar QFN.
STM32F101 dipilih sebagai prosesor pusat, karena ini adalah mikrokontroler berdasarkan inti Cortex M3, dan bukan M0 yang dipreteli, sementara itu dapat beroperasi pada 36 MHz, memiliki flash 64 KB dan RAM 16 KB, dan, sebagian besar yang terpenting, tersedia dalam bodi QFN 6x6 mm
Sensor
Sensor yang dipilih adalah akselerometer tiga sumbu dari ST yang sama, yang mendapat diskon di Terraelectronics, jadi saya mendapatkannya dengan harga sekitar 30 rubel masing-masing.

Akselerometer tersedia dalam paket QFN 3x3 mm dan dapat berkomunikasi melalui bus I2C, yang sangat berguna dalam kondisi dimensi terbatas. Dengan menggunakan akselerometer, dimungkinkan untuk menghitung kemiringan robot sepanjang tiga sumbu, dan juga, mungkin, mencoba memperoleh informasi darinya tentang apakah robot sedang bergerak atau menabrak rintangan (dengan perubahan percepatan). Dan, tentu saja, tentukan momen saat kucing menendangnya untuk mengeluarkan bunyi mencicit - dengan cara ini kucing akan percaya bahwa itu adalah sesuatu yang hidup)

Koneksi
Sebagai alat komunikasi tentunya kami menggunakan modul HC-05 buatan China yang sudah terbukti, murah dan berukuran kecil

Ini adalah satu-satunya modul siap pakai yang disertakan dalam robot.
Sumber suara
Awalnya saya ingin menggunakan speaker berukuran kecil, namun sayangnya yang kecil pun masih cukup besar. Selain itu, mereka mengkonsumsi banyak dan membutuhkan setidaknya transistor dan filter untuk memompanya dengan PWM. Setelah beberapa googling, saya menemukan pager piezo yang menarik ini:

PKLCS1212E4001 dari Murata berharga 48 rubel, memiliki dimensi 11x11 mm (elemen terbesar di papan!) dan merupakan Piezo Sounder standar - perangkat yang menghasilkan suara dengan menekuk membran dengan efek piezoelektrik lebih sedikit arus dibandingkan speaker yang berbunyi bip pada volume yang sama.
Namun, tidak seperti speaker, ia memiliki respons frekuensi yang sangat rumit dan tidak merata, jadi yang terbaik yang dapat dilakukannya adalah mencicit. Dan dia dapat melakukannya paling keras pada frekuensi 4KHz (tetapi ini tidak berarti Anda tidak dapat mencicit pada orang lain!)
berkendara
Elemen terpenting adalah penggerak yang akan menggerakkan robot. Sayangnya, tidak semuanya semulus yang kita inginkan; lebih lanjut tentang ini di akhir artikel. Untuk penggerak, saya memutuskan untuk mengambil servo terkecil yang dapat saya temukan dan mengonversinya untuk rotasi konstan.
Pilihan saya dijelaskan oleh fakta bahwa dengan menggunakan servo saya mendapatkan motor + gearbox + papan kontrol dalam wadah berukuran sekitar 15x20x8 mm. Tidak peduli seberapa keras saya mencoba, saya tidak dapat menemukan gearmotor sebesar ini.
Akibatnya, pilihan jatuh pada servo sub-mikro, dengan harga masing-masing 187 rubel:

Nutrisi
Semua elemen telah dipilih, tinggal memutuskan bagaimana dan dengan apa memberi daya pada sistem. Tentu saja, sumber terkecil dan paling cocok adalah baterai lithium-polimer kecil. Karena drive memerlukan 4.8V, kami akan meningkatkan tegangan menjadi 5V dengan konverter DC-DC berukuran kecil dari MAXIM Semiconductors. MAX8815 adalah sirkuit mikro luar biasa dalam paket 3x3 mm yang memungkinkan Anda menyalurkan hingga 1A ke beban dengan efisiensi 97% (yang, tentu saja, bergantung pada tata letak PCB yang benar, mode pengoperasian, dan pilihan kabel, seperti biasa).
Karena drive mengkonsumsi tidak lebih dari 600 mA bahkan pada waktu beban puncak, ini sudah lebih dari cukup.

Untuk memberi daya pada perangkat elektronik lainnya dan melindunginya dari interferensi yang ditimbulkan oleh motor, setelah konverter boost DC-DC kami akan memasang regulator linier berukuran kecil dari TI, LP2985, dengan output tetap 3,3V.

Sirkuit dan sedikit desain

Pertama, beberapa kata tentang desain robot. Untuk meminimalkan dimensi dan biaya, saya memutuskan untuk menggunakan papan sirkuit tercetak sebagai elemen struktural. Artinya, drive dijepit di antara dua papan sirkuit tercetak, yang diikat dengan sekrup. Setelah dirakit (dan setelah men-debug modifikasi pada papan, yang akan dibahas nanti), semuanya terlihat seperti ini:

Untuk mencegah drive bergerak, saya meletakkan bahan yang bagus di antara papan dan permukaannya - lateks dari expander Torres

Faktanya saya pernah membeli ketapel di China. Tombaknya sendiri sangat nyaman, terbuat dari paduan titanium, tapi karetnya tidak berguna. Di Internet, para ahli ketapel menyarankan untuk segera membuangnya, membeli sendiri expander yang sama, dan memotong tali pengaman penggantinya. Hasilnya melebihi semua ekspektasi saya dan ketapelnya menjadi sangat kuat. Dan karena expander adalah hal yang besar HAI Sebagian besar materi tetap tidak tersentuh dan tergeletak di dalam kotak, menunggu di sayap.
Setelah menggunakan lateks ini sebagai paking antara drive dan papan, drive tersebut terpasang seperti sarung tangan, tanpa bergerak satu milimeter pun.

Oleh karena itu, untuk mengimplementasikan desain seperti itu, diperlukan dua papan, yang semua komponennya terkonsentrasi di sisi luar.
Karena kita tiba-tiba mengalami peningkatan area yang dapat digunakan, kita dapat menempatkannya di papan paling bawah pengisi daya untuk baterai, konektor mini-USB, LED yang menunjukkan pengisian daya, dan sekaligus memindahkan modul BT ke sana agar tidak tertutup baterai dan tidak mengganggu komunikasi.
Dengan demikian, dua PCB dikembangkan, TOP dan BOTTOM. Di bawah adalah apa yang telah saya katakan, dan di atas adalah seluruh "otak" dan, bisa dikatakan, sistem pencernaan robot - mikrokontroler, akselerometer, konverter dan pengatur daya, dan, tentu saja , tweeter piezo.

Diagram papan atas terlihat seperti ini:


Skema daya


Otak

Untuk mencegah USB mengirimkan lima volt ke tempat yang tidak diperlukan, input ON dari konverter U1 dan regulator U2 dihubungkan, ditarik ke catu daya dan output ke pin J1 di tepi papan - menerapkan level GND akan mentransfer input dan output konverter ke keadaan impedansi tinggi, yang pada dasarnya memutus sirkuit dan membiarkan arus USB mengalir ke tempatnya - ke dalam sirkuit pengisian baterai. Diagram koneksi konverter lainnya tipikal, dari lembar data.

Akselerometer U4 terhubung ke bus I2C pengontrol tanpa resistor pull-up - ya, itu diperlukan agar bus dapat berfungsi, tetapi lembar data memastikan bahwa kedua jalur tersebut terhubung ke Vdd_IO melalui resistor pull-up yang tertanam di dalam LIS331DL. Anehnya, tidak ada informasi lebih lanjut tentang mereka; saya tidak pernah mengetahui nilai nominalnya (dan ketika dimatikan, tidak diukur; rupanya, mereka terputus dari bus oleh transistor). Jadi saya harus bergantung begitu saja pada lembar data. Saya harus mengatakan, saya benar dalam hal ini - akselerometer sebenarnya berfungsi dengan baik tanpa resistor tambahan.
Namun, ada pemalsuan besar lainnya yang dikaitkan dengannya, yang dapat Anda baca di bagian “Pengujian dan pemalsuan”.

Selain akselerometer, LED D1 dihubungkan ke pengontrol, dirancang untuk menarik perhatian kucing secara visual dan berfungsi sebagai indikasi, serta pembagi tegangan pada resistor R4 dan R5, yang dihubungkan ke input ADC pengontrol melalui menghaluskan kapasitor C5. Pembagi ini membawa tegangan baterai ke kisaran yang dapat diukur oleh ADC, memberikan indikasi tingkat pengisian daya baterai.
Omong-omong, mini-fak-up dikaitkan dengan resistor ini. Faktanya adalah saya berasumsi bahwa pengontrol saya memiliki tegangan referensi bawaan (sekitar 1,2 volt), seperti pada model lama. Namun ternyata, pada model dalam paket QFN36, tidak ada sumber bawaan, dan input REF di dalam casing dihubung pendek ke tegangan suplai (3,3V), sehingga resistor yang pada 4.2V memberikan 1V ke baterai pada output harus diubah menjadi baterai yang memberikan 3V.

Tweeter LS1, berkat sifat piezonya, dapat dihubungkan langsung ke pin pengontrol - konsumsinya sangat rendah, pada frekuensi resonansi impedansinya beberapa ratus ohm. Satu-satunya masalah potensial adalah ia juga dapat bekerja dalam arah yang berlawanan, yaitu menghasilkan tegangan ketika berubah bentuk (guncangan), yang biasanya dipasang dioda atau resistor pelindung. Namun, menurut hasil percobaan, tegangan selama benturan rata-rata tidak melebihi 1,5V, yang dapat dengan mudah diatasi oleh dioda pelindung keluaran pengontrol, jadi saya mengambil risiko tidak memasang perlindungan tambahan.

Output dari generator PWM bawaan pengontrol disalurkan ke pin J8 dan J9 untuk mengontrol drive. Sebagai tindakan tambahan (dan ternyata tidak berlebihan) untuk mengurangi konsumsi dalam mode tidak aktif, kontak J11 dan J12, yang terhubung dengan GND drive, diputus dari ground sirkuit oleh transistor daya Q1 - suplai tingkat tinggi di gerbang memberi aktuator kekuatan bumi dan memungkinkan arus mengalir melalui bagian dalamnya. Ternyata, bahkan dengan sinyal PWM nol, rangkaian kontrol drive masih menyuplai sejumlah tegangan ke drive tersebut dan konsumsinya meningkat sebesar 10 mA dibandingkan dengan drive yang dinonaktifkan sepenuhnya.

Poin penting adalah pilihan antarmuka debugging. Dalam kondisi dimensi yang sangat terbatas, tentunya saya ingin puas dengan jumlah kabel yang minimal. Namun informasi berapa jumlah minimalnya ternyata sangat kontradiktif. Setelah googling dan bereksperimen dengan cermat, saya memilih antarmuka SWD, hanya menampilkan pin SWDIO dan SWCLK. Pemalsuan lain terkait dengan hal ini, dijelaskan di bagian “pengujian dan pemalsuan”. Tapi singkatnya - ya, kedua pin ini cukup untuk debugging dalam banyak kasus.

Papan bawah dirancang cukup sederhana:


Papan bawah

Ini berisi dua sirkuit mikro pengisi daya baterai Li-Pol (Li-Ion) linier yang terhubung secara paralel, LTC4054 dari Teknologi Linear. Ini adalah cara termudah untuk mengisi daya polimer litium sel tunggal dan ion litium yang saya ketahui, jika Anda tidak keberatan dengan efisiensinya yang agak rendah (karena chipnya linier).
Mereka sangat cocok secara paralel, dalam beberapa hal skema Tiongkok Saya melihat sebanyak empat mikruhi serupa secara paralel, memberikan arus muatan yang besar. Secara individual, masing-masing dapat memasok hingga 800 mA, tapi itu hanya jika Anda ingin menggoreng telur dengan mereka. Ketika beban di atas 500 mA dan baterai benar-benar habis, sirkuit mikro mulai menjadi sangat panas sehingga tidak mungkin untuk memegang jari Anda. Karena ia memiliki sirkuit perlindungan suhu bawaan, ini, pada prinsipnya, tidak menakutkan - ia akan secara otomatis menurunkan arus beban ketika memanas hingga 120 derajat. Tapi masih kurang enak, jadi saya lebih suka menaruh dua potong, untung ada tempat. Arus pengisian diatur oleh resistor R4 dan R5, yang saya pilih sehingga sekitar 500 mA untuk dua orang (yaitu, masing-masing 250 mA), di mana mereka tidak terlalu panas.

Selain itu, papan tersebut berisi konektor mini-USB (J2), transistor Q1, yang menarik input ON dari rangkaian daya di papan atas ke ground, ketika koneksi USB dan modul komunikasi Bluetooth.

Saya memesan papan dari Rezonit, dan ternyata harganya cukup murah - saya membayar kurang dari 2000 rubel untuk panel yang terdiri dari enam papan berbeda, yang juga mencakup dua papan dari catbot.
Papan atas dan bawah berukuran 32x26 mm. Setelah perakitan (dan sebelum pemasangan palsu), papan atas terlihat seperti ini:

Dan yang paling bawah seperti ini:

Saatnya untuk menulis firmware uji!

Uji firmware

Saya berencana membuat firmware final berdasarkan FreeRTOS (agar tidak membuang waktu untuk mengimplementasikan multitasking normal, memblokir antrian, dll.), tetapi untuk pengujian saya membuat sketsa firmware kecil yang menginisialisasi semua periferal dan memungkinkan Anda untuk mengontrolnya dengan perintah sederhana dari komputer. Mari kita lakukan inisialisasi:

Pencatatan jam kerja dan GPIO

Kode

void InitRCC() ( RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); eriph_TIM3,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2 C1,AKTIFKAN); ; ) batal InitGPIO() ( GPIO_InitTypeDef GPIO_InitStructure; //LED GPIO_InitStructure.GPIO_Speed ​= GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; _InitStructure.GPIO_Pin = GPIO_Init(GPIO_InitStructure); //Buzzer GPIO_InitStructure.GPIO_Speed ​​​​= GPIO_Speed_50MHz; IO_InitStructure.GPIO_Pin = GPIO_Pin_2;


Semuanya sederhana di sini - kami menerapkan jam ke semua periferal yang kami butuhkan, yaitu ke port I/O, ADC, UART, beberapa pengatur waktu (satu untuk tweeter, yang kedua untuk drive PWM) dan ke I2C . Kemudian kami mengkonfigurasi semua GPIO.
Pencicit

Kode

kekosongan InitBuzzer() ( TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Period = 4; TIM_TimeBaseStructure.TIM_Prescaler = 1800; TIM_TimeBaseStructure.TIM_ClockDivision = 0; M_CounterMode = CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCPolarity_High; _ARRPreloadConfig(TIM2, ENABLE);


Pengaturannya adalah menginisialisasi pengatur waktu, yang outputnya terhubung ke bel. Kami mengkonfigurasi PWM, tetapi sebenarnya kami tidak akan mengubah lebar pulsa, selalu mengaturnya ke 50%. Sebaliknya, kita akan mengubah pembagi, menyebabkan pengatur waktu mengubah frekuensi pulsa menjadi bip dengan nada berbeda.
Karena frekuensi sistem adalah 36 MHz, atur periodenya ke 4 (kita masih tidak membutuhkan banyak debit PWM), dan prescaler ke 1800, dapatkan frekuensi 4 KHz.
berkendara

Kode

batal InitServo() ( TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0xB0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; de = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; ; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);


Kita lakukan sama seperti pada tweeter, namun untuk output PWM sudah kita pertajam dengan parameter yang dibutuhkan oleh drive yaitu frekuensi sekitar 50 Hz dan itu sudah cukup. jumlah besar pelepasan untuk mengontrol kecepatan dengan presisi tinggi. Jadi, kami menyetel prescaler ke 176 dan periode ke 4096, yang menghasilkan sekitar 50 Hz dan 12 bit PWM.
Akselerometer dan Bluetooth

Kode

kekosongan InitAccel() ( I2C_InitTypeDef I2C_InitStructure; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; struktur.I2C_Ack = I 2C_Ack_Enable; I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed ​​​​= 200000; ); batal InitBT() ( USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Init Structure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_MODE_TX; Usart_init (USART1, & Usart_initSTRUTER Sart_it_rxne, aktifkan);


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = AKTIFKAN;

Kode

#define OPCODE 0 #define PANJANG 1 #define PAYLOAD 2 enum CommandStates (CS_DONE, CS_RECEIVING, CS_EXECUTING); enum Kode Perintah (CC_TEST=0x01, CC_SERVO_STATE, CC_SET_SERVO1_DS, CC_SET_SERVO2_DS, CC_GET_ACCEL_REG, CC_SET_ACCEL_REG, CC_GET_BATTERY, CC_LED_STATE, CC_BUZZER, CC_INVALID); enum Kode Kesalahan(EC_NONE, EC_INVALID_CMD, EC_MAX_LEN_EXCEEDED); enum Kode Balasan(RC_NONE, RC_EXECUTED, RC_TEST, RC_ACCELREG, RC_ERROR); typedef struct ( Perintah char yang tidak ditandatangani; Status char yang tidak ditandatangani; Panjang char yang tidak ditandatangani; Payload char yang tidak ditandatangani; )CommandDescriptor; CommandDescriptor Cmd; void InitCmd(CommandDescriptor *Comm) ( Comm->Command=0; Comm->Length=0; unsigned char i; for(i=0;i Muatan[i]=0; Komunikasi->Negara=CS_DONE; //Init state pada akhir, untuk mencegah interupsi dari interferensi ) void SetInvalidCmd(CommandDescriptor *Comm, unsigned char ErrorCode) ( Comm->Command=CC_INVALID; Comm->Length=3; Comm->State=CS_EXECUTING; //Hanya kirim kembali kesalahan Comm->Payload=ErrorCode; ) void USART1_IRQHandler(void) ( data karakter; if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET) ( data = USART_ReceiveData(USART1); switch(Cmd.State ) ( kasus CS_DONE: if(data>=CC_INVALID) ( SetInvalidCmd(&Cmd, EC_INVALID_CMD); kembali; ) Cmd.Command=data; Cmd.Length=0; Cmd.State=CS_RECEIVING; kembali; kasus CS_RECEIVING: if(Cmd. Panjang==0) ( if(data>CMD_BUFFER_LEN) ( SetInvalidCmd(&Cmd, EC_MAX_LEN_EXCEEDED); kembali; ) Cmd.Length=data; BufPtr=0; kembali; ) if(BufPtr


=Cmd.Length-2) ( Cmd.State=CS_EXECUTING; kembali; ) kasus CS_EXECUTING: kembali;
) ) )
Pertama, mari kita nyatakan struktur perintah, yang sebenarnya terdiri dari perintah itu sendiri, status (dieksekusi, dalam proses penerimaan, dalam proses pemrosesan), panjang paket (termasuk dua bidang) sudah terdaftar) dan muatannya, yang bisa dari 0 hingga 8 byte.
Mari kita jelaskan fungsi tambahan untuk menginisialisasi struktur ini dan fungsi lainnya untuk mengisinya dengan nilai Invalid Command. Sekarang mari kita jelaskan interupsinya. Setelah menerima satu byte melalui UART, mari kita lihat apa yang terjadi di sana dengan perintah saat ini (satu-satunya yang ada di "antrian") -.
Jika kita sedang dalam proses penerimaan, kita mengontrol panjang dari apa yang kita terima agar tidak melebihi 10 byte (2 byte dari header dan payload) dan panjangnya dinyatakan dalam byte kedua dari header. Jika ada yang salah, kami melaporkan kesalahan, jika tidak, kami mengatakan bahwa perintah telah diterima dan memasuki keadaan CS_EXECUTING. Mulai sekarang kita mengabaikan segala sesuatu yang datang kepada kita sampai seseorang memberikan perintah ini suatu keadaan CS_SELESAI.
Jika kita mempunyai antrian nyata, kita bisa memasukkan perintah yang diterima ke dalamnya dan menerima perintah berikutnya untuk saat ini.

Itu saja - fungsi utama firmware hanya menginisialisasi periferal, menyalakan Bluetooth dan menunggu perintah memiliki status CS_EXECUTING. Setelah itu, ia memproses perintah (saya tidak akan memberikan kode ini, ini hanya saklar besar menggunakan opcode dengan byte dari payload yang dimasukkan ke dalam register) dan menetapkan statusnya CS_SELESAI.

batalkan utama()

Kode

int main(void) ( InitCmd(&Cmd); InitHardware(); DisableServos(); EnableBT(); EnableLED(); while(1) ( if(Cmd.State==CS_EXECUTING) ( ProcessCmd(&Cmd); InitCmd(&Cmd );

Modifikasi drive untuk masalah rotasi dan desain yang konstan
Karena penggerak pada awalnya dirancang untuk berputar dalam 170 derajat, penggerak tersebut perlu sedikit ditingkatkan agar dapat digunakan sebagai motor robot. Karena ukurannya yang kecil, hal ini mungkin tidak mudah pada awalnya.
Secara umum, semua penggerak dibuat dengan cara yang sama, berapa pun ukurannya - mereka memiliki motor, mereka memiliki kotak roda gigi, poros keluarannya berada pada sumbu yang sama dengan resistor variabel, dari mana rangkaian kontrol menerima informasi tentang posisi saat ini. dari poros.


Resistor disertakan sebagai pembagi antara daya dan ground. Terdapat penghenti pada salah satu roda gigi pada poros keluaran yang mencegah servo berputar lebih jauh dari yang seharusnya, dan potensiometer itu sendiri juga berfungsi sebagai penghenti tersebut. Secara khusus, dalam drive ini semuanya cukup sepele - stopper adalah tonjolan pada poros keluaran, cukup besar, sehingga lebih mudah untuk memotong bukan itu, tetapi apa yang menjadi sandarannya, tonjolan di dalam penutup drive

Tonjolan ini dapat dengan mudah dicairkan dengan besi solder; yang utama adalah memastikan tidak ada potongan plastik yang tersisa yang akan mengganggu putaran.
Poros potensiometer memiliki potongan kecil di ujungnya, sehingga tidak berputar pada roda gigi poros keluaran. Sangat nyaman karena terletak di ceruk kecil tempat peralatan ini cocok. Oleh karena itu, kita cukup memotong/meleburnya dengan besi solder hingga tidak ada bekas potongan yang tersisa. Itu saja, roda gigi berputar dengan tenang tanpa menyentuh resistor variabel.


Kami melumasi semuanya sebagai tambahan, karena... Gemuk cadangan Cina, tutup penutup atas. Hanya ada sedikit yang tersisa.
Kami membuka penutup bawah dan melihat rangkaian kontrol yang terhubung ke motor dan potensiometer.


Kami dengan kejam memotong kabel dari potensiometer dan melepaskannya dari servo agar tidak mengganggu. Ke bantalan kontak yang mereka tuju, kami menyolder dua resistor SMD kecil yang identik, dengan resistansi total sekitar 5 KOhm (jika lebih atau kurang, bukan masalah besar), membentuk pembagi konstan. Saya menyolder dua yang 2.4KOhm.
Karena motor akan memiliki bayangan cermin relatif satu sama lain, untuk salah satunya kami juga menukar kabel menuju motor. Anda tentu saja dapat melakukan ini dengan perangkat lunak, tetapi perangkat keras lebih bagus.

Itu saja, sekarang servo akan selalu menganggap porosnya tepat di tengah. Dan dengan menerapkan sinyal PWM dengan nilai siklus kerja lebih besar dari rata-rata, poros keluaran akan mulai berputar ke satu arah, dan dengan siklus kerja lebih rendah ke arah lain. Dan semakin jauh nilai yang diberikan dari rata-rata, semakin cepat poros berputar.

Pengujian dan pemalsuan


Pelanggan menguji perangkat prototipe

Karena saya sudah mendemonstrasikan video dan foto perangkat di atas, bagian ini terutama akan berisi deskripsi teks penggaruk yang saya injak. Beberapa di antaranya terjadi karena kesalahan saya, beberapa tidak bergantung pada saya.

Persetan dengan makanan
Pemalsuan pertama, yang menyebabkan sebagian besar modifikasi skema. Terhubung ke konverter boost. Ketika saya pertama kali memulai perangkat (belum ada drive), saya tidak melihat apa pun, pengontrol mulai dan mem-flash. 5V hadir pada output konverter. Saatnya memeriksa drive, dan di sinilah penggaruknya keluar. Saat menghubungkan drive, konverter langsung terputus - perlindungan bawaannya dipicu, mematikan sirkuit mikro jika tegangan keluaran turun lebih dari 10 persen di bawah nilai yang ditentukan (5V). Proses debug memakan waktu sangat lama, termasuk duduk di depan osiloskop, mengganti chip konverter itu sendiri dengan yang serupa, menguji berbagai tersedak, dll.
Menariknya, bahkan wadah yang digantung di dekat drive tidak membantu, jadi saya memutuskan bahwa masalahnya ada pada tata letak papan atau pada induktor. Pengukuran telah menunjukkan bahwa konverter berhenti bekerja pada beban lebih besar dari 90 mA, bahkan dalam kasus beban resistif murni! Pada saat yang sama, efisiensinya sekitar 40 persen; tentu saja, hal ini tidak dapat diterima untuk konverter pulsa.

Alasannya ternyata sangat dangkal - sepertinya alih-alih menggunakan kapasitor keramik keluaran 10 µF, saya secara keliru menyolder kapasitor 1 µF yang sama. Dengan kapasitansi keluaran seperti itu, sirkuit mikro tidak dapat mencapai mode operasi, dan kapasitor besar yang digantung di nozel tidak membantu sama sekali.
Setelah sedikit melepaskan papan topengnya, saya menyolder dua kapasitor keramik 22 uF ke output konverter, ke inputnya dan tepat di depan servo.
Pada saat yang sama, saya memasang smoothing choke (lebih tepatnya, manik ferit), BLM41PG471SN1, dengan nilai 2A, antara output konverter dan servo.
Selain itu, ternyata, ruang di papan memungkinkan Anda memasukkan satu kapasitor tantalum dalam paket "A", 150 uF, tepat di sebelah output konverter.
Faktanya, untuk pengoperasian yang benar, satu kapasitor 22 uF pada keluaran dan satu kapasitor pada masukan sudah cukup, tetapi karena ruang memungkinkan, saya memutuskan untuk bermain aman.
Hasilnya sungguh luar biasa, keluaran 5V hampir senyap bahkan saat diberi beban, dan efisiensi konverter, menurut pengukuran saya (saya menyertakan amperemeter di rangkaian masukan dan keluaran), mencapai 93 persen, yang dengan sendirinya merupakan nilai yang sangat baik. indikator.

Kesimpulan dari pemalsuan: Periksa elemen apa yang Anda solder ke papan. Konverter pulsa adalah hal yang sensitif, dan komponen yang digantung pada ingus tidak akan memperbaiki situasi, bahkan jika arah pemikirannya (kapasitansi keluaran tidak mencukupi) benar.
Resistansi probe multimeter dan shunt, kapasitansi dan induktansi papan tempat memotong roti mendistorsi gambar, jadi hal-hal seperti itu harus diuji dalam konfigurasi akhir, dan bukan pada ingus.

Persetan dengan akselerometer
Pemalsuan wasir, sekali lagi karena kurangnya perhatian. Saat menguji periferal, ternyata accelerometer tidak merespon. Karena itu berada di bus I2C, komunikasi dimulai (tidak termasuk pulsa awal) dengan transfer alamat perangkat. Setelah itu, ia harus merespons dengan dorongan konfirmasi jika alamatnya cocok. Tidak ada dorongan hati.
Karena badan akselerometer adalah yang terburuk untuk disolder (3x3 mm dan tidak ada bantalan "tanah" di perut sirkuit mikro, itulah sebabnya ia berada di tengah yang menjijikkan), saya memutuskan bahwa masalahnya ada pada penyolderan dan menghabiskan banyak waktu. waktu menyoldernya kembali beberapa kali. Itu tidak membantu.
Kemudian saya memutuskan bahwa resistor bawaan yang dijanjikan ternyata tidak mencukupi, jadi saya membersihkan papan dan menyoldernya sendiri. Itu tidak membantu.
Saya memeriksa kodenya berkali-kali dan memeriksa alamat dengan lembar data. Itu tidak membantu.
Hasilnya, secara ajaib ia memberikan alamat yang berbeda dari yang ditentukan satu per satu (dalam salah satu digit representasi biner dari alamat tersebut). Itu membantu.
Saya mulai menggali lembar data karena hal ini tidak mungkin terjadi - agar perangkat merespons ke alamat yang berbeda. Dan saya menemukan hal yang luar biasa.
Ternyata ada dua modifikasi accelerometer : dan.
Tubuh identik. Lembar data yang identik. Peta register yang sama. Hanya saja yang kedua tidak bisa mengukur 2g/4g/8g, melainkan yang pertama hanya bisa mengukur 2g/4g.
Dan alamat mereka berbeda satu sama lain. Google yang bagus, ketika saya mulai mengetik LIS133 secara otomatis memberi tahu saya “LIS133DLH”, saya tidak langsung melihat perbedaannya di lembar data, jadi saya menekan Axel dengan alamat orang lain.

Kesimpulan dari pemalsuan: Periksa nama elemen di lembar data. Jika berbeda dari yang diharapkan setidaknya satu huruf, pastikan untuk mencari tahu apa tanggung jawab surat ini. Seringkali, huruf di akhir tidak penting untuk pengembangan dan berhubungan dengan jenis pengiriman komponen, tetapi hal ini juga terjadi seperti pada akselerometer ini.

Persetan dengan modul Bluetooth
Ya, kekacauan ini lebih disebabkan oleh hati nurani orang Tiongkok. Ternyata mereka memproduksi beberapa modifikasi modul ini, HC-04, HC-05, HC-06 - mereka tidak berbeda dalam perangkat keras, mereka berbeda dalam firmware. Jika diinginkan, Anda dapat mengubah satu sama lain.
Saya menerima HC-04 dan bukan HC-05, perbedaannya adalah 04 memiliki firmware yang lebih sederhana, dan jika 05 dialihkan ke mode perintah dengan mengirimkan sinyal ke salah satu GPIO-nya, dan 05 dapat bekerja sebagai master dan budak, maka 04 selalu hanya berfungsi sebagai budak (atau hanya sebagai master, tetapi saya belum pernah melihat modul seperti itu dijual), awalnya dalam mode menerima perintah dan berhenti meresponsnya setelah membuat koneksi dengan master.
Selain itu, tidak satu pun modul ini mendukung mode tidur hemat energi.
Oleh karena itu, ternyata sinyal keluaran I untuk mengalihkan modul ke mode perintah tidak berguna, dan modul juga terus-menerus mengonsumsi 20 hingga 40 mA saat mencari master.
Solusinya adalah dengan mentransfer sinyal kontrol, yang tidak berguna dalam situasi ini, ke pin RESET modul. Sekarang, ketika level rendah diterapkan di sana, modul masuk ke status RESET dan berhenti mengonsumsi.

Kesimpulan dari pemalsuan: Timur adalah masalah yang rumit. Modul bahasa Mandarin adalah lotere, Anda perlu membaca lembar data dengan cermat, periksa juga apa yang dikirimkan kepada Anda.

Persetan dengan antarmuka debugging
Bukan sebuah kebohongan, tapi bahan untuk dipikirkan. Ya, untuk firmware dan debugging, dua pin sinyal SWD sudah cukup - jam dan data. Namun, itu tidak akan dijahit sama sekali (dengan ST-LINK dalam hal apapun) jika programmer menyematkannya VAPP tidak terhubung langsung ke catu daya pengontrol. Pemrogram menguji tegangan dengan itu dan umumnya cukup sensitif terhadapnya; untuk beberapa alasan itu tidak berfungsi untuk saya bahkan ketika saya menghubungkannya ke sumber 3.3V pemrogram. Namun, ini tidak terlalu menakutkan - saya menyoldernya ke salah satu konektor penghalus.
Ada hal lain yang jauh lebih buruk. Miliki pin pertama, yang tentu saja bertanggung jawab untuk mengatur ulang pengontrol. Dan nyatanya SWD bisa mereset software controllernya, jadi prinsipnya tidak harus dikoneksikan. Tetapi.
Penggaruknya merayap naik saat saya menguji mode tidur. Sayangnya, saya tidak membaca istilah penting ini dari bagian Refman STM32 Dukungan debug untuk mode daya rendah: Inti tidak mengizinkan FCLK atau HCLK dimatikan selama sesi debug. Karena ini diperlukan untuk koneksi debugger, selama debug, mereka harus tetap aktif.
Selama tidur paling nyenyak, mode Stand-By, pencatatan jam kerja dimatikan bersamaan dengan debugging. Dan karena Untuk uji konsumsi, saya cukup memasukkan input stand-by ke main, lalu berakhir dengan pengontrol non-jahit.
Hubungan antara reset dan fakta ini sederhana - programmer dapat menjahit dari bawah reset ketika stand-by belum diaktifkan (dan langsung aktif ketika dihidupkan dengan firmware saya), hanya untuk ini harus bisa untuk me-reboot pengontrol, yang tanpa pin pertama dia tidak bisa melakukannya.
Anehnya, yang menyelamatkan saya adalah utilitas standar dari ST, yang memiliki mode otomatis yang sangat baik di mana pemrogram terus-menerus mencoba mendeteksi pengontrol yang dapat diprogram. Setelah mengaktifkan mode ini, saya mulai memasang kabel dengan GND yang disolder ke jarum, mencoba menyodok ke bantalan reset yang hampir tidak menonjol dari bawah pengontrol. Berhasil, programmer berhasil mengambil controller sebelum tertidur kembali dan menghapus firmware.

Kesimpulan dari pemalsuan: Saat Anda tertidur, pikirkan bagaimana Anda akan bangun. Nah, Anda perlu melepas resetnya, setidaknya satu milimeter dari badan, agar setidaknya bisa menusuknya dengan jarum.

Persetan dengan drive
Kekacauan yang paling menyedihkan, dan itu bukan berdasarkan hati nurani saya. Drivenya, maaf, jelek. Mereka dirancang khusus untuk mode servonya, dan sedemikian rupa untuk dijalankan HAI sebagian besar waktu dalam posisi statis. Saat berada di bawah beban, mereka memanas tanpa ampun. Selain itu, mereka memanas meskipun tidak ada yang menempel padanya, porosnya hanya berputar. Oleh karena itu, mereka tidak dapat bekerja dalam mode rotasi konstan - setelah dua menit, bahkan pada kecepatan rendah dan pelumasan yang sangat baik di dalamnya (tidak ada yang menempel, gerakannya mulus), mereka mulai meleleh secara alami.

Bodi meleleh, dan yang paling parah, roda gigi, terutama roda gigi keluaran. Setelah ini, drive macet dan hanya penggantian yang membantu. Jadi catbot dalam bentuk yang ditampilkan pada foto dan video hanya dapat bekerja selama 1-2 menit dengan jeda. Oleh karena itu, kami harus membongkarnya dan mengganti penggeraknya dengan MG90 yang lebih sehat, lebih lambat, dan lebih memakan waktu, dengan roda gigi logam yang dapat berputar perlahan untuk waktu yang sangat lama.
Jadi sekarang dia tidak bisa masuk ke dalam bola (bahkan yang besar, apalagi yang kecil) dan mengemudi dengan sangat lambat.
Namun kucing itu masih tertarik.

Kesimpulan dari pemalsuan: Nah, kesimpulan apa yang bisa diambil? Ini adalah sampel uji, hanya untuk mengungkapkan hal-hal seperti itu. Kesimpulan tentang drive - gunakan drive kecil dengan sangat hati-hati. Mungkin mereka akan menggunakan hex atau quadropod yang sangat ringan dan sangat kecil, saya akan mencoba merakitnya ketika saya punya waktu.

Kesimpulan umum tentang pekerjaan ini: Secara keseluruhan, ini adalah pengalaman yang bermanfaat. Dan kucing menyukainya meskipun ada drive baru, yang membuat catbot menjadi lebih besar dan lebih lambat. Terutama ketika dia berbunyi bip)
Bagi yang mengoleksi hal serupa Saya juga dapat mengatakan ini - sensor rotasi (poros bukan miliknya) adalah suatu hal yang wajib, oleh karena itu tidak ada jumlah kalibrasi dan nilai konstan yang dapat mencapai kecepatan yang sama dari dua penggerak berbeda dan roda di atasnya. Oleh karena itu robot akan bergerak melingkar. Dengan kalibrasi yang baik - dalam lingkaran yang sangat besar, sehingga hanya akan terlihat saat berkendara dari dinding ke dinding. Jika buruk, akan terlihat lebih awal. Jadi saya berencana memasang sensor yang lebih canggih di versi berikutnya. Ya, dan drive yang lebih cocok, tentunya.
Ada juga ide untuk mencoba mengatur pendinginan motor pada penggerak kecil; bersama dengan pengurangan kecepatan, ini mungkin cukup untuk pengoperasian yang benar (bagaimanapun juga, pembuangan panas dari motor tersebut menjijikkan sekarang). Jika berhasil, tunggu artikel selanjutnya, tentang catbot v1.5, dengan drive yang didinginkan dan di FreeRTOS!

Itu saja untuk saya, kumpulkan robot dan hibur kucing Anda!

26.01.2011, 09:18
Sumber:

Biasanya dalam artikel saya mencoba menyajikan materi sesuai urutan perkembangannya, namun menurut saya tidak demikian. Oleh karena itu, mari kita lewati tahapan desain yang mendasar diagram kelistrikan, tata letak PCB, dan lainnya. Pada Gambar 1 kita melihat “aib” seperti apa yang saya dapatkan.

Sekilas tampak seperti tumpukan besi, elektronik, dan kabel. Hal ini mungkin disebabkan karena bahan yang digunakan tidak sama. Mari kita cari tahu.

Sekarang semuanya beres. Ke mikrokontroler Attiny2313 dari dua sensor inframerah sinyal hambatan diterima (logis satu atau nol). Kemudian sesuai firmware, mikrokontroler mengontrol chip driver motor L293D (mengendalikan arus hingga 1 Ampere). Gambar 3 menunjukkan foto robot terbalik.

Dasar dari desain robot buatan sendiri adalah strip logam yang ditekuk menjadi trapesium. Sudut lenturnya sekitar 120°. Pada dasarnya penting untuk mendapatkan tikungan yang sama di kedua sisi, jika tidak robot tidak akan bergerak dalam garis lurus. Meskipun, di sisi lain, kesalahan yang dilakukan oleh seorang mekanik atau insinyur elektronik terkadang dapat diperbaiki oleh seorang programmer, misalnya, dengan menggunakan PWM untuk mencapai pergerakan linier robot.

Kita semua tahu dari pelajaran geometri sekolah bahwa sebuah bidang dibentuk oleh tiga titik atau oleh sebuah garis lurus dan sebuah titik dalam ruang. Poin ketiga adalah roda roller yang berputar bebas.

Penerima sensor IR dan fototransistor terletak di bagian bawah untuk mengurangi penerangan dan meminimalkan kesalahan positif. Sensor IR itu sendiri dipasang pada engsel yang dapat digerakkan, yang memungkinkan Anda menyesuaikan area pemindaian. Menariknya, reaksi kucing saya terhadap robot yang merangkak di koridor? Kucing saya berwarna hitam. Saya mengatur sensor IR ke wallpaper abu-abu, sehingga robot berbalik ke depan kucing hampir pada saat-saat terakhir, dan kucing itu melompat mundur selangkah sambil mendesis keras.

Modifikasi robot berikutnya adalah sensor IR di perutnya, yang memungkinkan robot mengikuti garis hitam yang digambar di kertas putih dengan spidol. Implementasinya membutuhkan tiga buah sensor dan sebuah komparator pada chip LM339N untuk meringankan mikrokontroler. Kerugian yang signifikan ternyata adalah hal yang perlu pengaturan awal sensor dengan resistor pemangkas tergantung pada pencahayaan di dalam ruangan.

P.S. Imbalan karena membuang-buang waktu untuk menciptakan perangkat yang tidak berguna, mungkin, adalah kejelasan pengoperasian mikrokontroler dan memori yang akan mengumpulkan debu di rak sampai anak seseorang mungkin tertarik padanya.

Saya memutuskan untuk beralih dengan lancar ke model bergerak dinamis. Ini adalah proyek untuk robot kecil buatan sendiri yang dikendalikan IR, dirakit dari bagian-bagian yang sederhana dan mudah didapat. Ini didasarkan pada dua mikrokontroler. Transmisi dari remote control disediakan PIC12F675, dan bagian penerima untuk pengontrol motor diimplementasikan GAMBAR12F629.

Rangkaian robot pada mikrokontroler

Semuanya berjalan lancar dengan bagian digital, satu-satunya masalah ada di "unit propulsi" - gearbox kecil, yang sangat bermasalah untuk dibuat di rumah, jadi saya harus mengembangkan ide " bug getar“Motor mikro dikendalikan melalui sakelar transistor penguat pada BC337. Motor tersebut dapat diganti dengan motor kecil lainnya transistor npn dengan arus kolektor 0,5 A.

Dimensinya ternyata sangat kecil - di foto ada perbandingannya dengan koin dan juga di dekat kotak korek api. Mata robot terbuat dari LED super terang, dimasukkan ke dalam wadah kapasitor elektrolitik kecil.

Diskusikan artikel ROBOT KECIL BUATAN SENDIRI

Memilih mikrokontroler untuk membuat robot Anda. Pertama, Anda perlu memahami konsep apa itu mikrokontroler dan apa fungsinya?

Mikrokontroler adalah perangkat komputasi yang mampu menjalankan program (yaitu serangkaian instruksi).

Hal ini sering disebut sebagai “otak” atau “pusat kendali” robot. Biasanya, mikrokontroler bertanggung jawab atas semua perhitungan, pengambilan keputusan, dan komunikasi.

Untuk berkomunikasi dengan dunia luar, mikrokontroler memiliki serangkaian pin atau pin untuk merasakan sinyal secara elektrik. Jadi sinyal dapat diubah ke maksimum (1/C) atau minimum (0/off) menggunakan instruksi pemrograman. Pin ini juga dapat digunakan untuk membaca sinyal listrik. Mereka berasal dari sensor atau perangkat lain dan menentukan apakah sinyalnya tinggi atau rendah.

Kebanyakan mikrokontroler modern juga dapat mengukur tegangan sinyal analog. Ini adalah sinyal yang dapat memiliki rentang nilai penuh, bukan dua level yang ditentukan dengan jelas. Ini terjadi dengan menggunakan konverter digital analog (ADC). Hasilnya, mikrokontroler dapat memberikan nilai numerik pada sinyal dalam bentuk tegangan analog. Tegangan ini tidak tinggi atau rendah dan biasanya berada pada kisaran 0 - 10 volt.

Apa yang bisa dilakukan mikrokontroler?

Meskipun mikrokontroler mungkin tampak sangat terbatas pada pandangan pertama, banyak tindakan kompleks yang dapat dilakukan dengan menggunakan pin sinyal tinggi dan rendah untuk memprogram suatu algoritma. Namun, membuat algoritma yang sangat kompleks, seperti perilaku cerdas atau program yang sangat besar, mungkin tidak dapat dilakukan oleh mikrokontroler karena keterbatasan sumber daya dan kecepatan.

Misalnya, Anda dapat memprogram rangkaian berulang untuk membuat lampu berkedip. Jadi mikrokontroler mengubah sinyal menjadi tinggi, menunggu satu detik, mengubahnya menjadi rendah, menunggu satu detik lagi dan mulai lagi. Lampu dihubungkan ke pin keluaran mikrokontroler dan akan berkedip tanpa henti dalam program siklik.


Demikian pula mikrokontroler dapat digunakan untuk mengontrol perangkat listrik lainnya. Terutama seperti drive (bila terhubung ke pengontrol motor), perangkat penyimpanan (seperti kartu SD), antarmuka WiFi atau bluetooth, dll. Sebagai konsekuensi dari keserbagunaan yang luar biasa ini, mikrokontroler dapat ditemukan dalam kehidupan sehari-hari.

Di hampir setiap peralatan rumah tangga atau perangkat elektronik Setidaknya satu mikrokontroler digunakan. Meskipun beberapa mikrokontroler sering digunakan. Misalnya saja di televisi, mesin cuci, panel kontrol, telepon, jam tangan, oven microwave, dan banyak perangkat lainnya.

Berbeda dengan mikroprosesor (misalnya, unit pemrosesan pusat di komputer pribadi), mikrokontroler tidak memerlukan perangkat periferal. Seperti eksternal RAM atau perangkat penyimpanan eksternal untuk pengoperasian. Ini berarti bahwa meskipun mikrokontroler mungkin kurang kuat dibandingkan rekan-rekan PC mereka. Hampir selalu lebih mudah dan lebih murah untuk mengembangkan sirkuit dan produk berdasarkan mikrokontroler karena sangat sedikit komponen perangkat keras tambahan yang diperlukan.

Penting untuk dicatat bahwa mikrokontroler hanya dapat mengeluarkan output yang sangat sedikit jumlah besar energi listrik melalui kontak keluarannya. Artinya tidak mungkin menghubungkan motor listrik yang kuat, solenoid, penerangan besar, atau beban besar lainnya langsung ke mikrokontroler. Mencoba melakukan ini dapat merusak pengontrol.

Apa fungsi yang lebih khusus dari mikrokontroler?

Perangkat keras khusus yang dibangun ke dalam mikrokontroler memungkinkan perangkat ini melakukan lebih dari sekadar I/O digital sederhana, penghitungan dasar, dan pengambilan keputusan. Banyak mikrokontroler yang siap mendukung protokol komunikasi paling populer, seperti UART (RS232 atau lainnya), SPI dan I2C. Fitur ini sangat berguna saat berkomunikasi dengan perangkat lain seperti komputer, sensor, atau mikrokontroler lainnya.

Meskipun protokol ini dapat diterapkan secara manual, akan lebih baik jika memiliki perangkat keras internal khusus yang menangani detailnya. Hal ini memungkinkan mikrokontroler untuk fokus pada tugas lain dan menjaga program tetap bersih.


Konverter analog-ke-digital (ADC) digunakan untuk mengubah sinyal tegangan analog menjadi sinyal digital. Di sana besarannya sebanding dengan besarnya tegangan dan angka ini kemudian dapat digunakan dalam program mikrokontroler. Untuk membedakan keluaran energi antara tinggi dan rendah, beberapa mikrokontroler memiliki kemampuan untuk menggunakan modulasi lebar pulsa (PWM). Misalnya, metode ini memungkinkan Anda mengubah kecerahan LED dengan lancar.

Terakhir, beberapa mikrokontroler memiliki pengatur tegangan terintegrasi. Ini cukup nyaman karena memungkinkan mikrokontroler bekerja dengan rentang tegangan yang lebar. Oleh karena itu, Anda tidak perlu memberikan nilai tegangan yang diperlukan. Ini juga memudahkan untuk terhubung berbagai sensor dan perangkat lain tanpa catu daya tambahan yang diatur secara eksternal.

Analog atau digital?

Sinyal masukan dan keluaran mana yang perlu digunakan bergantung pada tugas dan kondisi. Misalnya, jika tugas Anda hanya menghidupkan atau mematikan sesuatu, maka sinyal pada pin input mikrokontroler cukup digital. Keadaan biner saklar adalah 0 atau 1. Level sinyal tinggi bisa 5 volt, dan level rendah 0. Jika Anda perlu mengukur, misalnya suhu, maka Anda memerlukan sinyal input analog. Selanjutnya ADC pada mikrokontroler menginterpretasikan tegangan dan mengubahnya menjadi nilai numerik.


Bagaimana cara memprogram mikrokontroler?

Pemrograman mikrokontroler menjadi lebih mudah berkat penggunaan lingkungan pengembangan terintegrasi (IDE) modern dengan perpustakaan berfitur lengkap. Mereka dengan mudah mencakup semua tugas yang paling umum dan memiliki banyak tugas contoh yang sudah jadi kode.

Saat ini, mikrokontroler dapat diprogram dalam berbagai bahasa tingkat tinggi. Ini adalah bahasa seperti C, C++, C#, Java, Python, Basic dan lain-lain. Tentu saja, Anda selalu dapat menulis program dalam bahasa assembly. Meskipun ini untuk pengguna yang lebih mahir dengan persyaratan khusus (dengan sedikit masokisme). Dalam hal ini, siapa pun harus bisa menemukan bahasa pemrograman yang paling sesuai dengan selera dan pengalaman pemrograman sebelumnya.

Pemrograman mikrokontroler menjadi lebih mudah karena produsen menciptakan lingkungan pemrograman grafis. Ini adalah ikon yang berisi beberapa baris kode. Piktogram tersebut saling terhubung satu sama lain. Hasilnya, terciptalah sebuah program yang secara visual sederhana, namun berisi kode dalam jumlah besar. Misalnya, satu gambar dapat mewakili kendali mesin. Pengguna hanya perlu menempatkan ikon jika diperlukan dan menunjukkan arah putaran dan kecepatan.


Papan mikrokontroler yang dikembangkan cukup nyaman digunakan. Dan lebih mudah digunakan untuk waktu yang lama. Mereka juga menyediakan daya USB dan antarmuka pemrograman yang nyaman. Oleh karena itu, dimungkinkan untuk terhubung ke komputer modern mana pun.

Mengapa tidak menggunakan komputer standar?

Jelas sekali, mikrokontroler sangat mirip dengan prosesor komputer. Kalau begitu, kenapa tidak menggunakan komputer saja untuk mengendalikan robotnya? Jadi sebaiknya Anda memilih komputer desktop atau mikrokontroler?


Pada dasarnya, pada robot yang lebih canggih, terutama yang melibatkan perhitungan dan algoritma yang kompleks, mikrokontroler sering kali digantikan (atau ditambah) oleh komputer standar. Diinstal di komputer desktop Anda papan utama, prosesor, RAM perangkat (misalnya, perangkat keras), kartu video (bawaan atau eksternal).

Selain itu ada periferal, seperti monitor, keyboard, mouse, dll. Sistem ini biasanya lebih mahal, secara fisik lebih besar, dan mengonsumsi lebih banyak daya. Perbedaan utamanya dijelaskan pada tabel di bawah ini. Selain itu, seringkali mereka memiliki fungsi lebih dari yang diperlukan.

Bagaimana cara memilih mikrokontroler yang tepat?

Jika Anda mempelajari robotika, maka Anda memerlukan mikrokontroler untuk proyek robotika apa pun. Bagi seorang pemula, memilih mikrokontroler yang tepat mungkin tampak seperti tugas yang berat. Apalagi mengingat jangkauannya spesifikasi teknis dan bidang aplikasi. Ada banyak mikrokontroler berbeda yang tersedia di pasaran:

  • Arduino
  • DasarATOM
  • DasarX
  • Lego EV3
  • dan banyak lainnya

Untuk memilih mikrokontroler yang tepat, tanyakan pada diri Anda pertanyaan-pertanyaan berikut:

Mikrokontroler apa yang paling populer untuk aplikasi saya?

Tentu saja, pembuatan robot dan proyek elektronik secara umum bukanlah sebuah kontes popularitas. Alangkah baiknya jika mikrokontroler mendapat banyak dukungan dari masyarakat. Dan itu berhasil digunakan dalam situasi serupa atau bahkan identik. Hasilnya, hal ini dapat sangat menyederhanakan tahap desain. Dengan cara ini, Anda bisa mendapatkan keuntungan dari pengalaman pengguna lain, baik amatir maupun profesional.

Anggota komunitas desain robot saling berbagi hasil, kode, gambar, video, dan berbicara secara detail tentang keberhasilan dan bahkan kegagalan. Semua ini adalah materi yang dapat diakses dan kesempatan untuk menerima saran dari pengguna yang lebih berpengalaman. Oleh karena itu, ini terbukti sangat berharga.

Apakah robot Anda memiliki persyaratan khusus?

Mikrokontroler harus mampu melakukan semua tindakan khusus robot Anda agar fungsinya dapat dijalankan dengan benar. Beberapa fitur umum untuk semua mikrokontroler (misalnya, adanya input dan output digital, kemampuan melakukan operasi matematika sederhana, membandingkan nilai, dan mengambil keputusan).

Pengontrol lain mungkin memerlukan perangkat keras tertentu (misalnya, ADC, PWM, dan dukungan protokol komunikasi). Persyaratan memori dan kecepatan serta jumlah pin juga harus diperhitungkan.

Komponen apa saja yang tersedia untuk mikrokontroler tertentu?

Mungkin robot Anda memiliki persyaratan khusus atau memerlukan sensor atau komponen tertentu. Dan ini penting untuk proyek Anda. Oleh karena itu, memilih mikrokontroler yang kompatibel tentunya menjadi sangat penting.

Kebanyakan sensor dan komponen dapat berkomunikasi langsung dengan banyak mikrokontroler. Meskipun beberapa komponen dirancang untuk berinteraksi dengan mikrokontroler tertentu. Mungkin mereka unik dan tidak kompatibel dengan jenis mikrokontroler lainnya.

Bagaimana masa depan kita?

Harga komputer anjlok, dan kemajuan teknologi menjadikannya lebih kecil dan lebih efisien. Akibatnya, komputer papan tunggal telah menjadi pilihan yang menarik bagi robot. Mereka bisa bekerja dengan penuh sistem operasi(Windows dan Linux adalah yang paling umum).

Selain itu, komputer dapat terhubung ke perangkat eksternal, seperti perangkat USB, layar LCD, dll. Berbeda dengan pendahulunya, komputer papan tunggal ini cenderung mengonsumsi daya yang jauh lebih sedikit.

Bagian praktis

Untuk memilih mikrokontroler, mari kita buat daftar kriteria yang kita perlukan:

  • Biaya mikrokontroler harus rendah
  • Ini harus mudah digunakan dan didukung dengan baik
  • Ketersediaan dokumentasi yang dapat diakses adalah hal yang penting
  • Itu harus diprogram dalam lingkungan grafis
  • Itu harus populer dan memiliki komunitas pengguna aktif
  • Karena robot kita akan menggunakan dua motor dan berbagai sensor, maka mikrokontroler memerlukan setidaknya dua port untuk mengendalikan motor dan beberapa port untuk menghubungkan sensor. Jumlah perangkat yang terhubung juga dapat diperluas di masa mendatang.

Memenuhi kriteria ini modul EV3 dari set Lego Mindstorms EV3.


Ikhtisar Bata EV3

Pada artikel ini kita akan membahas tentang robot paling menarik, yang prinsip konstruksinya adalah menggunakan rangkaian analog sederhana. Kami akan melihat fitur dan prinsip dasarnya, dan pada akhirnya kami akan mencoba membuat robot sederhana.
Sangat mudah bahkan untuk amatir radio pemula!

Disarankan untuk menggunakan elemen elektronik sesedikit mungkin saat membuat robot, dan Anda bahkan dapat menggunakan limbah elektronik.

Prinsip terpenting dalam merancang robot BEAM adalah meniru sifat makhluk hidup.
Robot BEAM harus memiliki sifat yang melekat pada makhluk hidup. Tentu saja kita tidak sedang membicarakan tanda-tanda seperti pernapasan, pertumbuhan, reproduksi, karena robot tidak memerlukannya. Namun makanan, pergerakan, dan perkembangan robot-robot ini adalah makna utama kehidupan.

Gerak merupakan suatu tanda (properti) yang tidak terpisahkan dari setiap makhluk hidup. Ini adalah hal paling sederhana yang dapat diimplementasikan pada robot BEAM. Dalam pemahaman saya, gerakan bisa terjadi secara spontan atau disengaja (disengaja). Sehubungan dengan robot pintar, kita dapat mengatakan bahwa mereka hanya memerlukan gerakan yang disengaja. Misalnya, pada seseorang, otot-otot wajah mungkin bergerak tanpa sadar untuk menyampaikan ekspresi wajah (misalnya, karena emosi yang tiba-tiba), tetapi bagi robot, gerakan apa pun yang tidak perlu akan membuang-buang energi.

Ini adalah tugas yang sulit namun menarik untuk dibuat kecerdasan buatan Robot BEAM, karena menurut filosofi robotika BEAM tidak menggunakan mikrokontroler dan mikroprosesor, tetapi semuanya dilakukan pada komponen diskrit analog. Penggunaan mikrokontroler tidak dilarang, namun naluri dasar robot harus didasarkan pada penggunaan berbagai model perilaku yang berhubungan langsung dengan sensor dan sensor dengan tingkat pemrosesan sinyal minimal.

Nutrisi

Dalam kebanyakan kasus, sumber listriknya adalah baterai. Namun jika Anda ingin membuat robot bertenaga mandiri, Anda perlu menggunakan energi radiasi (misalnya sinar matahari). Perangkat yang mengubah energi matahari menjadi energi langsung arus listrik disebut baterai surya yang terdiri dari fotosel semikonduktor. Panel surya menyediakan sejumlah kecil energi listrik secara real time, tetapi hanya dengan adanya sinar matahari. Agar tidak “mati” tanpa adanya matahari, disarankan untuk menggunakan baterai yang dapat diisi ulang untuk menyimpan akumulasi energi untuk “hari hujan”… atau hari berawan.

Adaptasi dan perilaku

Robot berbasis sirkuit analog lebih beradaptasi dengan lingkungan dibandingkan robot digital, yang efektivitasnya berakhir ketika menghadapi situasi yang tidak ditentukan dalam program otak digitalnya. Dengan kata lain, robot digital tidak dapat memecahkan masalah yang jawabannya tidak disertakan dalam programnya.

Konsep robot BEAM yang dikemukakan oleh Mark Tilden adalah reaksi terhadap faktor eksternal harus disediakan pada tahap pertama oleh mesin itu sendiri, tanpa partisipasi “otak” mana pun, seperti yang terjadi di alam yang hidup, dalam perjalanan dari protozoa ke manusia. Peningkatan dan penciptaan sistem robotik yang lebih kompleks harus mengikuti jalur yang sama.

Jenis

Ada jenis yang berbeda Robot BEAM, yang dirancang untuk melakukan tugas berbeda.
Audiotrop- bereaksi terhadap suara.
Fototrop- bereaksi terhadap cahaya.
Radiotrop- merespons frekuensi radio.
Termotrop- bereaksi terhadap radiasi termal.

Fototrop adalah yang paling umum, karena menemukan cahaya adalah tugas paling jelas bagi robot bertenaga surya.

Struktur modular

Secara pribadi, saya menyukai gagasan untuk membuat robot BEAM dari modul fungsional individu, dan mengikuti prinsip "dari yang sederhana ke yang kompleks", robot dapat dikembangkan dengan menambahkan lebih banyak modul baru. Setiap modul itu sendiri dapat bekerja secara terpisah, mis. tidak ada otak terpusat yang akan digunakan untuk memproses informasi.

Casis

Agar robot dapat bergerak, perlu dibuat sasis untuk robot tersebut.
Itu terjadi jenis yang berbeda: dilacak, di atas roda dan bahkan di atas kaki...
Mari kita lihat lebih dekat.

1. Perayap.

Gambar menunjukkan sasis yang sudah jadi, yang tidak sulit ditemukan di pasaran. Dalam kebanyakan kasus, ini digerakkan oleh sepasang motor roda gigi.
Kelebihan: berbelok dengan baik tanpa menggunakan mekanisme kemudi; telah meningkatkan kemampuan lintas negara; Lebih mudah untuk memasang papan listrik dan komponen individual di atasnya.
Kekurangan: Sasis ini sulit dirakit di rumah dan biayanya rata-rata $90.

2. Sasis di atas roda.


Kelebihan: tipe paling sederhana karena Anda dapat merakitnya sendiri di rumah (misalnya, dari konstruktor anak-anak, dll.) atau menggunakan mobil mainan.
Kekurangan: untuk berbelok diperlukan mekanisme putar kemudi, yang berarti harus menggunakan motor listrik tambahan, yang mengakibatkan bertambahnya bobot struktur dan peningkatan konsumsi listrik.

3. Robot berkaki.


Ini adalah tipe yang paling sulit.
Kelebihan: mereka penampilan lebih dekat dengan makhluk hidup, dan gerakannya terlihat lebih mengesankan.
Kekurangan: sejumlah besar mekanisme yang digunakan, dan seringkali robot semacam itu membutuhkan sistem yang menjamin keseimbangan.

KAMI MELAKUKANNYA SENDIRI!

Anda dapat membuat sasis untuk robot Anda seperti yang ditunjukkan pada gambar di bawah ini.

Anda bisa menggunakan kotak sebagai alasnya. Plastik lebih baik karena bahannya ringan. Di dalam kotak yang sama akan lebih mudah untuk menempatkan catu daya: akumulator, baterai, dll.
Ingatlah bahwa semakin besar rodanya, robot akan semakin lambat (dan mungkin tidak bergerak).

Pilihan kedua. Klem plastik digunakan di sini untuk mengamankan motor.

Motor listrik dapat diambil dari peralatan lama: tape recorder, mainan, disk drive, dll.

Saya memiliki tiga jenis motor di rumah:

Pilihan jatuh pada motor bagian atas. Dia menunjukkan karakteristik yang baik dalam hal traksi dan konsumsi saat ini.

Kami juga membutuhkan tempat baterai untuk menyediakan daya. Catu daya dapat diatur secara terpisah: untuk motor (daya) dan untuk rangkaian logika.

Dibawah ini adalah rangkaian sederhana robot yang mengikuti cahaya senter.

Skema 1. “Menjadi terang.”

Rangkaian ini menggunakan fotodioda. Kami memilihnya sesuai dengan rentang sensitivitas, mis. mempertimbangkan cahaya apa yang akan dituju robot tersebut. Misalnya saja cahaya dari senter (jarak tampak) atau pancaran remote control TV (jarak inframerah). Jika fotosel VD1 disinari, maka Motor 1 akan berputar, dan jika fotosel VD2 disinari, maka Motor 2 akan diputar cahaya.

Dan jika motornya ditukar, maka robot malah sebaliknya akan berpaling dari cahaya.

Sekarang mari kita lihat fotosel.
Fotodioda, fototransistor, fotoresistor, dll. digunakan sebagai elemen peka cahaya. Ada banyak informasi tentang elemen-elemen ini di Internet, jadi saya akan menjelaskannya secara singkat.

1. Fotoresistor: Dalam gelap, ini adalah resistor dengan resistansi tinggi, dan ketika disinari oleh cahaya, resistansinya turun sebanding dengan intensitas cahaya, menunjukkan hubungan linier. Biasanya mereka hanya melihat cahaya tampak.

2. Fotodioda: perangkat semikonduktor, seperti dioda biasa, memiliki anoda dan katoda.
Jika Anda menggunakan sambungan langsung, fotodioda yang menyala akan menghasilkan tegangan pada terminal.
Ketika dihidupkan kembali, resistansi fotodioda yang diiradiasi turun dengan cara yang sama seperti fotoresistor.
Berdasarkan jangkauan cahayanya, fotodioda dibagi menjadi dioda IR dan dioda cahaya tampak. Dioda IR hanya menangkap radiasi infra merah, tetapi juga merespon dengan baik terhadap lampu pijar dan matahari.

3. Fototransistor: berbeda dengan transistor biasa dalam cahaya itu disuplai ke area basis, yang mengontrol penguatan arus emitor-kolektor.

Tanpa banyak keberhasilan, LED dapat digunakan sebagai elemen fotosensitif. Sensitivitasnya terlalu kecil dan hanya dapat ditingkatkan dengan bantuan sirkuit tambahan.

Robot BEAM yang saya buat

Di robot saya, saya menggunakan berbagai fotodioda yang tidak diketahui asalnya. Video tersebut menunjukkan bahwa sensitivitas salah satunya lebih besar.
Salah satu fotodioda bereaksi terhadap pancaran remote control TV.
Selain itu, seluruh “isian” diisi dengan lem panas meleleh.
Saya harap Anda melakukannya lebih baik dan lebih cantik!

Daftar elemen radio

Penamaan Jenis Denominasi Kuantitas CatatanTokobuku catatan saya
VT1, VT3 Transistor bipolar

KT3102

2 KT315 Ke buku catatan
VT2, VT4 Transistor bipolar

KT361B

2 KT816