Hatena::ブログ(Diary)

SHIROのモバイル日記 RSSフィード Twitter

2017-02-22

[]メンデル遺伝法則

中学校理科で習う、エンドウマメの「メンデル遺伝法則」をシミュレートするプログラムです。
Facebookの「プログラミングで学ぶ」教材研究グループ(非公開)に掲載された同様のプログラムが面白かったので、IchigoJamで作ってみました。

f:id:shiro0922:20170222235107p:image

  • 起動すると、エンドウマメの親世代P「(AA)[aa]」と、その交配で生まれる子世代F1「(Aa)(Aa)」、その交配で生まれる孫世代F2「(AA)(Aa)(aA)[aa]」が表示されます。
  • 「( )」で囲まれたマメは丸いマメ、「[ ]」で囲まれたマメはしわのマメを表します。
    エンドウマメでは丸いマメの遺伝子「A」が優性、しわのマメの遺伝子「a」が劣性で、優性の「A」を1個でも持つと劣性の「a」の機能は覆い隠されて丸いマメになります。劣性遺伝子が2個そろった「aa」だけがしわのマメになります。
  • 世代Pの交配「(AA)×[aa]」では、それぞれから1個ずつ遺伝子をもらった子世代F1は全て「(Aa)」となり、丸いマメになります。
    世代F1の交配「(Aa)×(Aa)」では、それぞれから1個ずつ遺伝子をもらった孫世代F2は、「(AA)(Aa)(aA)[aa]」の4種類が生じ、丸いマメとしわのマメの数は3:1の比率になります。
  • スペースキーを押すと、子世代F1の交配で孫世代F2が1個生まれ、その数が下段に表示されます。スペースキーを何度も押して孫世代F2がたくさん生まれると、丸いマメとしわのマメの数はだんだん3:1の理論値に近づいていきます。

プログラムリストはこちら。

10 '*Mendelian inheritance
20 CLV:CLS
30 SRND TICK()+ANA(2)
40 ?"*P (AA)x[aa]"
50 ?:?
60 WAIT 60
70 ?"*F1 (Aa)x(Aa)"
80 ?:?
90 WAIT 60
100 ?"*F2 (AA) (Aa) (aA) [aa]"
110 GSB 270
120 '@LOOP
130 IF !BTN(SPACE) CONT
140 BEEP
150 M=RND(2)
160 F=RND(2)
170 LC 10+M,4:?CHR$(227)
180 LC 15+F,4:?CHR$(227)
190 WAIT 30
200 D=M*2+F
210 [D]=[D]+1
220 GSB 270
230 WAIT 30
240 LC 10+M,4:?" "
250 LC 15+F,4:?" "
260 GOTO 120
270 '@PRTF2
280 A=0
290 FOR I=0 TO 3
300 LC 5+I*5,7:?[I]
310 A=A+[I]
320 NEXT
330 B=[3]
340 A=A-B
350 LC 9,9:?"(";A;")"
360 LC 19,9:?"[";B;"]"
370 RTN
MixJuiceでもダウンロードできます。
?"MJ GET comich.net/ichigojam/mendel.txt"

2017-02-19

[]素数さがし

再び教育っぽいネタ。いわゆる「エラトステネスのふるい」で素数を探すプログラムです。
f:id:shiro0922:20170219010954p:image:w480

f:id:shiro0922:20170219010953p:image:w480

  • 実行すると、画面に「1234567890123…」と数字が表示されます。1行目が1〜30、2行目が31〜60、3行目が61〜90…と30ごとに1の位の数を表示しています。最後は690までです。
  • エラトステネスのふるいを始めます。まず1は素数ではないので消します。次に2を残して2の倍数を消します。次に3を残して3の倍数を消します。次に5を残して5の倍数を消します。…と、残っている数の最小のものを残して、その倍数を消す作業を、690の半分・345までくり返します。
  • 消されずに残った数が素数です。画面がビューモードになって、カーソルが左上の「2」で点滅します。矢印キーでカーソルを上下左右の素数に移動できます。カーソル位置の実際の数は、画面左下に表示されます。

素数探し(ふるい分け)はIchigoJamが10数秒でやってくれます。今は素数探索をコンピュータ計算で行っているので、その一端を知るにはいいんじゃないでしょうか。
また、690までの範囲でどんな素数があるか、見てみるとなかなか興味深いです。
例えば素数が出てくる間隔は、「数が大きくなるに連れて広がっていくんじゃないか?」と思いますが、実際はそうでもありません。この範囲で一番間隔が広いのは523と541で18差。その後でも、569と571、641と643など、隣り合う奇数素数の所がいくつかあります。
この「素数の分布・規則性」は、100万ドルの賞金がかかった数学の難問「リーマン予想」につながる問題で、長年研究されていますがまだ解明されていません。

