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

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

ただいまの
回答率

87.77%

Raspberry pi のI2C通信に関して

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 13K+

score 16

raspberry pi とarduino間でI2C通信がしたい

Arduinoでアナログデータを取得し、Raspberry piの方に送ることを考えています。そこでhttp://revetronique.blog.fc2.com/blog-entry-16.htmlのプログラムを借り、I2C通信が可能であるかチェックを試みました。しかしRaspberry piでプログラムを実行すると、以下のエラーメッセージが表示されました。この問題の解決方法が知りたいです。

[Errno 121] Remote I/O error> 

Raspberry pi側のプログラム

#! /usr/bin/env /usr/bin/python

import smbus
import time
#for RPI ver1, use "bus=smbus.SMBus(0)"
bus=smbus.SMBus(1)

#This is the address we setup in the <a href="http://blog.fc2.com/tag/Arduino" class="tagword">Arduino</a> Program
address = 0x04

def writeNumber(value):
        bus.write_byte(address, value)
        #bus.write_byte_data(address, 0, value)
        return -1

def readNumber():
        #get the sensor value from the <a href="http://blog.fc2.com/tag/Arduino" class="tagword">Arduino</a>(signed 16bit little-endian)...
        #number=bus.read_byte(address)
        number=bus.read_word_data(address, 0)
        return number

def main():
        while True:
                writeNumber(0)
                #sleep one second
                time.sleep(1)

                number=readNumber()
                print number
                #time.sleep(1)

if __name__ == '__main__':
        main()

Arduino側のプログラム

#include <Wire.h>

#define SLAVE_ADDRESS 0x04 //address of <a href="http://blog.fc2.com/tag/Arduino" class="tagword">Arduino</a> via i2c connection

void setup() {
  //initialize i2c as slave
  Wire.begin(SLAVE_ADDRESS);

  //define callbacks for i2c communication
  Wire.onReceive(receiveData);
  Wire.onRequest(sendData);
}

void loop() {
  // wait 100ms
  delay(100);
}

//callback for received data
void receiveData(int byteCount){
  //Read all remaining data sent from <a href="http://blog.fc2.com/tag/Raspberry" class="tagword">Raspberry</a> <a href="http://blog.fc2.com/tag/Pi" class="tagword">Pi</a>
  while(Wire.available()){
    int buf = Wire.read();
  }
}

//callback for sent data
void sendData(){
  int val = 1023 - analogRead(1); //convert sensor output to 10-bit digital value
  byte adc[] = {val & 0xff, (val >> 8) & 0xff}; //separate the value to lower 8-bit and upper 8-bit.

  //Transfer ADC value to <a href="http://blog.fc2.com/tag/Raspberry" class="tagword">Raspberry</a> <a href="http://blog.fc2.com/tag/Pi" class="tagword">Pi</a>
  Wire.write(adc, sizeof(int));
}

接続ピン

Arduinoピン Raspberry piピン
SCL 5
SDA 3
GND GND
3.3V 3.3V

補足情報

raspberry pi側で$sudo i2cdetect -y 1によりarduinoが認識されているか,
チェック済みです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2017/08/03 11:18

    arduinoは機種によってsizeof(int)が異なります。arduinoUnoなどはsizeof(int)=2、ArduinoDueなど32bitマイコン搭載のものはsizeof(int)=4です。Arduinoは何をお使いですか?

    キャンセル

  • monster666

    2017/08/14 16:23

    arduinoUno を使用しています!

    キャンセル

回答 1

checkベストアンサー

0

実際に試してみた。
予測では環境の構築にミスがあるのでは?

具体的にはI2Cの使用にはデフォルトでは非動作。

参考に成るのは
[Raspberry Pi で I2C を利用するための設定 – Qoosky](www.qoosky.io/techs/2316d68b2e)

smbusはしっかりとインストールしましょう。

$ sudo pip install smbus2

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る