福野泰介の一日一創 - create every day

Macで開発、FPGAで作る4bit学習用CPU「GMC-4」 - Parallels x Ubuntu x Quartus x Verilog

2018/09/26
#FPGA #maker #Verilog 

Intel/ALTERAのFPGA開発環境「Quartus」は、Windows/Linux対応、Mac非対応。
でも、仮想環境 Parallels Desktop を使えば、Mac上でLinuxが動かし、開発できます。
以前はIchigoJamで作った学習用4bitCPU「GMC-4」を、今度はハードウェアで実現!

50MHzで動作する4bitマイコン「GMC-4 - Vol.24 4ビットマイコン | 大人の科学マガジン | 大人の科学.net
音やウェイトは未実装。次は、回路シミュレーターで遊んでみる予定。

MacでFPGA開発する手順 (GMC-4)
1. Parallels Desktop を Mac にインストール(Windowsを使わなければ無料版のLiteでOK)
2. Parallelsのインストールアシスタントで、Ubuntu Linuxを選ぶだけで簡単インストール
3. MacのファイルシステムをUbuntuと共有設定する
4. 仮想環境で使うメモリを1GBから4GBに変更する(Quratusのインストールで落ちた)
5. Quartus Prime Lite をUbuntuでセットアップする(要、ユーザー登録)
6. 書き込み器「USB Blaster」が使えるように設定して、Ubuntuを再起動(末尾に設定方法)
7. VerilogでGMC-4を作り、ピン設定する
8. コンパイル(MacBook Pro 2.3GHz Intel Core i5で、論理合成40秒、Windows環境でもほぼ同じ時間)
9. QuartusのProgrammerで書き込み、動く!


Mac上で動くUbuntu Linux、マウスもキーボードもシームレスに動いてくれるので、普通にアプリケーションを使う感覚で使えて便利! 速度差も思ったほどなく、いつでもどこでもFPGAプログラミングができるようになって嬉しい!


Intel® Programmable Acceleration Card with Stratix® 10 SX FPGAより)
IntelだけどArmも入ってる!(Overview)

FPGAニュース「インテル、「多機能アクセラレータ」のFPGA新モデルを追加 - ZDNet Japan
本気で使うFPGA、サーバーマシンに接続し、ソフトウェアでは到達不可能な処理速度を実現!
なんと、回路規模はトランジスタ換算で6600万コ!(2755k LE x 12ゲート/LE x 2トランジスタ/ゲート)
25Gbpsの通信路に、2.4GbpsでアクセスできるRAM、ArmのプロセッサCortex-A53も入っている豪華仕様。
お値段、約100万円。
解説書付きで5,000円書き込み器内蔵のものも3,000円などの手頃なFPGAと比較し、回路規模だけで340倍違うので、なかなかいい値段。

サーバー処理のボトルネックをハードウェア化する時代、到来!

(おまけ)
4bitCPU「GMC-4」をVerilogで書いたプログラム。
gmc4_top.v

module gmc4_top( input clk, output [3:0] outport); reg n_reset; poweronreset por(clk, n_reset); wire cpuclk; clockdivider clkdiv(clk, n_reset, 4, cpuclk); reg [3:0] key; wire [7:0] ledbin; wire [3:0] lednum; gmc4 cpu(cpuclk, n_reset, key, ledbin, lednum); assign outport = ~lednum; endmodule

gmc4.v

module gmc4( input clk, input n_reset, input [3:0] key, output reg [7:0] ledbin, output reg [3:0] lednum); reg [3:0] mem[0:8'h5f]; reg [7:0] pc; reg [3:0] rega, regb, regy, regz, rega2, regb2, regy2, regz2; reg flg; wire [3:0] op1, op2, op3; assign op1 = mem[pc]; assign op2 = mem[pc + 1]; assign op3 = mem[pc + 2]; always @(posedge clk, negedge n_reset) begin if (!n_reset) begin // rom_blink; rom_count; pc <= 0; flg <= 0; lednum <= 0; ledbin <= 0; end else begin case (op1) 4'h0: begin rega <= key; flg <= key != 0; end 4'h1: begin lednum <= rega; flg <= 1; end 4'h2: begin rega <= regb; regb <= rega; regy <= regz; regz <= regy; flg <= 1; end 4'h3: begin rega <= regy; regy <= rega; flg <= 1; end 4'h4: begin mem[regy] <= rega; flg <= 1; end 4'h5: begin rega <= mem[regy]; flg <= 1; end 4'h6: { flg, mem[regy] } <= mem[regy] + rega; 4'h7: begin mem[regy] <= mem[regy] < rega ? 0 : mem[regy] - rega; flg <= mem[regy] < rega; end 4'h8: begin rega <= op2; flg <= 1; end 4'h9: { flg, rega } <= rega + op2; 4'hA: begin regy <= op2; flg <= 1; end 4'hB: { flg, regy } <= regy + op2; 4'hC: flg <= rega != op2; 4'hD: flg <= regy != op2; 4'hE: begin case (op2) 4'h0: lednum <= 0; 4'h1: ledbin[regy] <= 1; 4'h2: ledbin[regy] <= 0; 4'h3: ; // none 4'h4: rega <= ~rega; 4'h5: begin rega <= rega2; rega2 <= rega; regb <= regb2; regb2 <= regb; regy <= regy2; regy2 <= regy; regz <= regz2; regz2 <= regz; end 4'h6: begin rega <= rega >> 1; flg <= ~rega[1]; end 4'h7: ; // sound end 4'h8: ; // sound err 4'h9: ; // sound pi 4'hA: ; // sound piii 4'hB: ; // sound rega 4'hC: ; // wait (rega + 1) * 0.1sec 4'hD: begin ledbin[3:0] <= mem[8'h5e]; ledbin[7:4] <= mem[8'h5f]; end 4'hE: mem[regy] <= mem[regy] - rega; 4'hF: { mem[regy - 1], mem[regy] } <= { mem[regy - 1], mem[regy] } + rega; endcase if (op2 != 4'h6) flg <= 1; end 4'hF: begin pc <= flg ? { op2, op3 } : pc + 3; flg <= 1; end endcase if (op1 < 4'h8) pc <= pc + 1; else if (op1 < 4'hF) pc <= pc + 2; end end task rom_blink; mem[0] <= 4'h8; mem[1] <= 4'h1; mem[2] <= 4'h1; mem[3] <= 4'h8; mem[4] <= 4'h0; mem[5] <= 4'h1; mem[6] <= 4'hF; mem[7] <= 4'h0; mem[8] <= 4'h0; endtask task rom_count; mem[0] <= 4'h8; mem[1] <= 4'h0; mem[2] <= 4'h9; mem[3] <= 4'h1; mem[4] <= 4'h1; mem[5] <= 4'hF; mem[6] <= 4'h0; mem[7] <= 4'h2; endtask endmodule

poweronreset.v

module poweronreset( input clk, output n_reset); reg [7:0] counter; always @(posedge clk) begin if (counter != 8'b11111111) counter <= counter + 8'b1; end assign n_reset = counter == 8'b11111111; endmodule

clockdivider.v

`define LEN_CLOCK 50_000_000 module clockdivider( input clk, input n_reset, input [3:0] div, output reg outclk); reg [31:0] counter; always @(posedge clk, negedge n_reset) begin if (!n_reset) begin outclk <= 0; counter <= 0; end else if (counter == (`LEN_CLOCK >> div) - 1) begin counter <= 0; outclk <= ~outclk; end else counter <= counter + 1'b1; end endmodule

USB Blaster設定 for Ubuntu Linux

su cat > /etc/udev/rules.d/51-usbblaster.rules # Intel/Altera USB-Blaster SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666", SYMLINK+="usbblaster/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666", SYMLINK+="usbblaster/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666", SYMLINK+="usbblaster/%k" # Intel/Altera USB-Blaster II SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6010", MODE="0666", SYMLINK+="usbblaster2/%k" SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6810", MODE="0666", SYMLINK+="usbblaster2/%k"

links
- プログラムたった64行、FPGAで創るオレオレ32bitCPU「TF32CPU r1」90Mhz x 2コア動作 on MAX10
- 最大動作周波数468MHz!? 書籍の付録とUSB BlasterではじめるFPGA「MAX10-FB」の組み立て方

プログラムたった64行、FPGAで創るオレオレ32bitCPU「TF32CPU r1」90Mhz x 2コア動作 on MAX10

2018/09/23
#FPGA #Verilog #maker #kosen 

半導体チップを作り放題な夢のデバイス「FPGA」で動かしてみた4bitCPU TD4
せっかくなので手で配線するのは大変な32bitCPUのツインコアに挑戦!
シンプル設計なオレオレCPUを創って、MAX10評価ボード上で、2コア動作させてみました。


90MHzで動作している32bit CPU 2コアの様子。
単にエルチカしているだけですが、毎秒1.8億回計算しています。

オレオレCPUづくりの手順
1. 32bit CPUをつくろう(汎用レジスタが32bit)
2. マシン語は32bit固定長にしよう
3. 命令は、ロード、ストア、代入、加算、減算、or、and、xor、左シフト、右シフト、掛け算の11種類
4. 命令に4bit、レジスタ指定に4bit x 2、16bitを値に使おう
5. レジスタは4bitなので16コ、最後レジスタをArmっぽくプログラムカウンタにしよう
6. 条件判定用のフラグはゼロフラグだけ
7. 残り4bit、Arm32っぽいフラグによるスキップ、フラグ更新するか否か、16bitの値の符号としよう
8. 出力はメモリにマッピングしておこう(RAMは32bit x 32word、最後の31番目を出力に接続)

9. Verilogを勉強する

初めて使うハードウェア記述言語、なんとなくサンプルいじっていてもよくわからないので書籍を購入。
わかるVerilog HDL入門―文法の基礎から論理回路設計、論理合成、実装まで (トランジスタ技術SPECIAL)
購入の決め手は、著書の木村真也さんが群馬高専の先生なこと。
しかも、函館高専の出身でした!

Verilogのコツは、組み合わせ回路と順序回路、シミュレーション用と論理合成用をきちんと区別すること。

組み合わせ回路:wireでassignしたりfunctionでつなぐ(フリップフロップなど、フィードバックなしの回路)
順序回路:alwaysでclk立ち上がりとn_reset立ち下がりでのregの変化をtaskなどで記述

シミュレーション用記述:#10などの遅延、initialはシミュレーション用(initialでも合成されてたけど??)

10. Verilogで実装する(名付けて、TF32CPU r1 - Taisuke Fukuno's 32 bit CPU release 1)

module tf32cpu_r1( input clk, input n_reset, output [3:0] outport); reg [31:0] r[0:15]; // register reg [31:0] mem[0:31]; // 32 word reg zeroflg; wire [31:0] code; wire skipflgnz; wire skipflgz; wire flgchg; wire minusim; wire [3:0] op; // operation code wire [3:0] rega; wire [3:0] regb; wire [31:0] opland; wire [15:0] im; // immediate data assign code = mem[r[15]]; assign skipflgnz = code[31]; assign skipflgz = code[30]; assign flgchg = code[29]; assign minusim = code[28]; assign op = code[27:24]; assign rega = code[23:20]; assign regb = code[19:16]; assign im = code[15:0]; assign opland = r[regb] + (minusim ? -im : im); always @(posedge clk, negedge n_reset) begin if (!n_reset) begin // program init_blink; init_reg; end else begin if (skipflgnz && !zeroflg || skipflgz && zeroflg) r[15] <= r[15] + 1; else begin case (op) 4'h0: r[rega] <= mem[opland]; 4'h1: mem[opland] <= r[rega]; 4'h2: r[rega] <= opland; 4'h3: r[rega] <= r[rega] + opland; 4'h4: r[rega] <= r[rega] - opland; 4'h5: r[rega] <= r[rega] | opland; 4'h6: r[rega] <= r[rega] & opland; 4'h7: r[rega] <= r[rega] ^ opland; 4'h8: r[rega] <= r[rega] << opland; 4'h9: r[rega] <= r[rega] >> opland; 4'hA: r[rega] <= r[rega] * opland; endcase if (flgchg) zeroflg <= r[rega] == 0; if (rega != 15) r[15] <= r[15] + 1; end end end assign outport = mem[31][3:0]; endmodule

- Verilogの特徴
短く書ける!(32bit CPUが、64行)
moduleが回路のかたまりを表す。(inputやoutputでインターフェイスを定義)
ブロックの表記方法は、begin / end({ }はbitの括りを表すのに使っちゃっている)
a[3:0]で、aのbit3からbit0までの4bitを表す。(何もつけないと1bit)
bitの長さを意識することは大事だけど、割といい感じにキャストされる
posedgeが立ち上がった時、negedgeが立ち下がった時
<= が、順序回路で次のタイミングへの切り替えを表す(同じタイミングで同じregに入れるとエラー)

11. レジスタの初期化とプログラムを task でメモリにセットするコードを追記

task init_blink; // for slowclock begin mem[ 0] <= 32'h0_2_3_0_0001; // R3=1 mem[ 1] <= 32'h0_1_3_0_001F; // [31]=R3 mem[ 2] <= 32'h0_2_3_0_0002; // R3=2 mem[ 3] <= 32'h0_1_3_0_001F; // [31]=R3 mem[ 4] <= 32'h0_2_F_0_0000; // PC=0 mem[31] <= 32'h00000000; // outport end endtask task init_reg; begin r[ 0] <= 32'h0; r[ 1] <= 32'h0; r[ 2] <= 32'h0; r[ 3] <= 32'h0; r[ 4] <= 32'h0; r[ 5] <= 32'h0; r[ 6] <= 32'h0; r[ 6] <= 32'h0; r[ 7] <= 32'h0; r[ 8] <= 32'h0; r[ 9] <= 32'h0; r[10] <= 32'h0; r[11] <= 32'h0; r[12] <= 32'h0; r[13] <= 32'h0; r[14] <= 32'h0; r[15] <= 32'h0; zeroflg <= 1'b0; end endtask

12. クロックやリセットとつないでオレオレCPUが動いた!
(MAX10評価ボードの場合、クロック clk=27、LED outport=132,134,135,140,141)

module tf32cpu( input clk, output [4:0] outport); wire cpuclk; assign cpuclk = clk; wire n_reset; poweronreset por(cpuclk, n_reset); reg [3:0] exout; tf32cpu_r1 cpu1(cpuclk, n_reset, exout); assign outport = { cpuclk, ~exout }; endmodule

poweonreset.v (起動後に少し待って n_reset を0にする回路)

module poweronreset( input clk, output n_reset); reg [7:0] counter; always @(posedge clk) begin if (counter != 8'b11111111) counter <= counter + 8'b1; end assign n_reset = counter == 8'b11111111; endmodule

13. ALTPLL(50MHzを9逓倍5分周)でクロックアップ!(90MHzが限界でした、それ以上だと沈黙)

module tf32cpu( input clk, output [4:0] outport); wire cpuclk; pll pll1(clk, cpuclk); // 略 endmodule

14. CPUのインスタンスを足して、ゆっくりCPUとの2コア(ツインCPU!)構成にしてみる

module tf32cpu( input clk, output [4:0] outport); wire cpuclk; pll pll1(clk, cpuclk); wire n_reset; poweronreset por(cpuclk, n_reset); reg [3:0] exout; tf32cpu_r1 cpu1(cpuclk, n_reset, exout); reg [3:0] exout2; wire slowclk; clockdivider cdiv2(cpuclk, n_reset, 2, slowclk); tf32cpu_r1 cpu2(slowclk, n_reset, exout2); assign outport = { slowclk, ~(exout | (exout2[1:0] << 2)) }; endmodule

クロックを遅くする clockdivider.v

`define LEN_CLOCK 50_000_000 module clockdivider( input clk, input n_reset, input [3:0] div, output reg outclk); reg [31:0] counter; always @(posedge clk, negedge n_reset) begin if (!n_reset) begin outclk <= 0; counter <= 0; end else if (counter == (`LEN_CLOCK >> div) - 1) begin counter <= 0; outclk <= ~outclk; end else counter <= counter + 1'b1; end endmodule

15. ツインCPUで動いた!
論理合成に2分半かかり、MAX10-08のLE使用率87%なのでトリプルにするにはきっとROM/RAMの切り離しが必要。(1コアだと合成1分14秒、46%)
* ツインCPUという懐かしい変な言葉。CPUという部品はなく、あるコンピューターの中心的役割を果たすコンピューターをCPU(中央処理装置 / Central Processing Unit)と呼ぶ。なので、正しくはツインコアのCPU。

16. マシン語プログラムを書き換える

mem[ 0] <= 32'h0_2_1_0_2FAF; // R1=#2FAF (50M=2FAF080) mem[ 1] <= 32'h0_8_1_0_0009; // R1=R1<<9 // mem[ 0] <= 32'h0_2_1_0_0003; // R1=3 for slowclock // mem[ 1] <= 32'h0_2_1_0_0003; // R1=3 mem[ 2] <= 32'h0_3_3_0_0001; // R3=R3+1 mem[ 3] <= 32'h0_1_3_0_001F; // [31]=R3 // LED1 mem[ 4] <= 32'h0_2_2_1_0000; // R2=R1 mem[ 5] <= 32'h2_4_2_0_0001; // R2=R2-1 flg mem[ 6] <= 32'h4_4_F_0_0001; // if !Z PC=PC-1 mem[ 7] <= 32'h0_1_4_0_001F; // [31]=R0 // LED0 mem[ 8] <= 32'h0_2_2_1_0000; // R2=R1 mem[ 9] <= 32'h2_4_2_0_0001; // R2=R2-1 flg mem[10] <= 32'h4_4_F_0_0001; // if !Z PC=PC-1 mem[11] <= 32'h0_2_F_0_0002; // PC=2

4つのLEDを2進数でカウントアップするデモプログラム(マシン語 for TF32CPU r1)

links
- 憧れのCPUづくりが超簡単!あの4bitコンピューターTD4マシン語プログラム on FPGA MAX10
- FPGAはじめのいっぽ、MAX10 FPGA 評価キットでエルチカ成功!
- 最大動作周波数468MHz!? 書籍の付録とUSB BlasterではじめるFPGA「MAX10-FB」の組み立て方

最大動作周波数468MHz!? 書籍の付録とUSB BlasterではじめるFPGA「MAX10-FB」の組み立て方

2018/09/19
#FPGA #Verilog #maker 

FPGAの評価ボードに替えて、雑誌付録のMAX10基板でフルカラーエルチカできました!

書き込み器「USB Blaster」は、なんと687円!?


FPGA MAX10搭載基板が付録の「FPGA電子工作スーパーキット」+1,000円ちょっとで揃います!
著書は、LPC1114との出会いの書「2枚入り!組み合わせ自在!超小型ARMマイコン基板」と同じ、圓山宗智さん。


付録のFPGAチップ搭載の基板!
クリスタルオシレーター(48MHz)とピンヘッダーで、USB Blaster仕様の最小仕上げをします。
※写真は家にあった12MHzのクリスタルオシレーター


USB BlasterのJTAGケーブルを接続するCN7端子を、ピンヘッダー5ピンx2にして、はんだづけ。
(JTAGケーブルを挿してはんだづけするとゆがみにくい!)


裏面、はんだジャンパーを12箇所、はんだづけします。


CN3のVCC33とGNDで電源を供給できるようにピンソケットをはんだづけ。


Flashに書き込めば、電源つないだら数msecで即動作!
MeganeJamは5Vから3.3Vを生成するためにのみ使用、単3を2本の電池ボックスなどでもOK)

無償で使える開発環境 Quartus Prime Light edition、IPカタログからALTPLLを選択して、クリスタルオシレーターと入力周波数を合わせ(12MHzや、48MHzなど)、倍率を設定することで任意の周波数で動かせます。

クリスタルオシレーター12MHzを39倍にした468MHzまでは動作しました!(40倍の480MHzでは沈黙)
* スペックとしては450MHzでした (2018.9.23 追記)

自由自在に超高速エルチカできる環境が手に入ったわけです!

下記、動作確認で使ったエルチカプログラム Verilog for MAX10-FB書籍付属基板
ピン配置(外部クロック 27、LED_R/G/B 120/121/122、タクトスイッチ 123)

`define PER_CLOCK 48_000_000 / 10 module max10cq(input clk, output [2:0] leds, input sw1); wire clk2; wire locked; wire clk48; wire red; wire green; assign leds[0] = sw1 == 0 ? 1 : red; assign leds[1] = sw1 == 0 ? 1 : green; clkdivider clkdiv(clk48, clk2); ledsign led1(clk2, red, green, leds[2]); pll pll1(1'b0, clk, clk48, locked); endmodule module clkdivider (input inclk, output reg outclk); reg [31:0] cnt; initial begin cnt <= 32'b0; outclk = 1'b0; end always @(posedge inclk) begin if (cnt == `PER_CLOCK / 2 - 1) begin cnt <= 0; outclk <= ~outclk; end else cnt <= cnt + 32'b1; end endmodule module ledsign (input clk, output reg a, output reg b, output reg c); reg [2:0] memcnt; reg [2:0] mem [3:0]; initial begin { a, b, c } <= 3'b111; memcnt <= 0; mem[0] <= 3'b110; mem[1] <= 3'b101; mem[2] <= 3'b011; mem[3] <= 3'b101; end always @(posedge clk) begin { a, b, c } <= mem[memcnt]; memcnt <= memcnt + 3'b1; end endmodule

links
- (1)MAX10(2)ライタ(3)DVD付き! FPGA電子工作スーパーキット (トライアルシリーズ) | 圓山 宗智 |本 | 通販 | Amazon
- 憧れのCPUづくりが超簡単!あの4bitコンピューターTD4マシン語プログラム on FPGA MAX10
- FPGAはじめのいっぽ、MAX10 FPGA 評価キットでエルチカ成功!

FPGAはじめのいっぽ、MAX10 FPGA 評価キットでエルチカ成功!

2018/09/15
#maker #FPGA #VHDL 

訪問いただいた舞鶴高専の町田秀和先生よりきっかけいただき、ようやくFPGA初めできました!
電子回路をソフトウェア的に組むことができるデバイス、できる幅が広がりそうです。

ただのエルチカからちょっとだけ進化させて、入力によって点滅の周期と点滅する場所を変えてみました。
使用機材(MAX 10 FPGA 評価キット、書き込み器 USB Blaster)

FPGAを動かす手順
1. 回路図を書く
2. コンパイル(論理合成?)
3. 回路で使用するピンを実際のピンに割り当てる 再びコンパイル
5. 書き込み器を使って転送
6. 動く!

回路規模ほぼ最小でのコンパイルの所要時間、26秒(Windows 10, Core i7 6700)。
やはりちょっと時間かかるけど、待てないレベルじゃない。
転送は2秒と十分高速!


図を手で描くのも楽しいですが、煩わしいので、回路記述言語VHDLの出番!
なかなか癖があって楽しい言語ですが、複数行コメントがないのはちょっと困りもの・・・。


舞鶴高専町田先生イチオシ、FPGA

FPGAとIchigoJamとつないだり、高速性を活かした楽器づくり、CPUから作るIchigoJamにも挑戦したい。
そのためまずはコンパイルした回路をFlashに書き込んで、電源入れたら動くようにしなくては!

WS2812B x IchigoJamでエモいウェアラブル「イチゴ帽子」プログラミング入門とマシン語、舞鶴x鯖江コラボに向けて

2018/09/14
#maker #IchigoJam 

エモーショナルな装備(エモウェア)に最適、IchigoJamで個別制御可能で1灯当たりなんと11円と格安なフルカラーテープ状LED、WS2812Bを使ったイチゴ帽子でキラキラプログラミング入門。

30ものフルカラーLEDをたった1本でコントロールするヒミツは特殊なシリアル通信。 ひとまず次のプログラムを打ち込み、5VをVCC、GNDをGND、DIをOUT1へつないで、動かしてみましょう!(実行前に保存がオススメ)

10 POKE#700,240,181,114,182,64,24,80,33,9,2,1,49,9,4,4,136,1,48,128,37,1,48,3,120,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38 20 POKE#728,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,60,234,209,98,182,240,189 30 N=33:POKE#800,N*3,N*3>>8 200 M=200 210 POKE#802+RND(N)*3,RND(M),RND(M),RND(M) 220 POKE#802+RND(N)*3,0,0,0 230 U=USR(#700,#800):GOTO210

10-20行がフルカラーLEDを制御するマシン語プログラム(解説マシン語入門)。
30行で光らせる数を設定(この場合33コ)
200-230行でランダムにランダムな色を設定して光らせたり消したりを繰り返し!

#800と#801に光らせるLEDの個数の3倍を書き込んでおき、色は、メモリ#802から3byteずつ、緑、赤、青の順に最大255でそれぞれの光の強さを指定します。 あとは、USR(#700,#800)でマシン語を呼び出せば、設定した通りに光ります。並べ方を工夫すれば電光掲示板にもなりますね!

例えば、先頭を青に光らせたい時は(上記プログラムを実行した後で)

POKE#802,0,0,100:U=USR(#700,#800)

でOK!


七色に輝く!(プログラムは末尾)


ニット帽なら、LEDテープを帽子のフチに通すだけ!一切の裁縫テクニックがいりません。(写真は、手編みIchigoニット帽(ヘタ)


DAISO、100均の電池式モバイルバッテリーは、中のプラスチックの仕切り板をペンチで折っておくと電池交換が楽です。


ものづくり好きが集まるイベントには、好きな帽子やネクタイをLEDで飾ってお出かけすると1.5倍楽しくなりますよっ。


さくらインターネット田中さんの担任の先生だった、舞鶴高専町田先生がご来鯖!めがね会館にて!


ZigBeeによるリモコン、コントローラーもMDF。素のAVRをC言語で開発しているとのこと。


舞鶴高専の授業でやっているミニロボコンの機体を見せていただきました。レーザーカッターによる筐体は仕上がりがきれい!


レーザーカッター、3Dプリンタといえば、鯖江のものづくりスポット、Hana道場。こどもでも組み立て可能なIchigoJam、秋葉原の電子パーツ屋さんのように、部品ピックアップからの体験も楽しめます! いろいろ体験できるスポット、ぜひ舞鶴にも!


舞鶴高専町田先生イチオシ、回路をプログラミングで自由に作れてしまう、ソフトのような不思議なハードウェア、FPGA、MAX10! 1チップMSXの誕生などでも有名。コンパイル速度や、開発機材の値段などで後回しにしていましたが、いよいよ手を出す時が来ました! それぞれ拠点ごとの得意技を活かしたこどもプログラミング教材交換、楽しみです!

【おまけ、光るイチゴ帽子のプログラム IchigoJam x WS2812B】
七色に輝き、赤いドットが流れ、光のグラデーションの3パターンをランダムに繰り返すプログラムはこちら(10-30行は上記と共通)

10 POKE#700,240,181,114,182,64,24,80,33,9,2,1,49,9,4,4,136,1,48,128,37,1,48,3,120,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38 20 POKE#728,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,60,234,209,98,182,240,189 30 N=33:POKE#800,N*3,N*3>>8 40 GSB(2+RND(3))*100:CONT 100 @HSV2RGB:R=V:G=V:B=V:IF S=0 RTN 110 D=H/60%6:C=V-(59-H%60)*V/60*S/100:E=V-H%60*V/60*S/100:F=V*(100-S)/100 120 IF!DG=C:B=F 130 IFD=1R=E:B=F 140 IFD=2R=F:B=C 150 IFD=3R=F:G=E 160 IFD=4R=C:G=F 170 IFD=5G=F:B=E 180 RTN 190 @CLR:POKE#802,0:COPY#803,#802,N*3-1:RTN 200 H=RND(360):S=100:V=0:T=39 210 V=V+((T%20>9)*2-1)*5:GSB@HSV2RGB:POKE#802,G,R,B:COPY#805,#802,N*3-3:U=USR(#700,#800):T=T-1:IFTCONTELSERTN 300 S=100:V=150:T=66:GSB@CLR 305 V=150 310 COPY#802+N*3-1,#802+N*3-4,-N*3+3 320 POKE#802,0,V*(T%5=0&&T>33),0 330 U=USR(#700,#800):WAIT4 340 T=T-1:IFTGOTO310ELSERTN 400 GSB@CLR:V=50:T=123:X=4<<RND(4):H=0 410 COPY#802+N*3-1,#802+N*3-4,-N*3+3:IF T<33 V=0 420 GSB@HSV2RGB:POKE#802,G,R,B:H=(H+X)%360 430 U=USR(#700,#800):WAIT3:T=T-1:IFTGOTO410ELSERTN

DMX512や、BASICでも、もっと高速にもコントロールできるAPA102Cなどの例もどうぞ!

links
- 福井県鯖江市の、めがね会館とHANA道場で、IchigoJamの福野さんと楽しい会話 | yet another 舞鶴電脳工作室(2018/5再開)

開会式前に福井国体スタート!IoTシャトルバス稼働現場と稼働実績オープンデータ

2018/09/13
#opendata #maker #IchigoJam 

福井国体、開会式は9/29ですが、競技は9/13にハンドボールからスタート!
永平寺町の北陸電力福井体育館フレアと駐車場となっている福井県立大学を結ぶ、IoTシャトルバスを現地視察。


競技場ではちょうど福井県ハンドボール選手が山口県と試合中。「チア☆ダン」のJETSも応援!
「チア☆ダン」JETSはなぜ世界で勝てるのか | 福井新聞 | 東洋経済オンライン | 経済ニュースの新基準
福井商業高校チアリーダー部 JETSがモデルとなった作品「チア☆ダン」のドラマがついに最終回を迎えます。 - Dearふくい」 」


福井県立大学の正面玄関から車で入ると専用駐車場への案内看板があります。
競技会場に行っても駐車できないので注意!(できませんでした)


福井国体シャトルバスどこ? / 永平寺町」へのQRコードが設置されてました!


シャトルバス、思ったより大きい!


シャトルバスのダッシュボードに養生テープで貼り付けられいたIchigoSoda (IchigoJam x sakura.io)とIchigoSensors、電池(単3x4)


リアルタイムに動く様子を見ながら、シャトルバスで九頭竜川を超えて会場へ。


(動画 on Facebook)


無料ふるまい、おもてなしコーナーがありました。それぞれ会場に行くとちょっといいことあるみたい!オープンデータがあっても良さそうです。


福井国体シャトルバスどこ? / 永平寺町
一日稼働分をGitHub風のデータ受信回数で色分けしてみました。途中、なぜか送信が停止してしまった件は、ひとまず不定期に手動で再起動してもらうカタチで応急措置。電池は何日間かは持ちそうです。 10秒間隔で送信していましたが、バスの速度だと30秒程度でも十分そう。経路を色塗りしたのでわかりやすくなりました。これもアプリで自動化しておけると便利ですね。

JSON形式でオープンデータとしています。いろいろ解析してみるのもおもしろいかもしれません。

福井国体障スポ、気になる競技、覗いてみながら、あったら便利な機能、ぜひお寄せください!
しあわせ元気 お役立ち情報アプリ - 福井国体障スポ

札幌からの贈りもの「SapporoJam」ピンソケットはんだづけ一人称動画

2018/09/06
#IchigoJam #KidsIT #maker #hokkaido 

北海道地震前、札幌から届いた「SapporoJam」
札幌市時計台っぽいカタチの、PCN札幌によるIchigoJam互換機です!

時計部分にサウンダーがついているのが特徴!


これら部品をはんだづけします(*15pFは写真のものから、2.54mmピッチのものに後に変更)


スマホMR、録画できるメガネ「meganerec」で一人称はんだづけ動画を撮影!・・・のはずが前半部分が容量不足で失敗。


後半の曲がらないようにピンソケットをはんだづけする部分と、LEDを光らせる動作確認部分!

A Syntax error LED1 OK LED0 OK LED1:WAIT30:LED0 OK 1 LED1:WAIT10 2 LED0:WAIT10 3 GOTO1 RUN Break in 2 2 LED0:WAIT10 SAVE0 Saved 42byte OK

エルチカして、エルチカゲームで遊び、エルチカロボットに仕立てるまでのプログラム!


普段のメガネを外し、スマホVRを使った、デジタルメガネでの表面実装からすべてのはんだづけをやってみましたが、意外となんとかなるものです! 一人称はんだづけでFPS実況、いいかも?
* First Person Soldering


ご当地IchigoJam集めも楽しいかも!?
みなさまの地域では何Jam?

自分の製品が売れる喜び!コミケ、MakerFaire、高専祭、地元の祭にオンライン、メイカーの活躍の場はたくさん! Hayate x IchigoJam

2018/08/30
#IchigoJam #maker 

インターン11日目!参加2日目には決まる、あだな。
ESP32という人気の無線LAN/BLE付き32bitマイコン使い「エスパー」が、プロジェクトで使っていた謎基板。
聞くと、なんと自作品「FullColorLEDBar hayate」!
基板もちょうど持っているということで、頒布してもらっちゃいました!


- 使う部品
I2C I/Oエキスパンダ PCF8574N x 5(40点分) 130円x5 = 650円
フルカラーバーLED10 x 4(40セグメント分) 250円x4 = 1,000円
抵抗100Ω(1kΩでもだいたいでok)x 40 100円で60本余る

通販した部品が届いたので、早速お試しまずはIC、1つで実験!
I/Oを拡張するPCF8574Nは、IchigoJamのI2C命令でとっても簡単に使えます!
IchigoROMなどI2C用のプルアップ抵抗(SDA/SCLからVCCへ2.4kΩなどを接続する抵抗)をつけた状態で、J1を上から、SDA,SCL,3.3V,GNDの順、J2の一番上(赤)をIchigoJamのGNDに接続し、

?I2CW(32,15) 0 OK ?I2CW(32,0) 0 OK

ひとまず8つのLEDバーが赤色に光り、自由自在!(I2CWコマンド、正常だと0が返ります)
続いて、J2(赤、緑、青)をOUT1,OUT2,OUT3に接続して

10 U=I2CW(32,N) 20 OUT RND(8) 30 N=N+1 40 WAIT 3 50 GOTO 10

I2Cのアドレス32が配線側、最大5つ、32〜36に対して、0〜255の値を書き込めば光る!簡単!
RGB、三色に光る!高速に切り替えることで七色化したり、各色を光らせる時間を制御してフルカラー化も可能。


どんなプロダクトになるかはお楽しみ!成果発表会は来週金曜日!


動作確認できたので、残りもばばっとはんだづけ!
抵抗40コ!連続はんだづけ技「流しはんだ」が決まると気持ちいい。
至福の20分を味わって、完成です。


40コ使った巨大メーターのできあがり!
値Nを使って、メーター表示するプログラムはこんな感じ

30 FOR I=0 TO 4 40 M=N-I*8:IF M>8 M=0 ELSEIF M<0 M=0 50 R=I2CW(32+I,1<<M-1) 60 NEXT

そのプログラムを使ってランダムに三色表示するプログラム

10 LET[0],6,5,3 20 N=RND(41):?N 70 OUT[RND(3)] 80 WAIT10:GOTO20


動画で見る、FullColorLEDBar (Hayate) rev0.1 Designed by @3rdJCG x IchigoJam

使ってくれるとうれしい、自分で作ったもの。
実は、売れるともっとうれしいんです!

ソフトウェアと違って、原価がかかるハードウェアは販売する心理的ハードルが低いのが特徴です。
コミケ、MakerFaier、高専祭など、いろんな機会がありますが、オンラインでも大丈夫!

実はIchigoJam、最初に売れたのは弊社オンラインフリマサービス「オタマート
jig.jpがハードウェア参入、MSX0 を勝手に発表」という2014年のエイプリルフール投稿に軌跡、残ってました。

ちょっとした光る部品、基板づくりもWebアプリ「Upverter」を使えば、そこそこ簡単!
ブレッドボードと部品キットと説明書の組み合わせだと、もっと手軽。

作る喜びが加速する、売れる喜び、ぜひご体感ください!

いよいよ架橋!?jigインターンDay11
迫るデスマとランチ会 - jigintern2018’s diary
Hana道場で進む、中高生によるプロダクト「さばえカニロボット」づくり!
カニロボと過ごす夏休み【越前がにロボコン】: Hana道場

1ピクセル カラーコピー機を作る - IoTセンサー入門 with IchigoJam

2018/08/16
#IchigoJam #maker 

いろいろ計測、解析して楽しいIoT。手軽に買えて、手軽に使えるセンサー、いろいろあります! オープンな通信プロトコル、I2Cを使ったセンサーはアナログ入力より難しいですが、SCLとSDAだけで何個も接続できて、デジタルで値を取得できて便利です。 まずは気になるセンサーを使った、写経から!

TCS34725を使ったカラーセンサーモジュールとWS2812Bを使って、色コピー機を作ってみました。(カラーセンサーモジュール at Strawberry Linux

必要な治具をつくっていきます。
右:カラーセンサーモジュールのSCL、SDAをIchigoJamのSCL(EX1)とIN3(SDA)に接続し、白色LEDを1kΩ経由でOUT2接続。
左:CN5用の5ピンを2列使えるように拡張し、WS2812Bを5Vからダイオードで0.6V降圧して、OUT1からの信号で制御!

裏面はこのような感じ。Upverterでプリント基板化してしまうと楽できそう!

続いてプログラム!

1 'color copy 2 POKE#700,240,181,114,182,64,24,80,33,9,2,1,49,9,4,4,136,1,48,128,37,1,48,3,120,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38 3 POKE#728,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,60,234,209,98,182,240,189 10 OUT2,1 25 POKE#800,#81,#C0:?I2CW(#29,#800,2) 30 POKE#800,#80,3:?I2CW(#29,#800,2) 40 POKE#800,#94:U=I2CR(#29,#800,1,#800,8) 50 ?[0],[1],[2],[3] 54 D=4 55 POKE#800,3,0,[2]>>D,[1]>>D,[3]>>D 56 U=USR(#700,#800) 70 GOTO40

2-3行: WS2812B用ドライバ(OUT1)
10行: 白色LED点灯
25行: 色計測時間を154msecに設定(TCS34725 データシートより)
30行: カラセンサー計測開始!
40行: クリア、R、G、Bをそれぞれ16bitで取得
50行: 表示
54行: 輝度調整(大きいほどに暗くなる)
55行: WS2812B点灯用設定
56行: WS2812B点灯

赤が多めにでています。

透明アクリルを上に敷くと安定して読み込めるはず。 結構精度よく値がでてくるので、バーコードなどの替わりに色を印刷したカードで識別する仕組みづくりなどもおもしろそう。 サーボやモーターで動かせば、スキャナだって作れちゃいますね!

センサーの探し方
センサ・セレクションガイド - ストロベリーリナックスカタログ)」ワクワクする実用的なセンサーが続々登場!
センサ一般 秋月電子通商-電子部品・ネット通販」いろんなセンサーがあります!
「センサー名 IchigoJam」や「センサー名 Arduino」で検索して、作例を探して、簡単に作れそうなものからチャレンジしてみましょう。

地図アプリでふりかえる、センサーとまちあるき!まちをよくするアイデアとIchigoJamプログラミングつぎのいっぽ

2018/08/12
#opendata #IchigoJam #KidsIT #shinagawa #codefor #PCN #maker 

じぶんでつくったパソコンにセンサーを搭載して、品川をまちあるき!

IchigoSensors opendata - 品川まちあるき
温度、湿度、UV、音量、速度をみちびき対応GPSで取得した位置情報と合わせて印刷して二次利用可能な国土地理院地図にマッピングするアプリ作りました。


まちあるき前、THETA、360度写真!グループに分かれ、それぞれスタッフが2名程、同行します。


パソコンはんだづけしたDay1に続く、Day2は、IchigoSensorsを持ってまちあるき!


防災ヘリポートの中央でTHETA、360度撮影。マリオギャラクシーみたいでしょ?


楽しそうな遊具には釣られて、たこさん公園の計測スタート


たこさん内部!


たんけんセットにmicroUSBケーブルをかませて、袋にモバイルバッテリーを入れる工夫


セミ発見!


セミの抜け殻ゲット!なんと、通販で買える時代!


水の近く、温度は?湿度は?


こどもが発見、みみずを食べているトカゲ、SR!


品川区役所内の発電量の電光掲示、リアルタイムオープンデータ化すると公園の日射量参考になりそう。


気がついたことは何でもメモ!品川区では標準装備という、たんけんセットが活躍


ヒヤリハット地図、いろんな地図と重ねてみるのもおもしろそう?


打ち水でどのくらい温度は下がるのか?湿度はどうなる?データと合わせてコンクールに出してみるのもいいですね。
打ち水大作戦しながわ2018|品川区


データ計測のため協力していただいた「品川区立豊葉の杜学園
最近の体育館はアリーナと呼ぶ?体育に限らない多目的感?


まちあるき終了、一時回収、IchigoROM、17人分。歩いて集めたデータがつまってます!


USBシリアルでパソコンに取り込み、早速オープンデータ化。地図を印刷してアプリづくりの参考にしてもらいます。


まちあるきの体験や、いろいろメモをもとに、誰に、どんなアプリをつくるか考えて、絵にしよう!
母親、妹にヒアリングして、ほしいというアプリを40コ集めた便利アプリ集!


夏のまちあるきで、おじいちゃんを助ける雪案内という発想!


紫外線から逃げよう、UVescape(ユーブイエスケープ)、名前もいい!


データを計測することそのものが楽しかったからそれをアプリに!?
全員全く違う、17のステキアイデア、それぞれ一人ずつ発表してもらいました!


自分でつくるアプリづくりのだいいっぽ、画面と大まかな動きをつくる技を伝授する、プログラミング講座、つぎのいっぽ!(はじめのいっぽ@Day1

CLS、LC、?(PRINT)、WAIT、GOTO、IF INKEY()=0 CONT を使いこなせるようになれば、アプリのプロトタイピング(試作)や、アニメーション、パワーポイント代わりにプレゼン資料づくりだって自由自在! (参考、シニアハッカソン 2014年

容量が足りなくなったら、LRUNでつなげばOK!IchigoROMがあれば、合計68ファイルつなげるよ。
詳しくは、IchigoJam BASIC-日本語辞書、リファレンスを見たり、いろいろ実際試してみよう!


カタカナキーでローマ字入力、自分だけのアプリづくり、いけそうかな?
IchigoJamプリント」や「はじめてのプログラミング」など、オンライン教材もいろいろ!
自分のペースで、自分の好きなものからチャレンジするのが上達の近道。
コンピューターは一番身近な外国人、仲良くなってね!


兄弟もひとり1パソコン!色違うから間違えない!64ファイル追加で保存できちゃう「IchigoROM」も二人分!


自分のパソコンIchigoJamとアプリアイデアシートとともに記念撮影!2日間のワークショップ、楽しんでもらえて何より!


IchigoSensors opendata
17人分+スタッフ所持(00)を加えた18人分のまちあるきオープンデータができました。
※オープンデータ:誰でも自由に加工して、販売することを含めて好きに使えるデータのこと(出典だけ書いてね)


リンクからデータ種ごとに色分けした地図や、表形式、CSVダウンロードが可能です。
ひとつ、言い忘れ。IchigoROMに記録した、みなさんのまちあるきデータ。IchigoJamで見ることができます!

LOAD120:GSB@ELIST

ずらずらっとデータが表示されますよ!取り込んだデータと同じものです。
実は、IchigoJamだけでもデータ解析できちゃいます。興味があったらチャレンジしてみてねっ

最後にファイル120、121、122に入っている、IchigoSensors用の長いプログラムを紹介。

'file 120 1 'GPS Logger 2 L=16:OUT4,-1 10 FOR J=1 TO 5 20 GSB@THI:GSB@TH:[8]=T:[9]=H:[10]=ANA(2) 30 M=0:FORI=0TO9:A=ABS(ANA(8)-270):M=M+(A-M)*(A>M):NEXT:[11]=M 40 CLS:?[3];".";[4];",";[5];".";[6],[7]:?[8]/10;" ";[9]/10;" ";([10]-310)/2;" ";[11] 50 GSB@LC:WAIT60:NEXT 70 R=FILE()+(LINE()+10)<<8:LRUNFILE()+1 80 LED1:GSB@EPUSH:LED0 90 GOTO10 600 @THI:U=95:LET[U],#062C,#4401,#8808,#884A,#4350,#0C00,#4770:U=#800+U*2:RTN 610 @TH:R=I2CR(#45,U,2,#700,6):[0]=17500:[1]=PEEK(#700)<<8|PEEK(#701):T=USR(U+2,#800)-4500:[0]=10000:[1]=PEEK(#703)<<8|PEEK(#704):H=USR(U+2,#800):RTN 800 @EPUSH:N=0:?I2CR(81,#8E6,2,#8E4,2),M:M=M+1:N=M*L*2:N=N<<8|N>>8&#FF:?I2CW(81,#8E6,2,#800,L*2):N=0:?I2CW(81,#8E6,2,#8E4,2):RTN 810 @ELIST:L=16:N=0:?I2CR(81,#8E6,2,#8E4,2),M 820 IF M FOR I=1 TO M:N=I*L*2:N=N<<8|N>>8&#FF:U=I2CR(81,#8E6,2,#800,L*2):?I;:FOR J=0 TO L-1:?",";[J];:NEXT:?:NEXT 830 RTN 840 @ECL:N=0:M=0:?I2CW(81,#8E6,2,#8E4,2):RTN 900 @LC:LET[96],640,64,#5639,#C6C,#C080,64:?I2CW(62,#8C3,5)+I2CW(62,#8C0,3,#900,16)+I2CW(62,#8C8,3,#920,16):RTN 'file 121 1 'GPS driver (R=return file | return line << 8) 300 CLS:BPS9600:UART3,2 301 K=INKEY():IF!KCONT 304 IFK!=36GOTO300 305 K=INKEY():IF!KCONT 306 IFK!=71GOTO300 308 K=INKEY():IF!KCONT 309 IFK=42UART0,0:P=#900:GOTO700 310 ?CHR$(K);:GOTO308 500 N=0 510 C=ASC(P):P=P+1:IF!CORC=44ORC=46ORC=34C=C=46:RTN 520 IFC>=48&&C<=57N=N*10+C-48 530 GOTO510 540 N=0:IFASC(P)=44RTNELSEFORI=1TOM:N=N*10+ASC(P)-48:P=P+1:NEXT:RTN 700 GSB500:M=2:GSB540:[1]=N:GSB500:[2]=N:GSB500:GSB500 711 GSB500:[3]=N:IFCGSB500:[4]=N:ELSE[4]=0 712 GSB500:GSB500:[5]=N:IFCGSB500:[6]=N:ELSE[6]=0 713 GSB500:GSB500:[7]=N:GSB500:GSB500:GSB500:GSB540:[1]=[1]+N*100:GSB500:[0]=N 800 LRUN R&amp;255,R>>8 'file 122 1 'GPS initilize (connect TXD) 10 BPS9600 20 S="PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0":GSB200:END 200 N=0:FORI=0TOLEN(S)-1:N=N^ASC(S+I):NEXT:UART3:?:?"$";STR$(S);"*";HEX$(N,2):UART0:RTN

links
- こどもも大人もコードフォーじぶんのまち! 品川区はんだづけ&センサー入門、練馬区IoT資料 - with PCN
- IoT実験ボード「IchigoSensors」プリント基板発注 - こども霞が関見学デー満員御礼!
- PCN品川
- PCN五反田
- PCN秋葉原(ロボットなど拡張キット、はんだづけスペースもあり!)

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