たまにはクリスマスっぽいネタということで、SPRESENSE で超音波フロータを作ってみました。超音波フロータは、海外 Arduino 界隈で一時期流行ったので、作り方はたくさん転がっています。
SPRESENSEなら、もっと簡単にできるんじゃね?と思い立ち、早速やってみました。めちゃくちゃ簡単でした。試してみた様子がこちらです。
もうすぐクリスマス!
— よしのたろう 🍥純国産ボード”スプレッセンス”応援団長(仮) (@Taro_Yoshino) December 21, 2023
SPRESENSE で超音波フローターを作ってみたよ pic.twitter.com/NOQYF7vyNv
準備するもの
(1)超音波のトランスデューサとレシーバ
超音波変換器 TCT40-16R/T
(2)モータードライバ「DRV8835」
DRV8835使用ステッピング&DCモータドライバモジュール
(3)SPRESENSEメインボード+拡張ボード
SPRESENSEメインボード
SPRESENSE拡張ボード
作り方
まず超音波トランスデューサとレシーバをバラします。
超音波トランスデューサとレシーバにワイヤをはんだ付けして、次のように配線します。簡単ですね。PWM0は6ピンに、イネーブル信号は4ピンに接続してください。
接続した状態がこちらです。
プログラム
Arduino IDE で作ったスケッチがこちら。短い!
#include <sys/ioctl.h>
#include <stdio.h>
#include <fcntl.h>
#include <nuttx/timers/pwm.h>
#include <MP.h>
static uint32_t frequency = 40000;
static uint16_t duty = 0x7fff;
char pwm_devpath[] = "/dev/pwm0";
int fd;
struct pwm_info_s info;
void setup() {
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
printf("setup /dev/pwm0\n");
/* Open the PWM device for reading */
fd = open(pwm_devpath, O_RDONLY);
if (fd < 0) {
printf("error: failed to open pwm0 device\n");
return;
}
/* Configure the characteristics of the pulse train */
info.frequency = frequency;
info.duty = duty;
ioctl(fd, PWMIOC_SETCHARACTERISTICS, (unsigned long)((uintptr_t)&info));
printf("pwm0 start\n");
ioctl(fd, PWMIOC_START, 0);
}
void loop() { }
遊び方
超音波トランスデューサとレシーバの端が終端するように距離を調整しましょう。温度で音速もかわるのであくまで目安ですが。だいたい3cm弱くらいにしておけばうまくいくと思います。トランスデューサは下にないと浮かないので注意してください。
波長に応じて圧力のスポットが発生するので、そこに発泡スチロールのかけらを近づけるとすいつくように浮き始めます。
簡単に試せるのでぜひやってみてください。