Паровозик из Ромашково, продолжение

January 27, 2012 by admin Комментировать »

Взять быка за рога — это круто: сразу начать паять, «программить». Но и быки не лыком шиты —

могут так наподдать, мало не покажется.

Поэтому оставим их в покое, мы не ковбои, и постараемся без спешки разобраться, что нужно сделать с «паровозиком и семафором». Для начала упростим задачу, отбросив обмен сигналами между ними. Положим, паровозик имеет устройство, которое раз в секунду отправляет инфракрасный  сигнал,  а  семафор  имеет  другое  устройство,  которое  постоянно  «смотрит»  на дорогу, а, увидев сигнал паровозика, зажигает зелёный свет на некоторое время, а затем вновь включает красный.

Теперь у нас две задачи для двух устройств. Пусть устройство для паровозика будет выполнено на PIC-контроллере. А устройство для семафора мы выполним на модуле Arduino.

Начнём с паровозика. Устройство «я свой» работает почти так же, как работают пульты управления телевизором, музыкальным центром или DVD-проигрывателем. Оно должно иметь излучатель ИК-сигнала. Для этой цели служит светодиод ИК диапазона. Но мы вначале испытаем красный светодиод АЛ307. Если «дальнобойности» этого излучателя не хватит, испытаем другой источник.

Пульты управления, работающие с инфракрасными излучателями, отправляют довольно сложные сигналы. При этом пульты разных производителей используют разные стандарты для кода управления. Однако почти все они, за редким исключением, излучают пачки импульсов, прерываемых паузами, на какой-то частоте в диапазоне от 20 кГц до 500 кГц. Используем частоту, её называют несущей частотой, 36-37 кГц, предполагая, что приёмник семафора мы построим с помощью микросхемы TSOP. Есть такая микросхема, в состав которой входит фотоприёмник, фильтр,  выпрямитель  и  компаратор.  Когда  TSOP  не  получает  сигнала  нужной  частоты,  на  его выходе высокий логический уровень. Когда сигнал приходит, на выходе микросхемы низкий логический уровень. Микросхема имеет три вывода: напряжение питания, выход и общий. Её легко будет подключить к модулю Arduino.

Теперь о сигнале, который будет излучать устройство паровозика. Мы не обязаны, как, впрочем и  производители  пультов  управления,  придерживаться  какого-либо  стандарта.  Поэтому используем простой код: импульсы с частотой 36 кГц в течение 4 миллисекунд, пауза 1 миллисекунда, импульсы в течении 1 миллисекунды, пауза 1 миллисекунда, импульсы в течение 2 миллисекунд. Вот и весь сигнал.

Из тех программ, о которых мы говорили, с PIC контроллерами работает программа VirtualBreadboard. Но в ней удобно проверить работу кода, но не писать код программы. Поэтому для написания кода используем версию mikroBasic Lite, которая имеет некоторые ограничения, но для нас сейчас не существенные. Найти эту версию можно на сайте производителя:

http://www.mikroe.com/eng/products/view/9/mikrobasic-pro-for-pic/.

После запуска программы создадим новый проект (Project-New Project…). В этом нам поможет помощник.

Рис. 9.1. Помощник создания нового проекта в microBasic

Нажимая клавишу «Next» проходим все этапы создания проекта: задание модели нашего контроллера, выбор тактовой частоты, имя проекта и место его хранения и т.д. Очень полезно поставить галочку в опции конфигурации.

Рис. 9.2. Опция задания слова конфигурации микроконтроллера

В этом случае, закончив с созданием проекта, это происходит, когда вы нажимаете клавишу

«Finish», вы попадаете в окно настройки конфигурации.

Я настраиваю микроконтроллер так, чтобы работал внутренний тактовый генератор, а всё остальное отключаю.

Рис. 9.3. Окно диалога создания слова конфигурации

Первое, что мне хотелось бы получить в программе – генерацию несущей частоты. Сначала рассчитаем период для частоты 36 кГц. Для этого разделим 1/36000, а результат дважды умножим на   1000,   чтобы   получить   ответ   в   микросекундах.   Это   около   27   микросекунд.   Значит   13 микросекунд – это половина периода.

Не мудрствуя лукаво, я открываю в примерах простую программу Blink, которую переделываю для себя. Выглядит она так:

Рис. 9.4. Рабочее окно программы microBasic

Оттранслируем программу (Build-Build). И полученный hex-файл используем в программе, мы о ней говорили, VBB.

