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. Даний робот може рухатись по лінії, може використовуватись на змаганнях з «Кегльрінгу». Даний робот може бути вдосконалений в майбутньому.
Основними вдосконаленнями можуть бути підключення дистанційного пульту керування, також можна встановити датчики завад, а також можна змінювати програму керування роботом. Це дає можливість використовувати його у якості малюю чого робота, а також у якості танцюючого. Ці можливості можна реалізувати методом додання олівців до конструкції (для малюючого робота), а також підбору коду програми (для танцюючого робота).