0か1かで記録し計算するコンピューター。片手で31まで数える指二進法のように、2進法で整数は表現できますが、小数はどうするといいでしょう?

コンピューターにとってはただの0か1、人間がどう捉えるかだけの問題です。123という数を1.23と読み替えて、表示で工夫するだけです。

N=123 ?N/100;".";DEC$(N%100,2) 1.23

常に100倍して、下から2桁目が小数点と固定する方式、これを固定小数点表現と言います。

小数点の位置を数とセットで持っておけば、大きな数から小数点以下0がずっと続く、絶対値が小さな数まで表現できます。 これを浮動小数点表現と言います。

現代の一般的なコンピューターでは32bitの浮動小数点数が多く使われていますが、精度を落とした16bitのfloat16もメモリと時間を節約できるのでAIやCGなどで活躍中。

16bitと言えば、IchigoJamの変数の単位と一緒ですね!ただ、仕様に従って符号1bit、指数(小数点位置)5bit、仮数10bitのfloat16をそのまま実装するの、掛け算時のオーバーフロー処理などちょっと大変なので、指数部と仮数部を8bitずつ、しかも指数部は10進法で扱う「FP15」という勝手な規格で作ってみました。

日本の人口、1.26億人は、126 x 10の6乗なので、上位8bitに指数部6、下位8bitに仮数部126を入れて、6<<8|126 と表現します。仮数部はプラスマイナス127まで使います。(マイナスを入れる時は、A=6<<8|-126&255)と8bitに収めることを忘れずに!)


こちら仮に、人口減少率を大げさに3%(x0.97)として、シミュレーションした結果です。(昨年の実際の減少率は0.22%だったとのこと)

こちらがFP15の掛け算を含む、人口減少シミュレーションプログラム

5 Y=2020 10 A=6<<8|126:N=A:GSB@PN:?" A" 20 B=-2<<8|97:N=B:GSB@PN:?" B" 25 ?"Year ";Y;" P:"; 30 GSB@MULAB 40 N=C:GSB@PN:?" C=A*B" 50 A=C:Y=Y+1 60 GOTO 25 100 @PN:E=N&#FF00/256:M=N<<8/256:?M;"e";E;:RTN 200 @MULAB 210 C=A&#FF00/256+B&#FF00/256 220 D=A<<8/256*(B<<8/256) 225 F=0:IF D<0 F=1:D=-D 230 IF D>>7 C=C+1:D=D/10:CONT 235 IF F D=-D 240 C=C<<8|D&255:RTN

最近のCPUには、浮動小数点を計算する回路も含まれていて、超高速にやってくれますが、その実態を理解するには、プログラムで作って触ってみるのが一番です!
学習用浮動小数点数「FP15」の四則演算を IchigoJam BASIC で実装し、活用する方法

大人もこどももプログラミングを楽しく優しくオンラインで学べる、福井高専の先輩、ちっひーの講座、スタート!

ちっひー先輩によるオンラインプログラミング教室、開校! こどもも大人も親子でも! 誕生日もおめでとうございますー

福野 泰介さんの投稿 2020年9月1日火曜日

IchigoJam、はじめてのプログラミングから、深く楽しいコンピューターサイエンスまで、いろんな形でご活用ください!

IchigoJamで使うキーボードは、PS/2に対応したものが必要です。対応していたはずが、動かない現象が発生。原因が判明したので、その対策を紹介します。

結論、10kΩ前後の抵抗1つ、5VとKBD1またはKBD2に接続することで動きます。


サンワサプライのPS/2対応キーボード「SKB-KG3BKN」と色違い「SKB-KG3WN」は、サイズ感がいい感じ。 販売価格もAmazonで、1,255円と手頃な価格もうれしい。


改めて入手し、確認したところ、キーボードのLEDが全く反応しない状態。 自宅のPCをよく見ると、PS/2端子ありました。


PS/2キーボードとしての動作は確認できたので、通信プロトコルの間違いや、初期化のタイミングなどを探ります。


プログラムをいろいろと変えてみましたがどうやっても動かず、KBD1またはKBD2を5Vと抵抗10kΩを使ってプルアップし、信号の5V化を試したところ動きました! ただ、ソフトウェアだけでは対処できないので、残念ながら現在の基板では対応とは言い難い状態。


抵抗の両端、少し切るとコンパクトに収まります。


5V端子は別で使いたい場合、裏面にはんだづけするといいです。CN5の一番上5VとKBD1かKBD2へ10kΩの抵抗でつなぎます。 (他のピンに当たってしまわないように注意!)


はんだづけ、完了!


IchigoSodaも、10kΩ抵抗1つでこの通り、動きました。
抵抗は、100本で100円、プルアップ抵抗としてもよく使うので、この際100本、いっちゃいましょう!

links
- PS/2キーボードが無くならない3つの訳、IchigoJamの対応キーボード拡大!

オンライン講演や、オンラインミーティングが多いので、自撮りライトを作ってみました。

余っていたリング状のWS2812BのLEDがぴったりでした!IchigoJamで制御、簡単!


WS2812BのIN側にL字ピンヘッダーをはんだづけし、PCの縁に引っかかるようペンチで曲げて、3本の線をはんだづけ。


GND、LED、5Vに接続します(VCCでも動きますが、輝度の上げすぎ注意です)


