質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

4回答

757閲覧

raspberrypi4を用いた赤外線センサの同時接続

Moti

総合スコア1

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2022/09/28 15:27

前提

 raspberry pi4と9つの赤外線センサを用いて赤外線センサ(VL53L1X使用 レーザー測距センサモジュール(ToF))を9つ同時に動作させるようなシステムを作っています。ネットで配線やプログラムを調べ、参考にしたのですが実行するとエラーをはいて動きません。アドレスを認識していないかと思われます。

実現したいこと

 raspberry pi4を用いて赤外線センサ9個を同時に計測する。

補足情報

・使用センサ
赤外線センサ VL53L1X使用 レーザー測距センサモジュール(ToF)
https://akizukidenshi.com/catalog/g/gM-14249/

・配線
イメージ説明
イメージ説明

・参考サイト

  1. 赤外線センサのアドレス変更のためプログラム

https://team432.jpn.org/?p=380

  1. 参考にした赤外線センサVL53L1Xの計測プログラム 

https://qiita.com/BlueWindows/items/d98b323f789bdc62fc3b

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

python

1import sys 2sys.path.insert(0, "/usr/local/lib/python2.7/dist-packages") 3 4import VL53L1X 5import time 6import csv 7from datetime import datetime 8from collections import namedtuple 9import RPi.GPIO as GPIO 10 11gpio_bcm1 = 4 12gpio_bcm2 = 5 13gpio_bcm3 = 6 14gpio_bcm4 = 13 15gpio_bcm5 = 16 16gpio_bcm6 = 17 17gpio_bcm7 = 18 18gpio_bcm8 = 19 19gpio_bcm9 = 20 20 21GPIO.setwarnings(False) 22GPIO.setmode(GPIO.BCM) 23 24 25try: 26 num = 0 27 28 GPIO.setup(gpio_bcm1, GPIO.OUT, initial=GPIO.LOW) 29 GPIO.setup(gpio_bcm2, GPIO.OUT, initial=GPIO.LOW) 30 GPIO.setup(gpio_bcm3, GPIO.OUT, initial=GPIO.LOW) 31 GPIO.setup(gpio_bcm4, GPIO.OUT, initial=GPIO.LOW) 32 GPIO.setup(gpio_bcm5, GPIO.OUT, initial=GPIO.LOW) 33 GPIO.setup(gpio_bcm6, GPIO.OUT, initial=GPIO.LOW) 34 GPIO.setup(gpio_bcm7, GPIO.OUT, initial=GPIO.LOW) 35 GPIO.setup(gpio_bcm8, GPIO.OUT, initial=GPIO.LOW) 36 GPIO.setup(gpio_bcm9, GPIO.OUT, initial=GPIO.LOW) 37 38 time.sleep(0.5) 39 40 GPIO.output(gpio_bcm1, GPIO.HIGH) 41 time.sleep(0.3) 42 sensor1 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 43 sensor1.change_address=0x30 44 45 GPIO.output(gpio_bcm2, GPIO.HIGH) 46 time.sleep(0.3) 47 sensor2 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 48 sensor2.change_address=0x31 49 50 GPIO.output(gpio_bcm3, GPIO.HIGH) 51 time.sleep(0.1) 52 sensor3 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 53 sensor3.new_address=0x32 54 55 GPIO.output(gpio_bcm4, GPIO.HIGH) 56 time.sleep(0.1) 57 sensor4 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 58 sensor4.new_address=0x33 59 60 GPIO.output(gpio_bcm5, GPIO.HIGH) 61 time.sleep(0.1) 62 sensor5 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 63 sensor5.new_address=0x34 64 65 GPIO.output(gpio_bcm6, GPIO.HIGH) 66 time.sleep(0.1) 67 sensor6 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 68 sensor6.new_address=0x35 69 70 GPIO.output(gpio_bcm7, GPIO.HIGH) 71 time.sleep(0.1) 72 sensor7 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 73 sensor7.new_address=0x36 74 75 GPIO.output(gpio_bcm8, GPIO.HIGH) 76 time.sleep(0.1) 77 sensor8 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 78 sensor8.new_address=0x37 79 80 GPIO.output(gpio_bcm9, GPIO.HIGH) 81 time.sleep(0.1) 82 sensor9 = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29) 83 sensor9.new_address=0x38 84 85 86 sensor1.open() 87 sensor1.start_ranging(1) 88 sensor1.set_distance_mode(1) 89 90 sensor2.open() 91 sensor2.start_ranging(1) 92 sensor2.set_distance_mode(1) 93 94 sensor3.open() 95 sensor3.start_ranging(1) 96 97 sensor4.open() 98 sensor4.start_ranging(1) 99 100 sensor5.open() 101 sensor5.start_ranging(1) 102 103 sensor6.open() 104 sensor6.start_ranging(1) 105 106 sensor7.open() 107 sensor7.start_ranging(1) 108 109 sensor8.open() 110 sensor8.start_ranging(1) 111 112 sensor9.open() 113 sensor9.start_ranging(1) 114 115 while True: 116 117 print("I2C Distance\n") 118 print("-----------------\n") 119 120 time.sleep(0.8) 121 122 distance_mm = sensor1.get_distance() 123 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm)) 124 time.sleep(0.8) 125 126 distance_mm2 = sensor2.get_distance() 127 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm2)) 128 time.sleep(0.8) 129 130 distance_mm3 = sensor3.get_distance() 131 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm3)) 132 time.sleep(0.8) 133 134 distance_mm4 = sensor4.get_distance() 135 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm4)) 136 time.sleep(0.8) 137 138 distance_mm5 = sensor5.get_distance() 139 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm5)) 140 time.sleep(0.8) 141 142 distance_mm6 = sensor6.get_distance() 143 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm6)) 144 time.sleep(0.8) 145 146 distance_mm7 = sensor7.get_distance() 147 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm7)) 148 time.sleep(0.8) 149 150 distance_mm8 = sensor8.get_distance() 151 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm8)) 152 time.sleep(0.8) 153 154 distance_mm9 = sensor9.get_distance() 155 print("Time: {} Distance: {}mm".format(datetime.utcnow().strftime("%S.%f"), distance_mm9)) 156 time.sleep(0.8) 157 158 print(num) 159 160 161 time.sleep(1) 162 num=num+1 163 if(num >= 100): 164 break 165 166 167 168 169except KeyboardInterrupt: 170 print("finishing...") 171 if(num == 100): 172 173 sensor1.stop_ranging() 174 sensor1.close() 175 GPIO.output(gpio_bcm1, GPIO.LOW) 176 177 sensor2.stop_ranging() 178 sensor2.close() 179 GPIO.output(gpio_bcm2, GPIO.LOW) 180 181 sensor3.stop_ranging() 182 sensor3.close() 183 GPIO.output(gpio_bcm3, GPIO.LOW) 184 185 sensor4.stop_ranging() 186 sensor4.close() 187 GPIO.output(gpio_bcm4, GPIO.LOW) 188 189 sensor5.stop_ranging() 190 sensor5.close() 191 GPIO.output(gpio_bcm5, GPIO.LOW) 192 193 sensor6.stop_ranging() 194 sensor6.close() 195 GPIO.output(gpio_bcm6, GPIO.LOW) 196 197 sensor7.stop_ranging() 198 sensor7.close() 199 GPIO.output(gpio_bcm7, GPIO.LOW) 200 201 sensor8.stop_ranging() 202 sensor8.close() 203 GPIO.output(gpio_bcm8, GPIO.LOW) 204 205 sensor9.stop_ranging() 206 sensor9.close() 207 GPIO.output(gpio_bcm9, GPIO.LOW) 208 209 GPIO.cleanup() 210 print("finish!!")

