福野泰介の一日一創

こども起業家が活躍する社会を創ろう - KidsVenture夏休みスペシャル at 新宿

2016/08/24 23:55:00
#IchigoJam #tokyo 

さくらインターネット、ビットスター、ナチュラルスタイル、jig.jp、4社共同で主催する「KidsVenture」は、電子工作・プログラミングを通じてつくる楽しさを学び挑戦意欲溢れる次世代の創出に貢献します!


東京新宿開催、夏休みスペシャルな2日間のイベントの初日、IchigoJam Tのはんだづけとロボットpaprikaのギアボックス組み立てに取り組んでいるところでした。


大人でもなかなか難しい、2つのモーターを多数のギアで減速するギアボックスの組み立てに果敢に挑戦する子供達の姿!チャレンジ精神を引き出すポイントは、おもしろそうなゴールと、手が届きそうな難しさ。簡単すぎては飽きられ、難しすぎては嫌になる。チャレンジの先に見える光が力になる。


会場のさくらインターネット会議室、2日目はロボットを完成させ、みんなで協調動作するロボットのプログラミングに挑戦とのこと!


シールと裏面に秘密の暗号付きの名刺、もらいました!


みかかコンバーター
日本のキーボードならではの古の暗号、みかか。自分たちだけの暗号づくりも楽しそうですね!

クラウド、IoT、ブロックチェーン、次々登場するおもしろ技術へのはじめのいっぽ、ひとりでも多くの子供に踏み出してもらいましょう!

参考リンク
- 【対談】さくらインターネット田中邦裕社長 ブロックチェーンは破壊的イノベーションであり、社会は既に変化し始めている | ビットコインの最新情報 BTCN|ビットコインニュース
- さくらインターネット、ビットスター、ナチュラルスタイル、jig.jpが、子供向けプログラミング教室を主催する非営利団体「KidsVenture」を設立 |EdTech Media
- KidsVenture

IchigoJamでキーボードが動かない!? IchigoJam TとU、キーボードとビデオケーブルの選び方・つなぎ方

2016/08/23 23:55:00
#IchigoJam 

テレビも、DVDプレイヤーも、ゲーム機も、実はコンピューター、CPUが入っていていろいろ計算しています。昔、赤白黄のケーブルでビデオデッキ、ゲーム機、テレビをつなぐのが好きだったのは、コンピューター間のネットワークを作る作業そのものだったからかもしれません。

ケーブルがHDMI一本になったり、無線化したりで、楽になった反面、この類の悩む楽しみと解決できた喜びが減っています。


IchigoJamを使う際に、本体の他に準備するものは3つ。
1. PS/2キーボード
2. テレビとテレビにつなぐビデオケーブル
3. microUSBケーブルと電源(ACアダプターまたはモバイルバッテリー)

IchigoJamに、なくてはならない、プログラミングする(=コンピューターと話す)ための手段、キーボード。現在のIchigoJamが、対応しているPS/2キーボードを用意します(USBキーボードは実験中)。電気屋産さん、リサイクルショップ、通販で手に入ります。

キーボードの中身はたくさんのスイッチと、それをデジタル信号にするコンピューターからできています。押したり離したりの信号の使い方(=プロトコル)には2種類、古い規格のPS/2(丸い端子)と、新しいUSB(四角い端子)があります。両対応するものと合わせて、3種類のキーボード、IchigoJam TとUとの対応をまとめました。

PS/2・USB両対応と書かれたキーボードは普通の電気屋産さんでも置いてあります(比較的安価です)。両対応のキーボードは、キーボードの中にあるコンピューターがPS/2で接続しているか、USBで接続しているかを自動的に判別して、送る信号を切替えています。IchigoJam Uに接続する場合は、キーボードに付属するUSBの形状をPS/2の形状に変換アダプターを使って接続します。

IchigoJam Tに接続する場合は、変換コネクターを使わず、USBの形状のまま接続します。使用している端子はUSBですが、流れている信号はPS/2信号です。変換アダプターを使う必要がない分すっきりします。USB端子は、上下しか悩む点がないため、子供にとっても差し込みにやすく、頑丈なのが特徴です。PS/2端子は、差し込みが固いことが多く、ぐりぐりひねりながら差し込むと壊れるのも何度か目撃しました。

続いて、リサイクルショップなどで見かけたり、昔からとってあった、PS/2専用キーボードの場合です。丸い端子PS/2は、IchigoJam Uへはそのまま接続できます。

IchigoJam Uに接続するためには、PS/2の丸い形状からUSBの四角い形状へと変える、変換アダプターが別途必要になります(Amazon / aitendoで購入可)。流れる信号はPS/2信号です。PS/2キーボードやマウスをUSB信号に変換して接続する変換器(中にコンピューターが入っているもの)を使ってしまうと、流れる信号がUSBになってしまって、IchigoJamでは使えません。

最後にUSBキーボードですが、こちらはIchigoJam Uに形状は合いますが、信号がUSBなため使えません。もちろん、変換アダプターを使ってIchigoJam Uに接続しても使えません。USB信号をPS/2へと信号を変える変換器があればいけるはずですが、該当する商品は見つかっていません。