LET[0],100,100,100:WS.LED 1,12

これで12コぜんぶ白色で点灯します!(IchigoJam 1.4 WS.LEDコマンド使用)


夜間の室内、色温度が合わないときはRGBのバランスを調整しましょう。


ゲーミング仕様も色相環プログラムを使って、簡単実現、自由自在!

作ってみたい人 → "WS2812B リング" on Amazon

色設定可能自撮り照明プログラム (ボタンで輝度調整、キーボード1/2/3でRGBで色温度など調整)

10 S=30:N=S*5:R=100:G=100:B=100 20 GSB200 40 IF BTN()=0 K=INKEY():IF K GSB100:CONT ELSE CONT 50 N=N+S:IF N>255 N=0 60 IF BTN() CONT 70 GOTO 20 100 IF K=ASC("1") R=R-10:IF R<0 R=100 110 IF K=ASC("2") G=G-10:IF G<0 G=100 120 IF K=ASC("3") B=B-10:IF B<0 B=100 125 GSB200 130 RTN 200 LET[0],N*G/100,N*R/100,N*B/100 210 WS.LED1,12 220 RTN 300 CLV:WS.LED1,12

ゲーミングセルフィーライトプログラム (V:最大輝度、L:周期)

10 CLV 20 V=100 30 L=20 40 R=V/L:[1]=V 50 [H/L%3]=ABS(H/L%2*(L-1)-H%L)*R:H=(H+1)%(6*L) 60 WS.LED1,12 70 WAIT3 80 GOTO 50

色相環ぐるぐるライトプラグラム (V:最大輝度、L:周期、N:LED数)

10 CLV 20 V=100 30 L=20 35 N=12 40 R=V/L 50 [H/L%3]=ABS(H/L%2*(L-1)-H%L)*R:H=(H+1)%(6*L) 60 WS.LED12 65 COPY#800+N*2*3-1,#800+(N-1)*2*3-1,-(N-1)*3*2 70 WAIT3 80 GOTO 50

links
- BASICプログラム1行で色相環!20分で作るアキバエモメガネでアガるパーティー

今日はダブルヘッダー、京都オープンソースカンファレンスと、福井発の起業家創出を目指す NEW LOCAL FUKUI。共にオンライン登壇なので移動時間0! コロナ禍、世界中のどんなイベントにも参加し放題です。


(追記、OSPN.jpより、当日の講演動画が公開されました)

大切なのは自分の中の熱い想い。何をやりたいか、そのために何を創る必要があり、自分はどんな役割を果たし、足りないものは何か。 すべては始まりは「想い」です。好きなもの、気になるものを突き詰めてみるもよし。SDGsに代表される世界中で解決すべき地域の課題から、ビビッと来るものを選ぶもよし。 人と違ってOK、むしろ多様であるほど社会にプラス!


小中学生向けプログラミングコンテスト、PCNこどもプロコンと共に、小学4年生の好きな作品「おかあさんのスマホ使いすぎを防止するマシーン」を紹介。 もっとかまって欲しいお年頃、スマホばかり見ている母親を見た寂しい想いを形にする、新しい伝え方。

特に「何か」が思い当たらない人や、好奇心旺盛なこどもにオススメしたいのがプログラミング!プログラミングは、オープンデータや、さまざまなツール、ライブラリ、APIを使って、いろんな作品を創造可能な便利で技です。 まずは安くてネットにつながっていない誰にも迷惑かけ無いことが保証された、安心安全なIchigoJamでシンプルにはじめてみましょう。おもしろさにハマった人は、深く広いコンピューターの世界を自由に遊び回りましょう。


BASICからオールマシン語まで、オープンデータとIchigoJamで創るプログラミング教育 - セミナープログラム - オープンソースカンファレンス2020 Online/Kyoto
資料はこちら(20200829-IchigoJam-kyoto-osc.pdf)です。 1996年の経団連の提言「創造的な人材の育成に向けて~求められる教育改革と企業の行動~」、今こそ行動の時!

今年のjigインターン生から、ボードゲームはオンラインでの人と人との距離をぐっと縮めるステキなツールだと学びました。 サイコロ5つを振って、役を作って点数を競うゲーム「ヤッツィー」。遊んでみると確かにいい!自然と会話がはずみ、行動から人となりが見えてきます。

IchigoJamで、サイコロ5つを揃える快感を味わうゲームを作ってみました。


まずはサイコロのデザイン。左上に絵を描いて、プログラムで絵文字にしてみます。これはサイコロ1のつもり。

10 LET[0],0,#BA,#101,#111,#145,#155,#16D:FORI=0TO6:A=#700+I*8:COPYA,#700,8:N=[I]:M=#82:POKEA,#7C,M,N>>6<<3|M,N>>3&7<<3|M,N&7<<3|M,M,#7C:NEXT 20 FORI=0TO6:?CHR$(224+I);:NEXT

1〜6までを枠の中3x3の9ドットで表現することにします。配列に1〜6までのパターン記録し、プログラムでパターン生成。 単純なデータにしてもいいですが、写経するならデータより、プログラムの方が楽しく、打ち込めますよね!20行でテスト表示。

?CHR$(225+RND(6))

これでサイコロがビジュアルにふれます!