試したこと

 赤外線センサと配線を1セットずつ最大9個まで増やしていき、それを3回行いエラーの有無を確認した結果、センサの数が増えるほどエラーが出る可能性が高かった。

・センサを1個ずつ増やしていった時のエラーの有無

センサの数1回目2回目3回目
1
2
3
4
5
6
7
8
9

メッセージ

 もしプログラムや配線方法が間違っていて改善点がある場合ご指摘くださると幸いです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2022/09/28 22:14

ToFセンサを「赤外線センサ」と呼ぶのはなにか違う気がしますがそれはともかく。 秋月の取説( https://akizukidenshi.com/download/ds/akizuki/ae-vl53l1x.pdf )を見ると、センサ基板内ではI2Cのバス側はプルアップされていませんが、どこかでちゃんとプルアップしているのですか? また、配線長はどのくらいですか? 経験上I2Cは数十cmも引っ張ると苦しいように思います。
guest

回答4

0

まずは接続するセンサを一つだけにして、措定される通信ができるかどうかを確認しましょう
9つの接続全てで動作を確認しましょう
できればオシロスコープを用意して、SCL,SDAの信号が正常に出ているかを確認することです。

#センサ一つだけにしてもだめな場合は配線が間違ってます

これがきちんとできている、ってのを確認して、センサを2つ、3つと増やしていきましょう

んで、数を増やしたらだめと言う場合は、SCL、SDAがドライブしきれていないってのが考えられます
#これもオシロスコープで信号を確認すべきものですが
使用してるセンサがどういうものかはわかりませんが、そこで実装されているSCL,SDAのプルアップ抵抗を、距離的に近いセンサをから除去していく必要があります

投稿2022/09/28 22:24

編集2022/09/28 22:34
y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

秋月電子通商のセンサモジュールを使っているとのことですが、この回路図を見るとバッファ(U2:FXMA2102L8X)が入っていて OE = high 固定であるために I2C ラインが 3-state になっていません。このため多数のデバイスの並列接続で信号レベルが保てなくなっていると思われます。外部プルアップも必要です。FXMA2102L8X のデータシートでは OE を制御する例が出ていて、本来はこのように個別に OE = hight にして使うのが良いのでしょう。

投稿2022/10/25 07:25

編集2022/10/25 11:23
n24bass

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ラズパイの3.3V電源端子では、当該センサーモジュールを3,4個程度しか駆動できないと見込まれます。
外部電源を使うか、5V電源端子を使ってみてはどうでしょうか。

投稿2022/09/30 04:14

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

数を増やすとNGになるという点から考えると、負荷が増えてXSHUTのドライブができなくなっていると考えられます。
テスター等でXSHUTを正しくHIGHにできているか、確認してみてください。
(もし、数を増やしていくにしたがい電圧が下がる場合は、トランジスタでブーストするなどの対応が必要です)

投稿2022/09/28 15:45

編集2022/09/28 15:46
tain

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2022/09/29 12:46

XSHUTにはGPIOから1:1でつないでいるのだから、別にセンサが増えてもGPIOの負荷は変わらないでしょう。 内部プルアップの回路なので、たとえパラに繋いだとしても「電圧が下がる」ってことはないのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問