キーボードまとめ:「PS/2」と書かれたキーボードを入手してください。
入手性がよく、打ち心地も良く、値段も手頃な、おすすめの日本語キーボードはこちらです。
サンワサプライ PS/2キーボード SKB-L1BK」530円
ELECOM 有線ミニキーボード Windows用 メンブレン式 USB-PS/2変換コネクタ付 ブラック TK-FCM077PBK」1315円 コンパクト!

次にビデオコード、100均、DAISOでも売っているコンポジットケーブルというものを使います。

わかりやすさのため白赤黄と三色ありますが、いずれもただの2芯(信号線とGND線)ケーブルなので、音声を音声に、映像を映像にそれぞれ接続すればケーブルは何色を使っても構いません。手で簡単に裂くこともでき、100円でIchigoJam、3台分のケーブルとして使えます。

IchigoJamのビデオ出力(黄色の端子)をテレビのビデオ入力(黄色の端子)へと、何色のケーブルを使ってもいいので接続してください。(つまり、自宅に余っている白赤の音声のみのケーブルでOKです!)

ケーブルの長さが足りない場合、同じくDASIOで売っている変換プラグを使うと、延長することができます。200円で、1.5m x 3の4.5mまで届く、IchigoJam用ケーブルのできあがり、大型テレビでも使えます!

microUSBケーブルは、100均でよく売っているものや、スマホ(Android)の充電用に使っているものでOKです。100均、Seriaの単三乾電池2本使ったモバイルバッテリーもおすすめです。充電式のモバイルボッテリーでも動きますが、消費電力が低すぎるため、途中で給電を停止してしまうものがあるので、長いプログラムを消されてしまう前にチェックしておきましょう。

工学社から新しいIchigoJam&Pancake本がでました!
「IchigoJam」/「PanCake」ではじめる電子工作&プログラミング」 by Natural Style

IchigoJamを使ったプログラミングの基本から、フローチャートを使ったもぐらたたきゲームの作り方、拡張ボードPanCakeを使ったカラー化と豪華な効果音バージョンへのステップアップが丁寧に解説されてます。

はんだづけしない、ブレッドボード版PanCakeの組み立て方も掲載!

(ブレッドボード版IchigoJamの組み立て解説本は前作「「IchigoJam」ではじめる電子工作&プログラミング」を参照ください)

楽しい工作&ゲームができたら、ぜひPCNこどもプロコンに応募してください!
第5回の締め切りは、9/11!


PCNこどもプロコン2016夏

はじめのいっぽは「LED1」

ゲーム作りがわかってきたら、IchigoJamを無線LANにつなぐ「MixJuice」で作品をアップロード!

PCNチャンネル on YouTube
IchigoJam-FAN on Facebook

広がる多様性、高専インターンスタート&アフリカインターン見学、IchigoJamカラバリ

2016/08/22 23:55:00
#kosen #IchigoJam #jig #intern 

夏恒例、高専インターンがスタート!2016年は13高専から16名が鯖江に集結!
サンダーバードで降り損ねて京都まで行ってしまったり、財布をなくしたりと些細なトラブルはあったみたいですが、無事初日のガイダンスを終えて、福井名物「やきとりの名門 秋吉」で歓迎会。
16人の高専インターン生など (big photo) 「jigインターンブログ2016」もスタート!

午前中はアフリカ9カ国からの鯖江インターン中の人たちの会社訪問もあり、オープンデータ/IoT/電脳メガネを使ったデータシティ鯖江の取り組みの紹介とその裾野を広げるIchigoJamこどもプログラミングを体験してもらいました。

はじめてプログラミングをする人も楽しんでくれました!世界中のこどもにITという道具を届けましょう!

5つ星オープンデータの違いや、IchigoJamライセンスに関してなど、積極的な質問、こちらも勉強になりました。

訪問ありがとうございました! (big photo)

IchigoJam T の各色基板の試作が届きました。

オリンピックは日本につながる閉会式、まさかのマリオ登場!
【NHKリオ】2020へ期待高まる!トーキョーショー - YouTube


それぞれ厚さが違います、上から1.2mm/1.0mm/0.8mm/0.6mm。とっても軽い0.6mmでもしっかり硬い印象。とはいえ、曲げや捻りに強いのは厚い基板かも。


IchigoJam black edition、つくってみました。
white editionも合わせて「PCNフラッグシップ秋葉原 by Assemblage」にて販売予定!

日本中、世界中、いろんな人がいろんなコトでつながる21世紀。
楽しくいろいろ創りましょう!

Let's make Game! My first programming by IchigoJam

2016/08/21 23:55:00
#IchigoJam #KidsIT #english 

What is a different from Computer and Robot?
No differences, it's same!

The Computer with a face and hands something, people said it's a Robot.
So you have lived with many robots already.
The TV, the airconditioner, the refrigerator ... they robots support you.

Programming is communication to the Robot / Computer.
Let's talk to Computer! Let's start programming!


But basically, Computer can not understand your words.
You need to speak with computer language.
Don't worry, it's not difficult.
Just you type in 'L' 'E' 'D' '1' and 'enter' key to light up the LED!


This is a slide to guide the first programming with tiny computer IchigoJam.


This is a goal rafting game program.


You can become to create original games and tools after learning some commands of IchigoJam.
Try the contest if you are under 15! "PCN kids programming contest"

