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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Raspberry Pi

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

Python

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

Q&A

解決済

1回答

351閲覧

C++で、I2c通信で接続している制御基板のメモリマップの特定アドレスにアクセスしたい

mamukura

総合スコア4

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2023/09/28 04:49

実現したいこと

I2c通信に関してPythonで書かれたコードをC++で書き換えたい。

前提

ヴィンストン社製のライトローバという車両ロボットを使用しているが処理が重く、Pythonで書かれたサンプルコードしか配布されていないため、これをC++で書き換えたい。
しかし、モーターの制御基板であるVS_WRC_201と、Raspberry Piとの間で行われているI2c通信の部分をどのように書き換えればよいか分からない。

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

C++で、I2c通信でVS_WRC_201(制御基板)上のマイコンのメモリマップの特定アドレスへのデータの書き込み・読み込みを行う方法が分からない。

該当のソースコード

Python(書き換え前のコード)

1import smbus 2import time 3 4class VsWrc201I2c: 5 6 DEV_ADDR = 0x10 7 MAP_SIZE = 0x100 8 9 10MU8_O_EN = 0x10 11 12 memmap = [0x00] * MAP_SIZE 13 write_flag = [0x00] * MAP_SIZE 14 15 initialMemmap = [0x00, 0x00, 0xed, 0x05, 0xff, 0x01, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x10, 0x00, 0x10, 17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] 30 31def __init__(self, dev_addr): 32 self.__i2c = smbus.SMBus(1) 33 self.DEV_ADDR = dev_addr 34 time.sleep(0.1) 35 36 def init_memmap(self,cut_off_level): 37 cut_off_hex = int((cut_off_level/3.3)*0xfff) 38 self.write_memmap(self.MU8_O_EN,self.initialMemmap,0xF0) 39 self.read_all() 40 self.write_s16map(self.MU16_SD_VI,cut_off_hex) 41 42 def write_1_byte(self,addr,data): 43 self.__i2c.write_byte_data(self.DEV_ADDR,addr,data) 44 45 return 1 46 47 def read_s8map(self,addr): 48 return self.memmap[addr]

 init,init_memmap,write_1_byte,read_s8mapをC++に書き換えることが出来ずに困っています。

試したこと

インターネットでI2c通信に関して調べ、ioclt(),write(),read()を使えば通信はできるようですが、メモリマップの特定アドレスにアクセスする方法までは分かりませんでした。

補足情報(FW/ツールのバージョンなど)

Ubuntu MATE RO1で開発されたロボットです。

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

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

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

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

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

mamukura

2023/09/28 05:23

コメントありがとうございます。 read_memmap,write_memmapは__i2cが持つものですが、 __i2c = smbus.SMbus(1)としており、smbusライブラリに依存したものだと思います。 C++でもPythonと同様に使用することが出来るのでしょうか?
n24bass

2023/09/28 11:01

smbus は基本的に i2c と同じ(サブセット)ですから、smbus/デバイスの仕様の範囲で使います。
mamukura

2023/09/29 02:23

smbusはi2cの中の1つなのですね。教えていただきありがとうございます。 c++では、Pythonにあるsmbusライブラリが使用できないようなのでまた別の手法を模索したいと思います。 ベストアンサーをつけさせていただきたいので回答の方に何か書いていただけると幸いです。
guest

回答1

0

ベストアンサー

i2c ライブラリを smbus とデバイス仕様の範囲で使うのが良いでしょう。

投稿2023/09/29 02:45

n24bass

総合スコア45

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

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

mamukura

2023/09/29 03:15

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問