ESP32に同じセンサを複数台繋ぎたい！

#目次
[はじめに](#はじめに)
[使用する物](#使用する物)
[方法](#方法)
[ソースコード](#ソースコード)
[参考](#参考)

#はじめに
大学の研究でESP32にHC-SR04を4台同時接続する必要があった。初めはi2c化をしてやろうと思っていたが僕の弱々な頭では難がありすぎた。ぴえん
どうしよう。。。。。

(3年後)

そうだ！1つ1つ別のピンを指定すれば良いじゃないか！！！
という事でその方法を簡単に説明していく。

#使用する物
・ESP32 (1台)
・超音波距離センサHC-SR04 (4台)
・ブレッドボード (1個)
・ジャンパ線 (適当)

#方法

結論から言ってしまえば同時接続だけするならとても簡単である。まずは下の画像を見てほしい。
<img width="400" alt="S__8126468.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100933/8adca48f-fe3f-0cd9-7efa-4933c23d09c2.jpeg">

同時接続はGndは適当なGndのPinへ、Vccは5VのPinへ全て繋げるだけで良く、単純にESP32の「I/O」Pinの中からセンサで出す値を取得できるようにTrigピンとEchoピンを指定してあげれば良いだけ。

今回はセンサでの各TrigとEchoは
上「Trig:IO19　Echo:IO18」
下「Trig:IO12　Echo:IO13」
左「Trig:IO25　Echo:IO26」
右「Trig:IO4　Echo:IO5」
と指定している。

#ソースコード
次にこのPinに対応させてセンサを使用するために使うソースコードを書いていく。
なお、今回はMicroPythonで書いていく。
※[ここ](https://github.com/rsc1975/micropython-hcsr04)のソースコードを参考にしたため詳しい説明がほしいなどあれば参照してね。

まず、HC-SR04をESP32で使用するためのドライバーを作成する。
ファイル名は「hcsr04.py」で作成。

```hcsr04.py:
import machine, time
from machine import Pin
import time

class HCSR04:

    def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
        self.echo_timeout_us = echo_timeout_us
        
        self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
        self.trigger.value(0)
        
        self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)
    def _send_pulse_and_wait(self):
        
        self.trigger.value(0) 
        time.sleep_us(5)
        self.trigger.value(1)
        time.sleep_us(10)
        self.trigger.value(0)
        try:
            pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)
            return pulse_time
        except OSError as ex:
            if ex.args[0] == 110: 
                raise OSError('Out of range')
            raise ex
    def distance_mm(self):
        
        pulse_time = self._send_pulse_and_wait()
        
        mm = pulse_time * 100 // 582
        return mm
    def distance_cm(self):
        
        pulse_time = self._send_pulse_and_wait()
        cms = (pulse_time / 2) / 29.1
        return cms
```

次にHC-SR04を実行するためのコードを作成する。
ファイル名は「main.py」としておく。

```main.py
def hcsr04UP():
    sensor = HCSR04(trigger_pin=19, echo_pin=18,echo_timeout_us=1000000)
    distance = sensor.distance_cm()
    a=int(distance)
    print("UP:"+f"{a}"+"cm")
    sleep(1)

def hcsr04DOWN():
    sensor = HCSR04(trigger_pin=12, echo_pin=13,echo_timeout_us=1000000)
    distance = sensor.distance_cm()
    a=int(distance)
    print("DOWN:"+f"{a}"+"cm")
    sleep(1)
    
def hcsr04LEFT():
    sensor = HCSR04(trigger_pin=25, echo_pin=26,echo_timeout_us=1000000)
    distance = sensor.distance_cm()
    a=int(distance)
    print("LEFT:"+f"{a}"+"cm")
    sleep(1)
    
def hcsr04RIGHT():
    sensor = HCSR04(trigger_pin=4, echo_pin=5,echo_timeout_us=1000000)
    distance = sensor.distance_cm()
    a=int(distance)
    print("RIGHT:"+f"{a}"+"cm")
    sleep(1)
```

これを実行すると・・・

![qita.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100933/b557446b-522a-19ca-e60a-2ffcfcff730b.png)


こんな感じに出力される。できた！！！

おわり

#参考
[HC-SR04 Sensor driver in micropython](https://github.com/rsc1975/micropython-hcsr04#hc-sr04-sensor-driver-in-micropython)