プログラムリストはこちら。

10 'Sosuu:Sieve of Eratosthenes
20 CLV:CLS
30 FOR C=0 TO 9:FOR B=0 TO 7
40 A=C*8+B
50 POKE #780+A,~PEEK(#180+A)
60 NEXT:NEXT
70 FOR I=0 TO 660 STEP 30
80 FOR J=1 TO 30
90 ?J%10;
100 NEXT
110 ?
120 NEXT
130 LC 0,0:?"*";
140 S=2
150 '@SLOOP
160 LC 0,23:?S;" É ÊÞ²½³";
170 M=1
180 '@NLOOP
190 M=M+1:N=S*M
200 IF N>690 GOTO 230
210 GSB 510:LC X,Y:?"*";
220 GOTO 180
230 '@NEND
240 GSB 530
250 IF S<346 GOTO 150
260 LC 0,23:?" ";
270 N=2
280 '@VLOOP
290 V=0:GSB 580
300 IF BTN(LEFT) GSB 390
310 IF BTN(RIGHT) GSB 460
320 IF BTN(UP) GSB 370
330 IF BTN(DOWN) GSB 440
340 V=1:GSB 580
350 WAIT 10
360 GOTO 280
370 '@NUP
380 N=N-29
390 '@NLEFT
400 N=N-1:IF N<1 N=N+690
410 GSB 510
420 IF SCR(X,Y)=42 GOTO 390
430 RTN
440 '@NDOWN
450 N=N+29
460 '@NRIGHT
470 N=N+1:IF N>690 N=N-690
480 GSB 510
490 IF SCR(X,Y)=42 GOTO 460
500 RTN
510 '@XY
520 X=(N-1)%30:Y=(N-1)/30:RTN
530 '@SNEXT
540 S=S+1:IF S>345 RTN
550 N=S:GSB 510
560 IF SCR(X,Y)!=42 RTN
570 GOTO 530
580 '@VSUB
590 GSB 510
600 LC X,Y:?CHR$(48+V*192+N%10)
610 LC 0,23:?N;" ";
620 RTN
MixJuiceでもダウンロードできます。
?"MJ GET comich.net/ichigojam/sosuu.txt"

※なお、実際は最大数690の平方根、√690≒26の倍数までふるいにかければ、作業は終了です。
250 IF S<346 GOTO 150
540 S=S+1:IF S>345 RTN
を、
250 IF S<27 GOTO 150
540 S=S+1:IF S>26 RTN
に変えれば、26の倍数までになります。
今回はわかりやすく半分の345までにしました。
計算時間はあまり変わりません。

2017-02-16

[]イチゴさんぽ

2/14に学習指導要領改定案が発表され、現在パブリックコメントが募集されています。
http://search.e-gov.go.jp/servlet/Public?CLASSNAME=PCMMSTDETAIL&id=185000878&Mode=0
何と言っても小学校でのプログラミング教育必修化(総則に入りました)が注目です。
プログラミング教育の一例として、小学校5年生算数の「図形」が挙げられています。
「正多角形の作図で、(プログラミングで)繰り返し作図を行い、さらに(作図の)一部を変えていろいろな正多角形を考える」と記されています。
どうやらタートルグラフィックスをイメージしているようです。
そんな訳で、簡単なタートルグラフィックスのプログラムイチゴさんぽ」を作ってみました。

f:id:shiro0922:20170216224116p:image:w480
起動すると、画面中央にイチゴくんが表示されます。
上に付いている縦棒は、イチゴくんの向きを表します。
矢印キーを押すと、イチゴくんを上下左右に移動できます。
スペースキーを押すと、イチゴくんの向きを時計回りに45度ずつ変えられます。

f:id:shiro0922:20170216224114p:image:w480
1〜9の数字キーを押すと、イチゴくんが向いている方向に、指定した歩数だけ足跡を残して歩きます。
イチゴくんの位置や向きを操作して、足跡で図形を描いてください。

f:id:shiro0922:20170216224115p:image:w480
多角形が描けました。

f:id:shiro0922:20170216224113p:image:w480
ちょっと遊んでみました(笑)

算数の多角形の授業でこのプログラムを使うとすると、こんな問題はどうでしょうか。

【問題1】
(1)3歩進む(3を押す)
(2)向きを45度変える(スペースキーを押す)
この2つの操作をくり返すと、どんな図形が描けるでしょうか?
【問題2】
直角三角形を描くには、どのキーをどんな順番で押せばいいでしょうか?
プログラムを実行する前に考えてみましょう。

ちなみに問題1はこんな感じです。
f:id:shiro0922:20170216230948p:image:w480