After you got some prize, you can step up to another computer programming.
iPhone, Android, IoT, Windows, Mac and cloud computer world is very very wide.

Get the Computer as your good parter!

related links
- $15 tiny computer IchigoJam
- PCN / Programming Club Network - You can buy IchigoJam on the web
- PCN Flagship Akihabara - You can build the IchigoJam in this store
- Let's Start Programming! How to build an IchigoJam, your first computer

IchigoJam 小学生向け、はじめてのプログラミング「かわくだりゲーム」1時間コース用スライド

2016/08/20 23:55:00
#IchigoJam #KidsIT #saitama 

埼玉県越谷市、イオンレイクタウンにて、フジテレビKIDSPCN東京 presents「プログラミングワークショップ」を開催。小学生の親子約60組にIchigoJamを使ったはじめてのプログラミング体験&ゲームづくりを紹介。全3回、それぞれの子供の反応を元に更新した、はじめてワークショップのスライド、1時間コース用ができました!(on Speaker Deck / PDFkeynote


LEDをつけてとコンピューターに伝える手段は「キーボード」
はじめて使う小1の子もアルファベット大文字なら間違い探し感覚でがんばります!
4文字打てたら、エンターキーで光る!


LED1とLED0でLEDコマンドはクリア!レベルアップ!
次は画面をきれいにするCLSコマンド、「待て」を伝えるWAITコマンド、体験しながらだとすぐに吸収。
キーボードの左下にある[ALT]キーを押しながら[C]を押すと登場するネコに盛り上がる!


短いプログラムにゲームとプログラムの基本が詰まった「かわくだりゲーム」を1行ずつ、実行結果を確かめながら一緒に進めていきます。 速くできた子には、数や文字をいじっていてもらうと「出来る子の手持ち無沙汰問題」もありません。子供ばかりの場合、子供同士でサポートしあうことを促すのも効果的。


適度な難しさがおもしろいのは、ゲームもプログラミングも一緒。
ゲームは、自分でつくるともっと楽しい。


7行のプログラムで「かわくだりゲーム」はできあがり!
流れをざっと復習してプログラミング体験は終了。

15行は INKEY() と IF K=RIGHT や K=LEFT で判定する方法などもありますが、キーボード慣れていない子が多く、方程式に馴染みのない小学生には短縮形を使って、まずは速く作ることを優先するのが良さそうです。


ワークショップ後も、自分でかいぞうしたゲームを交換しながら遊ぶこどもたち。


興味もった子向けにに、家庭でできる教材「IchigoJamプリント」や、書籍雑誌も充実してきました。


大盛況!


お隣では、幼児からはじめるプログラミング ビスケットパーティ!
(VISCUIT(ビスケット)〜コンピュータを粘土のように〜)

プログラミングで広がる可能性、すべてのこどもにプログラミングを!
ぜひこのスライドをご家庭や、近所でもワークショップなどいかがでしょう?
はんだづけを含む、2時間〜3時間コースもおすすめです!


スライド&PDFダウンロード「ゲームをつくろう!IchigoJamはじめてのプログラミング // Speaker Deck
keynoteファイルIchigoJamフォント TrueType by ふうせん Fu-sen 使用)

参考リンク
- こどもパソコンIchigoJam
- PCN プログラミングクラブネットワーク
- IchigoJam-FAN Facebookグループ

8/26 アフリカ留学生版 鯖江市地域活性化プラン発表会&VRアプリ勉強会! 1bit IoT「Soba or Not」デモ紹介

2016/08/18 23:55:00
#IoT #IchigoJam #africa #sabae 

SketchUpで編集可能な鯖江市商店街3Dオープンデータを鯖江市に提供した、株式会社JMとJICAによるアフリカ留学生のインターンプログラム、今年は鯖江を舞台に地域活性化プランを一週間かけてつくり、発表する企画。


