SPRESENSE で超音波フロータを作ってみた

たまにはクリスマスっぽいネタということで、SPRESENSE で超音波フロータを作ってみました。超音波フロータは、海外 Arduino 界隈で一時期流行ったので、作り方はたくさん転がっています。

SPRESENSEなら、もっと簡単にできるんじゃね？と思い立ち、早速やってみました。めちゃくちゃ簡単でした。試してみた様子がこちらです。

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">もうすぐクリスマス！<br>SPRESENSE で超音波フローターを作ってみたよ <a href="https://t.co/NOQYF7vyNv">pic.twitter.com/NOQYF7vyNv</a></p>&mdash; よしのたろう 🍥純国産ボード”スプレッセンス”応援団長（仮） (@Taro_Yoshino) <a href="https://twitter.com/Taro_Yoshino/status/1737857574597460093?ref_src=twsrc%5Etfw">December 21, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 準備するもの
**（１）超音波のトランスデューサとレシーバ**
[**超音波変換器 TCT40-16R/T**](https://www.amazon.co.jp/uxcell-%E8%B6%85%E9%9F%B3%E6%B3%A2%E5%A4%89%E6%8F%9B%E5%99%A8-TCT40-16R-20Vrms-40KHz-%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%87%E3%82%A3%E3%83%86%E3%82%AF%E3%82%BF%E3%83%BC/dp/B0148LGY5G/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1SRRPCYJ9NP0U&keywords=TCT40-16R+%2F+T&qid=1702653015&sprefix=tct40-16r+%2F+t+%2Caps%2C141&sr=8-1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598183/f2604a81-957e-15b0-6bc4-6b1c617f7a93.png)

<br/>


**（２）モータードライバ「DRV8835」**
[**DRV8835使用ステッピング＆DCモータドライバモジュール**](https://akizukidenshi.com/catalog/g/gK-09848/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598183/8f37e16d-b1a5-4344-cf22-4c64293ae431.png)

<br/>


**（３）SPRESENSEメインボード＋拡張ボード**
[**SPRESENSEメインボード**](https://akizukidenshi.com/catalog/g/gM-14584/)
[**SPRESENSE拡張ボード**](https://akizukidenshi.com/catalog/g/gM-14585/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598183/5643d479-71d7-b2fe-7a6e-9e10583312c4.png)



# 作り方
まず超音波トランスデューサとレシーバをバラします。

![DSC02553.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598183/9556c062-6d84-86fc-1a45-3601e53653e6.jpeg)

<br/>
超音波トランスデューサとレシーバにワイヤをはんだ付けして、次のように配線します。簡単ですね。PWM0は6ピンに、イネーブル信号は4ピンに接続してください。
<br/>
<br/>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598183/0cab1e75-c23f-2e74-c5a6-dd35454b61a3.png)


<br/>
接続した状態がこちらです。
<br/>

![DSC02556.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598183/86c8480f-a051-b441-c12c-c06e06ada84d.jpeg)



# プログラム
Arduino IDE で作ったスケッチがこちら。短い！

```c++
#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弱くらいにしておけばうまくいくと思います。トランスデューサは下にないと浮かないので注意してください。
<br/>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598183/e1464c22-5cf0-8a7f-586c-e9be5935f085.png)

<br/>
波長に応じて圧力のスポットが発生するので、そこに発泡スチロールのかけらを近づけるとすいつくように浮き始めます。

簡単に試せるのでぜひやってみてください。