Рассказывали тут про свои «робо-поделки» и я тоже решил поделиться своей.
Вдохновился я роботом Polulu 3pi. Но решил сделать своего, хотя как потом оказалось это сложнее и самое главное намного дороже. Но это мелочи )
Наковырял на различных форумах разные схемы: схема управления двигателями, схема управления ИК-датчиками и всё это дело завёл на МК AtMega8.
Вобщем-то получился вот такой зверек

Впереди два TSOP-а и 3 ИК-светодиода. Внизу 5 светодиодов и 5 фототранзисторов. Вобщем-то и за линиями следить может и препятствия обнаруживает.
Внутри еще немного о роботе, пара фотографий и видео
Очень много времени я на него убил. Много вечеров. Но зато теперь я знаю как травить монтажные платы, какое противное хлорное железо и как оно плохо отстирывается от одежды и какие нехорошие пятна оставляет на столе. Научился лудить и паять, хотя умел и раньше, но только после робота понял как правильно.
Но это всё мелочи ) Удовольствие от результата скрашивает всё.
Генерацией импульсов ИК для TSOP-ов занимается МК, так же он следит за ответами от них и управлением двигателями.
Сзади

и снизу

Все детали, моторы, датчики и т.д. расположены все вместе на монтажной плате.
Схему рисовал сам в кореле )

Моторчики стоят вот такие

А вот небольшое видео — правда на видео робот с небольшой доработкой — батареек стало больше.
На данный момент я немного заморозил работу над роботом. Времени не стало.
Но в ближайших планах его оживить и произвести некоторые улучшения.
1. поставить аккумуляторы (я уже их купил — от дект-телефонов — самое то), а то батарейки быстро садятся.
2. На вал каждого колеса я повешу колёсико и датчик от старой шариковой мышки. Таким образом я смогу отслеживать количество оборотов колеса и поворачивать колесо на нужный мне угол. Это позволит очень гибко управлять троекторией движения. Да… для этого мне придётся убрать несколько фототранзисторов… Вернее убрать придётся 4 и оставить один посередине. Но вобщем-то задачи двигаться по черной линии уже не стоит. Поэтому одной пары СД+ФТ хватит чтобы обнаруживать, например, край стола.
3. Сделать полноценное раздельное питание для МК и двигателей.
Собирал из кусков по мануалам, так что не судите строго :)
Я сам понимаю, что можно это сделать проще… Но я не программист, поэтому методом научного тыка )
Вдохновился я роботом Polulu 3pi. Но решил сделать своего, хотя как потом оказалось это сложнее и самое главное намного дороже. Но это мелочи )
Наковырял на различных форумах разные схемы: схема управления двигателями, схема управления ИК-датчиками и всё это дело завёл на МК AtMega8.
Вобщем-то получился вот такой зверек

Впереди два TSOP-а и 3 ИК-светодиода. Внизу 5 светодиодов и 5 фототранзисторов. Вобщем-то и за линиями следить может и препятствия обнаруживает.
Внутри еще немного о роботе, пара фотографий и видео
Очень много времени я на него убил. Много вечеров. Но зато теперь я знаю как травить монтажные платы, какое противное хлорное железо и как оно плохо отстирывается от одежды и какие нехорошие пятна оставляет на столе. Научился лудить и паять, хотя умел и раньше, но только после робота понял как правильно.
Но это всё мелочи ) Удовольствие от результата скрашивает всё.
Генерацией импульсов ИК для TSOP-ов занимается МК, так же он следит за ответами от них и управлением двигателями.
Сзади

и снизу

Все детали, моторы, датчики и т.д. расположены все вместе на монтажной плате.
Схему рисовал сам в кореле )

Моторчики стоят вот такие

А вот небольшое видео — правда на видео робот с небольшой доработкой — батареек стало больше.
Снимал, как полагается, на степлер...
На данный момент я немного заморозил работу над роботом. Времени не стало.
Но в ближайших планах его оживить и произвести некоторые улучшения.
1. поставить аккумуляторы (я уже их купил — от дект-телефонов — самое то), а то батарейки быстро садятся.
2. На вал каждого колеса я повешу колёсико и датчик от старой шариковой мышки. Таким образом я смогу отслеживать количество оборотов колеса и поворачивать колесо на нужный мне угол. Это позволит очень гибко управлять троекторией движения. Да… для этого мне придётся убрать несколько фототранзисторов… Вернее убрать придётся 4 и оставить один посередине. Но вобщем-то задачи двигаться по черной линии уже не стоит. Поэтому одной пары СД+ФТ хватит чтобы обнаруживать, например, край стола.
3. Сделать полноценное раздельное питание для МК и двигателей.
Исходник прошивки.
Собирал из кусков по мануалам, так что не судите строго :)
/************************************************ ПОЕХАЛИ *************************************************/ #include <avr/io.h> #include <avr/delay.h> #define F 8000.0 // F, несущая, Гц #define N 20L // N, количество импульсов в пачке #define S 2L // S, скважность пачек #define t (unsigned long)((1/F)*1000000.0/2.0) // t, длительность импульса, мкс #define Tp (unsigned long)(N*(t*2)) // Tp, длительность пачки, мкс #define Td (unsigned long)(Tp*(S-1)) // Td, задержка между пачками, мкс void init(void) { DDRD = 0x00; DDRB = 0xff; DDRC = 0xff; PORTB = 0xff; PORTC = 0xff; PORTD = 0xff; PORTB |= _BV(PB1); PORTB |= _BV(PB2); } void rMotorF(void) { PORTC &= ~_BV(PC4); // установить "0" PORTC |= _BV(PC2); // установить "1" } void lMotorF(void) { PORTC &= ~_BV(PC5); // установить "0" PORTC |= _BV(PC3); // установить "1" } void rMotorB(void) { PORTC &= ~_BV(PC2); // установить "0" PORTC |= _BV(PC4); // установить "1" } void lMotorB(void) { PORTC &= ~_BV(PC3); // установить "0" PORTC |= _BV(PC5); // установить "1" } void IRGenerate(void) { int i; for (i = 0; i < N; ++i) // Генерация сигналов ИК-светодиодов { PORTC |= _BV(PC1); _delay_us (t); PORTC &= ~_BV(PC1); _delay_us (t); } } int main(void) // начало основой программы { init(); PORTC |= _BV(PC0); PORTB |= _BV(PB0); while (1) { IRGenerate(); if (!(PIND & (1 <<PIND7))) // проверить сигнал от левого датчика { rMotorB(); // Правый мотор назад _delay_ms(50); } else { rMotorF(); // Правый мотор вперед _delay_ms(50); } _delay_us(Td); IRGenerate(); if (!(PIND & (1 <<PIND6))) // проверить сигнал от правого датчика { lMotorB(); // Левый мотор назад _delay_ms(50); } else { lMotorF(); // Левый мотор вперед _delay_ms(50); } _delay_us(Td); // } }
Я сам понимаю, что можно это сделать проще… Но я не программист, поэтому методом научного тыка )