Рис. 9.5. Добавление hex-файла в программе VBB

Будем считать, что получили несущую частоту около 36 кГц. Далее, многие предпочитают использовать таймеры и прерывания, но я не вижу в данном случае такой необходимости. Мне нужно вначале рассчитать, сколько раз помещается период несущей частоты в 1 миллисекунде. Разделим 1000 на 27 и получим 37. Теперь мы знаем, что для первой пачки импульсов нам нужно в 4 раза больше, то есть, 148.

Добавим цикл for в программу, который отсчитает нам нужное количество периодов несущей частоты.

Чтобы получить «правильную картинку», я подгоняю нужные значения. И эту пачку импульсов можно увидеть в VBB.

Рис. 9.7. Наблюдение за сигналом в логическом анализаторе VBB

Теперь можно сформировать полный сигнал.

И проверить его с помощью VBB. Для проверки я последнюю паузу уменьшаю до 10 мС  –

удобнее наблюдать результат.

Рис. 9.9. Проверка вида сигнала в VBB

Вот так должны выглядеть наши пачки импульсов. Можно было бы сейчас собрать макет, но наблюдать пачки импульсов на обычном осциллографе, если паузы между посылками импульсов в   1   секунду,   достаточно   сложно.   Поступим   иначе.   Отложим   это   до   того   момента,   когда определимся со вторым устройством.

Несколько слов о «подгонке» для получения картинки. В конечном счёте, когда устройство отправки кода будет собрано, нас будут интересовать длительности пачек импульсов. Выполняя определение   длительностей   на   языке   высокого   уровня,   мы   можем   получить   ошибочный результат, если не учтём, что для выполнения операции прохождения цикла процессору потребуется выполнить больше команд, чем нам кажется. Практически все команды языка высокого уровня после трансляции в машинные коды (операции для процессора) распадаются на несколько команд. А выполнение каждой из них требует времени. Поэтому общее время прохождения  цикла  может  оказаться  больше  ожидаемого,  а  при  большом  количестве  этих циклов… вы уже поняли, о чём я говорю. Так что, программирование устройства излучения кода для паровозика мы отложим до момента, когда сможем посмотреть полученный результат с помощью фотоприёмника, тогда и подправим длительности пачек импульсов окончательно.

Как мы уже говорили, в качестве фотоприёмника мы используем микросхему TSOP. Рекомендации по подключению микросхемы от производителя на рисунке ниже. Учтём их.

Рис. 9.10. Рекомендации производителя по подключению фотоприёмника TSOP

Однако до того, как начать работу над устройством приёма сигналов, я предлагаю посмотреть, что приходит с фотоприёмника TSOP, используя для этой цели модуль Arduino. Дело в том, что Arduino  имеет  встроенный  аналогово-цифровой  преобразователь.  Как  ясно  из  названия, последний преобразует аналоговый сигнал в цифровые данные. Если аналоговый сигнал – это только постоянное напряжение, то понятно, это напряжение переводится (каким-то образом) в цифровую форму. А когда аналоговый сигнал меняется? Аналогово-цифровой преобразователь

если бы это было постоянное напряжение. Последовательность таких «снимков» даёт последовательность цифровых данных. Программа на компьютере (или какой-то графический дисплей) может эти данные выводить в виде графика, как мы строим график кривой по точкам. В результате мы получим вид сигнала в таком виде, какой увидели бы на экране осциллографа. Мы используем компьютер и модуль Arduino в качестве осциллографа, чтобы посмотреть вид получаемого сигнала от фотоприёмника (когда, конечно, спаяем и запрограммируем передатчик!).

Программу для получения данных от модуля Arduino и построения кривой можно написать самостоятельно, очень интересная и полезная задача для освоения программирования, но можно, как это сделаю я, воспользоваться тем, что уже написано, что предназначено для работы с Arduino. Есть ряд готовых решений, из которых я выбираю:

http://www.compcar.ru/forum/showthread.php?t=4457

Код, загружаемый в модуль Arduino, можно скопировать на странице форума. Он невелик.

//oscilloscope

//http://compcar.ru

byte MyBuff[800];

unsigned int i=0;

void setup()

{

Serial.begin(115200);

}

void loop()

{

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

{

MyBuff[i] = analogRead(0)/4;

}

Serial.write(MyBuff,800);

}

