TSOP от BEAM’а к МК

Погода, несмотря на лето, стоит не летная и поэтому я оставил на время свой хеликоптер и решил заняться чем-нибудь передвигающимся непосредственно по планете (или ее части — полу в квартире, в которой я обитаю).

      

А сподвигнула меня на это темка в робофоруме про одного маленького, но интересного робота. Он beam, основан на двух типах логических схем, драйвере L293 и TSOP’ах.  Как мне казалось — затраты минимальны, а эффект обещает быть высоким.)

Еще я впервые встретил термин «beam-робот», и это направление в робототехнике меня очень привлекло. Макетка моя (как видно из заглавной картинки к посту) была занята и поэтому отладить схему я не мог, решил сразу заЛУТить, и это было моя главная ошибка. Косяков…, не перадть какое количество, естстно ничего не заработало, моторы вращались как хотели, препятствий он не видел. В общем решил я перенести с макетной платы все мои наработки и собрать их в подобие отладочной площадки для 32-ой  меги, а заодно и робоконтроллера. в результате получился вот такой девайс:

Содержит в себе следующее:

  •  посадочное гнездо по ATmega32-PU;
  • посадочное гдездо драйвера двигателей L293D;
  •  logic level converter, для связи с  BT модулем;
  • две кренки 5 и 3,3В;
  • продолжения» выводов МК и т.д.

Тактируется мега от кварца 16МГц, имеется разъем программирования, выводы, на которых реализована аппаратная ШИМ, дополнительно выведены на разъемы, удобные для подключения серв. В МК зашит bootloader, поэтому сейчас я программирую через последовательный порт, организованный «без веревок» по средствам bluetooth. А к этому контроллеру из деталей моего неудавшегося beam-бота я спаял ИК-датчик препятствий (дизайн на основе этой разработки, а так все по даташиту). Выглядит модуль так:

 Сенсором в нем является TSOP, цифровой фотоприемник, который воспринимает отраженное от препятствия излучение ИК светодиодов. Но не просто излучение, а модулированный сигнал с частотой, в моем случае, 36 кГц. Поэтому этот датчик съел один из четырех ШИМ выводов меги, что для тестов пойдет.

Немного по тестовой программе. Для того, чтобы датчик препятствий заработал, необходимо сгенерить на ножке  PD7 (в моем случае), с помощью таймера микроконтроллера T2 импульсы нужной частоты. Когда отраженный сигнал попадает на приемник TSOP на входе PC0 появляется логический 0 (до этого TSOP выдает высокий уровень сигнала). Одновременно загорается светодиод-индикатор на выводе PD6. Код программы прост:

#include <avr/io.h>//библиотека ввода/вывода
#include <stdio.h>//Библиотека функций
#include <util/delay.h>//Библиотека функций задержки
#include <avr/interrupt.h> //Библиотека прерываний
 
/*--Основная программа-----------------------------------------------*/
int main(void)
{ 
 
 DDRC = 0<<PC0;  //Инициализация порта PC0 как входа
 PORTC = 1<<PC0; // вход с подтяжкой к +
 DDRD = 1<<PD6|1<<PD7; // порты PD6 и PD7 как выводs
 /*-----Настройка таймера Т2--------
режим СТС, предделитель 1, сигнал на PD7 меняется на противоположный--*/
 TCCR2 = 1<<FOC2|1<<WGM21|1<<COM20|1<<CS20;
 OCR2 = 222; // формирует частоту 36кГц (формула расчета в даташите)
// бесконечный цикл
  while (1)
  {
    //если TSOP "сработал" светодиод зажигаем
    if (PINC & _BV(PC0)) {
        PORTD = 0<<PD6;
    }
    // если нет - гасим
    else {
        PORTD = 1<<PD6;
    };
  }
  _delay_ms(200);
 return 1;
}
#include <avr/io.h>//библиотека ввода/вывода
#include <stdio.h>//Библиотека функций
#include <util/delay.h>//Библиотека функций задержки
#include <avr/interrupt.h> //Библиотека прерываний

/*--Основная программа-----------------------------------------------*/
int main(void)
{ 

 DDRC = 0<<PC0;  //Инициализация порта PC0 как входа
 PORTC = 1<<PC0; // вход с подтяжкой к +
 DDRD = 1<<PD6|1<<PD7; // порты PD6 и PD7 как выводs
 /*-----Настройка таймера Т2--------
режим СТС, предделитель 1, сигнал на PD7 меняется на противоположный--*/
 TCCR2 = 1<<FOC2|1<<WGM21|1<<COM20|1<<CS20;
 OCR2 = 222; // формирует частоту 36кГц (формула расчета в даташите)
// бесконечный цикл
  while (1)
  {
  	//если TSOP "сработал" светодиод зажигаем
	if (PINC & _BV(PC0)) {
		PORTD = 0<<PD6;
	}
	// если нет - гасим
	else {
		PORTD = 1<<PD6;
	};
  }
  _delay_ms(200);
 return 1;
}

На сегодняшний момент модули которые имеются:

Небольшое видео работы. На нем виден косяк такого датчика — не распознает черное, поэтому в готического цвета препятствия будет въезжать.) Так же видно фиолетовое свечение ИК светодиодов, особенности матрицы фотика — чувствительность к этому спектру (в отличии от нашего глаза), что здорово — очень помогает в определении работоспособности.

Скоро сделаю отдельно модуль генератор для  ИК светодиодов, и попробую собрать из всего этого первого робота.

Запись опубликована в рубрике AVR, Разработки. Добавьте в закладки постоянную ссылку.

         
Подписаться на новые статьи блога:

Один комментарий: TSOP от BEAM’а к МК

  1. Уведомление: Проект мини-сумо бота | Skab in Sky

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.