本日、キャンプイン at 獏の棲む森!(big photo data


アルジェリア、エジプト、エチオピア、コートジボワール、タンザニア、プルキナファソ、モーリタニア、モザンビーク、モロッコ。アフリカ各国から日本へ留学中。東京、神戸、京都、講義にも行ったことがある新潟国際大学など、大学も様々。

プラン作成に使える、便利なオープンデータはこちら「データシティ鯖江」を探してみてください。
他に必要なデータあれば、鯖江市役所または Code for Sabae まで気軽にお声がけください!
"Feel free to request another open data about Sabae city! → Code for Sabae"


プランの発表は、8/26(金) 「アフリカ留学生版!鯖江市地域活性化プラン発表会」通訳アリ!
第9回目「鯖江市地域活性化プランコンテスト | 市長をやりませんか?」とひと味違った発表が聞けるはずっ


懇親会、アイデアのネタにともっていった、リアルタイムオープンデータの源泉であり最もシンプルな 1bit のデータをWebにつなげる IoT「Soba or Not - 1bit IoT」のデモ版です。大きなトルグスイッチをつないで、そばがまだあるか、切れたかをシンプルに伝えます。


Soba or Not - 1bit IoT demo
変化があった時だけ3GIMを使ってサーバーにデータを送る省電力仕様。リアルタイムオープンデータ(JSON)を使って、簡単に好きなアプリとしてデザインして伝えたり、他のアプリと連携したりできます。

10 BPS2400:OUT6,1:OUT3,-1:OUT1,1:OUT2,1 15 OUT2,0:B=IN(1):OUT2,1 20 OUT2,0:A=!IN(1):OUT2,1 23 ?A:IF A=B GOTO 70 30 OUT6,0:INPUT"",D:UART3 40 ?"$WG http://sabae.club/siot/1/?key=xxx&v="A 50 INPUT"",R:IF !R CONT 60 OUT 6,1 65 LED 1:WAIT5:LED0 66 OUT1,!A:B=A 70 WAIT 60*10,0 80 GOTO 20

プログラムは、IchigoJam BASIC なので、とってもシンプル。調整も仕様変更もその場でサクっとできます。欲しいものは自分でつくりましょう!(参考、3GIMミサイルスイッチ


お蕎麦屋さん、まだいけるかな?を解決します。

8/26の発表会の日、午後には私が副委員長務める、福井県情報システム工業会、オープンデータ委員会主催のアプリ勉強会も開催!

(↑3D鯖江市商店街データの紹介)

株式会社JM提供の鯖江市3Dオープンデータや、360度写真オープンデータとOculusを使った3Dプログラミング体験、初心者IoTプログラミング体験など、実際にものをプロトタイピングしながら、未来の定番アプリをデザインするイベントです。合わせてどうぞ!

未来の定番アプリを考える、IoT/VRアプリ勉強会

掛け算もインクリメントも1クロック、BASICでカジュアルに使うインラインマシン語とツール紹介 - IchigoJamではじめるARMマシン語その7

2016/08/16 23:55:00
#IchigoJam #ARM 

じっくり取り組むマシン語も楽しいですが、手軽で便利なマシン語ならではの技を紹介します。

CPUには足し算、引き算、メモリアクセスなど基本的な機能の他に、CPUによってそれぞれ固有な機能があります。現代のパソコンやスマホに使われる高性能なCPUには、3Dグラフィックスや、音声、映像などの処理の高速化のために、4つの計算を同時に行うなどのSIMD命令が含まれます。ほとんどのスマホで使われているARMアーキテクチャー、Cortex-AにはNEONというSIMD機能が搭載されています。

電源が限られるモバイルにおいて、いかに無駄な電力消費を抑えつつ、サクサク軽快なアプリを提供するかが重要です。C、JavaScript、Swiftでは、CPU固有の機能を表現する方法がないので、マシン語を使って、コンピューターの性能をフルに引き出しましょう。誰かがつくった機能(ライブラリ)を使わせてもらうのもいいですが、自分でも作ってみたくもなるでしょう。(参考「iPhoneでのピクセル処理をNEON(ベクタ演算)を使って4倍高速化する」)

IchigoJamが使っている低電力CPU、LPC1114は、ARM Cortex-M0という、Cortex-Aと命令に互換性があるサブセット(一部)です。SIMD命令はありませんが、BASICやCでは扱えない特別な演算があるので、今回はそれらをカジュアルに使います。

Cortex-M0 マシン語表(抜粋)」に、特殊演算を追記しました。

※bic:ビットクリア、asr:符号付き右シフト、ror:右ローテート
※rev:byteオーダー反転、rev16:byteオーダー反転(2byteずつ)、revSH:符号付き16bitを反転32bit化
※abc:キャリー付き足し算、sbc:キャリー付き引き算

IchigoJam BASICには当てはまる演算子がないために、関数のような書き方にしていますが、これらの計算はすべて、通常の計算と同様、1サイクルで処理できます。IchigoJamの場合、48MHzで動作させているので1サイクルは約20ナノ秒で計算は終了します(iPhone6sは最大1.84GHzなので約40倍高速な0.1nsec)。

bic:指定したビット位置のみをクリアする。普通に書くと Rd = Rd & ~Rm と、2回の演算が必要。
ror:指定した数だけ右にビットシフトして、はみ出た分は上位ビットにセットする。
rev16:16bitの上位8bitと下位8bitを入れ替える(上位32bitも同様に)

I2Cで外部センサーから取得したビッグエンディアン(=最初に上位8bitがある)なデータの読み取りに便利そうな rev16 を実際使ってみます。

[0]=`1011101001 000 000 'R0=rev16(R0) [1]=#4770 ?USR(#800,1) 256 ?HEX$(USR(#800,#3412)) 1234

#4770は呼び出し元に戻るRETURNのマシン語です。(Z80でいう#C9)
同じコードをIchigoJam BASICで書くと、下記のように少し長くなるので、繰り返し使う場合に有利です。

N=#3412 ?N<<8&#FF00+N>>8

マシン語をいれておくメモリとして、PCG領域を借りて、下記のように書くこともできます。このように、別のプログラムでいろいろな便利な関数を用意しておき、メインのプログラムを呼び出すとメモリを有効に使えます。

10 POKE#700,#40,#BA,#70,#47:P=#700 20 ?HEX$(USR(P,#CDAB));HEX$(USR(P,#3412))

Cortex-M0 マシン語表(抜粋)」にサイクル数を追加しました。ほとんどの命令が1サイクルで終了することが分かります(LPC1114は掛け算も1クロック)。実行時間が正確に計算できるのもマシン語のいいところです!

ハンドアセンブルでコツをつかんだら、アドレス計算も自動でやってくれるARMアセンブラ搭載、Mac/Windows/Linux対応IchigoJam用ツール「IJUtilities」が便利です。C言語からIchigoJam BASIC用のコードを生成する「rohiniku/IchigoJam_bin2poke」の逆アセンブル機能を使った解析も勉強に便利!

ARMマシン語は、スマホでもそのまま活かせる究極の高速化テクニック。自分の書いたコードが実際どういうマシン語になるかだいたい想像できる程度には押さえておきましょう。

C言語やJavaScriptでお馴染みの「i++」という iに1足す演算子が、Swift3ではなくなってしまいます。MSXでZ80マシン語で1足す命令(INC)や1引く命令(DEC)を知っていたため、ごく自然に受け入れて今でもよく使っているだけにさみしいものがあります。Z80では2足すより1足す方が約倍高速(機械語の手帳 ステート数表)。ただ、近年使われるよくARMは1足すのも2足すのも255足すのも速度は一緒、演算子削減の一因かもしれません。

ゲーム、スマホ、ロボット、クラウド、IoT、AIなど、奥深いプログラミングの世界も第一歩から!
福井新聞主催、PCN共催「福井県小中学生プログラミング・フェス2016」参加者募集中!

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語

ハンドアセンブルで大きな文字を256倍速表示!マシン語使いこなしTIPS - IchigoJamではじめるARMマシン語その6

2016/08/15 23:55:00
#IchigoJam #ARM 

Twitterで蘇る懐かしい記憶。
実家の本棚探ってたら小学生の頃書いたZ80の機械語のノート出てきた。」 by @AoVAさん
そう、当時の中高校生が使いこなしていたZ80マシン語は小学生の憧れ、高速ゲームを夢見て、フリーズと戦った!
※フリーズ=暴走、リセットするしかない状態、マシン語を使うとよく起きる

ということで、ARMマシン語入門、その6はちょっと実用的なプログラムをTIPSと共に紹介します。

キャラクターパターンデータを使って、1文字を8x8のテキストキャラクターを使った8倍サイズにするBASICのプログラムはこんな感じ。

12 P="BIG SCRNTEST" 15 CLT:GOSUB 100 30 WAIT 120:?TICK():END 100 FOR I=0 TO 11 110 C=PEEK(S+I) 120 FOR J=0 TO 7 122 N=PEEK(C*8+J) 125 A=#900+I&3*8+(I>>2*8+J)*32 130 FOR K=0 TO 7 140 POKE A+K,N&(1<<(7-K))<>0 150 NEXT 160 NEXT 170 NEXT 180 RETURN

32x24の画面に、8x8の文字は12文字入ります。一文字ずつCで取り出すループ、文字コード*8から8byte分あるキャラクターパターンを取り出すループと、1ビットずつ表示するループの三重ループ構造でできます。描画に242tick(約4秒)もかかってしまうので、ゲームに使うのは厳しそう・・・。

このようにマシン語でいきなり作り始める前に、BASICで考え方(アルゴリズム)が間違ってないか、実際に動かして確認するといいです。(2進数のビット演算には慣れておきましょう

では、早速マシン語で高速化します!
ARMマシン語対応表(PDF版)」を片手に、BASICの変数の代わりにレジスタを使ってつくっていきます。この時、いきなり全部つくろうとせず、ループの内部の細かい部分から順に動作を確かめながらつくるのがコツです。問題は切り分ける!

1. 画面の左上にパラメータ(R0)として渡した数を表示しよう
2. 0ならCHR$(0)そうでなければCHR$(1)を表示しよう
3. 渡したパラメータの下位8bitでパターンを表示しよう(上位bitが左上になるように)
4. キャラクターコードを渡してキャラクターパターンを表示させよう
5. キャラクターコードが12コ連続してかかれたメモリ位置(=アドレス、C言語で言うポインタ)を渡して12コ表示しよう

つくりかたですが、いきなり2進数にしてしまうと読みづらいので、読みやすいプログラム(=アセンブリ言語)で先に書いて、変換(=ハンドアセンブル)するのがおすすめです。

'BIG SCREEN PROGRAM 'R0:param, address of 12 characters 'R1:virtual memory offset(RAM) 'R2:virtual memory offset(ROM) PUSH LR,R4,R5,R6,R7 R12=R2 'save to R12 R6=0 'offset 0-11 R7=R1+R0 'real memory address of 12 characters R3=9 R3=R3<<8 R1=R1+R3 loop0: R0=[R7+R6] R0=R0<<3 R2=R2+R0 R4=0 loop1: R3=[R2+R4] R5=#80 loop2: R0=R3 R0=R0&R5 IF 0 GOTO else1(2) R0=1 else1: [R1]=R0 R1=R1+1 R5=R5>>1 IF !0 GOTO loop2(-7) R1=R1+24 R4=R4+1 R4-8 IF !0 GOTO loop1(-13) R1=R1-24 R0=3 R0=R0&R6 R0-3 IF 0 GOTO eles2(2) R1=R1-224 else2: R2=R12 R6=R6+1 R6-12 IF !0 GOTO loop0(-27) end: POP PC,R4,R5,R6,R7

レジスタはR0からR3とR12以外を使う場合は、呼び出し元(この場合、IchigoJamの動き)を壊してしまう恐れがあるので、PUSH/POPを使って退避しておきます。この時LR(リンクレジスタ、戻り先のアドレスが入っている)をまとめてPUSHしておき、POPするタイミングでPC(プログラムカウンタ、現在実行中のアドレス)に戻すと、RET(=#4770)の代わりになって便利です。

今回使用したレジスタは破壊してOKなR12を含めて、R7までに収まったのでPUSH/POPは一組で済みましたが、足りなくなった場合は、適宜PUSH/POPをループ前に使いましょう。その都度、レジスタの使いみちを簡単にメモしておくと便利です。


ハンドアセンブルは、IchigoJamの2進数表記とビット演算などを使って少し楽できます。

10 [0]=`1011010 1 11110000 11 [1]=#4600+`1 0010 100 12 [2]=`00100 110<<8+0 14 [3]=`0001100 000 001 111 16 [4]=`00100 011<<8+9 18 [5]=`00000 01000 011 011 20 [6]=`0001100 001 011 001 22 [7]=`0101110 110 111 000 30 [8]=`00000 00011 000 000 40 [9]=`0001100 000 010 010 60 [10]=`00100 100<<8+0 70 [11]=`0101110 100 010 011 80 [12]=`00100 101<<8+#80 90 [13]=`0100011000 011 000 100 [14]=`0100000000 101 000 102 [15]=`11010000<<8+(2-2)&#FF 104 [16]=`00100 000<<8+1 106 [17]=`01110 00000 001 000 110 [18]=`00110 001<<8+1 120 [19]=`00001 00001 101 101 130 [20]=`11010001<<8+(-7-2)&#FF 140 [21]=`00110 001<<8+24 150 [22]=`00110 100<<8+1 160 [23]=`00101 100<<8+8 170 [24]=`11010001<<8+(-13-2)&#FF 180 [25]=`00111 001<<8+24 190 [26]=`00100 000<<8+3 200 [27]=`0100000000 110 000 205 [28]=`00101 000<<8+3 210 [29]=`11010000<<8+(2-2)&#ff 220 [30]=`00111 001<<8+(224) 225 [31]=#4600+`0 1100 010 230 [32]=`00110 110<<8+1 240 [33]=`00101 110<<8+12 250 [34]=`11010001<<8+(-27-2)&#ff 260 [35]=`1011110 1 11110000 RUN A=USR(#800,"IchigoJamASM"):WAIT120

GOTOなどのジャンプ先は、命令の数を相対的に数えます。例えば2つ先なら2、2つ戻るなら-2。その数を-2した数を5桁または11桁の2進数に変換します(例、13コ前に飛ばす場合、(-13-2)&#FF)。命令を追加、変更、削除したときにアドレスを計算し直す必要があるので注意!

PUSHとPOPの数が合わない、ループから抜け出さないなど、どこか間違った場合、保護する機能はないので、高確率でフリーズします。実行前には保存しておきましょう。 フリーズしても、リセットか電源入れ直しですぐに復帰するのがIchigoJamのいいところ!(MSX時代は、暴走時の謎のディスクアクセスに怯えました)

動作が確認できたら、BASICのプログラムに簡単に使えるように、短いコードにしておくのも便利です。(LRUNでつなげてももちろんOKです)

?"1 POKE#700,";:FOR I=0 TO 32:?PEEK(#800+i);",";:NEXT:?CHR$(8) ?"2 POKE#720,";:FOR I=0 TO 36*2-1-32:?PEEK(#820+i);",";:NEXT:?CHR$(8)

アドレスをすべて相対的に使っているため配置変更可能(=リロケータブル)です。このように#800(配列)の領域から#700のPCG領域へ移しておくと、BASICで配列が使えて便利です。

BASICと速度を比べてみましょう。

1 POKE#700,240,181,148,70,0,38,15,24,9,35,27,2,89,24,184,93,192,0,18,24,0,36,19,93,128,37,24,70,40,64,0,208,1 2 POKE#720,1,32,8,112,1,49,109,8,247,209,24,49,1,52,8,44,241,209,24,57,3,32,48,64,3,40,0,208,224,57,98,70,1,54,12,46,227,209,240,189 10 FOR I=0 TO 12*4-1:POKE#800+I,RND(256):NEXT 12 P="BIG SCRNTEST" 15 FOR S=#800 TO #800+12*3:IF !BTN() GOSUB 100 ELSE A=USR(#700,S) 17 WAIT 1:NEXT 20 S=P:IF !BTN() GOSUB 100 ELSE A=USR(#700,S) 22 WAIT 10 30 GOTO 15 100 FOR I=0 TO 11 110 C=PEEK(S+I) 120 FOR J=0 TO 7 122 N=PEEK(C*8+J) 125 A=#900+I&3*8+(I>>2*8+J)*32 130 FOR K=0 TO 7 140 POKE A+K,N&(1<<(7-K))<>0 150 NEXT 160 NEXT 170 NEXT 180 RETURN

ボタンでBASICとマシン語の速度差が体感できます!マシン語だと1tick(1/60秒)かかりません!
1行2行だけ流用すると、他のプログラムでも大きな文字表示、使えます。


動画 on Vine

作るのに手間がかかるけど、動作は高速なマシン語。
作るのは簡単・高速だけど、動作は遅いBASIC。
いろいろなプログラミング言語がある理由はここにあります。

面倒なアドレス計算や表からのピックアップを自動化したものをアセンブラといいます。

また、数式など分かりやすいプログラミング言語から、マシン語の生成してくれるソフトのことをコンパイラといって、C言語はその代表。 IchigoJam BASICは、BASIC言語のコマンドに合わせて対応するマシン語を順に呼び出すインタープリタ。 Ruby、JavaScript、Swift、Javaなど最近の言語はバーチャルマシンといって仮想的なマシンのマシン語を使ったり、適宜コンパイルしたりと、両方のいいとこ取りをしています。

マシン語が分かったら、IchigoJam BASICで実際にアセンブラやコンパイラを作って、プログラミング言語の自作にも挑戦してみてください! ARMマシン語は、Android/iPhoneでも使えます。他のマシン語も似たようなものなので、一つ使えるようになっておけば怖いものなし!(実際、小学生の頃のZ80マシン語の知識が活きました)

日本産の世界に広がるプログラミング言語、Rubyに続こう!

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語

- ARMマシン語表(PDF版)

オリジナル電子楽器「バイナリリコーダー」をつくろう! IchigoJam音階周期対応表

2016/08/13 23:55:00
#KidsIT #IchigoJam #sound 

コンピューターサイエンスにおけるリコーダーを目指す「IchigoJam」で電子リコーダーをつくってみました。


こちらがIchigoJamのPLAY文で使っている音階周期表です。IchigoJamでは画面を1ライン出力するタイミングでSOUNDピンの制御を行っている関係で、ちょっと音痴です。

IchigoJam MML 音階周期対応表

BEEP 60,30:WAIT 30:BEEP 54,30:WAIT 30:BEEP 48,30 OK PLAY"CDE" OK

どちらもドレミと鳴りますね!これを使って、音階を決める3つのタクトスイッチと、オクターブを上げるタクトスイッチ1つで演奏できる「バイナリリコーダー」をつくってみましょう。

タクトスイッチとは、IchigoJamにひとつついているボタンのこと。ブレッドボードやユニバーサル基板にもぴったりなサイズで、1つ10円と安い!(タクトスイッチ(黒色): パーツ一般 秋月電子通商 電子部品 ネット通販

まずはハードウェアづくり。

IN1とIN4はIchigoJam側でプルアップ(何もつながない時1になるように電源電圧に高めの抵抗でつながっていること)されているいるので、そのままタクトスイッチを経由してGNDにつないでしまえばOKです。プルアップのないIN2とIN3は、信号線側に10kΩの抵抗を通じてVCCにつないで自分でプルアップしましょう。(後日、IchigoJamプリントのIN編つくります)

つぎにソフトウェア、プログラムはこんな感じです。

10 LET[0],0,60,54,48,45,40,36,32,0,30,27,24,22,20,18,16 20 M=0 30 N=~IN()&#F:WAIT3:L=~IN()&#F:IF N><L N=M 40 IF N><M ?N:BEEP [N],60:M=N 50 GOTO 30

INコマンドで4つの入力をまとめて取得して、押された時に0になるので、~を使って反転。4bit以外は使わないので、2進数で`1111である16進数の#Fでビット積&を使ってそれ以外を0に(マスクする、という)します。また人間にはぴったり同時押しができないので、WAIT3を挟んで2回取得して、同じ値になった時だけ有効としています。

タクトスイッチ3つの状態が1〜7の時にドレミファソラシをBEEPコマンドで鳴らします。BEEPに渡す数値は上記IchigoJam音階表から拾ってきます。オクターブスイッチが押された時が9〜15なので、ひとつ高いド〜シの値を配列にいれておきます。

バイナリリコーダー音階対応表


バイナリリコーダーでドレミファソラシドと演奏している動画 on Vine

半音を使いたい場合は、このように改造してください。平均律にこだわることなく、自分の好きな音律のバイナリリコーダーや、その他楽しい楽器にしてみましょう!音痴が気になる方は、PWMコマンドを使って正確な音律づくりにも挑戦してみましょう!(ヒント、平均律 - Wikipedia

10 LET[0],0,60,57,51,48,45,42,40,38,36,34,32,30,28,27,25

バイナリリコーダー音階対応表(半音対応バージョン)

音を鳴らすタイミングをボタンではなく、息を吹きかけることで音量をコントロールできたら、よりリコーダーっぽくなるかも?

息を吹きかけ、0.137V発電している様子


モーターと羽は壊れたおもちゃのドローンから取り出してみました。壊れたおもちゃは部品取りして再利用!

オセロ盤で学ぶ2進数アンプラグドワークショップ & あるくクマムシさんプログラム

2016/08/12 23:55:00
#KidsIT #IchigoJam 

コンピューターの得意技、計算と記憶。今回は「記憶」に迫ります。

オセロ盤を使った2進数アンプラグドワークショップ

記憶をどんどんシンプルにしていくと、雨かそうでないか、やったかやらなかったか、あるかないか、○か☓かなど「2つの内どちらか」という情報に行きつきます。この最小情報を表すデータ量を1bit(ビット)と呼びます。


おなじみのオセロのコマ、白を1、黒0というbitとして使ってみましょう。8x8のオセロ盤は64bitのメモリ(=記憶装置)。8bitのことを1byte(バイト)と言い換えることができるので、8byteのメモリでもあります。8Kbyte(キロバイト)の1024分の1、8Mbyte(メガバイト)の約100万分の1、8Gbyte(ギガバイト)の約10億分の1の容量ですね。

IchigoJamのCPU、LPC1114FN28/FDH28には、自由にすばやく書き換えできるRAM(ラム)と呼ばれるメモリが4KB、オセロ盤にして512コ分あります。このメモリ内に画面の状態や、文字のパターン、プログラム、計算途中の数などを記憶させ、コンピューターにどんどん書き換えさせることで、IchigoJamは動いています。

オセロ盤を使って、数を記憶させてみましょう。1とか2とか、ドットパターンで絵を描くのもあり!
でも、ひっくりかえすのが面倒なのと、桁数が増えてくると読み取りにくくなっていきますね。

ひっくり返したコマの個数で記憶するのもナイスアイデアです。
ずっと間違えにくくなりますし、0から64まで明確に表せます。
でも、もっと大きな数を記憶させることはできないでしょうか?
最大、いくつまで記憶させられるでしょう?

(時間をかけて、ここでいろいろ悩んでもらうといいです)

ビットの話を思い出してみましょう。
1bitで表せる数は0と1の2種類でした。では、2bit、2つのコマを使って表せる数は?
実は、2までではなく、0〜3の4種類いけます。00,01,10,11の4パターンあります。
では、3bitでは?4bitでは?やってみましょう!

1bit増える毎に表せるパターンは2倍になります。(普通の数値が1桁増える毎に10倍になるように)
2,4,8,16,32...8bitで256種類、16bitで65536種類、32bitで4294967295(約42億)種類...
答、オセロ盤を全部使った64bitでは、約1844京(18446744073709551616)まで記憶できます。

IchigoJamを使った2進数プラグドワークショップ

IchigoJamのメモリをいじって、自分の好きなキャラクターをゲーム画面上に登場させてみましょう!
早速、8x8にコマを敷き詰めたオセロ盤を使って絵を描きます。

bitで表す数のことを2進数と呼びます。IchigoJamやコンピューターでは8bit=1byteを基本の単位として使っています。描いた絵は1byteが8行、上から順にメモリに書き込んでいくとそのパターンをゲーム上で使うことができます。


2進数の読み方は2種類あります。1つ目は普通の数と同じように読む方法、一番右が1の位、ひとつ左が2の位、更に左が4の位で、一番左が128の位なので、その位が1の数を全部足すと読めます。例えば、10101111だと、128+32+8+4+2+1で、175となります。

もう一つの読み方は16進数を使う方法です。慣れてしまえばこっちのほうが簡単です。8bitを4bit2つに分けて読みます。10101111だと、1010と1111、それぞれ、8+2で10と8+4+2+1で15です。次に10から15をAからFに置き換えてつなげます。できた「AF」が16進数で175を表す数です。確かめてみましょう。16進数は1の位から始まって、ひとつ左は16の位。10*16+15で175です。

IchigoJamのメモリは文字のパターンからはじまっています。1文字8byteずつ256種類、2048byteの内、後ろ32コが書き換え可能です。文字コード255のパターンをのぞいてみましょう。

10 FOR I=0 TO 7 20 N=PEEK(255*8+I) 30 ?BIN$(N,8),HEX$(N,2) 40 NEXT 50 ?CHR$(255)

PEEKコマンドでメモリを1byte読みます。文字コード255のパターン8つをとりだし、2進数と16進数に変換して表示すると、イチゴパターンが表れます。

このパターンをオリジナルに書き換えてみます。

POKE255*8,0,#3E,#7F,#FF,#FD,#FF,#AA,0

イチゴに替わって、クマムシさんが登場しました!

パターンは最大32コまでつくれます。もうひとつパターンをつくって、アニメーションさせてみます。

10 POKE255*8,0,#3E,#7F,#FF,#FD,#FF,#AA,0 20 POKE254*8,0,#3E,#7F,#FF,#FD,#FF,#54,0 30 ?CHR$(255,LEFT);:WAIT30 40 ?CHR$(254,LEFT);:WAIT30 50 GOTO 30

ボタンを押したら歩くプログラムにしてゲームっぽくしてみます。

10 POKE255*8,0,#3E,#7F,#FF,#FD,#FF,#AA,0 20 POKE254*8,0,#3E,#7F,#FF,#FD,#FF,#54,0 30 ?CHR$(255,LEFT); 35 IF BTN()=0 GOTO 35 40 ?CHR$(254,LEFT); 45 IF BTN()=1 GOTO 45 46 ?" "; 50 GOTO 30


あるくクマムシさん動画クマムシさん

10秒ぴったりにゴールするゲーム、連打して速さを競うゲーム、障害物をジャンプするゲームとか、自分でつくったパターンでいろいろつくって自慢しよう!

参考教材
- 2しんすうをつくるBIN$(バイナリー) - IchigoJamプリント
- じぶんだけのキャラをつくる / はじめてのプログラミングその19


流れ星が見えた夜でしたが、撮影は失敗(ペルセウス座流星群ピーク

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — 表示 4.0 国際 — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / 高解像度プロフィール画像(和服)