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

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

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

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

Python

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

Arduino

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

Q&A

解決済

2回答

849閲覧

I2C使用時にLCDが謎の競合

UDON3

総合スコア80

C++

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

Python

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

Arduino

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

0グッド

0クリップ

投稿2018/07/01 15:00

現状

ArduinoとRaspberry PI(マスター)でI2C通信をしていたのですが。
LCDを表示させる関係のコマンドをArduinoに書くと遠隔I/Oエラーが出てしまいます。
LCDのライブラリーはLiquidCrystalです。
LCDは6,7,8,9,10,11につないでおり競合しそうなピンは避けて配置したつもりです。
I2CとLCDが競合することは今までなかったので、そもそも競合するのでしょうか。
コードのミスを見つけてどのように修正するべきか教えてください。
シリアル通信はPC間でデバッグに使うため使えず、SPIはピン数が多いため極力I2Cにこだわりたいと思っています。

該当のソースコード

Raspberry PI側

Python

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3 4from picamera import PiCamera 5from picamera.array import PiRGBArray 6import RPi.GPIO as GPIO 7import numpy as np 8import smbus 9import time 10import cv2 11import threading 12 13GPIO.setmode(GPIO.BOARD) 14#import threading 15bus = smbus.SMBus(1) 16SLAVE_ADDRESS = 0x04 17CAMERA_WIDTH = 688 18CAMERA_HEIGHT = 480 19CAMERA_centorX = CAMERA_WIDTH / 2 20CAMERA_centorY = CAMERA_HEIGHT / 2 21Xaxis = 10 22Yaxis = 10 23 24def centor(input): #二値化した画像の面積の一番大きい範囲の重心を表示 25 if np.count_nonzero(input) <= 0: 26 return(-20,-20) 27 label = cv2.connectedComponentsWithStats(input) 28 n = label[0] -1 29 data = np.delete(label[2], 0, 0) 30 center = np.delete(label[3], 0, 0) 31 max_index = np.argmax(data[:,4]) 32 return center[max_index] 33 34camera = PiCamera() 35camera.resolution = (CAMERA_WIDTH, CAMERA_HEIGHT) 36camera.framerate = 30 37rawCapture = PiRGBArray(camera, size=(CAMERA_WIDTH, CAMERA_HEIGHT)) 38time.sleep(0.1) 39for image in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): 40 stream = image.array 41 stream = cv2.flip(stream, -1) 42 #data = np.fromstring(stream.getvalue(), dtype=np.uint8) 43 #image = cv2.imdecode(data, 1) 44 hsv = cv2.cvtColor(stream,cv2.COLOR_BGR2HSV) 45 lower_blue = np.array([160,100,100]) 46 upper_blue = np.array([180,200,200]) 47 mask = cv2.inRange(hsv,lower_blue, upper_blue) 48 denoize = cv2.medianBlur(mask,5) 49 Xaxis,Yaxis = centor(mask) 50 print(Xaxis,Yaxis) 51 cv2.circle(mask, (int(Xaxis), int(Yaxis)), 10, (0, 0, 255), 5) 52 cv2.circle(stream, (int(Xaxis), int(Yaxis)), 20, (255, 255, 0), 10) 53 cv2.imshow('image',mask) 54 cv2.imshow('Mix',stream) 55 a = np.array([Xaxis, Yaxis]) 56 b = np.array([CAMERA_centorX, CAMERA_centorY]) 57 distans = np.linalg.norm(b-a) 58 if Xaxis == -20 and Yaxis == -20: 59 print('nosuch') 60 bus.write_byte(SLAVE_ADDRESS, ord('n')) 61 else: 62 if Xaxis < CAMERA_centorX: 63 print('left') 64 bus.write_byte(SLAVE_ADDRESS, ord('l')) 65 elif Xaxis > CAMERA_centorX: 66 print('right') 67 bus.write_byte(SLAVE_ADDRESS, ord('r')) 68 if Yaxis < CAMERA_centorY: 69 print('top') 70 bus.write_byte(SLAVE_ADDRESS, ord('t')) 71 elif Yaxis > CAMERA_centorY: 72 print('under') 73 bus.write_byte(SLAVE_ADDRESS, ord('u')) 74 if(distans > 100): 75 print("HIGH") 76 bus.write_byte(SLAVE_ADDRESS, ord('H')) 77 else: 78 print('LOW') 79 bus.write_byte(SLAVE_ADDRESS, ord('L')) 80 key = cv2.waitKey(1) & 0xFF 81 82 rawCapture.truncate(0) 83 84 if key == ord("q"): 85 break 86cv2.destroyAllWindows()

