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 ひいらぎ

光る試験管立て LA-01C

LA-01C(光るヒノキの試験管立て)
木曽ヒノキを使用した、光る試験管立てを作りました。
コルク付きの試験管にお花のハーバリウムを造れば、優しい色合いの光が幻想的に照らします。
また、コルクを外せば、一輪刺しとしてもお使いいただけます。
試験管をセットする土台は、木曽ヒノキを使用しております。

LA-01C本体1
LA-01C本体2

Creemaにて今後、販売を予定しております。


光るヒノキの試験管立て(木曽ヒノキ)【販売準備中】

型番; LA-01C

価格; 3880円+税

在庫; 0 個


★香りと質感の良い木曽ヒノキを使用
日本三大美林の一つに数えられている木曽ヒノキは、軽軟・肌目は緻密で特有の芳香と美しい光沢をもちます。耐湿、耐水性にも強く長持ちすることから、桧の中でも高級品として人気が高く、寺社建築をはじめ高級建築材としても使われています。また伊勢神宮では、木曽桧が式年遷宮の「御神木」として利用されています。

 

★試験管にお気に入りの花を飾ろう
試験管には何でも入れていただけます。お好きな花やドライフラワーなどを飾る、コルク栓を外して一輪刺しなどに使うこともできます。ガラス管はコルク栓で密閉出来ますので、液体なども可能です。ハーバリウムなどを作るのも良いでしょう。

★試験管はプロ仕様
付属の試験管は、化学実験向けの本格的な試験管を使用。耐久と耐熱に優れています。

★LEDは和風な色合い
本機では和風な色合いをベースに、紅梅色、薄桜色、橙色、女郎花色、青磁色、白藍色、瑠璃色、江戸紫色の計8色が、10秒間隔の自動で変化します。

 

★梱包内容
光る試験管立て本体 x 1 
ガラス試験管x1
試験管用コルク栓×1
USBケーブル 70 cm x 1 
ハーバリウムオイル(45mL) x1
説明書 x1  
**ハーバリウムの造花は付属しておりません**

仕様

項目内容備考    
型番 LA-01C
サイズ [本体];50mm×50mm×50mm(立方体)
[試験管];直径25mm 長さ100mm (平底試験管)
材質 [本体] 木曽ヒノキ(木材)
[試験管] ガラス(硬質1)
主機能 試験管の照光
色種類 紅梅色→薄桜色→橙色→女郎花色→青磁色→白藍色→瑠璃色→江戸紫色
(色は10秒ごとに順番に変化します。)
環境温度範囲 -20℃~40℃(できる限り涼しい環境でお使いください)
電源入力範囲 標準DC5V(USBを使用)
消費電力 最大1W(5.0V 200mA) 
付属ケーブル USB-TypeC 70cm(スイッチ付き)
本体の温度上昇 40℃以下(室温25℃時)
仕様

★購入の際の注意点
✔裏側の黒い回路基板は、最大60℃まで発熱いたしますが安全上問題ありません。

✔ヒノキの質感をお楽しみいただけるよう、本体外側にはコーティングや塗装などは一切しておりません。そのため日焼けや腐食は市販の木製製品より早く進みます。なるべく日陰に置いていただき、湿度の高い環境での使用はお控えください。

✔完全に手作りです。手作りの電子回路基板ですので慎重にご利用ください。

✔試験管はガラス製ですので破損にはくれぐれもご注意ください。

✔試験管立て本体に、水などがかからないようご配慮ください。

✔裏側は、黒い回路基板が露出した構造になっております。

ハンドメイドなため家電メーカーが製造する家電製品ほど、品質を保証しておりません。
なにか不具合等ございましたら下記にご連絡ください。
E-mail ; hiiragikoubou5883.gmail.com

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

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

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

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

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

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

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

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

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

 

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

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

さっそく実験しました。

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

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

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

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

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

  

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

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

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