温度の通信ができたので気をよくして、他に何か通信したくて、なんと無謀にもモールス信号に挑戦しようと考えた。
今回のルール
- 通信文字はアルファベット(A - Z)
- 2 つのボタンでトン・ツーを表現する (A ボタン - トン、B ボタン - ツー)
- 文字と文字の間は振る
- AB ボタンを両方押したら単語の終了、送信
むむ、配列の初期値設定は
変数の定義と、配列の値設定で 2 要素の設定はできるのだが、アルファベットの 26 個分設定したい。
結局ベースをブロックで作って、Javascript 側に変換して、コードを記述する方法で対応した。
アルファベットとモールス信号の対応表
2 つの配列を作って、それぞれに文字を設定して、要素の番号で同期させるようにする
モールス符号 | アルファベット |
---|---|
AB | A |
BAAA | B |
BABA | C |
BAA | D |
A | E |
AABA | F |
BBA | G |
AAAA | H |
AA | I |
ABBB | J |
BAB | K |
ABAA | L |
BB | M |
BA | N |
BBB | O |
ABBA | P |
BBAB | Q |
ABA | R |
AAA | S |
B | T |
AAB | U |
AAAB | V |
ABB | W |
BAAB | X |
BABB | Y |
BBAA | Z |
コードはこうなった
let mWord: string[] = []
let mList = ""
let mAlpha: string[] = []
let mCount = 0
let mInWord = ""
input.onButtonPressed(Button.A, () => {
mList = "" + mList + "A"
})
input.onButtonPressed(Button.B, () => {
mList = "" + mList + "B"
})
input.onButtonPressed(Button.AB, () => {
basic.showString(mInWord)
radio.sendString(mInWord)
mInWord = ""
mList = ""
})
radio.onDataPacketReceived( ({ receivedString: mInWord }) => {
basic.showString(mInWord)
})
input.onGesture(Gesture.Shake, () => {
basic.showString(mList)
for (let mCount = 0; mCount <= 25; mCount++) {
if (mList == mWord[mCount]) {
mInWord = "" + mInWord + mAlpha[mCount] + ""
}
}
mList = ""
})
mAlpha = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
mWord = ["AB", "BAAA", "BABA", "BAA", "A", "AABA", "BBA", "AAAA", "AA", "ABBB", "BAB", "ABAA", "BB", "BA", "BBB", "ABBA", "BBAB", "ABA", "AAA", "B", "AAB", "AAAB", "ABB", "BAAB", "BABB", "BBAA"]
mList = ""
mInWord = ""
mCount = 0
radio.setGroup(1)
basic.forever(() => {
})
ブロックエディタ側だと結構複雑っぽかったが、コードはなんかシンプル
動かしてみた
先に、H(AAAA) シェイク E(A) シェイク L(ABAA) シェイク L(ABAA) シェイク O(BBB) シェイク で HELLO の単語は作ってあり、最後に ABボタンを押して転送するところだけ動画になっています。
余談
もくもく会で作っていたら、同じ無線グループ番号を使っていて、意図しない通信が発生するというハプニングが発生した
が、怪我の功名で、同じ無線グループ番号送信用 micro:bit を複数用意すれば、いろんなコントロールもできるんじゃね?的な発想に発展し、たぶんこれで micro:bit リモコンタンクを作ってくれるだろうと期待 ( 他力本願 )
なお、次回のもくもく会は 2018年1月30日 です!