【イベント】鉄と蒸気と奇譚のまち〜第4幕~

  

柊工房は本年度、スチームパンクの祭典、鉄と蒸気と奇譚のまち〜第4幕〜への出展が決定いたしました。

イベント概要を下記に示します。


鉄と蒸気と奇譚のまち〜第4幕~

【日時】4月27日㈯ 11:00〜16:00

【場所】群馬県前橋市三河町1丁目16−27 芸術文化れんが蔵

【アクセス】

JR前橋駅から 徒歩 10分

上毛電鉄 中央前橋駅から徒歩約3分

関越自動車道 前橋インターチェンジから車で約15分

【イベント公式HP or SNS】

・Instagram ヨセアツメプロジェクト

過去イベントの参考HP まえばしigoo「鉄と蒸気と奇譚のまち 第三幕」


柊工房 出展・販売内容

こちらのイベントでは作品の販売をいたします。

会計は現金のみとなりますことご了承ください。

また在庫が無くなり次第、受注生産に切り替えます。

販売予定の作品を下記に示します。

CK-12

¥16,500-

縦型のガラスドームに収まった、直角配線が多いLED時計です。ガラスに収めてほしいとの声が多く、製作しました。

CK-13

¥21,000-

長さ280mm×直径35mmと、柊工房で最大サイズの作品です。秒表示も増え、配線量も増えた、工場夜景を収めたような作品。

CK-08

¥13,500-

5cm角におさまるかわいいサイズのLED時計です。LEDの色は赤色、デスクや車のダッシュボードに最適なサイズです。

CK-14(開発中)

¥16,500~20,000(価格未確定)

CK-08の後継機種として、CK-08と同等サイズの、ガラスドーム型空中配線時計を製作予定。鉄まちにてリリース予定です。


ガラス管LED時計

コルク蓋のガラス管にLED時計とドライフラワーをあしらった個性的な時計です。

CK-05A

¥11,000-

13φ×25cmのガラス管にLED時計とドライフラワーをあしらったLED時計です。基板に4つのLEDを実装しライトアップができます。


 また、その他にも素敵な作家さんが多数出展されます。ぜひ、お気軽にお越しください。

今年度の出展計画が決定いたしました

[更新日:2024/2/15]

柊工房の本年度の出展計画が決定いたしました。

先ずは、3/24のNT京都になります。


NT京都

【日時】3/24 9:30~16:00 京都市 西院春日幼稚園・春日神社境内

【出し物】 空中配線時計各種、手回しオルガン、板金ひまわり 

**販売はありません。希望があれば空中配線時計の受注のみ承ります。**

NT京都公式イベントページ


つくろがや

【日時】4/6,7 愛知県北名古屋市西春 ヨシヅヤYストア西春店 4F 特設会場

【出し物】空中配線時計各種、手回しオルガン、板金ひまわり

**販売はありません。希望があれば空中配線時計の受注のみ承ります。**

つくろがや 公式Twitter(X)


鉄と蒸気と奇譚のまち

【日時】4/27 11~16時 群馬県前橋市三河町1丁目16-27 芸術文化れんが蔵

【出し物】

・販売:空中配線時計各種、ガラス管LED時計各種

・展示:手回しオルガン、板金ひまわり

イベント公式Instagram[ヨセアツメプロジェクト]


デザインフェスタ Vol59

【日時】5/18,19 東京都 江東区 東京ビックサイト

【出し物】

販売:空中配線時計各種、ガラス管LED時計各種

展示:手回しオルガン、板金ひまわり

イベント公式HP


MAINTENANCE ~過去販売した製品のサポートについて~

おかげさまで多くのお客様に、柊工房の製品をご愛用頂いております。

販売開始から約1年、製品のアフターサポートに関して、明確な基準を定めておりませんでした為、今回、下記に制定いたします。

・初期不良に関して

商品到着時点で、動作しない、点灯が欠けている、スイッチが反応しない等の不具合が発生した場合は、製品の種類、環境問わず無償で修復いたしますので、まずはご一報ください。

 

・無償保証期間について(半年間)

保証期間は、購入時から半年(183日)以内とさせていただきます。下記に定める「通常の使用範囲」で動作不良が半年以内で発生した場合は、初期不良と同等の扱いとし無償で修復いたしますのでご一報ください。

**通常の使用範囲の定義**

①気温:-20~40℃以内の場所でご使用。

②落下等の強い衝撃を与えていない。

③電源は市販品のUSBアダプタ(または付属したアダプタ)、またはPC等の一般家電製品のUSB電源を使用している。

④自動車内で使用していない。

⑤浴室等の高湿度な環境で使用していない。

⑥改造等の手を加えていない。

・初期不良&通常保障の対応フロー

①まずは下記のメール又はフォームにてご一報ください。

②頂いたメールアドレスに送付先の住所等をご連絡いたします。

③着払いにてご発送ください。(19-21時付近の指定だとありがたいです)

④修理いたします(最大1週間)

⑤送料はこちらの負担でご返送いたします。

お問い合わせ方法

メール: hiiragikoubou5883@gmail.com