А программа для компьютера, oscilloscope.exe, не требует установки. Её можно расположить, например, в своей папке, сделать ярлык на рабочем столе и запускать, подключив запрограммированный   модуль   Arduino.   У   модуля   используется   аналоговый   вход   А0.   Есть некоторые ограничения: напряжение на входе должно быть в диапазоне 0-5 В, не больше; и напряжение не должно быть отрицательным; верхняя рабочая частота, обозначенная автором программ, 4 кГц. Этого должно хватить для многих экспериментов. Вот как выглядит сигнал на мониторе, если коснуться рукой входа осциллографа.

Рис. 9.11. Работа одной из программ осциллографа на базе модуля Arduino

Это  наводки  с  частотой  50  Гц.  Думаю,  что  для  чтения  сигнала  с  фотоприёмника  этого

осциллографа  будет  достаточно.  Пришла  пора  спаять  передатчик  ИК  кода,  добавить фотоприёмник к осциллографу и посмотреть результат. Если понадобится, то подогнать длительность фрагментов полученного сигнала.

Перед  пайкой  воспользуемся  программой  Fritzing,  чтобы  нарисовать  необходимые подключения для проведения экспериментов и, возможно, для последующей работы с паяльником.

В программе Fritzing нет нужной мне микросхемы TSOP. Это неприятно, но не страшно – мы добавим нужное сами. Для рисования, а понадобится нарисовать микросхему, используем графический редактор Inkscape. Сам я, не художник я, признаюсь, чаще использую простейший графический редактор как Paint в Windows. Иногда использую Gimp (его аналог в Windows – Photoshop). Все эти графические редакторы работают как в Linux, так и в Windows. Но они, если я не ошибаюсь, не поддерживают формат svg векторной графики, а Inkscape для векторной графики и предназначен. Он тоже есть в версии для Windows, а скачать его можно: http://inkscape.org.

Для создания рисунка в векторном графическом редакторе я считаю, лучше всего использовать прототип, есть подходящий – voltage_regulator. Рисунок можно найти в папке программы Fritzing по адресу, показанному на рисунке:

Рис. 9.12. Рисунок элемента регулятора напряжения

Открыв этот файл в Inkscape, преобразуем его во что-то похожее на TSOP. Можно воспользоваться рекомендациями, которые даются на сайте программы Fritzing, попасть туда можно из раздела «Помощь» основного меню (программы Fritzing!), где есть пункт «Онлайн- руководство». Когда web-браузер откроет страницу руководства, то можно найти главу, которая называется «Creating Custom Parts». В этой главе подробно описывается, как создать свой элемент. Следуя советам, запускаем Fritzing, выбираем стабилизатор напряжения 7805 (в качестве прототипа), переносим его на макетную плату и заходим в раздел редактирования.

Рис. 9.13. Пункт редактирования элемента в программе Fritzing

Как  и  написано  в  руководстве,  щёлкаем  по  заголовку,  где  меняем  voltage_regulator  на

TSOP173x.

Рис. 9.14. Настройка рисунков для добавления нового элемента

Далее вы переходите к редактированию графики. Советую следовать всем рекомендациям руководства, конечно, если вся эта работа вам интересна. Я же только обозначу то, что делаю.

Загружаю в Inkscape рисунок стабилизатора из того места, о котором шла речь выше. В папке user программы Fritzing перед этим я создаю пустые папки с именами, которые видел в папке core. Далее, разгруппировав рисунок, удаляю ненужное, перемещаю, растягиваю и дорисовываю, используя средства графического редактора, всё необходимое, чтобы получить свой рисунок. Последнее, что я делаю, группирую объект, выделив его (Объект-сгруппировать). Сохраняю его в пользовательской  папке  как  простой  (есть  такой  формат)  svg  рисунок  с  именем tsop_breadboard.svg.

Рис. 9.15. Создание нового рисунка в программе Inkscape

Открываю файл иконки стабилизатора напряжения. Выделяю и удаляю всё. Второе окно графического редактора я не закрывал, поэтому выделяю картинку, щёлкнув по ней, копирую и вставляю   в   качестве   иконки.   Сохранив   эти   файлы,   я   могу  использовать   их   при   загрузке изображений в редакторе компонентов Fritzing.

Остаётся подправить и сохранить файл schematic. Не следует менять соединения, достаточно исправить  имена,  но  при  желании  можно  переделать  всё  полностью,  как  это  описано  в руководстве.

Теперь я готов заменить все изображения и сохранить объект как новый. При выходе из программы Fritzing я отказываюсь от сохранения проекта, но соглашаюсь сохранить новый объект.

