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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Raspberry Pi

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2088閲覧

マルチプレクサのチャンネル変更について

yamasn

総合スコア23

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Raspberry Pi

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/04 08:32

今までの経緯と問題

同じデバイス(エンコーダ)を複数使用する際にアドレスが被ってしまうためマルチプレクサを使用しています。
試しにエンコーダ1つをカウンタを通してI2C接続できるかどうか試してみたのですが
マルチプレクサのチャンネル変更がうまくいっていないのかうまくつながりません。

プログラム

python

1#!/usr/bin/python 2# TCA9548A I2C multiplexer 3# I2C Address: 70 through 77 4# Channel: 0 - 7 5 6import smbus 7 8# class for the I2C switch---------------------------------------------------- 9class I2C_SW(object): 10# init________________________________________________________________________ 11 def __init__(self,name,address,bus_nr): 12 self.name=name 13 self.address=address 14 self.bus_nr=bus_nr 15 self.bus=smbus.SMBus(bus_nr) 16 17# Change to i2c channel 0..7__________________________________________________ 18# ここだけ使ってます 19 def chn(self,channel): 20 self.bus.write_byte(self.address,2**channel) 21 22# block all channels read only the main I2c ( on which is the address SW)_____ 23 def _rst(self): 24 self.bus.write_byte(self.address,0) 25 print self.name,' ','Switch reset' 26 27# read all 8 channels__________________________________________________________ 28 def _all(self): 29 self.bus.write_byte(self.address,0Xff) 30 print self.name,' ','Switch read all lines' 31 32# define the usual sensor 0X70 bus 1__________________________________________ 33 34SW=I2C_SW('I2C switch 0',0X70, 1) 35SW.chn(1) 36# to enable a channel : SW_chn(channel number - here 0 to 7) 37# 1チャンネルにエンコーダを接続しています 38# check with i2cdetect y -1 (if bus_nr=1) 39 40# ここまでがマルチプレクサプログラム 41# ここから下がエンコーダプログラム 42 43#!/usr/bin/env python3 44# coding: utf-8 45 46import struct 47import signal 48from time import sleep 49 50i2c = smbus.SMBus(1) 51addr = 0x70 52# マルチプレクサのアドレス 53 54VALUE_HI = 0x00 55VALUE_LO = 0x01 56RESET = 0x02 57 58 59def Get_encoder_value(): 60 temp = i2c.read_word_data(addr, VALUE_HI) 61 return struct.unpack(">H", struct.pack("<H", temp))[0] 62 63 64def Encoder_Reset(): 65 i2c.write_byte_data(addr, RESET, True) 66 print("clear value") 67 68 69if __name__ == "__main__": 70 signal.signal(signal.SIGINT, signal.SIG_DFL) 71 print(struct.unpack(">h", struct.pack(">H", Get_encoder_value()))[0]) 72# ここでエンコーダ値が表示されます

これを実行した結果 エンコーダを回しても0と表示されます

配線・回路について

イメージ説明

動作確認・詳細

エンコーダのプログラムはリンク内容

マルチプレクサのプログラムはページ一番下
を参考にしました。

マルチプレクサを介さない場合カウンタプログラムは正常に機能します。
また、アドレス0×70は接続確認できたのでマルチプレクサも接続できていると思います。

どなたかわかる方いらっしゃればよろしくお願いいたします。

Raspberry pi 3 model B(搭載OS:ubuntu mate)
カウンタ:ADRSZRE ゼロワン ロータリーエンコーダ拡張基板
マルチプレクサ:I2C Multiplexer TCA9548A

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

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

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

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

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

guest

回答2

0

まず考えられるのは配線間違い。
そんな実体配線図じゃなくて、きちんと回路図を書こう。

一つできちんと通信できているのなら、そのマルチプレクサを介しても同様に通信できるようにするべし。
まずはチャンネル切り替えなぞせずに、その一つだけでいいので。

はなしはそれからですね

#って、マルチプレクサに電源の配線いってないやんw

投稿2019/01/04 08:51

編集2019/01/04 08:54
y_waiwai

総合スコア87747

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

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

0

ベストアンサー

yamasnさん、

参考にされたというソースを診たところ、TCA9548A のI2Cアドレスは0x70、ADRSZREロータリーエンコーダのI2Cアドレスは0x54 ですが、(↑の)yamasnさんの書かれたプログラムでは、0x54を使ってないですよね?

まず、TCA9548A(0x70)で使用するポートを選択すれば、あとは、通常通りにスレーブのアドレス(0x54)でアクセスできんじゃないかと思います。

このデバイスを所持していないので、動作するかわかりませんが、コマンドラインで、
sudo i2cset -y 1 0x70 0x01
としたあと、
sudo i2cdetect -y 1
で 0x54が検出できませんか?

投稿2019/01/04 17:50

mt08

総合スコア1825

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

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

yamasn

2019/01/10 01:31

1チャンネルのポートは02みたいで、sudo i2cset -y 1 0×70 0×02としたらできました! コマンドでラインでアクセスする考え抜けてました、本当にありがとうございます。
mt08

2019/01/10 01:53

yamasnさん、 セレクタは、ビット指定でしたね。 0x01 - Ch.0 0x02 - Ch.1 0x04 - Ch.2 0x08 - Ch.3 0x10 - Ch.4 0x20 - Ch.5 0x40 - Ch.6 0x80 - Ch.7 0x00 - どれも選択しない(初期状態)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問