Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсак.docx
Скачиваний:
19
Добавлен:
10.02.2016
Размер:
352.67 Кб
Скачать

5 Розробка принципової схеми пристрою з вибором додаткових елементів

У якості драйвера двигунів використовується мікросхема L293D, входи якої приєднані до виводів мікроконтролера так, як показано на схемі. На схемі робота входи драйвера двигунів L293D підключені до виводів порту C мікроконтролера ATmega8, але їх можна підключити до будь-якого з портів мікроконтролера (при цьому буде необхідно внести зміни впрограммную частина, вказавши порт і безпосередньо його виводи відповідних рядках програми). У схемі використовується мікросхема TL499A. Саме вона дає можливість працювати схемі з необхідним рівнем стабільності. Забезпечення стабілізації напруги - один з найважливіших аспектів проектування пристроїв на мікроконтролерах.

Принципова схема пристрою вказана на рисунку 5.1.

Далі приведений список елементів, що використовуються у проекті:

- MOTOR A, MOTOR B – шагові двигуни;

- CR1 – кварцовий генератор на 16 МГц;

- 20 резисторів 150Ом;

- резистор 0,47Ом;

- два резистори 47Ом;

- два резистори 4,7кОм;

- чотири резистори 1кОм;

- резистор 30кОм;

- резистор 10кОм;

- мікроконтролери ATMega8, L293D, TL499A;

- два конденсатори ємністю 1000мкФ/ 6,3В;

- 10 конденсаторів ємністю 0,1мкФ / 50В;

- конденсатор ємністю 10 мкФ / 16В;

- конденсатор ємністю 220 мкФ / 16В;

- чотири кнопки;

- п’ять світлодіодів;

- катушка індуктивності 50 мГн.

Рисунок 5.1 – Принципова схема пристрою

6 Розробка алгоритму роботи пристрою з описом алгоритму

Для керування роботом, його треба запрограмувати. Для цього створюється спеціальна програма, яка потім завантажується в мікроконтролер.

Для розробки програмного алгоритму використовується середа WINAVR. Дана середа розробки містить у собі наступні компоненти:

Programmers Notepad – зручний редактор програміста та інтегрована середа розробки(IDE);

AVR GCC – компілятор мов C и C++ для AVR;

avr-libc – стандартна С бібліотека для використання з GCC;

avr-as - ассемблер для микроконтроллерів AVR;

AVRDUDE - программатор (программа для загрузки та вигрузки коду микроконтроллерів);

avrdude-gui – графічний інтерфейс користувача для AVRDUDE;

MFile – автоматичний генератор Make-файлів for AVR GCC;

