пятница, 14 августа 2015 г.

Морзянка на Raspberry PI

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

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

Итак, вернёмся к нашим точкам и тире. По записям из той же вики. Длина точки это наша единица длины. Тире - это три точки. Между точками и тире пауза в одну точку и между словами пауза в 7 точек. Собственно, это и получилось:

(ql:quickload "gpio-sysfs")
(ql:quickload "morse")

(defparameter *pin* 27)
(defparameter *morse-time* 0.1)

(defun initialize ()
  (gpio:initialize-pin *pin* :out 0)
)


(defun wait (times)
  (sleep (* times *morse-time*))
)


(defun morse-dot ()
  (gpio:write-pin *pin* 1)
  (wait 1)
  (gpio:write-pin *pin* 0)
  (wait 1)
)


(defun morse-tire ()
  (gpio:write-pin *pin* 1)
  (wait 3)
  (gpio:write-pin *pin* 0)
  (wait 1)
)


(defun morse-word-letter (word-letter)
  (if word-letter
    (progn
      (map 'list
        (lambda (morse-letter)
          (ecase morse-letter
            (#\. (morse-dot))
            (#\- (morse-tire))
)
)
        word-letter)
      (wait 3))
    (wait 7)))

(defun morse-say (string)
  (let ((morse-struct (morse:to-morse string)))
    (mapcar
      (lambda (word-letter)
        (morse-word-letter word-letter)
)

      morse-struct
)

    nil
))

(initialize)
(morse-say "sos")
Теперь можно посылать различные сигналы вокруг. Например, писать, "Not enough minerals! Mine more minerals!". Выводы светодиода соединены к 27 пину GPIO. sbcl собран из исходников. Всё это работает на Raspberry PI B вроде бы, что-то древнее, но не самое простое.


Комментариев нет:

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