Продолжаем эксперименты. В прошлый раз мы просто зажигали и гасили светодиод. Но этого нам мало. Я же вообще себя представил где-то на корабле, вокруг волны бются, качает, чемоданы падают и всё такое. В общем, надо бы как-то пообщаться. Для этого издавна уже используется азбука морзе.
Ну на самом деле код бесхитростный - берём по нашим буквам последовательность точек и тире. Таким образом получаем последовательность, которую можно пускать на светодиод. Почему-то я решил, что неплохо бы ещё заодно и парсить эту последовательность в буквы, взял дерево с википедии и с него же строил карту соответствий точек и тире в буквы. Подробнее можно посмотреть тут. В общем, ничего сверхъестественного, не считая, как я обнаружил совсем недавно, что дерево и таблица в википедии не совпадают, но это уже проблемы данных.
Итак, вернёмся к нашим точкам и тире. По записям из той же вики. Длина точки это наша единица длины. Тире - это три точки. Между точками и тире пауза в одну точку и между словами пауза в 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 вроде бы, что-то древнее, но не самое простое.
Комментариев нет:
Отправить комментарий