GNU Binutils - утиліти для AVR (

GNU Debugger (GDB) - дебагер (відладчик) с інтерфейсом командного рядка;

Insight - дебагер (відладчик) с графичним інтерфейсом користувача;

AVaRICE (JTAG ICE interface) - программа для інтерфейсів Atmel JTAG ICE;

SimulAVR - симулятор GDB с подтримкою симулятора від AVR;

Нижче приведена програма для обертання двигунами вперед та назад

#include <avr/io.h>

/***************** Функція затримки ****************/

void delay(unsigned short ms) // Мінімальна затримка кварцем 8 МГц - 1 мс

{

unsigned short i, j, k; // оголошення змінних

for (i=0; i<ms; i++) // головний цикл формування затримки

for (j=0; j<185; j++) // побічний цикл формування затримки

k++; // довільна дія

}

/****************************************************/

int main(void) // початок головної програми

{

DDRC = 0xff; // всі виводи порту C сконфігурувати як виходи

while (1) { // Незкінченний цикл

// ---------- обертання двигунів вперед 1 сек ----------

PORTC |= _BV(PC1); // встановити "1" на лінії 1 порту C

PORTC &= ~_BV(PC2); // встановити "0" на лінії 2 порту C

PORTC |= _BV(PC3); // встановити "1" на лінії 3 порту C

PORTC &= ~_BV(PC4); // встановити "0" на лінії 4 порту C

delay(1000); // затримка 1 сек.

// --------------------------------------------------

// ---------- обертання двигунів назад 1 сек ----------

PORTC &= ~_BV(PC1); // встановити "0" на лінії 1 порту C

PORTC |= _BV(PC2); // встановити "1" на лінії 2 порту C

PORTC &= ~_BV(PC3); // встановити "0" на лінії 3 порту C

PORTC |= _BV(PC4); // встановити "1" на лінії 4 порту C

delay(1000); // затримка 1 сек.

// --------------------------------------------------

}

}

Рух прямо з поворотом

#include <avr/io.h>

/***************** Функція затримки ****************/

void delay(unsigned short ms) // // Мінімальна затримка кварцем 8 МГц - 1 мс

{

unsigned short i, j, k; // оголошення змінних

for (i=0; i<ms; i++) // головний цикл формування затримки

for (j=0; j<185; j++) // побічний цикл формування затримки

k++; // довільна дія

/****************************************************/

int main(void) // початок головної програми

{

DDRC = 0xff; // всі виводи порту C сконфігурувати як виходи

while (1) { // Незкінченний цикл

// ---------- обертання двигунів вперед 1 сек ------------

PORTC |= _BV(PC1); // встановити "1" на лінії 1 порту C

PORTC &= ~_BV(PC2); // встановити "0" на лінії 2 порту C

PORTC |= _BV(PC3); // встановити "1" на лінії 3 порту C

PORTC &= ~_BV(PC4); // встановити "0" на лінії 4 порту C

delay(1000); // ждем 1 сек.

// ----------------------------------------------------

// ---------- двигун M2 зупиняється на 0,5 сек ------

PORTC |= _BV(PC1); // встановити "1" на лінії 1 порту C

PORTC |= _BV(PC2); // встановити "1" на лінії 2 порту C

delay(500); // затримка 0,5 сек.

// ----------------------------------------------------

}

}

Рух двигунами з використанням фотодатчика

#include <avr/io.h>

int main(void) // початок головної програми

{

DDRC = 0xff; // всі виводи порту C сконфігурувати як виходи

DDRD = 0x00; // всі виводи порту D сконфігурувати як виходи

PORTD = 0xff; // встановити "1" на на всіх виводах порту D,

// вмикаються підтягуючи резистори

while (1) { // нескінченний цикл

// перевірка сигналів низького рівня від фотодатчиків

if (!(PIND & (1<<PIND1))) // перевірка "0" на лінії 1 порту D

{

// ---------- обертання двигунів вперед ----------

PORTC |= _BV(PC1); // встановити "1" на лінії 1 порту C

PORTC &= ~_BV(PC2); // встановити "0" на лінії 2 порту C

PORTC |= _BV(PC3); // встановити "1" на лінії 3 порту C

PORTC &= ~_BV(PC4); // встановити "0" на лінії 4 порту C

// --------------------------------------------------

}

else

{

// ---------- обертання двигунів назад ----------

PORTC &= ~_BV(PC1); // встановити "0" на лінії 1 порту C

PORTC |= _BV(PC2); // встановити "1" на лінії 2 порту C

PORTC &= ~_BV(PC3); // встановити "0" на лінії 3 порту C

PORTC |= _BV(PC4); // встановити "1" на лінії 4 порту C

// --------------------------------------------------

}

}

}

Програма для руху робота по лінії

#include <avr/io.h>

int main(void) // початок головної програми

{

DDRC = 0xff; // всі виводи порту C сконфігурувати як виходи

DDRD = 0x00; // всі виводи порту D сконфігурувати як виходи

PORTD = 0xff; встановити "1" на на всіх виводах порту D,

// вмикаються підтягуючи резистори

while (1) { // нескінченний цикл

// перевірка сигналів низького рівня від фотодатчиків

if (!(PIND & (1<<PIND1))) // перевірити "0" на лінії 1 порту D

{

// ---- вмикається лівий двигун, зупиняється правий -----

PORTC |= _BV(PC1); // встановити "1" на лінії 1 порту C

PORTC &= ~_BV(PC2); // встановити "0" на лінії 2 порту C

PORTC |= _BV(PC3); // встановити "1" на лінії 3 порту C

PORTC &= ~_BV(PC4); // встановити "1" на лінії 4 порту C

// -----------------------------------------------------

}

else

{

// ---- зупиняється лівий двигун, вмикається правий -----

PORTC &= ~_BV(PC1); // встановити "1" на лінії 1 порту C

PORTC |= _BV(PC2); // встановити "1" на лінії 2 порту C

PORTC &= ~_BV(PC3); // встановити "1" на лінії 3 порту C

PORTC |= _BV(PC4); // встановити "0" на лінії 4 порту C

// -----------------------------------------------------

}

}

}

Робот для змагань в кегльрінг

#include <avr/io.h>

/***************** Функція затримки ****************/

void delay(unsigned short ms) // Мінімальна затримка кварцем 8 МГц - 1 мс

{

unsigned short i, j, k; // оголошення змінних

for (i=0; i<ms; i++) // головний цикл формування затримки

for (j=0; j<185; j++) // допоміжний цикл формування затримки

k++; // довільна дія

}

/****************************************************/

int main(void) // початок головної програми

{

DDRC = 0xff; // всі виводи порту C сконфігурувати як виходи

DDRD = 0x00; // всі виводи порту D сконфігурувати як виходи

PORTD = 0xff; // встановлення "1" на на всіх виводах D,

// вмикаються підтягуючи резистори

while (1) { // нескінченний цикл

// перевірка сигналів низького рівня від фотодатчиків

if (!(PIND & (1<<PIND1))) // перевірка "0" на лінії 1 порту D

{

// -------------- ввімкнення двигунів вперед ---------------

PORTC |= _BV(PC1); // встановити "1" на лінії 1 порту C

PORTC &= ~_BV(PC2); // встановити "0" на лінії 2 порту C

PORTC |= _BV(PC3); // встановити "1" на лінії 3 порту C

PORTC &= ~_BV(PC4); // встановити "0" на лінії 4 порту C

// -----------------------------------------------------

}

else

{

// ------------------ від’їзд назад ------------------

// -------- ввімкнення двигунів назад на 1,8 сек --------

PORTC &= ~_BV(PC1); // встановити "0" на лінії 1 порту C

PORTC |= _BV(PC2); // встановити "1" на лінії 2 порту C

PORTC &= ~_BV(PC3); // встановити "0" на лінії 3 порту C

PORTC |= _BV(PC4); // встановити "1" на лінії 4 порту C

delay(1800); // затримка 1,8 сек.

// --------------------------------------------------

// --------------------- поворот --------------------

// правий мотор вперед, лівий мотор стоп на 0,6 сек

PORTC |= _BV(PC1); // встановити "1" на лінії 1 порту C

PORTC &= ~_BV(PC2); // встановити "0" на лінії 2 порту C

PORTC |= _BV(PC3); // встановити "1" на лінії 3 порту C

delay(600); // затримка 0,6 сек.

// --------------------------------------------------

}

}

}

Вимір дистанції

#include <stdlib.h> // перетворення типів даних

#include <soft_serout.h> // підтримка послідовного каналу

#include <sleep.h> // затримки

#include <analog.h> // підтримка АЛП

#define m 2933 // константа для перетворення дистанції в см

#define b 20

#define k 1

void main() // головна программа

{

unsigned char dec[4],dec2[4]; // для запису ascii після перетворення

unsigned int gp2=0,cm=0; // зчитування даних з АЛП

sleep(1000); // пауза 1 секунда

soft_serout_init(2,9600); // настройка послідовного порту 9600 8N1

while(1)

{

gp2 = analog(0); // читання

cm = (m/(gp2+b)) - k; // перетворення даних в см

utoa(gp2,dec,10); // перетворення Integer в десят. Ascii

utoa(cm,dec2,10); // перетворення Integer в десят. Ascii

serout_byte(2,0xFE);serout_byte(2,0x00); // очищення дисплею

serout_byte(2,0xFE);serout_byte(2,0x80); // задання адреси першого рядка

serout_text(2,"RAW Data= ");

serout_text(2,dec); // виведення даних Ascii

serout_byte(2,0xFE);serout_byte(2,0xC0); // задання адреси другого рядка

serout_text(2,"Distance= ");

serout_text(2,dec2); // виведення даних в см

serout_byte(2,0xFE);serout_byte(2,0xCE); //

// строки 14-й позиции

serout_text(2,"CM");

sleep(500);

}

}

Безконтактне уникнення перешкод

#include <stdlib.h> // перетворення типів даних

#include <motor.h> // управління двигунами

#include <sleep.h> // затримки

#include <sound.h>

#include <analog.h> // підтримка АЛП

void main() // головна программа

{

unsigned int sensor=0;

unsigned char i=0;

sleep(200); sound(4000,50); // запуск та звуковий сигнал

while(1)

{

sensor=0;

for (i=0;i<5;i++)

{

sensor=(sensor+analog(0)); // зчитування даних GP2D120 5 раз

}

sensor=(sensor/5); // усереднення

if (sensor>260) // до перешкоди < 8 см?

{

backward(50);sleep(800); // оминання перешкоди

s_left(50);sleep(600);

}

else

{

forward(50); // рух вперед

}

}

}

ВИСНОВКИ

В ході виконання даного курсового проекту було розроблено робота на базі мікроконтролера ATMega 8. Даний робот може рухатись по лінії, може використовуватись на змаганнях з «Кегльрінгу». Даний робот може бути вдосконалений в майбутньому.

Основними вдосконаленнями можуть бути підключення дистанційного пульту керування, також можна встановити датчики завад, а також можна змінювати програму керування роботом. Це дає можливість використовувати його у якості малюю чого робота, а також у якості танцюючого. Ці можливості можна реалізувати методом додання олівців до конструкції (для малюючого робота), а також підбору коду програми (для танцюючого робота).