または下記フォームにご記載ください。

    2024年の柊工房の方針について

    お久しぶりです。柊工房岡﨑でございます。

    ホームページは、半年以上も更新しておらず、久しぶりの投稿になります。

    今年は、物販とイベントに邁進した一年であり、とても充実いたしました。

    多くの出会いとたくさんの経験を積ませていただき、感謝の気持ちでいっぱいであります。

    さて、2023年も年の瀬となり、いよいよ来年の活動について考えることにしました。

    2024年は、2023年とは全く異なる目標で、進めていきたいと考えており、

    主にやりたいことは下記の3つです。

    ①アートプロジェクトを発足「いきものかいろ(仮)」

    ②楽器の製作

    ③空中配線時計の販売強化

    順番に説明していきます。


    ①アートプロジェクトを発足「いきものかいろ(仮)」

    具体的な内容はまだほとんど決まっていません。

    だけど、空中配線の時計を製作していて思ったんです。

    それは、とても、いきものみたいだということです。

    人間を含めた生物は皆、いろんな臓器があって、それらを神経や血管が繋いでいて、それらの臓器が一つの回路を形成することで、いきものができています。

    それは、電子回路も同じだと思うんです。

    電源回路がまるで、心臓のように、各回路に電源という血液を供給し、マイコンという脳みそから、出力された信号で、LEDやモーターなどの筋肉を動かす。

    とても、回路と生体は似ていると思います。

    だったら、回路だって、電子部品が集まって、つながって、一つの生命体を生み出したって良い。

    ということで、電子回路でできたふしぎな生き物たちが集まる木と、そこで騒いでいる回路でできた空中配線のいきものたち、というコンセプトで、新しい展示物を作ろうと考えてます。

    その名も、「いきものかいろ」です。


    ②楽器の製作

    今年1年、NTやデザフェス、蒸奇博覧会を見てて思ったんです。

    やっぱり、楽器を奏でれる作者さんって素敵だなあと。

    そこで、私もなにか手元で音を奏でられる楽器が欲しいです。

    といっても、あまり楽器を扱ったことがないので、弾くのは難しいと思っています。

    とくにまだ方式は決めていないですが、手回しオルガンみたいな形式がいいかなと思っています。


    ③空中配線時計の販売強化

    さて、柊工房では今年2023年、空中配線時計の物販を開始し、想定以上に反響をいただき、多くの作品をお客様の手元にわたらせることができました。

    ご購入いただいた皆様、本当にありがとうございました。

    今年、世に送り出した柊工房のプロダクトを下記に示します。

    また、今後の販売方針も示します。

    ①CK-05(ガラス管式LED時計)

    2024年も製作、販売継続

    但し、イベントでの現品限り

    価格:9000円

    [今後の対応事項]

    検査項目、設計書をそろえる。

    ②CK-08 小型空中配線LED時計

    2023年で販売終了

    価格:13500円

    2023年、最も売り上げた空中配線時計でありましたが、配線がむき出しということで、今後、品質担保を徹底するうえで、絶縁耐圧が担保しきれないため、販売を終了しますが、同じサイズの空中配線時計をガラスビーカーに入れたモデルを2024年5月にリリース予定です。価格は、14000円程度を見込んでおります。

    見切り発車でスタートした空中配線時計でしたが、課題もいくつか見えてきました。

    ③円柱ガラス型空中配線時計(CK-12)

    2024年も継続。

    イベント、オンラインで受注のみ受付。

    価格;16500円

    [今後の対応事項]

    検査規格、設計書をそろえる。

    ④6桁型空中配線時計(CK-13)

    2024年以降も継続。

    イベント、オンラインで受注のみ受付。

    価格;21000円

    [今後の対応事項]

    輸送時に不具合が発生したことから、耐震性を強化。検査規格、設計書をそろえる。

    ⑤木箱型時計(CK-10)

    2024年以内で販売終了

    価格:8000円

    こちらも、一部で手堅い人気を集めておりましたが、柊工房が所属するDMM.Makeの施設閉鎖に伴い、次期Lot(3月投入予定)の生産をもって、木材加工が困難になるため、一旦販売を終了いたします。

    NT加賀に出展してきました

    お久しぶりです。柊工房ひいらぎです。

    2023/2/4,5の二日間、石川県加賀市 加賀温泉駅前にある、アビオシティ加賀で、電子工作のものづくりイベント、NT加賀に出展してきました。

    「ものづくりはたのしい」のキャッチフレーズで、開催されたNT加賀。趣味でものづくりをしている沢山のクリエイターたちが集まり、自慢の作品を展示しています。

    NT加賀 公式HP


    会場は、ショッピングセンターの中央の催事場。

    今回は、ガラス管LED時計と、空中配線時計のを展示、販売いたしました。

     

    ガラス管LED時計は、試験管LED時計とドライフラワーをあしらった時計です。

    詳細は、こちらから。

    瓶詰めLED時計を作る

    ガラス管LED時計を販売します

    空中配線時計の販売を始めました。

    いずれ、作り方等も掲載したいと思います。

    ソースコードを所望の方がいらっしゃったので、下記に公開します。回路図も公開します。

    回路図の注意点ですが、トランジスタが、2SA1162→2SC1815に代わっています。

    【空中配線時計の回路図】

    CK-07_1X

    【空中配線時計CK-08コード】

    CK-07_V2.0

    また、その他にも非売品でしたが、

    ・光る試験管立て

    ・空中配線時計(大型)

    なども展示しました。


    NT加賀の出展を見学

    ここからは、ほかの出展者さんで、とくに面白かった方を紹介します。

    電気女子(Projou.プロジュ。)さん

    プログラミングされた光るジュエリーを製作、販売されていました。光は、1/fの揺らぎでローソクのようにユラユラ光ります。技術的にも芸術的にも、細かく繊細に作りこまれていました。とても面白いです。

    [ホームページ]

    Projou.プロジュ。


    パスコンパスさん

    いつもこの面白いお面をつけてる方ですが、中にモニターがあるんですね。個人的には、3Dプリンタで作られたロータリースイッチのギミックが、回し心地最高で好きです。


    石川モンGも踊りに来ました

    [twitter]

    @IshikawamonGold

    [website]

    http://ishikawamongold.blogspot.com/


    ヒゲキタさんの恐竜も歩いてました


    HAL900さんの苔テラリウム

    そしてHAL900さんの苔テラリウムもすごいです。 苔を栽培されていて、苔の箱の中には、ワイヤレス給電されたLEDが仕込まれ、これが苔を綺麗に彩っています。苔のある箱の中は多湿なため、電子回路の大敵。絶縁をかなり工夫されてました。そして、今回はこの小さな箱でミストを出し幻想的な演出です。


    ロボット演奏会

    そしていつものロボット演奏会 もはやこのベルの音色を聴かないと、メイカーイベントに来た気がしなくなってきてるかもしれない……


    このほかにもたくさんの出展をみてきました。残念ながら画像が残っていなかったです。ゴメンナサイ。

    次回は、2023年3/4に、千葉県はチバラボで開催される「こっしぇる」に出展します。

    お近くの方はぜひ見にきてください。

    柊工房 ひいらぎ

    Ogaki Mini Maker Faire2022に出展してきました

    2022年12月3日、4日。Ogaki Mini Maker Faireに展示してきました。

    作品としては、 ガラス管LED時計 ガラス管LED時計(小型) 光る試験管立て 光るサボテンの骨 空中配線マトリックス 大きな空中配線時計 ちっちゃな空中配線時計 電光掲示オシロ になります。

    今までもMakerFaireには出展してきましたが、高校や大学などの所属での出展でした。今回は個人として初めて、柊工房の看板で出展したのでとても思い入れが深いです。

    今回のOMMFで、想像以上に私のツイートを観ていただいていることや、この空中配線時計には熱烈なファンがいらっしゃったのもとても印象深いです。 私の作品にはいつもどこか自信がなかったりして、出展や販売はしてなかったのですが、これからはそういった方向にも注力しようと思います。

    次回はNT加賀に応募しようと思います。またどこかでお会いしましょう。

     

    ガラス管LED時計

    小型ガラス管LED時計

    空中配線LED時計

    大型空中配線LED時計

    オシロスコープに文字を表示する

    オシロスコープに令和を表示する

    オシロスコープに「令和」を表示して、今上天皇の御退位と新天皇の御即位をささやかながら祝福しようと思います。

    さて、どうやってオシロスコープに文字を表示しましょうか。まずは、アナログオシロスコープの仕組みを下記のリンクで説明します。

    ******まもなく公開します、少々お待ちください*********

     さて、身近で文字が表示されているものといえば、電工掲示板です。電工掲示板は、よく見るとLEDのドットの集まりでできています。では、電光掲示板LED一つ一つが、ICのピンとつながっているでしょうか、、、、、、

    そんなことは、ありません。通常のマトリックスLEDは、下のようになっています。

    f:id:okazakilab:20190501143611p:plain

     例えば、4×4のマトリックスの場合、百マス計算のように、LEDのアノード側(電流を入れる方)は横列に分配され、カソード側(電流を出す方)は、縦列で共通の分配されてます。

    f:id:okazakilab:20190501143919p:plain

     カソード側のスイッチは、順番に高速で切り替えていき、そのときONになっている列で、表示するLEDを、アノード側のスイッチで指定し、その列で光らせます。これを、人間の目では追えない速さで行うことで、残像が重なり、あたかも全部の列が点いているように見えます。切り替える速度は、10m秒以下であれば人間の目はごまかせるようです。

    これと同じことをオシロスコープで行います。

    f:id:okazakilab:20190502141936p:plain

     オシロスコープは、通常の波形表示として使う場合、時間軸を停止させることはできません。かならず、ある一定の速度で右方向に進みつづけます。そこで、横軸を32bitに分割、縦軸を16bitに分割し、上図のように下から順番に特定の高さで、表示させます。

    表示する点は、その位置で表示し、表示しない点は、一番下のビットに指定します。これにより、表示したい文字が浮き出るのです。すべてのドットを表示させた写真が下です。

    f:id:okazakilab:20190502140229j:plain

     イタリックな文字は、斜めに書かれることが多いですが、ひょっとして技術的な問題で、斜め文字になってたりして、とか考えてました。

    では、この制御は、どのようにして組むのでしょうか。

    下が、今回製作した回路図です。すべて、ブレッドボードで作成しました。

    f:id:okazakilab:20190502142632p:plain

    さて、回路図に現れた無数の抵抗は、何でしょうか。
    これが、R2Rラダー抵抗と呼ばれるものです。これは、2進数の0/1ビット出力を、アナログな電圧に変換する回路です。これは、ある抵抗値Rと、その二倍の抵抗値2Rを図のように接続することで可能になります。デジタル信号の0/1は、アナログ的に見れば、5Vか0Vです。これを、arduinoのデジタルピンからそれぞれ出力し、R2Rラダー抵抗で、0~5Vを6bit(64分割)にします。下図の場合、(, , 01 1011)dで入力したとすれば、出力電圧は、27/64×5=2.1[V]ということになります。

    f:id:okazakilab:20190502152541p:plain

     以上が、回路になります。とてもシンプルであります。

    あとは、arduinoでプログラミングをするだけです。

    今回は、前回の続きです。

    前回は、オシロスコープにつなぐ回路のお話をしました。Arduinoの6本の出力ピンから、R2Rラダー抵抗を通して、アナログ値で接続するものでした。

    今回は、プログラム編です。

     ————————————————————————————————————-

    //各変数の宣言
    int i;

    int j;
    int a=0;
    //出力用の変数(d0~d5)

    int d0;int d1;int d2;int d3;int d4;int d5;
    int xy[38][16]=

    {        //令和の設定 

    //Y0 1 2 3 4 5 6 7 8 9 101112131415

     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白

     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白

     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白

     {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},//X00

     {0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0},//X01

     {0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0},//X02

     {0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0},//X03

     {0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,0},//X04

     {0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0},//X05

     {0,0,0,0,1,0,1,0,1,1,1,1,1,0,0,0},//X06

     {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},//X07

     {0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0},//X08

     {0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X09

     {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0},//X10

     {0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,0},//X11

     {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},//X12

     {0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},//X13

     {0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0},//X14

     {0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},//X15

     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//X16

     {0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0},//X17

     {0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},//X18

     {0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0},//X19

     {0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0},//X20

     {0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0},//X21

     {0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},//X22

     {0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0},//X23

     {0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},//X24

     {0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0},//X25

     {0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X26

     {0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X27

     {0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0},//X28

     {0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X29

     {0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X30

     {0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0},//X31

     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白

     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白

     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白

    };

    void setup()

    { //ピンの入出力設定

     pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT);   

     pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT);

     pinMode(9,INPUT);

    }


    void loop()

    {

     for(j=0; j<38; j++) //横軸のループ

     {

      for (i=0; i<16; i++) //縦軸のループ

      {

       if(xy[j][i]==1) //その点で表示するか否か

       {   

       a=i; 

       }else

       {   

       a=0; 

       }  

      d0=a%2; //10進数で表した分解能を2進数のそれぞれの出力値に分解する

      a=a/2;

      d1=a%2;

      a=a/2;

      d2=a%2;

      a=a/2;

      d3=a%2;

      a=a/2;

      d4=a%2;

      a=a/2;

      d5=a%2;

      a=a/2;


      digitalWrite(7,d5); //それを出力する

      digitalWrite(6,d4);

      digitalWrite(5,d3);

      digitalWrite(4,d2);

      digitalWrite(3,d1);

      digitalWrite(2,d0);

      delayMicroseconds(2);

      }

     }

    }

    ———————————————————————————————————-

     プログラムは、たったこれだけです。

    arduinoのプログラミングに関しては、下記で詳細を説明します。

    ************arduinoのプログラム記事のリンクはもう少々お待ちください***********

    int xy[38][16]で配列により「令和元年」を記録しています。こちらは、下の図のように定義しています。縦軸をYで、上がY0、Y01、Y02とつづき、Y15までの計16bitの分解能です。横軸はXで表し、左からX00,X01X02とつづき、X31まで。の計32bitです。

    しかし、実際に横軸を32bitだけで実行してしまうと、文字の両端は見切れてしまうので,X00より上と、X31より下に3行ずつ、オールゼロの桁をいれ、計38bitで構成しています。

    f:id:okazakilab:20190503233328p:plain

    NT富山2022を見学してきました

    Maker Faire がひとだんらくして間もなく、NT(ニコテック)富山が開催されましたので、富山まで車を飛ばして見学に行ってきましたので、ルポをまとめました。


    NT富山2022

    日時: 9/17,18 10:00~18:00

    場所: 〒930-0010 富山県富山市稲荷元町2丁目11−1 アピアショッピングセンター

    ニコテック富山ホームページ


    今回は、埼玉の自宅から富山まで、車で行くことにしました。関越自動車道、上信越自動車道、北陸自動車道を通って富山へ向かいました。

    日曜の朝5:20に出発し、11:00に富山に到着しました。

    場所は、富山の市街地にあるアピアショッピングセンター。

    ここの一階の広いフロアで開催されました。

    以下は、NT富山で見た中で、特に面白かった作品です。


    えとせとら研究所

    歩行に合わせて「さんぽ」が流れる
    三相交流で制御するフルカラーLED

    主催者?のえとせとら研究所さんです。まず目を引いたのが圧電素子を内蔵したマットです。

    この上で足ふみするとジブリの「さんぽ」が流れます。

    やたら音質の良いスピーカーアンプ
    自作電光掲示板

    このスピーカーの音質が、小さいのにとてもよかったです。


    理工学AtoZ・湊屋

    斬新なアナログ時計
    ゲーミング摩天楼?

    3Dプリンタを駆使した作品が印象的でした。とくに、このアナログ時計は独特なセンスです。


    電脳妖精☆ミント・CPU

    静電容量式ヘッドホン
    基板とフィルムを重ねて作っている

    静電容量式のヘッドホンがとても面白いです。耳元に高電圧がかかっているのに若干びびってしまいました。音質は良いです。


    RyomaLab・marica

    マウス用MRI
    ぶらっくほーる?

    マウス用のMRIがとても興味深いです。見てしばらく気づかなかったのですが、ホンモノ入ってたんですね。。

    日本酒ピアス
    日本酒ピアス

    ここのテーブルだけは独特の雰囲気を感じました。出展者がお酒好きなのか、うまい日本酒の分布を統計調査した結果などもありました。日本酒ピアスも素敵です。僕が女だったら買って身に着けてました。


    音楽研究所

    なかでも一番目を引いたのが音楽研究所さんです。

    ロボットがハンドベルを演奏していたり、100円でロボットが運勢を占って「大吉」か「大凶」を筆で書いてくれます。


    元ロボット芸人高橋ちゃん

    MFTでもお目にかかったピピ美のホモオです。

    過去に何度かお見掛けしましたが、そのたびに笑い転げてます。


    ほかにもさまざまな展示を見させていただきましたが、写真に残していなかったです(スミマセン)。

    これからも、こういった展示会には積極的に見学していこうと思います。

    ありがとうございました。

    Maker Faire Tokyo2022 に出展してきました

    昨日、本日と、二日間。東京のビックサイトで開催された、ものづくりの祭典「Maker Faire Tokyo」に出展してきました。

    団体名は、ボトルサーキットでおなじみ、Kimio Kosakaさんの「O’Baka Project」に参画し、共同出展という形で、「O’Baka Project 柊分科会」として出展しました。

    ちなみに、お世話になっているKimio Kosakaさんも、ボトルサーキットをはじめとして、様々な作品を作られています。ぜひ、KosakaさんのHPもご覧ください。


    kosakalab

    ボトルサーキット

    ボトル・サーキットを見てニコッとされる,みなさんのお顔が素敵でした。

    さて,2日間の概算カウントで150名近い方とお会いし,感想・ご意見・新たなアイデアなど色々なお話をいただきました。自分の思考の範囲の超えたお話が多く,少し視界が広がったような気がします。


    さて、今回のMaker Faireは、コロナ後初の対面開催となり、ひさしぶりにメイカーの熱気を感じることができました。

    みんな、コロナ禍で作品をあたためていたのか、今回はレベルが高い出展が多い印象でした。

    私が出展した作品は、下記の3つです。


    瓶づめマトリックス時計

    電光掲示板でおなじみの、LEDマトリックスを、コルク瓶の中におさめた時計を製作しました。全て空中配線で構成しています。


    ガラス瓶LED時計

    コルク瓶に自作のデジタル時計をつめこんだ、おしゃれな時計を作りました。この時計は、はんだづけからプログラミング、装飾、プリント基板づくりにいたるまで、一から作っています。


    消しゴムレーザーポインタ

    皆さんは消しゴムを加工したことがあるでしょうか。中学生の頃、退屈な授業中に、消しゴムを加工して中に機械やらコンピュータを隠したスパイグッズのようなものを作りたいと考えたものです。


    どれも,お客さんの反応は上々でした。

    とくに、ガラス瓶時計への反応がとてもよく、売ってほしいとの声も多くあがりました。

    実は、このHPをさかのぼって見ていただいた方はお気づきかもしれませんが、過去に販売をしていた時期がありました。

    しかし、当時は宣伝するすべもなく、結局売れないまま、自信だけを無くして、休止しておりました。

    今回、ひょんなことからMaker Faire Tokyoに出展することができ、見に来ていただいた皆様の反応や、

    売ってくださいとのお声に、とても救われた二日間となりました。

    これから、販売再開にむけて準備をしてまいりますので、今しばらくお待ちください。

    これを、きっかけに、また新たな作品づくりにも邁進していこうとおもいます。

    今後とも、是非よろしくお願いします。

    以下は、MFTの写真ギャラリーとします。



    2021.8.31 OT-01の回路設計

    前回のブログでは、超音波楽器のブロック図まで設計しました。

    さっそく回路設計に入ります。

    下記が前回設計したブロック図です。

    要するに、各モジュールをいかにしてマイコンに接続するかが大事になります。

    まず、使用するマイコンのピン配置を確認します。

    ATmega328PUのピン配置
    ATmega328PUの各通信端子

    SRF-02の接続

    SRF-02はI2Cという形式で通信します。

    I2Cの接続方法はとても簡単です。今回は超音波センサを2台並列でつなげられるようにします。

    I2Cの通信は、センサ(Slave)とマイコン(Master)にそれぞれあるVcc,GNDの電源端子、同期クロックのSCL、信号線のSDAの4つの端子同士をつなぎます。

    並列でつないでいても、それぞれのセンサにはアドレスが振り分けられているため、問題ありません。

    YMF-825の接続

    YMF-825はSPIで通信します。

    SPIの通信は、音源IC(Slave)とマイコン(Master)にそれぞれあるVcc,GNDの電源端子、同期クロックのSCKと接続対象のSlaveを選択するSS(Slave Select)、MasterからSlaveに信号を送るMOSI(Master Out Slave In)とSlaveからMasterに信号を送るMISO(Master In Slave Out)があり、合計6本の線で構成されます。

    Software Writer

    ソフト書込みは前回のブログでも紹介しました。

    ソフト書込みはUARTで通信しますので、変換器のTXD(送信)を,ATmega328のRXD(受信)に、変換器のRXD(受信)をATmega328のTXD(送信)に接続します。あとは、TTL変換器の+5VとGNDを、ATmega328にも供給します。そして、変換器からリセットの信号を送れるように、RTSとATmega328のResetを、0.1uFのコンデンサを経由して接続します。

    Speaker Driver

    YMF-825の使い方次第ではメモリーが足りなくなります。そういうときのために、単純な電子音であれば出せる、スピーカーのドライバ回路を用意しました。

    以前のブログにもまとめています。

    さいごにこれらの回路を統合した回路図を書きました。

    次回は、KiCadで基板設計をします。

    2021.8.28 GIXIEケースオーディオの設計

    今回から新企画になります。

    以前、謎の木の箱を分解しました。

    前回のブログでは、このケースを分解して、正体をさぐる内容でした。結果として、時計だったんでしたが、時計は以前も作ったし、ギクシー管を6個もそろえるのはお金がかかりすぎるので諦めました。

    そこで、せっかくこのおしゃれなケースがあるんだから、せめて何かに応用できないかと思考錯誤しました。

    とくにこのケースは、直径34mmの丸い穴が6個も開いている点です。

    これには、スピーカーとVUメータ―がぴったりでした。

    そこで、スピーカー4つ、VUメータ2つのオーディオアンプスピーカーを作ろうと思います。

    スピーカーの選定

    今回は、サイズも小型なので、音質はあまり求めず、デザイン優先で作ることにしました。

    スピーカーは、同じ直径34mmのものを選びました。

    Amazon 小口径アルミコーン!フルレンジスピーカーユニット1.5インチ(34mm)3Ω/MAX8W

    価格;590円

    • ユニット1個単位での販売です
    • 1.5インチフルレンジスピーカー
    • 15mmボイスコイル
    • アルミコーン
    • ネオジウムマグネット仕様(防磁仕様)

    インピーダンスが3Ωしかないのがすこし気になりますが、おおむね大丈夫だと思います。

     

    VUメータ―

    VUメータ―は、最近は手に入るのかなと心配しましたが、Amazonを探すと、海外の安いものがありました。

    Amazon VUパネル レベルメーター 6V〜12V 500μA 高精度 バックライト付 2個

    価格;1990円

    • 材質:プラスチック、電子部品
    • ヘッダDC抵抗:630オーム
    • バックライトフィラメント電圧:DC / AC 6V〜12V
    • フィラメントによるバックライト付き500μAVUメーター
    • それはオーディオレコーダー機器で広く使われています

    二個セットで1990円。結構お手頃です。

     

    ブロック図

    下記にブロック図を示します。

    スピーカー単体のインピーダンスが低いため、一個のアンプからスピーカーを並列で接続するのは厳しいと思います。そのため、それぞれにアンプをつけなければなりません。

    アンプの手前に、二連の可変抵抗を置き、これをボリュームとして使います。

    音声入力から、アンプと分岐させて、VUメータのドライバを並列で繋ぎます。

    また、DCジャックで任意の電圧を入れられるようにして、レギュレターの回路を入れ、各回路に供給します。

    Block Diagram

    次回は、これを回路図に起こします。

    2021.8.26 KTF5002を分解してみた

    今回から新企画です。

    市販の製品を分解して、そこに秘められた技術を学びます。

    今回は、AM/FMラジオチューナー、KENWOOD製のKTF5002を分解します。

    これは、近所のハードオフで1500円で販売されていました。

    ジャンク品だったのですがかなり状態がよく、FMラジオ、AMラジオ共に音も問題なく鳴っています。

    FMラジオが受信できる

    AMラジオが受信できる

    まずは、このラジオについて調べてみました。

    調べると、発売はなんと1997年ごろ。僕の年齢の一つ下です。

    価格は25000円とお手頃価格です。

    取扱説明書のpdfも上がっていたので下記にリンクを貼ります。

    KTF-5002の取扱説明書

    下記に仕様を示します。

     

    FMラジオの受信周波数範囲は76MHz~90MHz。当時のFMラジオでは十分な帯域です。90MHz以上はアナログテレビの音声信号の帯域でした。現在は、この空いた帯域がAMラジオの補完放送(WideFM)になっています。

    全高調波歪率は0.5% オーディオ機器としてはまずまずかなと思います。

    個人的に驚いたのは、FMラジオのSN比が70dBであること。当時としてはかなり高い性能ではないかと思います。

    また、AMのSN比は40dB。やはりFMよりノイズが多くなってしまうのがAMラジオです。

     

    フロントパネル

    Auto(自動選局)やスリープ、時間予約などの設定ができるみたいです。

    パッと見ボリュームだと思いましたが、これは選局です。ぐるぐる回すことはできず、傾かせるだけです。

    後ろはこんな感じ。FMのアンテナ端子、AMのアンテナ端子、オーディオ出力、コンセント、検波出力があります。FMのアンテナ端子はテレビのアンテナ線と同じものです。

    それではカバーを外して中身を見てみましょう。

    なるほど。複雑かと思いましたが中身は基板一枚に収まっていました。

    さらに基板を取り出します。

    ざっくりと、回路の名称を示します。

    FMのフロントエンド、FMのマルチプレクサ、AMステレオの復調回路、PLL回路、電源回路等、多くの回路から成り立っています。今後のブログにて、これらの回路を一つづつ説明していきます。

    今日は、分解したばかりですので、基板全体に着目します。

    まず、基板の素材は、紙フェノール基板です。安価で耐久性はあまりありませんが、置き型のオーディオ機器ではこれで十分です。基板は片面一層構造で、部品は片方の面にしかついていません。そのため、線と線の交差のため、ジャンパ線が多く使われています。また、表面実装部品は、裏面についているマイコン(ぶ厚い、、)だけで、あとはすべてディスクリート部品です。部品の足が基板の裏で曲げられているところから、この部品はすべて人の手で手挿入されています。そして、人の手でカットしているのがわかります。

    また、はんだづけに一切のムラがないことから、はんだ槽に基板をあてがう、フロー式ではんだ付けをしていることがわかります。マイコンだけは後付けでクリームはんだのリフローかもしれません。

    正直これは、今の時代から見ると、かなり人件費がかかっているなと思います。

    これを、25000円ぽっきりで売っているのはすごいと思います。

    また、電源回路も注目です。

    オーディオ関連の機器がやたら重いのは、電源回路にスイッチング方式を使わないからです。スイッチング方式の電源は、たとえば携帯の充電器やパソコンの充電アダプタなどです。このラジオも、スイッチングを使えば回路は軽くなりますが、スイッチングはノイズを多く発生させるため、とくにラジオの電源に使えばSN比は一気に下がります。そのため、大きなトランスを置き、昔ながらの電源回路で作るしかありません。

    また、表示はVFDという表示方式です。よく、スーパーのレジで青白い文字で「ゴウケイ2350エン」って出てるアレです。今では液晶表示(電卓などの)や、LEDが多いですが、これは真空管の技術を応用した昔ながらの表示です。

    これも、今後のブログで詳しく書けたらなと思います。

    最後に、スイッチ類の裏側です。かなりシンプルでした。

    今日は、ざっくり分解したレポートでした。今後は、下記の計画で、この製品をより詳しく分析していこうと思います。次回は、9/2にそもそもAMラジオ、FMラジオの受信原理について解説します。PLL、MPXの話も触れようと思います。

    現在の連載; 「FM/AMステレオチューナーKTF-5002の分解調査」

    更新日      題名          
    8/26KTF5002を分解してみた(仕様、解体手順、基板構成、機構について)
    9/2AM/FMラジオの受信原理(AM・FMとは、主に使われる受信方式について、PLL・MPXとは)
    9/9KTF5002で使用されているICについて調べた
    9/16FMフロントエンド回路、FM-IF回路、AM-RF回路 について
    9/23PLL回路の原理
    9/30FM-AM DET回路について
    10/7FM-MPX回路について
    10/14Audio AMP回路について
    10/21電源回路について
    10/28VFD表示回路について

     

    2021.8.21 Wiiリモコンを分解した

    今回は、wiiリモコンを分解しました。

    一時は大人気だったwiiですが、みなさん覚えているでしょうか。

    今や、ハードオフで300円で投げ売りされています。

    せっかくなので、分解してみることにしました。

    さっそく、開封します。

    なるほど、まあこんなもんだろうな。

    やはり、wiiといえばリモコンの傾きや振ったり、高さや水平移動を検知していました。さて、そのセンサはどこにあるでしょうか。

    くわしく見ていきます。

    本体上面の裏側にはスピーカーがついていました。

    なるほど、ボタン周りはすごくシンプルです。導電体をはりつけたシリコーンのボタンを基板の接点にあてることで、ボタンの役割を果たします。

    あとは、振動モーターと、前にCMOSカメラがついていました。なるほど、水平移動などはこのカメラで見ていたのでしょうか。

    真ん中にあった十字のボタンは、導電体が4つ。。?と思っていましたが、一つでした。

    また、接点が4つです。どの、接点同士を繋げるかで、十字の方向を決めているようです。

    ジョイコンをつなげるコネクターは金メッキでした。

    また、電源の入力には、ルビコン製の電解コンデンサが入っています。

    基板の裏面には、ジョイスティックと通信するためのDTMFレシーバIC(BU8872)や、Wii本体と無線で通信するためIC、BLOADCOM製のBCM2042が搭載されています。また、BCM2042の四隅に、三角のパットがありました。

    おそらくこれは、ノイズ試験がうまくいかなかったときに、ここに金属のカバーをつけるためのパットでしょう。

    ノイズ耐性がよかったので未実装になっているのでしょう。

    また、表面にはEEPROMのようなものがありました。これは、データを保管するメモリのようなものです。最低限の動作を記憶しています。

    また、表面の上側に加速度センサーがありました。これでwiiリモコンの傾きを検知しています。

    また、近いうちに、これらのICチップを調べて、ブログにできたらと思います。

    2021.8.19 謎の箱を分解した

    先日、近所のハードオフに行って、よくわからない箱と、wiiリモコンを分解用に衝動買いしました。

     

    今回は、この謎の木の箱の正体を確認します。

    もし、中身がなにかわからなくても、このケースはいろいろ使い道があるだろうなと思いました。

    まず、上に6か所、なにかを置くスペースがあります。

    そして、横には3つのボタンがありました。

     

    なにかを置く場所は、二つの磁石と、その真ん中に端子が3つありました。

    二つ仮説が考えられ、一つは、この二つの磁石が、それぞれ電源の+、ーになっており、真ん中の3本は信号線(3本だとSPI通信)の可能性があります。

    もう一つの仮説は、磁石に電圧はかかっておらず、3本の端子のうち二つは、電源の+とー、残り1本が信号線です。データが多くなければ(7セグメント等)、サーボモータのような制御でも問題ないのかなと思います。

    裏面は、DCジャックがあるのみです。

    電圧は書かれておらず、怖いのでまだ電圧は掛けません。DCジャックは秋月で販売されてる2.1φのものなので、とても親近感がわきます。

    それではさっそく中を開けてみましょう。

    !!!!!!!!!

    中はとてもシンプルでした。まず、真ん中にマイコンが一つ、クリスタル,そしてコイン電池が入っています。

    基板を詳しく見てみましょう。

    まず、基板から見るに、これは時計です。

    表示系をコントロールするマイコンチップはATmega8A、クロックに16MHzの一般的な水晶発振子を使用しています。また、その横にあるチップがRTC(リアルタイムクロック)だと思います。

    これは、時間を常に正確に刻みつづけ、現在時刻のデータをマイコンに送り続ける素子です。電源を抜いても、最省電力で時間を刻み続けられるために、コイン電池を積んでいます。コイン電池の電圧は3V、それに対し、電源から供給される電圧は5Vであるため、電源の電圧がコイン電池に流れ込まないよう、また、コイン電池の電圧がマイコン等にながれこまないために、ダイオードが二つ付いています。

    また、未実装の部品もありました。まず、マイコンのとなりにある6ピンの端子は、プログラム書き込み端子です。これは、ArduinoのISP端子とつなぐことで簡単にプログラムを書き換えることができます。

    また、未実装部品も気になります。とくに、JDY-16と書かれた未実装端子は気になります。これはBluetooth通信のモジュールです。おそらく、スマホなどと接続して時計をあんなことやこんなことにするためのものでしょう。オプションによってはあるんですかねえ。わかりませんが。

    基板にGIXIECLOCKと書かれていたので調べました。

    思ったよりすごいものを手に入れたみたいです。

    やはり時計でした。

    下記にリンクを貼ります。

    AZUREST(アズレスト)✖️Gixie Clock (ギクシークロック )

    これらはのケースは、すごく使えそうなので、なにか考えます。

    とても面白かったです。

    2021.8.17 Arduino 関数について

    本日のTOPIC

    今回は、ArduinoのVoid関数についてです。

    Arduinoの関数とは、プログラムを機能ごとに分割し、特定の仕事をこなすモジュールを作成するといったことが簡単にできます。このモジュールの単位のことを関数(function)と呼びます。

    関数には大きく分けて二種類あり、戻り値を返すタイプと返さないタイプに分かれます。

    戻り値を返さない関数

    まず、戻り値を返さないタイプのプログラムを下記に示します。

    void 関数名(void) {
      
      //処理内容//
    
    }
    
          関数名();      

    戻り値を返さない関数というのは、関数に何かの作業だけをさせ、その作業結果をスケッチ内で特に利用しない場合に利用します。関数に対して、作業をさせるために情報を渡す(引数と言う)場合もあります。

    関数の考え方は、あらかじめ省略したい処理を、一つの関数(数式?)としてひとまとまりにして作っておけば、メインのプログラムの流れに関数の名前を入れるだけで、その処理を一通りこなしてくれるため、プログラムの見た目がシンプルになり、わかりやすくなります。

    下図が、プログラムの例です。

    void setup() {
      // put your setup code here, to run once:
    pinMode(13,OUTPUT);
    pinMode(A1,INPUT);
    }
    void LED_ON_OFF(void) {
       digitalWrite(13,HIGH);
       delay(500);
       digitalWrite(13,LOW);
       delay(500);
       digitalWrite(13,HIGH);
       delay(500);
       digitalWrite(13,LOW);
       delay(500);
    }
    void loop() {
      // put your main code here, to run repeatedly:
        int a;
        a=digitalRead(A1);
        if(A==1){
        LED_ON_OFF();      
        }else{
        }
    }

    これを要約した図を下記に示します。

    戻り値を返さないプログラム例

    上の方に void LED_ON_OFF(void){ 処理 } でLEDをON/OFFするプログラムを関数化し、プログラムの途中に関数名を一言いれるだけで、関数を実行できる。

    戻り値を返す関数

    次に、戻り値を返すタイプのプログラムです。

    戻り値があるタイプとしては、たとえば関数に計算式を入れておき、メインのプログラムから計算したいパラメータを関数に送り、関数で計算して、計算結果を戻り値として返すものです。

    下記に例を示しますと、速度の計算を関数にしたいとします。

    戻り値を返すタイプのプログラムの定義を示します。

    int 関数名(int 変数1,int 変数2,・・・){
    
         実行する処理
    
      return 戻り値の変数;
    }
    
      関数名(変数1,変数2・・・);

    なお、intはdoubleでも構いません。また、送り値の変数はいくつあっても大丈夫です。

    メインプログラムから、距離と時間のパラメータを関数に送ります。それを関数内で計算して、計算結果(速度)を戻り値として戻すわけです。

    次に、プログラム例を示します。

    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    }
    int sokudo(int d, int s) {
       int a;
       a=d/s;
       return a;
    }
    void loop() {
      // put your main code here, to run repeatedly:
        int d;
        d=105;
        s=100;
    
        x=sokudo(d,s);
        
        Serial.println(x);
    }

     

    sokudoという名前の関数を整数型(int)で定義して、()内に送り値の距離dと時間sをintで記載し、計算結果をaに代入、これをreturn a;で戻り値として返します。

    以上が、関数のおおまかな内容です。

    今日は、ここまで。

    2021.8.14 YMF-825を使いこなす2

    前回のつづきです。

    今回は、YMF-825のサンプルスケッチを用いて、様々な音を鳴らします。

    サンプルスケッチは、GitHubに上がっていました。

    下記を参考にしてください。

    YMF-825サンプルスケッチ

    このサンプルスケッチをArduinoNanoに書き込みます。

    GitHubのフォルダーを開くと、下記のようなファイルが入っています。

    この中の、sample1のプログラムを今回はいじります。

    sample1のプログラムはこんな感じです。

    /*
     Conditions only for Arduino UNO
       RST_N- Pin9   
       SS   - Pin10
       MOSI - Pin11
       MISO - Pin12
       SCK  - Pin13
     */
    #include <SPI.h>
    //0 :5V 1:3.3V
    #define OUTPUT_power 0
    
    // only for Arduino UNO
    void set_ss_pin(int val) {
        if(val ==HIGH) PORTB |= (4);
        else PORTB &= ~(4);
    }
    
    // only for Arduino UNO
    void set_rst_pin(int val) {
        if(val ==HIGH) PORTB |= (2);
        else PORTB &= ~(2);
    }
    
    void if_write(char addr,unsigned char* data,char num){
      char i;
      char snd;
        set_ss_pin(LOW);
        SPI.transfer(addr);
        for(i=0;i<num;i++){
          SPI.transfer(data[i]);    
        }
        set_ss_pin(HIGH);  
    }
    
    void if_s_write(char addr,unsigned char data){
      if_write(addr,&data,1);
    }
    
    unsigned char if_s_read(char addr){
      
        unsigned char rcv;
        
        set_ss_pin(LOW);    
        SPI.transfer(0x80|addr);
        rcv = SPI.transfer(0x00);
        set_ss_pin(HIGH);  
        return rcv;  
    }
    
    void init_825(void) {
       set_rst_pin(LOW);
       delay(1);
       set_rst_pin(HIGH);
       if_s_write( 0x1D, OUTPUT_power );
       if_s_write( 0x02, 0x0E );
       delay(1);
       if_s_write( 0x00, 0x01 );//CLKEN
       if_s_write( 0x01, 0x00 ); //AKRST
       if_s_write( 0x1A, 0xA3 );
       delay(1);
       if_s_write( 0x1A, 0x00 );
       delay(30);
       if_s_write( 0x02, 0x04 );//AP1,AP3
       delay(1);
       if_s_write( 0x02, 0x00 );
       //add
       if_s_write( 0x19, 0xF0 );//MASTER VOL
       if_s_write( 0x1B, 0x3F );//interpolation
       if_s_write( 0x14, 0x00 );//interpolation
       if_s_write( 0x03, 0x01 );//Analog Gain
       
       if_s_write( 0x08, 0xF6 );
       delay(21);
       if_s_write( 0x08, 0x00 );
       if_s_write( 0x09, 0xF8 );
       if_s_write( 0x0A, 0x00 );
       
       if_s_write( 0x17, 0x40 );//MS_S
       if_s_write( 0x18, 0x00 );
    }
    
    void set_tone(void){
      unsigned char tone_data[35] ={
        0x81,//header
        //T_ADR 0
        0x01,0x85,
        0x00,0x7F,0xF4,0xBB,0x00,0x10,0x40,
        0x00,0xAF,0xA0,0x0E,0x03,0x10,0x40,
        0x00,0x2F,0xF3,0x9B,0x00,0x20,0x41,
        0x00,0xAF,0xA0,0x0E,0x01,0x10,0x40,
        0x80,0x03,0x81,0x80,
      };
      
       if_s_write( 0x08, 0xF6 );
       delay(1);
       if_s_write( 0x08, 0x00 );
      
       if_write( 0x07, &tone_data[0], 35 );//write to FIFO
    }
    
    void set_ch(void){
       if_s_write( 0x0F, 0x30 );// keyon = 0
       if_s_write( 0x10, 0x71 );// chvol
       if_s_write( 0x11, 0x00 );// XVB
       if_s_write( 0x12, 0x08 );// FRAC
       if_s_write( 0x13, 0x00 );// FRAC  
    }
    
    void keyon(unsigned char fnumh, unsigned char fnuml){
       if_s_write( 0x0B, 0x00 );//voice num
       if_s_write( 0x0C, 0x54 );//vovol
       if_s_write( 0x0D, fnumh );//fnum
       if_s_write( 0x0E, fnuml );//fnum
       if_s_write( 0x0F, 0x40 );//keyon = 1  
    }
    
    void keyoff(void){
       if_s_write( 0x0F, 0x00 );//keyon = 0
    }
    
    void setup() {
      // put your setup code here, to run once:
      pinMode(9,OUTPUT);
      pinMode(10,OUTPUT);
      set_ss_pin(HIGH);
     
      SPI.setBitOrder(MSBFIRST);
      SPI.setClockDivider(SPI_CLOCK_DIV8);
      SPI.setDataMode(SPI_MODE0);
      SPI.begin();
    
      init_825();
      set_tone();
      set_ch();
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      keyon(0x14,0x65);
      delay(500);
      keyoff();
      delay(200);
      keyon(0x1c,0x11);
      delay(500);
      keyoff();
      delay(200);
      keyon(0x1c,0x42);
      delay(500);
      keyoff();
      delay(200);
      keyon(0x1c,0x5d);
      delay(500);
      keyoff();
      delay(200);
      keyon(0x24,0x17);
      delay(500);
      keyoff();
      delay(200);
    }

    正直、よくわからなかったので早速書込んでみました。

    なおスピーカーは、YMF-825のSPに直接繋ぎます。

    実際の動作が下記の動画になります。

    ド、レ、ミ、フぁ、ソまでをずっと繰り返しているようです。

    どうやら、このプログラムの一番下の、void loop内の処理で音階を演奏しているみたいですね。

    
    
    void loop() {
      // put your main code here, to run repeatedly:
      keyon(0x14,0x65);    //ド
      delay(500);
      keyoff();
      delay(200);
      keyon(0x1c,0x11);    //レ
      delay(500);
      keyoff();
      delay(200);
      keyon(0x1c,0x42);       //ミ
      delay(500);
      keyoff();
      delay(200);
      keyon(0x1c,0x5d);    //ファ
      delay(500);
      keyoff();
      delay(200);
      keyon(0x24,0x17);        //ソ
      delay(500);
      keyoff();
      delay(200);
    }
    
    

    この、keyonの中の16進数の数時(0x14,0x65)が音階を決めているようです。でも、数字に連続性もないし、10進数に変換しても、周波数ではなさそう。

    いろいろ調べてみたところ、しくみはよくわかりませんでしたが、EguchiKazuyuki様のQiitaのブログにて、ここに書き込む音階のデータが示されていました。これもデータが必ずしも正確とは限らないそうなので、参照はあくまで自己責任でおねがいします。

    YMF825の音階パラメータについてhttps://qiita.com/KazuyukiEguchi/items/8e7192a0114250f8898f

    なので、音階は取り合えずここから参照すれば使えそうです。(大変感謝申し上げます)

    次に、音色です。

    設定次第で、様々な音を出せるようで、ピアノ、ギターなど自由に作れます。

    サンプルコード内の、void set_toneの中の、tonedata[35]の配列の数字で決めています。

    
    
    void set_tone(void){
      unsigned char tone_data[35] ={
        0x81,//header
        //T_ADR 0
        0x01,0x85,
        0x00,0x7F,0xF4,0xBB,0x00,0x10,0x40,
        0x00,0xAF,0xA0,0x0E,0x03,0x10,0x40,
        0x00,0x2F,0xF3,0x9B,0x00,0x20,0x41,
        0x00,0xAF,0xA0,0x0E,0x01,0x10,0x40,
        0x80,0x03,0x81,0x80,
      };
      
       if_s_write( 0x08, 0xF6 );
       delay(1);
       if_s_write( 0x08, 0x00 );
      
       if_write( 0x07, &tone_data[0], 35 );//write to FIFO
    }
    
    

    この配列を変えることで音色を変更できそうです。

    音色のサンプルスケッチは、Himagine様のブログを参考にさせていただきました。

    ヤマハ提供サンプル(2)https://sites.google.com/site/himagine201206/home/arduino/ymf825/030

    下記に転載させていただきます。感謝申し上げます。

    変換済 tonedata.txt
    
    /*
    // GrandPiano
    0x01,0x43,      // modify BO:0 -> BO:1
    0x00,0x67,0xFF,0x9D,0x00,0x10,0x40,
    0x21,0x33,0xE2,0xA3,0x00,0x50,0x00,
    0x10,0x41,0xD3,0x88,0x01,0x10,0x00,
    0x21,0x62,0xD4,0x02,0x01,0x10,0x00,
    */
    
    /*
    // E.Piano
    0x01,0x45,      // modify BO:0 -> BO:1
    0x51,0xC4,0xFB,0x8C,0x44,0x70,0x95,
    0x10,0x82,0xFF,0x12,0x45,0x10,0x00,
    0x11,0xB0,0xF1,0x49,0x44,0x10,0x02,
    0x11,0x72,0xFF,0x10,0x41,0x10,0x00,
    */
    
    /*
    // TenorSax
    0x01,0x45,      // modify BO:0 -> BO:1
    0x01,0x03,0x70,0x16,0x44,0x10,0x0B,
    0x00,0x92,0x70,0x3C,0x43,0x10,0x40,
    0x01,0x03,0x70,0x22,0x44,0x10,0x4B,
    */
    
    /*
    // PickBass
    0x02,0x43,      // modify BO:0 -> BO:2
    0x21,0x37,0xF1,0x4E,0x44,0x10,0x05,
    0x41,0x6B,0xC7,0x54,0x44,0x70,0x00,
    0x21,0x69,0xF2,0x5E,0x44,0x20,0x00,
    */
    
    /*
    // TnklBell
    0x01,0x45,      // modify BO:0 -> BO:1
    0x30,0x46,0xF5,0x41,0x44,0xE0,0x03,
    0x70,0x66,0xCE,0x2E,0x44,0x20,0x00,
    0x20,0x26,0xC5,0x78,0x44,0x77,0x08,
    0x40,0x55,0xFD,0x04,0x54,0x60,0x00,
    */
    
    /*
    // NewAgePd
    0x01,0x45,      // modify BO:0 -> BO:1
    0x31,0x3F,0xF0,0x98,0x44,0x70,0x0D,
    0x40,0x47,0xF0,0x2E,0x44,0x50,0x00,
    0x00,0x11,0x60,0x62,0x03,0x17,0x0E,
    0x00,0x51,0x81,0x02,0x03,0x10,0x00,
    */
    
    /*
    // RimShot
    0x00,0x45,
    0x59,0x50,0xF0,0x14,0x44,0xC0,0x17,
    0x79,0x77,0xF7,0x00,0x44,0xB0,0x00,
    0x68,0x6A,0xF8,0x00,0x44,0xC0,0x00,
    0x78,0x77,0xF7,0x00,0x44,0x70,0x10,
    */
    
    /*
    // Castanet
    0x01,0x45,      // modify BO:0 -> BO:1
    0x58,0x97,0xFF,0x08,0x44,0x70,0x0E,
    0x59,0xF8,0xAF,0x00,0x44,0x50,0x30,
    0x68,0x55,0xF0,0x9C,0x44,0x20,0x28,
    0x98,0x9A,0xCA,0x50,0x44,0x50,0x00,
    */
    

    ここには、GrandPiano  E.Piano  TenorSax  PickBass  TnklBell  NewAgePd  RimShot  Castanetの八種類の音源があり、これをコピペすることで音色を変えれそうです。

    今日は、ここまで。

    2021.8.12 YMF-825を使いこなす1

    本日の内容

    超音波の楽器を作るにあたり、出力する音は、いろんな音が出せる方が良いと思うようになりました。

    YMF-825の特徴

    ヤマハのFM音源チップYMF825(SD-1)を搭載した音源ボードです。ヤマハ独自のFMシンセサイザを搭載し、数種類のパラメータ指定により豊かなサウンドを再生することが可能です。

    ArduinoやRaspberry Pi等のマイコンボードから、SPIを通して直接YMF825のレジスタを制御することで発音させます。スピーカーアンプも搭載しているので、アンプ回路を別途外部に用意する必要がありません。

    ※3.5 mmのヘッドホンジャックを搭載していますが、iPhone用などの4極CTIA採用のイヤホンはお使いいただけません(OMTPのものはお使いいただけます)。**Switch science様の販売ページより**

    仕様

    • 4オペレータのFM音源
    • 最大16音同時に発音可能
    • FMの基本波形29種類内蔵、アルゴリズム8種類
    • SPIによるシリアルインタフェース
    • スピーカアンプ内蔵
    • 3バンドイコライザ内蔵
    • 16 bitモノラルD/Aコンバータ内蔵
    • 動作電圧:5 V
    • 3.3 Vでも改造することで利用可能
    **Switch science様より画像引用**

    サンプルスケッチがGitHubに上がっていますので参考にしました。

    ・サンプルスケッチ

    どんな波形も生み出せる

    サンプルスケッチには、簡単なマニュアルも入っています。

    YMF825が生み出せる波形

    基本的な、正弦波、三角波、のこぎり波、矩形波、半波整流みたいな波、など様々です。

     

    7種類の帰還が掛けれる

    エフェクターや、シンセサイザーでおなじみの帰還も、7種類から選ぶことができます。

    まだ、くわしく分かってないので今後、紹介させていただければと思います。

    SPI通信とは

    シリアル・ペリフェラル・インタフェース(Serial Peripheral Interface, SPI)は、コンピュータ内部で使われるデバイス同士を接続する方法であり、比較的低速なデータ転送を行うデバイスに利用される。

    SPIは省ピンで接続できるバスとして、モトローラ(現在はNXPセミコンダクターズ)が提唱した規格であり、

    信号線は4本で構成され、一つのデバイスを接続する場合はSSを固定することで3本で接続できる。

    SCK
    Serial Clock

    MISO
    Master In Slave Out

    MOSI
    Master Out Slave In

    SS
    Slave Select

    SPI通信の接続(*Wikipediaより引用)

     

     

    簡単な動作回路例

    次に、接続図です。

    YMF-825との接続

    YMF-825とArduinoNanoをSPIの形式で通信するだけですので、相互の、電源ライン(+5V,GND)とSPIの端子(SCK,MISO,MOSI,SS,Reset)を接続します。

     

    今日はここまで

    2021.8.10 ATmega328にプログラムを書込む

    本日のトピック

    以前のブログで、ATmega328のブートローダを書き込みました。

    今回は、この続きとして、ATmega328にArduinoと同様にプロブラムを書き込みます。

    まず、プログラムを書き込むのに、PCと接続する必要がありますよね。ですが、ATmega328にはUSBがありません。

    さてはまた純正のArduinoを用意するかと思いますが、もっと安いもので代用が出来ます。

    それが、USB-シリアル変換器です。

    USB-TTL変換器

    FTDI社FT232RQを使ったUSBシリアル変換モジュールです.
    ・WindowsXP~10まで幅広いドライバーが有り対応しています。
    ・DIPスイッチで5V/3.3Vの信号レベルの変更が可能です。

    端子は、+5V、GND、CTS、TXD、RXD 、RTSの六端子です。

    TXD,RXDということは、そうですUARTの通信になります。

     

    ATmega328との接続

    次に、ATmega328との接続方法です。

    UARTの通信ですので、変換器のTXD(送信)を,ATmega328のRXD(受信)に、変換器のRXD(受信)をATmega328のTXD(送信)に接続します。あとは、TTL変換器の+5VとGNDを、ATmega328にも供給します。

    そして、変換器からリセットの信号を送れるように、RTSとATmega328のResetを、0.1uFのコンデンサを経由して接続します。

    あとは、ATmega328のクロックとして、16MHzの水晶発振子を接続します。

    Arduino IDEの設定

    TTL変換器をUSBに接続すれば、あとは普通のArduinoと同様に書き込むことが出来ます。

    ただ、ここで書き込めるのは、ブートローダを書込み済のマイコンに限ります。

    ブートローダの書込み方法は下記に示しますので参考にしてください。

    ・ブートローダ書込み方法

    さて、Arduinoと同様に書けるとは言ったものの、ATmega328でも、ATmega328P-PUと、ATmega328Uでは少し、設定が違います。

    ATmega328P-PUの書込み設定

    ATmega328P-PUは、少し割高ですが、純正品のArduino UNOと同じチップを使っているので、「ツール」を開いた設定画面では、ボード「Arduino Uno」を選び、あとはTTL変換器を繋いでいるCOMポートを選択すれば、これで書き込めてしまいます。

    Arduino IDEを開きプログラミング
    ATmega328P-PUの設定

    ATmega328 U(ATmega328PU)

    Arduinoに初期から入っているボードマネージャーでは、ATmega328は書き込めません。

    「ツール」→「ボード」→「ボードマネージャー」を開き、MiniCoreと検索し、インストール。

    ボードマネージャーを起動
    MiniCoreをインストール

    Arduinoを再起動して、「ツール」→ボード→「MiniCore」→「ATmega328」を選択します。

    ボードはATmega328を選択

    あとは、左上の書込みボタンで書き込めます。

    2021.8.7 SRF-02の使い方

    本日のトピック

    今回は、超音波センサSRF-02のコマンドについて調べました。

    まず、SRF-02の通信には二つのモードがあり、I2CとUARTがありますが、今回はI2Cに焦点を当てて説明します。

    まずは、SRF-02の主な特徴です。

    ◆主な仕様
    ・使用マイコン:16F687-I/ML
    ・測定範囲:16cm~6m.
    ・電源:5V(消費電流4mA Typ.)
    ・使用周波数:40KHz.
    ・アナログゲイン:64段階の自動ゲインコントロール
    ・接続モード:モード1=I2C、モード2=シリアルバス
    ・全自動調整機能:電源投入後キャリブレーション不要
    ・測距タイミング:エコー時間計測、ホストによるタスクコントロール
    ・測定単位:μS(マイクロ秒)、ミリ、インチ
    ・サイズ:24mmx20mmx17mm
    ・入出力端子:5ピン
    ・重量:4.6グラム

    SRF-02の主なコマンド

    次に、SRF-02で使用される主なコマンドです。

    コマンドの通信方法は、ArduinoのWireライブラリを使って通信します。詳細は、以前のブログを参照してください。

    I2Cでの通信方法

    SRF02をI2Cモードで使用するには、モードピンをオープンにします。

    I2Cの通信では、最大16個まで並列で接続できます。並列でつなぐので、それぞれのSlave(超音波センサ)にアドレスを振り分けます。
    SRF02の出荷時のアドレスは0xE0です。アドレスはユーザによって変更することができ、最大16個(E0、E2、E4、E6、E8、EA、EC、EE、F0、F2、F4、F6、F8、FA、FC、FE)のアドレスが使用できます。

     

    レジスタ

    SRF-02には6種類のレジスタがあります。

    ロケーション 読む書く
    0 ソフトウェアリビジョンコマンドレジスタ
    1未使用(0x80を読み取ります)該当なし 
    2測定値 上位バイト該当なし
    3測定値 下位バイト該当なし
    4オートチューン最小-上位バイト該当なし
    5オートチューン最小-下位バイト該当なし
    レジスタ

     

    6個あるレジスタのうち、Masterから書き込むことができるのは、0番のレジスタのみです。

    すべて、0番のレジスタに数値を入れることでSRF-02の様々な設定ができます。

    0番から読み出す場合は、ソフトウェアリビジョンを返されます。1番は使用していない空きピンです。

    2,3番のレジスタが、測定した数値を返すレジスタです。測定値は最大2byteの容量で返します。レジスタ1個は1byteですので、レジスタが二つ(2,3)必要なわけです。この測定値は、設定の状態によって、インチ、センチ、マイクロ秒などで返します。

    4、5番のレジスタは、16ビットの符号なし最小範囲です。これは、ソナーが測定できるおおよその最も近い範囲です。

    つまり最初0番で指定をしたら、あとは2,3番のレジスタで測定値を参照すればよいということです。

     

    SRF-02のコマンド

    下記が、SRF-02の0番に指定するコマンドです。

      2進数    16進数  動作
    800x50Real Ranging Mode – Result in inches
    810x51Real Ranging Mode – Result in centimeters
    820x52Real Ranging Mode – Result in micro-seconds
    860x56Fake Ranging Mode – Result in inches
    870x57Fake Ranging Mode – Result in centimeters
    880x58Fake Ranging Mode – Result in micro-seconds
    920x5CTransmit an 8 cycle 40khz burst – no ranging takes place
    960x60Force Autotune Restart – same as power-up. You can ignore this command.
    1600xA01st in sequence to change I2C address
    1650xA53rd in sequence to change I2C address
    1700xAA2nd in sequence to change I2C address
    コマンド

    必要に応じて、上記のコマンドを1番のコマンドレジスタに書き込み、必要な時間待機して結果を読み取ります。エコーバッファは、各レンジングの開始時にクリアされます。レンジングは最大66m秒持続します。この後、測定値を2,3番のレジスタから読み取ります。

    SRF-02の命令方法

    MasterからSRF-02に命令する場合、どのようにしたらよいでしょうか。

    下記が、参考に、測定値をcmにするプログラムです。

    Wire.beginTransmission(226); //通信先のアドレス
      Wire.write(0x00);    //レジスタを選ぶ
      Wire.write(0xA0);  //コマンドを選ぶ
      Wire.endTransmission();

    順番としては、まず Wire.beginTransmission(226); で、Slaveのアドレス(226)を指定。

    次に送信するものは、接続するレジスタになります。なにか設定などをする場合は、

    0番のレジスタにアクセスするため、Wire.write(0x00);で0を送ります。

    次に、送るものが設定するコマンドです。

    例えば、測定値をcmで返す設定をする場合は、コマンド0x51を送ればよいので、

    Wire.write(0x51);となります。

    設定はこれで終了なので、 Wire.endTransmission(); で今回の通信を終わります。

    コマンドの内容にもよりますが、基本は、レジスタを指定→そのレジスタのコマンドを送る、の流れです。

     

    SRF-02の測定値を読み出すプログラム

    次に、SRF-02から測定値を読み出す方法です。

          Wire.beginTransmission(0xE0); // transmit to device #112
          Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)
          Wire.endTransmission();      // stop transmitting
    
         
          Wire.requestFrom(0xE0, 2);    // request 2 bytes from slave device #112
        
          if (2 <= Wire.available())   // if two bytes were received
          {
            reading = Wire.read();  // receive high byte (overwrites previous reading)
            reading = reading << 8;    // shift high byte to be high 8 bits
            reading |= Wire.read(); // receive low byte as lower 8 bits
            Serial.print(reading);   // print the reading
            Serial.println("cm");
          }

    まず、SRF-02から数値を読み出す場合、2番目のレジスタ0x02にアクセスします。それが、3行目までのプログラムです。

    次に、SRF-02からデータを受信する準備をします。それが、 Wire.requestFrom(0xE0, 2); です。

    これは、アドレスE0のSlaveから、2byteのデータを受け取りますという意味です。

    あとは Wire.read();で、データを受け取ることが出来ます。しかし、2byteあるため、そのまま受け取ると下位ビットが上書きされます。そのため、まず、上位8ビットのデータを受け取り( reading = Wire.read(); )、readingのビットを (reading = reading << 8; )8bit高い位にシフトさせてから、次に飛んでくる数値(下位ビット)を ( reading = Wire.read(); ) で受信します。

    Slaveで分割されたデータは、上位ビットから書き込まれる

    そのまま下位ビットを書き込むと上書きされてしまう

    そこで、最初に書き込まれた上位ビットを8ビット上にシフト

    そのあとで下位ビットを書き込めばすべて正しく送れる

     

     

    SRF-02のアドレス指定

    次に、SRF-02のアドレス指定手順です。方法は簡単で、上記コマンドの0xA0, 0xAA, 0xA5,を順番に送り、最後に新しいアドレスを送ることで、アドレスを指定するモードになります。例えば、もともとのアドレスE0から新しいアドレスF4に帰る場合は下記のプログラムを動かします。とてもシンプルですよね。

      Wire.beginTransmission(0xE0);
      Wire.write(0x00);
      Wire.write(0xA0);               //A0を書き込む
      Wire.endTransmission();
    
      Wire.beginTransmission(0xE0);
      Wire.write(0x00);
      Wire.write(0xAA);               //AAを書き込む
      Wire.endTransmission();
    
      Wire.beginTransmission(0xE0);
      Wire.write(0x00);
      Wire.write(0xA5);               //A5を書き込む
      Wire.endTransmission();
    
      Wire.beginTransmission(0xE0);
      Wire.write(0x00);
      Wire.write(0xF4);               //新しいアドレスF4を書き込む
      Wire.endTransmission();

    今日は、ここまで。

     

    2021.8.7 ひいらぎ

    2021.8.3 ATmega328にブートローダを書き込む

    本日のトピック

    今回は、市販のAVRマイコンのATmega328を、Arduinoとして使うための処理をします。

    ATmega328とは、Arduinoに搭載されているマイコンチップです。

    Arduinoは、定価で買うと大体3000円程度。基板も大きいので実装には不向きです。

    そこで、ATmega328を単体でArduinoとして使うようにします。

    ATmega328は、通販サイトで結構売られています。

    ただ、最近は半導体不足によりATmega328の表面実装や、ATmega328P-PUなどは手に入りにくい状況です。

    今のところ、まだ在庫はありそうです。

    RSコンポーネンツで一つ323円です。つまり、Arduinoの10分の1の価格で小サイズのArduinoが使えるわけです。

    RSコンポーネンツ ATmega328-PU 通販ページ

    今回は、このICにArduinoとして使うためのブートローダを書き込みます。

    そもそも、ブートローダとは何でしょうか。

     

    ブートローダとは

    ブートとは、コンピュータなどでOSなどの基本ソフトウェアを起動することを意味する俗語。ブートローダとは、このときに、OS本体や「OSをロードするためのソフトウェア」をメモリに読み込むための小さなソフトウェアを言います。このプログラムは、ATmegaマイコンを動かす上の基礎てきなソフトです。初期設定みたいなものなので、一度書き込んでしまえば、ずっと使えますし、ソフトも何回も書き換えれます。

     

    ブートローダを書き込む準備

    ブートローダを書き込むためには、純正品のArduinoを用意してください。ATmega328とSPI方式で通信する必要があり、そのために純正のArduinoが必要になります。

    純正のArduinoは基本的になんでも構いません。私は、ブレットボードに刺せるArduino Nanoを使いました。

    Arduino Nano
    ATmega328PU

     Arduino NanoとATmega328PUの配線図は下図の通りです。

    要するに、ArduinoNanoとATmega328でSPI通信を行いたいため、お互いのMISO、MOSI、SCKと+5V、GNDを接続します。あとは、ArduinoNanoが指定するタイミングで、328のResetをかけるため、NanoのD10と328のResetを接続し、6.8kΩの抵抗でプルアップしています。

    あとは、ATmega328もクロック無しでは動かないので、16MHzの水晶発振子と定番のコンデンサ22pFを入れています。

    ブートローダを書き込む接続図

    実際にブレッドボードで配線しました。

    ブレッドボードで配線

    ArduinoIDEの設定

    次に、Arduinoの書込みソフトの設定をします。

    まず、書き込むICが ATmega328P-PUと、ATmega328PU(部品表記;ATMEGA328 U)では、ブートローダの書込み方が違います。これは、ATmel社がMicroChip社に変わってから、廉価版として発売されたATmega328PUは、書き込むバリアントが違うためです。

     

    ATmega328P-PUのブートローダを書き込む

    まず、ArduinoIDEを起動します。Arduinoのソフトのインストールは下記のリンクから行ってください。

    ArduinoIDEのダウンロード

    ArduinoIDEが起動したら、「ファイル」→「スケッチ例」→「11.ArduinoISP」→「ArduinoISP」を開きます。

    Arduino IDEを起動
    Arduino ISPを起動

    まず、ArduinoNanoにArduinoISPのソフトを書き込みます。これで、ArduinoNanoを書き込み機として使えます。

    その後、「ツール」を押して、ポート「Arduino Uno」、シリアルポート「ArduinoNanoを接続してるCOMポート」、書込装置「Arduino as ISP」を選択し、一番下の「ブートローダを書き込む」を押して、ブートローダを書き込むことが出来ます。

    ArduinoNanoにArduinoISPのソフトを書き込む
    ブートローダを書き込む

     

    ATmega328PUにブートローダを書き込む

    上記で、ArduinoISPをArduinoNanoにISPのソフトを書き込むところまでは同じです。

    Arduinoに初期から入っているボードマネージャーでは、ATmega328は書き込めません。

    「ツール」→「ボード」→「ボードマネージャー」を開き、MiniCoreと検索し、インストール。

    ボードマネージャーを起動
    MiniCoreをインストール

    Arduinoを再起動して、「ツール」→ボード→「MiniCore」→「ATmega328」を選択します。

    ボードはATmega328を選択
    シリアルポート、書き込み装置を選択

    あとは、「ブートローダを書き込む」を押すと書き込まれます。

    これでブートローダの書き込みが完了します。

     

    今日はここまでです。

    2021.7.31 ArduinoのWire関数について

    今回は、Arduinoで超音波センサとI2C通信を行います。

    そのなかで、とくに便利なのがWire関数です。

    まず最初に、I2C通信の概要を説明します。

    本日のトピック

    I2C通信とは

    I2C(Inter-Integrated Circuit)は、フィリップス社が提唱した周辺デバイスとのシリアル通信の方式で、主にEEPROMメモリICなどとの高速通信を実現する方式です。

    基本構成は、マスタ側とスレーブ側を明確に分かれており、マスタ側が全ての制御の主導権を持っています。

    接続は、マスターは一機だけですが、スレーブは何機も接続することが出来ます。

    接続関係

    I2Cは、全ての同じ線(SDA,SCL)を並列で接続します。並列なのに個々と通信ができるのは、インターネットのネットワークと同様に、それぞれにアドレスが割り振られているからです。

    アドレスは、2進数でも16進数でも10進数でも構いません。例えば16進数で書く場合は、0x70や、0x56などの形で書きます。また、マスターにはアドレスはありません。

    通信をする際は、必ず最初にSlaveの宛先(アドレス)を宣言してから、データを送ります。送り先が変わるときも逐次、宛先を言います。人間の生活でも、手紙、宅配便には必ず宛先を書きますよね。それと同じです。当たり前といえば当たり前ですね。

    Slaveにはアドレスが割り振られている

    Wire.hの主なコマンド

    ここでは、細かい説明は、なるべく省き、使い方に特化させます。

    なので、まず使えるコマンドを確認しましょう。

    #include<Wire.h>

    I2Cで通信する際は、最初に宣言する必要になります。これは、「Wireのライブラリを使います」という宣言文で、プログラムの先頭に書きます。

     

    Wire.begin();

    wireライブラリを初期化します。自身がSlaveの場合は、括弧の中にアドレスを入力します。Masterはアドレスの入力は不要です。

     

    Wire.beginTransmission(slave address);

    カッコ内に指定したアドレスのSlaveに対して、通信を開始する準備をします。通信を始めるときは必ず宣言します。

     

    Wire.write( data );

    Wire.beginTransmissionで指定したアドレスに対して、Wire.writeのカッコ内のデータを送信します。基本的にデータは1byte以内です。

     

     Wire.endTransmission();

    Slaveに対してのデータの送信処理を完了します。なお、WireライブラリではbeginTransmissionからendTransmissionまでのデータバッファは32byteなので送信データが多い場合は適宜endTransmissionで区切る必要があります。

    Wire.requestFrom(address, byte);

    MasterがSlaveにデータを要求するとき、最初に宣言します。要求する先のアドレスと、ほしいデータの容量を書きます。

    Wire.available()

    read()で読み取ることができるバイト数を返します。

    Wire.read()

    マスタデバイスでは、requestFrom()を実行したあと、スレーブから送られてきたデータを読み取るときに使用します。スレーブがマスタからのデータを受信するときにも使用します。

    超音波センサにおけるI2Cのプログラム

    以前のブログでお話した、超音波センサのプログラムを示します。

    前回のブログでは、あまり触れていなかった通信の部分に焦点をあてます。

    
       #include <Wire.h>
    
        void setup()
        {
          Wire.begin();                // join i2c bus (address optional for master)
          Serial.begin(9600);          // start serial communication at 9600bps
          pinMode(11,OUTPUT);
          
        }
    
        int reading = 0;
        int SPEAKER = 11;
          int TIME=100;
          int m[9]={262,294,330,349,392,440,494,524,0 };
          int melody=0;
    
        void loop()
        {
         
          
          // step 1: instruct sensor to read echoes
    
          Wire.beginTransmission(112); // transmit to device #112 (0x70)
          Wire.write(byte(0x00));      // sets register pointer to the command register (0x00)
          Wire.write(byte(0x51));      // command sensor to measure in "centimeters" (0x51)
          Wire.endTransmission();      // stop transmitting
    
          // step 2: wait for readings to happen
          delay(20);                   // datasheet suggests at least 65 milliseconds
    
          // step 3: instruct sensor to return a particular echo reading
          Wire.beginTransmission(112); // transmit to device #112
          Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)
          Wire.endTransmission();      // stop transmitting
    
          // step 4: request reading from sensor
          Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112
    
          // step 5: receive reading from sensor
          if (2 <= Wire.available())   // if two bytes were received
          {
            reading = Wire.read();  // receive high byte (overwrites previous reading)
            reading = reading << 8;    // shift high byte to be high 8 bits
            reading |= Wire.read(); // receive low byte as lower 8 bits
            Serial.print(reading);   // print the reading
            Serial.println("cm");
            
            if(reading>105){
              
            }else if(reading>95){
              melody=m[7];  
              tone(11,melody) ; 
              delay(TIME);
            }else if(reading>85){
             melody=m[6]; 
             tone(11,melody) ; 
             delay(TIME);       
            }else if(reading>75){
             melody=m[5];   
            tone(11,melody) ; 
             delay(TIME);     
            }else if(reading>65){
              melody=m[4];   
            tone(11,melody) ; 
              delay(TIME);     
            
            }else if(reading>55){
              melody=m[3]; 
            tone(11,melody) ; 
              delay(TIME);       
            
            }else if(reading>45){
              melody=m[2]; 
            tone(11,melody) ; 
              delay(TIME);
              
            }else if(reading>35){
              melody=m[1];  
            tone(11,melody) ; 
              delay(TIME);
    
            }else if(reading>25){
              melody=m[0];
            tone(11,melody) ; 
              delay(TIME);
              
            }else if(reading>15){
              melody=m[8];
              tone(11,melody) ; 
              delay(TIME);
            }
            tone(11,melody) ; 
     
          }
    
          delay(5);                  // wait a bit since people have to read the output :)
        }

    まず、voidsetup(){ の中に、 #include <Wire.h> と Wire.begin(); が入っています。これはそれぞれ、Wireライブラリの読み出しと、Wireライブラリの初期化の意味があります。

    
    
       #include <Wire.h>
    
        void setup()
        {
          Wire.begin();                // join i2c bus (address optional for master)
          Serial.begin(9600);          // start serial communication at 9600bps
          pinMode(11,OUTPUT);
          
        }
    
    

    メインのプログラムは、5段構成です。

    まず、Wire.beginTransmission(112);で、Slaveデバイスのアドレス(112)を指定します。

    次に、Wire.writeで、0x00を送信。超音波センサに通信開始する合図です。

    その後、0x51を書き込みます。これは、あとで読み出す、超音波センサの距離を、センチメートルで返す設定をします。

    Wire.endTransmissionで送信します。

    20ミリ秒待ったのち、0x02を送信。超音波の測定値を送るようにセンサに要求しています。

    そして、Wire.requestFormで、受信の準備をします。容量は2byteです。

    さいご、Wire.read()で測定値を読み込むという流れになっています。

    
    
     // step 1: instruct sensor to read echoes
          Wire.beginTransmission(112); // transmit to device #112 (0x70)
          // the address specified in the datasheet is 224 (0xE0)
          // but i2c adressing uses the high 7 bits so it's 112
          Wire.write(byte(0x00));      // sets register pointer to the command register (0x00)
          Wire.write(byte(0x51));      // command sensor to measure in "centimeters" (0x51)
          // use 0x51 for centimeters
          // use 0x52 for ping microseconds
          Wire.endTransmission();      // stop transmitting
    
    
          // step 2: wait for readings to happen
          delay(20);                   // datasheet suggests at least 65 milliseconds
    
    
          // step 3: instruct sensor to return a particular echo reading
          Wire.beginTransmission(112); // transmit to device #112
          Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)
          Wire.endTransmission();      // stop transmitting
    
    
          // step 4: request reading from sensor
          Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112
    
    
          // step 5: receive reading from sensor
          if (2 <= Wire.available())   // if two bytes were received
          {
            reading = Wire.read();  // receive high byte (overwrites previous reading)
            reading = reading << 8;    // shift high byte to be high 8 bits
            reading |= Wire.read(); // receive low byte as lower 8 bits
            Serial.print(reading);   // print the reading
            Serial.println("cm");
    
    

    きょうはここまで。

    2021.7.29 超音波で弾く楽器を作りたい1

    本日のまとめ

     

    唐突ですが、超音波で弾く楽器をつくりたいです。

    設計のイメージは右図のように、超音波センサを上向きで置き、そこに手をかざして演奏します。音階はかざす手の高さによって決まっています。

     

    次に、楽器のシステムを考えます。超音波センサは、以前のブログでも紹介したSRF-02を使います。また、マイコンから音を出す回路も前回のブログで書いたスピーカー駆動回路を使います。

    右図が簡単なシステム図です。

    超音波センサSRF02は、検知した距離をI2Cのシリアル通信またはUARTにて出力します。今回は、配線が簡単なI2Cを使うことにしました。

    超音波センサからArduinoには、I2Cを経由して距離が数値で入力されます。

    その数値をArduino内で処理し、音階のデータに変換して、スピーカーに出力します。

    つぎにプログラムを設計するため、フローチャートを書きました。

    プログラムをスタートすると、まず超音波センサの値を読み込みます。

    すると、超音波センサは、かざした手までの距離をcm単位で数値を返します。

    その距離を、Arduino内では、何層にも重ねたif文で条件を分岐し、各音階の周波数を割り当てます。

    次に、if文内の処理について説明します。

    まず、高さが105cm以上であるかないかを判別します。高さが105cm以上であれば、プログラムや音階は現状維持となります。つまり、前出した音階を継続します。105cmはかなり高い高さなので、かざしていない場合を想定しています。

    次に、105cm以上がNoであった場合、次は95cm以上かどうかを判別します。95cm以上であれば、手は95cm~105cmの間にあるということですから、ドの音階を出力させます。

    続いて、85cm以上ならシ、75cm以上ならラ、と分岐していき、最後、15cm以上で、下のドとなります。

    それぞれ、音階を出力したら、処理はまた振り出しに戻り、センサの値を読み込むところからやり直します。

    これを、プログラムのコードに直すと下記のようになります。

      #include <Wire.h>
    
        void setup()
        {
          Wire.begin();                // join i2c bus (address optional for master)
          Serial.begin(9600);          // start serial communication at 9600bps
          pinMode(11,OUTPUT);
        }
        int reading = 0;
        int SPEAKER = 11;
        int TIME=100;
        int m[9]={262,294,330,349,392,440,494,524,0 };
        int melody=0;
    
        void loop()
        { 
          // step 1: instruct sensor to read echoes
          Wire.beginTransmission(112); // transmit to device #112 (0x70)
          // the address specified in the datasheet is 224 (0xE0)
          // but i2c adressing uses the high 7 bits so it's 112
          Wire.write(byte(0x00));      // sets register pointer to the command register (0x00)
          Wire.write(byte(0x51));      // command sensor to measure in "centimeters" (0x51)
          // use 0x51 for centimeters
          // use 0x52 for ping microseconds
          Wire.endTransmission();      // stop transmitting
          // step 2: wait for readings to happen
          delay(20);                   // datasheet suggests at least 65 milliseconds
          // step 3: instruct sensor to return a particular echo reading
          Wire.beginTransmission(112); // transmit to device #112
          Wire.write(byte(0x02));      // sets register pointer to echo #1 register (0x02)
          Wire.endTransmission();      // stop transmitting
          // step 4: request reading from sensor
          Wire.requestFrom(112, 2);    // request 2 bytes from slave device #112
          // step 5: receive reading from sensor
          if (2 <= Wire.available())   // if two bytes were received
          {
            reading = Wire.read();  // receive high byte (overwrites previous reading)
            reading = reading << 8;    // shift high byte to be high 8 bits
            reading |= Wire.read(); // receive low byte as lower 8 bits
            Serial.print(reading);   // print the reading
            Serial.println("cm");
            
            if(reading>105){
            }else if(reading>95){
              melody=m[7];  
              tone(11,melody) ; 
              delay(TIME);
            }else if(reading>85){
             melody=m[6]; 
             tone(11,melody) ; 
             delay(TIME);       
            }else if(reading>75){
             melody=m[5];   
            tone(11,melody) ; 
             delay(TIME);     
            }else if(reading>65){
              melody=m[4];   
            tone(11,melody) ; 
              delay(TIME);     
            
            }else if(reading>55){
              melody=m[3]; 
            tone(11,melody) ; 
              delay(TIME);       
            
            }else if(reading>45){
              melody=m[2]; 
            tone(11,melody) ; 
              delay(TIME);
              
            }else if(reading>35){
              melody=m[1];  
            tone(11,melody) ; 
              delay(TIME);
    
            }else if(reading>25){
              melody=m[0];
            tone(11,melody) ; 
              delay(TIME);
              
            }else if(reading>15){
              melody=m[8];
              tone(11,melody) ; 
              delay(TIME);
            }
            tone(11,melody) ; 
          }
          delay(5);                  // wait a bit since people have to read the output :)
       }

    ここで、新たに登場した関数は、wire関数です。

    #include<Wire.h>

    Wire.hの関数をincludeで呼び出しています。Wire関数は、I2Cのシリアル通信を行う最に使う関数で、Wire.read();などで、シリアルのデータを読み込むことができるなどします。

    私もこの関数は知らなかったのですが、少し奥が深そうなので、後日まとめて掲載できたらと思います。

     

    さっそくブレッドボードで配線を組みました。

    次回は、これの動作チェックをします。

    2021/7/29 ひいらぎ

    2021.7.27 tone関数を使いこなす

    Arduinoのプログラム[tone関数を使いこなす]

    次に、tone関数を用いてArduinoから音を出していきましょう。

    tone関数

    tone関数のリファレンスは、

    tone(pin, 周波数 , 出力時間);

    です。なお、出力時間は、省略して書くこともできます。

    さっそく、下記のプログラムを作ってみました。

    void setup() {
      // put your setup code here, to run once:
    pinMode(11,OUTPUT);
    }
    
    void loop() {
    int TIME=300;
      // put your main code here, to run repeatedly:
    tone(11,262,TIME) ; // ド
    delay(TIME) ;
    tone(11,294,TIME) ; // レ
    delay(TIME) ;
    tone(11,330,TIME) ; // ミ
    delay(TIME) ;
    tone(11,349,TIME) ; // ファ
    delay(TIME) ;
    tone(11,392,TIME) ; // ソ
    delay(TIME) ;
    tone(11,440,TIME) ; // ラ
    delay(TIME) ;
    tone(11,494,TIME) ; // シ
    delay(TIME) ;
    tone(11,523,TIME) ; // ド
    delay(TIME) ;
    }

     

    このプログラムは、ドレミファソラシドを0.3秒ごとに切り替えて、出力するプログラムです。

    使っている関数を、いくつか紹介します。

    pinMode(pin, OUTPUT);

    Arduinoの各入出力ピンが、出力なのか入力なのかを設定します。例題のプログラムでは11番ピンを出力に設定しているので、pinMode(11,OUTPUT);となります。入力に設定する場合は、pinMode(11,INPUT); また、pinMode(11,INPUT_PULLUP);で、入力をプルアップに設定できます。

     

    int 変数=数値;

    整数の変数を定義するときにint関数を使います。ほかにもfloat , char,doubleなどがありますが、奥が深いので、いつかまた紹介できたらなと思います。

    delay(時間);

    プログラムを指定した時間だけ遅延させます。単位はミリ秒です。また、マイクロ秒で指定する場合は、

    delayMicroseconds(時間);で指示できます。

     

    さて、次に音を鳴らす回路です。回路は、前回のブログでも作成した、スピーカーの回路を使います。

     次に、プログラムの内容は同じですが、配列とfor文を使って、短く簡単にまとめたプログラムです。

    だいぶ、短いプログラムになりました。

    void setup() {
      // put your setup code here, to run once:
    pinMode(11,OUTPUT);
    }
    
    void loop() {
      int TIME=300;
      int m[8]={262,294,330,349,392,440,494,523};
      
      // put your main code here, to run repeatedly:
    
      for(int i=0;i<8;i++){
        tone(11,m[i],TIME) ; 
        delay(TIME) ;
      }
    }

    このプログラムは、先ほどと同じ、ドレミファソラシドを0.3秒ごとに切り替えて、出力するプログラムです。

    使っている関数を、いくつか紹介します。

    int 変数[データ数] ={数値1,数値2,数値3,・・・};

    配列は、大量の数値を同時に宣言するのに便利です。例のプログラムの場合は、ドレミファソラシドの各音階の周波数をまとめて宣言するため、配列を使い、

    int m[8]={262,294,330,349,392,440,494,523};

    と表現しました。これを使うとき、例えばレの音の周波数を出したければ、2番目の数値を呼び出すので、0,1 で,

    m[1]

    が、レの変数になります。呼び出すときの数値は、0からスタートする点に注意しましょう。

     

    for(初期値 ; 条件式 ; 加算){    };

    for文は波カッコに囲まれたブロックを繰り返し実行します。様々な繰り返し処理に活用でき、データやピンの配列と組み合わせて使われることがあります。

    例題のプログラムの場合、

    for(int i=0;i<8;i++){

    tone(11,m[i],TIME) ;

    delay(TIME) ;

    }

    で、加算させる変数 i の初期値を0にし、これが8以下であるうちは、{}内のプログラムを繰り返し実行します。

    実行するプログラムは、tone関数で、iの数値に割り当てられた周波数を出力し、TIME㍉秒待機します。

    これを、7回、音階を上げながら実行するため、ドレミファソラシドの順に音が鳴るプログラムになります。

     

    本日は、ここまでにします。次回は、超音波センサと組み合わせて、音階を鳴らす楽器作りをします。

     

    2021/7/27 ひいらぎ

    2021.7.25 Arduinoから音を出す(回路編)

    さて、次はArduinoのトーン関数を使って、音を出そうと思います。Arduinoのトーン関数は、 

    出力するピンと周波数、出力時間を入力するだけで音を出すことができます。

    といっても、Arduinoにスピーカーがついているわけではないですから配線をしていかなければなりません。

    下図が、Arduinoからスピーカーを駆動する回路です。

    さて、まずはこの回路の部品を確認していきましょう。

    回路図

    スピーカー

    スピーカーは、電気信号を音に変換する部品です。基本構成は、コイルでできており、交流信号を流すことで、振動板が前後に触れ、空気を震わせて音が出ます。

    トランジスタ

    トランジスタは電気の流れをコントロールする部品です。
    半導体でできた能動部品の代表と言われるぐらいとても重要な部品で、いろんな電子回路で活躍しています。この回路では、スピーカーに流す電気は大きく、マイコンで直駆動させることは難しいため、トランジスタを間に挟みます。

    ArduinoNano

    Arduinoは、簡単なC言語のプログラムで、あらゆる出力信号を出すことが出来る。また、アナログ入力を7個積んでいて、分解能255でアナログ値入力できるため、精度の良いセンサーを作ることができる。詳しくは、どこかで説明したい。

    スピーカー駆動回路

    回路はいたってシンプルです。Arduinoからはデジタル出力の矩形波が出力される。このデジタル信号がトランジスタQ1のベースに入力される。ベースに電流を流すと、コレクタエミッタ間がONとなち、スピーカーに電流が流れる。デジタル信号のHIGH/LOWの周期によって、すぴーかーに電流を流す、流さないが変化する。したがって、デジタル信号の周波数の電子音がスピーカーから発せられる。

    R1の抵抗は、デジタル信号の電流が、ベースには高すぎるので、抵抗R1を挟んで電流を小さくしている。

    また、R2の抵抗も、スピーカーに流れる直流電流が大きすぎるため、R2の抵抗を挟み電流を小さくしている。

    また、D1のダイオードは、スピーカーのコイルを矩形波でON/OFFしてしまうと、スピーカーの電圧が一気に跳ね上がってしまうため、電圧が跳ね上がらないようび、スピーカーのコイルにたまった電流を逃がす回生ダイオードを積んでいる。

    次回は、Tone関数を利用して簡単にArduinoから音を出します。

    2021/7/25 ひいらぎ

    2021.7.24 超音波センサを使いこなす1

    先日、八潮の秋月電子で超音波センサを買いました。

    今回は、超音波センサSRF-02をがんばって使いこなそうと思います。

    超音波センサ(SRF02)

    超音波センサ

    ◆主な仕様
    ・使用マイコン:16F687-I/ML
    ・測定範囲:16cm~6m.
    ・電源:5V(消費電流4mA Typ.)
    ・使用周波数:40KHz.
    ・アナログゲイン:64段階の自動ゲインコントロール
    ・接続モード:モード1=I2C、モード2=シリアルバス
    ・全自動調整機能:電源投入後キャリブレーション不要
    ・測距タイミング:エコー時間計測、ホストによるタスクコントロール
    ・測定単位:μS(マイクロ秒)、ミリ、インチ
    ・サイズ:24mmx20mmx17mm
    ・入出力端子:5ピン
    ・重量:4.6グラム

    [秋月電子より引用]

    さて、まずは超音波センサの仕組みを確認しましょう。

    超音波センサーは、今や自動車の駐車センサや障害物検知など、自動運転などにも欠かせない技術となっています。

    まず、超音波とはなんでしょうか。

     

    超音波とは

    超音波は、広義的に言えば、ただの音です。なぜ、超が付くかと言いますと、それは音の周波数が人間が聞き取れないくらい高いからです。

    下図が、音波の分類です。

    超音波のスペクトラム

    音は、音の高さ(周波数)によって分けられ、20kHzより高い音を超音波と定義しています。

    人間が聞き取れるのは、成人では17kHz程度まで聞き取れます。そのため、多くの音楽データでは20kHz以上の音はデータとして記録していません。また、マイクやスピーカーの特性も、20kHz以上の音はほとんど出ない設計であり、その分音波の範囲で最大の性能を発揮できるように作られています。

    その、聞き取れない超音波域の音も出すことで、豊かな音になるとうたっているのが「ハイレゾ音源」です。ですが、そもそも人間が聞き取れない音を出すことは、本当に意味があるのか、私もわかりません。

    さて、余談が過ぎました。

    超音波センサは、空気を伝搬させるため、超音波の中でも比較的低い音で使用します。超音波は、周波数が高いほどまっすぐ進み、密度の濃い媒体の中も良く通ります。そのため、おなかの中を通り抜けなければならないエコー検査装置の超音波は3GHzと高い帯域を使います。

    それに対し、障害物センサなどの超音波は、媒体が空気と薄いこと、さらになるべく広い範囲を検知する必要があることから、音波ギリギリの40kHzなどが使われます。

    さて、超音波の特徴がわかったところで、つぎは、超音波センサが障害物を検知するしくみを確認します。

     

    超音波センサの検知

    超音波センサは、超音波を放出するスピーカーと、超音波を受信するマイクからなります。

    最近の超音波センサは、スピーカーとマイクが一体型になっているパターンがほとんどです。

    超音波の送受信1

    センサーから放出した超音波は、音速の速さで進みます。

    これが、障害物にあたると、超音波はやまびこのように反射して帰ってきます。この帰ってきた反射波をマイクで拾い、検知します。

    もし障害物が無ければ、なにも反射せずに検知できません。

    超音波の送受信2

     

    また超音波センサは、障害物までの距離も算出することが出来ます。

    その仕組みは下図のように、超音波の発信から受信までに要した時間と音速との関係を演算することでセンサから対象物までの距離を算出します。

    超音波の送受信3

    超音波は、音と同様、音速の速さで進みます。音速は340m/sです。

    音速をv 距離をrとし、超音波を放出してから反射波を受信するまでの遅延時間をtとすると、

    距離 r = (v× t )/2 で導けます。

    例えば、遅延時間が10m秒だった場合、往復距離r は、340×0.01= 3.4m

    したがって、障害物までの片道距離は、1.7 mとわかります。

     

    超音波センサSRF-02

    さて、超音波センサを使いましょう。

    秋月のページには、メーカーの製品情報が載っていました。

    ここに、詳細な説明とプログラム例のwikiが載っています。

    ここに乗っていた、サンプルプログラムを使うことにしました。

    接続は、下図の通りです。

    Arduinoとセンサの接続図

    超音波センサとの通信方法は、二種類選ぶことができ、I2CとUARTから選ぶことが出来ます。

    I2CとUARTの特徴は、後程まとめさせていただければと思います。

    超音波センサにヘッダピンをはんだ付けして、ブレッドボードに差し込みます。あとは、接続図の通りに配線をして完成。

    さっそく、パソコンにUSBをつないで、プログラムを書き込みます。Arduinoの使い方なども後程説明させていただければと思います。

    Arduinoのスケッチ

    これを書き込むと、センサから障害物までの距離をリアルタイムで見ることができます。

    さっそく手をかざしてみます。Arduinoのシリアルモニタを確認すると、センサから手までの距離がリアルタイムで表示されていることがわかります。

     

    今日はここまでにします。明日は、超音波センサを使った楽器について構想を練ります。

     

    2021/7/24 ひいらぎ

    サボテンの骨について調べてみた

    先日、東京新木場の木材専門店「もくもく」にいきました。

    https://www.mokumoku.co.jp/

    国内の貴重な木材(木曽檜、コクタン、神代杉、屋久杉等)から、海外の木材まで、100種類以上を取り扱っています。そのなかで見つけたのがサボテンの骨です。

    お店で最初見たときは、「サボテンの木。。。?」と思わず言ってしまってたのですが、完全に失礼でしたね。

    「サボテンの骨」ですよ。

    サボテンは、砂漠などの過酷な環境で生育しています。サボテンと言えど、砂漠では 雨が降らない日が続くと自然枯死し、緑色の幹は「木」に変化していきます。 そうなったのが、サボテンの骨だそうです。さっそく2本購入しました。ほかの木材との相性も良さそうなので、なにか工作ができそうです。

    googleでサボテンの骨を検索すると沢山、飾り方の例が載っています。

    そのまま飾る方も多いようですが、穴がたくさん開いているので、どうやら小さい草花を詰めて飾っている方が多いようです。なるほど、、、

     

    でも私はこれを、光らせたいなと思います。

    サボテンの骨は、中が空洞状になっているため、下からLEDでライトアップしたら、お洒落じゃないかなと思いました。

    さっそく実験しました。

    サボテンの骨の下から、試験管立て(LA-01)の基板を当てて光らせます。

    なかなか良いのではないでしょうか。

    本格的に、作ることにしました。

    さっそく、3D-CADでサボテンの骨を置く、光る台を設計しました。基板は、試験管立ての基板を流用します。ドーナツ状に開いている穴から、光が出ます。

    この台座を右図のように立てます。台座には、檜の切り株を使いました。

      

    下図が設計図になります。切り株の裏側から、ホールソーでΦ35の穴をあけ、基板を取り付けるシンプルな構造です。あとは、USB端子を格納するための穴をΦ7.5で開けています。

    今日は、設計まで行いました。

    次回は、これを加工していきます。

    試験管を光らせたい

    先週、東京の清澄白河にある、コルク瓶の仕入れ元、「リカシツ」のお店に行ってきました。

    [https://rurubu.jp/andmore/article/7921]

    リカシツは、理化医療用ガラスの卸業の関谷理化株式会社が運営する、「理化学+インテリア」を目指したアンテナショップです。実際に研究室でプロが使用している理化学製品そのモノと理化学ガラス職人が加工したオリジナルなモノを販売しています。

    昨今では少子化で学校・研究所の統合などで理化学ガラス職人の仕事も減っている中、一般の方に使ってもらいアイデアを貰うことで理化学ガラス職人の技術が活かせる「新たな仕事つくり」ができると考え、アンテナショップができたそうです。(リカシツHPより要約)

    実際に行きましたが、とても洒落な空間が広がっていました。

    理科の実験って、こんな映えるんだなあと。新しい価値観にびっくりします。

    リカシツで衝動買いしたのが、木でできた試験管立てです。

    もう、お店で見た瞬間から、光らせたくてたまらないです。

    そこで、試験管立てには、裏から穴をあけ、試験管には造花を詰めてみました。

    いろんな色のLEDを下から入れて光らせました。かなり、いい感じじゃないですか。

    もう、これは基板化決定です。フルカラーLEDと小さなマイコンでカラフルに光らせる基板を作ろうと思います。

    さっそく回路設計

    基板を発注してみたい

    2021年3月17日 柊工房

    突然ですが、基板を基板メーカーに発注して本格的な基板を作ってみたいです。

    家電や製品で当たり前に使われている回路基板、

    こんなのを自分で本格的に作ってみたいなと思いました。

    今まで、エッチングを使って基板を作ることはしてきましたが、見た目がこんな感じ

    これもこれで味があっていいのですが、やっぱり、レジストがしっかり貼られていて、シルク印刷がある

    本格的な基板を作りたいと思いました。

    さっそく基板メーカーを比較。

    まず日本メーカーだと、P板ドットコムが最大手かと思います。

    10cm×10cm 2層基板 10枚の場合の見積もりが、

    なんと、35530円。結構お値段貼りますね。そりゃそうですよね。企業の開発からしたらものすごく安いと思いますけども。個人では厳しいですね。

    ほぼ同条件でunicraftでもweb見積もり。28640円

    やはり、日本メーカーは三万円前後が相場のようです。

    海外メーカーではどうでしょうか。

    中国のSeed Fusion PCBでは、

    ほぼ同条件で、$4.90 約550円。 輸送コスト含めて約3000円ってところでしょうか。

    圧倒的な安さです。たとえ、歩留まりが悪かったとしても、大量に注文しても対応できそうです。

    まず、本格的な基板にするのは、瓶詰めLED時計にしようと思います。