Arduino側

C++

1#include <Wire.h> 2#include<Servo.h> 3#include<LiquidCrystal.h> 4 5const int RaspiAdd = 0x04; 6int servo_range1; 7int servo_range2; 8int sp; 9Servo servo1; 10Servo servo2; 11LiquidCrystal lcd(6, 7, 8, 9, 10, 11);//4.5はI2Cと被る 12 13void setup() { 14 lcd.begin(20, 4); 15 lcd.print("Boot OK"); 16 //lcd.cursor(); 17 //lcd.blink(); 18 servo1.attach(2); 19 servo2.attach(3); 20 Serial.begin(9600); 21 Wire.begin(RaspiAdd); 22 Wire.onReceive(readprocess); 23 Wire.onRequest(sendprocess); 24} 25 26void loop() { 27 servo1.write(servo_range1); 28 servo2.write(servo_range2); 29} 30 31void readprocess(){ 32 lcd.clear(); 33 char input = Wire.read(); 34 if(input == 'n'){ 35 lcd.print("Thing Not Found"); 36 }else{ 37 if(input == 'H'){ 38 sp = 3; 39 lcd.print("HIGH_move"); 40 }else if(input == 'L'){ 41 sp = 1; 42 lcd.print("LOW_move"); 43 } 44 lcd.setCursor(2,0); 45 if(input == 'l'){ 46 Serial.print("left"); 47 servo_range1 += sp; 48 lcd.print("Left_"); 49 } 50 else if(input == 'r'){ 51 Serial.print("right"); 52 servo_range1 -= sp; 53 lcd.print("Right_"); 54 } 55 if(input == 't'){ 56 Serial.println("top"); 57 servo_range2 -= sp; 58 lcd.print("Top"); 59 } 60 else if(input == 'u'){ 61 Serial.println("under"); 62 servo_range2 += sp; 63 lcd.print("Under"); 64 } 65 } 66} 67 68void sendprocess(){ 69 70} 71

試したこと

LCD書き換え中に接続が切れるのかもしれないと思っています。しかし、なぜか無事に書き換えが成功する場合もあります。
どうすれば通信が切れないのでしょうか。

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

Arduino1.8.10
Python3.X

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

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

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

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

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

guest

回答2

0

I2Cの信号ラインをオシロで見て、データの送受信がきちんと行えてるのかを確認、また、余計な波形が出ていないかを確認することですね

この手のデバッグでは、いくらコードとにらめっこしてもどーなるもんではありません

投稿2018/07/01 21:49

y_waiwai

総合スコア87774

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

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

UDON3

2018/07/02 11:49

やはりオシロがないとどうしようもないですか。将来的に考えて4chほどの物を買いたいのですが、まだほかに買いたいものがあり、まだ買う気にはなれません。1万円以下で手に入るならいいのですが… ひとまず、割り込みに問題がありそうなので、VoidループでReadしようと思います。 もしそれで無理であれば、他のArduinoでスレーブを同じにして受信できるのであればしてみます。もしそれでもできなければ、他の方式をとります。いつもありがとうございます。結果が出たら報告します。
UDON3

2018/07/02 13:42

処理を分けることで解決することができました。
guest

0

自己解決

Readを割り込みで取得し、LCDはメインループで書き換えました。

投稿2018/07/02 13:41

UDON3

総合スコア80

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問