プログラムリストはこちら。
CHR$(255)がイチゴくん、CHR$(165)が足跡「・」です。
文字コードを変えると、キャラクターが変わります。
10 '*Ichigo Sanpo
20 CLV:CLS:CLK
30 LET [0],0,-1,1,-1,1,0,1,1,0,1,-1,1,-1,0,-1,-1
40 LET [20],146,25,145,26,146,25,145,26
50 X=15:Y=11:D=0
60 '@LOOP
70 L=INKEY()-48
80 IF 0<L AND L<10 GSB 240:GOTO 60
90 U=X:V=Y
100 IF BTN(LEFT) AND X>1 U=X-1
110 IF BTN(RIGHT) AND X<29 U=X+1
120 IF BTN(UP) AND Y>1 V=Y-1
130 IF BTN(DOWN) AND Y<21 V=Y+1
140 IF BTN(SPACE) D=D+1:IF D>7 D=0
150 LC X,Y:?CHR$(C);
160 LC E,F:?CHR$(G);
170 X=U:Y=V
180 E=X+[D*2]:F=Y+[D*2+1]
190 C=SCR(X,Y):G=SCR(E,F)
200 LC X,Y:?CHR$(255);
210 LC E,F:?CHR$([20+D]);
220 WAIT 5
230 GOTO 60
240 '@DRAW
250 BEEP
260 LC E,F:?CHR$(G);
270 U=X:V=Y
280 FOR I=1 TO L
290 LC U,V:?CHR$(165);
300 U=U+[D*2]:IF U<1 U=1
310 IF U>29 U=29
320 V=V+[D*2+1]:IF V<1 V=1
330 IF V>21 V=21
340 NEXT
350 X=U:Y=V
360 E=X+[D*2]:F=Y+[D*2+1]
370 C=SCR(X,Y):G=SCR(E,F)
380 CLK:RTN

MixJuiceでもダウンロードできます。
?"MJ GET comich.net/ichigojam/ichigosanpo.txt"

2017-01-26

[]IchigoLatte正式版/2進数&16進数学習機「Ichigo216」

発売になったIchigoLatte正式版を購入して、さっそく工作してみました。
f:id:shiro0922:20170125142341j:image:w240
パッケージは箱形です。

f:id:shiro0922:20170125142351j:image:w360
基板の表面。IC・抵抗・コンデンサーなどのチップ部品はあらかじめ実装されています。
ICの上下に2つの「Latteキャンパス」があって、簡単な回路が作り込めるようになっています。

f:id:shiro0922:20170125142359j:image:w360
基板の裏面。2つのLatteキャンパスの間に+5V、GND、+3.3Vのパターンが引き出されています。回路作りに便利。

f:id:shiro0922:20170125150827j:image:w360
というわけでハンダ付け。上記のようにチップ部品はあらかじめ実装されているので、ハンダ付けする部品は少ないです。ほどなく完成。

さっそくLatteキャンパスを活かした工作を開始。
FacebookのIchigoJam-FANグループで、7セグメントLEDを載せて16進数を表示していた方がいたので、それを応用して、2進数&16進数学習機「Ichigo216」(イチゴにじゅうろく)を作りました。
f:id:shiro0922:20170125180536j:image:w360
上のキャンパスは4個の角形LEDで2進数表示(OUT8〜11で制御)、下のキャンパスは小型7セグメントLEDで16進数を表示します(OUT1〜7で制御)。
f:id:shiro0922:20170125180544j:image:w360
基板の裏側の配線はえらいことになっています(^_^;)

回路図はこちら。OUT10(IN3)端子だけプルアップが必要なのでプルアップ抵抗を付けています。
f:id:shiro0922:20170126005901p:image:w360

プレイ動画はこちら。
D

プログラムはこちら。ファームウェアをIchigoJamに書きかえて、BASICで作っています。

  • プログラムを起動すると、選択メニューになります。ボタンを1回押すとモード1、2回押すとモード2を選択します。
  • モード1はカウンターです。最初は「0」が表示されます。ボタンを押すと1ずつカウントアップします。15(2進数で「●●●●」、16進数で「F」)まで行くと、次は0に戻ります。
  • モード2はルーレットです。最初は「0」が表示されます。ボタンを押すとルーレットが高速に回ります。もう1回押すとゆっくりになって止まります。再度ボタンを押すとくり返し回せます。
  • そのまま選択メニューに戻らないので、戻るにはプログラム再起動してください。

