我已使用i2c通信将Rpi与Arduino连接。 引脚配置: Rpi ---- Arduino Mega SDA SDA SCL SCL GND GND
我还有一个连接到Rpi的编码器。 编码器`------ Rpi 5伏5伏 nd 输出A Gpio 17(BCM布局) 输出B Gpio 18(BCM布局)
代码运行正常,但是一段时间后,我收到一个错误消息:121,远程I / O错误。
此外,在错误发生之前(开始通信之前),在执行i2cdetect -y 1时,我只能看到一个从地址(20)与我的Pi相同。
但是,在发生错误之后,在执行i2cdetect -y 1时,我得到了2个地址,即使只有Arduino也已连接。
Copy
Output for before communication:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00 -- -- -- -- -- -- -- -- -- -- -- -- --
10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Output after error, on executing i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00 03 -- -- -- -- -- -- -- -- -- -- -- --
10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Python:
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import serial
import os
import smbus
#import time
bus = smbus.SMBus(1)
time.sleep(1)
address = 0x20
GPIO.setmode (GPIO.BCM)
GPIO.setwarnings(True)
i=0
pin_A = 17
pin_B = 18
######################################################################
def writeNumber(value):
bus.write_byte(address, value)
return -1
def readNumber():
number = bus.read_byte(address)
return number
###################################################################
Encoder_Count = 0
A_Pos2=0
GPIO.setup (pin_A, GPIO.IN)
GPIO.setup (pin_B, GPIO.IN)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)#Button to GPIO23
A_Pos = 0
A_Last = "00"
STATE = {"0001":1,"0010":-1,"0100":-1,"0111":1,"1000":1,"1011":-1, "1101":-1, "1110":1}
def Encoder1(channel1):
global Encoder_Count,A_Pos,A_Last,STATE
now = str(GPIO.input(17)) + str(GPIO.input(18))
key = A_Last + now
if key in STATE:
direction = STATE[key]
A_Last = now
A_Pos +=direction
GPIO.add_event_detect (pin_A, GPIO.BOTH, callback=Encoder1)
GPIO.add_event_detect (pin_B, GPIO.BOTH, callback=Encoder1)
i=0
#while(i<10):
while(1):
var = 100
button_state = GPIO.input(23)
# ser.write(b'1')
A_Pos2= A_Pos/(1600)
time.sleep(0.01)
print A_Pos2
writeNumber(A_Pos2)
if (A_Pos2 ==-6):
#writeNumber(7)
A_Pos = A_Pos % 6
time.sleep(0.01)
if (A_Pos2 ==6):
#writeNumber(A_Pos2)
#A_Pos=0
A_Pos = A_Pos % 6
time.sleep(0.01)
#else:
if button_state == False:
# GPIO.output(24, True)
os.system("sudo shutdown now -h")
GPIO.cleanup()