SHIROのIchigoJam日記

IchigoJamの電子工作とプログラミングをメインに

モールス符号変換

FacebookIchigoJam-FANグループで、モールス符号変換のプログラムを作った方がいたのですが、3スロット使う長いプログラムだったので、何とか短縮できないかと思って、私も作ってみました。
入力された1文字をモールス符号に変換する単機能プログラムですが、何とか1スロットに収まりました。

f:id:shiro0922:20190420232515p:plain

使い方

  • プログラムを実行すると、文字入力待ちになります。キーを押して1文字入力すると、それに対応したモールス符号を表示します。対応するのは、アルファベット、数字、カタカナ、記号の一部です。
  • ただしカタカナを入力すると、例えば「ア」はそのまま「ア」の符号が表示されますが、「カ」だと1ストローク目の「K」の符号と、2ストローク目で確定した「カ」の符号の2個が表示されます。また「バ」などの濁点・半濁点の文字は、「B」「ハ」「濁点」の3つの符号が表示されてしまいます。プログラム側で現在のキー入力モードを把握できないので、ご勘弁ください。

符号表

モールス符号は短点(・)と長点(-)の組み合わせでできていて、しかも1~6点の可変長です。
そのためプログラム内では、短点=1、長点=2、終了=0として3進数符号にして、それを10進数に変換したデータを設定しています。
(プログラムの都合で、3進数符号の1文字目→6文字目を、下位→上位で計算して10進数へ変換しています)
3進数符号で最大6桁になりますが、10進数に変換すると255を越えてしまうので、データ格納には2バイト必要です。
IchigoJam文字コード(256文字)の中で、モールス符号が割り振られている文字は118文字です(実際は一部が飛んでいるので若干少ない)。配列変数102個では足りないため、PCG領域(#700~#7FF)へ1文字2バイトずつデータを書きこんで使っています。
f:id:shiro0922:20190420231536p:plain

プログラム

1Kバイトギリギリなので、これ以上は機能が増やせません(^_^;)

1 CLS:?"*Morse Encode"
2 CLV:POKE#700,186,2,192,1,0,0,0,0,0,0
3 POKE#70A,124,0,228,1,158,0,132,2,148,0,151,0,180,2,96,2,125,2,149,0
4 POKE#71E,242,0,241,0,238,0,229,0,202,0,121,0,122,0,125,0,134,0,161,0,121,1
5 POKE#734,0,0,0,0,203,0,0,0,144,1,201,1
6 POKE#740,7,0,41,0,50,0,14,0,1,0,49,0,17,0,40,0,4,0,79,0,23,0,43,0,8,0,5,0,26,0,52,0
7 POKE#760,71,0,16,0,13,0,2,0,22,0,67,0,25,0,68,0,77,0,44,0
8 POKE#774,138,1,125,2,0,0,79,0,233,0,7,0,22,0,239,0,124,0,25,0,230,0,8,0,52,0,214,0
9 POKE#790,233,0,7,0,22,0,239,0,124,0,43,0,131,0,67,0,77,0,80,0
10 POKE#7A4,212,0,152,0,215,0,160,0,53,0,5,0,49,0,52,0,232,0,130,0
11 POKE#7B8,16,0,50,0,40,0,71,0,76,0,41,0,206,0,44,0,1,0,14,0
12 POKE#7CC,68,0,211,0,2,0,203,0,149,0,25,0,230,0,8,0
13 POKE#7DC,13,0,17,0,158,0,26,0,70,0,23,0,151,0,4,0,157,0
14 ?"CHR?=";
15 K=INKEY():IF K<33 || 223<K || (90<K && K<163) CONT
16 ?CHR$(K);" ";:K=K-33:IF K>128 K=K-72
17 A=#700+K*2
18 D=PEEK(A):E=PEEK(A+1):M=E*256+D
19 N=M%3:IF!N?:GOTO14
20 IFN=1?".";ELSE?"_";
21 M=M/3:GOTO19

Web版はこちら。

モールス符号は今回初めて扱いましたが、いろいろ勉強になりました。
昔の電信技術者は、よくこんな符号を考えましたね。

3D迷路-CK

先日発売された「IchigoCake BASIC」
hello002.stores.jp
を使って、3D迷路ゲームを作ってみました。
以前作った3D迷路の移植・拡張です。
2画面で遊ぶと、NINTENDO 3dsで遊んでいる気分になります(^_^)

f:id:shiro0922:20190415234225j:plain

遊び方

  • プログラム実行後に数秒待つと、Cake画面に迷路の3Dビュー、Jam画面に迷路のマップが表示されます。マップの左上からスタートして、右下のゴール「G」を目指してください。

f:id:shiro0922:20190416000509p:plain

  • 移動操作は、カーソルキー↑=前進、←=左を向く、→=右を向く、↓=後ろを向く、です。
  • マップは、自分が一度歩いた場所しか表示されません。まずは歩き回って迷路を探索しましょう。

f:id:shiro0922:20190416000446p:plain

  • ゴールした後は、何かキーを押すとリプレイします。やめる時はESCキーでプログラムを止めてください。

f:id:shiro0922:20190416000528p:plain

プログラム

コード容量が4Kバイトに増えたお陰でプログラムが1スロットに収まり、配列変数の個数が増えたので迷路エリアが1.5倍になりました。
※4/17修正:「UART 0」を指定して、PCコマンドのエラーを解決

1 '*3D-Maze CK
2 CLV:UART 0:VIDEO 0
3 [0]=9:FOR X=1 TO 13:[X]=1:NEXT:[14]=3
4 FOR Y=1 TO 9:[Y*15]=8:[Y*15+14]=2:NEXT
5 [150]=12:FOR X=1 TO 13:[150+X]=4:NEXT:[164]=6
6 [200]=226:[201]=225:[202]=227:[203]=224
7 SRND ANA()+TICK()
8 FOR Y=0 TO 9
9 PC.SOUND1 0,4,Y
10 FOR X=0 TO 13
11 @DIR
12 D=RND(4):IF D=0 && Y>0 GOTO @DIR
13 Z=X+Y*15
14 IF D=0 GSB @UP
15 IF D=1 GSB @RIGHT:IF D=-1 GOTO @DIR
16 IF D=2 GSB @DOWN:IF D=-1 GOTO @DIR
17 IF D=3 GSB @LEFT:IF D=-1 GOTO @DIR
18 NEXT:NEXT
19 PC.SOUND1 0,4,#FF
20 P=0:Q=0:D=1:[0]=[0]|16
21 VIDEO 1:GSB @3DV:GSB @MAP:GSB @PLAYER:CLT
22 @GLOOP
23 LC 25,23:?TICK()/60;
24 K=INKEY()
25 IF K<28 || K>31 GOTO @GLOOP
26 IF K=28 GSB @PLEFT
27 IF K=29 GSB @PRIGHT
28 IF K=30 GSB @PUP
29 IF K=31 GSB @PDOWN
30 GSB @3DV
31 GSB @PLAYER
32 WAIT 20:CLK
33 IF P<>14 || Q<>10 GOTO @GLOOP
34 LC 9,11:?"*** GOAL ***"
35 PC.SOUND 4,0,4,2,4,4,4,#FF:WAIT 30
36 PC.SOUND 4,6,4,1,4,4,4,#FF:WAIT 30
37 PC.SOUND 4,0,4,2,4,4,4,#FF:WAIT 30
38 PC.SOUND 4,#FF,4,#FF,4,#FF,4,#FF
39 CLK
40 IF !INKEY() CONT
41 RUN
42 @UP
43 [Z]=[Z]+2:[Z+1]=[Z+1]+8:RTN
44 @RIGHT
45 [Z+1]=[Z+1]+4:[Z+16]=[Z+16]+1:RTN
46 @DOWN
47 [Z+15]=[Z+15]+2:[Z+16]=[Z+16]+8:RTN
48 @LEFT
49 IF [Z]&4>0 D=-1:RTN
50 [Z]=[Z]+4:[Z+15]=[Z+15]+1:RTN
51 @PUP
52 H=P+Q*15:S=([H]>>D)%2:IF S RTN
53 LC P*2+1,Q*2+1:?CHR$(0)
54 P=P-(D=3)+(D=1):Q=Q-(D=0)+(D=2)
55 H=P+Q*15:[H]=[H]|16
56 U=P*2+1:V=Q*2+1
57 LC U,V:?CHR$(0)
58 N=[H]
59 IF N&1=0 LC U,V-1:?CHR$(0)
60 IF N&2=0 LC U+1,V:?CHR$(0)
61 IF N&4=0 LC U,V+1:?CHR$(0)
62 IF N&8=0 LC U-1,V:?CHR$(0)
63 RTN
64 @PLEFT
65 D=D-1:IF D<0 D=3
66 RTN
67 @PRIGHT
68 D=D+1:IF D>3 D=0
69 RTN
70 @PDOWN
71 D=D+2:IF D>3 D=D-4
72 RTN
73 @3DV
74 PC.CLEAR 11
75 PC.SOUND1 0,4,0
76 U=P:V=Q:E=21:F=15
77 GSB @CHECK:IF S GOTO @VEND
78 E=14:F=9:GSB @LWALL:GSB @RWALL
79 U=U-(D=3)+(D=1):V=V-(D=0)+(D=2):E=8:F=4
80 GSB @CHECK:IF S GOTO @VEND
81 PC.LINE 38,18,46,26,1
82 PC.LINE 46,18,38,26,1
83 @VEND
84 PC.SOUND1 0,4,#FF
85 RTN
86 @CHECK
87 N=[U+V*15]:S=(N>>D)%2
88 L=D-1:IF L<0 L=L+4
89 IF (N>>L)%2 THEN GSB @LWALL ELSE GSB @LROAD
90 R=D+1:IF R>3 R=R-4
91 IF (N>>R)%2 THEN GSB @RWALL ELSE GSB @RROAD
92 IF S GSB @WALL
93 RTN
94 @LWALL
95 IF S PC.LINE 42-F,22-F,42-F,22+F,1
96 PC.LINE 42-E,22-E,42-F,22-F,1
97 PC.LINE 42-E,22+E,42-F,22+F,1
98 RTN
99 @RWALL
100 IF S PC.LINE 42+F,22-F,42+F,22+F,1
101 PC.LINE 42+F,22-F,42+E,22-E,1
102 PC.LINE 42+F,22+F,42+E,22+E,1
103 RTN
104 @LROAD
105 IF !S PC.LINE 42-F,22-F,42-F,22+F,1
106 PC.LINE 42-E,22-F,42-F,22-F,1
107 PC.LINE 42-E,22+F,42-F,22+F,1
108 IF P=U && Q=V RTN
109 PC.LINE 42-E,22-E,42-E,22+E,1
110 RTN
111 @RROAD
112 IF !S PC.LINE 42+F,22-F,42+F,22+F,1
113 PC.LINE 42+F,22-F,42+E,22-F,1
114 PC.LINE 42+F,22+F,42+E,22+F,1
115 IF P=U && Q=V RTN
116 PC.LINE 42+E,22-E,42+E,22+E,1
117 RTN
118 @WALL
119 PC.LINE 42-F,22-F,42+F,22-F,1
120 PC.LINE 42-F,22+F,42+F,22+F,1
121 RTN
122 @MAP
123 CLS
124 FOR Y=0 TO 22
125 FOR X=0 TO 30:?CHR$(1);:NEXT:?
126 NEXT
127 FOR Y=0 TO 10:FOR X=0 TO 14
128 N=[X+Y*15]:W=(N>>4)%2
129 IF !W GOTO @NOWALK
130 U=X*2+1:V=Y*2+1
131 LC U,V:?CHR$(0)
132 IF N&2=0 LC U+1,V:?CHR$(0)
133 IF N&4=0 LC U,V+1:?CHR$(0)
134 @NOWALK
135 NEXT:NEXT
136 LC 29,21:?"G"
137 LC 20,23:?"TIME=";
138 RTN
139 @PLAYER
140 LC P*2+1,Q*2+1:?CHR$([200+D])
141 LC 0,23:?"X,Y=";P;",";Q;" ";
142 RTN

タイムカード警告装置

この4月から、職場の情報センターにタイムカードが設置されました。
が、これまで長らくタイムカードを打刻していなかったので、押し忘れ防止のために、IchigoJamで警告装置を作りました。

福野さんのブログ記事「IchigoJamで温度表示付きオリジナル時計作りに、245円の4KBメモリ&RTCモジュールが便利!」
fukuno.jig.jp
に書かれている、aitendoの時計モジュール「RTCモジュール [M3231]」
www.aitendo.com
と設定プログラムを使わせていただきました。

こうしたアンチョコ細工を簡単に作れるのが、IchigoJamのいい所ですね。
RTCモジュールも簡単に使えることがわかったので、今後の工作教室のネタとして考えたいと思います。

プログラム

あらかじめRTCモジュールに時刻を設定した後、事務所の出入り口へ赤外線センサーを向けておきます。

  • 出勤時間帯/退勤時間帯の間(8:45~9:00、17:45~19:00)
  • かつ、出入り口を人が通った時

に、ブザーで2秒ごとに警告音が鳴ります。
動作確認のため、赤外線センサーが人間を検知している最中は(時間帯を問わず)LEDが光ります。

10 '*Time Card Warning
20 CLV:CLS:CLT
30 LED 1:BEEP 10,30:WAIT 30:LED 0
40 @LOOP
50 GSB @TIMEREAD
60 CLS:?DEC$(H,2);":";DEC$(M,2);":";DEC$(S,2)
70 IF !IN(4) GOTO @LOOP
80 LED 1
90 T=H*100+M
100 IF 845<=T AND T<900 BEEP
110 IF 1745<=T AND T<1900 BEEP
120 WAIT 120:LED 0:GOTO @LOOP
130 @TIMEREAD
140 POKE #700,0
150 IF I2CR(#68,#700,1,#701,7) ERR
160 X=PEEK(#703)
170 H=X>>4*10+X&15
180 X=PEEK(#702)
190 M=X>>4*10+X&15
200 X=PEEK(#701)
210 S=X>>4*10+X&15
220 RTN

追記

「ブザーの音が小さい」という意見があったので、トランジスタ一石アンプ+100均スピーカーを付けて、ボリュームを上げました。