10 '*Ichigo216
20 CLV:CLO:SRND(ANA(2))
30 FOR P=1 TO 11:OUT P,0:NEXT
40 LET [0],`0111111,`0000110,`1011011,`1001111,`1100110,`1101101,`1111101,`0100111
50 LET [8],`1111111,`1101111,`1110111,`1111100,`0111001,`1011110,`1111001,`1110001
60 IF BTN() CONT
70 GSB 540
80 BEEP 30,60
90 IF !BTN() CONT
100 GSB 180
110 '@SLOOP
120 IF BTN() GSB 180
130 IF TICK()<60 GOTO 110
140 BEEP 10,2:WAIT 8:BEEP 10,2
150 WAIT 60
160 IF N=1 GOTO 240
170 IF N=2 GOTO 340
180 '@INPUT1
190 N=N+1:IF N>2 N=1
200 GSB 520
210 IF BTN() CONT
220 CLT:RTN
230 '
240 '@COUNTER
250 N=0:GSB 540
260 '@CLOOP
270 IF !BTN() CONT
280 N=N+1
290 IF N>15 N=0
300 GSB 520
310 WAIT 30
320 GOTO 260
330 '
340 '@ROULETTE
350 N=0:GSB 540
360 '@RLOOP
370 IF !BTN() CONT
380 IF BTN() CONT
390 '@RLOOP1
400 N=RND(16)
410 GSB 520
420 WAIT 5
430 IF !BTN() GOTO 390
440 FOR I=1 TO 5
450 N=RND(16)
460 GSB 520
470 WAIT 15
480 NEXT
490 WAIT 30
500 GOTO 360
510 '
520 '@PRTN
530 BEEP 10,2
540 '@PRTN1
550 OUT N*128+[N]
560 RTN

材料

2017-01-23

[]鹿よけフラッシュライト

IchigoJam互換でJavaScriptが動くマイコンボード「IchigoLatte」、これまでβ版がPCNで販売されていましたが、ついに正式版が発売になりました。
https://hello002.stores.jp/items/58816f31c3b8df0df6000cdf
以前からβ版を使って「鹿よけフラッシュライト」を作っていました。改めてこちらのブログ記事にまとめます。

情報センターの中庭に、夜になると鹿が出没して大量の糞を残していくので困っていました。
こうした鹿対策として、暗くなるとLEDがフラッシュ点灯する「鹿よけライト」が市販されています。例えばこちら。
ただ、「これくらいならIchigoJamで作れるんじゃないか?」と思って、IchigoLatte β版を使って作ってみました。
f:id:shiro0922:20161109222306j:image:w360

回路図はこちら。
入力部は明るさセンサー回路で周囲の明るさを読み取り、「暗くなったら動作する」ようにしています。
出力部はデジタルトランジスタでスイッチングして、LEDをフラッシュ点灯させています。f:id:shiro0922:20170123163918p:image:w360

ボード上の配線はこんな感じです。
f:id:shiro0922:20170123203155p:image:w360

フラッシュライトのプログラムはこちら。IchigoLatteのファームウェアをIchigoJamに書きかえて、BASICで作っています。
点滅が等間隔だと鹿が慣れてしまうかと思って、乱数でランダムな間隔(0.5〜5秒)で光るようにしています。
何度か改良して、省電力なプログラムにしました。

10 '*Flash Light 3
20 VIDEO 0,30
30 WAIT 1+RND(10),0
40 IF ANA(2)>300 GOTO 30
50 LED 1:WAIT 0,0:LED 0
60 GOTO 30
ボードと電池ボックスをプラスチックケースに収め、ホームセンターで買ったイボ竹に付けて、地面から立たせて設置しています。
f:id:shiro0922:20170123130022j:image:w240

f:id:shiro0922:20170123130030j:image:w360
アルカリ単3電池×4本の電源で、設置して50日ほど経ちましたが、いまだに元気に光っています(^_^)
(以前のプログラムでは省電力を考慮していなくて、1週間ほどで電池が切れていました)。
現在のプログラム(上のリスト)では、最初に20行の「VIDEO 0,30」でクロックを1/30に落としています。LEDがフラッシュ点灯する一瞬(50行)だけ大きな電流が流れますが、実行時間のほとんどは30行のWAIT(第2パラメータを「0」としてスリープモード)なので、それらがかなり省電力に効いているようです。

実際の鹿よけ効果ですが、ライトを設置すると鹿ふんが増えません。夜中にずっと監視している訳ではありませんが、確かに効果はあるようです。
市販のライトを買った方が安くて手間がかからないのですが、「実際に役に立つ教材」として工作・プログラミング教室などで作ると面白いかもしれません。
また、プログラム次第でいろいろ動作が変えられるので、ブザーを付けて音も鳴らすなど、工夫の余地があると思います。

詳細情報

フラッシュ用高輝度LED

いくつか試しました。「鹿よけには青色が効果がある」という情報がありますが、LEDの違いによる効果は検証できていません。
LED1個だけだと照射角が狭いので、角度を変えて2個を並列に並べる方法もあります。2個あった方が「動物の眼」のように見えて効果的かも。

その他パーツ
ダウンロード
リンク集
アクセスカウンター