07.11.2008

Читалка СМП на Arduino

Мне удалось заполучить LilyPad Arduino Main Board (полную историю про это читайте здесь), с микроконтроллером ATMega168V и способ быстро подключить его к СМП МПО-10. В итоге получилась читалка/писалка СМП через USB. Ингредиенты этого рецепта:
  • Arduino Board
  • Свободный USB-порт
  • Вилка PLS-6R и 5 проводков для подключения СМП
  • ПО: Arduino IDE, FTDI drivers, Perl с модулем Win32::API, модули Win32::SerialPort, Win32::CommPort
  • Результаты моей работы - программа-sketch для Arduino Board + скрипт на Perl
Теперь разберем последовательно (по шагам):

1. Надо достать Arduino. Плата LilyPad Arduino Main Board попалась мне почти случайно, в основном я купился на возможность приехать с наличными и тут же получить товар. К ней необходим USB Serial Converter, который надо правильно соединить с Arduino 4-х пиновым кабелем минимальной длины. Если вам повезло, и в вашем распоряжении полноценная Arduino-совместимая плата, то к ней ничего не надо - там USB есть прямо на плате.

В моем случае, это выглядит так:


2. Подключите СМП к цифровым входам Arduino (номера pin-ов на СМП согласно картинке, а на Arduino они подписаны):



СМПНазначениеArduino
2Vcc +5V"+5V"
3CLOCKPin 7
4DATAPin 6
5SELECTPin 5
6Gnd"-"

Замечание: батарею (1-ый пин СМП) никуда не подключаем, пины Arduino - цифровые (не путать с аналоговыми).

3. Скачайте и установите Arduino IDE. Попутно установятся драйвера USB-чипа и в системе появится виртуальный COM-порт, его номер надо запомнить.

4. Запустите Arduino IDE. При первом запуске надо установить номер COM-порта из п.3, а также тип платы. Теперь можно открыть исходник (или sketch, "набросок") с моей программой чтения/записи СМП (sketch_081102b.pde в отдельном подкаталоге). Откомпилируйте (клавиша со стрелкой) и загрузите результат в Arduino (нажать кнопку сброса на плате, не позже 5-ти секунд после этого - датйте Arduino IDE команду Upload). Если все в порядке, микропрограмма стартует и зажжет на Ardino тестовый светодиод (подключен к 13-му цифровому выходу).

5. Установите Perl. Для Windows можно воспользоваться дистрибутивом ActiveState Perl. Установить модуль Win32::API через ppm. Далее скачать со CPAN Win32::SerialPort, распаковать в текущий каталог (на всякий случай, я включил его в архив с моей программой).

6. Впишите номер COM-порта (см. п.3) в мой скрипт (в самом начале, переменная $com_number). Например, если у вас FTDI-драйвера "уселись" на COM13, пишите $com_number = 13;

7. Подключите СМП к Arduino, затем Arduino к USB.

8. Запускайте скрипт:

arduino_smp.pl read MK90.BIN

Если все нормально, то через несколько секунд вы получите файл с бинарным имиджем СМП, который можно подключать к эмулятору МК90. Если вместо read написать write, то файл будет записан и прочитан для проверки. Запускать ее до готовности Ardino не имеет смысла, а если прервали по Ctrl-C - не забудьте сбросить Arduino, все-таки sketch крайне примитивный.

Я экспериментировал на скорости 38400, это можно изменить. Меняйте константы в скрипте и в sketch-е одновременно (устанавливайте одинаковые скорости!). При написании sketch-а использованы исходники программы чтения/записи by Piotr Piatek (правда в одном месте пришлось поправить), за что ему отдельное спасибо, потому что, на самом деле, я просто адаптировал его работу для Arduino.

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

6 комментариев:

  1. делаю всё по инструкции, использую freeduino serial 2.0
    Не получается ни считать, ни записать. В чём может быть проблема? смп исправный вроде

    ОтветитьУдалить
  2. Трудно сказать. А что на входящих от СМП линиях? При чтении хоть что-то меняется?

    ОтветитьУдалить
  3. при чтении создаётся пустой bin, arduino при запуске скрипта на чтение/запись перезагружается
    Вот что скрипт пишет:
    C:\Users\Wersety\Desktop\arduinosmp>arduino_smp.pl write SMP0.BIN

    Arduino SMP Reader/Writer v1.0

    Current COM1 settings: B = 38400, D = 8, S = 1, P = none, H = none

    ОтветитьУдалить
  4. Ну, то, что оно перезагружается - понятно. Порт открывается, дергается DTR.

    Советую perl-овый скрипт под отладчиком пройти - perl с ключом -d.

    ОтветитьУдалить
  5. Через отладчик заработал, пишет/читает. Спасибо!

    ОтветитьУдалить
  6. Значит, Arduino не успевает стартовать после сброса, прежде чем PC начинает обмен... Это можно решить задержкой после открытия порта или сделать протокол обмена более интеллектуальным.

    Каюсь :( Вместо доработки я просто сделал SMPReaderUSB.

    ОтветитьУдалить