Ik heb een stukje code geschreven in python die vanop de raspberry pi over i2c communiceert met een arduino.
Nu werkt deze code meestal.... af en toe krijg ik een foutmelding op de commandline:
eens ik die error krijg, dan moet ik de arduino resetten om het terug op te lossen
De code wijzigt qua regelnummer, maar wijst altijd op een input/output error
Iemand een idee hoe ik deze kan oplossen?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| # het is de bedoeling om 2 argumenten mee te geven
# eerste argument is de job : keuze uit:
# "C" om commando op de bus te zetten (bv lamp aansteken)
# "R" om de status van een actor op te vragen
# "S" om de status van een actor te zetten
# "W" om de status van een actor te zetten
# tweede argument is het commando is het effectieve commando. dit kan 6 (voor C), 10 (voor R) of 20 (voor S) karakters lang zijn
# het eerste argument kan ook een aanvraag van het verbruik zijn: "W" - in dit geval is het tweede argument niet belangrijk en sturen we zomaar iets mee
# voorbeeld promy.py C 11C5CE
import sys
from smbus import SMBus
from time import *
import pylcd #om het lcd scherm te gebruiken op I2C
bus = SMBus(0) ### Create an i2c bus object
### NOTE - This applies to a first version rPi board.
### Use SMBus(1) for newer board with the two mounting holes and SMBus(0) for version A.
### (They changed the i2c pinouts.)
address = 0x05 #het adres van de I2C slave - te zetten in arduino
lcd = pylcd.lcd(0x27, 0)#het adres van het LCD is hier 0x27 - hardwarematig te zetten en te controleren via I2Cdetect -Y 0 of 1
#print 'Number of arguments:', len(sys.argv), 'arguments.'
#print 'Argument List:', str(sys.argv)
#de lijsten in python beginnen ook bij index 0
#sys.argv[0] is de scriptnaam
job = sys.argv[1] #het type Job zie boven
com2 = sys.argv[2] # het commando
lengte = len(com2) # het aantal karakters
#nu nog het ding opsplitsen en in ord zetten in een lijst...
#com = [ord('A'),ord('B'),ord('C')]
com = [ord(com2[0])]
for z in range (1, lengte):
com.append(ord(com2[z]))
bus.write_block_data(address, ord(job), com)
#de dingen voor het opvragen van de response
if job == 'C' :
sleep(0.5)
if job == 'R' :
sleep(5)
if job == 'S' :
sleep(5)
sleep(1) # eerst wat wachten was 0.015
for x in range(60) : # loop until data is ready
gereed = chr(bus.read_byte(address))
print gereed
if gereed == 'Y' : # W wil zeggen wat we klaar zijn om te verzenden
break
sleep(0.10 + (x * 0.05)) # delaying the attempts eerst 0.05 en 0.01
#C - R - S :Dit zijn de commandos en geven dus een string - hiervoor moeten we de getallen omzetten via de chr() functie
if gereed == 'Y' : # enkel als het W is zijn we klaar - zie hoger
if job == 'C' or job == 'R' or job == 'S' :
if job == 'C' :
lengte = 2 #we krijgen normaal een OK terug, dus 2 karakters
if job == 'R' :
lengte = 22 #we krijgen de status terug, dit is 22 karakters lang
if job == 'S' :
lengte = 2 #we krijgen normaal een OK terug, dus 2 karakters
data = ""
for i in range(0, lengte):
data += chr(bus.read_byte(address))
#print i
print data
lcd.lcd_puts("NBus response",1) #op het lcd plaatsen van de response - regel 1
lcd.lcd_puts(data,2) #op het lcd plaatsen van de response - regel 2
if job == 'W' :
#while True:
verbruik = [0, 0, 0, 0, 0]
for i in range (0, 5): #het eerste is het verbruik van de 1e fase, het tweede van de 2e fase, derde van 3e fase, vierde is het gemeten voltage, vijfde is het totale verbruik van de drie fases
verbruik[i] = bus.read_byte(address)
print verbruik[0], "X", verbruik[1], "X", verbruik[2], "X", verbruik[3], "X", verbruik[4] |
Nu werkt deze code meestal.... af en toe krijg ik een foutmelding op de commandline:
code:
1
2
3
4
| Traceback (most recent call last):
File "promytest2.py", line 50, in <module>
gereed = chr(bus.read_byte(address))
IOError: [Errno 5] Input/output error |
eens ik die error krijg, dan moet ik de arduino resetten om het terug op te lossen
De code wijzigt qua regelnummer, maar wijst altijd op een input/output error
Iemand een idee hoe ik deze kan oplossen?