残念、サイコロの目、揃わず、ノットヤッツ...
キーボード、1から5のキーを押して、振り直すサイコロを選び、エンター。振り直しは1ゲームに3回まで。全部のサイコロの目をできるだけ早く揃えましょう!


35回目のトライでようやく揃って、YATZ! ゲームクリアです!


プログラムはこんな感じ。1画面に収まりました。全部揃う以外の役の判定をいれたり、対戦ゲームにしたり、いろいろと改造して遊んでみましょう。 コピペですぐ遊べてしまっては学習にならないので、今回はソース添付なし。Let's 写経!


NEW LOCAL FUKUI のオンライン講演。次世代のリーダー、イノベーターを生み出す要、Hana道場! これをやりたい!一人じゃできないから誰か手伝って!強い想いを持った人がリーダーとなり、何かやってしまった人がイノベーター? 大人も子供もみんなで楽しく学ぶ、Hana道場モデルを、世界中に創って0距離でつなぎたい!


新しい福井を創る試みは、キックオフしたばかり。ものづくり王国、福井。チャレンジする人は増えるほどにおもしろい! なにかつくってみたい人、つくってみた人におすすめイベント10/3-4土日開催、NT鯖江2020、入場も出展も無料です! ステキスポットSCCの見学も合わせてぜひどうぞ!

人に変わってサービスし続けてくれるサーバー。その元祖、タイムシェアリングシステムは、60年近く前、1961年開発。

商業的初成功を収めたダートマス・タイムシェアリングシステム(DTTS)は、誰もがコンピューターを使えるようにとダートマスBASICと共に1964年開発。 見慣れたコマンド、LIST / RUN / SAVE / NEWが並ぶ。 そう、これらはBASICのコマンドではなく、TSS(今で言うシェル)のコマンドだったのです!

圧倒的に高速なコンピューターくん、マイクロ秒単位で相手する人を切り替え、人間から見てあたかも同時に対応してくれているように振る舞います。 シェルは、コンピューターと人とをつなぐ窓口のひとつ。IchigoJam BASICのように、コマンドを送ると、その結果を返事として返してくれます。

開発大詰め迎えるjigインターン、デモのためそれぞれチームごとに提供しているサーバーを設定し、Deno(JaavScript)で開発しているサービスをデプロイ(公開)しよう!

サーバー(AWS)上でDenoをサービスとして動かす方法
まずサーバーにログインする

動かしたいサービスをGitHubからとってくる
リポジトリの緑ボタン[Code]からで、Use HTTPS に切り替えて、Clone with HTTPSのアドレスをコピー

git clone https://github.com/.....git

Webサーバー Nginx(エンジンエックス)設定のため、一時的にrootユーザーになる

sudo su -

Webサーバーnginxの設定を追加する

cat > /etc/nginx/default.d/team.conf

下記を貼り付けて、Ctrl-D(ポート番号 8881 はそれぞれの環境に合わせる)