При следующем запуске программы Fritzing на закладке «Mine» появляется новый элемент.

Рис. 9.16. Появление нового элемента на закладке Mine

И ничто уже не мешает нарисовать схему эксперимента по чтению кода с устройства передачи

ИК-команды, используя программу осциллографа и аналоговые возможности модуля Arduino.

Итак, вот вид эксперимента.

Рис. 9.17. Подготовка соединений для эксперимента

Так выглядит электрическая схема.

Рис. 9.18. Электрическая схема соединений модуля с фотоприёмником

А так может выглядеть печатная плата (хотя в данном случае она совсем лишняя сущность).

Рис. 9.19. Возможный вид печатной платы расширения модуля Arduino

Вместе с тем я рад, что потратил некоторое время на подготовку к эксперименту. Пока я занимался с  программой  Fritzing, я  понял,  что используя  программу осциллографа, о которой писал раньше, я попаду в ситуацию такую же, что и с обычным осциллографом: короткие пачки импульсов кода и длинная пауза между ними. Увидеть, а особенно разглядеть что-то будет, мне кажется невозможно. Что же делать?

Когда я просматривал использование модуля Arduino в качестве осциллографа, я видел ещё одну программу. От её применения меня остановило то, что файл для загрузки в модуль был не в формате языка Arduino, а был hex-файлом. То есть, файлом, предназначенным для загрузки с помощью программатора. Программа называется xoscillo:

https://code.google.com/p/xoscillo/

Но, если я раньше я отверг эту программу, то теперь ситуация изменилась – программа, возможно, решит проблему, без решения которой нет смысла проводить эксперимент. Прочитав всё, что сказано о работе программы и подготовке к её реализации на модуле Arduino, я скачал программу и hex-файл, загружаемый в модуль. Всё оказалось не так сложно, как это воображаешь, когда читаешь описание того, что нужно сделать. Хотя и там есть некоторые детали, которые приходится менять.

В корневой директории диска С:\ у меня есть копия программы Arduino. Она лежит в папке с именем  arduino.  В  корневую  же  директорию  я  копирую  файл  arduinooscillo.cpp.hex.  На  сайте xoscillo есть даже команда (её следует ввести после запуска в Windows командной строки), её можно скопировать и вставить в окно командной строки. Но приходится внести некоторые изменения (включая то, что виртуальный COM-порт для работы через USB у меня com5):

c:\arduino\arduino-0022\hardware\tools\avr\bin\avrdude -c stk500v1 -p m168

-P com5 -b 19200 -U flash:w:c:\arduinooscillo.cpp.hex:i -C

c:\arduino\arduino-0022\hardware\tools\avr\etc\avrdude.conf

Какие изменения я вносил в команду, скопированную с сайта? Конечно, я изменил путь к файлу avrdude, убрал перед этим файлом в команде всё, что было до папки bin. Кроме этого я добавил после hex-файла опцию :i и указал полный путь к файлу конфигурации avrdude.

После этого команда полностью выполняется и не даёт ошибок, которые я получал, пытаясь использовать команду с сайта. И, конечно, модуль Arduino я подключил до выполнения команды.

Рис. 9.20. Выполнение команды в командной строке для загрузки hex-файла

Сама программа xoscill лежит у меня на рабочем столе в папке с этим же именем. Открыв эту папку, я запускаю программу обычным образом. В разделе «File» основного меню выбираю «New Arduino».

Рис. 9.21. Запуск программы осциллографа

И через некоторое время появляется следующее:

Рис. 9.22. Подключение программы к модулю Arduino

У модуля Arduino, подготовленного мною к предыдущим опытам, есть вывод от аналогового входа A0. Коснувшись его рукой, я получаю картину наводок.

Рис. 9.23. Вид наводок на экране осциллографа на базе модуля Arduino

Когда я убираю руку от вывода, картинка замирает. Теперь я могу её сохранить: «File-Save as…», имя и место сохранения я ввожу сам. Позже я могу, запустив программу, открыть этот файл и ещё раз внимательно рассмотреть получившуюся диаграмму.

Пока я не вполне освоился, и для выхода из программы я нажимаю обычный значок «закрыть» и ещё раз касаюсь рукой вывода аналогового входа. Программа закрывается. Я вновь открываю программу,  но  в  этот  раз  загружаю  файл,  который  перед  этим  сохранил.  Да,  я  могу  его просмотреть ещё раз. Я могу изменить, выбрав новый, интервал времени деления.

