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

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

ただいまの
回答率

90.34%

  • C++

    3748questions

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

  • Arduino

    572questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

I2Cのデータ通信の仕方

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 331

UDON3

score 60

 Raspberry PIとArduinoでデータ通信をしています。

右か左かをl or r上か下かをt or bとして送信しているのですが。
ltなどのように繋がって受信してしまいます。
lを受信した後にrを受信するということは可能でしょうか。
Arduinoが受信です

実現したいこと

lを送信してtを送信するとltと受信するのを、lを送信してtを送信するとlを受信したあとtを受信するようにしたい。
説明下手ですいません。

 ソースコード

シリアル通信は通信確認用です。

#include <Wire.h>

const int RaspiAdd = 0x04;

void setup() {
  Serial.begin(9600);
  Wire.begin(RaspiAdd);
  Wire.onReceive(readprocess);
  Wire.onRequest(sendprocess);
}

void loop() {
}

void readprocess(){
  char input = (char)Wire.read();
  if(input[0] == 'n'){

  }else{
    if(input[0] == 'l'){
      Serial.print('l');
    }
    else if(input[0] == 'r'){
      Serial.print('r');
    }
  }
  if(input[1] == 't'){
    Serial.println('t');
  }
  else if(input[1] == 'b'){
    Serial.println('b');
  }
}

void sendprocess(){

}


画像認識した結果をRaspberry PIが送信しています

#!/usr/bin/python
# -*- coding: utf-8 -*-

from picamera import PiCamera
from picamera.array import PiRGBArray
import numpy as np
import smbus
import time
import cv2
import threading

#import threading
bus = smbus.SMBus(1)

SLAVE_ADDRESS = 0x04
CAMERA_WIDTH = 688
CAMERA_HEIGHT = 480
CAMERA_centorX = CAMERA_WIDTH / 2
CAMERA_centorY = CAMERA_HEIGHT / 2
Xaxis = 10
Yaxis = 10
def centor(input): #二値化した画像の面積の一番大きい範囲の重心を表示
    if np.count_nonzero(input) <= 0:
        return(-20,-20)
    label = cv2.connectedComponentsWithStats(input)
    n = label[0] -1
    data = np.delete(label[2], 0, 0)
    center = np.delete(label[3], 0, 0)
    max_index = np.argmax(data[:,4])
    return center[max_index]

camera = PiCamera()
camera.resolution = (CAMERA_WIDTH, CAMERA_HEIGHT)
camera.framerate = 30
rawCapture = PiRGBArray(camera, size=(CAMERA_WIDTH, CAMERA_HEIGHT))
time.sleep(0.1)
for image in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    stream = image.array
    stream = cv2.flip(stream, -1)
    #data = np.fromstring(stream.getvalue(), dtype=np.uint8)
    #image = cv2.imdecode(data, 1)
    hsv = cv2.cvtColor(stream,cv2.COLOR_BGR2HSV)
    lower_blue = np.array([160,100,100])
    upper_blue = np.array([180,200,200])
    mask = cv2.inRange(hsv,lower_blue, upper_blue)
    denoize = cv2.medianBlur(mask,5)
    Xaxis,Yaxis = centor(mask)
    print(Xaxis,Yaxis)
    cv2.circle(mask, (int(Xaxis), int(Yaxis)), 10, (0, 0, 255), 5)
    cv2.circle(stream, (int(Xaxis), int(Yaxis)), 20, (255, 255, 0), 10)
    cv2.imshow('image',mask)
    cv2.imshow('Mix',stream)
    if Xaxis == -20 and Yaxis == -20:
        print('nosuch')
        bus.write_byte(SLAVE_ADDRESS, ord('n'))
    else:
        if Xaxis < CAMERA_centorX:
            print('left')
            bus.write_byte(SLAVE_ADDRESS, ord('l'))
        elif Xaxis > CAMERA_centorX:
            print('right')
            bus.write_byte(SLAVE_ADDRESS, ord('r'))
        if Yaxis < CAMERA_centorY:
            print('top')
            bus.write_byte(SLAVE_ADDRESS, ord('t'))
        elif Yaxis > CAMERA_centorY:
            print('bottom')
            bus.write_byte(SLAVE_ADDRESS, ord('b'))
    key = cv2.waitKey(1) & 0xFF

    rawCapture.truncate(0)

    if key == ord("q"):
        break
cv2.destroyAllWindows()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • a_saitoh

    2018/06/30 20:56

    arduinoとラズパイ、送信側がどっちで受信側はどっちでしょうか?

    キャンセル

  • UDON3

    2018/06/30 20:57

    Arduinoが受信です。

    キャンセル

  • coco_bauer

    2018/06/30 22:09

    使っているコード(Rasberry PとArduinoの両方)を示してください。I2Cは双方向通信が可能なので、「ArduinoとRaspberry PIのどちらがマスターで、どちらがスレーブなのか」と「データをマスターからスレーブに送ろうとしているのか、スレーブからマスターに送ろうとしているのか」も明らかにしてください。 データの送受信につかっているのは、本当にI2Cなのですか? Serialでの通信をしているような雰囲気を感じます。

    キャンセル

  • UDON3

    2018/06/30 22:13

    I2Cを使っています今からコードを追加します

    キャンセル

回答 2

checkベストアンサー

+1

char lr = Wire.read();
char tb = Wire.read();


と1文字ずつ2回に分けて読み取るのではダメなんでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/30 21:41

    そうしたいのですが初めのlrで一気に二文字分読み込んでしまい、tbのところに何も届かないのです。
    Raspberry PIのほうではWriteを二回行っているのですが、それではだめなのでしょうか。

    キャンセル

  • 2018/07/01 07:51

    すみません、見落としがあり書いてもらった方法で出来ました、ありがとうございます。

    キャンセル

  • 2018/07/02 16:10

    wire.read()はBYTEを返すので、そもそも2文字受け取るはずがないのです。うまくいってよかった。

    キャンセル

  • 2018/07/02 21:37

    そうなんですね。ありがとうございます。

    キャンセル

+1

IICを使うのはなんか理由があるんでしょうか。
普通のシリアル通信やSPIとかでやればずっと簡単だと思いますが。

IICというのは1本の信号線で双方向通信をさせるために、信号は単純だけどなかなか複雑なシーケンスで通信を行う必要があります。だもんで、そこらへんをしっかり理解していないとまともな実装は難しいでしょうね

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/01 00:04

    そうなんですね。
    今回は1対1なので他の方法を使ってみようと思います。

    キャンセル

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

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

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

  • C++

    3748questions

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

  • Arduino

    572questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。