location / { proxy_pass http://127.0.0.1:8881; } location /ws/ { proxy_pass http://127.0.0.1:8881/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }

nginxを再起動して設定有効化

nginx -s reload

で動かすとエラーがでる

Location の設定がかぶっているので、下記を修正

vi /etc/nginx/conf.d/ssl.conf vi /etc/nginx/nginx.conf

"Location / { }" を # を頭に付けてコメントアウト

再び再起動

nginx -s reload

で動かし、エラーがでなければ設定完了!

exit

で、ユーザーを root からもとに戻す

サービスの動かし方

cd [service path] deno run -A main.js

サーバーのホスト名をブラウザに入れて、確認してみよう!
自分たちで作ったサービスが動くと感動ですね!

画面共有と音声帯域を使ったリアルタイムサポート、チームで感動も共有!

サービスとして、ターミナルから抜けてもずっと動くようにする方法

nohup deno run -A main.js &

サービスの止め方

ps -u [account name]

denoのPIDを探して

kill [PID]

サービスの止め方2
サーバープログラムに、ファイルを見たり、特定アクセスで Deno.exit(0) するようにプログラムしておく

サービスの更新方法

git pull

サーバーで更新してしまっていて、pullできない場合

git stash

で、一時保存した上で、 git pull
サーバープログラムを更新した場合は、サービスを一旦止めて、起動
(staticフォルダ内など、クライアント用ファイル更新のみの場合は再起動不要)

サーバー操作にも通じる、BASIC。
黒い画面に強いこども達が生む、サービス誕生が楽しみです!


ザイログZ80伝説(カラー版) | 鈴木 哲哉 | 工学 | Kindleストア | Amazon
今も生き続けるZ80、開発秘話から現況、タイムシェアリングのはじまりから回路設計まで幅広く多様な内容が楽しい!


IchigoJam BASICの元とした、タイニーBASICのプログラムも掲載!
このBASICでは、@マークでメモリアクセスになってますね。ご先祖を想って楽しい、コンピューター考古学!

せっかくなので、世界最初のBASICプログラムと言われる、エラトステネスの篩による素数計算をIchigoJam BASICで実装。アルゴリズム、見比べてみましょう。

1 'Sieve of Eratosthenes 10 CLV 20 FOR I=2 TO 10:?I 30 IF [I]=1 NEXT 40 N=2 50 M=I*N:IF M<102 [M]=1:N=N+1:CONT 60 NEXT 70 ?"PRIME NUMBERS" 80 FOR I=2 TO 101:IF [I]=0 ?I;" "; 90 NEXT:?

今日のjigインターンブログは、もしゃ!
jig.jpオンラインインターン2020 8日目! - jigintern2020’s diary
情報交換タイムでのおもしろ写真付き!

バーチャル背景生成アプリというジャンルもおもしろい!

作ってみたIoT学習リモコンを、コンパクトにユニバーサル基板に実装して、実践投入。 アナログ温度センサー、MCP9700Aを使ったTEAM IchigoJamほっかいどう作、温度センサー基板を使って自動制御して、寝てみました。

変数Sでステート管理
S=0の時、27.0℃より下がったら29℃設定にし、S=1に
S=1の時、27.5℃より上がったら28℃設定にし、S=0に
と、プログラムを組んだつもりが、夜中1時半にエアコン作動音が連続する音と共に起こされました。 暗闇の中、寝ぼけながらプログラムを修正、その後は、無事に朝まで温度制御してくれました。 IchigoJam BASICのプログラムのバグ、分かりますか?(ヒント、LRUN)

アナログ温度センサー、MCP9700A、そこそこの精度で判定できていい感じだったので、赤外線送受信基板に追加、実装!

コンパクトに仕上がった、温度計付き赤外線リモコン送受信基板!EEPROMも実装して、プログラムもセットにすると楽かも?

自動制御で、熱中症を避け、快適な夏、創りましょう!

jigインターン、今日のブログは、ぴんぽん!
jig.jpオンラインインターン2020 7日目! - jigintern2020’s diary

ランチ写真をバーチャル背景におしゃべりする、オンラインランチ会!
チーム開発は高速スクラム、第二スプリントが終了し、いよいよ最終スプリントへ!

links
- IchigoJamで作るIoT学習リモコン、古いエアコンもスマホ制御で快適に! インターン生も芸人さんも楽しいプログラミング入門とマシン語
- 熱中症対策アプリ用オープンデータと暑さ指数予測ランキング、トップ840!

家にリモコン、いくつありますか?
IoTセンサーとリモコン制御プログラミングで、手軽に自作のスマートホーム!

寝室のエアコンの自動運転がいまいちで、寒かったり暑かったりして起きてしまう問題。 IchigoJamと赤外線LED、sakura.ioを使って、家のエアコンをスマホ制御できるようにして一歩前進。 IchigoJamのプログラムはとってもシンプル!

10 N=IOT.IN() 20 IF N=0 GOTO 10 30 ?N:F=FILE():R=10:LRUN N,200

LRUNを使っているので、このプログラムを保存してから、実行。 sakura.ioからデータ受信する IOT.IN() で信号を受け取り、エアコン停止のファイル1、28℃設定ONのファイル2、29℃設定ONのファイル3を呼び出します。(リモコン制御部分のプログラムは後述)

次はスマホ側、sakura.ioの連携サービスとしてWebSocketを設定し、スマホからの操作用のプログラムはJavaScriptで操作用アプリを作ります。 HTML/CSS/JavaScriptの基本スキルと、サンプルプログラムがあればカスタマイズし放題です。

IchigoRemocon IoT src on GitHub

高精度温湿度計SHT-31を使った、家のIoT温湿度計と合わせ、あとは快適に眠っていられる、ちょうどいいしきい値を決めるのみ。

温度が下がりすぎて寒くなって設定を緩めたらどんどん暑くなっていった、夜の記録。

IchigoJamで、赤外線を見よう!
ご家庭のほとんどのリモコンは赤外線リモコン。赤色より少し低い周波数の光を使って信号をリモコンから本体へと届けています。 目には見えませんが、赤外線受光モジュール(センサーの一種)を使って観測しましょう。

赤外線リモコン受信モジュール GP1UXC41QS (秋月電子で50円)を、IchigoJamにつなぎます。 データシートを見ると、丸い部分を手前にして、左から、信号出力のVout、GND、VCCの順。それぞれIchigoJamのIN1、GND、VCCに接続し、早速実験プログラム! (電源電圧VCCは2.7V〜5.5Vとあるので、5Vを使ってもOKです)

1 ?IN(1);:CONT

ずらっと1が並びますが、赤外線受光モジュールに向けて、リモコンボタンを押すと、0001010 などと、反応します。これが信号で、ボタンごと、機種ごとに違うものが送られています。

いろいろなリモコンで試してみましょう。

どんなリモコン信号を受けたら動かすだけなら、これでOKですが、信号の内容によって動きを変えたい場合は、もうひと工夫必要です。

リモコンの原理とマシン語活用
リモコンは赤外線を1秒間に3.8万回、38kHzの点滅を基本として、太陽光などに含まれる赤外線と区別しています。 その点滅があるときがON、無い時がOFFとし、ON時間とOFF時間を交互に計測し、一定時間OFFが続いたら一連の信号が終了、その一連の信号を見て判断すればOKと原理はシンプルですが、IchigoJam BASICでは速度が間に合いません。

そこでマシン語!以前作った、リモコン送受信コードを流用して、プログラム領域にデータを格納し、LRUNを使ったファイル連携で簡単に使えるようにしました。

1 'IR-REMOCON 100 INPUT"0:SEND 1:RECV ",N 110 IF N=0 N=USR(#D00,0):GOTO 100 120 L=USR(#D00,1) 130 ?"LEN:";L 140 FOR I=0 TO L-1 150 IF I%64=0 ?:?"POKE#";HEX$(#E00+I); 170 ?",";PEEK(#E00+I); 180 NEXT:? 190 GOTO 100 200 L=USR(#D00):LRUN F,R POKE#D00,112,181,114,182,14,34,18,2,138,24,0,40,53,208,80,35,27,3,1,51,27,3,1,36,164,4,2,38,54,2,2,62,0,33,0,240,37,248,1,49,33,66,28,209,29,104,0,45,247,209,228,8,0,32,0,33,0,240,26,248,1,49 POKE#D3E,33,66,17,209,29,104,0,45,247,208,17,84,1,48,0,33,0,240,15,248,73,28,33,66,6,209,29,104,0,45,247,209,17,84,1,48,176,66,231,209,0,33,17,84,1,48,98,182,112,189,156,37,173,0,1,61,253,209 POKE#D78,112,71,80,35,27,2,1,51,27,4,4,51,1,36,0,38,17,92,73,0,0,41,234,208,28,96,0,240,22,248,30,96,0,240,19,248,1,57,247,209,1,48,17,92,73,0,0,41,221,208,0,0,0,0,0,240,8,248,0,0,0,0,0,240,4,248 POKE#DBA,1,57,245,209,1,48,226,231,154,37,1,61,253,209,112,71

プログラムを入力し、実行すると 0:SEND 1:RECV と、送信するか受信するか聞いてきます。 まずは1、エンターで受信。リモコン信号を受光モジュールに当てると、#D00に記録した内容が表示されます。

0または単にエンターで、赤外線を発信します。OUT1とGNDに赤外線LEDを付け、本体に向けてやってみましょう!無事制御できましたか!?

1行目に何の信号か分かるように名前をつけて、保存しておきましょう(EEPROMを使えば追加で最大128種類保存可能)。 あとは、好きなようにプログラムを作るだけです。

USBシリアルでPCと接続している場合、受診時に表示されるPOKE文を保存しておき、上記プログラムと合わせて書き込むことでもリモコン信号を復元できます。

ちょっと詳しい解説編
1KBのプログラム領域、こんな風に使っています。
#C00-#CFF 256byte BASIC(溢れてないよう ?FREE() が768以下にならないよう注意!)
#D00-#DFF 256byte マシン語(赤外線送受信)
#E00-#FFF 512byte 赤外線データ

マシン語のasm15ソースコードはこちら。以前作成したものを、#E00から最大512byte使って保存するように変更し、#D00から書き込んで使います。(エアコンの信号で440byte、収まります!)

' IN1 - 赤外線受光モジュール / OUT1 - 赤外線LED PUSH {LR,R4,R5,R6} CPSID '割り込み禁止 R2=#E 'PROGの後半 #E00 R2=R2<<8 R2=R1+R2 R0-0 IF 0 GOTO @SEND R3=#50 ' IN1 の address PIO0_10 R3=R3<<(24-(10+2)) R3+=1 R3=R3<<(10+2) ' PIO0_10 R4=1 R4=R4<<18 '初回信号オーバーフロー判定 R6=2 'R6=512-2 R6=R6<<8 R6-=2 R1=0 @BACK0 GOSUB @WAIT2526 R1+=1 R1&R4 IF !0 GOTO @END R5=[R3]L R5-0 IF !0 GOTO @BACK0 R4=R4>>(18-15) 'オーバーフロー判定変更 R0=0 '配列書き込み位置 @LOOP R1=0 @BACK1 GOSUB @WAIT2526 R1+=1 R1&R4 IF !0 GOTO @END R5=[R3]L R5-0 IF 0 GOTO @BACK1 [R2+R0]=R1 R0+=1 ' 1byteずつ R1=0 @BACK2 GOSUB @WAIT2526 R1=R1+1 R1&R4 IF !0 GOTO @END R5=[R3+0]L R5-0 IF !0 GOTO @BACK2 [R2+R0]=R1 R0+=1 ' 1byteずつ R0-R6 IF !0 GOTO @LOOP @END R1=0 [R2+R0]=R1 R0+=1 CPSIE ' 割り込み許可 POP {PC,R4,R5,R6} @WAIT2526 R5=156 ' 1cycle '(48000/38*2=2526 - overhead 14cycle - 6) / 4 = 626 (=156*4) R5=R5<<2 R5-=1 ' 1 cycle IF !0 GOTO -1 ' 分岐するとき3cycle しないとき1 - 4*loop-2 RET ' 3cycle @SEND R3=#50 ' OUT1 の address PIO1_0 R3=R3<<8 R3+=1 R3=R3<<16 R3+=`00000100 'PIO1_0 R4=1 'PIOオン用 R6=0 'PIOオフ用 'R2 データが格納されたアドレス 'R0 == 0 @ON R1=[R2+R0] R1=R1<<1 ' 2倍する R1-0 IF 0 GOTO @END @ON_LOOP [R3]L=R4 GOSUB @WAIT631 [R3]L=R6 GOSUB @WAIT631 R1-=1 IF !0 GOTO @ON_LOOP R0+=1 @OFF R1=[R2+R0] R1=R1<<1 ' 2倍する R1-0 IF 0 GOTO @END @OFF_LOOP NOP NOP GOSUB @WAIT631 NOP NOP GOSUB @WAIT631 R1-=1 IF !0 GOTO @OFF_LOOP R0+=1 GOTO @ON @WAIT631 'use R5 R5=154 ' 1cycle '(48000/38/2=631 - overhead 5cycle (+10/2) - 5) / 4 = 154 R5-=1 ' 1 cycle IF !0 GOTO -1 ' 分岐するとき3cycle しないとき1 - 4*loop-2 = 618 RET ' 3cycle

受信:ONになっている時間、OFFになっている時間を交互に数えて、メモリに書き出す
送信:メモリを読み、38kHzで点滅するONとただ待つだけのOFFを長さ分だけ繰り返す
(参考、はじめてのマシン語 - IchigoJamではじめるArmマシン語その1

まとめ
プログラミング、言語はいろいろ違っても基本はシンプルです。
大人も子供も学生も、まずは楽しく改造して、ひとつひとつやれること増やしていきましょう!


PCで動く、IchigoJam ap を使って、楽しんでくれたドランクドラゴンのみなさん!


jigインターン、プログラミングできる学生向け、超高速IchigoJam入門&プログラミング大喜利まで1時間!はーどによる「jig.jpオンラインインターン2020 6日目!」に作品あり! アニメーション、音楽、ゲーム、サクッとその場で作れて好評でした!はんだづけもぜひチャレンジしてね!

教え方、または、ゆっくり復習したい方は、こちらの動画をどうぞ!

総合2コマから始める鯖江の小学校プログラミング! 総合的な学習の時間、IT遊具、クラブ活動、地域ICTクラブ、高度IT人材へのベストプラクティススライドPDF

かわくだりゲーム、Hana道場での改造例。

links
- IchigoJamを赤外線リモコンで簡単遠隔操作!スマートホーム実現に向けて、信号の解読にも挑戦しよう!

オンライン、オフラインで進むプログラミング教室。シンプルに学べるオープンソースでオープンデータ教材「IchigoJamプリント」に続々プルリク。 新しいプリントが増えています。


はなをえがこう - DRAWFLOWER
IchigoJam 1.4 の新コマンド三角関数、SIN/COSを使った短く、インパクトある作品!
「やってみよう」他、いろいろいじって遊んでいるうちに、三角関数が好きになっちゃうかも?


IchigoJamプリント on GitHub
現在貢献者は12名。GitHubでのオープンソースプロジェクト参加入門にも気軽にお使いください。(33ステップ解説記事)


IchigoJam BASIC 1.4 コマンド一覧
ハッシュ付きリンクで、ページ内リンクに対応。例えば、こうして、DRAWコマンドへ!
PCやスマホと共に使う IchigoJam BASIC リファレンス としてどうぞ!
(aタグ、ページ内リンク、非推奨のname属性をidに変更)


IchigoJamのつぎのいっぽ、JavaScriptでwebアプリづくり!
Deno x Serverst x JavaScriptの続きは、WebSocketを使ったリアルタイムweb。
comming soon! (待ち切れない人は src on GitHub をどうぞ)

IchigoJamで楽しく学ぶマシン語入門の16回目、今回はフラグを使ってみましょう。 (キャリーフラグなど対応追加したオープンソースのコアacm0cpu更新、IchigoJam webのマシン語エンジン更新、asm15に新表記追加)

(フラグテクニックも使って、74byteまで縮んだ「オールマシン語かわくだりゲーム」スピードをPOKEで改造するまで動画)

計算結果がゼロかどうかを判定するゼロフラグを使って分岐したりループを作ったりしてきましたが、フラグはそれだけではありません。

Z 結果が0かどうかのゼロフログ
C 桁溢れが分かるキャリーフラグ(引き算は2の補数の足し算になる)
N 結果がマイナスかどうかのネガティブフラグ
V 符号付き計算が破綻したかのオーバーフローフラグ

IchigoJam BASICなどのプログラミング言語では、等号や不等号とIF文を使って判定していますが、実際はこれら4つのフラグが使われています。 試しに、パラーメーターが15以上かどうか判定してみましょう。(CC = キャリーフラグが立っていない時分岐)

R1=0 R0-15 IF CC GOTO 2 R1=1 R0=R1 RET

asm15でアセンブルしたものをIchigoJamでメモリに書き込み、動かしてみましょう。

POKE#700,0,33,15,40,0,219,1,33,8,70,112,71 ?USR(#700,15) 1 ?USR(#700,14) 0

うまく判定できてますね!(-15は、2の補数表現との足し算となるため、15より大きいと桁あふれでキャリーフラグが立ち、CCでキャリフラグが立っていない時はスキップ。)

こちらがフラグ判定に使用できる条件の一覧です。

- フラグ判定
EQ Z=1, ゼロフラグセット(一致) Equals =0
NE Z=0, ゼロフラグクリア(不一致) Not Equals =!0
CS C=1, キャリーフラグセット =HS
CC C=0, キャリーフラグクリア =LO
MI N=1, ネガティブフラグセット
PL N=0, ネガティブフラグクリア
VS V=1, オーバーフローセット
VC V=0, オーバーフローリセット
AL 常に分岐

- 符号なし
HS C=1, 以上, Higher or Same =CS
HI C=1 and Z=0, より大きい, HIgher
LS C=0 or Z=1, 以下, Lower or Same
LO C=0, より小さい, Lower =CC

- 符号付き
GE N=V, 以上
LT N!=V, より小さい
GT Z=0 and N=V, より大きい
LE Z=1 or N!=V, 以下

32bitのレジスタ、符号付きとして使うか、符号なしとして使うかはあなた次第!
いろいろ試してみましょう。

また、キャリーフラグを使った計算命令を使うと大きな桁を使った計算ができます。 IchigoJamの配列を4つ使った8byte、64bitの足し算引き算をしてみましょう。
足し算 [8-11] = [0-3] + [4-7] (下位バイトを先とするリトルエンディアンとしています)

20 CLV 30 LET[0],-1,-1,0,0 40 LET[4],1,0,0,0 60 FOR I=8 TO 11:?[I];" ";:NEXT:?

足し算するマシン語を作ります。

PUSH {R4,PC} R0+=R1 R1=[R0+0]L R2=[R0+1]L R3=[R0+2]L R4=[R0+3]L R1=R1+R3 R2+=R4+C [R0+4]L=R1 [R0+5]L=R2 POP {R4,LR}

R2+=R4+Cで、直前の足し算によるキャリーフラグ分も合わせて足します。 R1+=R3 ではフラグが変化しないので、R0〜R7までのみ使える、R1=R1+R3を使いましょう。 (参考、Cortex-M0 Armマシン語表 asm15

asm15でアセンブルしたマシン語と呼び出しコードを加えて実行してみます。

10 POKE#700,240,181,8,68,1,104,66,104,131,104,196,104,201,24,98,65,1,97,66,97,240,189 50 U=USR(#700,#800) RUN 0 0 1 0

無事、桁上りの計算ができてます!
キャリーフラグ付きの引き算 Rd-=Rm+!C を使って引き算も実装してみましょう。 (引き算は、桁あふれが発生していないときにキャリーフラグがセットされるので、!Cを使います)

@fujitanozomuさんによる、フラグを使ったスゴ技を紹介します。 オールマシン語のかわくだりゲームのキー入力判定、素直につくるとこういう感じで6命令12byte

R0-28 IF !0 GOTO 2 R4-=1 R0-29 IF !0 GOTO 2 R4+=1

左キーが28、右キーが29と連続していることとフラグを使うと、下記のように4命令8byteで実装可能です

R0-=28 R0-=1 IF HI GOTO 2 R4+=R0+C

28減算し、判定したいものを0か1にした後に、更に1減算しつつ符号なしで1より大きければスキップ。 R0が0、つまり左キーの時だったときは、R0が-1になっていて、右キーの時はキャリーフラグが立っているので+1されます。 見事!

IchigoJamのAPIアクセス、#C0をキャッシュし、差分メモリアクセスを使う技を使うと、かわくだりゲームが37命令74byteで実現できました。

PUSH {R4-R7,LR} R7=#C0 R6=[R7+(#C4-#C0)/2]W 'putc R5=[R7+(#CE-#C0)/2]W 'locate R3=[R7+(#CC-#C0)/2]W 'cls GOSUB R3 R4=15 'X=15 @LOOP R0=R4 'locate X,5 R1=5 GOSUB R5 R0=#EC 'putc neko GOSUB R6 R0=32 'rnd(32) R3=[R7+(#C0-#C0)/2]W GOSUB R3 R1=23 'locate R0,23 GOSUB R5 R0=#2A 'putc *, enter GOSUB R6 R0=10 GOSUB R6 R0=3 'wait 3 R3=[R7+(#D6-#C0)/2]W GOSUB R3 R3=[R7+(#CA-#C0)/2]W 'inkey() GOSUB R3 R0-=28 'X=X-(R0=28)+(R0=29) R0-=1 IF HI GOTO 2 ADC R4,R0 R0=R4 'scr(X,5) R1=5 R3=[R7+(#D0-#C0)/2]W GOSUB R3 R0-0 ' IF R0=0 GOTO @LOOP IF 0 GOTO @LOOP POP {R4-R7,PC}

asm15でアセンブルした実行可能にしたものがこちら。(IchigoJam webではAPI未対応のため動きません)

10 POKE#700,240,181,192,39,190,136,253,137,187,137,152,71,15,36,32,70,5,33,168,71,236,32,176,71,32,32,59,136,152,71,23,33,168,71,42,32,176,71,10,32,176,71,3,32,251,138,152,71,123,137,152,71,28,56 20 POKE#736,1,56,0,216,68,65,32,70,5,33,59,138,152,71,0,40,226,208,240,189 30 U=USR(#700)

c4ij/zen4ij/rust4ij/Ruby on Jam でベンチマークしているスコア付きかわくだりゲームも、なんと82byte!

PUSH {R4-R7,LR} R6=#C0 'cls R3=[R6+(#CC-#C0)/2]W GOSUB R3 R4=15 ' X R5=0 ' S 'putc R7=[R6+(#C4-#C0)/2]W 'locate R3=[R6+(#CE-#C0)/2]W R12=R3 @LOOP 'locate X,5 R0=R4 R1=5 GOSUB R12 'putc neko R0=#EC GOSUB R7 'rnd(32) R0=32 R3=[R6+(#C0-#C0)/2]W GOSUB R3 'locate R0,23 R1=23 GOSUB R12 'putc *, enter R0=#2A GOSUB R7 R0=10 GOSUB R7 'wait 3 R0=3 R3=[R6+(#D6-#C0)/2]W GOSUB R3 'inkey() R3=[R6+(#CA-#C0)/2]W GOSUB R3 R0-=28 R0-=1 IF HI GOTO 2 ADC R4,R0 'scr(X,5) R0=R4 R1=5 R3=[R6+(#D0-#C0)/2]W GOSUB R3 R5+=1 R0-0 IF 0 GOTO @LOOP R0=R5-1 POP {R4-R7,PC}

日本のスパコン富岳のコア、A64FXも同じArmのコンピューター(fujitsu/A64FX on GitHub)。 世界最速になったヒミツを探るためにも必要な、マシン語の基本、楽しく習得しておきましょう!

links
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1

去年に続き、夏休みの福井県立高志中サイエンス部訪問。 新1年生にプログラミングの楽しさを!上級者にはもっと楽しい創造のヒントを!の2本立て。

高志中サイエンス部のみんな!

はんだづけからはじめるプログラミング入門。その間に、上級者向けレクチャー、世の中には無料で使える楽しいおもちゃがたくさん!オープンソース、オープンデータ、IoT、思う存分遊びましょう!


はんだづけできたら、LED1、やった光った!(LEDを最初反対に付けてしまったのを手術し修正後)


ビーズでかわいくオリジナルIchigoDake!(ビーズで飾る電子工作


早速、IchigoJamでゲームづくり!
IchigoJamプリントや、IchigoJam教材スライドもオープンデータとして公開しています。
教材づくりへのチャレンジもぜひ → 33ステップで解説、GitHubオープンソース貢献入門 IchigoJamプリントをつくってみよう


IchigoJamで、ペアプログラミング!楽しさ2倍!?


経験者チームは、持っていったいろんなおもちゃで思い思いに遊ぶ。


オシャレな画面と共に、ランダムに奏でるIchigoJamプログラム!


VIDEOのパラメータをRNDにするのが斬新!


PCN上田発、ハンドスピナー型IchigoJamをPC冷却ファンをMapleSyrupで制御して、回してた!


JavaScriptで改造したカオスなブロック崩しゲームを見せてくれました。
物理エンジン使うと、また楽しいものがつくれるよ!


缶サット、昨年度の取り組み「模擬人工衛星の挙動制御と構造的工夫」を紹介してくれました。 今年は地面のマーカーにめがけて着地制御にチャレンジしたいとのことで、使用するセンサーの相談。 今オススメは、RISC-V 64bit x 2coreのカメラ付きモジュール、M1n

USB-Cでパソコンと接続し、rshellをセットアップ(初回だけ)

sudo pip3 install rshell

rshellコマンドで接続(usbeserialのあとの番号は自身の環境に合わせる)

rshell -p /rshell -p /dev/tty.usbserial-xxxxxxxxx0 edit /pyboard/flash/boot.py

viが起動するので、microPythonでプログラムを貼り付ける

import sensor import math sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.run(1) green_threshold = (50, 80, -70, -10, -0, 30) #red_threshold = (40, 80, 30, 70, 0, 40) fm.register(20, fm.fpioa.UART2_TX) fm.register(15, fm.fpioa.UART2_RX) uart = machine.UART(machine.UART.UART2, 115200) print(0) while 1: img = sensor.snapshot() #blobs = img.find_blobs([red_threshold]) blobs = img.find_blobs([green_threshold]) if blobs: for b in blobs: print(b.cx(), b.cy()) #n = ((b.cx() // 2) << 8) + (b.cy() // 2) x = b.cx() / 320 * 100 y = (b.cy() + (320 - 240) / 2) / 320 * 100 n = math.floor(x) * 100 + math.floor(y) uart.write(str(n) + "\n") break time.sleep(.1)

「:wq」エンターと押して保存。これで書き込み完了!

M1nの20ピンをIchigoJamのRXDへ、M1nのGNDをIchigoJamのGNDへ、接続。

秋月電子の3Vで動くサーボと、AIカメラモジュールを組み合わせます。


IchigoJamでのプログラムはこれだけ!
シリアル信号で受信したXY座標をまとめた4桁の数が送られてくるので、100で割ったX座標のみを使って、サーボを動かす!


サーボに貼り付けたAmabieDakeが緑色を見せる場所に合わせて傾きます。
缶サット、空中での移動はどう実現するか?いろいろ試してみるのがおもしろそうですね。
マーカーの認識は、green_threshold のパラメータで微調整します。
IchigoJamのPC接続のように、M1nにシリアルで接続し、Ctrl-C で動作を停止、プロンプトがでてくるので、下記コマンドで自動起動するプログラムを一旦消して、再度書き込みましょう。

os.remove('boot.py')

IchigoJamでのソフトウェア、制御するハードウェア、M1nのmicroPython、いろいろ分担して取り組んでみよう!


IchigoJamでコントロールするドローン、TELLOを使った実験中とのこと!


今回、声をかけてくれた前田くん、高志中サイエンス部のWebサイトがいい感じ!

IchigoJam 1.4のWS.LED命令についてかいてくれてます!)
ぜひいろいろ作って、オンライン、オフライン問わず、バンバン発表して、見てもらう人増やしましょう!(NT鯖江もよろしく)

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / RSS