Рис. 9.24. Выпадающий список времени отсчёта

Полагаю, эта программа будет удобнее, и она позволит мне провести нужный эксперимент,

чтобы увидеть на выходе фотоприёмника сигнал, передаваемый устройством излучения ИК-кода.

Я потратил некоторое время на работу с первой программой осциллографа. Это так. Но она проще и позволяет наблюдать периодические сигналы, что тоже может понадобиться. Я потратил некоторое время, разбираясь с тем, как использовать вторую программу виртуального осциллографа, но она решает мои проблемы. Более того, открою вам ещё одну тайну – теперь, используя метод записи в Arduino hex-файла для осциллографа, вы (и я за компанию) можете создать такой файл, например, в программе AVRStudio, а загрузить в модуль Arduino с помощью утилиты avrdude.

И ещё одно, что осталось для меня интересным – будет ли этот осциллограф работать в Linux?

На сайте проекта моё внимание привлекло то, что программа работает и в Windows, и в Linux. С примечанием  об  использовании  Mono.  И  впрямь,  программа  работает.  И,  что  более  всего приятно, что всё просто. В ALTLinux 5.1 и Fedora 14 Mono оказалось установлено со всеми необходимыми библиотеками и приложениями. Достаточно было использовать команду:

mono /home/vladimir/Xoscillo/XOscillo.exe

Программа xoscillo  у  меня  в домашней папке.  Создав команду запуска (в  Windows ярлык), можно запустить осциллограф, получить осциллограмму, сохранить её и рассмотреть при следующем запуске xoscillo.

Рис. 9.25. Работа программы осциллографа в дистрибутиве Fedora 14

В openSUSE прошло  не так гладко – я попытался  загрузить только ядро Mono, но этого не хватило для работы осциллографа, поэтому, не хватило и у меня терпения, я установил mono- complete, объём, конечно, больше, но загрузка решает все проблемы.

Что осталось сделать? Спаять, запрограммировать PIC-контроллер и проверить ИК-код. Перед программированием PIC-контроллера, поскольку я использую макетную плату, оставшуюся от предыдущих экспериментов, где установлена панелька для микросхемы, и где есть светодиод, транзистор и резистор, мне проще заменить в программе вывод B0 на A0, как это сделано на макете…

Макетная плата передатчика ИК-кода готова и красный светодиод АЛ307, который я использую при прямом токе 40 мА (средний за период ток меньше), раз в секунду мигает. К модулю Arduino подключён фотоприёмник, выход которого соединён с аналоговым входом A0. Запускаем программу  осциллографа,  для  проверки  я  делаю  это  в  Windows  и  в  openSUSE,  и  наблюдаем сигнал.

Кстати, используя обычный светодиод, я заинтересован в определении расстояния, с которого сигнал «видит» фотоприёмник. Сейчас это примерно 10-15 см. Если дальности не хватит, можно будет разбить сопротивление, последовательно установленное со светодиодом, на два, сумма сопротивлений которых равна первоначальному, и одно из сопротивлений зашунтировать конденсатором. Это увеличит дальность считывания сигнала (вернее, увеличит «дальнобойность» светодиода за счёт того, что появится короткий импульс большего тока).

Рис. 9.26. Работа программы осциллографа в openSUSE

Напомню, что фотоприёмник TSOP в отсутствии несущей частоты на выходе поддерживает высокий уровень, а при наличии несущей переходит в состояние низкого логического уровня.

Осциллограмма похожа на то, что я ожидал бы, если бы не два момента: я не вижу первой пачки импульсов; времена вдвое меньше ожидаемых.

Я могу предположить, что осциллограф запускается несколько позже, чем при приходе первой пачки импульсов. Так ли это? Ответ я могу получить, изменив программу излучения так, чтобы интервалы между кодами были меньше, не 1 секунда, а, скажем, 10 миллисекунд. Посмотрим, как выглядит такой вариант.

Рис. 9.27. Проверка приёма пачек импульсов сигнала фотоприёмником

Теперь все пачки импульсов на месте, а времена… я не калибровал осциллограф Xoscill. Можно, конечно, это сделать сейчас, но можно отложить до того времени, когда возникнут проблемы с работой приёмного устройства. Если они возникнут.

Источник: Гололобов В. – С чего начинаются роботы. О проекте Arduino для школьников (и не только) – 2011

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты