SHIROのIchigoJam日記

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

Ichigo鉄琴

※この記事は「IchigoJam Advent Calendar 2018」にエントリーしています。

12/15~16の上田市マルチメディア情報センターのクリスマスイベント「St. Media Xmas 2018」でのライブ放送「Xmas TV」で、IchigoJamで演奏する鉄琴作りをやりました。
(前作「Ichigoチャイム」の発展形です)
www.ichigojaman.jp
ライブではとりあえずド~上のドまでの8音階を叩く所までできたのですが、その後手直しや作り込みをして、無事に完成しました(^_^)v
動画はこちら。

【IchigoJam】Ichigo鉄琴


f:id:shiro0922:20181220225835j:plain

前作と同じく、鉄琴工作キットをベースに、8個のサーボモーターを配置して、マレット(バチ)を制御します。
f:id:shiro0922:20181220225856j:plain

マレットは途中で切断してスプリングで接続。
叩く時に鉄琴上のストッパーで柄が止まり、ヘッドがしなって鉄琴のキーを叩きます。
この機構のお陰で、大人気だったウォームアップ動作は不要になりました(笑)
f:id:shiro0922:20181220225924j:plain

ストッパーは、ホームセンターで買った6mm径のアクリル棒に、ゴムバンドを貼り付けて作りました。
f:id:shiro0922:20181219000634j:plain

IchigoJamは親子2台で、サーボモーターを4個ずつ制御。
TX/RXを接続して、選曲No.と、演奏スタートのタイミングを、親機→子機へ送っています。
電源はお馴染みのIoT用モバイルバッテリ「Cheero Canvas」。
f:id:shiro0922:20181220231456j:plain

基板データ「Servo Base 4」

IchigoJamのOUT2~5で、サーボモーター4個を制御するシールド基板です。

*この基板ガーバーデータは、CC BYライセンスとします。どうぞご利用ください。

(C) 2018 Shiro Saito (https://www.ichigojaman.jp)

基板の回路図は以下のとおりです。
IchigoJamのOUT2~5でサーボモーターを計4個制御します。
f:id:shiro0922:20181230195043p:plain

プログラム

IchigoJam親機と子機に、下記のメインプログラムをスロット0、曲データをスロット1~3に配置しています。
親機と子機をボタンを押しながら電源ONしてメインプログラムを自動起動し、親機の有機EL画面で曲1~3をボタンを押して選択します。

メインプログラム(親機)

1 '*Tekkin P
2 CLV:LED1:WAIT60:UART0:GSB26
3 LET[90],200,110,205,120,210,120,220,125
4 FORP=2TO5:PWMP,[86+P*2]:NEXT
5 OUT0:CLS:S=0
6 IFTICK()>59GSB23
7 IF!BTN()GOTO6
8 CLK:UART1:?S:UART0:G=9:LRUNS
9 IFBTN()CONT
10 LC0,2:?"Push BTN":GSB34
11 IF!BTN()CONT
12 LED1:CLK:UART1:?"*":UART0
13 FORI=0TOL
14 X=[I]&15:Y=[I]&240/16:Z=[I]&768/256
15 B=1:A=X:IFA%2GSB25
16 A=Y:IFA%2GSB25
17 WAIT14
18 B=0:A=X:IFA%2GSB25
19 A=Y:IFA%2GSB25
20 WAIT1:IFZ=1WAIT15
21 NEXT
22 GOTO4
23 CLT:S=S+1:IFS=4S=1:CLS
24 ?CHR$(233);:GSB34:RTN
25 P=A/2+2:PWMP,[86+P*2+B]:RTN
26 poke#780,#00,#40,#21,#00,#7F,#22,#00,#07,#AE,#D5,#80,#8D,#14,#20,#00,#DA,#12,#81,#CF,#D9,#F1,#DB,#40,#A4,#A6,#AF
27 forP=#788to#799:i=i2cw(60,#780,1,P,1)
28 next
29 poke #79a,#70,#b5,#40,#18,#07,#23,#1b,#02
30 poke #7a2,#c9,#18,#10,#24,#03,#78,#db,#00
31 poke #7aa,#d3,#18,#1d,#68,#0d,#60,#5d,#68
32 poke #7b2,#4d,#60,#20,#30,#08,#31,#01,#3c
33 poke #7ba,#f4,#d1,#70,#bd
34 fork=0to7:j=usr(#79A,#907-k):j=i2cw(60,#781,1,#700,128):next:rtn

メインプログラム(子機)

1 '*Tekkin C
2 CLV:CLK:LED 1:WAIT 60:UART 1,1
3 LET[90],60,155,75,170,62,160,70,167
4 FOR P=2 TO 5:PWM P,[86+P*2]:NEXT
5 OUT 0:CLK
6 S=INKEY()-48:IF S<1 OR S>3 CONT
7 CLK:G=8:LRUNS
8 IF INKEY()!=42 CONT
9 CLK:LED 1
10 FOR I=0 TO L
11 X=[I]&15:Y=[I]&240/16:Z=[I]&768/256
12 B=1:A=X:IFA&&A%2=0GSB20
13 A=Y:IFA&&A%2=0GSB20
14 WAIT14
15 B=0:A=X:IFA&&A%2=0GSB20
16 A=Y:IFA&&A%2=0GSB20
17 WAIT1:IFZ=1WAIT15
18 NEXT
19 GOTO 4
20 P=A/2+1:PWMP,[86+P*2+B]:RTN

※3行目のデータは、4個のサーボモーターの真上/下ろした時の値です。これはマレットの作り方や各サーボモーターの個体差によって変わるので、実際に動かして調整する必要があります。
なお、マレットを真上で止めているのは、斜めで止めるとハンチング(振動)を起こしてしまうからです。実はハンチング抑制のために、マレットの長さの短縮、サーボモーターのアームの取り付け角やプログラムのパラメータ調整など、かなり試行錯誤しています。もっとトルクが大きいサーボモーターを使えば解決しますが、とても高価なので(^_^;)

曲データ「学校チャイム」(ウェストミンスターチャイム)

10 '*Tekkin - Chime
20 LET [ 0],#105,#107,#106,#102,#100,#100
30 LET [ 6],#105,#106,#107,#105,#100,#100
40 LET [12],#107,#105,#106,#102,#100,#100
50 LET [18],#102,#106,#107,#105,#100,#100
60 L=23
70 LRUN 0,G

曲データ「かえるのうた 輪唱」

10 '*Tekkin - Kaeru Rinsho
20 LET [ 0],#101,#102,#103,#104,#103,#102,#101,#100
30 LET [ 8],#113,#124,#135,#146,#135,#124,#113,#100
40 LET [16],#131,#140,#151,#160,#151,#140,#131,#100
50 LET [24],#201,#201,#202,#202,#213,#203,#204,#204
60 LET [32],#113,#102,#101,#100
70 LET [36],#201,#201,#202,#202,#203,#203,#204,#204
80 LET [44],#103,#102,#101,#100
90 L=47
100 LRUN 0,G

曲データ「もろびとこぞりて」(Joy to the World)

10 '*Tekkin - Morobito Kozorite
20 LET [ 0],#108,#100,#107,#200,#206,#105,#100,#100
30 LET [ 8],#104,#103,#100,#102,#100,#101,#100,#100
40 LET [16],#105,#106,#100,#100,#106,#107,#100,#100
50 LET [24],#107,#108,#100,#100,#100,#100,#100,#100
60 LET [32],#108,#108,#107,#106,#105,#105,#200,#204,#103
70 LET [41],#108,#108,#107,#106,#105,#105,#200,#204,#103
80 LET [50],#103,#103,#103,#103,#203,#204,#105,#100,#100
90 LET [59],#204,#203,#102,#102,#102,#202,#203,#104,#100,#100
100 LET [69],#203,#202,#101,#108,#100,#106,#105,#200,#204,#103
110 LET [79],#104,#103,#100,#102,#100,#101,#100,#100
120 L=86
130 LRUN 0,G

曲データの各音は16進数3桁です。

  • 1桁目=音の長さ(1=四分音符、2=八分音符)
  • 2桁目=音階2(1=ド、2=レ、…8=上のド、0=休符)
  • 3桁目=音階1(1=ド、2=レ、…8=上のド、0=休符)
    • 音階1と2を同時に指定すると、重音で叩きます。
    • 二分音符など長い音を出したい時は、四分音符+四分休符にすれば、叩いた音がそのまま響きます。